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