VideoTexture module.
[blender-staging.git] / source / gameengine / VideoTexture / ImageMix.h
1 /* $Id$
2 -----------------------------------------------------------------------------
3 This source file is part of VideoTexture 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 IMAGEMIX_H
24 #define IMAGEMIX_H
25
26
27 #include "Common.h"
28
29 #include "ImageBase.h"
30 #include "FilterBase.h"
31
32
33 /// class for source mixing
34 class ImageSourceMix : public ImageSource
35 {
36 public:
37         /// constructor
38         ImageSourceMix (const char * id) : ImageSource(id), m_weight(0x100) {}
39         /// destructor
40         virtual ~ImageSourceMix (void) {}
41
42         /// get offset
43         long long getOffset (void) { return m_offset; }
44         /// set offset
45         void setOffset (unsigned int * firstImg) { m_offset = m_image - firstImg; }
46
47         /// get weight
48         short getWeight (void) { return m_weight; }
49         /// set weight
50         void setWeight (short weight) { m_weight = weight; }
51
52 protected:
53         /// buffer offset to the first source buffer
54         long long m_offset;
55         /// source weight
56         short m_weight;
57 };
58
59
60 /// class for image mixer
61 class ImageMix : public ImageBase
62 {
63 public:
64         /// constructor
65         ImageMix (void) : ImageBase(false) {}
66
67         /// destructor
68         virtual ~ImageMix (void) {}
69
70         /// get weight
71         short getWeight (const char * id);
72         /// set weight
73         bool setWeight (const char * id, short weight);
74
75 protected:
76
77         /// create new source
78         virtual ImageSource * newSource (const char * id) { return new ImageSourceMix(id); }
79
80         /// calculate image from sources and set its availability
81         virtual void calcImage (unsigned int texId);
82 };
83
84
85 /// pixel filter for image mixer
86 class FilterImageMix : public FilterBase
87 {
88 public:
89         /// constructor
90         FilterImageMix (ImageSourceList & sources) : m_sources(sources) {}
91         /// destructor
92         virtual ~FilterImageMix (void) {}
93
94 protected:
95         /// source list
96         ImageSourceList & m_sources;
97
98         /// filter pixel, source int buffer
99         virtual unsigned int filter (unsigned int * src, short x, short y,
100                 short * size, unsigned int pixSize, unsigned int val = 0)
101         {
102                 // resulting pixel color
103                 int color[] = {0, 0, 0, 0};
104                 // iterate sources
105                 for (ImageSourceList::iterator it = m_sources.begin(); it != m_sources.end(); ++it)
106                 {
107                         // get pointer to mixer source
108                         ImageSourceMix * mixSrc = static_cast<ImageSourceMix*>(*it);
109                         // add weighted source pixel to result
110                         color[0] += mixSrc->getWeight() * (src[mixSrc->getOffset()] & 0xFF);
111                         color[1] += mixSrc->getWeight() * ((src[mixSrc->getOffset()] >> 8) & 0xFF);
112                         color[2] += mixSrc->getWeight() * ((src[mixSrc->getOffset()] >> 16) & 0xFF);
113                         color[3] += mixSrc->getWeight() * ((src[mixSrc->getOffset()] >> 24) & 0xFF);
114                 }
115                 // return resulting color
116                 return ((color[0] >> 8) & 0xFF) | (color[1] & 0xFF00)
117                         | ((color[2] << 8) & 0xFF0000) | ((color[3] << 16) & 0xFF000000);
118         }
119 };
120
121
122 #endif
123