diff options
author | Jani Hautakangas <jani.hautakangas@lge.com> | 2013-12-12 21:48:35 +0200 |
---|---|---|
committer | Dominik Holland <dominik.holland@qt.io> | 2020-07-07 11:50:09 +0200 |
commit | d9cc1499954829faf9486fb72056e29f1bad58e3 (patch) | |
tree | 9586c5074380ce100ba447cf1bdfe9d796b8930e /tests/auto/gui/qopengl | |
parent | 7e2fded55e67727043c3dd0a1a5b3883655101c4 (diff) |
Fix floating point clip rectangle rounding in raster and opengl paint engine
Fixes: QTBUG-83229
Pick-to: 5.15
Change-Id: If94028f27c9085e391acb9c423cde1b7c12bca36
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
Diffstat (limited to 'tests/auto/gui/qopengl')
-rw-r--r-- | tests/auto/gui/qopengl/tst_qopengl.cpp | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/tests/auto/gui/qopengl/tst_qopengl.cpp b/tests/auto/gui/qopengl/tst_qopengl.cpp index b43defd2f3..caba2a1409 100644 --- a/tests/auto/gui/qopengl/tst_qopengl.cpp +++ b/tests/auto/gui/qopengl/tst_qopengl.cpp @@ -93,6 +93,7 @@ private slots: void defaultSurfaceFormat(); void imageFormatPainting(); void nullTextureInitializtion(); + void clipRect(); #ifdef USE_GLX void glxContextWrap(); @@ -1686,6 +1687,74 @@ void tst_QOpenGL::nullTextureInitializtion() QVERIFY(!t.isCreated()); } +/* + Verify that the clipping works correctly. + The red outline should be covered by the blue rect on top and left, + while it should be clipped on the right and bottom and thus the red outline be visible + + See: QTBUG-83229 +*/ +void tst_QOpenGL::clipRect() +{ +#if defined(Q_OS_LINUX) && defined(Q_CC_GNU) && !defined(__x86_64__) + QSKIP("QTBUG-22617"); +#endif + + QScopedPointer<QSurface> surface(createSurface(int(QSurface::Window))); + + QOpenGLContext ctx; + QVERIFY(ctx.create()); + + QVERIFY(ctx.makeCurrent(surface.data())); + + if (!QOpenGLFramebufferObject::hasOpenGLFramebufferObjects()) + QSKIP("QOpenGLFramebufferObject not supported on this platform"); + + // No multisample with combined depth/stencil attachment: + QOpenGLFramebufferObjectFormat fboFormat; + fboFormat.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil); + + // Uncomplicate things by using POT: + const QSize size(654, 480); + const QRect rect(QPoint(0, 0), size); + QOpenGLFramebufferObject fbo(size, fboFormat); + + if (fbo.attachment() != QOpenGLFramebufferObject::CombinedDepthStencil) + QSKIP("FBOs missing combined depth~stencil support"); + + QVERIFY(fbo.bind()); + + QPainter fboPainter; + QOpenGLPaintDevice device(fbo.width(), fbo.height()); + bool painterBegun = fboPainter.begin(&device); + QVERIFY(painterBegun); + + qreal halfWidth = size.width() / 2.0; + qreal halfHeight = size.height() / 2.0; + + QRectF clipRect = QRectF(halfWidth - halfWidth / 2.0, halfHeight - halfHeight / 2.0, + halfWidth / 2.0, halfHeight / 2.0); + + fboPainter.fillRect(rect, Qt::white); + fboPainter.setPen(Qt::red); + fboPainter.drawRect(clipRect); + + fboPainter.setClipRect(clipRect, Qt::ReplaceClip); + fboPainter.fillRect(rect, Qt::blue); + + fboPainter.end(); + + const QImage fb = fbo.toImage().convertToFormat(QImage::Format_RGB32); + QCOMPARE(fb.size(), size); + + QCOMPARE(fb.pixelColor(clipRect.left() + 1, clipRect.top()), QColor(Qt::blue)); + QCOMPARE(fb.pixelColor(clipRect.left(), clipRect.top() + 1), QColor(Qt::blue)); + QCOMPARE(fb.pixelColor(clipRect.left() + 1, clipRect.bottom()), QColor(Qt::red)); + + // Enable this once QTBUG-85286 is fixed + //QCOMPARE(fb.pixelColor(clipRect.right(), clipRect.top() + 1), QColor(Qt::red)); +} + QTEST_MAIN(tst_QOpenGL) #include "tst_qopengl.moc" |