1 /*
2  * DQt - D bindings for the Qt Toolkit
3  *
4  * GNU Lesser General Public License Usage
5  * This file may be used under the terms of the GNU Lesser
6  * General Public License version 3 as published by the Free Software
7  * Foundation and appearing in the file LICENSE.LGPL3 included in the
8  * packaging of this file. Please review the following information to
9  * ensure the GNU Lesser General Public License version 3 requirements
10  * will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
11  */
12 module qt.gui.paintengine;
13 extern(C++):
14 
15 import qt.config;
16 import qt.core.flags;
17 import qt.core.global;
18 import qt.core.line;
19 import qt.core.namespace;
20 import qt.core.point;
21 import qt.core.rect;
22 import qt.core.scopedpointer;
23 import qt.core.size;
24 import qt.core.string;
25 import qt.core.typeinfo;
26 import qt.gui.brush;
27 import qt.gui.font;
28 import qt.gui.image;
29 import qt.gui.paintdevice;
30 import qt.gui.painter;
31 import qt.gui.painterpath;
32 import qt.gui.pen;
33 import qt.gui.pixmap;
34 import qt.gui.region;
35 import qt.gui.transform;
36 import qt.helpers;
37 
38 extern(C++, class) struct QPaintEnginePrivate;
39 struct QGlyphLayout;
40 extern(C++, class) struct QTextItemInt;
41 
42 /// Binding for C++ class [QTextItem](https://doc.qt.io/qt-6/qtextitem.html).
43 @Q_PRIMITIVE_TYPE extern(C++, class) struct /+ Q_GUI_EXPORT +/ QTextItem {
44 public:
45     enum RenderFlag {
46         RightToLeft = 0x1,
47         Overline = 0x10,
48         Underline = 0x20,
49         StrikeOut = 0x40,
50 
51         Dummy = 0xffffffff
52     }
53     /+ Q_DECLARE_FLAGS(RenderFlags, RenderFlag) +/
54 alias RenderFlags = QFlags!(RenderFlag);    qreal descent() const;
55     qreal ascent() const;
56     qreal width() const;
57 
58     RenderFlags renderFlags() const;
59     QString text() const;
60     QFont font() const;
61     mixin(CREATE_CONVENIENCE_WRAPPERS);
62 }
63 /+ Q_DECLARE_TYPEINFO(QTextItem, Q_PRIMITIVE_TYPE); +/
64 
65 
66 /// Binding for C++ class [QPaintEngine](https://doc.qt.io/qt-6/qpaintengine.html).
67 abstract class /+ Q_GUI_EXPORT +/ QPaintEngine
68 {
69 private:
70     /+ Q_DECLARE_PRIVATE(QPaintEngine) +/
71 public:
72     enum PaintEngineFeature {
73         PrimitiveTransform          = 0x00000001, // Can transform primitives brushes
74         PatternTransform            = 0x00000002, // Can transform pattern brushes
75         PixmapTransform             = 0x00000004, // Can transform pixmaps
76         PatternBrush                = 0x00000008, // Can fill with pixmaps and standard patterns
77         LinearGradientFill          = 0x00000010, // Can fill gradient areas
78         RadialGradientFill          = 0x00000020, // Can render radial gradients
79         ConicalGradientFill         = 0x00000040, // Can render conical gradients
80         AlphaBlend                  = 0x00000080, // Can do source over alpha blend
81         PorterDuff                  = 0x00000100, // Can do general porter duff compositions
82         PainterPaths                = 0x00000200, // Can fill, outline and clip paths
83         Antialiasing                = 0x00000400, // Can antialias lines
84         BrushStroke                 = 0x00000800, // Can render brush based pens
85         ConstantOpacity             = 0x00001000, // Can render at constant opacity
86         MaskedBrush                 = 0x00002000, // Can fill with textures that has an alpha channel or mask
87         PerspectiveTransform        = 0x00004000, // Can do perspective transformations
88         BlendModes                  = 0x00008000, // Can do extended Porter&Duff composition
89         ObjectBoundingModeGradients = 0x00010000, // Can do object bounding mode gradients
90         RasterOpModes               = 0x00020000, // Can do logical raster operations
91         PaintOutsidePaintEvent      = 0x20000000, // Engine is capable of painting outside paint events
92         /*                          0x10000000, // Used for emulating
93                                     QGradient::StretchToDevice,
94                                     defined in qpainter.cpp
95 
96                                     0x40000000, // Used internally for emulating opaque backgrounds
97         */
98 
99         AllFeatures               = 0xffffffff  // For convenience
100     }
101     /+ Q_DECLARE_FLAGS(PaintEngineFeatures, PaintEngineFeature) +/
102 alias PaintEngineFeatures = QFlags!(PaintEngineFeature);
103     enum DirtyFlag {
104         DirtyPen                = 0x0001,
105         DirtyBrush              = 0x0002,
106         DirtyBrushOrigin        = 0x0004,
107         DirtyFont               = 0x0008,
108         DirtyBackground         = 0x0010,
109         DirtyBackgroundMode     = 0x0020,
110         DirtyTransform          = 0x0040,
111         DirtyClipRegion         = 0x0080,
112         DirtyClipPath           = 0x0100,
113         DirtyHints              = 0x0200,
114         DirtyCompositionMode    = 0x0400,
115         DirtyClipEnabled        = 0x0800,
116         DirtyOpacity            = 0x1000,
117 
118         AllDirty                = 0xffff
119     }
120     /+ Q_DECLARE_FLAGS(DirtyFlags, DirtyFlag) +/
121 alias DirtyFlags = QFlags!(DirtyFlag);
122     enum PolygonDrawMode {
123         OddEvenMode,
124         WindingMode,
125         ConvexMode,
126         PolylineMode
127     }
128 
129     mixin(changeItaniumMangling(q{mangleConstructorBaseObject}, q{
130     /+ explicit +/this(PaintEngineFeatures features=PaintEngineFeatures());
131     }));
132     /+ virtual +/~this();
133 
134     final bool isActive() const { return (active) != 0; }
135     final void setActive(bool newState) { active = newState; }
136 
137     /+ virtual +/ abstract bool begin(QPaintDevice pdev);
138     /+ virtual +/ abstract bool end();
139 
140     /+ virtual +/ abstract void updateState(ref const(QPaintEngineState) state);
141 
142     /+ virtual +/ void drawRects(const(QRect)* rects, int rectCount);
143     /+ virtual +/ void drawRects(const(QRectF)* rects, int rectCount);
144 
145     /+ virtual +/ void drawLines(const(QLine)* lines, int lineCount);
146     /+ virtual +/ void drawLines(const(QLineF)* lines, int lineCount);
147 
148     /+ virtual +/ void drawEllipse(ref const(QRectF) r);
149     /+ virtual +/ void drawEllipse(ref const(QRect) r);
150 
151     /+ virtual +/ void drawPath(ref const(QPainterPath) path);
152 
153     /+ virtual +/ void drawPoints(const(QPointF)* points, int pointCount);
154     /+ virtual +/ void drawPoints(const(QPoint)* points, int pointCount);
155 
156     /+ virtual +/ void drawPolygon(const(QPointF)* points, int pointCount, PolygonDrawMode mode);
157     /+ virtual +/ void drawPolygon(const(QPoint)* points, int pointCount, PolygonDrawMode mode);
158 
159     /+ virtual +/ abstract void drawPixmap(ref const(QRectF) r, ref const(QPixmap) pm, ref const(QRectF) sr);
160     /+ virtual +/ void drawTextItem(ref const(QPointF) p, ref const(QTextItem) textItem);
161     /+ virtual +/ void drawTiledPixmap(ref const(QRectF) r, ref const(QPixmap) pixmap, ref const(QPointF) s);
162     /+ virtual +/ void drawImage(ref const(QRectF) r, ref const(QImage) pm, ref const(QRectF) sr,
163                                /+ Qt:: +/qt.core.namespace.ImageConversionFlags flags = /+ Qt:: +/qt.core.namespace.ImageConversionFlag.AutoColor);
164 
165     final void setPaintDevice(QPaintDevice device);
166     final QPaintDevice paintDevice() const;
167 
168     final void setSystemClip(ref const(QRegion) baseClip);
169     final QRegion systemClip() const;
170 
171     final void setSystemRect(ref const(QRect) rect);
172     final QRect systemRect() const;
173 
174 
175     /+ virtual +/ QPoint coordinateOffset() const;
176 
177     enum Type {
178         X11,
179         Windows,
180         QuickDraw, CoreGraphics, MacPrinter,
181         QWindowSystem,
182         OpenGL,
183         Picture,
184         SVG,
185         Raster,
186         Direct3D,
187         Pdf,
188         OpenVG,
189         OpenGL2,
190         PaintBuffer,
191         Blitter,
192         Direct2D,
193 
194         User = 50,    // first user type id
195         MaxUser = 100 // last user type id
196     }
197     /+ virtual +/ abstract Type type() const;
198 
199     pragma(inline, true) final void fix_neg_rect(int* x, int* y, int* w, int* h)
200     {
201         if (*w < 0) {
202             *w = -*w;
203             *x -= *w - 1;
204         }
205         if (*h < 0) {
206             *h = -*h;
207             *y -= *h - 1;
208         }
209     }
210 
211     pragma(inline, true) final bool testDirty(DirtyFlags df) {
212         (mixin(Q_ASSERT(q{QPaintEngine.state})));
213         return (state.dirtyFlags & df) != 0;
214     }
215     pragma(inline, true) final void setDirty(DirtyFlags df) {
216         (mixin(Q_ASSERT(q{QPaintEngine.state})));
217         state.dirtyFlags |= df;
218     }
219     pragma(inline, true) final void clearDirty(DirtyFlags df)
220     {
221         (mixin(Q_ASSERT(q{QPaintEngine.state})));
222         state.dirtyFlags &= ~static_cast!(uint)(df);
223     }
224 
225     final bool hasFeature(PaintEngineFeatures feature) const { return cast(bool)(gccaps & feature); }
226 
227     final QPainter* painter() const;
228 
229     final void syncState();
230     pragma(inline, true) final bool isExtended() const { return (extended) != 0; }
231 
232     /+ virtual +/ QPixmap createPixmap(QSize size);
233     /+ virtual +/ QPixmap createPixmapFromImage(QImage image, /+ Qt:: +/qt.core.namespace.ImageConversionFlags flags = /+ Qt:: +/qt.core.namespace.ImageConversionFlag.AutoColor);
234 
235 protected:
236     mixin(changeItaniumMangling(q{mangleConstructorBaseObject}, q{
237     this(ref QPaintEnginePrivate data, PaintEngineFeatures devcaps=PaintEngineFeatures());
238     }));
239 
240     QPaintEngineState* state;
241     PaintEngineFeatures gccaps;
242 
243     /+ uint active : 1; +/
244     ubyte bitfieldData_active;
245     uint active() const
246     {
247         return (bitfieldData_active >> 0) & 0x1;
248     }
249     uint active(uint value)
250     {
251         bitfieldData_active = (bitfieldData_active & ~0x1) | ((value & 0x1) << 0);
252         return value;
253     }
254     /+ uint selfDestruct : 1; +/
255     uint selfDestruct() const
256     {
257         return (bitfieldData_active >> 1) & 0x1;
258     }
259     uint selfDestruct(uint value)
260     {
261         bitfieldData_active = (bitfieldData_active & ~0x2) | ((value & 0x1) << 1);
262         return value;
263     }
264     /+ uint extended : 1; +/
265     uint extended() const
266     {
267         return (bitfieldData_active >> 2) & 0x1;
268     }
269     uint extended(uint value)
270     {
271         bitfieldData_active = (bitfieldData_active & ~0x4) | ((value & 0x1) << 2);
272         return value;
273     }
274 
275     QScopedPointer!(QPaintEnginePrivate) d_ptr;
276 
277 private:
278     final void setAutoDestruct(bool autoDestr) { selfDestruct = autoDestr; }
279     final bool autoDestruct() const { return (selfDestruct) != 0; }
280     /+ Q_DISABLE_COPY(QPaintEngine) +/
281 
282     /+ friend class QPainterReplayer; +/
283     /+ friend class QFontEngineBox; +/
284     /+ friend class QFontEngineMac; +/
285     /+ friend class QFontEngineWin; +/
286     /+ friend class QMacPrintEngine; +/
287     /+ friend class QMacPrintEnginePrivate; +/
288     /+ friend class QFontEngineQPF2; +/
289     /+ friend class QPainter; +/
290     /+ friend class QPainterPrivate; +/
291     /+ friend class QWidget; +/
292     /+ friend class QWidgetPrivate; +/
293     /+ friend class QWin32PaintEngine; +/
294     /+ friend class QWin32PaintEnginePrivate; +/
295     /+ friend class QMacCGContext; +/
296     /+ friend class QPreviewPaintEngine; +/
297     /+ friend class QX11GLPlatformPixmap; +/
298     mixin(CREATE_CONVENIENCE_WRAPPERS);
299 }
300 
301 
302 /// Binding for C++ class [QPaintEngineState](https://doc.qt.io/qt-6/qpaintenginestate.html).
303 extern(C++, class) struct /+ Q_GUI_EXPORT +/ QPaintEngineState
304 {
305 public:
306     QPaintEngine.DirtyFlags state() const { return dirtyFlags; }
307 
308     QPen pen() const;
309     QBrush brush() const;
310     QPointF brushOrigin() const;
311     QBrush backgroundBrush() const;
312     /+ Qt:: +/qt.core.namespace.BGMode backgroundMode() const;
313     QFont font() const;
314     QTransform transform() const;
315 
316     /+ Qt:: +/qt.core.namespace.ClipOperation clipOperation() const;
317     QRegion clipRegion() const;
318     QPainterPath clipPath() const;
319     bool isClipEnabled() const;
320 
321     QPainter.RenderHints renderHints() const;
322     QPainter.CompositionMode compositionMode() const;
323     qreal opacity() const;
324 
325     QPainter* painter() const;
326 
327     bool brushNeedsResolving() const;
328     bool penNeedsResolving() const;
329 
330 protected:
331     /+ friend class QPaintEngine; +/
332     /+ friend class QRasterPaintEngine; +/
333     /+ friend class QWidget; +/
334     /+ friend class QPainter; +/
335     /+ friend class QPainterPrivate; +/
336     /+ friend class QMacPrintEnginePrivate; +/
337 
338     QPaintEngine.DirtyFlags dirtyFlags;
339     mixin(CREATE_CONVENIENCE_WRAPPERS);
340 }
341 
342 //
343 // inline functions
344 //
345 /+pragma(inline, true) QFlags!(QTextItem.RenderFlags.enum_type) operator |(QTextItem.RenderFlags.enum_type f1, QTextItem.RenderFlags.enum_type f2)/+noexcept+/{return QFlags!(QTextItem.RenderFlags.enum_type)(f1)|f2;}+/
346 /+pragma(inline, true) QFlags!(QTextItem.RenderFlags.enum_type) operator |(QTextItem.RenderFlags.enum_type f1, QFlags!(QTextItem.RenderFlags.enum_type) f2)/+noexcept+/{return f2|f1;}+/
347 /+pragma(inline, true) QFlags!(QTextItem.RenderFlags.enum_type) operator &(QTextItem.RenderFlags.enum_type f1, QTextItem.RenderFlags.enum_type f2)/+noexcept+/{return QFlags!(QTextItem.RenderFlags.enum_type)(f1)&f2;}+/
348 /+pragma(inline, true) QFlags!(QTextItem.RenderFlags.enum_type) operator &(QTextItem.RenderFlags.enum_type f1, QFlags!(QTextItem.RenderFlags.enum_type) f2)/+noexcept+/{return f2&f1;}+/
349 /+pragma(inline, true) void operator +(QTextItem.RenderFlags.enum_type f1, QTextItem.RenderFlags.enum_type f2)/+noexcept+/;+/
350 /+pragma(inline, true) void operator +(QTextItem.RenderFlags.enum_type f1, QFlags!(QTextItem.RenderFlags.enum_type) f2)/+noexcept+/;+/
351 /+pragma(inline, true) void operator +(int f1, QFlags!(QTextItem.RenderFlags.enum_type) f2)/+noexcept+/;+/
352 /+pragma(inline, true) void operator -(QTextItem.RenderFlags.enum_type f1, QTextItem.RenderFlags.enum_type f2)/+noexcept+/;+/
353 /+pragma(inline, true) void operator -(QTextItem.RenderFlags.enum_type f1, QFlags!(QTextItem.RenderFlags.enum_type) f2)/+noexcept+/;+/
354 /+pragma(inline, true) void operator -(int f1, QFlags!(QTextItem.RenderFlags.enum_type) f2)/+noexcept+/;+/
355 /+pragma(inline, true) QIncompatibleFlag operator |(QTextItem.RenderFlags.enum_type f1, int f2)/+noexcept+/{return QIncompatibleFlag(int(f1)|f2);}+/
356 /+pragma(inline, true) void operator +(int f1, QTextItem.RenderFlags.enum_type f2)/+noexcept+/;+/
357 /+pragma(inline, true) void operator +(QTextItem.RenderFlags.enum_type f1, int f2)/+noexcept+/;+/
358 /+pragma(inline, true) void operator -(int f1, QTextItem.RenderFlags.enum_type f2)/+noexcept+/;+/
359 /+pragma(inline, true) void operator -(QTextItem.RenderFlags.enum_type f1, int f2)/+noexcept+/;+/
360 
361 /+ Q_DECLARE_OPERATORS_FOR_FLAGS(QTextItem::RenderFlags) +/
362 /+pragma(inline, true) QFlags!(QPaintEngine.PaintEngineFeatures.enum_type) operator |(QPaintEngine.PaintEngineFeatures.enum_type f1, QPaintEngine.PaintEngineFeatures.enum_type f2)/+noexcept+/{return QFlags!(QPaintEngine.PaintEngineFeatures.enum_type)(f1)|f2;}+/
363 /+pragma(inline, true) QFlags!(QPaintEngine.PaintEngineFeatures.enum_type) operator |(QPaintEngine.PaintEngineFeatures.enum_type f1, QFlags!(QPaintEngine.PaintEngineFeatures.enum_type) f2)/+noexcept+/{return f2|f1;}+/
364 /+pragma(inline, true) QFlags!(QPaintEngine.PaintEngineFeatures.enum_type) operator &(QPaintEngine.PaintEngineFeatures.enum_type f1, QPaintEngine.PaintEngineFeatures.enum_type f2)/+noexcept+/{return QFlags!(QPaintEngine.PaintEngineFeatures.enum_type)(f1)&f2;}+/
365 /+pragma(inline, true) QFlags!(QPaintEngine.PaintEngineFeatures.enum_type) operator &(QPaintEngine.PaintEngineFeatures.enum_type f1, QFlags!(QPaintEngine.PaintEngineFeatures.enum_type) f2)/+noexcept+/{return f2&f1;}+/
366 /+pragma(inline, true) void operator +(QPaintEngine.PaintEngineFeatures.enum_type f1, QPaintEngine.PaintEngineFeatures.enum_type f2)/+noexcept+/;+/
367 /+pragma(inline, true) void operator +(QPaintEngine.PaintEngineFeatures.enum_type f1, QFlags!(QPaintEngine.PaintEngineFeatures.enum_type) f2)/+noexcept+/;+/
368 /+pragma(inline, true) void operator +(int f1, QFlags!(QPaintEngine.PaintEngineFeatures.enum_type) f2)/+noexcept+/;+/
369 /+pragma(inline, true) void operator -(QPaintEngine.PaintEngineFeatures.enum_type f1, QPaintEngine.PaintEngineFeatures.enum_type f2)/+noexcept+/;+/
370 /+pragma(inline, true) void operator -(QPaintEngine.PaintEngineFeatures.enum_type f1, QFlags!(QPaintEngine.PaintEngineFeatures.enum_type) f2)/+noexcept+/;+/
371 /+pragma(inline, true) void operator -(int f1, QFlags!(QPaintEngine.PaintEngineFeatures.enum_type) f2)/+noexcept+/;+/
372 /+pragma(inline, true) QIncompatibleFlag operator |(QPaintEngine.PaintEngineFeatures.enum_type f1, int f2)/+noexcept+/{return QIncompatibleFlag(int(f1)|f2);}+/
373 /+pragma(inline, true) void operator +(int f1, QPaintEngine.PaintEngineFeatures.enum_type f2)/+noexcept+/;+/
374 /+pragma(inline, true) void operator +(QPaintEngine.PaintEngineFeatures.enum_type f1, int f2)/+noexcept+/;+/
375 /+pragma(inline, true) void operator -(int f1, QPaintEngine.PaintEngineFeatures.enum_type f2)/+noexcept+/;+/
376 /+pragma(inline, true) void operator -(QPaintEngine.PaintEngineFeatures.enum_type f1, int f2)/+noexcept+/;+/
377 /+ Q_DECLARE_OPERATORS_FOR_FLAGS(QPaintEngine::PaintEngineFeatures) +/
378 /+pragma(inline, true) QFlags!(QPaintEngine.DirtyFlags.enum_type) operator |(QPaintEngine.DirtyFlags.enum_type f1, QPaintEngine.DirtyFlags.enum_type f2)/+noexcept+/{return QFlags!(QPaintEngine.DirtyFlags.enum_type)(f1)|f2;}+/
379 /+pragma(inline, true) QFlags!(QPaintEngine.DirtyFlags.enum_type) operator |(QPaintEngine.DirtyFlags.enum_type f1, QFlags!(QPaintEngine.DirtyFlags.enum_type) f2)/+noexcept+/{return f2|f1;}+/
380 /+pragma(inline, true) QFlags!(QPaintEngine.DirtyFlags.enum_type) operator &(QPaintEngine.DirtyFlags.enum_type f1, QPaintEngine.DirtyFlags.enum_type f2)/+noexcept+/{return QFlags!(QPaintEngine.DirtyFlags.enum_type)(f1)&f2;}+/
381 /+pragma(inline, true) QFlags!(QPaintEngine.DirtyFlags.enum_type) operator &(QPaintEngine.DirtyFlags.enum_type f1, QFlags!(QPaintEngine.DirtyFlags.enum_type) f2)/+noexcept+/{return f2&f1;}+/
382 /+pragma(inline, true) void operator +(QPaintEngine.DirtyFlags.enum_type f1, QPaintEngine.DirtyFlags.enum_type f2)/+noexcept+/;+/
383 /+pragma(inline, true) void operator +(QPaintEngine.DirtyFlags.enum_type f1, QFlags!(QPaintEngine.DirtyFlags.enum_type) f2)/+noexcept+/;+/
384 /+pragma(inline, true) void operator +(int f1, QFlags!(QPaintEngine.DirtyFlags.enum_type) f2)/+noexcept+/;+/
385 /+pragma(inline, true) void operator -(QPaintEngine.DirtyFlags.enum_type f1, QPaintEngine.DirtyFlags.enum_type f2)/+noexcept+/;+/
386 /+pragma(inline, true) void operator -(QPaintEngine.DirtyFlags.enum_type f1, QFlags!(QPaintEngine.DirtyFlags.enum_type) f2)/+noexcept+/;+/
387 /+pragma(inline, true) void operator -(int f1, QFlags!(QPaintEngine.DirtyFlags.enum_type) f2)/+noexcept+/;+/
388 /+pragma(inline, true) QIncompatibleFlag operator |(QPaintEngine.DirtyFlags.enum_type f1, int f2)/+noexcept+/{return QIncompatibleFlag(int(f1)|f2);}+/
389 /+pragma(inline, true) void operator +(int f1, QPaintEngine.DirtyFlags.enum_type f2)/+noexcept+/;+/
390 /+pragma(inline, true) void operator +(QPaintEngine.DirtyFlags.enum_type f1, int f2)/+noexcept+/;+/
391 /+pragma(inline, true) void operator -(int f1, QPaintEngine.DirtyFlags.enum_type f2)/+noexcept+/;+/
392 /+pragma(inline, true) void operator -(QPaintEngine.DirtyFlags.enum_type f1, int f2)/+noexcept+/;+/
393 /+ Q_DECLARE_OPERATORS_FOR_FLAGS(QPaintEngine::DirtyFlags) +/