{
}
-void QQuickCanvasContext::prepare(const QSize& canvasSize, const QSize& tileSize, const QRect& canvasWindow, const QRect& dirtyRect, bool smooth)
+void QQuickCanvasContext::prepare(const QSize& canvasSize, const QSize& tileSize, const QRect& canvasWindow, const QRect& dirtyRect, bool smooth, bool antialiasing)
{
Q_UNUSED(canvasSize);
Q_UNUSED(tileSize);
Q_UNUSED(canvasWindow);
Q_UNUSED(dirtyRect);
Q_UNUSED(smooth);
+ Q_UNUSED(antialiasing);
}
void QQuickCanvasContext::flush()
// Init (ignore options if necessary)
virtual void init(QQuickCanvasItem *canvasItem, const QVariantMap &args) = 0;
- virtual void prepare(const QSize& canvasSize, const QSize& tileSize, const QRect& canvasWindow, const QRect& dirtyRect, bool smooth);
+ virtual void prepare(const QSize& canvasSize, const QSize& tileSize, const QRect& canvasWindow, const QRect& dirtyRect, bool smooth, bool antialiasing);
virtual void flush();
virtual void setV8Engine(QV8Engine *engine) = 0;
Q_D(QQuickCanvasItem);
if (d->contextInitialized)
- d->context->prepare(d->canvasSize.toSize(), d->tileSize, d->canvasWindow.toRect(), d->dirtyRect.toRect(), d->smooth);
+ d->context->prepare(d->canvasSize.toSize(), d->tileSize, d->canvasWindow.toRect(), d->dirtyRect.toRect(), d->smooth, d->antialiasing);
if (d->animationCallbacks.size() > 0 && isVisible()) {
QMap<int, v8::Persistent<v8::Function> > animationCallbacks = d->animationCallbacks;
if (!node)
node = new QSGSimpleTextureNode;
+ if (d->smooth)
+ node->setFiltering(QSGTexture::Linear);
+ else
+ node->setFiltering(QSGTexture::Nearest);
+
if (d->renderStrategy == QQuickCanvasItem::Cooperative)
d->context->flush();
m_texture->setTileSize(canvasItem->tileSize());
m_texture->setCanvasSize(canvasItem->canvasSize().toSize());
m_texture->setSmooth(canvasItem->smooth());
-
+ m_texture->setAntialiasing(canvasItem->antialiasing());
m_thread = QThread::currentThread();
QThread *renderThread = m_thread;
reset();
}
-void QQuickContext2D::prepare(const QSize& canvasSize, const QSize& tileSize, const QRect& canvasWindow, const QRect& dirtyRect, bool smooth)
+void QQuickContext2D::prepare(const QSize& canvasSize, const QSize& tileSize, const QRect& canvasWindow, const QRect& dirtyRect, bool smooth, bool antialiasing)
{
- QMetaObject::invokeMethod(m_texture,
- "canvasChanged",
- Qt::AutoConnection,
- Q_ARG(QSize, canvasSize),
- Q_ARG(QSize, tileSize),
- Q_ARG(QRect, canvasWindow),
- Q_ARG(QRect, dirtyRect),
- Q_ARG(bool, smooth));
+ QMetaObject::invokeMethod(m_texture
+ , "canvasChanged"
+ , Qt::AutoConnection
+ , Q_ARG(QSize, canvasSize)
+ , Q_ARG(QSize, tileSize)
+ , Q_ARG(QRect, canvasWindow)
+ , Q_ARG(QRect, dirtyRect)
+ , Q_ARG(bool, smooth)
+ , Q_ARG(bool, antialiasing));
}
void QQuickContext2D::flush()
QStringList contextNames() const;
void init(QQuickCanvasItem *canvasItem, const QVariantMap &args);
- void prepare(const QSize& canvasSize, const QSize& tileSize, const QRect& canvasWindow, const QRect& dirtyRect, bool smooth);
+ void prepare(const QSize& canvasSize, const QSize& tileSize, const QRect& canvasWindow, const QRect& dirtyRect, bool smooth, bool antialiasing);
void flush();
void sync();
QThread *thread() const {return m_thread;}
, m_dirtyCanvas(false)
, m_canvasWindowChanged(false)
, m_dirtyTexture(false)
- , m_smooth(false)
+ , m_smooth(true)
+ , m_antialiasing(false)
, m_tiledCanvas(false)
, m_painting(false)
{
m_smooth = smooth;
}
+void QQuickContext2DTexture::setAntialiasing(bool antialiasing)
+{
+ m_antialiasing = antialiasing;
+}
+
void QQuickContext2DTexture::setItem(QQuickCanvasItem* item)
{
m_item = item;
return doDirty;
}
-void QQuickContext2DTexture::canvasChanged(const QSize& canvasSize, const QSize& tileSize, const QRect& canvasWindow, const QRect& dirtyRect, bool smooth)
+void QQuickContext2DTexture::canvasChanged(const QSize& canvasSize, const QSize& tileSize, const QRect& canvasWindow, const QRect& dirtyRect, bool smooth, bool antialiasing)
{
QSize ts = tileSize;
if (ts.width() > canvasSize.width())
setDirtyRect(dirtyRect);
setSmooth(smooth);
+ setAntialiasing(antialiasing);
}
void QQuickContext2DTexture::paintWithoutTiles(QQuickContext2DCommandBuffer *ccb)
QPainter p;
p.begin(device);
+ if (m_antialiasing)
+ p.setRenderHints(QPainter::Antialiasing | QPainter::HighQualityAntialiasing | QPainter::TextAntialiasing, true);
+ else
+ p.setRenderHints(QPainter::Antialiasing | QPainter::HighQualityAntialiasing | QPainter::TextAntialiasing, false);
+
if (m_smooth)
- p.setRenderHints(QPainter::Antialiasing | QPainter::HighQualityAntialiasing
- | QPainter::TextAntialiasing | QPainter::SmoothPixmapTransform);
+ p.setRenderHint(QPainter::SmoothPixmapTransform, true);
else
- p.setRenderHints(QPainter::Antialiasing | QPainter::HighQualityAntialiasing
- | QPainter::TextAntialiasing | QPainter::SmoothPixmapTransform, false);
+ p.setRenderHint(QPainter::SmoothPixmapTransform, false);
+
p.setCompositionMode(QPainter::CompositionMode_SourceOver);
ccb->replay(&p, m_state);
QQuickContext2D::State oldState = m_state;
foreach (QQuickContext2DTile* tile, m_tiles) {
if (tile->dirty()) {
- ccb->replay(tile->createPainter(m_smooth), oldState);
+ ccb->replay(tile->createPainter(m_smooth, m_antialiasing), oldState);
tile->drawFinished();
tile->markDirty(false);
}
extensionsChecked = true;
}
- return multisamplingSupported && m_smooth;
+ return multisamplingSupported && m_antialiasing;
}
void QQuickContext2DFBOTexture::grabImage(const QRectF& rf)
bool setTileSize(const QSize &size);
bool setCanvasWindow(const QRect& canvasWindow);
void setSmooth(bool smooth);
+ void setAntialiasing(bool antialiasing);
bool setDirtyRect(const QRect &dirtyRect);
bool canvasDestroyed();
public Q_SLOTS:
void markDirtyTexture();
void setItem(QQuickCanvasItem* item);
- void canvasChanged(const QSize& canvasSize, const QSize& tileSize, const QRect& canvasWindow, const QRect& dirtyRect, bool smooth);
+ void canvasChanged(const QSize& canvasSize, const QSize& tileSize, const QRect& canvasWindow, const QRect& dirtyRect, bool smooth, bool antialiasing);
void paint(QQuickContext2DCommandBuffer *ccb);
virtual void grabImage(const QRectF& region = QRectF()) = 0;
uint m_canvasWindowChanged : 1;
uint m_dirtyTexture : 1;
uint m_smooth : 1;
+ uint m_antialiasing : 1;
uint m_tiledCanvas : 1;
uint m_painting : 1;
};
m_painter.end();
}
-QPainter* QQuickContext2DTile::createPainter(bool smooth)
+QPainter* QQuickContext2DTile::createPainter(bool smooth, bool antialiasing)
{
if (m_painter.isActive())
m_painter.end();
v = 150;
m_painter.fillRect(QRect(0, 0, m_rect.width(), m_rect.height()), QColor(v, v, v, 255));
#endif
+
+ if (antialiasing)
+ m_painter.setRenderHints(QPainter::Antialiasing | QPainter::HighQualityAntialiasing | QPainter::TextAntialiasing, true);
+ else
+ m_painter.setRenderHints(QPainter::Antialiasing | QPainter::HighQualityAntialiasing | QPainter::TextAntialiasing, false);
+
if (smooth)
- m_painter.setRenderHints(QPainter::Antialiasing | QPainter::HighQualityAntialiasing
- | QPainter::TextAntialiasing | QPainter::SmoothPixmapTransform);
+ m_painter.setRenderHint(QPainter::SmoothPixmapTransform, true);
else
- m_painter.setRenderHints(QPainter::Antialiasing | QPainter::HighQualityAntialiasing
- | QPainter::TextAntialiasing | QPainter::SmoothPixmapTransform, false);
+ m_painter.setRenderHint(QPainter::SmoothPixmapTransform, false);
m_painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
m_painter.translate(-m_rect.left(), -m_rect.top());
QRect rect() const {return m_rect;}
virtual void setRect(const QRect& r) = 0;
- virtual QPainter* createPainter(bool smooth = false);
+ virtual QPainter* createPainter(bool smooth, bool antialiasing);
virtual void drawFinished() {}
protected:
Canvas {
id:c
width:100;height:100
- smooth:false //this line is needed for some tests (smooth painting can change the colors and alpha channel values)
onPaint :{} //this line is needed for some tests (make sure onPaint handler always called
property alias paintCount:spyPaint.count
property alias paintedCount:spyPainted.count