touch: draw touch points on the display widget
authorGiWoong Kim <giwoong.kim@samsung.com>
Wed, 17 Jun 2015 04:43:02 +0000 (13:43 +0900)
committerSeokYeon Hwang <syeon.hwang@samsung.com>
Mon, 22 Jun 2015 05:27:18 +0000 (14:27 +0900)
- draw multi-touch points on the display widget for Qt UI
(off-screen rendering).
- fill the screen with black surface when display initializing
- and some optimization

Change-Id: I193e23caf9baa4ec719553e7d07e113fb967b6b8
Signed-off-by: GiWoong Kim <giwoong.kim@samsung.com>
tizen/src/display/qt5_supplement.cpp
tizen/src/ui/displaybase.h
tizen/src/ui/displayswwidget.cpp
tizen/src/ui/displayswwidget.h
tizen/src/ui/input/multitouchtracker.cpp
tizen/src/ui/input/multitouchtracker.h
tizen/src/ui/mainwindow.cpp
tizen/src/ui/mainwindow.h

index 240ccf4c2e2d25de8b1ad41bc53afa94f609aff1..d729e85072acdf5348e3cce08214f2f43a16730a 100644 (file)
@@ -305,21 +305,16 @@ void qt5_prepare(void)
 
 void qt5_update_internal(void *data, int width, int height)
 {
-    QMatrix matrix = QMatrix();
-    QPixmap pixmap = QPixmap();
-    QLabel *screenWidget = mainwindow->getScreenWidget();
+    QImage image((uchar *)data, width, height, QImage::Format_RGB32);
 
-    matrix.scale(mainwindow->getUIState()->getScaleFactor(),
-                 mainwindow->getUIState()->getScaleFactor());
-    matrix.rotate(mainwindow->uiInfo->getMainFormDisplayType()->getAngle());
-
-    QImage image = QImage((uchar *)data, width, height, QImage::Format_RGB32);
-    pixmap.convertFromImage(image.transformed(matrix, Qt::SmoothTransformation));
-    screenWidget->setPixmap(pixmap);
+    mainwindow->getScreenWidget()->setPixmap(
+        QPixmap::fromImage(image.transformed(
+            mainwindow->getDisplayMatrix(), Qt::SmoothTransformation)));
 }
 
 void qt5_switch_internal(void)
 {
+    /* do nothing */
 }
 
 void qt5_refresh_internal(void)
index 674fbfef3e7ef559529bebb224a8539eedde106f..fd5c0bcb63692436764e203088cad63ddc36eb05 100644 (file)
@@ -51,6 +51,7 @@ public:
     void stopGuideImg();
     bool getIsGimgReady();
     bool getGimgState();
+
     void switchForm(DisplayType *displayForm);
     void scaleForm(qreal scaleFactor);
     void update();
index d666fb8a361aa8751413dfa89d7bf355981bb584..67d2e14a2bff4388a58bf5666392f20bf8fe73be 100644 (file)
  */
 
 #include "displayswwidget.h"
+#include "input/multitouchtracker.h"
 
 DisplaySWWidget::DisplaySWWidget(QWidget *parent,
     DisplayType *displayForm, qreal scaleFactor) :
     QLabel(parent), DisplayBase(displayForm, scaleFactor, this)
 {
-    /* do nothing */
+    this->mtTracker = getTouchScreenHelper()->getMtTracker();
+
+    /* fill the screen with black surface */
+    QPixmap initImage(
+        displayForm->getRect().width() * scaleFactor,
+        displayForm->getRect().height() * scaleFactor);
+    initImage.fill(Qt::black);
+    setPixmap(initImage);
 }
 
+/* override */
 void DisplaySWWidget::paintEvent(QPaintEvent *event)
 {
     QLabel::paintEvent(event);
     handlePaint(event);
+
+    /* draw multi-touch points */
+    QPainter painter(this);
+
+    QList<TouchPoint *> pointList = mtTracker->getTouchPointList();
+    for (int i = 0; i < pointList.count(); i++) {
+        TouchPoint *point = pointList.at(i);
+        if (point != NULL) {
+            painter.drawImage(
+                point->getHostPos().x() - mtTracker->getPointRadius(),
+                point->getHostPos().y() - mtTracker->getPointRadius(),
+                mtTracker->getPointImage());
+        }
+    }
 }
 
+/* override */
 void DisplaySWWidget::resizeEvent(QResizeEvent *event)
 {
     QLabel::resizeEvent(event);
     handleResize(event);
+
+    repaint();
 }
 
+/* override */
 void DisplaySWWidget::mousePressEvent(QMouseEvent *event)
 {
     handleMousePress(event);
 }
 
+/* override */
 void DisplaySWWidget::mouseReleaseEvent(QMouseEvent *event)
 {
     handleMouseRelease(event);
 }
 
+/* override */
 void DisplaySWWidget::mouseMoveEvent(QMouseEvent *event)
 {
     handleMouseMove(event);
index 7709e05b1dc6fecda72e8c67b77b4e6133f01a39..f38d3ca7eb4001aec78ded95bea9afd41a867799 100644 (file)
@@ -31,7 +31,7 @@
 #ifndef DISPLAYSWWIDGET_H
 #define DISPLAYSWWIDGET_H
 
-#include <QLabel>
+#include <QtWidgets>
 
 #include "displaybase.h"
 
@@ -52,6 +52,9 @@ protected:
     void mousePressEvent(QMouseEvent *event);
     void mouseReleaseEvent(QMouseEvent *event);
     void mouseMoveEvent(QMouseEvent *event);
+
+private:
+    MultiTouchTracker *mtTracker;
 };
 
 #endif // DISPLAYSWWIDGET_H
index 276a5a2e5cc9aea585ea2652f4ddc50cb0ef3d0d..7b4dd182f75763152c766b6ab0e7af5f9923008f 100644 (file)
@@ -84,6 +84,7 @@ void TouchPoint::updatePos(QPoint hostPos, QPoint guestPos)
     qt5_graphic_hw_invalidate();
 }
 
+
 MultiTouchTracker::MultiTouchTracker(
     TouchScreenHelper* parent, int maxTouchPoint):
         touchPointImage(32, 32, QImage::Format_ARGB32)
@@ -100,10 +101,11 @@ MultiTouchTracker::MultiTouchTracker(
 
     touchPointImage.fill(Qt::transparent);
 
-    QPainter p(&touchPointImage);
-    p.setPen(QColor(255, 255, 255, 255));
-    p.setBrush(QBrush(QColor(128, 128, 128, 128)));
-    p.drawEllipse(0, 0, 31, 31);
+    QPainter painter(&touchPointImage);
+    painter.setPen(QColor(255, 255, 255, 255));
+    painter.setBrush(QBrush(QColor(128, 128, 128, 128)));
+    painter.setRenderHint(QPainter::Antialiasing, true);
+    painter.drawEllipse(0, 0, 31, 31);
 
     qt5_mt_points = new float[2 * maxTouchPoint]();
     qt5_mt_count = 0;
@@ -111,11 +113,26 @@ MultiTouchTracker::MultiTouchTracker(
     qt5_mt_width = qt5_mt_height = 32;
 }
 
+int MultiTouchTracker::getPointRadius()
+{
+    return pointRadius;
+}
+
+const QImage &MultiTouchTracker::getPointImage()
+{
+    return touchPointImage;
+}
+
 int MultiTouchTracker::getMaxTouchPoint()
 {
     return maxTouchPoint;
 }
 
+QList<TouchPoint *> MultiTouchTracker::getTouchPointList()
+{
+    return touchPointList;
+}
+
 int MultiTouchTracker::addTouchPoint(QPoint hostPos, QPoint guestPos)
 {
     const int touchCnt = touchPointList.count();
index 6f2c9976999c3389ca3f41661ee2f806ae9def80..0a74afeee40af5ffce2176700a4fa9e12081bd2d 100644 (file)
@@ -59,7 +59,11 @@ public:
     MultiTouchTracker(TouchScreenHelper* parent, int maxTouchPoint);
     ~MultiTouchTracker();
 
+    int getPointRadius();
+    const QImage &getPointImage();
     int getMaxTouchPoint();
+    QList<TouchPoint *> getTouchPointList();
+
     int addTouchPoint(QPoint hostPos, QPoint guestPos);
     TouchPoint *searchTouchPoint(QPoint targetPos);
     TouchPoint *searchTouchPoint(int targetID);
index e35d635ad9adca101a53c15ac0ccd9cc75978609..54c7d470ab4506ede5df39f9e543988637d9b919 100644 (file)
@@ -89,7 +89,7 @@ MainWindow::MainWindow(UIInformation *uiInfo, QWidget *parent) :
 
     /* windowing */
     setWindowTitle("Emulator");
-    setWindowIcon(QIcon(QPixmap(":/icons/emulator_icon.ico")));
+    setWindowIcon(QIcon(":/icons/emulator_icon.ico"));
     setWindowFlags(Qt::FramelessWindowHint);
     setMinimumSize(0, 0);
 
@@ -122,6 +122,7 @@ MainWindow::MainWindow(UIInformation *uiInfo, QWidget *parent) :
     }
 
     /* display */
+    updateDisplayMatrix();
     display = createDisplay(uiInfo->getMainFormDisplayType());
 
     /* set HW Key shortcut */
@@ -232,6 +233,11 @@ UIState *MainWindow::getUIState()
     return &(uiInfo->uiState);
 }
 
+const QMatrix &MainWindow::getDisplayMatrix()
+{
+    return dpyMatrix;
+}
+
 SkinView *MainWindow::getSkinView()
 {
     return skinView;
@@ -389,6 +395,14 @@ void MainWindow::setMask(const QRegion &region)
     }
 }
 
+void MainWindow::updateDisplayMatrix()
+{
+    dpyMatrix.reset();
+    dpyMatrix.scale(
+        getUIState()->getScaleFactor(), getUIState()->getScaleFactor());
+    dpyMatrix.rotate(uiInfo->getMainFormDisplayType()->getAngle());
+}
+
 void MainWindow::switchForm(int index)
 {
     qDebug("window switch : %d", index);
@@ -396,6 +410,8 @@ void MainWindow::switchForm(int index)
     /* layout switching */
     getUIState()->mainFormIndex = index;
 
+    updateDisplayMatrix();
+
     if (getDockingCon() != NULL) {
         getDockingCon()->updateGeometry();
     }
@@ -419,8 +435,11 @@ void MainWindow::scaleForm(int scale)
 {
     qDebug("window scale : %d", scale);
 
+    /* scale changing */
     getUIState()->mainFormScale = scale;
 
+    updateDisplayMatrix();
+
     if (getDockingCon() != NULL) {
         getDockingCon()->updateGeometry();
     }
index db494f743fa7565871a1c8c85103e917342f8622..4f6542e6c7ba75e9a47dabf9481a04c7583bd57e 100644 (file)
@@ -75,12 +75,14 @@ public:
     ~MainWindow();
 
     UIState *getUIState(void);
+    const QMatrix &getDisplayMatrix();
     SkinView *getSkinView();
     ContextMenu *getPopupMenu();
     DisplayBase *getDisplay();
     KeyboardShortcut *getKeyboardShortcut();
     QLabel *getScreenWidget();
 
+    void updateDisplayMatrix();
     void switchForm(int angle);
     void scaleForm(int scale);
     void capture(void);
@@ -114,6 +116,7 @@ private:
 
     /* windowing */
     QHBoxLayout *winLayout;
+    QMatrix dpyMatrix;
     QGraphicsScene *skinScene;
     SkinView *skinView;
     DisplayBase *display;