VIGS/qt5: support sw backend 24/25924/1
authorStanislav Vorobiov <s.vorobiov@samsung.com>
Tue, 12 Aug 2014 13:29:55 +0000 (17:29 +0400)
committerStanislav Vorobiov <s.vorobiov@samsung.com>
Tue, 12 Aug 2014 13:30:45 +0000 (17:30 +0400)
sw backend is working again, but still need
to handle skin rotation properly

Change-Id: I8f42f562aef839ff257a87db9fb346af9bf3c907
Signed-off-by: Stanislav Vorobiov <s.vorobiov@samsung.com>
15 files changed:
hw/vigs/vigs_server.c
hw/vigs/vigs_sw_backend.c
tizen/src/display/qt5.c
tizen/src/display/qt5_supplement.cpp
tizen/src/ui/Makefile.objs
tizen/src/ui/displaybase.cpp [new file with mode: 0644]
tizen/src/ui/displaybase.h [new file with mode: 0644]
tizen/src/ui/displayglwidget.cpp [new file with mode: 0644]
tizen/src/ui/displayglwidget.h [new file with mode: 0644]
tizen/src/ui/displayswwidget.cpp [new file with mode: 0644]
tizen/src/ui/displayswwidget.h [new file with mode: 0644]
tizen/src/ui/displaywidget.cpp [deleted file]
tizen/src/ui/displaywidget.h [deleted file]
tizen/src/ui/mainwindow.cpp
tizen/src/ui/mainwindow.h

index 082506c4d399de6ff89dcb52cdbd0c63584112e6..54d712e62a9bed02bb33647742fbe8cb6c6eeeac 100644 (file)
@@ -746,7 +746,6 @@ bool vigs_server_process_captured(struct vigs_server *server, bool force)
     }
 
     server->captured->dirty = false;
-    updated = true;
 
     server->display_ops->resize(server->display_user_data,
                                 server->captured->width,
index 35224c0628f62b1c4f1fc746241eafd33a1627a1..613f6e557a48c84feeb20c0603fe782314fabe0d 100644 (file)
@@ -379,15 +379,13 @@ static bool vigs_sw_backend_composite(struct vigs_surface *surface,
         memcpy(display_data,
                surface->ptr,
                surface->stride * surface->ws_sfc->height);
-        return true;
-    } else if (surface->is_dirty) {
+    } else {
         memcpy(display_data,
                sw_sfc->data,
                surface->stride * surface->ws_sfc->height);
-        return true;
     }
 
-    return false;
+    return true;
 }
 
 static void vigs_sw_backend_batch_end(struct vigs_backend *backend)
index 87648e34738a04ff3893a331c78217cd34edd215..5f444b45e98e1b67fdd649c974cbf60f85f6c55e 100644 (file)
@@ -60,10 +60,7 @@ static void qt5_update(DisplayChangeListener *dcl,
         return;
     }
 
-#if 0
-    /* testing */
     qt5_update_internal(surface_data(surf), surface_width(surf), surface_height(surf));
-#endif
 }
 
 static void qt5_switch(DisplayChangeListener *dcl,
index cb9b595642551b009a39148441212c31238a32b2..357b7679c007d872e45422b68f61eea59c8f144b 100644 (file)
@@ -137,11 +137,14 @@ void qt5_update_internal(void *data, int width, int height)
     QPixmap pixmap = QPixmap();
     QLabel *label = mainwindow->getLabel();
 
-    QImage image = QImage((uchar *)data, width, height, QImage::Format_ARGB32);
+    /*
+     * TODO: support rotation.
+     */
+
+    QImage image = QImage((uchar *)data, width, height, QImage::Format_RGB32);
     pixmap.convertFromImage(image);
     label->setPixmap(pixmap.scaled(label->size(), Qt::KeepAspectRatio,
                 Qt::SmoothTransformation));
-    label->show();
 }
 
 void qt5_switch_internal(void)
index a33417671d340b3969f306d69eb49de5e51fe718..c5368e82390f8bada6f9ca95779ba1b7ab9dc43f 100644 (file)
@@ -7,7 +7,9 @@ $(obj)/qrc_resource.cpp: $(TIZEN_UI)/resource/resource.qrc
 
 obj-$(CONFIG_QT) += controllerform.o
 obj-$(CONFIG_QT) += controllerwidget.o moc_controllerwidget.o
-obj-$(CONFIG_QT) += displaywidget.o moc_displaywidget.o
+obj-$(CONFIG_QT) += displaybase.o
+obj-$(CONFIG_QT) += displayglwidget.o moc_displayglwidget.o
+obj-$(CONFIG_QT) += displayswwidget.o moc_displayswwidget.o
 obj-$(CONFIG_QT) += hardwarekey.o
 obj-$(CONFIG_QT) += mainwindow.o moc_mainwindow.o
 obj-$(CONFIG_QT) += skinbezelitem.o
@@ -26,8 +28,11 @@ obj-$(CONFIG_QT) += menu/
 $(obj)/moc_controllerwidget.o: $(obj)/moc_controllerwidget.cpp
 $(obj)/moc_controllerwidget.cpp: $(obj)/controllerwidget.h
        moc $< -o $@
-$(obj)/moc_displaywidget.o: $(obj)/moc_displaywidget.cpp
-$(obj)/moc_displaywidget.cpp: $(obj)/displaywidget.h
+$(obj)/moc_displayglwidget.o: $(obj)/moc_displayglwidget.cpp
+$(obj)/moc_displayglwidget.cpp: $(obj)/displayglwidget.h
+       moc $< -o $@
+$(obj)/moc_displayswwidget.o: $(obj)/moc_displayswwidget.cpp
+$(obj)/moc_displayswwidget.cpp: $(obj)/displayswwidget.h
        moc $< -o $@
 $(obj)/moc_mainwindow.o: $(obj)/moc_mainwindow.cpp
 $(obj)/moc_mainwindow.cpp: $(obj)/mainwindow.h
diff --git a/tizen/src/ui/displaybase.cpp b/tizen/src/ui/displaybase.cpp
new file mode 100644 (file)
index 0000000..e7dfc4b
--- /dev/null
@@ -0,0 +1,155 @@
+#include "displaybase.h"
+#include "mainwindow.h"
+
+uint32_t qt5_window_width = 0;
+uint32_t qt5_window_height = 0;
+int qt5_window_angle = 0;
+
+DisplayBase::DisplayBase(QSize resolution, QWidget *w)
+: resolution(resolution),
+  w(w),
+  isDragging(false)
+{
+    /* initialize */
+    // TODO: compare display region with resolution
+
+    MainWindow *win = ((MainWindow *)w->parent()->parent());
+    rotateAngle = win->getUIState()->formAngle;
+    scaleFactor = win->getUIState()->getScaleFactor();
+}
+
+DisplayBase::~DisplayBase()
+{
+    qDebug("destory display");
+}
+
+void DisplayBase::rotate(int angle)
+{
+    qDebug("display rotate : %d", angle);
+
+    rotateAngle = angle;
+
+    qt5_window_angle = angle;
+
+    /* adjustSize() doesn't work */
+    w->resize(0, 0);
+
+    w->repaint();
+}
+
+void DisplayBase::scale(int scale)
+{
+    qDebug("display scale : %d", scale);
+
+    scaleFactor = ((qreal)scale) / 100;
+
+    /* adjustSize() doesn't work */
+    w->resize(0, 0);
+
+    w->repaint();
+}
+
+void DisplayBase::handlePaint(QPaintEvent *event)
+{
+}
+
+void DisplayBase::handleResize(QResizeEvent *event)
+{
+    qDebug("resize display");
+
+    MainWindow *win = ((MainWindow *)w->parent()->parent());
+    SkinForm *form = win->uiInfo->getForm();
+
+    const qreal sx = scaleFactor;
+    const qreal sy = scaleFactor;
+
+    w->setGeometry(form->displayRegion.x() * sx,
+                   form->displayRegion.y() * sy,
+                   form->displayRegion.width() * sx,
+                   form->displayRegion.height() * sy);
+
+    qt5_window_width = w->width();
+    qt5_window_height = w->height();
+
+    qt5_graphic_hw_invalidate();
+}
+
+void DisplayBase::handleMousePress(QMouseEvent *event)
+{
+    if (event->button() == Qt::LeftButton) {
+        isDragging = true;
+
+        sendTouchEvent(TOUCH_PRESS, event->x(), event->y());
+    }
+}
+
+void DisplayBase::handleMouseRelease(QMouseEvent *event)
+{
+    if (event->button() == Qt::LeftButton) {
+        if (isDragging) {
+            isDragging = false;
+        }
+
+        sendTouchEvent(TOUCH_RELEASE, event->x(), event->y());
+    }
+}
+
+void DisplayBase::handleMouseMove(QMouseEvent *event)
+{
+    if (isDragging == true) {
+        int event_type = TOUCH_PRESS;
+        int clientX = event->x();
+        int clientY = event->y();
+
+        if (clientX < 0) {
+            event_type = TOUCH_RELEASE;
+            clientX = 0;
+            isDragging = false;
+        } else if (clientX >= w->width()) {
+            event_type = TOUCH_RELEASE;
+            clientX = w->width() - 1;
+            isDragging = false;
+        }
+
+        if (clientY < 0) {
+            event_type = TOUCH_RELEASE;
+            clientY = 0;
+            isDragging = false;
+        } else if (clientY >= w->height()) {
+            event_type = TOUCH_RELEASE;
+            clientY = w->height() - 1;
+            isDragging = false;
+        }
+
+        sendTouchEvent(event_type, clientX, clientY);
+    }
+}
+
+void DisplayBase::sendTouchEvent(int eventType, int clientX, int clientY)
+{
+    int xx = clientX / scaleFactor;
+    int yy = clientY / scaleFactor;
+    int absX = xx;
+    int absY = yy;
+
+    /* TODO: x*cos(rad)-y*sin(rad) */
+    switch(rotateAngle) {
+    case 90: /* Reverse Landscape */
+        absX = yy;
+        absY = resolution.height() - xx;
+        break;
+    case 180: /* Reverse Portrait */
+        absX = resolution.width() - xx;
+        absY = resolution.height() - yy;
+        break;
+    case 270: /* Landscape */
+        absX = resolution.width() - yy;
+        absY = xx;
+        break;
+    case 0:
+    default:
+        break;
+    }
+
+    do_mouse_event(0, eventType, clientX, clientY, absX, absY, 0);
+}
diff --git a/tizen/src/ui/displaybase.h b/tizen/src/ui/displaybase.h
new file mode 100644 (file)
index 0000000..f4eda66
--- /dev/null
@@ -0,0 +1,46 @@
+#ifndef DISPLAYBASE_H
+#define DISPLAYBASE_H
+
+#include <QWidget>
+
+extern "C" {
+void qt5_graphic_hw_invalidate(void);
+}
+
+enum {
+    TOUCH_PRESS = 1,
+    TOUCH_RELEASE = 2,
+};
+
+class DisplayBase
+{
+public:
+    void rotate(int angle);
+    void scale(int scale);
+
+protected:
+    DisplayBase(QSize resolution, QWidget *w);
+    virtual ~DisplayBase();
+
+    void setRotate(int angle);
+    void setScale(int scale);
+
+    void handlePaint(QPaintEvent *event);
+    void handleResize(QResizeEvent *event);
+
+    void handleMousePress(QMouseEvent *event);
+    void handleMouseRelease(QMouseEvent *event);
+    void handleMouseMove(QMouseEvent *event);
+
+private:
+    void sendTouchEvent(int eventType, int clientX, int clientY);
+
+    QSize resolution;
+    QWidget *w;
+    int rotateAngle;
+    qreal scaleFactor;
+
+    bool isDragging;
+};
+
+#endif
diff --git a/tizen/src/ui/displayglwidget.cpp b/tizen/src/ui/displayglwidget.cpp
new file mode 100644 (file)
index 0000000..84e5437
--- /dev/null
@@ -0,0 +1,56 @@
+#include <QtWidgets>
+
+#include "displayglwidget.h"
+
+DisplayGLWidget::DisplayGLWidget(QSize resolution, QGLContext *context, QWidget *parent) :
+    QGLWidget(context, parent),
+    DisplayBase(resolution, this)
+{
+    setAutoBufferSwap(false);
+}
+
+void DisplayGLWidget::initializeGL()
+{
+    qDebug("initialize GL");
+}
+
+void DisplayGLWidget::paintEvent(QPaintEvent *event)
+{
+    /*
+     * We offload rendering to separate thread, this must be
+     * a no-op, see: http://qt-project.org/doc/qt-5/QGLWidget.html:
+     * "3. Using QPainter to draw into a QGLWidget in a thread"
+     */
+
+    handlePaint(event);
+}
+
+void DisplayGLWidget::resizeEvent(QResizeEvent *event)
+{
+    /*
+     * We offload rendering to separate thread, this must be
+     * a no-op, see: http://qt-project.org/doc/qt-5/QGLWidget.html:
+     * "3. Using QPainter to draw into a QGLWidget in a thread"
+     */
+
+    handleResize(event);
+}
+
+void DisplayGLWidget::mousePressEvent(QMouseEvent *event)
+{
+    handleMousePress(event);
+}
+
+void DisplayGLWidget::mouseReleaseEvent(QMouseEvent *event)
+{
+    handleMouseRelease(event);
+}
+
+void DisplayGLWidget::mouseMoveEvent(QMouseEvent *event)
+{
+    handleMouseMove(event);
+}
+
+DisplayGLWidget::~DisplayGLWidget()
+{
+}
diff --git a/tizen/src/ui/displayglwidget.h b/tizen/src/ui/displayglwidget.h
new file mode 100644 (file)
index 0000000..899e85f
--- /dev/null
@@ -0,0 +1,27 @@
+#ifndef DISPLAYGLWIDGET_H
+#define DISPLAYGLWIDGET_H
+
+#include "displaybase.h"
+#include <QGLWidget>
+
+class DisplayGLWidget : public QGLWidget,
+                        public DisplayBase
+{
+    Q_OBJECT
+
+public:
+    DisplayGLWidget(QSize resolution, QGLContext *context, QWidget *parent = 0);
+    ~DisplayGLWidget();
+
+protected:
+    void initializeGL();
+
+    void paintEvent(QPaintEvent *event);
+    void resizeEvent(QResizeEvent *event);
+
+    void mousePressEvent(QMouseEvent *event);
+    void mouseReleaseEvent(QMouseEvent *event);
+    void mouseMoveEvent(QMouseEvent *event);
+};
+
+#endif // DISPLAYGLWIDGET_H
diff --git a/tizen/src/ui/displayswwidget.cpp b/tizen/src/ui/displayswwidget.cpp
new file mode 100644 (file)
index 0000000..a5d0d9b
--- /dev/null
@@ -0,0 +1,40 @@
+#include <QtWidgets>
+
+#include "displayswwidget.h"
+
+DisplaySWWidget::DisplaySWWidget(QSize resolution, QWidget *parent) :
+    QLabel(parent),
+    DisplayBase(resolution, this)
+{
+}
+
+void DisplaySWWidget::paintEvent(QPaintEvent *event)
+{
+    QLabel::paintEvent(event);
+    handlePaint(event);
+}
+
+void DisplaySWWidget::resizeEvent(QResizeEvent *event)
+{
+    QLabel::resizeEvent(event);
+    handleResize(event);
+}
+
+void DisplaySWWidget::mousePressEvent(QMouseEvent *event)
+{
+    handleMousePress(event);
+}
+
+void DisplaySWWidget::mouseReleaseEvent(QMouseEvent *event)
+{
+    handleMouseRelease(event);
+}
+
+void DisplaySWWidget::mouseMoveEvent(QMouseEvent *event)
+{
+    handleMouseMove(event);
+}
+
+DisplaySWWidget::~DisplaySWWidget()
+{
+}
diff --git a/tizen/src/ui/displayswwidget.h b/tizen/src/ui/displayswwidget.h
new file mode 100644 (file)
index 0000000..8427e8c
--- /dev/null
@@ -0,0 +1,25 @@
+#ifndef DISPLAYSWWIDGET_H
+#define DISPLAYSWWIDGET_H
+
+#include "displaybase.h"
+#include <QLabel>
+
+class DisplaySWWidget : public QLabel,
+                        public DisplayBase
+{
+    Q_OBJECT
+
+public:
+    DisplaySWWidget(QSize resolution, QWidget *parent = 0);
+    ~DisplaySWWidget();
+
+protected:
+    void paintEvent(QPaintEvent *event);
+    void resizeEvent(QResizeEvent *event);
+
+    void mousePressEvent(QMouseEvent *event);
+    void mouseReleaseEvent(QMouseEvent *event);
+    void mouseMoveEvent(QMouseEvent *event);
+};
+
+#endif // DISPLAYSWWIDGET_H
diff --git a/tizen/src/ui/displaywidget.cpp b/tizen/src/ui/displaywidget.cpp
deleted file mode 100644 (file)
index 42b060c..0000000
+++ /dev/null
@@ -1,190 +0,0 @@
-#include <QtWidgets>
-
-#include "displaywidget.h"
-#include "mainwindow.h"
-
-uint32_t qt5_window_width = 0;
-uint32_t qt5_window_height = 0;
-int qt5_window_angle = 0;
-
-DisplayWidget::DisplayWidget(QSize resolution, QGLContext *context, QWidget *parent) :
-    QGLWidget(context, parent)
-{
-    /* initialize */
-    // TODO: compare display region with resolution
-    this->resolution = resolution;
-
-    MainWindow *win = ((MainWindow *)this->parent()->parent());
-    rotateAngle = win->getUIState()->formAngle;
-    scaleFactor = win->getUIState()->getScaleFactor();
-
-    //setAutoFillBackground(false);
-
-    setAutoBufferSwap(false);
-}
-
-void DisplayWidget::initializeGL()
-{
-    qDebug("initialize GL");
-}
-
-void DisplayWidget::rotate(int angle)
-{
-    qDebug("display rotate : %d", angle);
-
-    rotateAngle = angle;
-
-    qt5_window_angle = angle;
-
-    /* adjustSize() doesn't work */
-    resize(0, 0);
-
-    repaint();
-}
-
-void DisplayWidget::scale(int scale)
-{
-    qDebug("display scale : %d", scale);
-
-    scaleFactor = ((qreal)scale) / 100;
-
-    /* adjustSize() doesn't work */
-    resize(0, 0);
-
-    repaint();
-}
-
-void DisplayWidget::paintEvent(QPaintEvent *event)
-{
-    /*
-     * We offload rendering to separate thread, this must be
-     * a no-op, see: http://qt-project.org/doc/qt-5/QGLWidget.html:
-     * "3. Using QPainter to draw into a QGLWidget in a thread"
-     */
-}
-
-void DisplayWidget::resizeEvent(QResizeEvent *event)
-{
-    /*
-     * We offload rendering to separate thread, this must be
-     * a no-op, see: http://qt-project.org/doc/qt-5/QGLWidget.html:
-     * "3. Using QPainter to draw into a QGLWidget in a thread"
-     */
-
-    qDebug("resize display");
-
-    //QGLWidget::resizeEvent(event); /* initializeGL */
-
-    MainWindow *win = ((MainWindow *)this->parent()->parent());
-    SkinForm *form = win->uiInfo->getForm();
-
-    const qreal sx = scaleFactor;
-    const qreal sy = scaleFactor;
-
-    setGeometry(form->displayRegion.x() * sx,
-                form->displayRegion.y() * sy,
-                form->displayRegion.width() * sx,
-                form->displayRegion.height() * sy);
-
-    qt5_window_width = width();
-    qt5_window_height = height();
-
-    qt5_graphic_hw_invalidate();
-}
-
-void DisplayWidget::sendTouchEvent(int eventType, int clientX, int clientY)
-{
-    int xx = clientX / scaleFactor;
-    int yy = clientY / scaleFactor;
-    int absX = xx;
-    int absY = yy;
-
-    /* TODO: x*cos(rad)-y*sin(rad) */
-    switch(rotateAngle) {
-    case 90: /* Reverse Landscape */
-        absX = yy;
-        absY = resolution.height() - xx;
-        break;
-    case 180: /* Reverse Portrait */
-        absX = resolution.width() - xx;
-        absY = resolution.height() - yy;
-        break;
-    case 270: /* Landscape */
-        absX = resolution.width() - yy;
-        absY = xx;
-        break;
-    case 0:
-    default:
-        break;
-    }
-
-    do_mouse_event(0, eventType, clientX, clientY, absX, absY, 0);
-}
-
-void DisplayWidget::mousePressEvent(QMouseEvent *event)
-{
-    if (event->button() == Qt::LeftButton) {
-        isDragging = true;
-
-        sendTouchEvent(TOUCH_PRESS, event->x(), event->y());
-    }
-}
-
-void DisplayWidget::mouseReleaseEvent(QMouseEvent *event)
-{
-    if (event->button() == Qt::LeftButton) {
-        if (isDragging) {
-            isDragging = false;
-        }
-
-        sendTouchEvent(TOUCH_RELEASE, event->x(), event->y());
-    }
-}
-
-void DisplayWidget::mouseMoveEvent(QMouseEvent *event)
-{
-    if (isDragging == true) {
-        int event_type = TOUCH_PRESS;
-        int clientX = event->x();
-        int clientY = event->y();
-
-        if (clientX < 0) {
-            event_type = TOUCH_RELEASE;
-            clientX = 0;
-            isDragging = false;
-        } else if (clientX >= width()) {
-            event_type = TOUCH_RELEASE;
-            clientX = width() - 1;
-            isDragging = false;
-        }
-
-        if (clientY < 0) {
-            event_type = TOUCH_RELEASE;
-            clientY = 0;
-            isDragging = false;
-        } else if (clientY >= height()) {
-            event_type = TOUCH_RELEASE;
-            clientY = height() - 1;
-            isDragging = false;
-        }
-
-        sendTouchEvent(event_type, clientX, clientY);
-    }
-}
-
-/*
-void DisplayWidget::keyPressEvent(QKeyEvent *event)
-{
-    qDebug("key pressed : %d", event->key());
-}
-
-void DisplayWidget::keyReleaseEvent(QKeyEvent *event)
-{
-    qDebug("key released : %d", event->key());
-}
-*/
-
-DisplayWidget::~DisplayWidget()
-{
-    qDebug("destory display");
-}
diff --git a/tizen/src/ui/displaywidget.h b/tizen/src/ui/displaywidget.h
deleted file mode 100644 (file)
index 38bbb07..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-#ifndef DISPLAYWIDGET_H
-#define DISPLAYWIDGET_H
-
-#include <QGLWidget>
-
-extern "C" {
-void qt5_graphic_hw_invalidate(void);
-}
-
-enum {
-    TOUCH_PRESS = 1,
-    TOUCH_RELEASE = 2,
-};
-
-class DisplayWidget : public QGLWidget
-{
-    Q_OBJECT
-
-public:
-    DisplayWidget(QSize resolution, QGLContext *context, QWidget *parent = 0);
-    ~DisplayWidget();
-
-    void rotate(int angle);
-    void scale(int scale);
-
-protected:
-    void initializeGL();
-
-    void paintEvent(QPaintEvent *event);
-    void resizeEvent(QResizeEvent *event);
-
-    void mousePressEvent(QMouseEvent *event);
-    void mouseReleaseEvent(QMouseEvent *event);
-    void mouseMoveEvent(QMouseEvent *event);
-    //void keyPressEvent(QKeyEvent *event);
-    //void keyReleaseEvent(QKeyEvent *event);
-
-    void sendTouchEvent(int eventType, int clientX, int clientY);
-
-private:
-    QSize resolution;
-    int rotateAngle;
-    qreal scaleFactor;
-
-    bool isDragging;
-};
-
-#endif // DISPLAYWIDGET_H
index 7dbcc88e5aa6c34950bdcbc7e9ddfe2862a6f22b..32203df8886652c64e962350fed43617212edb26 100644 (file)
@@ -2,6 +2,8 @@
 
 #include "mainwindow.h"
 #include "skinform.h"
+#include "displayglwidget.h"
+#include "displayswwidget.h"
 
 extern "C" {
 int qt5_graphic_hw_display(void);
@@ -23,23 +25,26 @@ void DisplaySwapper::display()
      * TODO: Currently qt5 skin doesn't terminate properly,
      * check this once proper termination is implemented.
      */
-    context->makeCurrent();
-    while (!terminating) {
-        if (qt5_graphic_hw_display()) {
-            context->swapBuffers();
+
+    if (context) {
+        context->makeCurrent();
+        while (!terminating) {
+            if (qt5_graphic_hw_display()) {
+                context->swapBuffers();
+            }
+        }
+        context->doneCurrent();
+    } else {
+        while (!terminating) {
+            qt5_graphic_hw_display();
         }
     }
-    context->doneCurrent();
 }
 
 MainWindow::MainWindow(UIInformation *uiInfo, QWidget *parent) :
     QWidget(parent)
 {
-    label = new QLabel();
-    label->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
-    label->setAlignment(Qt::AlignCenter);
-    label->setFixedSize(720 / 2, 1280 / 2);
-
+    this->label = NULL;
     /* initialize */
     this->uiInfo = uiInfo;
 
@@ -75,28 +80,37 @@ MainWindow::MainWindow(UIInformation *uiInfo, QWidget *parent) :
     winLayout->addWidget(conView);
 #endif
 
-    QGLContext *wrapperContext = QGLContext::fromOpenGLContext(qt5GLContext);
+    QGLContext *context = NULL;
 
-    /*
-     * Qt5 bug, wrapperContext->requestedFormat() doesn't return
-     * originating format, it returns actual format, this may result
-     * in wrong OpenGL context version here.
-     */
+    if (qt5GLContext) {
+        QGLContext *wrapperContext = QGLContext::fromOpenGLContext(qt5GLContext);
 
-    QGLFormat format = QGLFormat::fromSurfaceFormat(qt5GLFormat);
+        /*
+         * Qt5 bug, wrapperContext->requestedFormat() doesn't return
+         * originating format, it returns actual format, this may result
+         * in wrong OpenGL context version here.
+         */
 
-    /*
-     * Qt5 bug, format set here doesn't always have effect, must
-     * set it after QGLWidget is created.
-     */
-    QGLContext *context = new QGLContext(format);
+        QGLFormat format = QGLFormat::fromSurfaceFormat(qt5GLFormat);
+
+        /*
+         * Qt5 bug, format set here doesn't always have effect, must
+         * set it after QGLWidget is created.
+         */
+        context = new QGLContext(format);
+
+        /* display */
+        display = new DisplayGLWidget(uiInfo->resolution, context, skinView);
 
-    /* display */
-    display = new DisplayWidget(uiInfo->resolution, context, skinView);
+        context->setFormat(format);
 
-    context->setFormat(format);
+        context->create(wrapperContext);
+    } else {
+        DisplaySWWidget *w = new DisplaySWWidget(uiInfo->resolution, skinView);
 
-    context->create(wrapperContext);
+        display = w;
+        label = w;
+    }
 
     /* popup menu */
     popupMenu = new ContextMenu(this);
@@ -108,8 +122,10 @@ MainWindow::MainWindow(UIInformation *uiInfo, QWidget *parent) :
     /* swapper */
     swapperThread = new QThread(this);
 
-    context->doneCurrent();
-    context->moveToThread(swapperThread);
+    if (context) {
+        context->doneCurrent();
+        context->moveToThread(swapperThread);
+    }
 
     swapper = new DisplaySwapper(context);
     swapper->moveToThread(swapperThread);
index 281c99a277aa21130561e05dbbff2c36eed63c7a..7d8ed31b388dcb56bf5322cd3cfe927515a914b2 100644 (file)
@@ -2,10 +2,11 @@
 #define MAINWINDOW_H
 
 #include <QWidget>
+#include <QGLContext>
 
 #include "menu/contextmenu.h"
 #include "skinview.h"
-#include "displaywidget.h"
+#include "displaybase.h"
 #include "skinbezelitem.h"
 #include "uiinformation.h"
 #include "skincontrollerview.h"
@@ -68,7 +69,7 @@ private:
     /* windowing */
     ContextMenu *popupMenu;
     SkinView* skinView;
-    DisplayWidget *display;
+    DisplayBase *display;
     SkinControllerView *conView;
     QThread *swapperThread;
     DisplaySwapper *swapper;