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.pixelformat;
13 extern(C++):
14 
15 import qt.config;
16 import qt.core.global;
17 import qt.core.typeinfo;
18 import qt.helpers;
19 
20 /// Binding for C++ class [QPixelFormat](https://doc.qt.io/qt-6/qpixelformat.html).
21 @Q_PRIMITIVE_TYPE extern(C++, class) struct QPixelFormat
22 {
23 private:
24     // QPixelFormat basically is a glorified quint64, split into several fields.
25     // We could use bit-fields, but GCC at least generates horrible, horrible code for them,
26     // so we do the bit-twiddling ourselves.
27     enum FieldWidth {
28         ModelFieldWidth = 4,
29         FirstFieldWidth = 6,
30         SecondFieldWidth = FieldWidth.FirstFieldWidth,
31         ThirdFieldWidth = FieldWidth.FirstFieldWidth,
32         FourthFieldWidth = FieldWidth.FirstFieldWidth,
33         FifthFieldWidth = FieldWidth.FirstFieldWidth,
34         AlphaFieldWidth = FieldWidth.FirstFieldWidth,
35         AlphaUsageFieldWidth = 1,
36         AlphaPositionFieldWidth = 1,
37         PremulFieldWidth = 1,
38         TypeInterpretationFieldWidth = 4,
39         ByteOrderFieldWidth = 2,
40         SubEnumFieldWidth = 6,
41         UnusedFieldWidth = 9,
42 
43         TotalFieldWidthByWidths = FieldWidth.ModelFieldWidth + FieldWidth.FirstFieldWidth + FieldWidth.SecondFieldWidth + FieldWidth.ThirdFieldWidth +
44                                   FieldWidth.FourthFieldWidth + FieldWidth.FifthFieldWidth + FieldWidth.AlphaFieldWidth + FieldWidth.AlphaUsageFieldWidth +
45                                   FieldWidth.AlphaPositionFieldWidth + FieldWidth.PremulFieldWidth + FieldWidth.TypeInterpretationFieldWidth +
46                                   FieldWidth.ByteOrderFieldWidth + FieldWidth.SubEnumFieldWidth + FieldWidth.UnusedFieldWidth
47     }
48 
49     enum Field {
50         ModelField = 0,
51         // work around bug in old clang versions: when building webkit
52         // with XCode 4.6 and older this fails compilation, thus cast to int
53         FirstField = Field.ModelField + int(FieldWidth.ModelFieldWidth),
54         SecondField = Field.FirstField + int(FieldWidth.FirstFieldWidth),
55         ThirdField = Field.SecondField + int(FieldWidth.SecondFieldWidth),
56         FourthField = Field.ThirdField + int(FieldWidth.ThirdFieldWidth),
57         FifthField = Field.FourthField + int(FieldWidth.FourthFieldWidth),
58         AlphaField = Field.FifthField + int(FieldWidth.FifthFieldWidth),
59         AlphaUsageField = Field.AlphaField + int(FieldWidth.AlphaFieldWidth),
60         AlphaPositionField = Field.AlphaUsageField + int(FieldWidth.AlphaUsageFieldWidth),
61         PremulField = Field.AlphaPositionField + int(FieldWidth.AlphaPositionFieldWidth),
62         TypeInterpretationField = Field.PremulField + int(FieldWidth.PremulFieldWidth),
63         ByteOrderField = Field.TypeInterpretationField + int(FieldWidth.TypeInterpretationFieldWidth),
64         SubEnumField = Field.ByteOrderField + int(FieldWidth.ByteOrderFieldWidth),
65         UnusedField = Field.SubEnumField + int(FieldWidth.SubEnumFieldWidth),
66 
67         TotalFieldWidthByOffsets = Field.UnusedField + int(FieldWidth.UnusedFieldWidth)
68     }
69 
70     static assert(uint(FieldWidth.TotalFieldWidthByWidths) == uint(Field.TotalFieldWidthByOffsets));
71     static assert(uint(FieldWidth.TotalFieldWidthByWidths) == 8 * quint64.sizeof);
72 
73     pragma(inline, true) uchar get(Field offset, FieldWidth width) const/+ noexcept+/
74     { return cast(uchar)((data >> uint(offset)) & ((1uL << uint(width)) - 1uL)); }
75     pragma(inline, true) static quint64 set(Field offset, FieldWidth width, uchar value)
76     { return (quint64(value) & ((1uL << uint(width)) - 1uL)) << uint(offset); }
77 
78 public:
79     enum ColorModel {
80         RGB,
81         BGR,
82         Indexed,
83         Grayscale,
84         CMYK,
85         HSL,
86         HSV,
87         YUV,
88         Alpha
89     }
90 
91     enum AlphaUsage {
92         UsesAlpha,
93         IgnoresAlpha
94     }
95 
96     enum AlphaPosition {
97         AtBeginning,
98         AtEnd
99     }
100 
101     enum AlphaPremultiplied {
102         NotPremultiplied,
103         Premultiplied
104     }
105 
106     enum TypeInterpretation {
107         UnsignedInteger,
108         UnsignedShort,
109         UnsignedByte,
110         FloatingPoint
111     }
112 
113     enum YUVLayout {
114         YUV444,
115         YUV422,
116         YUV411,
117         YUV420P,
118         YUV420SP,
119         YV12,
120         UYVY,
121         YUYV,
122         NV12,
123         NV21,
124         IMC1,
125         IMC2,
126         IMC3,
127         IMC4,
128         Y8,
129         Y16
130     }
131 
132     enum ByteOrder {
133         LittleEndian,
134         BigEndian,
135         CurrentSystemEndian
136     }
137 
138     @disable this();
139     /+pragma(inline, true) this()/+ noexcept+/
140     {
141         this.data = 0;
142     }+/
143 /+    pragma(inline, true) this(ColorModel mdl,
144                                                uchar firstSize,
145                                                uchar secondSize,
146                                                uchar thirdSize,
147                                                uchar fourthSize,
148                                                uchar fifthSize,
149                                                uchar alfa,
150                                                AlphaUsage usage,
151                                                AlphaPosition position,
152                                                AlphaPremultiplied premult,
153                                                TypeInterpretation typeInterp,
154                                                ByteOrder b_order = ByteOrder.CurrentSystemEndian,
155                                                uchar s_enum = 0)/+ noexcept+/
156     {
157         this.data = set(Field.ModelField, FieldWidth.ModelFieldWidth, cast(uchar)(mdl)) |
158                    set(Field.FirstField, FieldWidth.FirstFieldWidth, firstSize) |
159                    set(Field.SecondField, FieldWidth.SecondFieldWidth, secondSize) |
160                    set(Field.ThirdField, FieldWidth.ThirdFieldWidth, thirdSize) |
161                    set(Field.FourthField, FieldWidth.FourthFieldWidth, fourthSize) |
162                    set(Field.FifthField, FieldWidth.FifthFieldWidth, fifthSize) |
163                    set(Field.AlphaField, FieldWidth.AlphaFieldWidth, alfa) |
164                    set(Field.AlphaUsageField, FieldWidth.AlphaUsageFieldWidth, cast(uchar)(usage)) |
165                    set(Field.AlphaPositionField, FieldWidth.AlphaPositionFieldWidth, cast(uchar)(position)) |
166                    set(Field.PremulField, FieldWidth.PremulFieldWidth, cast(uchar)(premult)) |
167                    set(Field.TypeInterpretationField, FieldWidth.TypeInterpretationFieldWidth, cast(uchar)(typeInterp)) |
168                    set(Field.ByteOrderField, FieldWidth.ByteOrderFieldWidth, cast(uchar)(resolveByteOrder(b_order))) |
169                    set(Field.SubEnumField, FieldWidth.SubEnumFieldWidth, s_enum) |
170                    set(Field.UnusedField, FieldWidth.UnusedFieldWidth, 0);
171     }+/
172 
173     pragma(inline, true) ColorModel colorModel() const/+  noexcept+/ { return cast(ColorModel)(get(Field.ModelField, FieldWidth.ModelFieldWidth)); }
174     pragma(inline, true) uchar channelCount() const/+ noexcept+/ { return cast(uchar)((get(Field.FirstField, FieldWidth.FirstFieldWidth) > 0) +
175                                                                                  (get(Field.SecondField, FieldWidth.SecondFieldWidth) > 0) +
176                                                                                  (get(Field.ThirdField, FieldWidth.ThirdFieldWidth) > 0) +
177                                                                                  (get(Field.FourthField, FieldWidth.FourthFieldWidth) > 0) +
178                                                                                  (get(Field.FifthField, FieldWidth.FifthFieldWidth) > 0) +
179                                                                                  (get(Field.AlphaField, FieldWidth.AlphaFieldWidth) > 0)); }
180 
181     pragma(inline, true) uchar redSize() const/+ noexcept+/ { return get(Field.FirstField, FieldWidth.FirstFieldWidth); }
182     pragma(inline, true) uchar greenSize() const/+ noexcept+/ { return get(Field.SecondField, FieldWidth.SecondFieldWidth); }
183     pragma(inline, true) uchar blueSize() const/+ noexcept+/ { return get(Field.ThirdField, FieldWidth.ThirdFieldWidth); }
184 
185     pragma(inline, true) uchar cyanSize() const/+ noexcept+/ { return get(Field.FirstField, FieldWidth.FirstFieldWidth); }
186     pragma(inline, true) uchar magentaSize() const/+ noexcept+/ { return get(Field.SecondField, FieldWidth.SecondFieldWidth); }
187     pragma(inline, true) uchar yellowSize() const/+ noexcept+/ { return get(Field.ThirdField, FieldWidth.ThirdFieldWidth); }
188     pragma(inline, true) uchar blackSize() const/+ noexcept+/ { return get(Field.FourthField, FieldWidth.FourthFieldWidth); }
189 
190     pragma(inline, true) uchar hueSize() const/+ noexcept+/ { return get(Field.FirstField, FieldWidth.FirstFieldWidth); }
191     pragma(inline, true) uchar saturationSize() const/+ noexcept+/ { return get(Field.SecondField, FieldWidth.SecondFieldWidth); }
192     pragma(inline, true) uchar lightnessSize() const/+ noexcept+/ { return get(Field.ThirdField, FieldWidth.ThirdFieldWidth); }
193     pragma(inline, true) uchar brightnessSize() const/+ noexcept+/ { return get(Field.ThirdField, FieldWidth.ThirdFieldWidth); }
194 
195     pragma(inline, true) uchar alphaSize() const/+ noexcept+/ { return get(Field.AlphaField, FieldWidth.AlphaFieldWidth); }
196 
197     pragma(inline, true) uchar bitsPerPixel() const/+ noexcept+/ { return cast(uchar)(get(Field.FirstField, FieldWidth.FirstFieldWidth) +
198                                                                                  get(Field.SecondField, FieldWidth.SecondFieldWidth) +
199                                                                                  get(Field.ThirdField, FieldWidth.ThirdFieldWidth) +
200                                                                                  get(Field.FourthField, FieldWidth.FourthFieldWidth) +
201                                                                                  get(Field.FifthField, FieldWidth.FifthFieldWidth) +
202                                                                                  get(Field.AlphaField, FieldWidth.AlphaFieldWidth)); }
203 
204     pragma(inline, true) AlphaUsage alphaUsage() const/+ noexcept+/ { return cast(AlphaUsage)(get(Field.AlphaUsageField, FieldWidth.AlphaUsageFieldWidth)); }
205     pragma(inline, true) AlphaPosition alphaPosition() const/+ noexcept+/ { return cast(AlphaPosition)(get(Field.AlphaPositionField, FieldWidth.AlphaPositionFieldWidth)); }
206     pragma(inline, true) AlphaPremultiplied premultiplied() const/+ noexcept+/ { return cast(AlphaPremultiplied)(get(Field.PremulField, FieldWidth.PremulFieldWidth)); }
207     pragma(inline, true) TypeInterpretation typeInterpretation() const/+ noexcept+/ { return cast(TypeInterpretation)(get(Field.TypeInterpretationField, FieldWidth.TypeInterpretationFieldWidth)); }
208     pragma(inline, true) ByteOrder byteOrder() const/+ noexcept+/ { return cast(ByteOrder)(get(Field.ByteOrderField, FieldWidth.ByteOrderFieldWidth)); }
209 
210     pragma(inline, true) YUVLayout yuvLayout() const/+ noexcept+/ { return cast(YUVLayout)(get(Field.SubEnumField, FieldWidth.SubEnumFieldWidth)); }
211     pragma(inline, true) uchar subEnum() const/+ noexcept+/ { return get(Field.SubEnumField, FieldWidth.SubEnumFieldWidth); }
212 
213 private:
214     pragma(inline, true) static ByteOrder resolveByteOrder(ByteOrder bo)
215     {
216         return bo == ByteOrder.CurrentSystemEndian ? versionIsSet!"LittleEndian" ? ByteOrder.LittleEndian : ByteOrder.BigEndian : bo ;
217     }
218 
219 private:
220     quint64 data = 0;
221 
222     /+ friend Q_DECL_CONST_FUNCTION constexpr inline bool operator==(QPixelFormat fmt1, QPixelFormat fmt2)
223     { return fmt1.data == fmt2.data; } +/
224 
225     /+ friend Q_DECL_CONST_FUNCTION constexpr inline bool operator!=(QPixelFormat fmt1, QPixelFormat fmt2)
226     { return !(fmt1 == fmt2); } +/
227     mixin(CREATE_CONVENIENCE_WRAPPERS);
228 }
229 /+ static_assert(sizeof(QPixelFormat) == sizeof(quint64));
230 Q_DECLARE_TYPEINFO(QPixelFormat, Q_PRIMITIVE_TYPE); +/
231 
232 
233 extern(C++, "QtPrivate") {
234     QPixelFormat /+ Q_GUI_EXPORT +/ QPixelFormat_createYUV(QPixelFormat.YUVLayout yuvLayout,
235                                                          uchar alphaSize,
236                                                          QPixelFormat.AlphaUsage alphaUsage,
237                                                          QPixelFormat.AlphaPosition alphaPosition,
238                                                          QPixelFormat.AlphaPremultiplied premultiplied,
239                                                          QPixelFormat.TypeInterpretation typeInterpretation,
240                                                          QPixelFormat.ByteOrder byteOrder);
241 }
242 
243 /+pragma(inline, true) QPixelFormat qPixelFormatRgba(uchar red,
244                                                uchar green,
245                                                uchar blue,
246                                                uchar alfa,
247                                                QPixelFormat.AlphaUsage usage,
248                                                QPixelFormat.AlphaPosition position,
249                                                QPixelFormat.AlphaPremultiplied pmul=QPixelFormat.AlphaPremultiplied.NotPremultiplied,
250                                                QPixelFormat.TypeInterpretation typeInt=QPixelFormat.TypeInterpretation.UnsignedInteger)/+ noexcept+/
251 {
252     return QPixelFormat(QPixelFormat.ColorModel.RGB,
253                         red,
254                         green,
255                         blue,
256                         0,
257                         0,
258                         alfa,
259                         usage,
260                         position,
261                         pmul,
262                         typeInt);
263 }
264 
265 pragma(inline, true) QPixelFormat qPixelFormatGrayscale(uchar channelSize,
266                                                     QPixelFormat.TypeInterpretation typeInt=QPixelFormat.TypeInterpretation.UnsignedInteger)/+ noexcept+/
267 {
268     return QPixelFormat(QPixelFormat.ColorModel.Grayscale,
269                         channelSize,
270                         0,
271                         0,
272                         0,
273                         0,
274                         0,
275                         QPixelFormat.AlphaUsage.IgnoresAlpha,
276                         QPixelFormat.AlphaPosition.AtBeginning,
277                         QPixelFormat.AlphaPremultiplied.NotPremultiplied,
278                         typeInt);
279 }
280 
281 pragma(inline, true) QPixelFormat qPixelFormatAlpha(uchar channelSize,
282                                                 QPixelFormat.TypeInterpretation typeInt=QPixelFormat.TypeInterpretation.UnsignedInteger)/+ noexcept+/
283 {
284     return QPixelFormat(QPixelFormat.ColorModel.Alpha,
285                         0,
286                         0,
287                         0,
288                         0,
289                         0,
290                         channelSize,
291                         QPixelFormat.AlphaUsage.UsesAlpha,
292                         QPixelFormat.AlphaPosition.AtBeginning,
293                         QPixelFormat.AlphaPremultiplied.NotPremultiplied,
294                         typeInt);
295 }
296 
297 pragma(inline, true) QPixelFormat qPixelFormatCmyk(uchar channelSize,
298                                                uchar alfa=0,
299                                                QPixelFormat.AlphaUsage usage=QPixelFormat.AlphaUsage.IgnoresAlpha,
300                                                QPixelFormat.AlphaPosition position=QPixelFormat.AlphaPosition.AtBeginning,
301                                                QPixelFormat.TypeInterpretation typeInt=QPixelFormat.TypeInterpretation.UnsignedInteger)/+ noexcept+/
302 {
303     return QPixelFormat(QPixelFormat.ColorModel.CMYK,
304                         channelSize,
305                         channelSize,
306                         channelSize,
307                         channelSize,
308                         0,
309                         alfa,
310                         usage,
311                         position,
312                         QPixelFormat.AlphaPremultiplied.NotPremultiplied,
313                         typeInt);
314 }
315 
316 pragma(inline, true) QPixelFormat qPixelFormatHsl(uchar channelSize,
317                                               uchar alfa=0,
318                                               QPixelFormat.AlphaUsage usage=QPixelFormat.AlphaUsage.IgnoresAlpha,
319                                               QPixelFormat.AlphaPosition position=QPixelFormat.AlphaPosition.AtBeginning,
320                                               QPixelFormat.TypeInterpretation typeInt=QPixelFormat.TypeInterpretation.FloatingPoint)/+ noexcept+/
321 {
322     return QPixelFormat(QPixelFormat.ColorModel.HSL,
323                         channelSize,
324                         channelSize,
325                         channelSize,
326                         0,
327                         0,
328                         alfa,
329                         usage,
330                         position,
331                         QPixelFormat.AlphaPremultiplied.NotPremultiplied,
332                         typeInt);
333 }
334 
335 pragma(inline, true) QPixelFormat qPixelFormatHsv(uchar channelSize,
336                                               uchar alfa=0,
337                                               QPixelFormat.AlphaUsage usage=QPixelFormat.AlphaUsage.IgnoresAlpha,
338                                               QPixelFormat.AlphaPosition position=QPixelFormat.AlphaPosition.AtBeginning,
339                                               QPixelFormat.TypeInterpretation typeInt=QPixelFormat.TypeInterpretation.FloatingPoint)/+ noexcept+/
340 {
341     return QPixelFormat(QPixelFormat.ColorModel.HSV,
342                         channelSize,
343                         channelSize,
344                         channelSize,
345                         0,
346                         0,
347                         alfa,
348                         usage,
349                         position,
350                         QPixelFormat.AlphaPremultiplied.NotPremultiplied,
351                         typeInt);
352 }
353 
354 pragma(inline, true) QPixelFormat qPixelFormatYuv(QPixelFormat.YUVLayout layout,
355                                     uchar alfa=0,
356                                     QPixelFormat.AlphaUsage usage=QPixelFormat.AlphaUsage.IgnoresAlpha,
357                                     QPixelFormat.AlphaPosition position=QPixelFormat.AlphaPosition.AtBeginning,
358                                     QPixelFormat.AlphaPremultiplied p_mul=QPixelFormat.AlphaPremultiplied.NotPremultiplied,
359                                     QPixelFormat.TypeInterpretation typeInt=QPixelFormat.TypeInterpretation.UnsignedByte,
360                                     QPixelFormat.ByteOrder b_order=QPixelFormat.ByteOrder.LittleEndian)
361 {
362     return /+ QtPrivate:: +/QPixelFormat_createYUV(layout,
363                                              alfa,
364                                              usage,
365                                              position,
366                                              p_mul,
367                                              typeInt,
368                                              b_order);
369 }
370 +/
371