merging game_engine branch changes into trunk, 2d-filters and opengl speedup
[blender.git] / source / blender / imbuf / intern / dds / ColorBlock.h
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL/BL DUAL 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. The Blender
10  * Foundation also sells licenses for use in proprietary software under
11  * the Blender License.  See http://www.blender.org/BL/ for information
12  * about this.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software Foundation,
21  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22  *
23  * Contributors: Amorilia (amorilia@gamebox.net)
24  *
25  * ***** END GPL/BL DUAL LICENSE BLOCK *****
26  */
27
28 /*
29  * This file is based on a similar file from the NVIDIA texture tools
30  * (http://nvidia-texture-tools.googlecode.com/)
31  *
32  * Original license from NVIDIA follows.
33  */
34
35 // This code is in the public domain -- castanyo@yahoo.es
36
37 #ifndef _DDS_COLORBLOCK_H
38 #define _DDS_COLORBLOCK_H
39
40 #include <Color.h>
41 #include <Image.h>
42
43 /// Uncompressed 4x4 color block.
44 struct ColorBlock
45 {
46         ColorBlock();
47         ColorBlock(const ColorBlock & block);
48         ColorBlock(const Image * img, uint x, uint y);
49         
50         void init(const Image * img, uint x, uint y);
51         
52         void swizzleDXT5n();
53         void splatX();
54         void splatY();
55         
56         uint countUniqueColors() const;
57         Color32 averageColor() const;
58         bool hasAlpha() const;
59         
60         void diameterRange(Color32 * start, Color32 * end) const;
61         void luminanceRange(Color32 * start, Color32 * end) const;
62         void boundsRange(Color32 * start, Color32 * end) const;
63         void boundsRangeAlpha(Color32 * start, Color32 * end) const;
64         void bestFitRange(Color32 * start, Color32 * end) const;
65         
66         void sortColorsByAbsoluteValue();
67
68         float volume() const;
69
70         // Accessors
71         const Color32 * colors() const;
72
73         Color32 color(uint i) const;
74         Color32 & color(uint i);
75         
76         Color32 color(uint x, uint y) const;
77         Color32 & color(uint x, uint y);
78         
79 private:
80         
81         Color32 m_color[4*4];
82         
83 };
84
85
86 /// Get pointer to block colors.
87 inline const Color32 * ColorBlock::colors() const
88 {
89         return m_color;
90 }
91
92 /// Get block color.
93 inline Color32 ColorBlock::color(uint i) const
94 {
95         return m_color[i];
96 }
97
98 /// Get block color.
99 inline Color32 & ColorBlock::color(uint i)
100 {
101         return m_color[i];
102 }
103
104 /// Get block color.
105 inline Color32 ColorBlock::color(uint x, uint y) const
106 {
107         return m_color[y * 4 + x];
108 }
109
110 /// Get block color.
111 inline Color32 & ColorBlock::color(uint x, uint y)
112 {
113         return m_color[y * 4 + x];
114 }
115
116 #endif // _DDS_COLORBLOCK_H