aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick
diff options
context:
space:
mode:
Diffstat (limited to 'src/quick')
-rw-r--r--src/quick/items/context2d/qquickcontext2dcommandbuffer.cpp3
-rw-r--r--src/quick/items/context2d/qquickcontext2dcommandbuffer_p.h3
-rw-r--r--src/quick/items/context2d/qquickcontext2dtexture.cpp23
-rw-r--r--src/quick/items/context2d/qquickcontext2dtexture_p.h5
4 files changed, 28 insertions, 6 deletions
diff --git a/src/quick/items/context2d/qquickcontext2dcommandbuffer.cpp b/src/quick/items/context2d/qquickcontext2dcommandbuffer.cpp
index cb09c9d4ff..7b114ae45e 100644
--- a/src/quick/items/context2d/qquickcontext2dcommandbuffer.cpp
+++ b/src/quick/items/context2d/qquickcontext2dcommandbuffer.cpp
@@ -258,13 +258,14 @@ static void qt_drawImage(QPainter *p, QQuickContext2D::State& state, QImage imag
p->endNativePainting();
}
-void QQuickContext2DCommandBuffer::replay(QPainter* p, QQuickContext2D::State& state)
+void QQuickContext2DCommandBuffer::replay(QPainter* p, QQuickContext2D::State& state, const QVector2D &scaleFactor)
{
if (!p)
return;
reset();
+ p->scale(scaleFactor.x(), scaleFactor.y());
QTransform originMatrix = p->worldTransform();
QPen pen = makePen(state);
diff --git a/src/quick/items/context2d/qquickcontext2dcommandbuffer_p.h b/src/quick/items/context2d/qquickcontext2dcommandbuffer_p.h
index 9e79333a0c..8c7ffb0524 100644
--- a/src/quick/items/context2d/qquickcontext2dcommandbuffer_p.h
+++ b/src/quick/items/context2d/qquickcontext2dcommandbuffer_p.h
@@ -232,7 +232,8 @@ public:
inline QColor takeColor() { return colors[colorIdx++]; }
inline QBrush takeBrush() { return brushes[brushIdx++]; }
- void replay(QPainter* painter, QQuickContext2D::State& state);
+ void replay(QPainter* painter, QQuickContext2D::State& state, const QVector2D &scaleFactor);
+
private:
QPen makePen(const QQuickContext2D::State& state);
void setPainterState(QPainter* painter, const QQuickContext2D::State& state, const QPen& pen);
diff --git a/src/quick/items/context2d/qquickcontext2dtexture.cpp b/src/quick/items/context2d/qquickcontext2dtexture.cpp
index fbfd3df324..7e88e18c65 100644
--- a/src/quick/items/context2d/qquickcontext2dtexture.cpp
+++ b/src/quick/items/context2d/qquickcontext2dtexture.cpp
@@ -227,7 +227,7 @@ void QQuickContext2DTexture::paintWithoutTiles(QQuickContext2DCommandBuffer *ccb
p.setCompositionMode(QPainter::CompositionMode_SourceOver);
- ccb->replay(&p, m_state);
+ ccb->replay(&p, m_state, scaleFactor());
endPainting();
markDirtyTexture();
}
@@ -268,7 +268,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);
}
@@ -418,6 +418,14 @@ QQuickContext2DFBOTexture::~QQuickContext2DFBOTexture()
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)
{
QSGPlainTexture *texture = static_cast<QSGPlainTexture *>(lastTexture);
@@ -500,7 +508,7 @@ void QQuickContext2DFBOTexture::grabImage(const QRectF& rf)
QImage grabbed;
{
GLAcquireContext ctx(m_context->glContext(), m_context->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);
@@ -561,7 +569,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);
}
}
diff --git a/src/quick/items/context2d/qquickcontext2dtexture_p.h b/src/quick/items/context2d/qquickcontext2dtexture_p.h
index 186863c1aa..7c48453857 100644
--- a/src/quick/items/context2d/qquickcontext2dtexture_p.h
+++ b/src/quick/items/context2d/qquickcontext2dtexture_p.h
@@ -124,6 +124,8 @@ public Q_SLOTS:
virtual void grabImage(const QRectF& region = QRectF()) = 0;
protected:
+ virtual QVector2D scaleFactor() const { return QVector2D(1, 1); }
+
void paintWithoutTiles(QQuickContext2DCommandBuffer *ccb);
virtual QPaintDevice* beginPainting() {m_painting = true; return 0; }
virtual void endPainting() {m_painting = false;}
@@ -173,6 +175,9 @@ public:
QSGTexture *textureForNextFrame(QSGTexture *);
+protected:
+ QVector2D scaleFactor() const Q_DECL_OVERRIDE;
+
public Q_SLOTS:
virtual void grabImage(const QRectF& region = QRectF());