ae2e98fa942ff5ef520971eaecb376343cdfedc2
[blender-staging.git] / source / gameengine / VideoTexture / FilterColor.h
1 /* $Id$
2 -----------------------------------------------------------------------------
3 This source file is part of blendTex library
4
5 Copyright (c) 2007 The Zdeno Ash Miklas
6
7 This program is free software; you can redistribute it and/or modify it under
8 the terms of the GNU Lesser General Public License as published by the Free Software
9 Foundation; either version 2 of the License, or (at your option) any later
10 version.
11
12 This program is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
15
16 You should have received a copy of the GNU Lesser General Public License along with
17 this program; if not, write to the Free Software Foundation, Inc., 59 Temple
18 Place - Suite 330, Boston, MA 02111-1307, USA, or go to
19 http://www.gnu.org/copyleft/lesser.txt.
20 -----------------------------------------------------------------------------
21 */
22
23 #if !defined FILTERCOLOR_H
24 #define FILTERCOLOR_H
25
26 #include "Common.h"
27
28 #include "FilterBase.h"
29
30
31 /// pixel filter for gray scale
32 class FilterGray : public FilterBase
33 {
34 public:
35         /// constructor
36         FilterGray (void) {}
37         /// destructor
38         virtual ~FilterGray (void) {}
39
40 protected:
41         /// filter pixel template, source int buffer
42         template <class SRC> unsigned int tFilter (SRC src, short x, short y,
43                 short * size, unsigned int pixSize, unsigned int val)
44         {
45                 // calculate gray value
46                 unsigned int gray = (28 * ((val >> 16) & 0xFF) + 151 * ((val >> 8) & 0xFF)
47                         + 77 * (val & 0xFF)) & 0xFF00;
48                 // return gray scale value
49                 return (val & 0xFF000000) | gray << 8 | gray | gray >> 8;
50         }
51
52         /// virtual filtering function for byte source
53         virtual unsigned int filter (unsigned char * src, short x, short y,
54                 short * size, unsigned int pixSize, unsigned int val = 0)
55         { return tFilter(src, x, y, size, pixSize, val); }
56         /// virtual filtering function for unsigned int source
57         virtual unsigned int filter (unsigned int * src, short x, short y,
58                 short * size, unsigned int pixSize, unsigned int val = 0)
59         { return tFilter(src, x, y, size, pixSize, val); }
60 };
61
62
63 /// type for color matrix
64 typedef short ColorMatrix[4][5];
65
66 /// pixel filter for color calculation
67 class FilterColor : public FilterBase
68 {
69 public:
70         /// constructor
71         FilterColor (void);
72         /// destructor
73         virtual ~FilterColor (void) {}
74
75         /// get color matrix
76         ColorMatrix & getMatrix (void) { return m_matrix; }
77         /// set color matrix
78         void setMatrix (ColorMatrix & mat);
79
80 protected:
81         ///  color calculation matrix
82         ColorMatrix m_matrix;
83
84         /// calculate one color component
85         unsigned int calcColor (unsigned int val, short idx)
86         {
87                 return (((m_matrix[idx][0]  * (val & 0xFF) + m_matrix[idx][1] * ((val >> 8) & 0xFF)
88                         + m_matrix[idx][2] * ((val >> 16) & 0xFF) + m_matrix[idx][3] * ((val >> 24) & 0xFF)
89                         + m_matrix[idx][4]) >> 8) & 0xFF) << (idx << 3);
90         }
91
92         /// filter pixel template, source int buffer
93         template <class SRC> unsigned int tFilter (SRC src, short x, short y,
94                 short * size, unsigned int pixSize, unsigned int val)
95         {
96                 // return calculated color
97                 return calcColor(val, 0) | calcColor(val, 1) | calcColor(val, 2)
98                         | calcColor(val, 3);
99         }
100
101         /// virtual filtering function for byte source
102         virtual unsigned int filter (unsigned char * src, short x, short y,
103                 short * size, unsigned int pixSize, unsigned int val = 0)
104         { return tFilter(src, x, y, size, pixSize, val); }
105         /// virtual filtering function for unsigned int source
106         virtual unsigned int filter (unsigned int * src, short x, short y,
107                 short * size, unsigned int pixSize, unsigned int val = 0)
108         { return tFilter(src, x, y, size, pixSize, val); }
109 };
110
111
112 /// type for color levels
113 typedef unsigned long ColorLevel[4][3];
114
115 /// pixel filter for color calculation
116 class FilterLevel : public FilterBase
117 {
118 public:
119         /// constructor
120         FilterLevel (void);
121         /// destructor
122         virtual ~FilterLevel (void) {}
123
124         /// get color matrix
125         ColorLevel & getLevels (void) { return levels; }
126         /// set color matrix
127         void setLevels (ColorLevel & lev);
128
129 protected:
130         ///  color calculation matrix
131         ColorLevel levels;
132
133         /// calculate one color component
134         unsigned int calcColor (unsigned int val, short idx)
135         {
136                 unsigned int col = val & (0xFF << (idx << 3));
137                 if (col <= levels[idx][0]) col = 0;
138                 else if (col >= levels[idx][1]) col = 0xFF << (idx << 3);
139                 else if (idx < 3) col = (((col - levels[idx][0]) << 8) / levels[idx][2]) & (0xFF << (idx << 3));
140                 else col = (((col - levels[idx][0]) / levels[idx][2]) << 8) & (0xFF << (idx << 3));
141                 return col; 
142         }
143
144         /// filter pixel template, source int buffer
145         template <class SRC> unsigned int tFilter (SRC src, short x, short y,
146                 short * size, unsigned int pixSize, unsigned int val)
147         {
148                 // return calculated color
149                 return calcColor(val, 0) | calcColor(val, 1) | calcColor(val, 2)
150                         | calcColor(val, 3);
151         }
152
153         /// virtual filtering function for byte source
154         virtual unsigned int filter (unsigned char * src, short x, short y,
155                 short * size, unsigned int pixSize, unsigned int val = 0)
156         { return tFilter(src, x, y, size, pixSize, val); }
157         /// virtual filtering function for unsigned int source
158         virtual unsigned int filter (unsigned int * src, short x, short y,
159                 short * size, unsigned int pixSize, unsigned int val = 0)
160         { return tFilter(src, x, y, size, pixSize, val); }
161 };
162
163
164 #endif