/src/backend/qt/ftk_display_qt.cpp

http://ftk.googlecode.com/ · C++ · 242 lines · 186 code · 46 blank · 10 comment · 14 complexity · f63c9c082228a1d0a3bdbe2588e0f694 MD5 · raw file

  1. extern "C" {
  2. #include "ftk_typedef.h"
  3. }
  4. #include "ftk.h"
  5. #include "ftk_event.h"
  6. #include "ftk_globals.h"
  7. #include "ftk_display_rotate.h"
  8. #include "ftk_display_qt.h"
  9. #include "ftk_qt_widget.h"
  10. #include <QtGui/QApplication>
  11. #include <QtGui/QCloseEvent>
  12. #include <QtGui/QDesktopWidget>
  13. #include <QtGui/QImage>
  14. #include <QtGui/QPainter>
  15. typedef struct _PrivInfo
  16. {
  17. QImage* img;
  18. unsigned char* bits;
  19. int width;
  20. int height;
  21. }PrivInfo;
  22. static QtWidget* widget = NULL;
  23. QtWidget::QtWidget(QWidget* parent)
  24. : QWidget(parent)
  25. {
  26. setAttribute(Qt::WA_PaintOutsidePaintEvent);
  27. setAttribute(Qt::WA_InputMethodEnabled);
  28. //setAttribute(Qt::WA_PaintOnScreen);
  29. setUpdatesEnabled(false);
  30. //showMaximized();
  31. //setWindowFlags(Qt::Dialog);
  32. //showFullScreen();
  33. //setWindowFlags(Qt::subwindow);
  34. //showNormal();
  35. memset(&ev, 0, sizeof(FtkEvent));
  36. }
  37. QtWidget::~QtWidget()
  38. {
  39. }
  40. void QtWidget::paintEvent(QPaintEvent* event)
  41. {
  42. FtkDisplay* display;
  43. display = ftk_default_display();
  44. if(display == NULL)
  45. {
  46. return;
  47. }
  48. display = ftk_display_get_real_display(display);
  49. DECL_PRIV(display, priv);
  50. QPainter painter(this);
  51. QRect rect(0, 0, priv->width, priv->height);
  52. painter.drawImage(rect, *priv->img, rect/*event->rect()*/);
  53. }
  54. void QtWidget::keyPressEvent(QKeyEvent* event)
  55. {
  56. ftk_logd("keyPressEvent\n");
  57. }
  58. void QtWidget::keyReleaseEvent(QKeyEvent* event)
  59. {
  60. ftk_logd("keyReleaseEvent\n");
  61. }
  62. void QtWidget::mouseDoubleClickEvent(QMouseEvent* event)
  63. {
  64. ftk_logd("mouseDoubleClickEvent\n");
  65. }
  66. void QtWidget::mouseMoveEvent(QMouseEvent* event)
  67. {
  68. ev.type = FTK_EVT_MOUSE_MOVE;
  69. ev.u.mouse.x = event->x();
  70. ev.u.mouse.y = event->y();
  71. ftk_wnd_manager_queue_event_auto_rotate(ftk_default_wnd_manager(), &ev);
  72. //ftk_logd("mouseMoveEvent\n");
  73. }
  74. void QtWidget::mousePressEvent(QMouseEvent* event)
  75. {
  76. ev.type = FTK_EVT_MOUSE_DOWN;
  77. ev.u.mouse.x = event->x();
  78. ev.u.mouse.y = event->y();
  79. ftk_wnd_manager_queue_event_auto_rotate(ftk_default_wnd_manager(), &ev);
  80. //ftk_logd("mousePressEvent\n");
  81. }
  82. void QtWidget::mouseReleaseEvent(QMouseEvent* event)
  83. {
  84. ev.type = FTK_EVT_MOUSE_UP;
  85. ev.u.mouse.x = event->x();
  86. ev.u.mouse.y = event->y();
  87. ftk_wnd_manager_queue_event_auto_rotate(ftk_default_wnd_manager(), &ev);
  88. //ftk_logd("mouseReleaseEvent\n");
  89. }
  90. void QtWidget::inputMethodEvent(QInputMethodEvent* event)
  91. {
  92. ftk_logd("inputMethodEvent\n");
  93. }
  94. void QtWidget::closeEvent(QCloseEvent* event)
  95. {
  96. ftk_logd("closeEvent\n");
  97. FTK_QUIT();
  98. event->accept();
  99. }
  100. static Ret ftk_display_qt_update(FtkDisplay* thiz, FtkBitmap* bitmap, FtkRect* rect, int xoffset, int yoffset)
  101. {
  102. int i = 0;
  103. int j = 0;
  104. Ret ret = RET_OK;
  105. DECL_PRIV(thiz, priv);
  106. int width = rect->width;
  107. int height = rect->height;
  108. int src_width = ftk_bitmap_width(bitmap);
  109. int src_height = ftk_bitmap_height(bitmap);
  110. int dst_width = priv->width;
  111. int dst_height = priv->height;
  112. FtkColor* src = ftk_bitmap_lock(bitmap);
  113. FtkColor* dst = (FtkColor*)priv->bits;
  114. return_val_if_fail(rect->x < src_width && rect->y < src_height
  115. && xoffset < dst_width && yoffset < dst_height, RET_FAIL);
  116. width = (xoffset + width) >= dst_width ? dst_width - xoffset : width;
  117. height = (yoffset + height) >= dst_height ? dst_height - yoffset : height;
  118. src += rect->y * src_width + rect->x;
  119. dst += yoffset * dst_width + xoffset;
  120. for(i = 0; i < height; i++)
  121. {
  122. memcpy(dst, src, sizeof(FtkColor) * width);
  123. dst += dst_width;
  124. src += src_width;
  125. }
  126. QApplication::postEvent(widget, new QPaintEvent(QRect(xoffset, yoffset, width, height)));
  127. return ret;
  128. }
  129. static Ret ftk_display_qt_snap(FtkDisplay* thiz, FtkRect* r, FtkBitmap* bitmap)
  130. {
  131. #if 0
  132. int i = 0;
  133. int xoffset = r->x;
  134. int yoffset = r->y;
  135. int width = r->width;
  136. int height = r->height;
  137. DECL_PRIV(thiz, priv);
  138. FtkColor* dst = ftk_bitmap_lock(bitmap);
  139. FtkColor* src = ftk_bitmap_lock(priv->bitmap);
  140. /*TODO*/
  141. #endif
  142. return RET_OK;
  143. }
  144. static int ftk_display_qt_width(FtkDisplay* thiz)
  145. {
  146. DECL_PRIV(thiz, priv);
  147. return_val_if_fail(priv != NULL, 0);
  148. return priv->width;
  149. }
  150. static int ftk_display_qt_height(FtkDisplay* thiz)
  151. {
  152. DECL_PRIV(thiz, priv);
  153. return_val_if_fail(priv != NULL, 0);
  154. return priv->height;
  155. }
  156. static void ftk_display_qt_destroy(FtkDisplay* thiz)
  157. {
  158. if(thiz != NULL)
  159. {
  160. DECL_PRIV(thiz, priv);
  161. FTK_FREE(priv->bits);
  162. FTK_ZFREE(thiz, sizeof(FtkDisplay) + sizeof(PrivInfo));
  163. }
  164. }
  165. FtkDisplay* ftk_display_qt_create(void)
  166. {
  167. FtkDisplay* thiz = NULL;
  168. thiz = (FtkDisplay*)FTK_ZALLOC(sizeof(FtkDisplay) + sizeof(PrivInfo));
  169. if(thiz != NULL)
  170. {
  171. DECL_PRIV(thiz, priv);
  172. thiz->update = ftk_display_qt_update;
  173. thiz->width = ftk_display_qt_width;
  174. thiz->height = ftk_display_qt_height;
  175. thiz->snap = ftk_display_qt_snap;
  176. thiz->destroy = ftk_display_qt_destroy;
  177. ftk_logd("%d-%d\n", QApplication::desktop()->width(), QApplication::desktop()->height());
  178. priv->width = /*widget->width();*/480;
  179. priv->height = /*widget->height();*/320;
  180. widget->setFixedSize(priv->width, priv->height);
  181. ftk_logd("%d-%d\n", priv->width, priv->height);
  182. priv->bits = (unsigned char*)FTK_ZALLOC(priv->width * priv->height * 4);
  183. priv->img = new QImage(priv->bits, priv->width, priv->height, priv->width * 4, QImage::Format_ARGB32);
  184. if(priv->img == NULL)
  185. {
  186. FTK_FREE(priv->bits);
  187. FTK_ZFREE(thiz, sizeof(FtkDisplay) + sizeof(PrivInfo));
  188. }
  189. }
  190. return thiz;
  191. }
  192. void* ftk_display_qt_create_win(void)
  193. {
  194. widget = new QtWidget();
  195. return widget;
  196. }