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