Apply second half of [#21590] .dds textures: fix for DXT1n format + sync with upstrea...
[blender.git] / source / blender / imbuf / intern / dds / DirectDrawSurface.h
1 /*
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19  *
20  * Contributors: Amorilia (amorilia@users.sourceforge.net)
21  *
22  * ***** END GPL LICENSE BLOCK *****
23  */
24
25 /** \file blender/imbuf/intern/dds/DirectDrawSurface.h
26  *  \ingroup imbdds
27  */
28
29
30 /*
31  * This file is based on a similar file from the NVIDIA texture tools
32  * (http://nvidia-texture-tools.googlecode.com/)
33  *
34  * Original license from NVIDIA follows.
35  */
36
37 // Copyright NVIDIA Corporation 2007 -- Ignacio Castano <icastano@nvidia.com>
38 // 
39 // Permission is hereby granted, free of charge, to any person
40 // obtaining a copy of this software and associated documentation
41 // files (the "Software"), to deal in the Software without
42 // restriction, including without limitation the rights to use,
43 // copy, modify, merge, publish, distribute, sublicense, and/or sell
44 // copies of the Software, and to permit persons to whom the
45 // Software is furnished to do so, subject to the following
46 // conditions:
47 // 
48 // The above copyright notice and this permission notice shall be
49 // included in all copies or substantial portions of the Software.
50 // 
51 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
52 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
53 // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
54 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
55 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
56 // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
57 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
58 // OTHER DEALINGS IN THE SOFTWARE.
59
60 #ifndef _DDS_DIRECTDRAWSURFACE_H
61 #define _DDS_DIRECTDRAWSURFACE_H
62
63 #include <Common.h>
64 #include <Stream.h>
65 #include <ColorBlock.h>
66 #include <Image.h>
67
68 struct DDSPixelFormat
69 {
70         uint size;
71         uint flags;
72         uint fourcc;
73         uint bitcount;
74         uint rmask;
75         uint gmask;
76         uint bmask;
77         uint amask;
78 };
79
80 struct DDSCaps
81 {
82         uint caps1;
83         uint caps2;
84         uint caps3;
85         uint caps4;
86 };
87
88 /// DDS file header for DX10.
89 struct DDSHeader10
90 {
91         uint dxgiFormat;
92         uint resourceDimension;
93         uint miscFlag;
94         uint arraySize;
95         uint reserved;
96 };
97
98 /// DDS file header.
99 struct DDSHeader
100 {
101         uint fourcc;
102         uint size;
103         uint flags;
104         uint height;
105         uint width;
106         uint pitch;
107         uint depth;
108         uint mipmapcount;
109         uint reserved[11];
110         DDSPixelFormat pf;
111         DDSCaps caps;
112         uint notused;
113         DDSHeader10 header10;
114
115
116         // Helper methods.
117         DDSHeader();
118         
119         void setWidth(uint w);
120         void setHeight(uint h);
121         void setDepth(uint d);
122         void setMipmapCount(uint count);
123         void setTexture2D();
124         void setTexture3D();
125         void setTextureCube();
126         void setLinearSize(uint size);
127         void setPitch(uint pitch);
128         void setFourCC(uint8 c0, uint8 c1, uint8 c2, uint8 c3);
129         void setFormatCode(uint code);
130         void setSwizzleCode(uint8 c0, uint8 c1, uint8 c2, uint8 c3);
131         void setPixelFormat(uint bitcount, uint rmask, uint gmask, uint bmask, uint amask);
132         void setDX10Format(uint format);
133         void setNormalFlag(bool b);
134     void setSrgbFlag(bool b);
135         void setHasAlphaFlag(bool b);
136         void setUserVersion(int version);
137         
138         /*void swapBytes();*/
139         
140         bool hasDX10Header() const;
141     uint signature() const;
142     uint toolVersion() const;
143     uint userVersion() const;
144     bool isNormalMap() const;
145     bool isSrgb() const;
146     bool hasAlpha() const;
147     uint d3d9Format() const;
148 };
149
150 /// DirectDraw Surface. (DDS)
151 class DirectDrawSurface
152 {
153 public:
154         DirectDrawSurface(unsigned char *mem, uint size);
155         ~DirectDrawSurface();
156         
157         bool isValid() const;
158         bool isSupported() const;
159
160         bool hasAlpha() const;
161         
162         uint mipmapCount() const;
163         uint width() const;
164         uint height() const;
165         uint depth() const;
166         bool isTexture1D() const;
167         bool isTexture2D() const;
168         bool isTexture3D() const;
169         bool isTextureCube() const;
170
171         void setNormalFlag(bool b);
172         void setHasAlphaFlag(bool b);
173         void setUserVersion(int version);
174         
175         void mipmap(Image * img, uint f, uint m);
176         //      void mipmap(FloatImage * img, uint f, uint m);
177         
178         void printInfo() const;
179
180 private:
181         
182         uint blockSize() const;
183         uint faceSize() const;
184         uint mipmapSize(uint m) const;
185         
186         uint offset(uint f, uint m);
187         
188         void readLinearImage(Image * img);
189         void readBlockImage(Image * img);
190         void readBlock(ColorBlock * rgba);
191         
192         
193 private:
194         Stream stream; // memory where DDS file resides
195         DDSHeader header;
196 };
197
198 void mem_read(Stream & mem, DDSPixelFormat & pf);
199 void mem_read(Stream & mem, DDSCaps & caps);
200 void mem_read(Stream & mem, DDSHeader & header);
201 void mem_read(Stream & mem, DDSHeader10 & header);
202
203 #endif // _DDS_DIRECTDRAWSURFACE_H