migrated NDOF code from soc-2010-merwin, SpaceNavigator now works on Mac blender
[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., 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/ColorBlock.h
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 #ifndef _DDS_COLORBLOCK_H
40 #define _DDS_COLORBLOCK_H
41
42 #include <Color.h>
43 #include <Image.h>
44
45 /// Uncompressed 4x4 color block.
46 struct ColorBlock
47 {
48         ColorBlock();
49         ColorBlock(const uint * linearImage);
50         ColorBlock(const ColorBlock & block);
51         ColorBlock(const Image * img, uint x, uint y);
52         
53         void init(const Image * img, uint x, uint y);
54     void init(uint w, uint h, const uint * data, uint x, uint y);
55     void init(uint w, uint h, const float * data, uint x, uint y);
56         
57         void swizzle(uint x, uint y, uint z, uint w); // 0=r, 1=g, 2=b, 3=a, 4=0xFF, 5=0
58         
59     bool isSingleColor(Color32 mask = Color32(0xFF, 0xFF, 0xFF, 0x00)) const;
60         bool hasAlpha() const;
61         
62         
63         // Accessors
64         const Color32 * colors() const;
65
66         Color32 color(uint i) const;
67         Color32 & color(uint i);
68         
69         Color32 color(uint x, uint y) const;
70         Color32 & color(uint x, uint y);
71         
72 private:
73         
74         Color32 m_color[4*4];
75         
76 };
77
78
79 /// Get pointer to block colors.
80 inline const Color32 * ColorBlock::colors() const
81 {
82         return m_color;
83 }
84
85 /// Get block color.
86 inline Color32 ColorBlock::color(uint i) const
87 {
88         return m_color[i];
89 }
90
91 /// Get block color.
92 inline Color32 & ColorBlock::color(uint i)
93 {
94         return m_color[i];
95 }
96
97 /// Get block color.
98 inline Color32 ColorBlock::color(uint x, uint y) const
99 {
100         return m_color[y * 4 + x];
101 }
102
103 /// Get block color.
104 inline Color32 & ColorBlock::color(uint x, uint y)
105 {
106         return m_color[y * 4 + x];
107 }
108
109 #endif // _DDS_COLORBLOCK_H