From: GiWoong Kim Date: Mon, 4 May 2015 06:33:38 +0000 (+0900) Subject: display: added display masking for Qt UI X-Git-Tag: TizenStudio_2.0_p3.0~247 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1ed307752ea601b8492bd3227d53f1bb85a9b7f9;p=sdk%2Femulator%2Fqemu.git display: added display masking for Qt UI The shape of Emulator display can be defined from user-defined masking image in XML file. ... mask.png Change-Id: I2943e5bde4a6b6152f0c23440b8f4e745fefeccf Signed-off-by: GiWoong Kim --- diff --git a/tizen/src/display/xmllayoutparser.cpp b/tizen/src/display/xmllayoutparser.cpp index 1b69eb0..fa627fe 100644 --- a/tizen/src/display/xmllayoutparser.cpp +++ b/tizen/src/display/xmllayoutparser.cpp @@ -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; } diff --git a/tizen/src/ui/displaybase.cpp b/tizen/src/ui/displaybase.cpp index 2d10383..0591e2b 100644 --- a/tizen/src/ui/displaybase.cpp +++ b/tizen/src/ui/displaybase.cpp @@ -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) diff --git a/tizen/src/ui/displaybase.h b/tizen/src/ui/displaybase.h index dfb815a..893707a 100644 --- a/tizen/src/ui/displaybase.h +++ b/tizen/src/ui/displaybase.h @@ -33,6 +33,7 @@ #include +#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; diff --git a/tizen/src/ui/displayglwidget.cpp b/tizen/src/ui/displayglwidget.cpp index 50c2ba3..8eccc9f 100644 --- a/tizen/src/ui/displayglwidget.cpp +++ b/tizen/src/ui/displayglwidget.cpp @@ -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); } diff --git a/tizen/src/ui/displayglwidget.h b/tizen/src/ui/displayglwidget.h index 808bd70..bd2e6a0 100644 --- a/tizen/src/ui/displayglwidget.h +++ b/tizen/src/ui/displayglwidget.h @@ -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: diff --git a/tizen/src/ui/displayswwidget.cpp b/tizen/src/ui/displayswwidget.cpp index e036fc7..d666fb8 100644 --- a/tizen/src/ui/displayswwidget.cpp +++ b/tizen/src/ui/displayswwidget.cpp @@ -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 */ } diff --git a/tizen/src/ui/displayswwidget.h b/tizen/src/ui/displayswwidget.h index f8e99b4..7709e05 100644 --- a/tizen/src/ui/displayswwidget.h +++ b/tizen/src/ui/displayswwidget.h @@ -42,7 +42,7 @@ class DisplaySWWidget : public QLabel, public: DisplaySWWidget(QWidget *parent, - QRect rect, int angle, qreal scaleFactor); + DisplayType *displayForm, qreal scaleFactor); ~DisplaySWWidget(); protected: diff --git a/tizen/src/ui/layout/displaytype.cpp b/tizen/src/ui/layout/displaytype.cpp index 97073cf..15087d9 100644 --- a/tizen/src/ui/layout/displaytype.cpp +++ b/tizen/src/ui/layout/displaytype.cpp @@ -29,10 +29,11 @@ #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 */ diff --git a/tizen/src/ui/layout/displaytype.h b/tizen/src/ui/layout/displaytype.h index edfb59a..73f80d0 100644 --- a/tizen/src/ui/layout/displaytype.h +++ b/tizen/src/ui/layout/displaytype.h @@ -35,16 +35,18 @@ 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 diff --git a/tizen/src/ui/mainwindow.cpp b/tizen/src/ui/mainwindow.cpp index e02c59f..8ef3f2c 100644 --- a/tizen/src/ui/mainwindow.cpp +++ b/tizen/src/ui/mainwindow.cpp @@ -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()); diff --git a/tizen/src/ui/mainwindow.h b/tizen/src/ui/mainwindow.h index 7c982d2..ef5edcf 100644 --- a/tizen/src/ui/mainwindow.h +++ b/tizen/src/ui/mainwindow.h @@ -108,7 +108,7 @@ protected: QLabel *screenWidget; private: - DisplayBase *createDisplay(); + DisplayBase *createDisplay(DisplayType *displayForm); /* windowing */ QHBoxLayout *winLayout;