summaryrefslogtreecommitdiff
path: root/src/pyglue/PyContext.cpp
diff options
context:
space:
mode:
authorMatteo F. Vescovi <mfv.debian@gmail.com>2013-08-20 09:53:19 +0100
committerMatteo F. Vescovi <mfv.debian@gmail.com>2013-08-20 09:53:19 +0100
commit66e5d9e2915733247bca47d077414ec2594aedad (patch)
treef4070a31bf015e159dadd34378cda703d8f6edea /src/pyglue/PyContext.cpp
opencolorio (1.0.8~dfsg0-2) unstable; urgency=low
* debian/rules: get-orig-source stuff added * debian/rules: useless dh addon removed * debian/rules: License.txt duplicate removed * debian/rules: SSE optimization disabled (Closes: #719174) * debian/libopencolorio1.symbols: file removed (Closes: #719175) # imported from the archive
Diffstat (limited to 'src/pyglue/PyContext.cpp')
-rw-r--r--src/pyglue/PyContext.cpp494
1 files changed, 494 insertions, 0 deletions
diff --git a/src/pyglue/PyContext.cpp b/src/pyglue/PyContext.cpp
new file mode 100644
index 0000000..6a97aad
--- /dev/null
+++ b/src/pyglue/PyContext.cpp
@@ -0,0 +1,494 @@
+/*
+Copyright (c) 2003-2010 Sony Pictures Imageworks Inc., et al.
+All Rights Reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+* Neither the name of Sony Pictures Imageworks nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+
+#include <Python.h>
+
+#include <OpenColorIO/OpenColorIO.h>
+
+#include "PyContext.h"
+#include "PyTransform.h"
+#include "PyUtil.h"
+#include "PyDoc.h"
+
+OCIO_NAMESPACE_ENTER
+{
+ ///////////////////////////////////////////////////////////////////////////
+ ///
+
+ bool AddContextObjectToModule( PyObject* m )
+ {
+ PyOCIO_ContextType.tp_new = PyType_GenericNew;
+ if ( PyType_Ready(&PyOCIO_ContextType) < 0 ) return false;
+
+ Py_INCREF( &PyOCIO_ContextType );
+ PyModule_AddObject(m, "Context",
+ (PyObject *)&PyOCIO_ContextType);
+
+ return true;
+ }
+
+ PyObject * BuildConstPyContext(ConstContextRcPtr context)
+ {
+ if (!context)
+ {
+ Py_RETURN_NONE;
+ }
+
+ PyOCIO_Context * pycontext = PyObject_New(
+ PyOCIO_Context, (PyTypeObject * ) &PyOCIO_ContextType);
+
+ pycontext->constcppobj = new ConstContextRcPtr();
+ *pycontext->constcppobj = context;
+
+ pycontext->cppobj = new ContextRcPtr();
+ pycontext->isconst = true;
+
+ return ( PyObject * ) pycontext;
+ }
+
+ PyObject * BuildEditablePyContext(ContextRcPtr context)
+ {
+ if (!context)
+ {
+ Py_RETURN_NONE;
+ }
+
+ PyOCIO_Context * pycontext = PyObject_New(
+ PyOCIO_Context, (PyTypeObject * ) &PyOCIO_ContextType);
+
+ pycontext->constcppobj = new ConstContextRcPtr();
+ pycontext->cppobj = new ContextRcPtr();
+ *pycontext->cppobj = context;
+
+ pycontext->isconst = false;
+
+ return ( PyObject * ) pycontext;
+ }
+
+ bool IsPyContext(PyObject * pyobject)
+ {
+ if(!pyobject) return false;
+ return (PyObject_Type(pyobject) == (PyObject *) (&PyOCIO_ContextType));
+ }
+
+ bool IsPyContextEditable(PyObject * pyobject)
+ {
+ if(!IsPyContext(pyobject))
+ {
+ throw Exception("PyObject must be an OCIO.Context.");
+ }
+
+ PyOCIO_Context * pycontext = reinterpret_cast<PyOCIO_Context *> (pyobject);
+ return (!pycontext->isconst);
+ }
+
+ ConstContextRcPtr GetConstContext(PyObject * pyobject, bool allowCast)
+ {
+ if(!IsPyContext(pyobject))
+ {
+ throw Exception("PyObject must be an OCIO.Context.");
+ }
+
+ PyOCIO_Context * pycontext = reinterpret_cast<PyOCIO_Context *> (pyobject);
+ if(pycontext->isconst && pycontext->constcppobj)
+ {
+ return *pycontext->constcppobj;
+ }
+
+ if(allowCast && !pycontext->isconst && pycontext->cppobj)
+ {
+ return *pycontext->cppobj;
+ }
+
+ throw Exception("PyObject must be a valid OCIO.Context.");
+ }
+
+ ContextRcPtr GetEditableContext(PyObject * pyobject)
+ {
+ if(!IsPyContext(pyobject))
+ {
+ throw Exception("PyObject must be an OCIO.Context.");
+ }
+
+ PyOCIO_Context * pycontext = reinterpret_cast<PyOCIO_Context *> (pyobject);
+ if(!pycontext->isconst && pycontext->cppobj)
+ {
+ return *pycontext->cppobj;
+ }
+
+ throw Exception("PyObject must be an editable OCIO.Context.");
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ ///
+
+ namespace
+ {
+ int PyOCIO_Context_init( PyOCIO_Context * self, PyObject * args, PyObject * kwds );
+ void PyOCIO_Context_delete( PyOCIO_Context * self, PyObject * args );
+ PyObject * PyOCIO_Context_isEditable( PyObject * self );
+ PyObject * PyOCIO_Context_createEditableCopy( PyObject * self );
+ PyObject * PyOCIO_Context_getCacheID( PyObject * self );
+
+ PyObject * PyOCIO_Context_getSearchPath( PyObject * self );
+ PyObject * PyOCIO_Context_setSearchPath( PyObject * self, PyObject *args );
+ PyObject * PyOCIO_Context_getWorkingDir( PyObject * self );
+ PyObject * PyOCIO_Context_setWorkingDir( PyObject * self, PyObject *args );
+ PyObject * PyOCIO_Context_getStringVar( PyObject * self, PyObject *args );
+ PyObject * PyOCIO_Context_setStringVar( PyObject * self, PyObject *args );
+
+ PyObject * PyOCIO_Context_loadEnvironment( PyObject * self );
+
+ PyObject * PyOCIO_Context_resolveStringVar( PyObject * self, PyObject *args );
+ PyObject * PyOCIO_Context_resolveFileLocation( PyObject * self, PyObject *args );
+
+ ///////////////////////////////////////////////////////////////////////
+ ///
+
+ PyMethodDef PyOCIO_Context_methods[] = {
+ {"isEditable",
+ (PyCFunction) PyOCIO_Context_isEditable, METH_NOARGS, CONTEXT_ISEDITABLE__DOC__ },
+ {"createEditableCopy",
+ (PyCFunction) PyOCIO_Context_createEditableCopy, METH_NOARGS, CONTEXT_CREATEEDITABLECOPY__DOC__ },
+ {"getCacheID",
+ (PyCFunction) PyOCIO_Context_getCacheID, METH_NOARGS, CONTEXT_GETCACHEID__DOC__ },
+ {"getSearchPath",
+ (PyCFunction) PyOCIO_Context_getSearchPath, METH_NOARGS, CONTEXT_GETSEARCHPATH__DOC__ },
+ {"setSearchPath",
+ PyOCIO_Context_setSearchPath, METH_VARARGS, CONTEXT_SETSEARCHPATH__DOC__ },
+ {"getWorkingDir",
+ (PyCFunction) PyOCIO_Context_getWorkingDir, METH_NOARGS, CONTEXT_GETWORKINGDIR__DOC__ },
+ {"setWorkingDir",
+ PyOCIO_Context_setWorkingDir, METH_VARARGS, CONTEXT_SETWORKINGDIR__DOC__ },
+ {"getStringVar",
+ PyOCIO_Context_getStringVar, METH_VARARGS, CONTEXT_GETSTRINGVAR__DOC__ },
+ {"setStringVar",
+ PyOCIO_Context_setStringVar, METH_VARARGS, CONTEXT_SETSTRINGVAR__DOC__ },
+ {"loadEnvironment",
+ (PyCFunction) PyOCIO_Context_loadEnvironment, METH_NOARGS, CONTEXT_LOADENVIRONMENT__DOC__ },
+ {"resolveStringVar",
+ PyOCIO_Context_resolveStringVar, METH_VARARGS, CONTEXT_RESOLVESTRINGVAR__DOC__ },
+ {"resolveFileLocation",
+ PyOCIO_Context_resolveFileLocation, METH_VARARGS, CONTEXT_RESOLVEFILELOCATION__DOC__ },
+ {NULL, NULL, 0, NULL}
+ };
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ ///
+
+ PyTypeObject PyOCIO_ContextType = {
+ PyObject_HEAD_INIT(NULL)
+ 0, //ob_size
+ "OCIO.Context", //tp_name
+ sizeof(PyOCIO_Context), //tp_basicsize
+ 0, //tp_itemsize
+ (destructor)PyOCIO_Context_delete, //tp_dealloc
+ 0, //tp_print
+ 0, //tp_getattr
+ 0, //tp_setattr
+ 0, //tp_compare
+ 0, //tp_repr
+ 0, //tp_as_number
+ 0, //tp_as_sequence
+ 0, //tp_as_mapping
+ 0, //tp_hash
+ 0, //tp_call
+ 0, //tp_str
+ 0, //tp_getattro
+ 0, //tp_setattro
+ 0, //tp_as_buffer
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, //tp_flags
+ CONTEXT__DOC__, //tp_doc
+ 0, //tp_traverse
+ 0, //tp_clear
+ 0, //tp_richcompare
+ 0, //tp_weaklistoffset
+ 0, //tp_iter
+ 0, //tp_iternext
+ PyOCIO_Context_methods, //tp_methods
+ 0, //tp_members
+ 0, //tp_getset
+ 0, //tp_base
+ 0, //tp_dict
+ 0, //tp_descr_get
+ 0, //tp_descr_set
+ 0, //tp_dictoffset
+ (initproc) PyOCIO_Context_init, //tp_init
+ 0, //tp_alloc
+ 0, //tp_new
+ 0, //tp_free
+ 0, //tp_is_gc
+ 0, //tp_bases
+ 0, //tp_mro
+ 0, //tp_cache
+ 0, //tp_subclasses
+ 0, //tp_weaklist
+ 0, //tp_del
+ #if PY_VERSION_HEX > 0x02060000
+ 0, //tp_version_tag
+ #endif
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ ///
+
+ namespace
+ {
+ ///////////////////////////////////////////////////////////////////////
+ ///
+ int PyOCIO_Context_init( PyOCIO_Context *self, PyObject * /*args*/, PyObject * /*kwds*/ )
+ {
+ ///////////////////////////////////////////////////////////////////
+ /// init pyobject fields
+
+ self->constcppobj = new ConstContextRcPtr();
+ self->cppobj = new ContextRcPtr();
+ self->isconst = true;
+
+ try
+ {
+ *self->cppobj = Context::Create();
+ self->isconst = false;
+ return 0;
+ }
+ catch ( const std::exception & e )
+ {
+ std::string message = "Cannot create context: ";
+ message += e.what();
+ PyErr_SetString( PyExc_RuntimeError, message.c_str() );
+ return -1;
+ }
+ }
+
+ ////////////////////////////////////////////////////////////////////////
+
+ void PyOCIO_Context_delete( PyOCIO_Context *self, PyObject * /*args*/ )
+ {
+ delete self->constcppobj;
+ delete self->cppobj;
+
+ self->ob_type->tp_free((PyObject*)self);
+ }
+
+ ////////////////////////////////////////////////////////////////////////
+
+ PyObject * PyOCIO_Context_isEditable( PyObject * self )
+ {
+ return PyBool_FromLong(IsPyContextEditable(self));
+ }
+
+ PyObject * PyOCIO_Context_createEditableCopy( PyObject * self )
+ {
+ try
+ {
+ ConstContextRcPtr context = GetConstContext(self, true);
+ ContextRcPtr copy = context->createEditableCopy();
+ return BuildEditablePyContext( copy );
+ }
+ catch(...)
+ {
+ Python_Handle_Exception();
+ return NULL;
+ }
+ }
+
+ PyObject * PyOCIO_Context_getCacheID( PyObject * self )
+ {
+ try
+ {
+ ConstContextRcPtr context = GetConstContext(self, true);
+ return PyString_FromString( context->getCacheID() );
+ }
+ catch(...)
+ {
+ Python_Handle_Exception();
+ return NULL;
+ }
+ }
+
+ ////////////////////////////////////////////////////////////////////////
+
+ PyObject * PyOCIO_Context_getSearchPath( PyObject * self )
+ {
+ try
+ {
+ ConstContextRcPtr context = GetConstContext(self, true);
+ return PyString_FromString( context->getSearchPath() );
+ }
+ catch(...)
+ {
+ Python_Handle_Exception();
+ return NULL;
+ }
+ }
+
+ PyObject * PyOCIO_Context_setSearchPath( PyObject * self, PyObject * args )
+ {
+ try
+ {
+ char * path = 0;
+ if (!PyArg_ParseTuple(args,"s:setSearchPath", &path)) return NULL;
+
+ ContextRcPtr context = GetEditableContext(self);
+ context->setSearchPath( path );
+
+ Py_RETURN_NONE;
+ }
+ catch(...)
+ {
+ Python_Handle_Exception();
+ return NULL;
+ }
+ }
+
+ PyObject * PyOCIO_Context_getWorkingDir( PyObject * self )
+ {
+ try
+ {
+ ConstContextRcPtr context = GetConstContext(self, true);
+ return PyString_FromString( context->getWorkingDir() );
+ }
+ catch(...)
+ {
+ Python_Handle_Exception();
+ return NULL;
+ }
+ }
+
+ PyObject * PyOCIO_Context_setWorkingDir( PyObject * self, PyObject * args )
+ {
+ try
+ {
+ char * dirname = 0;
+ if (!PyArg_ParseTuple(args,"s:setWorkingDir", &dirname)) return NULL;
+
+ ContextRcPtr context = GetEditableContext(self);
+ context->setWorkingDir( dirname );
+
+ Py_RETURN_NONE;
+ }
+ catch(...)
+ {
+ Python_Handle_Exception();
+ return NULL;
+ }
+ }
+
+ PyObject * PyOCIO_Context_getStringVar( PyObject * self, PyObject * args )
+ {
+ try
+ {
+ char * name = 0;
+ if (!PyArg_ParseTuple(args,"s:getStringVar", &name)) return NULL;
+
+ ConstContextRcPtr context = GetConstContext(self, true);
+ return PyString_FromString( context->getStringVar(name) );
+ }
+ catch(...)
+ {
+ Python_Handle_Exception();
+ return NULL;
+ }
+ }
+
+ PyObject * PyOCIO_Context_setStringVar( PyObject * self, PyObject * args )
+ {
+ try
+ {
+ char * name = 0;
+ char * value = 0;
+ if (!PyArg_ParseTuple(args,"ss:setStringVar", &name, &value)) return NULL;
+
+ ContextRcPtr context = GetEditableContext(self);
+ context->setStringVar( name, value );
+
+ Py_RETURN_NONE;
+ }
+ catch(...)
+ {
+ Python_Handle_Exception();
+ return NULL;
+ }
+ }
+
+ PyObject * PyOCIO_Context_loadEnvironment( PyObject * self )
+ {
+ try
+ {
+ ContextRcPtr context = GetEditableContext(self);
+ context->loadEnvironment();
+
+ Py_RETURN_NONE;
+ }
+ catch(...)
+ {
+ Python_Handle_Exception();
+ return NULL;
+ }
+ }
+
+ PyObject * PyOCIO_Context_resolveStringVar( PyObject * self, PyObject * args )
+ {
+ try
+ {
+ char * str = 0;
+ if (!PyArg_ParseTuple(args,"s:resolveStringVar", &str)) return NULL;
+
+ ConstContextRcPtr context = GetConstContext(self, true);
+ return PyString_FromString( context->resolveStringVar(str) );
+ }
+ catch(...)
+ {
+ Python_Handle_Exception();
+ return NULL;
+ }
+ }
+
+ PyObject * PyOCIO_Context_resolveFileLocation( PyObject * self, PyObject * args )
+ {
+ try
+ {
+ char * filename = 0;
+ if (!PyArg_ParseTuple(args,"s:resolveFileLocation", &filename)) return NULL;
+
+ ConstContextRcPtr context = GetConstContext(self, true);
+ return PyString_FromString( context->resolveFileLocation(filename) );
+ }
+ catch(...)
+ {
+ Python_Handle_Exception();
+ return NULL;
+ }
+ }
+
+ }
+
+}
+OCIO_NAMESPACE_EXIT