Apply second half of [#21590] .dds textures: fix for DXT1n format + sync with upstrea...
[blender.git] / source / blender / imbuf / intern / dds / Image.cpp
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/Image.cpp
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 // This code is in the public domain -- castanyo@yahoo.es
38
39 #include <Color.h>
40 #include <Image.h>
41
42 #include <stdio.h> // printf
43
44 Image::Image() : m_width(0), m_height(0), m_format(Format_RGB), m_data(NULL)
45 {
46 }
47
48 Image::~Image()
49 {
50         free();
51 }
52
53 void Image::allocate(uint w, uint h)
54 {
55         free();
56         m_width = w;
57         m_height = h;
58         m_data = new Color32[w * h];
59 }
60
61 void Image::free()
62 {
63         if (m_data) delete [] m_data;
64         m_data = NULL;
65 }
66
67
68 uint Image::width() const
69 {
70         return m_width;
71 }
72
73 uint Image::height() const
74 {
75         return m_height;
76 }
77
78 const Color32 * Image::scanline(uint h) const
79 {
80         if (h >= m_height) {
81                 printf("DDS: scanline beyond dimensions of image");
82                 return m_data;
83         }
84         return m_data + h * m_width;
85 }
86
87 Color32 * Image::scanline(uint h)
88 {
89         if (h >= m_height) {
90                 printf("DDS: scanline beyond dimensions of image");
91                 return m_data;
92         }
93         return m_data + h * m_width;
94 }
95
96 const Color32 * Image::pixels() const
97 {
98         return m_data;
99 }
100
101 Color32 * Image::pixels()
102 {
103         return m_data;
104 }
105
106 const Color32 & Image::pixel(uint idx) const
107 {
108         if (idx >= m_width * m_height) {
109                 printf("DDS: pixel beyond dimensions of image");
110                 return m_data[0];
111         }
112         return m_data[idx];
113 }
114
115 Color32 & Image::pixel(uint idx)
116 {
117         if (idx >= m_width * m_height) {
118                 printf("DDS: pixel beyond dimensions of image");
119                 return m_data[0];
120         }
121         return m_data[idx];
122 }
123
124
125 Image::Format Image::format() const
126 {
127         return m_format;
128 }
129
130 void Image::setFormat(Image::Format f)
131 {
132         m_format = f;
133 }
134
135