1/*
2 This file is part of the KDE project
3 SPDX-FileCopyrightText: 2015 The Qt Company Ltd
4 SPDX-FileCopyrightText: 2013 Ivan Komissarov
5 SPDX-FileCopyrightText: 2024 Mirco Miranda
6
7 SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only
8*/
9
10#ifndef QDDSHANDLER_H
11#define QDDSHANDLER_H
12
13#include <QImageIOPlugin>
14
15struct DDSPixelFormat
16{
17 enum DDSPixelFormatFlags {
18 FlagAlphaPixels = 0x00000001,
19 FlagAlpha = 0x00000002,
20 FlagFourCC = 0x00000004,
21 FlagPaletteIndexed4 = 0x00000008,
22 FlagPaletteIndexed8 = 0x00000020,
23 FlagRGB = 0x00000040,
24 FlagYUV = 0x00000200,
25 FlagLuminance = 0x00020000,
26 FlagNormal = 0x00080000,
27 FlagRGBA = FlagAlphaPixels | FlagRGB,
28 FlagLA = FlagAlphaPixels | FlagLuminance
29 };
30
31 quint32 size;
32 quint32 flags;
33 quint32 fourCC;
34 quint32 rgbBitCount;
35 quint32 rBitMask;
36 quint32 gBitMask;
37 quint32 bBitMask;
38 quint32 aBitMask;
39};
40
41struct DDSHeaderDX10
42{
43 quint32 dxgiFormat = 0;
44 quint32 resourceDimension = 0;
45 quint32 miscFlag = 0;
46 quint32 arraySize = 0;
47 quint32 miscFlags2 = 0;
48};
49
50struct DDSHeader
51{
52 enum DDSFlags {
53 FlagCaps = 0x000001,
54 FlagHeight = 0x000002,
55 FlagWidth = 0x000004,
56 FlagPitch = 0x000008,
57 FlagPixelFormat = 0x001000,
58 FlagMipmapCount = 0x020000,
59 FlagLinearSize = 0x080000,
60 FlagDepth = 0x800000
61 };
62
63 enum DDSCapsFlags {
64 CapsComplex = 0x000008,
65 CapsTexture = 0x001000,
66 CapsMipmap = 0x400000
67 };
68
69 enum DDSCaps2Flags {
70 Caps2CubeMap = 0x0200,
71 Caps2CubeMapPositiveX = 0x0400,
72 Caps2CubeMapNegativeX = 0x0800,
73 Caps2CubeMapPositiveY = 0x1000,
74 Caps2CubeMapNegativeY = 0x2000,
75 Caps2CubeMapPositiveZ = 0x4000,
76 Caps2CubeMapNegativeZ = 0x8000,
77 Caps2Volume = 0x200000
78 };
79
80 enum { ReservedCount = 11 };
81
82 quint32 magic;
83 quint32 size;
84 quint32 flags;
85 quint32 height;
86 quint32 width;
87 quint32 pitchOrLinearSize;
88 quint32 depth;
89 quint32 mipMapCount;
90 quint32 reserved1[ReservedCount];
91 DDSPixelFormat pixelFormat;
92 quint32 caps;
93 quint32 caps2;
94 quint32 caps3;
95 quint32 caps4;
96 quint32 reserved2;
97 DDSHeaderDX10 header10;
98};
99
100class QDDSHandler : public QImageIOHandler
101{
102public:
103 QDDSHandler();
104
105 bool canRead() const override;
106 bool read(QImage *image) override;
107 bool write(const QImage &image) override;
108
109 QVariant option(QImageIOHandler::ImageOption option) const override;
110 void setOption(ImageOption option, const QVariant &value) override;
111 bool supportsOption(QImageIOHandler::ImageOption option) const override;
112
113 int imageCount() const override;
114 bool jumpToImage(int imageNumber) override;
115
116 static bool canRead(QIODevice *device);
117
118private:
119 bool ensureScanned() const;
120 bool verifyHeader(const DDSHeader &dds) const;
121
122private:
123 enum ScanState {
124 ScanError = -1,
125 ScanNotScanned = 0,
126 ScanSuccess = 1,
127 };
128
129 DDSHeader m_header;
130 int m_format;
131 int m_currentImage;
132 mutable ScanState m_scanState;
133};
134
135class QDDSPlugin : public QImageIOPlugin
136{
137 Q_OBJECT
138 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QImageIOHandlerFactoryInterface" FILE "dds.json")
139public:
140 Capabilities capabilities(QIODevice *device, const QByteArray &format) const override;
141 QImageIOHandler *create(QIODevice *device, const QByteArray &format = QByteArray()) const override;
142};
143
144#endif // QDDSHANDLER_H
145

source code of kimageformats/src/imageformats/dds_p.h