code cleanup: gpl header update (formatting)
[blender.git] / source / gameengine / VideoTexture / FilterBase.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 FilterBase.h
28  *  \ingroup bgevideotex
29  */
30
31 #ifndef __FILTERBASE_H__
32 #define __FILTERBASE_H__
33
34 #include "Common.h"
35
36 #include "PyObjectPlus.h"
37
38 #include "PyTypeList.h"
39
40 #define VT_C(v,idx)     ((unsigned char*)&v)[idx]
41 #define VT_R(v) ((unsigned char*)&v)[0]
42 #define VT_G(v) ((unsigned char*)&v)[1]
43 #define VT_B(v) ((unsigned char*)&v)[2]
44 #define VT_A(v) ((unsigned char*)&v)[3]
45 #define VT_RGBA(v,r,g,b,a)      VT_R(v)=(unsigned char)r, VT_G(v)=(unsigned char)g, VT_B(v)=(unsigned char)b, VT_A(v)=(unsigned char)a
46
47 // forward declaration
48 class FilterBase;
49
50
51 // python structure for filter
52 struct PyFilter
53 {
54         PyObject_HEAD
55         // source object
56         FilterBase * m_filter;
57 };
58
59
60 /// base class for pixel filters
61 class FilterBase
62 {
63 public:
64         /// constructor
65         FilterBase (void);
66         /// destructor
67         virtual ~FilterBase (void);
68         // release python objects
69         virtual void release (void);
70
71         /// convert pixel
72         template <class SRC> unsigned int convert (SRC src, short x, short y,
73                 short * size, unsigned int pixSize)
74         {
75                 return filter(src, x, y, size, pixSize,
76                         convertPrevious(src, x, y, size, pixSize));
77         }
78
79         /// get previous filter
80         PyFilter * getPrevious (void) { return m_previous; }
81         /// set previous filter
82         void setPrevious (PyFilter * filt, bool useRefCnt = true);
83
84         /// find first filter in chain
85         FilterBase * findFirst (void);
86
87         /// get first filter's source pixel size
88         unsigned int firstPixelSize (void) { return findFirst()->getPixelSize(); }
89
90 protected:
91         /// previous pixel filter
92         PyFilter * m_previous;
93
94         /// filter pixel, source byte buffer
95         virtual unsigned int filter (unsigned char * src, short x, short y,
96                 short * size, unsigned int pixSize, unsigned int val = 0)
97         { return val; }
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         { return val; }
102         /// filter pixel, source float buffer
103         virtual unsigned int filter (float * src, short x, short y,
104                 short * size, unsigned int pixSize, unsigned int val = 0)
105         { return val; }
106
107         /// get source pixel size
108         virtual unsigned int getPixelSize (void) { return 1; }
109
110         /// get converted pixel from previous filters
111         template <class SRC> unsigned int convertPrevious (SRC src, short x, short y,
112                 short * size, unsigned int pixSize)
113         {
114                 // if previous filter doesn't exists, return source pixel
115                 if (m_previous == NULL) return *src;
116                 // otherwise return converted pixel
117                 return m_previous->m_filter->convert(src, x, y, size, pixSize);
118         }
119 };
120
121
122 // list of python filter types
123 extern PyTypeList pyFilterTypes;
124
125
126 // functions for python interface
127
128 // object initialization
129 template <class T> static int Filter_init (PyObject *pySelf, PyObject *args, PyObject *kwds)
130 {
131         PyFilter *self = reinterpret_cast<PyFilter*>(pySelf);
132         // create filter object
133         if (self->m_filter != NULL) delete self->m_filter;
134         self->m_filter = new T();
135         // initialization succeded
136         return 0;
137 }
138
139 // object allocation
140 PyObject *Filter_allocNew(PyTypeObject *type, PyObject *args, PyObject *kwds);
141 // object deallocation
142 void Filter_dealloc(PyFilter *self);
143
144 // get previous pixel filter object
145 PyObject *Filter_getPrevious(PyFilter *self, void *closure);
146 // set previous pixel filter object
147 int Filter_setPrevious(PyFilter *self, PyObject *value, void *closure);
148
149
150 #endif