Blender V2.61 - r43446
|
00001 /* 00002 ----------------------------------------------------------------------------- 00003 This source file is part of VideoTexture library 00004 00005 Copyright (c) 2007 The Zdeno Ash Miklas 00006 00007 This program is free software; you can redistribute it and/or modify it under 00008 the terms of the GNU Lesser General Public License as published by the Free Software 00009 Foundation; either version 2 of the License, or (at your option) any later 00010 version. 00011 00012 This program is distributed in the hope that it will be useful, but WITHOUT 00013 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 00014 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. 00015 00016 You should have received a copy of the GNU Lesser General Public License along with 00017 this program; if not, write to the Free Software Foundation, Inc., 59 Temple 00018 Place - Suite 330, Boston, MA 02111-1307, USA, or go to 00019 http://www.gnu.org/copyleft/lesser.txt. 00020 ----------------------------------------------------------------------------- 00021 */ 00022 00027 #include <PyObjectPlus.h> 00028 #include <structmember.h> 00029 00030 #include "FilterColor.h" 00031 00032 #include "FilterBase.h" 00033 #include "PyTypeList.h" 00034 00035 // implementation FilterGray 00036 00037 // attributes structure 00038 static PyGetSetDef filterGrayGetSets[] = 00039 { // attributes from FilterBase class 00040 {(char*)"previous", (getter)Filter_getPrevious, (setter)Filter_setPrevious, (char*)"previous pixel filter", NULL}, 00041 {NULL} 00042 }; 00043 00044 // define python type 00045 PyTypeObject FilterGrayType = 00046 { 00047 PyVarObject_HEAD_INIT(NULL, 0) 00048 "VideoTexture.FilterGray", /*tp_name*/ 00049 sizeof(PyFilter), /*tp_basicsize*/ 00050 0, /*tp_itemsize*/ 00051 (destructor)Filter_dealloc,/*tp_dealloc*/ 00052 0, /*tp_print*/ 00053 0, /*tp_getattr*/ 00054 0, /*tp_setattr*/ 00055 0, /*tp_compare*/ 00056 0, /*tp_repr*/ 00057 0, /*tp_as_number*/ 00058 0, /*tp_as_sequence*/ 00059 0, /*tp_as_mapping*/ 00060 0, /*tp_hash */ 00061 0, /*tp_call*/ 00062 0, /*tp_str*/ 00063 0, /*tp_getattro*/ 00064 0, /*tp_setattro*/ 00065 0, /*tp_as_buffer*/ 00066 Py_TPFLAGS_DEFAULT, /*tp_flags*/ 00067 "Filter for gray scale effect", /* tp_doc */ 00068 0, /* tp_traverse */ 00069 0, /* tp_clear */ 00070 0, /* tp_richcompare */ 00071 0, /* tp_weaklistoffset */ 00072 0, /* tp_iter */ 00073 0, /* tp_iternext */ 00074 NULL, /* tp_methods */ 00075 0, /* tp_members */ 00076 filterGrayGetSets, /* tp_getset */ 00077 0, /* tp_base */ 00078 0, /* tp_dict */ 00079 0, /* tp_descr_get */ 00080 0, /* tp_descr_set */ 00081 0, /* tp_dictoffset */ 00082 (initproc)Filter_init<FilterGray>, /* tp_init */ 00083 0, /* tp_alloc */ 00084 Filter_allocNew, /* tp_new */ 00085 }; 00086 00087 00088 // implementation FilterColor 00089 00090 // constructor 00091 FilterColor::FilterColor (void) 00092 { 00093 // reset color matrix to identity 00094 for (int r = 0; r < 4; ++r) 00095 for (int c = 0; c < 5; ++c) 00096 m_matrix[r][c] = (r == c) ? 256 : 0; 00097 } 00098 00099 // set color matrix 00100 void FilterColor::setMatrix (ColorMatrix & mat) 00101 { 00102 // copy matrix 00103 for (int r = 0; r < 4; ++r) 00104 for (int c = 0; c < 5; ++c) 00105 m_matrix[r][c] = mat[r][c]; 00106 } 00107 00108 00109 00110 // cast Filter pointer to FilterColor 00111 inline FilterColor * getFilterColor (PyFilter * self) 00112 { return static_cast<FilterColor*>(self->m_filter); } 00113 00114 00115 // python methods and get/sets 00116 00117 // get color matrix 00118 static PyObject * getMatrix (PyFilter * self, void * closure) 00119 { 00120 ColorMatrix & mat = getFilterColor(self)->getMatrix(); 00121 return Py_BuildValue("((hhhhh)(hhhhh)(hhhhh)(hhhhh))", 00122 mat[0][0], mat[0][1], mat[0][2], mat[0][3], mat[0][4], 00123 mat[1][0], mat[1][1], mat[1][2], mat[1][3], mat[1][4], 00124 mat[2][0], mat[2][1], mat[2][2], mat[2][3], mat[2][4], 00125 mat[3][0], mat[3][1], mat[3][2], mat[3][3], mat[3][4]); 00126 } 00127 00128 // set color matrix 00129 static int setMatrix (PyFilter * self, PyObject * value, void * closure) 00130 { 00131 // matrix to store items 00132 ColorMatrix mat; 00133 // check validity of parameter 00134 bool valid = value != NULL && PySequence_Check(value) 00135 && PySequence_Size(value) == 4; 00136 // check rows 00137 for (int r = 0; valid && r < 4; ++r) 00138 { 00139 // get row object 00140 PyObject * row = PySequence_Fast_GET_ITEM(value, r); 00141 // check sequence 00142 valid = PySequence_Check(row) && PySequence_Size(row) == 5; 00143 // check items 00144 for (int c = 0; valid && c < 5; ++c) 00145 { 00146 // item must be int 00147 valid = PyLong_Check(PySequence_Fast_GET_ITEM(row, c)); 00148 // if it is valid, save it in matrix 00149 if (valid) 00150 mat[r][c] = short(PyLong_AsSsize_t(PySequence_Fast_GET_ITEM(row, c))); 00151 } 00152 } 00153 // if parameter is not valid, report error 00154 if (!valid) 00155 { 00156 PyErr_SetString(PyExc_TypeError, "The value must be a matrix [4][5] of ints"); 00157 return -1; 00158 } 00159 // set color matrix 00160 getFilterColor(self)->setMatrix(mat); 00161 // success 00162 return 0; 00163 } 00164 00165 00166 // attributes structure 00167 static PyGetSetDef filterColorGetSets[] = 00168 { 00169 {(char*)"matrix", (getter)getMatrix, (setter)setMatrix, (char*)"matrix [4][5] for color calculation", NULL}, 00170 // attributes from FilterBase class 00171 {(char*)"previous", (getter)Filter_getPrevious, (setter)Filter_setPrevious, (char*)"previous pixel filter", NULL}, 00172 {NULL} 00173 }; 00174 00175 // define python type 00176 PyTypeObject FilterColorType = 00177 { 00178 PyVarObject_HEAD_INIT(NULL, 0) 00179 "VideoTexture.FilterColor", /*tp_name*/ 00180 sizeof(PyFilter), /*tp_basicsize*/ 00181 0, /*tp_itemsize*/ 00182 (destructor)Filter_dealloc,/*tp_dealloc*/ 00183 0, /*tp_print*/ 00184 0, /*tp_getattr*/ 00185 0, /*tp_setattr*/ 00186 0, /*tp_compare*/ 00187 0, /*tp_repr*/ 00188 0, /*tp_as_number*/ 00189 0, /*tp_as_sequence*/ 00190 0, /*tp_as_mapping*/ 00191 0, /*tp_hash */ 00192 0, /*tp_call*/ 00193 0, /*tp_str*/ 00194 0, /*tp_getattro*/ 00195 0, /*tp_setattro*/ 00196 0, /*tp_as_buffer*/ 00197 Py_TPFLAGS_DEFAULT, /*tp_flags*/ 00198 "Filter for color calculations", /* tp_doc */ 00199 0, /* tp_traverse */ 00200 0, /* tp_clear */ 00201 0, /* tp_richcompare */ 00202 0, /* tp_weaklistoffset */ 00203 0, /* tp_iter */ 00204 0, /* tp_iternext */ 00205 NULL, /* tp_methods */ 00206 0, /* tp_members */ 00207 filterColorGetSets, /* tp_getset */ 00208 0, /* tp_base */ 00209 0, /* tp_dict */ 00210 0, /* tp_descr_get */ 00211 0, /* tp_descr_set */ 00212 0, /* tp_dictoffset */ 00213 (initproc)Filter_init<FilterColor>, /* tp_init */ 00214 0, /* tp_alloc */ 00215 Filter_allocNew, /* tp_new */ 00216 }; 00217 00218 // implementation FilterLevel 00219 00220 // constructor 00221 FilterLevel::FilterLevel (void) 00222 { 00223 // reset color levels 00224 for (int r = 0; r < 4; ++r) 00225 { 00226 levels[r][0] = 0; 00227 levels[r][1] = 0xFF; 00228 levels[r][2] = 0xFF; 00229 } 00230 } 00231 00232 // set color levels 00233 void FilterLevel::setLevels (ColorLevel & lev) 00234 { 00235 // copy levels 00236 for (int r = 0; r < 4; ++r) 00237 { 00238 for (int c = 0; c < 2; ++c) 00239 levels[r][c] = lev[r][c]; 00240 levels[r][2] = lev[r][0] < lev[r][1] ? lev[r][1] - lev[r][0] : 1; 00241 } 00242 } 00243 00244 00245 // cast Filter pointer to FilterLevel 00246 inline FilterLevel * getFilterLevel (PyFilter * self) 00247 { return static_cast<FilterLevel*>(self->m_filter); } 00248 00249 00250 // python methods and get/sets 00251 00252 // get color levels 00253 static PyObject * getLevels (PyFilter * self, void * closure) 00254 { 00255 ColorLevel & lev = getFilterLevel(self)->getLevels(); 00256 return Py_BuildValue("((HH)(HH)(HH)(HH))", 00257 lev[0][0], lev[0][1], lev[1][0], lev[1][1], 00258 lev[2][0], lev[2][1], lev[3][0], lev[3][1]); 00259 } 00260 00261 // set color levels 00262 static int setLevels (PyFilter * self, PyObject * value, void * closure) 00263 { 00264 // matrix to store items 00265 ColorLevel lev; 00266 // check validity of parameter 00267 bool valid = value != NULL && PySequence_Check(value) 00268 && PySequence_Size(value) == 4; 00269 // check rows 00270 for (int r = 0; valid && r < 4; ++r) 00271 { 00272 // get row object 00273 PyObject * row = PySequence_Fast_GET_ITEM(value, r); 00274 // check sequence 00275 valid = PySequence_Check(row) && PySequence_Size(row) == 2; 00276 // check items 00277 for (int c = 0; valid && c < 2; ++c) 00278 { 00279 // item must be int 00280 valid = PyLong_Check(PySequence_Fast_GET_ITEM(row, c)); 00281 // if it is valid, save it in matrix 00282 if (valid) 00283 lev[r][c] = (unsigned short)(PyLong_AsSsize_t(PySequence_Fast_GET_ITEM(row, c))); 00284 } 00285 } 00286 // if parameter is not valid, report error 00287 if (!valid) 00288 { 00289 PyErr_SetString(PyExc_TypeError, "The value must be a matrix [4][2] of ints"); 00290 return -1; 00291 } 00292 // set color matrix 00293 getFilterLevel(self)->setLevels(lev); 00294 // success 00295 return 0; 00296 } 00297 00298 00299 // attributes structure 00300 static PyGetSetDef filterLevelGetSets[] = 00301 { 00302 {(char*)"levels", (getter)getLevels, (setter)setLevels, (char*)"levels matrix [4] (min, max)", NULL}, 00303 // attributes from FilterBase class 00304 {(char*)"previous", (getter)Filter_getPrevious, (setter)Filter_setPrevious, (char*)"previous pixel filter", NULL}, 00305 {NULL} 00306 }; 00307 00308 // define python type 00309 PyTypeObject FilterLevelType = 00310 { 00311 PyVarObject_HEAD_INIT(NULL, 0) 00312 "VideoTexture.FilterLevel", /*tp_name*/ 00313 sizeof(PyFilter), /*tp_basicsize*/ 00314 0, /*tp_itemsize*/ 00315 (destructor)Filter_dealloc,/*tp_dealloc*/ 00316 0, /*tp_print*/ 00317 0, /*tp_getattr*/ 00318 0, /*tp_setattr*/ 00319 0, /*tp_compare*/ 00320 0, /*tp_repr*/ 00321 0, /*tp_as_number*/ 00322 0, /*tp_as_sequence*/ 00323 0, /*tp_as_mapping*/ 00324 0, /*tp_hash */ 00325 0, /*tp_call*/ 00326 0, /*tp_str*/ 00327 0, /*tp_getattro*/ 00328 0, /*tp_setattro*/ 00329 0, /*tp_as_buffer*/ 00330 Py_TPFLAGS_DEFAULT, /*tp_flags*/ 00331 "Filter for levels calculations", /* tp_doc */ 00332 0, /* tp_traverse */ 00333 0, /* tp_clear */ 00334 0, /* tp_richcompare */ 00335 0, /* tp_weaklistoffset */ 00336 0, /* tp_iter */ 00337 0, /* tp_iternext */ 00338 NULL, /* tp_methods */ 00339 0, /* tp_members */ 00340 filterLevelGetSets, /* tp_getset */ 00341 0, /* tp_base */ 00342 0, /* tp_dict */ 00343 0, /* tp_descr_get */ 00344 0, /* tp_descr_set */ 00345 0, /* tp_dictoffset */ 00346 (initproc)Filter_init<FilterLevel>, /* tp_init */ 00347 0, /* tp_alloc */ 00348 Filter_allocNew, /* tp_new */ 00349 }; 00350