svn merge ^/trunk/blender -r41226:41227 .
[blender.git] / source / gameengine / VideoTexture / FilterBase.h
1 -----------------------------------------------------------------------------
2 This source file is part of VideoTexture library
3
4 Copyright (c) 2007 The Zdeno Ash Miklas
5
6 This program is free software; you can redistribute it and/or modify it under
7 the terms of the GNU Lesser General Public License as published by the Free Software
8 Foundation; either version 2 of the License, or (at your option) any later
9 version.
10
11 This program is distributed in the hope that it will be useful, but WITHOUT
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public License along with
16 this program; if not, write to the Free Software Foundation, Inc., 59 Temple
17 Place - Suite 330, Boston, MA 02111-1307, USA, or go to
18 http://www.gnu.org/copyleft/lesser.txt.
19 -----------------------------------------------------------------------------
20 */
21
22 /** \file FilterBase.h
23  *  \ingroup bgevideotex
24  */
25  
26 #if !defined FILTERBASE_H
27 #define FILTERBASE_H
28
29 #include "Common.h"
30
31 #include <PyObjectPlus.h>
32
33 #include "PyTypeList.h"
34
35 #define VT_C(v,idx)     ((unsigned char*)&v)[idx]
36 #define VT_R(v) ((unsigned char*)&v)[0]
37 #define VT_G(v) ((unsigned char*)&v)[1]
38 #define VT_B(v) ((unsigned char*)&v)[2]
39 #define VT_A(v) ((unsigned char*)&v)[3]
40 #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
41
42 // forward declaration
43 class FilterBase;
44
45
46 // python structure for filter
47 struct PyFilter
48 {
49         PyObject_HEAD
50         // source object
51         FilterBase * m_filter;
52 };
53
54
55 /// base class for pixel filters
56 class FilterBase
57 {
58 public:
59         /// constructor
60         FilterBase (void);
61         /// destructor
62         virtual ~FilterBase (void);
63         // release python objects
64         virtual void release (void);
65
66         /// convert pixel
67         template <class SRC> unsigned int convert (SRC src, short x, short y,
68                 short * size, unsigned int pixSize)
69         {
70                 return filter(src, x, y, size, pixSize,
71                         convertPrevious(src, x, y, size, pixSize));
72         }
73
74         /// get previous filter
75         PyFilter * getPrevious (void) { return m_previous; }
76         /// set previous filter
77         void setPrevious (PyFilter * filt, bool useRefCnt = true);
78
79         /// find first filter in chain
80         FilterBase * findFirst (void);
81
82         /// get first filter's source pixel size
83         unsigned int firstPixelSize (void) { return findFirst()->getPixelSize(); }
84
85 protected:
86         /// previous pixel filter
87         PyFilter * m_previous;
88
89         /// filter pixel, source byte buffer
90         virtual unsigned int filter (unsigned char * src, short x, short y,
91                 short * size, unsigned int pixSize, unsigned int val = 0)
92         { return val; }
93         /// filter pixel, source int buffer
94         virtual unsigned int filter (unsigned int * src, short x, short y,
95                 short * size, unsigned int pixSize, unsigned int val = 0)
96         { return val; }
97
98         /// get source pixel size
99         virtual unsigned int getPixelSize (void) { return 1; }
100
101         /// get converted pixel from previous filters
102         template <class SRC> unsigned int convertPrevious (SRC src, short x, short y,
103                 short * size, unsigned int pixSize)
104         {
105                 // if previous filter doesn't exists, return source pixel
106                 if (m_previous == NULL) return *src;
107                 // otherwise return converted pixel
108                 return m_previous->m_filter->convert(src, x, y, size, pixSize);
109         }
110 };
111
112
113 // list of python filter types
114 extern PyTypeList pyFilterTypes;
115
116
117 // functions for python interface
118
119 // object initialization
120 template <class T> static int Filter_init (PyObject * pySelf, PyObject * args, PyObject * kwds)
121 {
122         PyFilter * self = reinterpret_cast<PyFilter*>(pySelf);
123         // create filter object
124         if (self->m_filter != NULL) delete self->m_filter;
125         self->m_filter = new T();
126         // initialization succeded
127         return 0;
128 }
129
130 // object allocation
131 PyObject * Filter_allocNew (PyTypeObject * type, PyObject * args, PyObject * kwds);
132 // object deallocation
133 void Filter_dealloc (PyFilter * self);
134
135 // get previous pixel filter object
136 PyObject * Filter_getPrevious (PyFilter * self, void * closure);
137 // set previous pixel filter object
138 int Filter_setPrevious (PyFilter * self, PyObject * value, void * closure);
139
140
141 #endif