}
server->captured->dirty = false;
- updated = true;
server->display_ops->resize(server->display_user_data,
server->captured->width,
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)
return;
}
-#if 0
- /* testing */
qt5_update_internal(surface_data(surf), surface_width(surf), surface_height(surf));
-#endif
}
static void qt5_switch(DisplayChangeListener *dcl,
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)
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
$(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
--- /dev/null
+#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);
+}
--- /dev/null
+#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
--- /dev/null
+#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()
+{
+}
--- /dev/null
+#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
--- /dev/null
+#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()
+{
+}
--- /dev/null
+#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
+++ /dev/null
-#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");
-}
+++ /dev/null
-#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
#include "mainwindow.h"
#include "skinform.h"
+#include "displayglwidget.h"
+#include "displayswwidget.h"
extern "C" {
int qt5_graphic_hw_display(void);
* 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;
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);
/* swapper */
swapperThread = new QThread(this);
- context->doneCurrent();
- context->moveToThread(swapperThread);
+ if (context) {
+ context->doneCurrent();
+ context->moveToThread(swapperThread);
+ }
swapper = new DisplaySwapper(context);
swapper->moveToThread(swapperThread);
#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"
/* windowing */
ContextMenu *popupMenu;
SkinView* skinView;
- DisplayWidget *display;
+ DisplayBase *display;
SkinControllerView *conView;
QThread *swapperThread;
DisplaySwapper *swapper;