cd61900bbdaed04bd2271631cd4067d2d255264b
[blender.git] / source / gameengine / VideoTexture / FilterColor.h
1 /*
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 /** \file FilterColor.h
24  *  \ingroup bgevideotex
25  */
26  
27 #ifndef __FILTERCOLOR_H__
28 #define __FILTERCOLOR_H__
29
30 #include "Common.h"
31
32 #include "FilterBase.h"
33
34
35 /// pixel filter for gray scale
36 class FilterGray : public FilterBase
37 {
38 public:
39         /// constructor
40         FilterGray (void) {}
41         /// destructor
42         virtual ~FilterGray (void) {}
43
44 protected:
45         /// filter pixel template, source int buffer
46         template <class SRC> unsigned int tFilter (SRC src, short x, short y,
47                 short * size, unsigned int pixSize, unsigned int val)
48         {
49                 // calculate gray value
50                 unsigned int gray = (28 * (VT_B(val)) + 151 * (VT_G(val))
51                         + 77 * (VT_R(val))) >> 8;
52                 // return gray scale value
53                 VT_R(val) = gray;
54                 VT_G(val) = gray;
55                 VT_B(val) = gray;
56                 return val;
57         }
58
59         /// virtual filtering function for byte source
60         virtual unsigned int filter (unsigned char * src, short x, short y,
61                 short * size, unsigned int pixSize, unsigned int val = 0)
62         { return tFilter(src, x, y, size, pixSize, val); }
63         /// virtual filtering function for unsigned int source
64         virtual unsigned int filter (unsigned int * src, short x, short y,
65                 short * size, unsigned int pixSize, unsigned int val = 0)
66         { return tFilter(src, x, y, size, pixSize, val); }
67 };
68
69
70 /// type for color matrix
71 typedef short ColorMatrix[4][5];
72
73 /// pixel filter for color calculation
74 class FilterColor : public FilterBase
75 {
76 public:
77         /// constructor
78         FilterColor (void);
79         /// destructor
80         virtual ~FilterColor (void) {}
81
82         /// get color matrix
83         ColorMatrix & getMatrix (void) { return m_matrix; }
84         /// set color matrix
85         void setMatrix (ColorMatrix & mat);
86
87 protected:
88         ///  color calculation matrix
89         ColorMatrix m_matrix;
90
91         /// calculate one color component
92         unsigned char calcColor (unsigned int val, short idx)
93         {
94                 return (((m_matrix[idx][0]  * (VT_R(val)) + m_matrix[idx][1] * (VT_G(val)) +
95                           m_matrix[idx][2] * (VT_B(val)) + m_matrix[idx][3] * (VT_A(val)) +
96                           m_matrix[idx][4]) >> 8) & 0xFF);
97         }
98
99         /// filter pixel template, source int buffer
100         template <class SRC> unsigned int tFilter (SRC src, short x, short y,
101                 short * size, unsigned int pixSize, unsigned int val)
102         {
103                 // return calculated color
104                 int color;
105                 VT_RGBA(color, calcColor(val, 0), calcColor(val, 1), calcColor(val, 2), calcColor(val, 3));
106                 return color;
107         }
108
109         /// virtual filtering function for byte source
110         virtual unsigned int filter (unsigned char * src, short x, short y,
111                 short * size, unsigned int pixSize, unsigned int val = 0)
112         { return tFilter(src, x, y, size, pixSize, val); }
113         /// virtual filtering function for unsigned int source
114         virtual unsigned int filter (unsigned int * src, short x, short y,
115                 short * size, unsigned int pixSize, unsigned int val = 0)
116         { return tFilter(src, x, y, size, pixSize, val); }
117 };
118
119
120 /// type for color levels
121 typedef unsigned short ColorLevel[4][3];
122
123 /// pixel filter for color calculation
124 class FilterLevel : public FilterBase
125 {
126 public:
127         /// constructor
128         FilterLevel (void);
129         /// destructor
130         virtual ~FilterLevel (void) {}
131
132         /// get color matrix
133         ColorLevel & getLevels (void) { return levels; }
134         /// set color matrix
135         void setLevels (ColorLevel & lev);
136
137 protected:
138         ///  color calculation matrix
139         ColorLevel levels;
140
141         /// calculate one color component
142         unsigned int calcColor (unsigned int val, short idx)
143         {
144                 unsigned int col = VT_C(val,idx);
145                 if (col <= levels[idx][0]) col = 0;
146                 else if (col >= levels[idx][1]) col = 0xFF;
147                 else col = (((col - levels[idx][0]) << 8) / levels[idx][2]) & 0xFF;
148                 return col; 
149         }
150
151         /// filter pixel template, source int buffer
152         template <class SRC> unsigned int tFilter (SRC src, short x, short y,
153                 short * size, unsigned int pixSize, unsigned int val)
154         {
155                 // return calculated color
156                 int color;
157                 VT_RGBA(color, calcColor(val, 0), calcColor(val, 1), calcColor(val, 2), calcColor(val, 3));
158                 return color;
159         }
160
161         /// virtual filtering function for byte source
162         virtual unsigned int filter (unsigned char * src, short x, short y,
163                 short * size, unsigned int pixSize, unsigned int val = 0)
164         { return tFilter(src, x, y, size, pixSize, val); }
165         /// virtual filtering function for unsigned int source
166         virtual unsigned int filter (unsigned int * src, short x, short y,
167                 short * size, unsigned int pixSize, unsigned int val = 0)
168         { return tFilter(src, x, y, size, pixSize, val); }
169 };
170
171
172 #endif