Patch to change license to GPL only, from GSR.
[blender.git] / source / blender / imbuf / intern / dds / ColorBlock.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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19  *
20  * Contributors: Amorilia (amorilia@gamebox.net)
21  *
22  * ***** END GPL LICENSE BLOCK *****
23  */
24
25 /*
26  * This file is based on a similar file from the NVIDIA texture tools
27  * (http://nvidia-texture-tools.googlecode.com/)
28  *
29  * Original license from NVIDIA follows.
30  */
31
32 // This code is in the public domain -- castanyo@yahoo.es
33
34 #ifndef _DDS_COLORBLOCK_H
35 #define _DDS_COLORBLOCK_H
36
37 #include <Color.h>
38 #include <Image.h>
39
40 /// Uncompressed 4x4 color block.
41 struct ColorBlock
42 {
43         ColorBlock();
44         ColorBlock(const ColorBlock & block);
45         ColorBlock(const Image * img, unsigned int x, unsigned int y);
46         
47         void init(const Image * img, unsigned int x, unsigned int y);
48         
49         void swizzleDXT5n();
50         void splatX();
51         void splatY();
52         
53         unsigned int countUniqueColors() const;
54         Color32 averageColor() const;
55         
56         void diameterRange(Color32 * start, Color32 * end) const;
57         void luminanceRange(Color32 * start, Color32 * end) const;
58         void boundsRange(Color32 * start, Color32 * end) const;
59         void boundsRangeAlpha(Color32 * start, Color32 * end) const;
60         void bestFitRange(Color32 * start, Color32 * end) const;
61         
62         void sortColorsByAbsoluteValue();
63
64         float volume() const;
65
66         // Accessors
67         const Color32 * colors() const;
68
69         Color32 color(unsigned int i) const;
70         Color32 & color(unsigned int i);
71         
72         Color32 color(unsigned int x, unsigned int y) const;
73         Color32 & color(unsigned int x, unsigned int y);
74         
75 private:
76         
77         Color32 m_color[4*4];
78         
79 };
80
81
82 /// Get pointer to block colors.
83 inline const Color32 * ColorBlock::colors() const
84 {
85         return m_color;
86 }
87
88 /// Get block color.
89 inline Color32 ColorBlock::color(unsigned int i) const
90 {
91         return m_color[i];
92 }
93
94 /// Get block color.
95 inline Color32 & ColorBlock::color(unsigned int i)
96 {
97         return m_color[i];
98 }
99
100 /// Get block color.
101 inline Color32 ColorBlock::color(unsigned int x, unsigned int y) const
102 {
103         return m_color[y * 4 + x];
104 }
105
106 /// Get block color.
107 inline Color32 & ColorBlock::color(unsigned int x, unsigned int y)
108 {
109         return m_color[y * 4 + x];
110 }
111
112 #endif // _DDS_COLORBLOCK_H