diff options
Diffstat (limited to 'src/gui/painting/qpainter.cpp')
-rw-r--r-- | src/gui/painting/qpainter.cpp | 71 |
1 files changed, 62 insertions, 9 deletions
diff --git a/src/gui/painting/qpainter.cpp b/src/gui/painting/qpainter.cpp index b992e8f55d..b70b29e54e 100644 --- a/src/gui/painting/qpainter.cpp +++ b/src/gui/painting/qpainter.cpp @@ -190,6 +190,13 @@ void QPainterPrivate::checkEmulation() if (pg && pg->coordinateMode() > QGradient::LogicalMode) doEmulation = true; + if (state->brush.style() == Qt::TexturePattern) { + if (qHasPixmapTexture(state->brush)) + doEmulation |= !qFuzzyCompare(state->brush.texture().devicePixelRatioF(), 1.0); + else + doEmulation |= !qFuzzyCompare(state->brush.textureImage().devicePixelRatioF(), 1.0); + } + if (doEmulation && extended->flags() & QPaintEngineEx::DoNotEmulate) return; @@ -523,7 +530,10 @@ static inline QBrush stretchGradientToUserSpace(const QBrush &brush, const QRect g.setCoordinateMode(QGradient::LogicalMode); QBrush b(g); - b.setTransform(gradientToUser * b.transform()); + if (brush.gradient()->coordinateMode() == QGradient::ObjectMode) + b.setTransform(b.transform() * gradientToUser); + else + b.setTransform(gradientToUser * b.transform()); return b; } @@ -562,7 +572,7 @@ void QPainterPrivate::drawStretchedGradient(const QPainterPath &path, DrawOperat } else { needsFill = true; - if (brushMode == QGradient::ObjectBoundingMode) { + if (brushMode == QGradient::ObjectBoundingMode || brushMode == QGradient::ObjectMode) { Q_ASSERT(engine->hasFeature(QPaintEngine::PatternTransform)); boundingRect = path.boundingRect(); q->setBrush(stretchGradientToUserSpace(brush, boundingRect)); @@ -606,11 +616,11 @@ void QPainterPrivate::drawStretchedGradient(const QPainterPath &path, DrawOperat changedBrush = true; } - if (penMode == QGradient::ObjectBoundingMode) { + if (penMode == QGradient::ObjectBoundingMode || penMode == QGradient::ObjectMode) { Q_ASSERT(engine->hasFeature(QPaintEngine::PatternTransform)); // avoid computing the bounding rect twice - if (!needsFill || brushMode != QGradient::ObjectBoundingMode) + if (!needsFill || (brushMode != QGradient::ObjectBoundingMode && brushMode != QGradient::ObjectMode)) boundingRect = path.boundingRect(); QPen p = pen; @@ -842,8 +852,8 @@ void QPainterPrivate::updateEmulationSpecifier(QPainterState *s) gradientStretch |= (brushMode == QGradient::StretchToDeviceMode); gradientStretch |= (penMode == QGradient::StretchToDeviceMode); - objectBoundingMode |= (brushMode == QGradient::ObjectBoundingMode); - objectBoundingMode |= (penMode == QGradient::ObjectBoundingMode); + objectBoundingMode |= (brushMode == QGradient::ObjectBoundingMode || brushMode == QGradient::ObjectMode); + objectBoundingMode |= (penMode == QGradient::ObjectBoundingMode || penMode == QGradient::ObjectMode); } if (gradientStretch) s->emulationSpecifier |= QGradient_StretchToDevice; @@ -1287,7 +1297,7 @@ void QPainterPrivate::updateState(QPainterState *newState) itself and its bounding rectangle: The bounding rect contains pixels with alpha == 0 (i.e the pixels surrounding the primitive). These pixels will overwrite the other image's pixels, - affectively clearing those, while the primitive only overwrites + effectively clearing those, while the primitive only overwrites its own area. \table 100% @@ -1377,7 +1387,7 @@ void QPainterPrivate::updateState(QPainterState *newState) clip. \li Composition Modes \c QPainter::CompositionMode_Source and - QPainter::CompositionMode_SourceOver + QPainter::CompositionMode_SourceOver. \li Rounded rectangle filling using solid color and two-color linear gradients fills. @@ -6657,6 +6667,16 @@ QRectF QPainter::boundingRect(const QRectF &r, const QString &text, const QTextO potentially much more efficient depending on the underlying window system. + drawTiledPixmap() will produce the same visual tiling pattern on + high-dpi displays (with devicePixelRatio > 1), compared to normal- + dpi displays. Set the devicePixelRatio on the \a pixmap to control + the tile size. For example, setting it to 2 halves the tile width + and height (on both 1x and 2x displays), and produces high-resolution + output on 2x displays. + + The \a position offset is always in the painter coordinate system, + indepentent of display devicePixelRatio. + \sa drawPixmap() */ void QPainter::drawTiledPixmap(const QRectF &r, const QPixmap &pixmap, const QPointF &sp) @@ -6840,7 +6860,8 @@ static inline bool needsResolving(const QBrush &brush) Qt::BrushStyle s = brush.style(); return ((s == Qt::LinearGradientPattern || s == Qt::RadialGradientPattern || s == Qt::ConicalGradientPattern) && - brush.gradient()->coordinateMode() == QGradient::ObjectBoundingMode); + (brush.gradient()->coordinateMode() == QGradient::ObjectBoundingMode || + brush.gradient()->coordinateMode() == QGradient::ObjectMode)); } /*! @@ -7068,6 +7089,37 @@ void QPainter::fillRect(const QRectF &r, const QColor &color) */ /*! + \fn void QPainter::fillRect(int x, int y, int width, int height, QGradient::Preset preset) + + \overload + + Fills the rectangle beginning at (\a{x}, \a{y}) with the given \a + width and \a height, using the given gradient \a preset. + + \since 5.12 +*/ + +/*! + \fn void QPainter::fillRect(const QRect &rectangle, QGradient::Preset preset); + + \overload + + Fills the given \a rectangle with the specified gradient \a preset. + + \since 5.12 +*/ + +/*! + \fn void QPainter::fillRect(const QRectF &rectangle, QGradient::Preset preset); + + \overload + + Fills the given \a rectangle with the specified gradient \a preset. + + \since 5.12 +*/ + +/*! Sets the given render \a hint on the painter if \a on is true; otherwise clears the render hint. @@ -8207,6 +8259,7 @@ void QPainter::setTransform(const QTransform &transform, bool combine ) } /*! + Alias for worldTransform(). Returns the world transformation matrix. \sa worldTransform() |