Fix UI squishing when using QWidget::setRenderToTexture

When resizing a window, a window might not be resized synchronously with
its backing store. We need to use the actual texture size as the transform
to avoid stretching the rendered texture.

Change-Id: I945f6d190577ccdcb54483a267a1e42df1ca3156
Reviewed-by: Paul Olav Tvete <paul.tvete@digia.com>
Reviewed-by: Laszlo Agocs <laszlo.agocs@digia.com>
bb10
Jocelyn Turcotte 2014-03-28 15:40:28 +01:00 committed by The Qt Project
parent afacf694d5
commit 4bbf313e9d
2 changed files with 7 additions and 5 deletions

View File

@ -247,14 +247,14 @@ void QPlatformBackingStore::composeAndFlush(QWindow *window, const QRegion &regi
d_ptr->blitter->blit(textureId, target, QOpenGLTextureBlitter::OriginBottomLeft);
}
GLuint textureId = toTexture(deviceRegion(region, window));
GLuint textureId = toTexture(deviceRegion(region, window), &d_ptr->textureSize);
if (!textureId)
return;
funcs->glEnable(GL_BLEND);
funcs->glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
QMatrix4x4 target = QOpenGLTextureBlitter::targetTransform(windowRect, windowRect);
QMatrix4x4 target = QOpenGLTextureBlitter::targetTransform(QRect(QPoint(), d_ptr->textureSize), windowRect);
d_ptr->blitter->setSwizzleRB(true);
d_ptr->blitter->blit(textureId, target, QOpenGLTextureBlitter::OriginTopLeft);
d_ptr->blitter->setSwizzleRB(false);
@ -282,6 +282,7 @@ QImage QPlatformBackingStore::toImage() const
backingstore as an OpenGL texture. \a dirtyRegion is the part of the
backingstore which may have changed since the last call to this function. The
caller of this function must ensure that there is a current context.
The size of the texture is returned in \a textureSize.
The ownership of the texture is not transferred. The caller must not store
the return value between calls, but instead call this function before each use.
@ -291,7 +292,7 @@ QImage QPlatformBackingStore::toImage() const
content using toImage() and performs a texture upload.
*/
GLuint QPlatformBackingStore::toTexture(const QRegion &dirtyRegion) const
GLuint QPlatformBackingStore::toTexture(const QRegion &dirtyRegion, QSize *textureSize) const
{
QImage image = toImage();
QSize imageSize = image.size();
@ -325,7 +326,8 @@ GLuint QPlatformBackingStore::toTexture(const QRegion &dirtyRegion) const
funcs->glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imageSize.width(), imageSize.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE,
const_cast<uchar*>(image.constBits()));
d_ptr->textureSize = imageSize;
if (textureSize)
*textureSize = imageSize;
} else {
funcs->glBindTexture(GL_TEXTURE_2D, d_ptr->textureId);
QRect imageRect = image.rect();

View File

@ -111,7 +111,7 @@ public:
#ifndef QT_NO_OPENGL
virtual void composeAndFlush(QWindow *window, const QRegion &region, const QPoint &offset, QPlatformTextureList *textures, QOpenGLContext *context);
virtual QImage toImage() const;
virtual GLuint toTexture(const QRegion &dirtyRegion) const;
virtual GLuint toTexture(const QRegion &dirtyRegion, QSize *textureSize) const;
#endif
virtual void resize(const QSize &size, const QRegion &staticContents) = 0;