Patch from GSR that a) fixes a whole bunch of GPL/BL license
[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, uint x, uint y);
46         
47         void init(const Image * img, uint x, uint y);
48         
49         void swizzleDXT5n();
50         void splatX();
51         void splatY();
52         
53         bool isSingleColor() const;
54         uint countUniqueColors() const;
55         Color32 averageColor() const;
56         bool hasAlpha() const;
57         
58         void diameterRange(Color32 * start, Color32 * end) const;
59         void luminanceRange(Color32 * start, Color32 * end) const;
60         void boundsRange(Color32 * start, Color32 * end) const;
61         void boundsRangeAlpha(Color32 * start, Color32 * end) const;
62         
63         void sortColorsByAbsoluteValue();
64
65         float volume() const;
66
67         // Accessors
68         const Color32 * colors() const;
69
70         Color32 color(uint i) const;
71         Color32 & color(uint i);
72         
73         Color32 color(uint x, uint y) const;
74         Color32 & color(uint x, uint y);
75         
76 private:
77         
78         Color32 m_color[4*4];
79         
80 };
81
82
83 /// Get pointer to block colors.
84 inline const Color32 * ColorBlock::colors() const
85 {
86         return m_color;
87 }
88
89 /// Get block color.
90 inline Color32 ColorBlock::color(uint i) const
91 {
92         return m_color[i];
93 }
94
95 /// Get block color.
96 inline Color32 & ColorBlock::color(uint i)
97 {
98         return m_color[i];
99 }
100
101 /// Get block color.
102 inline Color32 ColorBlock::color(uint x, uint y) const
103 {
104         return m_color[y * 4 + x];
105 }
106
107 /// Get block color.
108 inline Color32 & ColorBlock::color(uint x, uint y)
109 {
110         return m_color[y * 4 + x];
111 }
112
113 #endif // _DDS_COLORBLOCK_H