From b4be62e9ac936b110375492dcdc7aeccfe46bd29 Mon Sep 17 00:00:00 2001 From: Jani Hautakangas Date: Thu, 16 May 2013 09:52:07 +0300 Subject: [PATCH] QOpenGLPaintDevice sub-area support Allows creating QOpenGLPaintDevice targetting sub-area of binded framebuffer. Upstream-Status: Pending Change-Id: Ida2f079aa1ac0b87d36b54129e226399dbcdda80 Signed-off-by: Martin Jansa --- src/gui/opengl/qopenglpaintdevice.cpp | 11 +++++++++++ src/gui/opengl/qopenglpaintdevice.h | 2 ++ src/gui/opengl/qopenglpaintdevice_p.h | 1 + src/gui/opengl/qopenglpaintengine.cpp | 9 +++++++-- src/gui/opengl/qopenglpaintengine_p.h | 1 + src/gui/opengl/qopengltextureglyphcache.cpp | 2 +- 6 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/gui/opengl/qopenglpaintdevice.cpp b/src/gui/opengl/qopenglpaintdevice.cpp index 17a3277..85425da 100644 --- a/src/gui/opengl/qopenglpaintdevice.cpp +++ b/src/gui/opengl/qopenglpaintdevice.cpp @@ -135,6 +135,12 @@ QOpenGLPaintDevice::QOpenGLPaintDevice(int width, int height) { } +QOpenGLPaintDevice::QOpenGLPaintDevice(int x, int y, int width, int height) + : d_ptr(new QOpenGLPaintDevicePrivate(QSize(width, height))) +{ + d_ptr->offset = QPoint(x,y); +} + /*! \internal */ @@ -216,6 +222,11 @@ QOpenGLContext *QOpenGLPaintDevice::context() const return d_ptr->ctx; } +QPoint QOpenGLPaintDevice::offset() const +{ + return d_ptr->offset; +} + /*! Returns the pixel size of the paint device. diff --git a/src/gui/opengl/qopenglpaintdevice.h b/src/gui/opengl/qopenglpaintdevice.h index 804e485..88b481a 100644 --- a/src/gui/opengl/qopenglpaintdevice.h +++ b/src/gui/opengl/qopenglpaintdevice.h @@ -53,12 +53,14 @@ public: QOpenGLPaintDevice(); explicit QOpenGLPaintDevice(const QSize &size); QOpenGLPaintDevice(int width, int height); + QOpenGLPaintDevice(int x, int y, int width, int height); virtual ~QOpenGLPaintDevice(); int devType() const { return QInternal::OpenGL; } QPaintEngine *paintEngine() const; QOpenGLContext *context() const; + QPoint offset() const; QSize size() const; void setSize(const QSize &size); void setDevicePixelRatio(qreal devicePixelRatio); diff --git a/src/gui/opengl/qopenglpaintdevice_p.h b/src/gui/opengl/qopenglpaintdevice_p.h index 54ea092..f660143 100644 --- a/src/gui/opengl/qopenglpaintdevice_p.h +++ b/src/gui/opengl/qopenglpaintdevice_p.h @@ -65,6 +65,7 @@ public: public: QSize size; + QPoint offset; QOpenGLContext *ctx; qreal dpmx; diff --git a/src/gui/opengl/qopenglpaintengine.cpp b/src/gui/opengl/qopenglpaintengine.cpp index 0b92bf4..f41e059 100644 --- a/src/gui/opengl/qopenglpaintengine.cpp +++ b/src/gui/opengl/qopenglpaintengine.cpp @@ -2078,7 +2078,10 @@ bool QOpenGL2PaintEngineEx::begin(QPaintDevice *pdev) for (int i = 0; i < QT_GL_VERTEX_ARRAY_TRACKED_COUNT; ++i) d->vertexAttributeArraysEnabledState[i] = false; + const QPoint offset = d->device->offset(); const QSize sz = d->device->size(); + d->x = offset.x(); + d->y = offset.y(); d->width = sz.width(); d->height = sz.height(); d->mode = BrushDrawingMode; @@ -2165,7 +2168,7 @@ void QOpenGL2PaintEngineEx::ensureActive() d->device->ensureActiveTarget(); d->transferMode(BrushDrawingMode); - d->funcs.glViewport(0, 0, d->width, d->height); + d->funcs.glViewport(d->x, d->y, d->width, d->height); d->needsSync = false; d->shaderManager->setDirty(); d->syncGlState(); @@ -2207,6 +2210,7 @@ void QOpenGL2PaintEngineExPrivate::updateClipScissorTest() if (bounds == QRect(0, 0, width, height)) { funcs.glDisable(GL_SCISSOR_TEST); } else { + bounds = QRect(bounds.x(), bounds.y(), bounds.width(), bounds.height()); funcs.glEnable(GL_SCISSOR_TEST); setScissor(bounds); } @@ -2215,12 +2219,13 @@ void QOpenGL2PaintEngineExPrivate::updateClipScissorTest() void QOpenGL2PaintEngineExPrivate::setScissor(const QRect &rect) { - const int left = rect.left(); + const int left = rect.left() + x; const int width = rect.width(); int bottom = height - (rect.top() + rect.height()); if (device->paintFlipped()) { bottom = rect.top(); } + bottom += y; const int height = rect.height(); funcs.glScissor(left, bottom, width, height); diff --git a/src/gui/opengl/qopenglpaintengine_p.h b/src/gui/opengl/qopenglpaintengine_p.h index f1ec669..6d302b8 100644 --- a/src/gui/opengl/qopenglpaintengine_p.h +++ b/src/gui/opengl/qopenglpaintengine_p.h @@ -264,6 +264,7 @@ public: QOpenGL2PaintEngineEx* q; QOpenGLEngineShaderManager* shaderManager; QOpenGLPaintDevice* device; + int x, y; int width, height; QOpenGLContext *ctx; EngineMode mode; diff --git a/src/gui/opengl/qopengltextureglyphcache.cpp b/src/gui/opengl/qopengltextureglyphcache.cpp index c179143..fad68d5 100644 --- a/src/gui/opengl/qopengltextureglyphcache.cpp +++ b/src/gui/opengl/qopengltextureglyphcache.cpp @@ -310,7 +310,7 @@ void QOpenGLTextureGlyphCache::resizeTextureData(int width, int height) funcs->glBindFramebuffer(GL_FRAMEBUFFER, (GLuint)oldFbo); if (pex != 0) { - funcs->glViewport(0, 0, pex->width, pex->height); + funcs->glViewport(pex->x, pex->y, pex->width, pex->height); pex->updateClipScissorTest(); } else { if (m_vao.isCreated()) {