diff options
Diffstat (limited to 'src/quick/items/context2d/qquickcontext2dtexture.cpp')
-rw-r--r-- | src/quick/items/context2d/qquickcontext2dtexture.cpp | 32 |
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(); |