From 9d07f57d93aa802cbe7b5942d73e641d6a562fca Mon Sep 17 00:00:00 2001 From: GiWoong Kim Date: Wed, 17 Jun 2015 13:43:02 +0900 Subject: [PATCH] touch: draw touch points on the display widget - 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 --- tizen/src/display/qt5_supplement.cpp | 15 ++++-------- tizen/src/ui/displaybase.h | 1 + tizen/src/ui/displayswwidget.cpp | 31 +++++++++++++++++++++++- tizen/src/ui/displayswwidget.h | 5 +++- tizen/src/ui/input/multitouchtracker.cpp | 25 ++++++++++++++++--- tizen/src/ui/input/multitouchtracker.h | 4 +++ tizen/src/ui/mainwindow.cpp | 21 +++++++++++++++- tizen/src/ui/mainwindow.h | 3 +++ 8 files changed, 88 insertions(+), 17 deletions(-) diff --git a/tizen/src/display/qt5_supplement.cpp b/tizen/src/display/qt5_supplement.cpp index 240ccf4c2e..d729e85072 100644 --- a/tizen/src/display/qt5_supplement.cpp +++ b/tizen/src/display/qt5_supplement.cpp @@ -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) diff --git a/tizen/src/ui/displaybase.h b/tizen/src/ui/displaybase.h index 674fbfef3e..fd5c0bcb63 100644 --- a/tizen/src/ui/displaybase.h +++ b/tizen/src/ui/displaybase.h @@ -51,6 +51,7 @@ public: void stopGuideImg(); bool getIsGimgReady(); bool getGimgState(); + void switchForm(DisplayType *displayForm); void scaleForm(qreal scaleFactor); void update(); diff --git a/tizen/src/ui/displayswwidget.cpp b/tizen/src/ui/displayswwidget.cpp index d666fb8a36..67d2e14a2b 100644 --- a/tizen/src/ui/displayswwidget.cpp +++ b/tizen/src/ui/displayswwidget.cpp @@ -29,36 +29,65 @@ */ #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 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); diff --git a/tizen/src/ui/displayswwidget.h b/tizen/src/ui/displayswwidget.h index 7709e05b1d..f38d3ca7eb 100644 --- a/tizen/src/ui/displayswwidget.h +++ b/tizen/src/ui/displayswwidget.h @@ -31,7 +31,7 @@ #ifndef DISPLAYSWWIDGET_H #define DISPLAYSWWIDGET_H -#include +#include #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 diff --git a/tizen/src/ui/input/multitouchtracker.cpp b/tizen/src/ui/input/multitouchtracker.cpp index 276a5a2e5c..7b4dd182f7 100644 --- a/tizen/src/ui/input/multitouchtracker.cpp +++ b/tizen/src/ui/input/multitouchtracker.cpp @@ -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 MultiTouchTracker::getTouchPointList() +{ + return touchPointList; +} + int MultiTouchTracker::addTouchPoint(QPoint hostPos, QPoint guestPos) { const int touchCnt = touchPointList.count(); diff --git a/tizen/src/ui/input/multitouchtracker.h b/tizen/src/ui/input/multitouchtracker.h index 6f2c997699..0a74afeee4 100644 --- a/tizen/src/ui/input/multitouchtracker.h +++ b/tizen/src/ui/input/multitouchtracker.h @@ -59,7 +59,11 @@ public: MultiTouchTracker(TouchScreenHelper* parent, int maxTouchPoint); ~MultiTouchTracker(); + int getPointRadius(); + const QImage &getPointImage(); int getMaxTouchPoint(); + QList getTouchPointList(); + int addTouchPoint(QPoint hostPos, QPoint guestPos); TouchPoint *searchTouchPoint(QPoint targetPos); TouchPoint *searchTouchPoint(int targetID); diff --git a/tizen/src/ui/mainwindow.cpp b/tizen/src/ui/mainwindow.cpp index e35d635ad9..54c7d470ab 100644 --- a/tizen/src/ui/mainwindow.cpp +++ b/tizen/src/ui/mainwindow.cpp @@ -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 ®ion) } } +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(); } diff --git a/tizen/src/ui/mainwindow.h b/tizen/src/ui/mainwindow.h index db494f743f..4f6542e6c7 100644 --- a/tizen/src/ui/mainwindow.h +++ b/tizen/src/ui/mainwindow.h @@ -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; -- 2.34.1