X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fgui%2Fpainting%2Fqpainter.cpp;h=090faf15aa902679653f629aaf23b58c858f4c14;hb=b213d5bfa3a8ed81077cd8eaf229764ff2f1b346;hp=75e7f8e79aca8e835ecdc6b0484e2cd8178f60d1;hpb=d1b3cc0d0c426c48f4c5d2c0076764e34dec2ebd;p=profile%2Fivi%2Fqtbase.git diff --git a/src/gui/painting/qpainter.cpp b/src/gui/painting/qpainter.cpp index 75e7f8e..090faf1 100644 --- a/src/gui/painting/qpainter.cpp +++ b/src/gui/painting/qpainter.cpp @@ -1,38 +1,38 @@ /**************************************************************************** ** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal ** ** This file is part of the QtGui module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** ** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ @@ -61,6 +61,8 @@ #include "qstatictext.h" #include "qglyphrun.h" +#include + #include #include #include @@ -90,7 +92,7 @@ void qt_format_text(const QFont &font, const QRectF &_r, int tf, const QTextOption *option, const QString& str, QRectF *brect, int tabstops, int* tabarray, int tabarraylen, QPainter *painter); -static void drawTextItemDecoration(QPainter *painter, const QPointF &pos, const QFontEngine *fe, +static void drawTextItemDecoration(QPainter *painter, const QPointF &pos, const QFontEngine *fe, QTextEngine *textEngine, QTextCharFormat::UnderlineStyle underlineStyle, QTextItem::RenderFlags flags, qreal width, const QTextCharFormat &charFormat); @@ -157,15 +159,9 @@ static bool qt_painter_thread_test(int devType, const char *what, bool extraCond case QInternal::Printer: case QInternal::Picture: // can be drawn onto these devices safely from any thread -#ifndef Q_WS_WIN if (extraCondition) -#endif break; default: -#ifdef Q_WS_X11 - if (QApplication::testAttribute(Qt::AA_X11InitThreads)) - return true; -#endif if (!extraCondition && QThread::currentThread() != qApp->thread()) { qWarning("QPainter: It is not safe to use %s outside the GUI thread", what); return false; @@ -901,26 +897,8 @@ void QPainterPrivate::updateState(QPainterState *newState) if (!newState) { engine->state = newState; - } else if (newState->state() || engine->state!=newState) { - bool setNonCosmeticPen = (newState->renderHints & QPainter::NonCosmeticDefaultPen) - && newState->pen.widthF() == 0; - if (setNonCosmeticPen) { - // Override the default pen's cosmetic state if the - // NonCosmeticDefaultPen render hint is used. - QPen oldPen = newState->pen; - newState->pen.setWidth(1); - newState->pen.setCosmetic(false); - newState->dirtyFlags |= QPaintEngine::DirtyPen; - - updateStateImpl(newState); - - // Restore the state pen back to its default to preserve visible - // state. - newState->pen = oldPen; - } else { - updateStateImpl(newState); - } + updateStateImpl(newState); } } @@ -930,6 +908,7 @@ void QPainterPrivate::updateState(QPainterState *newState) \brief The QPainter class performs low-level painting on widgets and other paint devices. + \inmodule QtGui \ingroup painting \reentrant @@ -947,7 +926,7 @@ void QPainterPrivate::updateState(QPainterState *newState) painter. Then draw. Remember to destroy the QPainter object after drawing. For example: - \snippet doc/src/snippets/code/src_gui_painting_qpainter.cpp 0 + \snippet code/src_gui_painting_qpainter.cpp 0 The core functionality of QPainter is drawing, but the class also provide several functions that allows you to customize QPainter's @@ -976,10 +955,7 @@ void QPainterPrivate::updateState(QPainterState *newState) \warning When the paintdevice is a widget, QPainter can only be used inside a paintEvent() function or in a function called by - paintEvent(); that is unless the Qt::WA_PaintOutsidePaintEvent - widget attribute is set. On Mac OS X and Windows, you can only - paint in a paintEvent() function regardless of this attribute's - setting. + paintEvent(). \tableofcontents @@ -990,41 +966,41 @@ void QPainterPrivate::updateState(QPainterState *newState) \list - \o font() is the font used for drawing text. If the painter + \li font() is the font used for drawing text. If the painter isActive(), you can retrieve information about the currently set font, and its metrics, using the fontInfo() and fontMetrics() functions respectively. - \o brush() defines the color or pattern that is used for filling + \li brush() defines the color or pattern that is used for filling shapes. - \o pen() defines the color or stipple that is used for drawing + \li pen() defines the color or stipple that is used for drawing lines or boundaries. - \o backgroundMode() defines whether there is a background() or + \li backgroundMode() defines whether there is a background() or not, i.e it is either Qt::OpaqueMode or Qt::TransparentMode. - \o background() only applies when backgroundMode() is \l + \li background() only applies when backgroundMode() is \l Qt::OpaqueMode and pen() is a stipple. In that case, it describes the color of the background pixels in the stipple. - \o brushOrigin() defines the origin of the tiled brushes, normally + \li brushOrigin() defines the origin of the tiled brushes, normally the origin of widget's background. - \o viewport(), window(), worldTransform() make up the painter's coordinate + \li viewport(), window(), worldTransform() make up the painter's coordinate transformation system. For more information, see the \l {Coordinate Transformations} section and the \l {Coordinate System} documentation. - \o hasClipping() tells whether the painter clips at all. (The paint + \li hasClipping() tells whether the painter clips at all. (The paint device clips, too.) If the painter clips, it clips to clipRegion(). - \o layoutDirection() defines the layout direction used by the + \li layoutDirection() defines the layout direction used by the painter when drawing text. - \o worldMatrixEnabled() tells whether world transformation is enabled. + \li worldMatrixEnabled() tells whether world transformation is enabled. - \o viewTransformEnabled() tells whether view transformation is + \li viewTransformEnabled() tells whether view transformation is enabled. \endlist @@ -1058,9 +1034,9 @@ void QPainterPrivate::updateState(QPainterState *newState) \table 100% \row - \o \inlineimage qpainter-basicdrawing.png - \o - \bold {Basic Drawing Example} + \li \inlineimage qpainter-basicdrawing.png + \li + \b {Basic Drawing Example} The \l {painting/basicdrawing}{Basic Drawing} example shows how to display basic graphics primitives in a variety of styles using the @@ -1074,8 +1050,8 @@ void QPainterPrivate::updateState(QPainterState *newState) \table 100% \row - \o - \bold {Painter Paths example} + \li + \b {Painter Paths example} The QPainterPath class provides a container for painting operations, enabling graphical shapes to be constructed and @@ -1084,7 +1060,7 @@ void QPainterPrivate::updateState(QPainterState *newState) The \l {painting/painterpaths}{Painter Paths} example shows how painter paths can be used to build complex shapes for rendering. - \o \inlineimage qpainter-painterpaths.png + \li \inlineimage qpainter-painterpaths.png \endtable QPainter also provides the fillPath() function which fills the @@ -1102,13 +1078,13 @@ void QPainterPrivate::updateState(QPainterState *newState) \table \header - \o \l {painting/deform}{Vector Deformation} - \o \l {painting/gradients}{Gradients} - \o \l {painting/pathstroke}{Path Stroking} + \li \l {painting/deform}{Vector Deformation} + \li \l {painting/gradients}{Gradients} + \li \l {painting/pathstroke}{Path Stroking} \row - \o \inlineimage qpainter-vectordeformation.png - \o \inlineimage qpainter-gradients.png - \o \inlineimage qpainter-pathstroking.png + \li \inlineimage qpainter-vectordeformation.png + \li \inlineimage qpainter-gradients.png + \li \inlineimage qpainter-pathstroking.png \endtable @@ -1142,9 +1118,9 @@ void QPainterPrivate::updateState(QPainterState *newState) \table 100% \row - \o \inlineimage qpainter-concentriccircles.png - \o - \bold {Concentric Circles Example} + \li \inlineimage qpainter-concentriccircles.png + \li + \b {Concentric Circles Example} The \l {painting/concentriccircles}{Concentric Circles} example shows the improved rendering quality that can be obtained using @@ -1182,12 +1158,12 @@ void QPainterPrivate::updateState(QPainterState *newState) \table \header - \o nop \o rotate() \o scale() \o translate() + \li nop \li rotate() \li scale() \li translate() \row - \o \inlineimage qpainter-clock.png - \o \inlineimage qpainter-rotation.png - \o \inlineimage qpainter-scale.png - \o \inlineimage qpainter-translation.png + \li \inlineimage qpainter-clock.png + \li \inlineimage qpainter-rotation.png + \li \inlineimage qpainter-scale.png + \li \inlineimage qpainter-translation.png \endtable The most commonly used transformations are scaling, rotation, @@ -1206,15 +1182,15 @@ void QPainterPrivate::updateState(QPainterState *newState) \table 100% \row - \o - \bold {Affine Transformations Example} + \li + \b {Affine Transformations Example} The \l {painting/affine}{Affine Transformations} example shows Qt's ability to perform affine transformations on painting operations. The demo also allows the user to experiment with the transformation operations and see the results immediately. - \o \inlineimage qpainter-affinetransformations.png + \li \inlineimage qpainter-affinetransformations.png \endtable All the tranformation operations operate on the transformation @@ -1288,10 +1264,10 @@ void QPainterPrivate::updateState(QPainterState *newState) \table 100% \row - \o \inlineimage qpainter-compositiondemo.png + \li \inlineimage qpainter-compositiondemo.png - \o - \bold {Composition Modes Example} + \li + \b {Composition Modes Example} The \l {painting/composition}{Composition Modes} example, available in Qt's examples directory, allows you to experiment with the various @@ -1339,22 +1315,22 @@ void QPainterPrivate::updateState(QPainterState *newState) \list - \o Raster - This backend implements all rendering in pure software + \li Raster - This backend implements all rendering in pure software and is always used to render into QImages. For optimal performance only use the format types QImage::Format_ARGB32_Premultiplied, QImage::Format_RGB32 or QImage::Format_RGB16. Any other format, including QImage::Format_ARGB32, has significantly worse performance. This engine is used by default for QWidget and QPixmap. - \o OpenGL 2.0 (ES) - This backend is the primary backend for + \li OpenGL 2.0 (ES) - This backend is the primary backend for hardware accelerated graphics. It can be run on desktop machines and embedded devices supporting the OpenGL 2.0 or OpenGL/ES 2.0 specification. This includes most graphics chips produced in the last couple of years. The engine can be enabled by using QPainter - onto a QGLWidget or by passing \c {-graphicssystem opengl} on the + onto a QOpenGLWidget or by passing \c {-graphicssystem opengl} on the command line when the underlying system supports it. - \o OpenVG - This backend implements the Khronos standard for 2D + \li OpenVG - This backend implements the Khronos standard for 2D and Vector Graphics. It is primarily for embedded devices with hardware support for OpenVG. The engine can be enabled by passing \c {-graphicssystem openvg} on the command line when @@ -1366,26 +1342,26 @@ void QPainterPrivate::updateState(QPainterState *newState) \list - \o Simple transformations, meaning translation and scaling, pluss + \li Simple transformations, meaning translation and scaling, pluss 0, 90, 180, 270 degree rotations. - \o \c drawPixmap() in combination with simple transformations and + \li \c drawPixmap() in combination with simple transformations and opacity with non-smooth transformation mode (\c QPainter::SmoothPixmapTransform not enabled as a render hint). - \o Rectangle fills with solid color, two-color linear gradients + \li Rectangle fills with solid color, two-color linear gradients and simple transforms. - \o Rectangular clipping with simple transformations and intersect + \li Rectangular clipping with simple transformations and intersect clip. - \o Composition Modes \c QPainter::CompositionMode_Source and + \li Composition Modes \c QPainter::CompositionMode_Source and QPainter::CompositionMode_SourceOver - \o Rounded rectangle filling using solid color and two-color + \li Rounded rectangle filling using solid color and two-color linear gradients fills. - \o 3x3 patched pixmaps, via qDrawBorderPixmap. + \li 3x3 patched pixmaps, via qDrawBorderPixmap. \endlist @@ -1423,9 +1399,13 @@ void QPainterPrivate::updateState(QPainterState *newState) indicating that the engine should use fragment programs and offscreen rendering for antialiasing. - \value NonCosmeticDefaultPen The engine should interpret pens with a width - of 0 (which otherwise enables QPen::isCosmetic()) as being a non-cosmetic - pen with a width of 1. + \value NonCosmeticDefaultPen This value is obsolete, the default for QPen + is now non-cosmetic. + + \value Qt4CompatiblePainting Compatibility hint telling the engine to use the + same X11 based fill rules as in Qt 4, where aliased rendering is offset + by slightly less than half a pixel. Also will treat default constructed pens + as cosmetic. Potentially useful when porting a Qt 4 application to Qt 5. \sa renderHints(), setRenderHint(), {QPainter#Rendering Quality}{Rendering Quality}, {Concentric Circles Example} @@ -1455,10 +1435,10 @@ QPainter::QPainter() automatically calls end(). Here's an example using begin() and end(): - \snippet doc/src/snippets/code/src_gui_painting_qpainter.cpp 1 + \snippet code/src_gui_painting_qpainter.cpp 1 The same example using this constructor: - \snippet doc/src/snippets/code/src_gui_painting_qpainter.cpp 2 + \snippet code/src_gui_painting_qpainter.cpp 2 Since the constructor cannot provide feedback when the initialization of the painter failed you should rather use begin() and end() to paint @@ -1532,7 +1512,7 @@ bool QPainter::isActive() const /*! Initializes the painters pen, background and font to the same as - the given \a paint device. + the given \a device. \obsolete @@ -1547,7 +1527,7 @@ void QPainter::initFrom(const QPaintDevice *device) return; } - device->init(this); + device->initPainter(this); if (d->extended) { d->extended->penChanged(); @@ -1676,7 +1656,7 @@ void QPainter::restore() The errors that can occur are serious problems, such as these: - \snippet doc/src/snippets/code/src_gui_painting_qpainter.cpp 3 + \snippet code/src_gui_painting_qpainter.cpp 3 Note that most of the time, you can use one of the constructors instead of begin(), and that end() is automatically done at @@ -1766,25 +1746,6 @@ bool QPainter::begin(QPaintDevice *pd) d->engine->state = d->state; switch (pd->devType()) { -#if 0 - // is this needed any more?? - case QInternal::Widget: - { - const QWidget *widget = static_cast(pd); - Q_ASSERT(widget); - - const bool paintOutsidePaintEvent = widget->testAttribute(Qt::WA_PaintOutsidePaintEvent); - const bool inPaintEvent = widget->testAttribute(Qt::WA_WState_InPaintEvent); - - // Adjust offset for alien widgets painting outside the paint event. - if (!inPaintEvent && paintOutsidePaintEvent && !widget->internalWinId() - && widget->testAttribute(Qt::WA_WState_Created)) { - const QPoint offset = widget->mapTo(widget->nativeParentWidget(), QPoint()); - d->state->redirectionMatrix.translate(offset.x(), offset.y()); - } - break; - } -#endif case QInternal::Pixmap: { QPixmap *pm = static_cast(pd); @@ -1969,14 +1930,14 @@ QPaintEngine *QPainter::paintEngine() const 2 engine: \list - \i blending is disabled - \i the depth, stencil and scissor tests are disabled - \i the active texture unit is reset to 0 - \i the depth mask, depth function and the clear depth are reset to their + \li blending is disabled + \li the depth, stencil and scissor tests are disabled + \li the active texture unit is reset to 0 + \li the depth mask, depth function and the clear depth are reset to their default values - \i the stencil mask, stencil operation and stencil function are reset to + \li the stencil mask, stencil operation and stencil function are reset to their default values - \i the current color is reset to solid white + \li the current color is reset to solid white \endlist If, for example, the OpenGL polygon mode is changed by the user inside a @@ -1984,7 +1945,7 @@ QPaintEngine *QPainter::paintEngine() const default state by endNativePainting(). Here is an example that shows intermixing of painter commands and raw OpenGL commands: - \snippet doc/src/snippets/code/src_gui_painting_qpainter.cpp 21 + \snippet code/src_gui_painting_qpainter.cpp 21 \sa endNativePainting() */ @@ -2207,7 +2168,7 @@ void QPainter::setBrushOrigin(const QPointF &p) source defines the translucency of the pixel. When the paint device is a QImage, the image format must be set to - \l {QImage::Format}{Format_ARGB32Premultiplied} or + \l {QImage::Format}{Format_ARGB32_Premultiplied} or \l {QImage::Format}{Format_ARGB32} for the composition modes to have any effect. For performance the premultiplied version is the preferred format. @@ -2345,6 +2306,23 @@ void QPainter::setBrushOrigin(const QPointF &p) where the source is AND'ed with the inverted destination pixels (src AND (NOT dst)). + \value RasterOp_NotSourceOrDestination Does a bitwise operation + where the source is inverted and then OR'ed with the destination + ((NOT src) OR dst). + + \value RasterOp_ClearDestination The pixels in the destination are + cleared (set to 0) independent of the source. + + \value RasterOp_SetDestination The pixels in the destination are + set (set to 1) independent of the source. + + \value RasterOp_NotDestination Does a bitwise operation + where the destination pixels are inverted (NOT dst). + + \value RasterOp_SourceOrNotDestination Does a bitwise operation + where the source is OR'ed with the inverted destination pixels + (src OR (NOT dst)). + \sa compositionMode(), setCompositionMode(), {QPainter#Composition Modes}{Composition Modes}, {Image Composition Example} */ @@ -2891,15 +2869,15 @@ void QPainter::setClipRegion(const QRegion &r, Qt::ClipOperation op) The following functions can transform the coordinate system without using a QMatrix: \list - \i translate() - \i scale() - \i shear() - \i rotate() + \li translate() + \li scale() + \li shear() + \li rotate() \endlist They operate on the painter's worldMatrix() and are implemented like this: - \snippet doc/src/snippets/code/src_gui_painting_qpainter.cpp 4 + \snippet code/src_gui_painting_qpainter.cpp 4 Note that when using setWorldMatrix() function you should always have \a combine be true when you are drawing into a QPicture. Otherwise @@ -3113,8 +3091,7 @@ bool QPainter::matrixEnabled() const /*! Scales the coordinate system by (\a{sx}, \a{sy}). - \sa setWorldTransform() {QPainter#Coordinate Transformations}{Coordinate - Transformations} + \sa setWorldTransform(), {QPainter#Coordinate Transformations}{Coordinate Transformations} */ void QPainter::scale(qreal sx, qreal sy) @@ -3137,8 +3114,7 @@ void QPainter::scale(qreal sx, qreal sy) /*! Shears the coordinate system by (\a{sh}, \a{sv}). - \sa setWorldTransform(), {QPainter#Coordinate Transformations}{Coordinate - Transformations} + \sa setWorldTransform(), {QPainter#Coordinate Transformations}{Coordinate Transformations} */ void QPainter::shear(qreal sh, qreal sv) @@ -3161,10 +3137,9 @@ void QPainter::shear(qreal sh, qreal sv) /*! \fn void QPainter::rotate(qreal angle) - Rotates the coordinate system the given \a angle clockwise. + Rotates the coordinate system clockwise. The given \a angle parameter uses degree unit. - \sa setWorldTransform(), {QPainter#Coordinate Transformations}{Coordinate - Transformations} + \sa setWorldTransform(), {QPainter#Coordinate Transformations}{Coordinate Transformations} */ void QPainter::rotate(qreal a) @@ -3188,8 +3163,7 @@ void QPainter::rotate(qreal a) Translates the coordinate system by the given \a offset; i.e. the given \a offset is added to points. - \sa setWorldTransform(), {QPainter#Coordinate Transformations}{Coordinate - Transformations} + \sa setWorldTransform(), {QPainter#Coordinate Transformations}{Coordinate Transformations} */ void QPainter::translate(const QPointF &offset) { @@ -3366,9 +3340,9 @@ void QPainter::fillPath(const QPainterPath &path, const QBrush &brush) \table 100% \row - \o \inlineimage qpainter-path.png - \o - \snippet doc/src/snippets/code/src_gui_painting_qpainter.cpp 5 + \li \inlineimage qpainter-path.png + \li + \snippet code/src_gui_painting_qpainter.cpp 5 \endtable \sa {painting/painterpaths}{the Painter Paths @@ -3411,9 +3385,9 @@ void QPainter::drawPath(const QPainterPath &path) \table 100% \row - \o \inlineimage qpainter-line.png - \o - \snippet doc/src/snippets/code/src_gui_painting_qpainter.cpp 6 + \li \inlineimage qpainter-line.png + \li + \snippet code/src_gui_painting_qpainter.cpp 6 \endtable \sa drawLines(), drawPolyline(), {Coordinate System} @@ -3458,9 +3432,9 @@ void QPainter::drawPath(const QPainterPath &path) \table 100% \row - \o \inlineimage qpainter-rectangle.png - \o - \snippet doc/src/snippets/code/src_gui_painting_qpainter.cpp 7 + \li \inlineimage qpainter-rectangle.png + \li + \snippet code/src_gui_painting_qpainter.cpp 7 \endtable \sa drawRects(), drawPolygon(), {Coordinate System} @@ -3785,29 +3759,6 @@ void QPainter::drawPoints(const QPoint *points, int pointCount) */ /*! - \fn void QPainter::drawPoints(const QPolygon &polygon, int index, - int count) - - \overload - \compat - - Draws \a count points in the vector \a polygon starting on \a index - using the current pen. - - Use drawPoints() combined with QPolygon::constData() instead. - - \oldcode - QPainter painter(this); - painter.drawPoints(polygon, index, count); - \newcode - int pointCount = (count == -1) ? polygon.size() - index : count; - - QPainter painter(this); - painter.drawPoints(polygon.constData() + index, pointCount); - \endcode -*/ - -/*! Sets the background mode of the painter to the given \a mode Qt::TransparentMode (the default) draws stippled lines and text @@ -3879,13 +3830,10 @@ void QPainter::setPen(const QColor &color) return; } - if (d->state->pen.style() == Qt::SolidLine - && d->state->pen.widthF() == 0 - && d->state->pen.isSolid() - && d->state->pen.color() == color) - return; + QPen pen(color.isValid() ? color : QColor(Qt::black)); - QPen pen(color.isValid() ? color : QColor(Qt::black), 0, Qt::SolidLine); + if (d->state->pen == pen) + return; d->state->pen = pen; if (d->extended) @@ -3934,7 +3882,7 @@ void QPainter::setPen(const QPen &pen) /*! \overload - Sets the painter's pen to have the given \a style, width 0 and + Sets the painter's pen to have the given \a style, width 1 and black color. */ @@ -3946,15 +3894,12 @@ void QPainter::setPen(Qt::PenStyle style) return; } - if (d->state->pen.style() == style - && (style == Qt::NoPen || (d->state->pen.widthF() == 0 - && d->state->pen.isSolid() - && d->state->pen.color() == QColor(Qt::black)))) + QPen pen = QPen(style); + + if (d->state->pen == pen) return; - // QPen(Qt::NoPen) is to avoid creating QPenData, including its brush (from the color) - // Note that this works well as long as QPen(Qt::NoPen) returns a black, zero-width pen - d->state->pen = (style == Qt::NoPen) ? QPen(Qt::NoPen) : QPen(Qt::black, 0, style); + d->state->pen = pen; if (d->extended) d->extended->penChanged(); @@ -4150,9 +4095,9 @@ const QFont &QPainter::font() const \table 100% \row - \o \inlineimage qpainter-roundrect.png - \o - \snippet doc/src/snippets/code/src_gui_painting_qpainter.cpp 8 + \li \inlineimage qpainter-roundrect.png + \li + \snippet code/src_gui_painting_qpainter.cpp 8 \endtable \sa drawRect(), QPen @@ -4250,9 +4195,9 @@ void QPainter::drawRoundRect(const QRectF &r, int xRnd, int yRnd) \table 100% \row - \o \inlineimage qpainter-ellipse.png - \o - \snippet doc/src/snippets/code/src_gui_painting_qpainter.cpp 9 + \li \inlineimage qpainter-ellipse.png + \li + \snippet code/src_gui_painting_qpainter.cpp 9 \endtable \sa drawPie(), {Coordinate System} @@ -4376,9 +4321,9 @@ void QPainter::drawEllipse(const QRect &r) \table 100% \row - \o \inlineimage qpainter-arc.png - \o - \snippet doc/src/snippets/code/src_gui_painting_qpainter.cpp 10 + \li \inlineimage qpainter-arc.png + \li + \snippet code/src_gui_painting_qpainter.cpp 10 \endtable \sa drawPie(), drawChord(), {Coordinate System} @@ -4427,8 +4372,7 @@ void QPainter::drawArc(const QRectF &r, int a, int alen) /*! \fn void QPainter::drawPie(const QRectF &rectangle, int startAngle, int spanAngle) - Draws a pie defined by the given \a rectangle, \a startAngle and - and \a spanAngle. + Draws a pie defined by the given \a rectangle, \a startAngle and \a spanAngle. The pie is filled with the current brush(). @@ -4440,9 +4384,9 @@ void QPainter::drawArc(const QRectF &r, int a, int alen) \table 100% \row - \o \inlineimage qpainter-pie.png - \o - \snippet doc/src/snippets/code/src_gui_painting_qpainter.cpp 11 + \li \inlineimage qpainter-pie.png + \li + \snippet code/src_gui_painting_qpainter.cpp 11 \endtable \sa drawEllipse(), drawChord(), {Coordinate System} @@ -4509,9 +4453,9 @@ void QPainter::drawPie(const QRectF &r, int a, int alen) \table 100% \row - \o \inlineimage qpainter-chord.png - \o - \snippet doc/src/snippets/code/src_gui_painting_qpainter.cpp 12 + \li \inlineimage qpainter-chord.png + \li + \snippet code/src_gui_painting_qpainter.cpp 12 \endtable \sa drawArc(), drawPie(), {Coordinate System} @@ -4725,8 +4669,8 @@ void QPainter::drawLines(const QPoint *pointPairs, int lineCount) \table 100% \row - \o - \snippet doc/src/snippets/code/src_gui_painting_qpainter.cpp 13 + \li + \snippet code/src_gui_painting_qpainter.cpp 13 \endtable \sa drawLines(), drawPolygon(), {Coordinate System} @@ -4808,29 +4752,6 @@ void QPainter::drawPolyline(const QPoint *points, int pointCount) } /*! - \fn void QPainter::drawPolyline(const QPolygon &polygon, int index, int - count) - - \overload - \compat - - Draws the polyline defined by the \a count lines of the given \a - polygon starting at \a index (\a index defaults to 0). - - Use drawPolyline() combined with QPolygon::constData() instead. - - \oldcode - QPainter painter(this); - painter.drawPolyline(polygon, index, count); - \newcode - int pointCount = (count == -1) ? polygon.size() - index : count; - - QPainter painter(this); - painter.drawPolyline(polygon.constData() + index, pointCount); - \endcode -*/ - -/*! \fn void QPainter::drawPolyline(const QPolygonF &points) \overload @@ -4854,9 +4775,9 @@ void QPainter::drawPolyline(const QPoint *points, int pointCount) \table 100% \row - \o \inlineimage qpainter-polygon.png - \o - \snippet doc/src/snippets/code/src_gui_painting_qpainter.cpp 14 + \li \inlineimage qpainter-polygon.png + \li + \snippet code/src_gui_painting_qpainter.cpp 14 \endtable The first point is implicitly connected to the last point, and the @@ -4868,7 +4789,7 @@ void QPainter::drawPolyline(const QPoint *points, int pointCount) \l{Qt::FillRule} for a more detailed description of these fill rules. - \sa drawConvexPolygon(), drawPolyline(), {Coordinate System} + \sa drawConvexPolygon(), drawPolyline(), {Coordinate System} */ void QPainter::drawPolygon(const QPointF *points, int pointCount, Qt::FillRule fillRule) { @@ -4943,45 +4864,6 @@ void QPainter::drawPolygon(const QPoint *points, int pointCount, Qt::FillRule fi d->engine->drawPolygon(points, pointCount, QPaintEngine::PolygonDrawMode(fillRule)); } -/*! \fn void QPainter::drawPolygon(const QPolygonF &polygon, bool winding, int index = 0, - int count = -1) - \compat - \overload - - Use drawPolygon() combined with QPolygonF::constData() instead. - - \oldcode - QPainter painter(this); - painter.drawPolygon(polygon, winding, index, count); - \newcode - int pointCount = (count == -1) ? polygon.size() - index : count; - int fillRule = winding ? Qt::WindingFill : Qt::OddEvenFill; - - QPainter painter(this); - painter.drawPolygon( polygon.constData() + index, pointCount, fillRule); - \endcode -*/ - -/*! \fn void QPainter::drawPolygon(const QPolygon &polygon, bool winding, - int index = 0, int count = -1) - - \compat - \overload - - Use drawPolygon() combined with QPolygon::constData() instead. - - \oldcode - QPainter painter(this); - painter.drawPolygon(polygon, winding, index, count); - \newcode - int pointCount = (count == -1) ? polygon.size() - index : count; - int fillRule = winding ? Qt::WindingFill : Qt::OddEvenFill; - - QPainter painter(this); - painter.drawPolygon( polygon.constData() + index, pointCount, fillRule); - \endcode -*/ - /*! \fn void QPainter::drawPolygon(const QPolygonF &points, Qt::FillRule fillRule) \overload @@ -5006,9 +4888,9 @@ void QPainter::drawPolygon(const QPoint *points, int pointCount, Qt::FillRule fi \table 100% \row - \o \inlineimage qpainter-polygon.png - \o - \snippet doc/src/snippets/code/src_gui_painting_qpainter.cpp 15 + \li \inlineimage qpainter-polygon.png + \li + \snippet code/src_gui_painting_qpainter.cpp 15 \endtable The first point is implicitly connected to the last point, and the @@ -5047,48 +4929,6 @@ void QPainter::drawPolygon(const QPoint *points, int pointCount, Qt::FillRule fi pen and brush. */ -/*! - \fn void QPainter::drawConvexPolygon(const QPolygonF &polygon, int - index, int count) - - \compat - \overload - - Use drawConvexPolygon() combined with QPolygonF::constData() - instead. - - \oldcode - QPainter painter(this); - painter.drawConvexPolygon(polygon, index, count); - \newcode - int pointCount = (count == -1) ? polygon.size() - index : count; - - QPainter painter(this); - painter.drawConvexPolygon(polygon.constData() + index, pointCount); - \endcode -*/ - -/*! - \fn void QPainter::drawConvexPolygon(const QPolygon &polygon, int - index, int count) - - \compat - \overload - - Use drawConvexPolygon() combined with QPolygon::constData() - instead. - - \oldcode - QPainter painter(this); - painter.drawConvexPolygon(polygon, index, count); - \newcode - int pointCount = (count == -1) ? polygon.size() - index : count; - - QPainter painter(this); - painter.drawConvexPolygon(polygon.constData() + index, pointCount); - \endcode -*/ - void QPainter::drawConvexPolygon(const QPoint *points, int pointCount) { #ifdef QT_DEBUG_DRAW @@ -5172,8 +5012,8 @@ static inline QPointF roundInDeviceCoordinates(const QPointF &p, const QTransfor \table 100% \row - \o - \snippet doc/src/snippets/code/src_gui_painting_qpainter.cpp 16 + \li + \snippet code/src_gui_painting_qpainter.cpp 16 \endtable If \a pixmap is a QBitmap it is drawn with the bits that are "set" @@ -5684,14 +5524,9 @@ void QPainter::drawGlyphRun(const QPointF &position, const QGlyphRun &glyphRun) QVarLengthArray fixedPointPositions(count); QRawFontPrivate *fontD = QRawFontPrivate::get(font); - bool supportsTransformations; - if (d->extended != 0) { - supportsTransformations = d->extended->supportsTransformations(fontD->fontEngine->fontDef.pixelSize, - d->state->matrix); - } else { - supportsTransformations = d->engine->type() == QPaintEngine::CoreGraphics - || d->state->matrix.isAffine(); - } + bool supportsTransformations = d->extended + ? d->extended->supportsTransformations(fontD->fontEngine, d->state->matrix) + : d->engine->type() == QPaintEngine::CoreGraphics || d->state->matrix.isAffine(); for (int i=0; i advances(glyphCount); QVarLengthArray glyphJustifications(glyphCount); QVarLengthArray glyphAttributes(glyphCount); - qMemSet(glyphAttributes.data(), 0, glyphAttributes.size() * sizeof(HB_GlyphAttributes)); - qMemSet(advances.data(), 0, advances.size() * sizeof(QFixed)); - qMemSet(glyphJustifications.data(), 0, glyphJustifications.size() * sizeof(QGlyphJustification)); + memset(glyphAttributes.data(), 0, glyphAttributes.size() * sizeof(HB_GlyphAttributes)); + memset(advances.data(), 0, advances.size() * sizeof(QFixed)); + memset(glyphJustifications.data(), 0, glyphJustifications.size() * sizeof(QGlyphJustification)); textItem.glyphs.numGlyphs = glyphCount; textItem.glyphs.glyphs = reinterpret_cast(const_cast(glyphArray)); @@ -5779,6 +5614,7 @@ void QPainterPrivate::drawGlyphs(const quint32 *glyphArray, QFixedPoint *positio drawTextItemDecoration(q, QPointF(leftMost.toReal(), baseLine.toReal()), fontEngine, + 0, // textEngine (underline ? QTextCharFormat::SingleUnderline : QTextCharFormat::NoUnderline), @@ -5814,7 +5650,7 @@ void QPainterPrivate::drawGlyphs(const quint32 *glyphArray, QFixedPoint *positio Draws the given \a text with the currently defined text direction, beginning at the given \a position. - This function does not handle the newline character (\n), as it cannot + This function does not handle the newline character (\\n), as it cannot break text into multiple lines, and it cannot display the newline character. Use the QPainter::drawText() overload that takes a rectangle instead if you want to draw multiple lines of text with the newline character, or @@ -5823,6 +5659,8 @@ void QPainterPrivate::drawGlyphs(const quint32 *glyphArray, QFixedPoint *positio By default, QPainter draws text anti-aliased. \note The y-position is used as the baseline of the font. + + \sa setFont(), setPen() */ void QPainter::drawText(const QPointF &p, const QString &str) @@ -5872,7 +5710,10 @@ void QPainter::drawStaticText(const QPointF &topLeftPosition, const QStaticText return; } - bool supportsTransformations = d->extended->supportsTransformations(staticText_d->font.pixelSize(), + QFontEngine *fe = staticText_d->font.d->engineForScript(QUnicodeTables::Common); + if (fe->type() == QFontEngine::Multi) + fe = static_cast(fe)->engine(0); + bool supportsTransformations = d->extended->supportsTransformations(fe, d->state->matrix); if (supportsTransformations && !staticText_d->untransformedCoordinates) { staticText_d->untransformedCoordinates = true; @@ -6075,6 +5916,7 @@ void QPainter::drawText(const QRect &r, int flags, const QString &str, QRect *br \note The y-position is used as the baseline of the font. + \sa setFont(), setPen() */ /*! @@ -6082,12 +5924,13 @@ void QPainter::drawText(const QRect &r, int flags, const QString &str, QRect *br \overload Draws the given \a text within the provided \a rectangle. + The \a rectangle along with alignment \a flags defines the anchors for the \a text. \table 100% \row - \o \inlineimage qpainter-text.png - \o - \snippet doc/src/snippets/code/src_gui_painting_qpainter.cpp 17 + \li \inlineimage qpainter-text.png + \li + \snippet code/src_gui_painting_qpainter.cpp 17 \endtable The \a boundingRect (if not null) is set to the what the bounding rectangle @@ -6095,20 +5938,20 @@ void QPainter::drawText(const QRect &r, int flags, const QString &str, QRect *br OR of the following flags: \list - \o Qt::AlignLeft - \o Qt::AlignRight - \o Qt::AlignHCenter - \o Qt::AlignJustify - \o Qt::AlignTop - \o Qt::AlignBottom - \o Qt::AlignVCenter - \o Qt::AlignCenter - \o Qt::TextDontClip - \o Qt::TextSingleLine - \o Qt::TextExpandTabs - \o Qt::TextShowMnemonic - \o Qt::TextWordWrap - \o Qt::TextIncludeTrailingSpaces + \li Qt::AlignLeft + \li Qt::AlignRight + \li Qt::AlignHCenter + \li Qt::AlignJustify + \li Qt::AlignTop + \li Qt::AlignBottom + \li Qt::AlignVCenter + \li Qt::AlignCenter + \li Qt::TextDontClip + \li Qt::TextSingleLine + \li Qt::TextExpandTabs + \li Qt::TextShowMnemonic + \li Qt::TextWordWrap + \li Qt::TextIncludeTrailingSpaces \endlist \sa Qt::AlignmentFlag, Qt::TextFlag, boundingRect(), layoutDirection() @@ -6147,6 +5990,8 @@ void QPainter::drawText(const QRectF &r, int flags, const QString &str, QRectF * By default, QPainter draws text anti-aliased. \note The y-coordinate of \a rectangle is used as the top of the font. + + \sa setFont(), setPen() */ /*! @@ -6161,6 +6006,7 @@ void QPainter::drawText(const QRectF &r, int flags, const QString &str, QRectF * \note The y-position is used as the baseline of the font. + \sa setFont(), setPen() */ /*! @@ -6177,25 +6023,25 @@ void QPainter::drawText(const QRectF &r, int flags, const QString &str, QRectF * the following flags: \list - \o Qt::AlignLeft - \o Qt::AlignRight - \o Qt::AlignHCenter - \o Qt::AlignJustify - \o Qt::AlignTop - \o Qt::AlignBottom - \o Qt::AlignVCenter - \o Qt::AlignCenter - \o Qt::TextSingleLine - \o Qt::TextExpandTabs - \o Qt::TextShowMnemonic - \o Qt::TextWordWrap + \li Qt::AlignLeft + \li Qt::AlignRight + \li Qt::AlignHCenter + \li Qt::AlignJustify + \li Qt::AlignTop + \li Qt::AlignBottom + \li Qt::AlignVCenter + \li Qt::AlignCenter + \li Qt::TextSingleLine + \li Qt::TextExpandTabs + \li Qt::TextShowMnemonic + \li Qt::TextWordWrap \endlist By default, QPainter draws text anti-aliased. \note The y-position is used as the top of the font. - \sa Qt::AlignmentFlag, Qt::TextFlag + \sa Qt::AlignmentFlag, Qt::TextFlag, setFont(), setPen() */ /*! @@ -6209,6 +6055,8 @@ void QPainter::drawText(const QRectF &r, int flags, const QString &str, QRectF * By default, QPainter draws text anti-aliased. \note The y-coordinate of \a rectangle is used as the top of the font. + + \sa setFont(), setPen() */ void QPainter::drawText(const QRectF &r, const QString &text, const QTextOption &o) { @@ -6268,7 +6116,7 @@ static QPixmap generateWavyPixmap(qreal maxRadius, const QPen &pen) { const qreal radiusBase = qMax(qreal(1), maxRadius); - QString key = QLatin1Literal("WaveUnderline-") + QString key = QLatin1String("WaveUnderline-") % pen.color().name() % HexString(radiusBase); @@ -6315,7 +6163,7 @@ static QPixmap generateWavyPixmap(qreal maxRadius, const QPen &pen) return pixmap; } -static void drawTextItemDecoration(QPainter *painter, const QPointF &pos, const QFontEngine *fe, +static void drawTextItemDecoration(QPainter *painter, const QPointF &pos, const QFontEngine *fe, QTextEngine *textEngine, QTextCharFormat::UnderlineStyle underlineStyle, QTextItem::RenderFlags flags, qreal width, const QTextCharFormat &charFormat) @@ -6337,11 +6185,12 @@ static void drawTextItemDecoration(QPainter *painter, const QPointF &pos, const const qreal underlineOffset = fe->underlinePosition().toReal(); // deliberately ceil the offset to avoid the underline coming too close to // the text above it. - const qreal aliasedCoordinateDelta = 0.5 - 0.015625; - const qreal underlinePos = pos.y() + qCeil(underlineOffset) - aliasedCoordinateDelta; + const qreal underlinePos = pos.y() + qCeil(underlineOffset); if (underlineStyle == QTextCharFormat::SpellCheckUnderline) { - underlineStyle = QTextCharFormat::SpellCheckUnderline; // ### Qt5 QTextCharFormat::UnderlineStyle(QApplication::style()->styleHint(QStyle::SH_SpellCheckUnderlineStyle)); + QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme(); + if (theme) + underlineStyle = QTextCharFormat::UnderlineStyle(theme->themeHint(QPlatformTheme::SpellCheckUnderlineStyle).toInt()); } if (underlineStyle == QTextCharFormat::WaveUnderline) { @@ -6360,15 +6209,17 @@ static void drawTextItemDecoration(QPainter *painter, const QPointF &pos, const painter->fillRect(pos.x(), 0, qCeil(width), qMin(wave.height(), descent), wave); painter->restore(); } else if (underlineStyle != QTextCharFormat::NoUnderline) { - QLineF underLine(line.x1(), underlinePos, line.x2(), underlinePos); - QColor uc = charFormat.underlineColor(); if (uc.isValid()) pen.setColor(uc); pen.setStyle((Qt::PenStyle)(underlineStyle)); painter->setPen(pen); - painter->drawLine(underLine); + QLineF underline(line.x1(), underlinePos, line.x2(), underlinePos); + if (textEngine) + textEngine->addUnderline(painter, underline); + else + painter->drawLine(underline); } pen.setStyle(Qt::SolidLine); @@ -6378,14 +6229,20 @@ static void drawTextItemDecoration(QPainter *painter, const QPointF &pos, const QLineF strikeOutLine = line; strikeOutLine.translate(0., - fe->ascent().toReal() / 3.); painter->setPen(pen); - painter->drawLine(strikeOutLine); + if (textEngine) + textEngine->addStrikeOut(painter, strikeOutLine); + else + painter->drawLine(strikeOutLine); } if (flags & QTextItem::Overline) { - QLineF overLine = line; - overLine.translate(0., - fe->ascent().toReal()); + QLineF overline = line; + overline.translate(0., - fe->ascent().toReal()); painter->setPen(pen); - painter->drawLine(overLine); + if (textEngine) + textEngine->addOverline(painter, overline); + else + painter->drawLine(overline); } painter->setPen(oldPen); @@ -6410,7 +6267,7 @@ Q_GUI_EXPORT void qt_draw_decoration_for_glyphs(QPainter *painter, const glyph_t // We don't support glyphs that do not share a common baseline. If this turns out to // be a relevant use case, then we need to find clusters of glyphs that share a baseline - // and do a drawTextItemDecorations call per cluster. + // and do a drawTextItemDecoration call per cluster. if (i == 0 || baseLine < positions[i].y) baseLine = positions[i].y; @@ -6431,12 +6288,20 @@ Q_GUI_EXPORT void qt_draw_decoration_for_glyphs(QPainter *painter, const glyph_t drawTextItemDecoration(painter, QPointF(leftMost.toReal(), baseLine.toReal()), fontEngine, + 0, // textEngine font.underline() ? QTextCharFormat::SingleUnderline : QTextCharFormat::NoUnderline, flags, width.toReal(), charFormat); } -void QPainter::drawTextItem(const QPointF &p, const QTextItem &_ti) +void QPainter::drawTextItem(const QPointF &p, const QTextItem &ti) +{ + Q_D(QPainter); + + d->drawTextItem(p, ti, static_cast(0)); +} + +void QPainterPrivate::drawTextItem(const QPointF &p, const QTextItem &_ti, QTextEngine *textEngine) { #ifdef QT_DEBUG_DRAW if (qt_show_painter_debug_output) @@ -6444,35 +6309,35 @@ void QPainter::drawTextItem(const QPointF &p, const QTextItem &_ti) p.x(), p.y(), qPrintable(_ti.text())); #endif - Q_D(QPainter); + Q_Q(QPainter); - if (!d->engine) + if (!engine) return; #ifndef QT_NO_DEBUG - qt_painter_thread_test(d->device->devType(), + qt_painter_thread_test(device->devType(), "text and fonts", QFontDatabase::supportsThreadedFontRendering()); #endif QTextItemInt &ti = const_cast(static_cast(_ti)); - if (!d->extended && d->state->bgMode == Qt::OpaqueMode) { + if (!extended && state->bgMode == Qt::OpaqueMode) { QRectF rect(p.x(), p.y() - ti.ascent.toReal(), ti.width.toReal(), (ti.ascent + ti.descent + 1).toReal()); - fillRect(rect, d->state->bgBrush); + q->fillRect(rect, state->bgBrush); } - if (pen().style() == Qt::NoPen) + if (q->pen().style() == Qt::NoPen) return; - const RenderHints oldRenderHints = d->state->renderHints; - if (!d->state->renderHints & QPainter::Antialiasing && d->state->matrix.type() >= QTransform::TxScale) { + const QPainter::RenderHints oldRenderHints = state->renderHints; + if (!state->renderHints & QPainter::Antialiasing && state->matrix.type() >= QTransform::TxScale) { // draw antialias decoration (underline/overline/strikeout) with // transformed text bool aa = true; - const QTransform &m = d->state->matrix; - if (d->state->matrix.type() < QTransform::TxShear) { + const QTransform &m = state->matrix; + if (state->matrix.type() < QTransform::TxShear) { bool isPlain90DegreeRotation = (qFuzzyIsNull(m.m11()) && qFuzzyIsNull(m.m12() - qreal(1)) @@ -6495,11 +6360,11 @@ void QPainter::drawTextItem(const QPointF &p, const QTextItem &_ti) aa = !isPlain90DegreeRotation; } if (aa) - setRenderHint(QPainter::Antialiasing, true); + q->setRenderHint(QPainter::Antialiasing, true); } - if (!d->extended) - d->updateState(d->state); + if (!extended) + updateState(state); if (!ti.glyphs.numGlyphs) { // nothing to do @@ -6535,7 +6400,7 @@ void QPainter::drawTextItem(const QPointF &p, const QTextItem &_ti) if (rtl) x -= ti2.width.toReal(); - d->engine->drawTextItem(QPointF(x, y), ti2); + engine->drawTextItem(QPointF(x, y), ti2); if (!rtl) x += ti2.width.toReal(); @@ -6562,10 +6427,10 @@ void QPainter::drawTextItem(const QPointF &p, const QTextItem &_ti) if (rtl) x -= ti2.width.toReal(); - if (d->extended) - d->extended->drawTextItem(QPointF(x, y), ti2); + if (extended) + extended->drawTextItem(QPointF(x, y), ti2); else - d->engine->drawTextItem(QPointF(x,y), ti2); + engine->drawTextItem(QPointF(x,y), ti2); // reset the high byte for all glyphs const int hi = which << 24; @@ -6573,20 +6438,20 @@ void QPainter::drawTextItem(const QPointF &p, const QTextItem &_ti) glyphs.glyphs[i] = hi | glyphs.glyphs[i]; } else { - if (d->extended) - d->extended->drawTextItem(p, ti); + if (extended) + extended->drawTextItem(p, ti); else - d->engine->drawTextItem(p, ti); + engine->drawTextItem(p, ti); } - drawTextItemDecoration(this, p, ti.fontEngine, ti.underlineStyle, ti.flags, ti.width.toReal(), - ti.charFormat); + drawTextItemDecoration(q, p, ti.fontEngine, textEngine, ti.underlineStyle, + ti.flags, ti.width.toReal(), ti.charFormat); - if (d->state->renderHints != oldRenderHints) { - d->state->renderHints = oldRenderHints; - if (d->extended) - d->extended->renderHintsChanged(); + if (state->renderHints != oldRenderHints) { + state->renderHints = oldRenderHints; + if (extended) + extended->renderHintsChanged(); else - d->state->dirtyFlags |= QPaintEngine::DirtyHints; + state->dirtyFlags |= QPaintEngine::DirtyHints; } } @@ -6605,18 +6470,18 @@ void QPainter::drawTextItem(const QPointF &p, const QTextItem &_ti) The \a flags argument is a bitwise OR of the following flags: \list - \o Qt::AlignLeft - \o Qt::AlignRight - \o Qt::AlignHCenter - \o Qt::AlignTop - \o Qt::AlignBottom - \o Qt::AlignVCenter - \o Qt::AlignCenter - \o Qt::TextSingleLine - \o Qt::TextExpandTabs - \o Qt::TextShowMnemonic - \o Qt::TextWordWrap - \o Qt::TextIncludeTrailingSpaces + \li Qt::AlignLeft + \li Qt::AlignRight + \li Qt::AlignHCenter + \li Qt::AlignTop + \li Qt::AlignBottom + \li Qt::AlignVCenter + \li Qt::AlignCenter + \li Qt::TextSingleLine + \li Qt::TextExpandTabs + \li Qt::TextShowMnemonic + \li Qt::TextWordWrap + \li Qt::TextIncludeTrailingSpaces \endlist If several of the horizontal or several of the vertical alignment flags are set, the resulting alignment is undefined. @@ -6824,8 +6689,8 @@ void QPainter::drawTiledPixmap(const QRectF &r, const QPixmap &pixmap, const QPo \table 100% \row - \o - \snippet doc/src/snippets/code/src_gui_painting_qpainter.cpp 18 + \li + \snippet code/src_gui_painting_qpainter.cpp 18 \endtable \sa QPicture::play() @@ -6868,7 +6733,7 @@ void QPainter::drawPicture(const QPointF &p, const QPicture &picture) Erases the area inside the given \a rectangle. Equivalent to calling - \snippet doc/src/snippets/code/src_gui_painting_qpainter.cpp 19 + \snippet code/src_gui_painting_qpainter.cpp 19 \sa fillRect() */ @@ -7283,7 +7148,7 @@ QRect QPainter::window() const The default viewport rectangle is the same as the device's rectangle. - \sa viewport(), viewTransformEnabled() {Coordinate + \sa viewport(), viewTransformEnabled(), {Coordinate System#Window-Viewport Conversion}{Window-Viewport Conversion} */ @@ -7334,35 +7199,6 @@ QRect QPainter::viewport() const return QRect(d->state->vx, d->state->vy, d->state->vw, d->state->vh); } -/*! \fn bool QPainter::hasViewXForm() const - \compat - - Use viewTransformEnabled() instead. -*/ - -/*! \fn bool QPainter::hasWorldXForm() const - \compat - - Use worldMatrixEnabled() instead. -*/ - -/*! \fn void QPainter::resetXForm() - \compat - - Use resetTransform() instead. -*/ - -/*! \fn void QPainter::setViewXForm(bool enabled) - \compat - - Use setViewTransformEnabled() instead. -*/ - -/*! \fn void QPainter::setWorldXForm(bool enabled) - \compat - - Use setWorldMatrixEnabled() instead. -*/ /*! Enables view transformations if \a enable is true, or disables view transformations if \a enable is false. @@ -7420,6 +7256,7 @@ void QPainter::setRedirected(const QPaintDevice *device, const QPoint &offset) { Q_ASSERT(device != 0); + Q_UNUSED(device) Q_UNUSED(replacement) Q_UNUSED(offset) qWarning("QPainter::setRedirected(): ignoring call to deprecated function, use QWidget::render() instead"); @@ -7712,11 +7549,12 @@ start_lengthVariant: for (int i = 0; i < textLayout.lineCount(); i++) { QTextLine line = textLayout.lineAt(i); + QTextEngine *eng = textLayout.engine(); + eng->enableDelayDecorations(); qreal advance = line.horizontalAdvance(); xoff = 0; if (tf & Qt::AlignRight) { - QTextEngine *eng = textLayout.engine(); xoff = r.width() - advance - eng->leadingSpaceWidth(eng->lines[line.lineNumber()]).toReal(); } @@ -7724,6 +7562,7 @@ start_lengthVariant: xoff = (r.width() - advance) / 2; line.draw(painter, QPointF(r.x() + xoff, r.y() + yoff)); + eng->drawDecorations(painter); } if (restore) { @@ -7823,108 +7662,6 @@ void QPainterState::init(QPainter *p) { } /*! - \fn void QPainter::setBackgroundColor(const QColor &color) - - Use setBackground() instead. -*/ - -/*! - \fn const QColor &QPainter::backgroundColor() const - - Use background() and QBrush::color() instead. - - \oldcode - QColor myColor = backgroundColor(); - \newcode - QColor myColor = background().color(); - \endcode - - Note that the background can be a complex brush such as a texture - or a gradient. -*/ - -/*! - \fn void QPainter::drawText(int x, int y, const QString &text, int pos, int length) - \compat - - Use drawText() combined with QString::mid() instead. - - \oldcode - QPainter painter(this); - painter.drawText(x, y, text, pos, length); - \newcode - QPainter painter(this); - painter.drawText(x, y, text.mid(pos, length)); - \endcode -*/ - -/*! - \fn void QPainter::drawText(const QPoint &point, const QString &text, int pos, int length) - \compat - - Use drawText() combined with QString::mid() instead. - - \oldcode - QPainter painter(this); - painter.drawText(point, text, pos, length); - \newcode - QPainter painter(this); - painter.drawText(point, text.mid(pos, length)); - \endcode -*/ - -/*! - \fn void QPainter::drawText(int x, int y, const QString &text, int length) - \compat - - Use drawText() combined with QString::left() instead. - - \oldcode - QPainter painter(this); - painter.drawText(x, y, text, length); - \newcode - QPainter painter(this); - painter.drawText(x, y, text.left(length)); - \endcode -*/ - -/*! - \fn void QPainter::drawText(const QPoint &point, const QString &text, int length) - \compat - - Use drawText() combined with QString::left() instead. - - \oldcode - QPainter painter(this); - painter.drawText(point, text, length); - \newcode - QPainter painter(this); - painter.drawText(point, text.left(length)); - \endcode -*/ - -/*! - \fn bool QPainter::begin(QPaintDevice *device, const QWidget *init) - \compat - - Use begin() instead. - - If the paint \a device is a QWidget, QPainter is initialized after - the widget's settings automatically. Otherwise, you must call the - initFrom() function to initialize the painters pen, background and - font to the same as any given widget. - - \oldcode - QPainter painter(this); - painter.begin(device, init); - \newcode - QPainter painter(this); - painter.begin(device); - painter.initFrom(init); - \endcode -*/ - -/*! \fn void QPainter::drawImage(const QRectF &target, const QImage &image, const QRectF &source, Qt::ImageConversionFlags flags) @@ -7939,8 +7676,8 @@ void QPainterState::init(QPainter *p) { \table 100% \row - \o - \snippet doc/src/snippets/code/src_gui_painting_qpainter.cpp 20 + \li + \snippet code/src_gui_painting_qpainter.cpp 20 \endtable \sa drawPixmap() @@ -8031,90 +7768,9 @@ void QPainterState::init(QPainter *p) { */ /*! - \fn void QPainter::redirect(QPaintDevice *pdev, QPaintDevice *replacement) - - Use setRedirected() instead. -*/ - -/*! - \fn QPaintDevice *QPainter::redirect(QPaintDevice *pdev) - - Use redirected() instead. -*/ - -/*! - \fn QRect QPainter::boundingRect(const QRect &rectangle, int flags, - const QString &text, int length) - \compat - - Returns the bounding rectangle for the given \a length of the \a - text constrained by the provided \a rectangle. - - Use boundingRect() combined with QString::left() instead. - - \oldcode - QRect rectangle = boundingRect(rect, flags, text, length); - \newcode - QRect rectangle = boundingRect(rect, flags, text.left(length)); - \endcode -*/ - -/*! - \fn void QPainter::drawText(const QRect &rectangle, int flags, const QString &text, - int length, QRect *br) - \compat - - Use drawText() combined with QString::left() instead. - - \oldcode - QPainter painter(this); - painter.drawText(rectangle, flags, text, length, br ); - \newcode - QPainter painter(this); - painter.drawText(rectangle, flags, text.left(length), br ); - \endcode -*/ - -/*! - \fn QRect QPainter::boundingRect(int x, int y, int width, int height, int flags, - const QString &text, int length); - - \compat - - Returns the bounding rectangle for the given \a length of the \a - text constrained by the rectangle that begins at point (\a{x}, - \a{y}) with the given \a width and \a height. - - Use boundingRect() combined with QString::left() instead. - - \oldcode - QRect rectangle = boundingRect(x, y, width, height, flags, text, length); - \newcode - QRect rectangle = boundingRect(x, y, width, height, flags, text.left(length)); - \endcode -*/ - -/*! - \fn void QPainter::drawText(int x, int y, int width, int height, int flags, - const QString &text, int length, QRect *br) - - \compat - - Use drawText() combined with QString::left() instead. - - \oldcode - QPainter painter(this); - painter.drawText(x, y, width, height, flags, text, length, br ); - \newcode - QPainter painter(this); - painter.drawText(x, y, width, height, flags, text.left(length), br ); - \endcode -*/ - - -/*! \class QPaintEngineState \since 4.1 + \inmodule QtGui \brief The QPaintEngineState class provides information about the active paint engine's current state. @@ -8137,21 +7793,21 @@ void QPainterState::init(QPainter *p) { \target GetFunction \table - \header \o Property Flag \o Current Property Value - \row \o QPaintEngine::DirtyBackground \o backgroundBrush() - \row \o QPaintEngine::DirtyBackgroundMode \o backgroundMode() - \row \o QPaintEngine::DirtyBrush \o brush() - \row \o QPaintEngine::DirtyBrushOrigin \o brushOrigin() - \row \o QPaintEngine::DirtyClipRegion \e or QPaintEngine::DirtyClipPath - \o clipOperation() - \row \o QPaintEngine::DirtyClipPath \o clipPath() - \row \o QPaintEngine::DirtyClipRegion \o clipRegion() - \row \o QPaintEngine::DirtyCompositionMode \o compositionMode() - \row \o QPaintEngine::DirtyFont \o font() - \row \o QPaintEngine::DirtyTransform \o transform() - \row \o QPaintEngine::DirtyClipEnabled \o isClipEnabled() - \row \o QPaintEngine::DirtyPen \o pen() - \row \o QPaintEngine::DirtyHints \o renderHints() + \header \li Property Flag \li Current Property Value + \row \li QPaintEngine::DirtyBackground \li backgroundBrush() + \row \li QPaintEngine::DirtyBackgroundMode \li backgroundMode() + \row \li QPaintEngine::DirtyBrush \li brush() + \row \li QPaintEngine::DirtyBrushOrigin \li brushOrigin() + \row \li QPaintEngine::DirtyClipRegion \e or QPaintEngine::DirtyClipPath + \li clipOperation() + \row \li QPaintEngine::DirtyClipPath \li clipPath() + \row \li QPaintEngine::DirtyClipRegion \li clipRegion() + \row \li QPaintEngine::DirtyCompositionMode \li compositionMode() + \row \li QPaintEngine::DirtyFont \li font() + \row \li QPaintEngine::DirtyTransform \li transform() + \row \li QPaintEngine::DirtyClipEnabled \li isClipEnabled() + \row \li QPaintEngine::DirtyPen \li pen() + \row \li QPaintEngine::DirtyHints \li renderHints() \endtable The QPaintEngineState class also provide the painter() function @@ -8455,7 +8111,7 @@ qreal QPaintEngineState::opacity() const If \a combine is true, the specified \a transform is combined with the current matrix; otherwise it replaces the current matrix. - \sa transform() setWorldTransform() + \sa transform(), setWorldTransform() */ void QPainter::setTransform(const QTransform &transform, bool combine ) @@ -8657,6 +8313,7 @@ void QPainter::drawPixmapFragments(const PixmapFragment *fragments, int fragment /*! \since 4.7 \class QPainter::PixmapFragment + \inmodule QtGui \brief This class is used in conjunction with the QPainter::drawPixmapFragments() function to specify how a pixmap, or @@ -8765,252 +8422,4 @@ void qt_draw_helper(QPainterPrivate *p, const QPainterPath &path, QPainterPrivat p->draw_helper(path, operation); } -/*! \fn Display *QPaintDevice::x11Display() const - Use QX11Info::display() instead. - - \oldcode - Display *display = widget->x11Display(); - \newcode - Display *display = QX11Info::display(); - \endcode - - \sa QWidget::x11Info(), QX11Info::display() -*/ - -/*! \fn int QPaintDevice::x11Screen() const - Use QX11Info::screen() instead. - - \oldcode - int screen = widget->x11Screen(); - \newcode - int screen = widget->x11Info().screen(); - \endcode - - \sa QWidget::x11Info(), QPixmap::x11Info() -*/ - -/*! \fn void *QPaintDevice::x11Visual() const - Use QX11Info::visual() instead. - - \oldcode - void *visual = widget->x11Visual(); - \newcode - void *visual = widget->x11Info().visual(); - \endcode - - \sa QWidget::x11Info(), QPixmap::x11Info() -*/ - -/*! \fn int QPaintDevice::x11Depth() const - Use QX11Info::depth() instead. - - \oldcode - int depth = widget->x11Depth(); - \newcode - int depth = widget->x11Info().depth(); - \endcode - - \sa QWidget::x11Info(), QPixmap::x11Info() -*/ - -/*! \fn int QPaintDevice::x11Cells() const - Use QX11Info::cells() instead. - - \oldcode - int cells = widget->x11Cells(); - \newcode - int cells = widget->x11Info().cells(); - \endcode - - \sa QWidget::x11Info(), QPixmap::x11Info() -*/ - -/*! \fn Qt::HANDLE QPaintDevice::x11Colormap() const - Use QX11Info::colormap() instead. - - \oldcode - unsigned long screen = widget->x11Colormap(); - \newcode - unsigned long screen = widget->x11Info().colormap(); - \endcode - - \sa QWidget::x11Info(), QPixmap::x11Info() -*/ - -/*! \fn bool QPaintDevice::x11DefaultColormap() const - Use QX11Info::defaultColormap() instead. - - \oldcode - bool isDefault = widget->x11DefaultColormap(); - \newcode - bool isDefault = widget->x11Info().defaultColormap(); - \endcode - - \sa QWidget::x11Info(), QPixmap::x11Info() -*/ - -/*! \fn bool QPaintDevice::x11DefaultVisual() const - Use QX11Info::defaultVisual() instead. - - \oldcode - bool isDefault = widget->x11DefaultVisual(); - \newcode - bool isDefault = widget->x11Info().defaultVisual(); - \endcode - - \sa QWidget::x11Info(), QPixmap::x11Info() -*/ - -/*! \fn void *QPaintDevice::x11AppVisual(int screen) - Use QX11Info::visual() instead. - - \oldcode - void *visual = QPaintDevice::x11AppVisual(screen); - \newcode - void *visual = qApp->x11Info(screen).visual(); - \endcode - - \sa QWidget::x11Info(), QPixmap::x11Info() -*/ - -/*! \fn Qt::HANDLE QPaintDevice::x11AppColormap(int screen) - Use QX11Info::colormap() instead. - - \oldcode - unsigned long colormap = QPaintDevice::x11AppColormap(screen); - \newcode - unsigned long colormap = qApp->x11Info(screen).colormap(); - \endcode - - \sa QWidget::x11Info(), QPixmap::x11Info() -*/ - -/*! \fn Display *QPaintDevice::x11AppDisplay() - Use QX11Info::display() instead. - - \oldcode - Display *display = QPaintDevice::x11AppDisplay(); - \newcode - Display *display = qApp->x11Info().display(); - \endcode - - \sa QWidget::x11Info(), QPixmap::x11Info() -*/ - -/*! \fn int QPaintDevice::x11AppScreen() - Use QX11Info::screen() instead. - - \oldcode - int screen = QPaintDevice::x11AppScreen(); - \newcode - int screen = qApp->x11Info().screen(); - \endcode - - \sa QWidget::x11Info(), QPixmap::x11Info() -*/ - -/*! \fn int QPaintDevice::x11AppDepth(int screen) - Use QX11Info::depth() instead. - - \oldcode - int depth = QPaintDevice::x11AppDepth(screen); - \newcode - int depth = qApp->x11Info(screen).depth(); - \endcode - - \sa QWidget::x11Info(), QPixmap::x11Info() -*/ - -/*! \fn int QPaintDevice::x11AppCells(int screen) - Use QX11Info::cells() instead. - - \oldcode - int cells = QPaintDevice::x11AppCells(screen); - \newcode - int cells = qApp->x11Info(screen).cells(); - \endcode - - \sa QWidget::x11Info(), QPixmap::x11Info() -*/ - -/*! \fn Qt::HANDLE QPaintDevice::x11AppRootWindow(int screen) - Use QX11Info::appRootWindow() instead. - - \oldcode - unsigned long window = QPaintDevice::x11AppRootWindow(screen); - \newcode - unsigned long window = qApp->x11Info(screen).appRootWindow(); - \endcode - - \sa QWidget::x11Info(), QPixmap::x11Info() -*/ - -/*! \fn bool QPaintDevice::x11AppDefaultColormap(int screen) - Use QX11Info::defaultColormap() instead. - - \oldcode - bool isDefault = QPaintDevice::x11AppDefaultColormap(screen); - \newcode - bool isDefault = qApp->x11Info(screen).defaultColormap(); - \endcode - - \sa QWidget::x11Info(), QPixmap::x11Info() -*/ - -/*! \fn bool QPaintDevice::x11AppDefaultVisual(int screen) - Use QX11Info::defaultVisual() instead. - - \oldcode - bool isDefault = QPaintDevice::x11AppDefaultVisual(screen); - \newcode - bool isDefault = qApp->x11Info(screen).defaultVisual(); - \endcode - - \sa QWidget::x11Info(), QPixmap::x11Info() -*/ - -/*! \fn void QPaintDevice::x11SetAppDpiX(int dpi, int screen) - Use QX11Info::setAppDpiX() instead. -*/ - -/*! \fn void QPaintDevice::x11SetAppDpiY(int dpi, int screen) - Use QX11Info::setAppDpiY() instead. -*/ - -/*! \fn int QPaintDevice::x11AppDpiX(int screen) - Use QX11Info::appDpiX() instead. - - \oldcode - bool isDefault = QPaintDevice::x11AppDpiX(screen); - \newcode - bool isDefault = qApp->x11Info(screen).appDpiX(); - \endcode - - \sa QWidget::x11Info(), QPixmap::x11Info() -*/ - -/*! \fn int QPaintDevice::x11AppDpiY(int screen) - Use QX11Info::appDpiY() instead. - - \oldcode - bool isDefault = QPaintDevice::x11AppDpiY(screen); - \newcode - bool isDefault = qApp->x11Info(screen).appDpiY(); - \endcode - - \sa QWidget::x11Info(), QPixmap::x11Info() -*/ - -/*! \fn HDC QPaintDevice::getDC() const - \internal -*/ - -/*! \fn void QPaintDevice::releaseDC(HDC) const - \internal -*/ - -/*! \fn QWSDisplay *QPaintDevice::qwsDisplay() - \internal -*/ - QT_END_NAMESPACE