Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qpaintengine_raster_p.h
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
5#ifndef QPAINTENGINE_RASTER_P_H
6#define QPAINTENGINE_RASTER_P_H
7
8//
9// W A R N I N G
10// -------------
11//
12// This file is not part of the Qt API. It exists for the convenience
13// of other Qt classes. This header file may change from version to
14// version without notice, or even be removed.
15//
16// We mean it.
17//
18
19#include <QtGui/private/qtguiglobal_p.h>
20#include "private/qpaintengineex_p.h"
21#include "QtGui/qpainterpath.h"
22#include "private/qdatabuffer_p.h"
23#include "private/qdrawhelper_p.h"
24#include "private/qpaintengine_p.h"
25#include "private/qrasterizer_p.h"
26#include "private/qstroker_p.h"
27#include "private/qpainter_p.h"
28#include "private/qtextureglyphcache_p.h"
29#include "private/qoutlinemapper_p.h"
30
31#include <stdlib.h>
32
33QT_BEGIN_NAMESPACE
34
35class QOutlineMapper;
37class QRasterBuffer;
38class QClipData;
39
41{
42public:
46
47
48 QPen lastPen;
52
56
59
61
63// QRect clipRect;
64// QRegion clipRegion;
65
66// QPainter::RenderHints hints;
67// QPainter::CompositionMode compositionMode;
68
69 uint dirty;
70
71 struct Flags {
72 uint has_clip_ownership : 1; // should delete the clip member..
73 uint fast_pen : 1; // cosmetic 1-width pens, using midpoint drawlines
74 uint non_complex_pen : 1; // can use rasterizer, rather than stroker
75 uint antialiased : 1;
76 uint bilinear : 1;
77 uint fast_text : 1;
78 uint tx_noshear : 1;
79 uint fast_images : 1;
81 };
82
83 union {
86 };
87};
88
89
90
91
92/*******************************************************************************
93 * QRasterPaintEngine
94 */
95class Q_GUI_EXPORT QRasterPaintEngine : public QPaintEngineEx
96{
97 Q_DECLARE_PRIVATE(QRasterPaintEngine)
98public:
99
100 QRasterPaintEngine(QPaintDevice *device);
101 ~QRasterPaintEngine();
102 bool begin(QPaintDevice *device) override;
103 bool end() override;
104
105 void penChanged() override;
106 void brushChanged() override;
107 void brushOriginChanged() override;
108 void opacityChanged() override;
109 void compositionModeChanged() override;
110 void renderHintsChanged() override;
111 void transformChanged() override;
112 void clipEnabledChanged() override;
113
114 void setState(QPainterState *s) override;
115 QPainterState *createState(QPainterState *orig) const override;
116 inline QRasterPaintEngineState *state() {
117 return static_cast<QRasterPaintEngineState *>(QPaintEngineEx::state());
118 }
119 inline const QRasterPaintEngineState *state() const {
120 return static_cast<const QRasterPaintEngineState *>(QPaintEngineEx::state());
121 }
122
123 void updateBrush(const QBrush &brush);
124 void updatePen(const QPen &pen);
125
126 void updateMatrix(const QTransform &matrix);
127
128 virtual void fillPath(const QPainterPath &path, QSpanData *fillData);
129 virtual void fillPolygon(const QPointF *points, int pointCount, PolygonDrawMode mode);
130
131 void drawPolygon(const QPointF *points, int pointCount, PolygonDrawMode mode) override;
132 void drawPolygon(const QPoint *points, int pointCount, PolygonDrawMode mode) override;
133
134 void drawEllipse(const QRectF &rect) override;
135
136 void fillRect(const QRectF &rect, const QBrush &brush) override;
137 void fillRect(const QRectF &rect, const QColor &color) override;
138
139 void drawRects(const QRect *rects, int rectCount) override;
140 void drawRects(const QRectF *rects, int rectCount) override;
141
142 void drawPixmap(const QPointF &p, const QPixmap &pm) override;
143 void drawPixmap(const QRectF &r, const QPixmap &pm, const QRectF &sr) override;
144 void drawImage(const QPointF &p, const QImage &img) override;
145 void drawImage(const QRectF &r, const QImage &pm, const QRectF &sr,
146 Qt::ImageConversionFlags flags = Qt::AutoColor) override;
147 void drawTiledPixmap(const QRectF &r, const QPixmap &pm, const QPointF &sr) override;
148 void drawTextItem(const QPointF &p, const QTextItem &textItem) override;
149
150 void drawLines(const QLine *line, int lineCount) override;
151 void drawLines(const QLineF *line, int lineCount) override;
152
153 void drawPoints(const QPointF *points, int pointCount) override;
154 void drawPoints(const QPoint *points, int pointCount) override;
155
156 void stroke(const QVectorPath &path, const QPen &pen) override;
157 void fill(const QVectorPath &path, const QBrush &brush) override;
158
159 void clip(const QVectorPath &path, Qt::ClipOperation op) override;
160 void clip(const QRect &rect, Qt::ClipOperation op) override;
161 void clip(const QRegion &region, Qt::ClipOperation op) override;
162 inline const QClipData *clipData() const;
163
164 void drawStaticTextItem(QStaticTextItem *textItem) override;
165 virtual bool drawCachedGlyphs(int numGlyphs, const glyph_t *glyphs, const QFixedPoint *positions,
166 QFontEngine *fontEngine);
167
168 enum ClipType {
169 RectClip,
170 ComplexClip
171 };
172 ClipType clipType() const;
173 QRectF clipBoundingRect() const;
174
175#ifdef Q_OS_WIN
176 void setDC(HDC hdc);
177 HDC getDC() const;
178 void releaseDC(HDC hdc) const;
179 static bool clearTypeFontsEnabled();
180#endif
181
182 QRasterBuffer *rasterBuffer();
183 void alphaPenBlt(const void* src, int bpl, int depth, int rx,int ry,int w,int h, bool useGammaCorrection);
184
185 Type type() const override { return Raster; }
186
187 QPoint coordinateOffset() const override;
188
189 bool requiresPretransformedGlyphPositions(QFontEngine *fontEngine, const QTransform &m) const override;
190 bool shouldDrawCachedGlyphs(QFontEngine *fontEngine, const QTransform &m) const override;
191
192protected:
193 QRasterPaintEngine(QRasterPaintEnginePrivate &d, QPaintDevice *);
194private:
195 friend struct QSpanData;
196 friend class QBlitterPaintEngine;
197 friend class QBlitterPaintEnginePrivate;
198 void init();
199
200 void fillRect(const QRectF &rect, QSpanData *data);
201 void drawBitmap(const QPointF &pos, const QImage &image, QSpanData *fill);
202
203 bool setClipRectInDeviceCoords(const QRect &r, Qt::ClipOperation op);
204
205 QRect toNormalizedFillRect(const QRectF &rect);
206
207 inline void ensureBrush(const QBrush &brush) {
208 if (!qbrush_fast_equals(state()->lastBrush, brush) || state()->fillFlags)
209 updateBrush(brush);
210 }
211 inline void ensureBrush() { ensureBrush(state()->brush); }
212
213 inline void ensurePen(const QPen &pen) {
214 if (!qpen_fast_equals(state()->lastPen, pen) || (pen.style() != Qt::NoPen && state()->strokeFlags))
215 updatePen(pen);
216 }
217 inline void ensurePen() { ensurePen(state()->pen); }
218
219 void updateOutlineMapper();
220 inline void ensureOutlineMapper();
221
222 void updateRasterState();
223 inline void ensureRasterState() {
224 if (state()->dirty)
225 updateRasterState();
226 }
227};
228
229
230/*******************************************************************************
231 * QRasterPaintEnginePrivate
232 */
234{
235 Q_DECLARE_PUBLIC(QRasterPaintEngine)
236public:
238
239 void rasterizeLine_dashed(QLineF line, qreal width,
240 int *dashIndex, qreal *dashOffset, bool *inDash);
241 void rasterize(QT_FT_Outline *outline, ProcessSpans callback, QSpanData *spanData, QRasterBuffer *rasterBuffer);
242 void rasterize(QT_FT_Outline *outline, ProcessSpans callback, void *userData, QRasterBuffer *rasterBuffer);
243 void updateMatrixData(QSpanData *spanData, const QBrush &brush, const QTransform &brushMatrix);
244 void updateClipping();
245
247
248 void drawImage(const QPointF &pt, const QImage &img, SrcOverBlendFunc func,
249 const QRect &clip, int alpha, const QRect &sr = QRect());
250 void blitImage(const QPointF &pt, const QImage &img,
251 const QRect &clip, const QRect &sr = QRect());
252
253 QTransform brushMatrix() const {
254 Q_Q(const QRasterPaintEngine);
255 const QRasterPaintEngineState *s = q->state();
256 QTransform m(s->matrix);
257 m.translate(s->brushOrigin.x(), s->brushOrigin.y());
258 return m;
259 }
260
261 bool isUnclipped_normalized(const QRect &rect) const;
262 bool isUnclipped(const QRect &rect, int penWidth) const;
263 bool isUnclipped(const QRectF &rect, int penWidth) const;
264 ProcessSpans getPenFunc(const QRectF &rect, const QSpanData *data) const;
265 ProcessSpans getBrushFunc(const QRect &rect, const QSpanData *data) const;
266 ProcessSpans getBrushFunc(const QRectF &rect, const QSpanData *data) const;
267
268 inline const QClipData *clip() const;
269
270 void initializeRasterizer(QSpanData *data);
271
273 bool canUseFastImageBlending(QPainter::CompositionMode mode, const QImage &image) const;
274 bool canUseImageBlitting(QPainter::CompositionMode mode, const QImage &image, const QPointF &pt, const QRectF &sr) const;
275
279
280#if defined (Q_OS_WIN)
281 HDC hdc;
282#endif
283
286
289
291
296
297
299
301
303
304 uint mono_surface : 1;
306
308};
309
310
312public:
313 QClipData(int height);
314 ~QClipData();
315
317 struct ClipLine {
318 int count;
320 } *m_clipLines;
321
322 void initialize();
323
324 inline ClipLine *clipLines() {
325 if (!m_clipLines)
327 return m_clipLines;
328 }
329
330 inline QT_FT_Span *spans() {
331 if (!m_spans)
333 return m_spans;
334 }
335
337 int count;
340
342 QRegion clipRegion;
343
344 uint enabled : 1;
345 uint hasRectClip : 1;
347
348 void appendSpan(int x, int length, int y, int coverage);
349 void appendSpans(const QT_FT_Span *s, int num);
350
351 // ### Should optimize and actually kill the QSpans if the rect is
352 // ### a subset of The current region. Thus the "fast" clipspan
353 // ### callback can be used
354 void setClipRect(const QRect &rect);
355 void setClipRegion(const QRegion &region);
356 void fixup();
357};
358
359inline void QClipData::appendSpan(int x, int length, int y, int coverage)
360{
361 Q_ASSERT(m_spans); // initialize() has to be called prior to adding spans..
362
363 if (count == allocated) {
364 allocated *= 2;
365 m_spans = static_cast<QT_FT_Span*>(q_check_ptr(realloc(m_spans, allocated * sizeof(QT_FT_Span))));
366 }
367 m_spans[count].x = x;
368 m_spans[count].len = length;
369 m_spans[count].y = y;
370 m_spans[count].coverage = coverage;
371 ++count;
372}
373
374inline void QClipData::appendSpans(const QT_FT_Span *s, int num)
375{
376 Q_ASSERT(m_spans);
377
378 if (count + num > allocated) {
379 do {
380 allocated *= 2;
381 } while (count + num > allocated);
382 m_spans = static_cast<QT_FT_Span*>(q_check_ptr(realloc(m_spans, allocated * sizeof(QT_FT_Span))));
383 }
384 memcpy(m_spans+count, s, num*sizeof(QT_FT_Span));
385 count += num;
386}
387
388/*******************************************************************************
389 * QRasterBuffer
390 */
392{
393public:
394 QRasterBuffer() : m_width(0), m_height(0), m_buffer(nullptr) { init(); }
395
396 ~QRasterBuffer();
397
398 void init();
399
400 QImage::Format prepare(QImage *image);
401
402 uchar *scanLine(int y) { Q_ASSERT(y>=0); Q_ASSERT(y<m_height); return m_buffer + y * bytes_per_line; }
403
404 int width() const { return m_width; }
405 int height() const { return m_height; }
406 qsizetype bytesPerLine() const { return bytes_per_line; }
407 int bytesPerPixel() const { return bytes_per_pixel; }
408 template<typename T>
409 int stride() { return static_cast<int>(bytes_per_line / sizeof(T)); }
410
411 uchar *buffer() const { return m_buffer; }
412
416
420 QImage colorizeBitmap(const QImage &image, const QColor &color);
421
422private:
423 int m_width;
424 int m_height;
425 qsizetype bytes_per_line;
426 int bytes_per_pixel;
427 uchar *m_buffer;
428};
429
430inline void QRasterPaintEngine::ensureOutlineMapper() {
431 if (d_func()->outlinemapper_xform_dirty)
432 updateOutlineMapper();
433}
434
436 Q_Q(const QRasterPaintEngine);
437 if (q->state() && q->state()->clip && q->state()->clip->enabled)
438 return q->state()->clip;
439 return baseClip.data();
440}
441
442inline const QClipData *QRasterPaintEngine::clipData() const {
443 Q_D(const QRasterPaintEngine);
444 if (state() && state()->clip && state()->clip->enabled)
445 return state()->clip;
446 return d->baseClip.data();
447}
448
449QT_END_NAMESPACE
450#endif // QPAINTENGINE_RASTER_P_H
ClipLine * clipLines()
QClipData(int height)
void appendSpan(int x, int length, int y, int coverage)
void appendSpans(const QT_FT_Span *s, int num)
void setClipRegion(const QRegion &region)
void setClipRect(const QRect &rect)
QT_FT_Span * spans()
QT_FT_Span * m_spans
void generateGradientColorTable(const QGradient &g, QRgba64 *colorTable, int size, int opacity) const
QGradientColorTableHash cache
std::shared_ptr< const CacheInfo > addCacheElement(quint64 hash_val, const QGradient &gradient, int opacity)
std::shared_ptr< const CacheInfo > getBuffer(const QGradient &gradient, int opacity)
\inmodule QtGui
Definition qimage.h:37
QImage::Format prepare(QImage *image)
QPainter::CompositionMode compositionMode
qsizetype bytesPerLine() const
QImage::Format format
QImage colorizeBitmap(const QImage &image, const QColor &color)
uchar * scanLine(int y)
uchar * buffer() const
bool isUnclipped_normalized(const QRect &rect) const
QScopedPointer< QT_FT_Raster > grayRaster
void initializeRasterizer(QSpanData *data)
ProcessSpans getBrushFunc(const QRect &rect, const QSpanData *data) const
void rasterize(QT_FT_Outline *outline, ProcessSpans callback, void *userData, QRasterBuffer *rasterBuffer)
QScopedPointer< QOutlineMapper > outlineMapper
QDataBuffer< QLineF > cachedLines
bool canUseImageBlitting(QPainter::CompositionMode mode, const QImage &image, const QPointF &pt, const QRectF &sr) const
bool canUseFastImageBlending(QPainter::CompositionMode mode, const QImage &image) const
void drawImage(const QPointF &pt, const QImage &img, SrcOverBlendFunc func, const QRect &clip, int alpha, const QRect &sr=QRect())
bool isUnclipped(const QRect &rect, int penWidth) const
QScopedPointer< QDashStroker > dashStroker
void rasterizeLine_dashed(QLineF line, qreal width, int *dashIndex, qreal *dashOffset, bool *inDash)
QScopedPointer< QClipData > baseClip
void blitImage(const QPointF &pt, const QImage &img, const QRect &clip, const QRect &sr=QRect())
QFontEngine::GlyphFormat glyphCacheFormat
const QClipData * clip() const
void updateMatrixData(QSpanData *spanData, const QBrush &brush, const QTransform &brushMatrix)
void rasterize(QT_FT_Outline *outline, ProcessSpans callback, QSpanData *spanData, QRasterBuffer *rasterBuffer)
QScopedPointer< QRasterBuffer > rasterBuffer
ProcessSpans getPenFunc(const QRectF &rect, const QSpanData *data) const
QScopedPointer< QRasterizer > rasterizer
QRasterPaintEngineState(const QRasterPaintEngineState &other)
The QRasterPaintEngine class enables hardware acceleration of painting operations in Qt for Embedded ...
QRectVectorPath(const QRect &r)
void set(const QRect &r)
Combined button and popup list for selecting options.
void QT_MANGLE_NAMESPACE qt_startup_hook()
#define M_PI
Definition qmath.h:201
static const qreal Q_MM_PER_INCH
Definition qmath_p.h:26
QRect qt_mapFillRect(const QRectF &rect, const QTransform &xf)
Definition qmath_p.h:28
static QT_BEGIN_NAMESPACE const qreal Q_PI
Definition qmath_p.h:25
QT_BEGIN_NAMESPACE constexpr int QT_RASTER_COORD_LIMIT
@ LineDrawClipped
@ LineDrawIncludeLastPixel
static int fast_ceil_positive(const qreal &v)
static void qt_span_fill_clipRect(int count, const QT_FT_Span *spans, void *userData)
static void qt_ft_outline_line_to(qfixed x, qfixed y, void *data)
Q_GUI_EXPORT bool qt_scaleForTransform(const QTransform &transform, qreal *scale)
static void qrasterpaintengine_dirty_clip(QRasterPaintEnginePrivate *d, QRasterPaintEngineState *s)
static void drawEllipse_midpoint_i(const QRect &rect, const QRect &clip, ProcessSpans pen_func, ProcessSpans brush_func, QSpanData *pen_data, QSpanData *brush_data)
static void fillRect_normalized(const QRect &r, QSpanData *data, QRasterPaintEnginePrivate *pe)
static void qrasterpaintengine_state_setNoClip(QRasterPaintEngineState *s)
static const QT_FT_Span * qt_intersect_spans(const QClipData *clip, int *currentClip, const QT_FT_Span *spans, const QT_FT_Span *end, QT_FT_Span **outSpans, int available)
QRectF qt_mapRect_non_normalizing(const QRectF &r, const QTransform &t)
static void qt_span_clip(int count, const QT_FT_Span *spans, void *userData)
static void qt_ft_outline_move_to(qfixed x, qfixed y, void *data)
static VisibleGlyphRange visibleGlyphRange(const QRectF &clip, QFontEngine *fontEngine, glyph_t *glyphs, QFixedPoint *positions, int numGlyphs)
static bool monoVal(const uchar *s, int x)
#define QT_FAST_SPANS
static uchar * alignAddress(uchar *address, quintptr alignmentMask)
static bool splitPolygon(const QPointF *points, int pointCount, QList< QPointF > *upper, QList< QPointF > *lower)
static void drawEllipsePoints(int x, int y, int length, const QRect &rect, const QRect &clip, ProcessSpans pen_func, ProcessSpans brush_func, QSpanData *pen_data, QSpanData *brush_data)
static void qt_span_fill_clipped(int count, const QT_FT_Span *spans, void *userData)
static QColor qPremultiplyWithExtraAlpha(const QColor &c, int alpha)
static void qt_ft_outline_cubic_to(qfixed c1x, qfixed c1y, qfixed c2x, qfixed c2y, qfixed ex, qfixed ey, void *data)
#define int_dim(pos, dim)
static const QRect toAlignedRect_positive(const QRectF &rect)
static bool isAbove(const QPointF *a, const QPointF *b)
static int qt_intersect_spans(QT_FT_Span *&spans, int numSpans, const QRect &clip)
QClipData * newClip
Qt::ClipOperation operation
QClipData * oldClip
QRgba64 buffer64[GRADIENT_STOPTABLE_SIZE]
QRgb buffer32[GRADIENT_STOPTABLE_SIZE]
CacheInfo(QGradientStops s, int op, QGradient::InterpolationMode mode)
QGradient::InterpolationMode interpolationMode