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