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) +/