aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/items/context2d/qquickcontext2dtexture.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/quick/items/context2d/qquickcontext2dtexture.cpp')
-rw-r--r--src/quick/items/context2d/qquickcontext2dtexture.cpp32
1 files changed, 24 insertions, 8 deletions
diff --git a/src/quick/items/context2d/qquickcontext2dtexture.cpp b/src/quick/items/context2d/qquickcontext2dtexture.cpp
index c8bea6f97e..17d4feae6b 100644
--- a/src/quick/items/context2d/qquickcontext2dtexture.cpp
+++ b/src/quick/items/context2d/qquickcontext2dtexture.cpp
@@ -233,7 +233,7 @@ void QQuickContext2DTexture::paintWithoutTiles(QQuickContext2DCommandBuffer *ccb
p.setCompositionMode(QPainter::CompositionMode_SourceOver);
- ccb->replay(&p, m_state);
+ ccb->replay(&p, m_state, scaleFactor());
endPainting();
markDirtyTexture();
}
@@ -277,7 +277,7 @@ void QQuickContext2DTexture::paint(QQuickContext2DCommandBuffer *ccb)
QQuickContext2D::State oldState = m_state;
foreach (QQuickContext2DTile* tile, m_tiles) {
if (tile->dirty()) {
- ccb->replay(tile->createPainter(m_smooth, m_antialiasing), oldState);
+ ccb->replay(tile->createPainter(m_smooth, m_antialiasing), oldState, scaleFactor());
tile->drawFinished();
tile->markDirty(false);
}
@@ -424,7 +424,15 @@ QQuickContext2DFBOTexture::~QQuickContext2DFBOTexture()
delete m_paint_device;
if (QOpenGLContext::currentContext())
- glDeleteTextures(2, m_displayTextures);
+ QOpenGLContext::currentContext()->functions()->glDeleteTextures(2, m_displayTextures);
+}
+
+QVector2D QQuickContext2DFBOTexture::scaleFactor() const
+{
+ if (!m_fbo)
+ return QVector2D(1, 1);
+ return QVector2D(m_fbo->width() / m_fboSize.width(),
+ m_fbo->height() / m_fboSize.height());
}
QSGTexture *QQuickContext2DFBOTexture::textureForNextFrame(QSGTexture *lastTexture)
@@ -508,7 +516,7 @@ void QQuickContext2DFBOTexture::grabImage(const QRectF& rf)
} else {
QImage grabbed;
GLAcquireContext ctx(m_gl, m_surface);
- grabbed = m_fbo->toImage().mirrored().copy(rf.toRect());
+ grabbed = m_fbo->toImage().scaled(m_fboSize, Qt::IgnoreAspectRatio, Qt::SmoothTransformation).mirrored().copy(rf.toRect());
m_context->setGrabbedImage(grabbed);
}
}
@@ -570,7 +578,14 @@ QPaintDevice* QQuickContext2DFBOTexture::beginPainting()
} else {
QOpenGLFramebufferObjectFormat format;
format.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil);
- m_fbo = new QOpenGLFramebufferObject(m_fboSize, format);
+ QSize s = m_fboSize;
+ if (m_antialiasing) { // do supersampling since multisampling is not available
+ GLint max;
+ QOpenGLContext::currentContext()->functions()->glGetIntegerv(GL_MAX_TEXTURE_SIZE, &max);
+ if (s.width() * 2 <= max && s.height() * 2 <= max)
+ s = s * 2;
+ }
+ m_fbo = new QOpenGLFramebufferObject(s, format);
}
}
@@ -611,15 +626,16 @@ void QQuickContext2DFBOTexture::endPainting()
if (m_onCustomThread)
m_mutex.lock();
+ QOpenGLFunctions *funcs = QOpenGLContext::currentContext()->functions();
if (m_displayTextures[0] == 0) {
m_displayTexture = 1;
- glGenTextures(2, m_displayTextures);
+ funcs->glGenTextures(2, m_displayTextures);
}
m_fbo->bind();
GLuint target = m_displayTexture == 0 ? 1 : 0;
- glBindTexture(GL_TEXTURE_2D, m_displayTextures[target]);
- glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, m_fbo->width(), m_fbo->height(), 0);
+ funcs->glBindTexture(GL_TEXTURE_2D, m_displayTextures[target]);
+ funcs->glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, m_fbo->width(), m_fbo->height(), 0);
if (m_onCustomThread)
m_mutex.unlock();