From f207997b59f1381cf3523521209cb435b1a73f25 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 75f09d6..17d7155 100644 --- a/src/gui/opengl/qopenglpaintdevice.cpp +++ b/src/gui/opengl/qopenglpaintdevice.cpp @@ -141,6 +141,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 */ @@ -222,6 +228,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 dffa68c..66a1e3d 100644 --- a/src/gui/opengl/qopenglpaintdevice.h +++ b/src/gui/opengl/qopenglpaintdevice.h @@ -59,12 +59,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 78e6b7a..6630461 100644 --- a/src/gui/opengl/qopenglpaintdevice_p.h +++ b/src/gui/opengl/qopenglpaintdevice_p.h @@ -71,6 +71,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 d93871c..be2bee9 100644 --- a/src/gui/opengl/qopenglpaintengine.cpp +++ b/src/gui/opengl/qopenglpaintengine.cpp @@ -2084,7 +2084,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; @@ -2171,7 +2174,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(); @@ -2213,6 +2216,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); } @@ -2221,12 +2225,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 c9f3282..7c0616b 100644 --- a/src/gui/opengl/qopenglpaintengine_p.h +++ b/src/gui/opengl/qopenglpaintengine_p.h @@ -270,6 +270,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 9a7b1eb..6f301f8 100644 --- a/src/gui/opengl/qopengltextureglyphcache.cpp +++ b/src/gui/opengl/qopengltextureglyphcache.cpp @@ -403,7 +403,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()) {