4#ifndef QPAINTENGINE_RASTER_P_H
5#define QPAINTENGINE_RASTER_P_H
18#include <QtGui/private/qtguiglobal_p.h>
19#include "private/qpaintengineex_p.h"
20#include "QtGui/qpainterpath.h"
21#include "private/qdatabuffer_p.h"
22#include "private/qdrawhelper_p.h"
23#include "private/qpaintengine_p.h"
24#include "private/qrasterizer_p.h"
25#include "private/qstroker_p.h"
26#include "private/qpainter_p.h"
27#include "private/qtextureglyphcache_p.h"
28#include "private/qoutlinemapper_p.h"
92
93
96 Q_DECLARE_PRIVATE(QRasterPaintEngine)
99 QRasterPaintEngine(QPaintDevice *device);
100 ~QRasterPaintEngine();
101 bool begin(QPaintDevice *device) override;
104 void penChanged() override;
105 void brushChanged() override;
106 void brushOriginChanged() override;
107 void opacityChanged() override;
108 void compositionModeChanged() override;
109 void renderHintsChanged() override;
110 void transformChanged() override;
111 void clipEnabledChanged() override;
113 void setState(QPainterState *s) override;
114 QPainterState *createState(QPainterState *orig)
const override;
115 inline QRasterPaintEngineState *state() {
116 return static_cast<QRasterPaintEngineState *>(QPaintEngineEx::state());
118 inline const QRasterPaintEngineState *state()
const {
119 return static_cast<
const QRasterPaintEngineState *>(QPaintEngineEx::state());
122 void updateBrush(
const QBrush &brush);
123 void updatePen(
const QPen &pen);
125 void updateMatrix(
const QTransform &matrix);
127 virtual void fillPath(
const QPainterPath &path, QSpanData *fillData);
128 virtual void fillPolygon(
const QPointF *points,
int pointCount, PolygonDrawMode mode);
130 void drawPolygon(
const QPointF *points,
int pointCount, PolygonDrawMode mode) override;
131 void drawPolygon(
const QPoint *points,
int pointCount, PolygonDrawMode mode) override;
133 void drawEllipse(
const QRectF &rect) override;
135 void fillRect(
const QRectF &rect,
const QBrush &brush) override;
136 void fillRect(
const QRectF &rect,
const QColor &color) override;
138 void drawRects(
const QRect *rects,
int rectCount) override;
139 void drawRects(
const QRectF *rects,
int rectCount) override;
141 void drawPixmap(
const QPointF &p,
const QPixmap &pm) override;
142 void drawPixmap(
const QRectF &r,
const QPixmap &pm,
const QRectF &sr) override;
143 void drawImage(
const QPointF &p,
const QImage &img) override;
144 void drawImage(
const QRectF &r,
const QImage &pm,
const QRectF &sr,
145 Qt::ImageConversionFlags flags = Qt::AutoColor) override;
146 void drawTiledPixmap(
const QRectF &r,
const QPixmap &pm,
const QPointF &sr) override;
147 void drawTextItem(
const QPointF &p,
const QTextItem &textItem) override;
149 void drawLines(
const QLine *line,
int lineCount) override;
150 void drawLines(
const QLineF *line,
int lineCount) override;
152 void drawPoints(
const QPointF *points,
int pointCount) override;
153 void drawPoints(
const QPoint *points,
int pointCount) override;
155 void stroke(
const QVectorPath &path,
const QPen &pen) override;
156 void fill(
const QVectorPath &path,
const QBrush &brush) override;
158 void clip(
const QVectorPath &path, Qt::ClipOperation op) override;
159 void clip(
const QRect &rect, Qt::ClipOperation op) override;
160 void clip(
const QRegion ®ion, Qt::ClipOperation op) override;
161 inline const QClipData *clipData()
const;
163 void drawStaticTextItem(QStaticTextItem *textItem) override;
164 virtual bool drawCachedGlyphs(
int numGlyphs,
const glyph_t *glyphs,
const QFixedPoint *positions,
165 QFontEngine *fontEngine);
171 ClipType clipType()
const;
172 QRectF clipBoundingRect()
const;
177 void releaseDC(HDC hdc)
const;
178 static bool clearTypeFontsEnabled();
181 QRasterBuffer *rasterBuffer();
182 void alphaPenBlt(
const void* src,
int bpl,
int depth,
int rx,
int ry,
int w,
int h,
bool useGammaCorrection);
184 Type type()
const override {
return Raster; }
186 QPoint coordinateOffset()
const override;
188 bool requiresPretransformedGlyphPositions(QFontEngine *fontEngine,
const QTransform &m)
const override;
189 bool shouldDrawCachedGlyphs(QFontEngine *fontEngine,
const QTransform &m)
const override;
192 QRasterPaintEngine(QRasterPaintEnginePrivate &d, QPaintDevice *);
194 friend struct QSpanData;
195 friend class QBlitterPaintEngine;
196 friend class QBlitterPaintEnginePrivate;
199 void fillRect(
const QRectF &rect, QSpanData *data);
200 void drawBitmap(
const QPointF &pos,
const QImage &image, QSpanData *fill);
202 bool setClipRectInDeviceCoords(
const QRect &r, Qt::ClipOperation op);
204 QRect toNormalizedFillRect(
const QRectF &rect);
206 inline void ensureBrush(
const QBrush &brush) {
207 if (!qbrush_fast_equals(state()->lastBrush, brush) || state()->fillFlags)
210 inline void ensureBrush() { ensureBrush(state()->brush); }
212 inline void ensurePen(
const QPen &pen) {
213 if (!qpen_fast_equals(state()->lastPen, pen) || (pen.style() != Qt::NoPen && state()->strokeFlags))
216 inline void ensurePen() { ensurePen(state()->pen); }
218 void updateOutlineMapper();
219 inline void ensureOutlineMapper();
221 void updateRasterState();
222 inline void ensureRasterState() {
230
231
234 Q_DECLARE_PUBLIC(QRasterPaintEngine)
239 int *dashIndex, qreal *dashOffset,
bool *inDash);
240 void rasterize(QT_FT_Outline *outline, ProcessSpans callback, QSpanData *spanData,
QRasterBuffer *rasterBuffer);
241 void rasterize(QT_FT_Outline *outline, ProcessSpans callback,
void *userData,
QRasterBuffer *rasterBuffer);
242 void updateMatrixData(QSpanData *spanData,
const QBrush &brush,
const QTransform &brushMatrix);
247 void drawImage(
const QPointF &pt,
const QImage &img, SrcOverBlendFunc func,
248 const QRect &clip,
int alpha,
const QRect &sr = QRect());
249 void blitImage(
const QPointF &pt,
const QImage &img,
250 const QRect &clip,
const QRect &sr = QRect());
253 Q_Q(
const QRasterPaintEngine);
255 QTransform m(s->matrix);
256 m.translate(s->brushOrigin.x(), s->brushOrigin.y());
261 bool isUnclipped(
const QRect &rect,
int penWidth)
const;
262 bool isUnclipped(
const QRectF &rect,
int penWidth)
const;
273 bool canUseImageBlitting(QPainter::CompositionMode mode,
const QImage &image,
const QPointF &pt,
const QRectF &sr)
const;
279#if defined (Q_OS_WIN)
347 void appendSpan(
int x,
int length,
int y,
int coverage);
364 m_spans =
static_cast<QT_FT_Span*>(q_check_ptr(realloc(m_spans, allocated *
sizeof(QT_FT_Span))));
366 m_spans[count].x = x;
367 m_spans[count].len = length;
368 m_spans[count].y = y;
369 m_spans[count].coverage = coverage;
381 m_spans =
static_cast<QT_FT_Span*>(q_check_ptr(realloc(m_spans, allocated *
sizeof(QT_FT_Span))));
383 memcpy(m_spans+count, s, num*
sizeof(QT_FT_Span));
388
389
401 uchar *
scanLine(
int y) { Q_ASSERT(y>=0); Q_ASSERT(y<m_height);
return m_buffer + y * bytes_per_line; }
403 int width()
const {
return m_width; }
408 int stride() {
return static_cast<
int>(bytes_per_line /
sizeof(T)); }
424 qsizetype bytes_per_line;
429inline void QRasterPaintEngine::ensureOutlineMapper() {
430 if (d_func()->outlinemapper_xform_dirty)
431 updateOutlineMapper();
435 Q_Q(
const QRasterPaintEngine);
436 if (q->state() && q->state()->clip && q->state()->clip->enabled)
437 return q->state()->clip;
438 return baseClip.data();
441inline const QClipData *QRasterPaintEngine::clipData()
const {
442 Q_D(
const QRasterPaintEngine);
443 if (state() && state()->clip && state()->clip->enabled)
444 return state()->clip;
445 return d->baseClip.data();
void appendSpan(int x, int length, int y, int coverage)
void appendSpans(const QT_FT_Span *s, int num)
void setClipRegion(const QRegion ®ion)
void setClipRect(const QRect &rect)
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)
bool monoDestinationWithClut
QImage::Format prepare(QImage *image)
QPainter::CompositionMode compositionMode
qsizetype bytesPerLine() const
QImage colorizeBitmap(const QImage &image, const QColor &color)
int bytesPerPixel() const
QSpanData image_filler_xform
bool isUnclipped_normalized(const QRect &rect) const
Returns true if the rectangle is completely within the current clip state of the paint engine.
QTransform brushMatrix() const
QScopedPointer< QT_FT_Raster > grayRaster
void recalculateFastImages()
uint outlinemapper_xform_dirty
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
QSpanData solid_color_filler
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 systemStateChanged() override
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
QRect deviceRectUnclipped
ProcessSpans getPenFunc(const QRectF &rect, const QSpanData *data) const
QScopedPointer< QRasterizer > rasterizer
~QRasterPaintEngineState()
QRasterPaintEngineState(const QRasterPaintEngineState &other)
QRasterPaintEngineState()
The QRasterPaintEngine class enables hardware acceleration of painting operations in Qt for Embedded ...
QRectVectorPath(const QRect &r)
void QT_MANGLE_NAMESPACE qt_startup_hook()
static const qreal Q_MM_PER_INCH
QRect qt_mapFillRect(const QRectF &rect, const QTransform &xf)
static QT_BEGIN_NAMESPACE const qreal Q_PI
QT_BEGIN_NAMESPACE constexpr int QT_RASTER_COORD_LIMIT
@ 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)
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)
Qt::ClipOperation operation
QRgba64 buffer64[GRADIENT_STOPTABLE_SIZE]
QRgb buffer32[GRADIENT_STOPTABLE_SIZE]
CacheInfo(QGradientStops s, int op, QGradient::InterpolationMode mode)
QGradient::InterpolationMode interpolationMode