code cleanup: gpl header update (formatting)
[blender.git] / source / gameengine / VideoTexture / ImageMix.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software  Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * Copyright (c) 2007 The Zdeno Ash Miklas
19  *
20  * This source file is part of VideoTexture library
21  *
22  * Contributor(s):
23  *
24  * ***** END GPL LICENSE BLOCK *****
25  */
26
27 /** \file ImageMix.h
28  *  \ingroup bgevideotex
29  */
30
31 #ifndef __IMAGEMIX_H__
32 #define __IMAGEMIX_H__
33
34
35 #include "Common.h"
36
37 #include "ImageBase.h"
38 #include "FilterBase.h"
39
40
41 /// class for source mixing
42 class ImageSourceMix : public ImageSource
43 {
44 public:
45         /// constructor
46         ImageSourceMix (const char * id) : ImageSource(id), m_weight(0x100) {}
47         /// destructor
48         virtual ~ImageSourceMix (void) {}
49
50         /// get offset
51         long long getOffset (void) { return m_offset; }
52         /// set offset
53         void setOffset (unsigned int * firstImg) { m_offset = m_image - firstImg; }
54
55         /// get weight
56         short getWeight (void) { return m_weight; }
57         /// set weight
58         void setWeight (short weight) { m_weight = weight; }
59
60 protected:
61         /// buffer offset to the first source buffer
62         long long m_offset;
63         /// source weight
64         short m_weight;
65 };
66
67
68 /// class for image mixer
69 class ImageMix : public ImageBase
70 {
71 public:
72         /// constructor
73         ImageMix (void) : ImageBase(false) {}
74
75         /// destructor
76         virtual ~ImageMix (void) {}
77
78         /// get weight
79         short getWeight (const char * id);
80         /// set weight
81         bool setWeight (const char * id, short weight);
82
83 protected:
84
85         /// create new source
86         virtual ImageSource * newSource (const char * id) { return new ImageSourceMix(id); }
87
88         /// calculate image from sources and set its availability
89         virtual void calcImage (unsigned int texId, double ts);
90 };
91
92
93 /// pixel filter for image mixer
94 class FilterImageMix : public FilterBase
95 {
96 public:
97         /// constructor
98         FilterImageMix (ImageSourceList & sources) : m_sources(sources) {}
99         /// destructor
100         virtual ~FilterImageMix (void) {}
101
102 protected:
103         /// source list
104         ImageSourceList & m_sources;
105
106         /// filter pixel, source int buffer
107         virtual unsigned int filter (unsigned int * src, short x, short y,
108                 short * size, unsigned int pixSize, unsigned int val = 0)
109         {
110                 // resulting pixel color
111                 int color[] = {0, 0, 0, 0};
112                 // iterate sources
113                 for (ImageSourceList::iterator it = m_sources.begin(); it != m_sources.end(); ++it)
114                 {
115                         // get pointer to mixer source
116                         ImageSourceMix * mixSrc = static_cast<ImageSourceMix*>(*it);
117                         // add weighted source pixel to result
118                         color[0] += mixSrc->getWeight() * (src[mixSrc->getOffset()] & 0xFF);
119                         color[1] += mixSrc->getWeight() * ((src[mixSrc->getOffset()] >> 8) & 0xFF);
120                         color[2] += mixSrc->getWeight() * ((src[mixSrc->getOffset()] >> 16) & 0xFF);
121                         color[3] += mixSrc->getWeight() * ((src[mixSrc->getOffset()] >> 24) & 0xFF);
122                 }
123                 // return resulting color
124                 return ((color[0] >> 8) & 0xFF) | (color[1] & 0xFF00)
125                         | ((color[2] << 8) & 0xFF0000) | ((color[3] << 16) & 0xFF000000);
126         }
127 };
128
129
130 #endif
131