2nd try to merge sim_physics with trunk rev 19825
[blender.git] / source / blender / imbuf / intern / dds / ColorBlock.h
1 /**
2  * $Id: ColorBlock.h 19805 2009-04-20 00:19:16Z genscher $
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 uint * linearImage);
45         ColorBlock(const ColorBlock & block);
46         ColorBlock(const Image * img, uint x, uint y);
47         
48         void init(const Image * img, uint x, uint y);
49         
50         void swizzleDXT5n();
51         void splatX();
52         void splatY();
53         
54         bool isSingleColor() const;
55         bool isSingleColorNoAlpha() const;
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         
65         void sortColorsByAbsoluteValue();
66
67         float volume() const;
68
69         // Accessors
70         const Color32 * colors() const;
71
72         Color32 color(uint i) const;
73         Color32 & color(uint i);
74         
75         Color32 color(uint x, uint y) const;
76         Color32 & color(uint x, uint y);
77         
78 private:
79         
80         Color32 m_color[4*4];
81         
82 };
83
84
85 /// Get pointer to block colors.
86 inline const Color32 * ColorBlock::colors() const
87 {
88         return m_color;
89 }
90
91 /// Get block color.
92 inline Color32 ColorBlock::color(uint i) const
93 {
94         return m_color[i];
95 }
96
97 /// Get block color.
98 inline Color32 & ColorBlock::color(uint i)
99 {
100         return m_color[i];
101 }
102
103 /// Get block color.
104 inline Color32 ColorBlock::color(uint x, uint y) const
105 {
106         return m_color[y * 4 + x];
107 }
108
109 /// Get block color.
110 inline Color32 & ColorBlock::color(uint x, uint y)
111 {
112         return m_color[y * 4 + x];
113 }
114
115 #endif // _DDS_COLORBLOCK_H