display: added display masking for Qt UI
authorGiWoong Kim <giwoong.kim@samsung.com>
Mon, 4 May 2015 06:33:38 +0000 (15:33 +0900)
committerGiWoong Kim <giwoong.kim@samsung.com>
Mon, 4 May 2015 06:56:54 +0000 (15:56 +0900)
The shape of Emulator display can be defined from user-defined
masking image in XML file.

<display>
    ...
    <maskImage>mask.png</maskImage>
</display>

Change-Id: I2943e5bde4a6b6152f0c23440b8f4e745fefeccf
Signed-off-by: GiWoong Kim <giwoong.kim@samsung.com>
tizen/src/display/xmllayoutparser.cpp
tizen/src/ui/displaybase.cpp
tizen/src/ui/displaybase.h
tizen/src/ui/displayglwidget.cpp
tizen/src/ui/displayglwidget.h
tizen/src/ui/displayswwidget.cpp
tizen/src/ui/displayswwidget.h
tizen/src/ui/layout/displaytype.cpp
tizen/src/ui/layout/displaytype.h
tizen/src/ui/mainwindow.cpp
tizen/src/ui/mainwindow.h

index 1b69eb0..fa627fe 100644 (file)
@@ -41,6 +41,7 @@
 #define DISPLAY_KEYWORD "display"
 #define NORMAL_IMG_KEYWORD "normalImage"
 #define PRESSED_IMG_KEYWORD "pressedImage"
+#define MASK_IMG_KEYWORD "maskImage"
 #define KEYLIST_KEYWORD "keyList"
 #define HOVER_KEYWORD "hover"
 #define FORM_KEYWORD "form"
@@ -133,8 +134,11 @@ QRect XmlLayoutParser::parseRegion(QXmlStreamReader &xml)
 
 DisplayType *XmlLayoutParser::parseDisplay(QXmlStreamReader &xml)
 {
-    QRect displayRegion;
+    QRect displayRect;
     int angle = 0;
+    QPixmap maskImage;
+
+    qDebug("** display {");
 
     QXmlStreamReader::TokenType token = xml.readNext();
 
@@ -144,20 +148,31 @@ DisplayType *XmlLayoutParser::parseDisplay(QXmlStreamReader &xml)
         if (token == QXmlStreamReader::StartElement) {
             if (xml.name() == REGION_KEYWORD) {
                 /* region */
-                displayRegion = parseRegion(xml);
-                qDebug("- display : (%d,%d %dx%d)",
-                    displayRegion.x(), displayRegion.y(),
-                    displayRegion.width(), displayRegion.height());
+                displayRect = parseRegion(xml);
+                qDebug("- rect : (%d,%d %dx%d)",
+                    displayRect.x(), displayRect.y(),
+                    displayRect.width(), displayRect.height());
             } else if (xml.name() == "angle") {
                 /* angle */
                 angle = xml.readElementText().toInt();
+            } else if (xml.name() == MASK_IMG_KEYWORD) {
+                /* display mask */
+                QString maskImageFileName = xml.readElementText();
+                qDebug() << "- maskImage :" << maskImageFileName;
+
+                if (maskImage.load(
+                    xmlPath + QDir::separator() + maskImageFileName) == false) {
+                    qWarning() << "failed to load mask image";
+                }
             }
         }
 
         token = xml.readNext();
     }
 
-    return new DisplayType(displayRegion, angle);
+    qDebug("** }");
+
+    return new DisplayType(displayRect, angle, maskImage);
 }
 
 HardwareKey *XmlLayoutParser::parseKey(QXmlStreamReader &xml)
@@ -227,7 +242,7 @@ MainForm *XmlLayoutParser::parseMainForm(QXmlStreamReader &xml)
     QString formName = xml.attributes().value(NAME_ATTR_KEYWORD).toString();
     MainForm *form = new MainForm(formName);
 
-    qDebug() << form->getName() << "================";
+    qDebug() << '*' << form->getName() << '{';
 
     QXmlStreamReader::TokenType token = xml.readNext();
 
@@ -256,9 +271,6 @@ MainForm *XmlLayoutParser::parseMainForm(QXmlStreamReader &xml)
                     xmlPath + QDir::separator() + pressedImageFileName) == false) {
                     qWarning() << "failed to load pressed image";
                 }
-            } else if (xml.name() == "maskImage") {
-                /* mask image */
-                // TODO:
             } else if (xml.name() == KEYLIST_KEYWORD) {
                 /* HW keys */
                 int cnt = parseKeyList(xml, form->keyList);
@@ -271,7 +283,7 @@ MainForm *XmlLayoutParser::parseMainForm(QXmlStreamReader &xml)
         token = xml.readNext();
     }
 
-    qDebug() << form->getName() << "================";
+    qDebug("}");
 
     return form;
 }
@@ -541,10 +553,10 @@ QString XmlLayoutParser::parseEmulatorUI(QXmlStreamReader &xml)
                 continue;
             } else if (xml.name() == FORMLIST_KEYWORD) {
                 int cnt = parseMainFormList(xml, uiInfo->mainFormList);
-                qDebug("formList : %d", cnt);
+                qDebug("formList : %d", cnt);
             } else if (xml.name() == MENULIST_KEYWORD) {
                 int cnt = parseMenuList(xml, uiInfo->menuList);
-                qDebug("menuList : %d", cnt);
+                qDebug("menuList : %d", cnt);
             }
         }
     }
@@ -560,7 +572,7 @@ ControllerForm *XmlLayoutParser::parseControllerForm(QXmlStreamReader &xml)
     ControllerForm *form = new ControllerForm(
         formName.isEmpty() ? xmlPath.section(QDir::separator(), -1) : formName);
 
-    qDebug() << form->getName() << "================";
+    qDebug() << '*' << form->getName() << "{";
 
     QXmlStreamReader::TokenType token = xml.readNext();
 
@@ -601,7 +613,7 @@ ControllerForm *XmlLayoutParser::parseControllerForm(QXmlStreamReader &xml)
         token = xml.readNext();
     }
 
-    qDebug() << form->getName() << "================";
+    qDebug("}");
 
     return form;
 }
index 2d10383..0591e2b 100644 (file)
@@ -35,11 +35,12 @@ uint32_t qt5_window_width = 0;
 uint32_t qt5_window_height = 0;
 int qt5_window_angle = 0;
 
-DisplayBase::DisplayBase(QRect rect, int angle, qreal scaleFactor,
+DisplayBase::DisplayBase(DisplayType *displayForm, qreal scaleFactor,
     QWidget *w) : widget(w)
 {
-    this->rect = rect;
-    this->rotateAngle = angle;
+    this->rect = displayForm->getRect();
+    this->maskImage = displayForm->getMask();
+    this->rotateAngle = displayForm->getAngle();
     this->scaleFactor = scaleFactor;
     this->isDragging = false;
     this->tsHelper = new TouchScreenHelper(this);
@@ -47,12 +48,13 @@ DisplayBase::DisplayBase(QRect rect, int angle, qreal scaleFactor,
     updateGeometry();
 }
 
-void DisplayBase::rotate(QRect rect, int angle)
+void DisplayBase::switchForm(DisplayType *displayForm)
 {
-    qDebug("display rotate : %d", angle);
+    qDebug() << "display switch angle :" << displayForm->getAngle();
 
-    this->rect = rect;
-    qt5_window_angle = rotateAngle = angle;
+    rect = displayForm->getRect();
+    maskImage = displayForm->getMask();
+    qt5_window_angle = rotateAngle = displayForm->getAngle();
 
     updateGeometry();
     update();
@@ -60,7 +62,7 @@ void DisplayBase::rotate(QRect rect, int angle)
     widget->repaint();
 }
 
-void DisplayBase::scale(qreal scaleFactor)
+void DisplayBase::scaleForm(qreal scaleFactor)
 {
     qDebug() << "display scale factor :" << scaleFactor;
 
@@ -83,6 +85,11 @@ void DisplayBase::updateGeometry()
         rect.y() * scaleFactor,
         rect.width() * scaleFactor,
         rect.height() * scaleFactor);
+
+    if (maskImage.size() != QSize(0, 0)) {
+        qDebug("set a mask to display");
+        widget->setMask(maskImage.mask());
+    }
 }
 
 void DisplayBase::handlePaint(QPaintEvent *event)
index dfb815a..893707a 100644 (file)
@@ -33,6 +33,7 @@
 
 #include <QWidget>
 
+#include "layout/displaytype.h"
 #include "input/touchscreenhelper.h"
 
 extern "C" {
@@ -42,8 +43,8 @@ void qt5_graphic_hw_invalidate(void);
 class DisplayBase
 {
 public:
-    void rotate(QRect rect, int angle);
-    void scale(qreal scaleFactor);
+    void switchForm(DisplayType *displayForm);
+    void scaleForm(qreal scaleFactor);
     void update();
     void updateGeometry();
 
@@ -51,7 +52,7 @@ public:
     TouchScreenHelper *getTouchScreenHelper();
 
 protected:
-    DisplayBase(QRect rect, int angle, qreal scaleFactor, QWidget *w);
+    DisplayBase(DisplayType *displayForm, qreal scaleFactor, QWidget *w);
     virtual ~DisplayBase();
 
     void handlePaint(QPaintEvent *event);
@@ -62,6 +63,7 @@ protected:
     void handleMouseMove(QMouseEvent *event);
 
     QRect rect;
+    QPixmap maskImage;
     int rotateAngle;
     qreal scaleFactor;
     bool isDragging;
index 50c2ba3..8eccc9f 100644 (file)
@@ -30,9 +30,9 @@
 
 #include "displayglwidget.h"
 
-DisplayGLWidget::DisplayGLWidget(QWidget *parent,
-    QGLContext *context, QRect rect, int angle, qreal scaleFactor) :
-    QGLWidget(context, parent), DisplayBase(rect, angle, scaleFactor, this)
+DisplayGLWidget::DisplayGLWidget(QWidget *parent, QGLContext *context,
+    DisplayType *displayForm, qreal scaleFactor) :
+    QGLWidget(context, parent), DisplayBase(displayForm, scaleFactor, this)
 {
     setAutoBufferSwap(false);
 }
index 808bd70..bd2e6a0 100644 (file)
@@ -41,8 +41,8 @@ class DisplayGLWidget : public QGLWidget,
     Q_OBJECT
 
 public:
-    DisplayGLWidget(QWidget *parent,
-        QGLContext *context, QRect rect, int angle, qreal scaleFactor);
+    DisplayGLWidget(QWidget *parent, QGLContext *context,
+        DisplayType *displayForm, qreal scaleFactor);
     ~DisplayGLWidget();
 
 protected:
index e036fc7..d666fb8 100644 (file)
@@ -31,8 +31,8 @@
 #include "displayswwidget.h"
 
 DisplaySWWidget::DisplaySWWidget(QWidget *parent,
-    QRect rect, int angle, qreal scaleFactor) :
-    QLabel(parent), DisplayBase(rect, angle, scaleFactor, this)
+    DisplayType *displayForm, qreal scaleFactor) :
+    QLabel(parent), DisplayBase(displayForm, scaleFactor, this)
 {
     /* do nothing */
 }
index f8e99b4..7709e05 100644 (file)
@@ -42,7 +42,7 @@ class DisplaySWWidget : public QLabel,
 
 public:
     DisplaySWWidget(QWidget *parent,
-        QRect rect, int angle, qreal scaleFactor);
+        DisplayType *displayForm, qreal scaleFactor);
     ~DisplaySWWidget();
 
 protected:
index 97073cf..15087d9 100644 (file)
 
 #include "displaytype.h"
 
-DisplayType::DisplayType(QRect rect, int angle)
+DisplayType::DisplayType(QRect rect, int angle, QPixmap mask)
 {
     this->rect = rect;
     this->angle = angle;
+    this->mask = mask;
 }
 
 void DisplayType::setRect(QRect rect)
@@ -50,6 +51,11 @@ int DisplayType::getAngle()
     return angle % 360;
 }
 
+QPixmap DisplayType::getMask()
+{
+    return mask;
+}
+
 DisplayType::~DisplayType()
 {
     /* do nothing */
index edfb59a..73f80d0 100644 (file)
 class DisplayType
 {
 public:
-    DisplayType(QRect rect, int angle);
+    DisplayType(QRect rect, int angle, QPixmap mask);
     ~DisplayType();
 
     void setRect(QRect rect);
     QRect getRect();
     int getAngle();
+    QPixmap getMask();
 
 private:
     QRect rect;
     int angle;
+    QPixmap mask;
 };
 
 #endif // DISPLAYTYPE_H
index e02c59f..8ef3f2c 100644 (file)
@@ -106,7 +106,7 @@ MainWindow::MainWindow(UIInformation *uiInfo, QWidget *parent) :
     winLayout->addWidget(skinView);
 
     /* display */
-    display = createDisplay();
+    display = createDisplay(uiInfo->getMainFormDisplayType());
 
     /* set HW Key shortcut */
     keyboardShortcut = new KeyboardShortcut(this);
@@ -120,7 +120,7 @@ MainWindow::MainWindow(UIInformation *uiInfo, QWidget *parent) :
         SLOT(showContextMenu(const QPoint&)));
 }
 
-DisplayBase *MainWindow::createDisplay()
+DisplayBase *MainWindow::createDisplay(DisplayType *displayForm)
 {
     DisplayBase *displayWidget = NULL;
 
@@ -143,9 +143,7 @@ DisplayBase *MainWindow::createDisplay()
         QGLContext *context = new QGLContext(format);
 
         displayWidget = new DisplayGLWidget(skinView, context,
-            uiInfo->getMainFormDisplayType()->getRect(),
-            uiInfo->getMainFormDisplayType()->getAngle(),
-            getUIState()->getScaleFactor());
+            displayForm, getUIState()->getScaleFactor());
 
         context->setFormat(format);
         context->create(wrapperContext);
@@ -165,9 +163,7 @@ DisplayBase *MainWindow::createDisplay()
         swapperThread->start();
     } else { /* off-screen rendering */
         DisplaySWWidget *widget = new DisplaySWWidget(skinView,
-            uiInfo->getMainFormDisplayType()->getRect(),
-            uiInfo->getMainFormDisplayType()->getAngle(),
-            getUIState()->getScaleFactor());
+            displayForm, getUIState()->getScaleFactor());
 
         screenWidget = widget;
         displayWidget = widget;
@@ -368,6 +364,7 @@ void MainWindow::switchForm(int index)
 {
     qDebug("window switch : %d", index);
 
+    /* layout switching */
     getUIState()->mainFormIndex = index;
 
     if (getDockingCon() != NULL) {
@@ -378,9 +375,7 @@ void MainWindow::switchForm(int index)
     skinView->update();
 
     if (display != NULL) {
-        display->rotate(
-            uiInfo->getMainFormDisplayType()->getRect(),
-            uiInfo->getMainFormDisplayType()->getAngle());
+        display->switchForm(uiInfo->getMainFormDisplayType());
     }
 
     setMask(uiInfo->getUiRegion());
@@ -400,7 +395,7 @@ void MainWindow::scaleForm(int scale)
     skinView->update();
 
     if (display != NULL) {
-        display->scale(getUIState()->getScaleFactor());
+        display->scaleForm(getUIState()->getScaleFactor());
     }
 
     setMask(uiInfo->getUiRegion());
index 7c982d2..ef5edcf 100644 (file)
@@ -108,7 +108,7 @@ protected:
     QLabel *screenWidget;
 
 private:
-    DisplayBase *createDisplay();
+    DisplayBase *createDisplay(DisplayType *displayForm);
 
     /* windowing */
     QHBoxLayout *winLayout;