/src/pyglue/PyContext.cpp

http://github.com/imageworks/OpenColorIO · C++ · 374 lines · 299 code · 40 blank · 35 comment · 8 complexity · 9d6672076f23969aa95a2441ab576202 MD5 · raw file

  1. /*
  2. Copyright (c) 2003-2010 Sony Pictures Imageworks Inc., et al.
  3. All Rights Reserved.
  4. Redistribution and use in source and binary forms, with or without
  5. modification, are permitted provided that the following conditions are
  6. met:
  7. * Redistributions of source code must retain the above copyright
  8. notice, this list of conditions and the following disclaimer.
  9. * Redistributions in binary form must reproduce the above copyright
  10. notice, this list of conditions and the following disclaimer in the
  11. documentation and/or other materials provided with the distribution.
  12. * Neither the name of Sony Pictures Imageworks nor the names of its
  13. contributors may be used to endorse or promote products derived from
  14. this software without specific prior written permission.
  15. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  16. "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  17. LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  18. A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  19. OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  20. SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  21. LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  22. DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  23. THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  24. (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  25. OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  26. */
  27. #include <Python.h>
  28. #include <OpenColorIO/OpenColorIO.h>
  29. #include "PyUtil.h"
  30. #include "PyDoc.h"
  31. OCIO_NAMESPACE_ENTER
  32. {
  33. PyObject * BuildConstPyContext(ConstContextRcPtr context)
  34. {
  35. return BuildConstPyOCIO<PyOCIO_Context, ContextRcPtr,
  36. ConstContextRcPtr>(context, PyOCIO_ContextType);
  37. }
  38. PyObject * BuildEditablePyContext(ContextRcPtr context)
  39. {
  40. return BuildEditablePyOCIO<PyOCIO_Context, ContextRcPtr,
  41. ConstContextRcPtr>(context, PyOCIO_ContextType);
  42. }
  43. bool IsPyContext(PyObject * pyobject)
  44. {
  45. return IsPyOCIOType(pyobject, PyOCIO_ContextType);
  46. }
  47. bool IsPyContextEditable(PyObject * pyobject)
  48. {
  49. return IsPyEditable<PyOCIO_Context>(pyobject, PyOCIO_ContextType);
  50. }
  51. ConstContextRcPtr GetConstContext(PyObject * pyobject, bool allowCast)
  52. {
  53. return GetConstPyOCIO<PyOCIO_Context, ConstContextRcPtr>(pyobject,
  54. PyOCIO_ContextType, allowCast);
  55. }
  56. ContextRcPtr GetEditableContext(PyObject * pyobject)
  57. {
  58. return GetEditablePyOCIO<PyOCIO_Context, ContextRcPtr>(pyobject,
  59. PyOCIO_ContextType);
  60. }
  61. namespace
  62. {
  63. ///////////////////////////////////////////////////////////////////////
  64. ///
  65. int PyOCIO_Context_init(PyOCIO_Context * self, PyObject * args, PyObject * kwds);
  66. void PyOCIO_Context_delete(PyOCIO_Context * self, PyObject * args);
  67. PyObject * PyOCIO_Context_isEditable(PyObject * self);
  68. PyObject * PyOCIO_Context_createEditableCopy(PyObject * self);
  69. PyObject * PyOCIO_Context_getCacheID(PyObject * self);
  70. PyObject * PyOCIO_Context_getSearchPath(PyObject * self);
  71. PyObject * PyOCIO_Context_setSearchPath(PyObject * self, PyObject * args);
  72. PyObject * PyOCIO_Context_getWorkingDir(PyObject * self);
  73. PyObject * PyOCIO_Context_setWorkingDir(PyObject * self, PyObject * args);
  74. PyObject * PyOCIO_Context_getStringVar(PyObject * self, PyObject * args);
  75. PyObject * PyOCIO_Context_setStringVar(PyObject * self, PyObject * args);
  76. PyObject * PyOCIO_Context_getNumStringVars(PyObject * self, PyObject * args);
  77. PyObject * PyOCIO_Context_getStringVarNameByIndex(PyObject * self, PyObject * args);
  78. PyObject * PyOCIO_Context_clearStringVars(PyObject * self);
  79. PyObject * PyOCIO_Context_setEnvironmentMode(PyObject * self, PyObject * args);
  80. PyObject * PyOCIO_Context_getEnvironmentMode(PyObject * self);
  81. PyObject * PyOCIO_Context_loadEnvironment(PyObject * self);
  82. PyObject * PyOCIO_Context_resolveStringVar(PyObject * self, PyObject * args);
  83. PyObject * PyOCIO_Context_resolveFileLocation(PyObject * self, PyObject * args);
  84. ///////////////////////////////////////////////////////////////////////
  85. ///
  86. PyMethodDef PyOCIO_Context_methods[] = {
  87. { "isEditable",
  88. (PyCFunction) PyOCIO_Context_isEditable, METH_NOARGS, CONTEXT_ISEDITABLE__DOC__ },
  89. { "createEditableCopy",
  90. (PyCFunction) PyOCIO_Context_createEditableCopy, METH_NOARGS, CONTEXT_CREATEEDITABLECOPY__DOC__ },
  91. { "getCacheID",
  92. (PyCFunction) PyOCIO_Context_getCacheID, METH_NOARGS, CONTEXT_GETCACHEID__DOC__ },
  93. { "getSearchPath",
  94. (PyCFunction) PyOCIO_Context_getSearchPath, METH_NOARGS, CONTEXT_GETSEARCHPATH__DOC__ },
  95. { "setSearchPath",
  96. PyOCIO_Context_setSearchPath, METH_VARARGS, CONTEXT_SETSEARCHPATH__DOC__ },
  97. { "getWorkingDir",
  98. (PyCFunction) PyOCIO_Context_getWorkingDir, METH_NOARGS, CONTEXT_GETWORKINGDIR__DOC__ },
  99. { "setWorkingDir",
  100. PyOCIO_Context_setWorkingDir, METH_VARARGS, CONTEXT_SETWORKINGDIR__DOC__ },
  101. { "getStringVar",
  102. PyOCIO_Context_getStringVar, METH_VARARGS, CONTEXT_GETSTRINGVAR__DOC__ },
  103. { "setStringVar",
  104. PyOCIO_Context_setStringVar, METH_VARARGS, CONTEXT_SETSTRINGVAR__DOC__ },
  105. { "getNumStringVars",
  106. PyOCIO_Context_getNumStringVars, METH_VARARGS, CONTEXT_GETNUMSTRINGVARS__DOC__ },
  107. { "getStringVarNameByIndex",
  108. PyOCIO_Context_getStringVarNameByIndex, METH_VARARGS, CONTEXT_GETSTRINGVARNAMEBYINDEX__DOC__ },
  109. { "clearStringVars",
  110. (PyCFunction) PyOCIO_Context_clearStringVars, METH_NOARGS, CONTEXT_CLEARSTRINGVARS__DOC__ },
  111. { "setEnvironmentMode",
  112. PyOCIO_Context_setEnvironmentMode, METH_VARARGS, CONTEXT_SETENVIRONMENTMODE__DOC__ },
  113. { "getEnvironmentMode",
  114. (PyCFunction) PyOCIO_Context_getEnvironmentMode, METH_NOARGS, CONTEXT_GETENVIRONMENTMODE__DOC__ },
  115. { "loadEnvironment",
  116. (PyCFunction) PyOCIO_Context_loadEnvironment, METH_NOARGS, CONTEXT_LOADENVIRONMENT__DOC__ },
  117. { "resolveStringVar",
  118. PyOCIO_Context_resolveStringVar, METH_VARARGS, CONTEXT_RESOLVESTRINGVAR__DOC__ },
  119. { "resolveFileLocation",
  120. PyOCIO_Context_resolveFileLocation, METH_VARARGS, CONTEXT_RESOLVEFILELOCATION__DOC__ },
  121. { NULL, NULL, 0, NULL }
  122. };
  123. }
  124. ///////////////////////////////////////////////////////////////////////////
  125. ///
  126. PyTypeObject PyOCIO_ContextType = {
  127. PyVarObject_HEAD_INIT(NULL, 0) //ob_size
  128. "OCIO.Context", //tp_name
  129. sizeof(PyOCIO_Context), //tp_basicsize
  130. 0, //tp_itemsize
  131. (destructor)PyOCIO_Context_delete, //tp_dealloc
  132. 0, //tp_print
  133. 0, //tp_getattr
  134. 0, //tp_setattr
  135. 0, //tp_compare
  136. 0, //tp_repr
  137. 0, //tp_as_number
  138. 0, //tp_as_sequence
  139. 0, //tp_as_mapping
  140. 0, //tp_hash
  141. 0, //tp_call
  142. 0, //tp_str
  143. 0, //tp_getattro
  144. 0, //tp_setattro
  145. 0, //tp_as_buffer
  146. Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, //tp_flags
  147. CONTEXT__DOC__, //tp_doc
  148. 0, //tp_traverse
  149. 0, //tp_clear
  150. 0, //tp_richcompare
  151. 0, //tp_weaklistoffset
  152. 0, //tp_iter
  153. 0, //tp_iternext
  154. PyOCIO_Context_methods, //tp_methods
  155. 0, //tp_members
  156. 0, //tp_getset
  157. 0, //tp_base
  158. 0, //tp_dict
  159. 0, //tp_descr_get
  160. 0, //tp_descr_set
  161. 0, //tp_dictoffset
  162. (initproc) PyOCIO_Context_init, //tp_init
  163. 0, //tp_alloc
  164. 0, //tp_new
  165. 0, //tp_free
  166. 0, //tp_is_gc
  167. };
  168. namespace
  169. {
  170. ///////////////////////////////////////////////////////////////////////
  171. ///
  172. int PyOCIO_Context_init(PyOCIO_Context *self, PyObject * /*args*/, PyObject * /*kwds*/)
  173. {
  174. OCIO_PYTRY_ENTER()
  175. return BuildPyObject<PyOCIO_Context, ConstContextRcPtr, ContextRcPtr>(self, Context::Create());
  176. OCIO_PYTRY_EXIT(-1)
  177. }
  178. void PyOCIO_Context_delete(PyOCIO_Context *self, PyObject * /*args*/)
  179. {
  180. DeletePyObject<PyOCIO_Context>(self);
  181. }
  182. PyObject * PyOCIO_Context_isEditable(PyObject * self)
  183. {
  184. return PyBool_FromLong(IsPyContextEditable(self));
  185. }
  186. PyObject * PyOCIO_Context_createEditableCopy(PyObject * self)
  187. {
  188. OCIO_PYTRY_ENTER()
  189. ConstContextRcPtr context = GetConstContext(self, true);
  190. ContextRcPtr copy = context->createEditableCopy();
  191. return BuildEditablePyContext(copy);
  192. OCIO_PYTRY_EXIT(NULL)
  193. }
  194. PyObject * PyOCIO_Context_getCacheID(PyObject * self)
  195. {
  196. OCIO_PYTRY_ENTER()
  197. ConstContextRcPtr context = GetConstContext(self, true);
  198. return PyString_FromString(context->getCacheID());
  199. OCIO_PYTRY_EXIT(NULL)
  200. }
  201. PyObject * PyOCIO_Context_getSearchPath(PyObject * self)
  202. {
  203. OCIO_PYTRY_ENTER()
  204. ConstContextRcPtr context = GetConstContext(self, true);
  205. return PyString_FromString(context->getSearchPath());
  206. OCIO_PYTRY_EXIT(NULL)
  207. }
  208. PyObject * PyOCIO_Context_setSearchPath(PyObject * self, PyObject * args)
  209. {
  210. OCIO_PYTRY_ENTER()
  211. char* path = 0;
  212. if (!PyArg_ParseTuple(args, "s:setSearchPath",
  213. &path)) return NULL;
  214. ContextRcPtr context = GetEditableContext(self);
  215. context->setSearchPath(path);
  216. Py_RETURN_NONE;
  217. OCIO_PYTRY_EXIT(NULL)
  218. }
  219. PyObject * PyOCIO_Context_getWorkingDir(PyObject * self)
  220. {
  221. OCIO_PYTRY_ENTER()
  222. ConstContextRcPtr context = GetConstContext(self, true);
  223. return PyString_FromString(context->getWorkingDir());
  224. OCIO_PYTRY_EXIT(NULL)
  225. }
  226. PyObject * PyOCIO_Context_setWorkingDir(PyObject * self, PyObject * args)
  227. {
  228. OCIO_PYTRY_ENTER()
  229. char* dirname = 0;
  230. if (!PyArg_ParseTuple(args, "s:setWorkingDir",
  231. &dirname)) return NULL;
  232. ContextRcPtr context = GetEditableContext(self);
  233. context->setWorkingDir(dirname);
  234. Py_RETURN_NONE;
  235. OCIO_PYTRY_EXIT(NULL)
  236. }
  237. PyObject * PyOCIO_Context_getStringVar(PyObject * self, PyObject * args)
  238. {
  239. OCIO_PYTRY_ENTER()
  240. char* name = 0;
  241. if (!PyArg_ParseTuple(args, "s:getStringVar",
  242. &name)) return NULL;
  243. ConstContextRcPtr context = GetConstContext(self, true);
  244. return PyString_FromString(context->getStringVar(name));
  245. OCIO_PYTRY_EXIT(NULL)
  246. }
  247. PyObject * PyOCIO_Context_setStringVar(PyObject * self, PyObject * args)
  248. {
  249. OCIO_PYTRY_ENTER()
  250. char* name = 0;
  251. char* value = 0;
  252. if (!PyArg_ParseTuple(args, "ss:setStringVar",
  253. &name, &value)) return NULL;
  254. ContextRcPtr context = GetEditableContext(self);
  255. context->setStringVar(name, value);
  256. Py_RETURN_NONE;
  257. OCIO_PYTRY_EXIT(NULL)
  258. }
  259. PyObject * PyOCIO_Context_getNumStringVars(PyObject * self, PyObject * /*args*/)
  260. {
  261. OCIO_PYTRY_ENTER()
  262. ConstContextRcPtr context = GetConstContext(self, true);
  263. return PyInt_FromLong(context->getNumStringVars());
  264. OCIO_PYTRY_EXIT(NULL)
  265. }
  266. PyObject * PyOCIO_Context_getStringVarNameByIndex(PyObject * self, PyObject * args)
  267. {
  268. OCIO_PYTRY_ENTER()
  269. int index = 0;
  270. if (!PyArg_ParseTuple(args,"i:getStringVarNameByIndex",
  271. &index)) return NULL;
  272. ConstContextRcPtr context = GetConstContext(self, true);
  273. return PyString_FromString(context->getStringVarNameByIndex(index));
  274. OCIO_PYTRY_EXIT(NULL)
  275. }
  276. PyObject * PyOCIO_Context_clearStringVars(PyObject * self)
  277. {
  278. OCIO_PYTRY_ENTER()
  279. ContextRcPtr context = GetEditableContext(self);
  280. context->clearStringVars();
  281. Py_RETURN_NONE;
  282. OCIO_PYTRY_EXIT(NULL)
  283. }
  284. PyObject * PyOCIO_Context_setEnvironmentMode(PyObject * self, PyObject * args)
  285. {
  286. OCIO_PYTRY_ENTER()
  287. EnvironmentMode mode;
  288. if (!PyArg_ParseTuple(args, "O&:setEnvironmentMode",
  289. ConvertPyObjectToEnvironmentMode, &mode)) return NULL;
  290. ContextRcPtr context = GetEditableContext(self);
  291. context->setEnvironmentMode(mode);
  292. Py_RETURN_NONE;
  293. OCIO_PYTRY_EXIT(NULL)
  294. }
  295. PyObject * PyOCIO_Context_getEnvironmentMode(PyObject * self)
  296. {
  297. OCIO_PYTRY_ENTER()
  298. ConstContextRcPtr context = GetConstContext(self, true);
  299. EnvironmentMode mode = context->getEnvironmentMode();
  300. return PyString_FromString(EnvironmentModeToString(mode));
  301. OCIO_PYTRY_EXIT(NULL)
  302. }
  303. PyObject * PyOCIO_Context_loadEnvironment(PyObject * self)
  304. {
  305. OCIO_PYTRY_ENTER()
  306. ContextRcPtr context = GetEditableContext(self);
  307. context->loadEnvironment();
  308. Py_RETURN_NONE;
  309. OCIO_PYTRY_EXIT(NULL)
  310. }
  311. PyObject * PyOCIO_Context_resolveStringVar(PyObject * self, PyObject * args)
  312. {
  313. OCIO_PYTRY_ENTER()
  314. char* str = 0;
  315. if (!PyArg_ParseTuple(args,"s:resolveStringVar",
  316. &str)) return NULL;
  317. ConstContextRcPtr context = GetConstContext(self, true);
  318. return PyString_FromString(context->resolveStringVar(str));
  319. OCIO_PYTRY_EXIT(NULL)
  320. }
  321. PyObject * PyOCIO_Context_resolveFileLocation(PyObject * self, PyObject * args)
  322. {
  323. OCIO_PYTRY_ENTER()
  324. char* filename = 0;
  325. if (!PyArg_ParseTuple(args,"s:resolveFileLocation",
  326. &filename)) return NULL;
  327. ConstContextRcPtr context = GetConstContext(self, true);
  328. return PyString_FromString(context->resolveFileLocation(filename));
  329. OCIO_PYTRY_EXIT(NULL)
  330. }
  331. }
  332. }
  333. OCIO_NAMESPACE_EXIT