[packages/OpenColorIO] - updated to 1.1.0 - updated system-libs,libsuffix patches - yaml-cpp patch obsolete, added new one
qboosh
qboosh at pld-linux.org
Tue Jun 26 21:17:13 CEST 2018
commit b9df10ac532e1c18bd2ecbbfcd089f6d463d6060
Author: Jakub Bogusz <qboosh at pld-linux.org>
Date: Tue Jun 26 21:18:35 2018 +0200
- updated to 1.1.0
- updated system-libs,libsuffix patches
- yaml-cpp patch obsolete, added new one with visibility fixes and boost disabling for yaml-cpp >= 0.6.x
- added no-Werror patch (disable -Werror, there are some minor warnings)
- added oiio patch (provide an option to disable OpenImageIO even if installed)
- added cmake-dir patch (fix cmake files install path)
- bootstrap release 0.1
OpenColorIO-cmake-dir.patch | 26 +
OpenColorIO-libsuffix.patch | 12 +-
OpenColorIO-no-Werror.patch | 26 +
OpenColorIO-oiio.patch | 14 +
OpenColorIO-system-libs.patch | 58 +-
OpenColorIO-yaml-cpp.patch | 3846 +----------------------------------------
OpenColorIO.spec | 32 +-
7 files changed, 143 insertions(+), 3871 deletions(-)
---
diff --git a/OpenColorIO.spec b/OpenColorIO.spec
index 8085db4..752e106 100644
--- a/OpenColorIO.spec
+++ b/OpenColorIO.spec
@@ -15,23 +15,24 @@
Summary: Complete color management solution
Summary(pl.UTF-8): Kompletny pakiet do zarządzania kolorami
Name: OpenColorIO
-Version: 1.0.9
-Release: 12
+Version: 1.1.0
+Release: 0.1
License: BSD
Group: Libraries
-Source0: https://github.com/imageworks/OpenColorIO/tarball/v%{version}/%{name}-%{version}.tar.gz
-# Source0-md5: ad3c4ea59c010a18d79276ab9d83af95
+Source0: https://github.com/imageworks/OpenColorIO/archive/v%{version}/%{name}-%{version}.tar.gz
+# Source0-md5: 802d8f5b1d1fe316ec5f76511aa611b8
Patch0: %{name}-system-libs.patch
Patch1: %{name}-java.patch
Patch2: %{name}-libsuffix.patch
Patch3: %{name}-missing.patch
Patch4: %{name}-yaml-cpp.patch
+Patch5: %{name}-no-Werror.patch
+Patch6: %{name}-oiio.patch
+Patch7: %{name}-cmake-dir.patch
URL: http://opencolorio.org/
-# g++ with tr1 support or...
-#BuildRequires: boost-devel >= 1.34
BuildRequires: cmake >= 2.8
%{?with_java:BuildRequires: jdk}
-BuildRequires: libstdc++-devel
+BuildRequires: libstdc++-devel >= 6:4.7
BuildRequires: pkgconfig
BuildRequires: python-devel
%if %{with docs}
@@ -40,7 +41,7 @@ BuildRequires: texlive-latex-ams
BuildRequires: texlive-xetex
%endif
BuildRequires: tinyxml-devel >= 2.6.1
-BuildRequires: yaml-cpp-devel >= 0.2.6
+BuildRequires: yaml-cpp-devel >= 0.3.0
%if %{with opengl}
BuildRequires: OpenGL-devel
BuildRequires: OpenGL-glut-devel
@@ -51,7 +52,7 @@ BuildRequires: OpenImageIO-devel
BuildRequires: lcms2-devel >= 2.1
%endif
Requires: tinyxml >= 2.6.1
-Requires: yaml-cpp >= 0.2.6
+Requires: yaml-cpp >= 0.3.0
BuildRoot: %{tmpdir}/%{name}-%{version}-root-%(id -u -n)
%description
@@ -79,6 +80,7 @@ Summary: OpenColorIO convert tool
Summary(pl.UTF-8): Narzędzie OpenColorIO do konwersji
Group: Applications/Graphics
Requires: %{name} = %{version}-%{release}
+Requires: lcms2 >= 2.1
%description convert
OpenColorIO convert tool.
@@ -161,12 +163,15 @@ Header file for PyOpenColorIO API.
Plik nagłówkowy API PyOpenColorIO.
%prep
-%setup -q -n imageworks-OpenColorIO-2b12063
+%setup -q
%patch0 -p1
%patch1 -p1
%patch2 -p1
%patch3 -p1
%patch4 -p1
+%patch5 -p1
+%patch6 -p1
+%patch7 -p1
%build
# required for cmake to find JNI headers/libs when lib64 is in use
@@ -174,13 +179,17 @@ Plik nagłówkowy API PyOpenColorIO.
install -d build
cd build
+# yaml-cpp 0.6.x requires C++11
+CXXFLAGS="%{rpmcxxflags} -std=c++11"
%cmake .. \
+ %{!?with_oiio:-DDISABLE_OIIO=ON} \
-DOCIO_BUILD_DOCS=ON \
%if %{with java}
-DOCIO_BUILD_JNIGLUE=ON \
-DOCIO_STATIC_JNIGLUE=OFF \
%endif
%{!?with_sse2:-DOCIO_USE_SSE=OFF} \
+ -DUSE_EXTERNAL_LCMS=ON \
-DUSE_EXTERNAL_TINYXML=ON \
-DUSE_EXTERNAL_YAML=ON
@@ -211,7 +220,7 @@ rm -rf $RPM_BUILD_ROOT
%files
%defattr(644,root,root,755)
-%doc ChangeLog LICENSE README
+%doc ChangeLog LICENSE README.md
%attr(755,root,root) %{_bindir}/ociobakelut
%attr(755,root,root) %{_bindir}/ociocheck
%attr(755,root,root) %{_libdir}/libOpenColorIO.so.*.*.*
@@ -236,6 +245,7 @@ rm -rf $RPM_BUILD_ROOT
%attr(755,root,root) %{_libdir}/libOpenColorIO.so
%{_includedir}/OpenColorIO
%{_pkgconfigdir}/OpenColorIO.pc
+%{_libdir}/cmake/OpenColorIO
%files static
%defattr(644,root,root,755)
diff --git a/OpenColorIO-cmake-dir.patch b/OpenColorIO-cmake-dir.patch
new file mode 100644
index 0000000..23e24dd
--- /dev/null
+++ b/OpenColorIO-cmake-dir.patch
@@ -0,0 +1,26 @@
+--- OpenColorIO-1.1.0/CMakeLists.txt.orig 2018-06-26 20:01:54.413455888 +0200
++++ OpenColorIO-1.1.0/CMakeLists.txt 2018-06-26 20:18:58.653444195 +0200
+@@ -600,7 +600,7 @@
+ set(OCIO_STATIC_COMPILE_DEFINITIONS )
+ endif()
+ endif()
+-install(EXPORT OpenColorIO DESTINATION cmake)
++install(EXPORT OpenColorIO DESTINATION lib${LIB_SUFFIX}/cmake/OpenColorIO)
+ file(WRITE "${CMAKE_BINARY_DIR}/OpenColorIOConfig.cmake"
+ "
+ get_filename_component(OpenColorIO_DIR \"\${CMAKE_CURRENT_LIST_FILE}\" PATH)
+@@ -612,7 +612,7 @@
+
+ ## targets libraries + associated definitions
+ if(NOT TARGET OpenColorIO)
+- include(\"\${OpenColorIO_DIR}/cmake/OpenColorIO.cmake\") ## thanks to imported target
++ include(\"${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}/cmake/OpenColorIO/OpenColorIO.cmake\") ## thanks to imported target
+ if(TARGET OpenColorIO AND NOT OpenColorIO_USE_STATIC)
+ message(STATUS \"shared target OpenColorIO : see OpenColorIO_LIBRARY\")
+ set(OpenColorIO_LIBRARY OpenColorIO)
+@@ -650,4 +650,4 @@
+ message(STATUS OPENCOLORIO_FOUND=\${OPENCOLORIO_FOUND})
+ "
+ )
+-install(FILES "${CMAKE_BINARY_DIR}/OpenColorIOConfig.cmake" DESTINATION .)
++install(FILES "${CMAKE_BINARY_DIR}/OpenColorIOConfig.cmake" DESTINATION lib${LIB_SUFFIX}/cmake/OpenColorIO)
diff --git a/OpenColorIO-libsuffix.patch b/OpenColorIO-libsuffix.patch
index 33604cf..3ddd1b6 100644
--- a/OpenColorIO-libsuffix.patch
+++ b/OpenColorIO-libsuffix.patch
@@ -1,11 +1,11 @@
---- imageworks-OpenColorIO-a16d9ac/src/core/CMakeLists.txt.orig 2012-03-12 20:13:59.000000000 +0100
-+++ imageworks-OpenColorIO-a16d9ac/src/core/CMakeLists.txt 2012-07-29 12:10:10.859355425 +0200
-@@ -66,7 +66,7 @@
+--- OpenColorIO-1.1.0/src/core/CMakeLists.txt.orig 2018-06-25 19:35:05.841127458 +0200
++++ OpenColorIO-1.1.0/src/core/CMakeLists.txt 2018-06-25 19:59:35.564444007 +0200
+@@ -94,7 +94,7 @@
VERSION ${OCIO_VERSION}
SOVERSION ${SOVERSION})
-- install(TARGETS OpenColorIO_STATIC DESTINATION ${CMAKE_INSTALL_EXEC_PREFIX}/lib)
-+ install(TARGETS OpenColorIO_STATIC DESTINATION ${CMAKE_INSTALL_EXEC_PREFIX}/lib${LIB_SUFFIX})
+- install(TARGETS OpenColorIO_STATIC EXPORT OpenColorIO ARCHIVE DESTINATION ${CMAKE_INSTALL_EXEC_PREFIX}/lib/static)
++ install(TARGETS OpenColorIO_STATIC EXPORT OpenColorIO ARCHIVE DESTINATION ${CMAKE_INSTALL_EXEC_PREFIX}/lib${LIB_SUFFIX})
endif()
- # public interface
+ macro(target_link_OCIO target)
diff --git a/OpenColorIO-no-Werror.patch b/OpenColorIO-no-Werror.patch
new file mode 100644
index 0000000..ef80b4c
--- /dev/null
+++ b/OpenColorIO-no-Werror.patch
@@ -0,0 +1,26 @@
+--- OpenColorIO-1.1.0/src/core/CMakeLists.txt.orig 2018-06-25 22:20:57.554347159 +0200
++++ OpenColorIO-1.1.0/src/core/CMakeLists.txt 2018-06-25 22:21:19.001013583 +0200
+@@ -23,8 +23,6 @@
+ if("${CMAKE_BUILD_TYPE}" STREQUAL "Release")
+ set(EXTERNAL_COMPILE_FLAGS "${EXTERNAL_COMPILE_FLAGS} /WX")
+ endif()
+-else()
+- set(EXTERNAL_COMPILE_FLAGS "${EXTERNAL_COMPILE_FLAGS} -Werror")
+ endif()
+
+ # SHARED
+--- OpenColorIO-1.1.0/src/pyglue/CMakeLists.txt.orig 2018-01-05 02:38:27.000000000 +0100
++++ OpenColorIO-1.1.0/src/pyglue/CMakeLists.txt 2018-06-25 22:20:32.314347449 +0200
+@@ -20,12 +20,6 @@
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4275")
+ endif()
+
+-# Process all warnings as errors
+-# Unfortunately Windows still has a warning
+-if(UNIX)
+- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror")
+-endif()
+-
+ find_package(PythonLibs)
+ if(NOT PYTHONLIBS_FOUND)
+ message(FATAL "Python libraries were not found, exiting.")
diff --git a/OpenColorIO-oiio.patch b/OpenColorIO-oiio.patch
new file mode 100644
index 0000000..e992038
--- /dev/null
+++ b/OpenColorIO-oiio.patch
@@ -0,0 +1,14 @@
+--- OpenColorIO-1.1.0/CMakeLists.txt.orig 2018-06-26 19:16:47.136820152 +0200
++++ OpenColorIO-1.1.0/CMakeLists.txt 2018-06-26 19:59:46.266790685 +0200
+@@ -460,7 +460,11 @@
+ if(OCIO_BUILD_APPS AND (OCIO_BUILD_STATIC OR OCIO_BUILD_SHARED) )
+
+ # Try to find OpenImageIO (OIIO) and OpenGL stuff
++ if(DISABLE_OIIO)
++ set(OIIO_FOUND FALSE)
++ else()
+ OCIOFindOpenImageIO()
++ endif()
+
+ if(OIIO_FOUND)
+ add_subdirectory(src/apps/ocioconvert)
diff --git a/OpenColorIO-system-libs.patch b/OpenColorIO-system-libs.patch
index 3095276..bc9c52f 100644
--- a/OpenColorIO-system-libs.patch
+++ b/OpenColorIO-system-libs.patch
@@ -1,19 +1,20 @@
---- imageworks-OpenColorIO-2b12063/docs/CMakeLists.txt.orig 2013-10-09 00:59:34.000000000 +0200
-+++ imageworks-OpenColorIO-2b12063/docs/CMakeLists.txt 2013-11-06 18:54:00.644187011 +0100
-@@ -1,68 +1,5 @@
+--- OpenColorIO-1.1.0/docs/CMakeLists.txt.orig 2018-06-25 19:34:32.201127838 +0200
++++ OpenColorIO-1.1.0/docs/CMakeLists.txt 2018-06-25 19:34:37.424461113 +0200
+@@ -19,72 +19,6 @@
+ set(PYT_EXTDIST_BINPATH ${EXTDIST_BINPATH})
+ endif()
- ###############################################################################
--### External Doc Apps ###
--
-# setuptools
-# https://pypi.python.org/pypi/setuptools
-set(SETUPTOOLS_VERSION 1.1.6)
+-
-ExternalProject_Add(setuptools
- URL ${CMAKE_SOURCE_DIR}/ext/setuptools-${SETUPTOOLS_VERSION}.tar.gz
- BUILD_IN_SOURCE 1
- CONFIGURE_COMMAND ${CMAKE_COMMAND} -E make_directory ${EXTDIST_PYTHONPATH}
-- BUILD_COMMAND PYTHONPATH=${PYTHONPATH} ${PYTHON} setup.py build
-- INSTALL_COMMAND PYTHONPATH=${PYTHONPATH} ${PYTHON} setup.py install --prefix=${EXTDIST_ROOT}
+- BUILD_COMMAND ${PYT_PRE_CMD} ${PYTHON} setup.py build
+- INSTALL_COMMAND ${PYT_PRE_CMD} ${PYTHON} setup.py install --prefix=${PYT_LIB_OUTPUT}
+- WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/setuptools-prefix/src/setuptools
-)
-
-# docutils
@@ -24,8 +25,9 @@
- URL ${CMAKE_SOURCE_DIR}/ext/docutils-${DOCUTILS_VERSION}.tar.gz
- BUILD_IN_SOURCE 1
- CONFIGURE_COMMAND ${CMAKE_COMMAND} -E make_directory ${EXTDIST_PYTHONPATH}
-- BUILD_COMMAND PYTHONPATH=${PYTHONPATH} ${PYTHON} setup.py build
-- INSTALL_COMMAND PYTHONPATH=${PYTHONPATH} ${PYTHON} setup.py install --prefix=${EXTDIST_ROOT}
+- BUILD_COMMAND ${PYT_PRE_CMD} ${PYTHON} setup.py build
+- INSTALL_COMMAND ${PYT_PRE_CMD} ${PYTHON} setup.py install --prefix=${PYT_LIB_OUTPUT}
+- WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/docutils-prefix/src/docutils
-)
-
-# jinja2
@@ -36,8 +38,9 @@
- URL ${CMAKE_SOURCE_DIR}/ext/Jinja2-${JINJA2_VERSION}.tar.gz
- BUILD_IN_SOURCE 1
- CONFIGURE_COMMAND ${CMAKE_COMMAND} -E make_directory ${EXTDIST_PYTHONPATH}
-- BUILD_COMMAND PYTHONPATH=${PYTHONPATH} ${PYTHON} setup.py build
-- INSTALL_COMMAND PYTHONPATH=${PYTHONPATH} ${PYTHON} setup.py install --prefix=${EXTDIST_ROOT}
+- BUILD_COMMAND ${PYT_PRE_CMD} ${PYTHON} setup.py build
+- INSTALL_COMMAND ${PYT_PRE_CMD} ${PYTHON} setup.py install --prefix=${PYT_LIB_OUTPUT}
+- WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/Jinja2-prefix/src/Jinja2
-)
-
-# Pygments
@@ -48,8 +51,9 @@
- URL ${CMAKE_SOURCE_DIR}/ext/Pygments-${PYGMENTS_VERSION}.tar.gz
- BUILD_IN_SOURCE 1
- CONFIGURE_COMMAND ${CMAKE_COMMAND} -E make_directory ${EXTDIST_PYTHONPATH}
-- BUILD_COMMAND PYTHONPATH=${PYTHONPATH} ${PYTHON} setup.py build
-- INSTALL_COMMAND PYTHONPATH=${PYTHONPATH} ${PYTHON} setup.py install --prefix=${EXTDIST_ROOT}
+- BUILD_COMMAND ${PYT_PRE_CMD} ${PYTHON} setup.py build
+- INSTALL_COMMAND ${PYT_PRE_CMD} ${PYTHON} setup.py install --prefix=${PYT_LIB_OUTPUT}
+- WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/Pygments-prefix/src/Pygments
-)
-
-# sphinx
@@ -61,29 +65,29 @@
- PATCH_COMMAND patch -p1 < ${CMAKE_SOURCE_DIR}/ext/Sphinx-${SPHINX_VERSION}.patch
- BUILD_IN_SOURCE 1
- CONFIGURE_COMMAND ${CMAKE_COMMAND} -E make_directory ${EXTDIST_PYTHONPATH}
-- BUILD_COMMAND PYTHONPATH=${PYTHONPATH} ${PYTHON} setup.py build
-- INSTALL_COMMAND PYTHONPATH=${PYTHONPATH} ${PYTHON} setup.py install --prefix=${EXTDIST_ROOT} --install-scripts=${EXTDIST_ROOT}/bin
+- BUILD_COMMAND ${PYT_PRE_CMD} ${PYTHON} setup.py build
+- INSTALL_COMMAND ${PYT_PRE_CMD} ${PYTHON} setup.py install --prefix=${PYT_LIB_OUTPUT} --install-scripts=${PYT_EXTDIST_BINPATH}
+- WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/Sphinx-prefix/src/Sphinx
-)
-
--###############################################################################
+ ###############################################################################
### Create Doc Targets ###
- message(STATUS "Create sphinx conf.py from conf.py.in")
-@@ -93,7 +30,7 @@
- ExtractRstCPP(${CMAKE_SOURCE_DIR}/export/OpenColorIO/OpenColorTypes.h developers/api/OpenColorTypes.rst)
+@@ -122,7 +56,7 @@
+ endif()
add_custom_target(doc ALL
-- COMMAND PYTHONPATH=${PYTHONPATH} ${EXTDIST_BINPATH}/sphinx-build -b html . ${CMAKE_CURRENT_BINARY_DIR}/build-html
-+ COMMAND PYTHONPATH=${PYTHONPATH} sphinx-build -b html . ${CMAKE_CURRENT_BINARY_DIR}/build-html
+- COMMAND ${PYT_PRE_CMD} ${EXTDIST_BINPATH}/sphinx-build -b html . ${CMAKE_CURRENT_BINARY_DIR}/build-html
++ COMMAND sphinx-build -b html . ${CMAKE_CURRENT_BINARY_DIR}/build-html
DEPENDS
- OpenColorIO
- PyOpenColorIO
-@@ -118,7 +55,7 @@
+ ${DEPLIBS}
+ ${CMAKE_BINARY_DIR}/docs/conf.py
+@@ -146,7 +80,7 @@
if(PDFLATEX_COMPILER)
add_custom_target(latex
-- COMMAND PYTHONPATH=${PYTHONPATH} ${EXTDIST_BINPATH}/sphinx-build -b latex . ${CMAKE_CURRENT_BINARY_DIR}/build-latex
-+ COMMAND PYTHONPATH=${PYTHONPATH} sphinx-build -b latex . ${CMAKE_CURRENT_BINARY_DIR}/build-latex
+- COMMAND ${PYT_PRE_CMD} ${EXTDIST_BINPATH}/sphinx-build -b latex . ${CMAKE_CURRENT_BINARY_DIR}/build-latex
++ COMMAND sphinx-build -b latex . ${CMAKE_CURRENT_BINARY_DIR}/build-latex
DEPENDS
OpenColorIO
${CMAKE_BINARY_DIR}/docs/conf.py
diff --git a/OpenColorIO-yaml-cpp.patch b/OpenColorIO-yaml-cpp.patch
index 58543ef..80629bb 100644
--- a/OpenColorIO-yaml-cpp.patch
+++ b/OpenColorIO-yaml-cpp.patch
@@ -1,3830 +1,22 @@
-From 63c6bde2acac363c8c5e7fd3d744e17ea99e20ab Mon Sep 17 00:00:00 2001
-From: Malcolm Humphreys <malcolmhumphreys at gmail.com>
-Date: Thu, 30 Jan 2014 12:42:21 +0000
-Subject: [PATCH]
- * added support form yaml-cpp > 5.0.1
- * when yaml-cpp < 5.0.0 define OLDYAML
- * added yaml-cpp 5.0.1 tarball in preparation for moving to the new api
- * added OCIOYaml class and moved all yaml-cpp code into OCIOYaml.cpp
- * moved Config serialize code into OCIOYaml.cpp
- * added Config::setEnvironmentMode(), Config::getEnvironmentMode(), Config::loadEnvironment()
- * moved Display code from Config.cpp into it's own files
-
----
- CMakeLists.txt | 6 +-
- export/OpenColorIO/OpenColorIO.h | 6 +
- ext/yaml-cpp-0.5.1.patch | 12 +
- ext/yaml-cpp-0.5.1.tar.gz | Bin 0 -> 118244 bytes
- src/core/Config.cpp | 518 +-------
- src/core/Display.cpp | 145 +++
- src/core/Display.h | 85 ++
- src/core/OCIOYaml.cpp | 2527 +++++++++++++++++++++++---------------
- src/core/OCIOYaml.h | 90 +-
- 9 files changed, 1854 insertions(+), 1535 deletions(-)
- create mode 100644 ext/yaml-cpp-0.5.1.patch
- create mode 100644 ext/yaml-cpp-0.5.1.tar.gz
- create mode 100644 src/core/Display.cpp
- create mode 100644 src/core/Display.h
-
-diff --git a/CMakeLists.txt b/CMakeLists.txt
-index 13e2d64..ea3fb8b 100644
---- a/CMakeLists.txt
-+++ b/CMakeLists.txt
-@@ -225,13 +225,15 @@ else(USE_EXTERNAL_YAML)
- endif()
- endif(USE_EXTERNAL_YAML)
-
--
-+if(YAML_CPP_VERSION VERSION_LESS "0.5.0")
-+ set(YAML_CPP_COMPILE_FLAGS "-DOLDYAML")
-+endif()
-
- ###############################################################################
- ### Externals ###
-
- set(EXTERNAL_INCLUDE_DIRS ${EXTERNAL_INCLUDE_DIRS} ${PROJECT_BINARY_DIR}/ext/dist/include)
--set(EXTERNAL_COMPILE_FLAGS "-DTIXML_USE_STL")
-+set(EXTERNAL_COMPILE_FLAGS "-DTIXML_USE_STL ${YAML_CPP_COMPILE_FLAGS}")
-
- if(CMAKE_COMPILER_IS_GNUCXX)
-
-diff --git a/export/OpenColorIO/OpenColorIO.h b/export/OpenColorIO/OpenColorIO.h
-index 561ce50..00716fa 100644
---- a/export/OpenColorIO/OpenColorIO.h
-+++ b/export/OpenColorIO/OpenColorIO.h
-@@ -279,6 +279,12 @@
- const char * getEnvironmentVarDefault(const char * name) const;
- //!cpp:function::
- void clearEnvironmentVars();
-+ //!cpp:function::
-+ void setEnvironmentMode(EnvironmentMode mode);
-+ //!cpp:function::
-+ EnvironmentMode getEnvironmentMode() const;
-+ //!cpp:function::
-+ void loadEnvironment();
-
- //!cpp:function::
- const char * getSearchPath() const;
-diff --git a/ext/yaml-cpp-0.5.1.patch b/ext/yaml-cpp-0.5.1.patch
-new file mode 100644
-index 0000000..23433cb
---- /dev/null
-+++ b/ext/yaml-cpp-0.5.1.patch
-@@ -0,0 +1,12 @@
-+diff -Naur yaml-cpp-0.5.1.orig/CMakeLists.txt yaml-cpp-0.5.1/CMakeLists.txt
-+--- yaml-cpp-0.5.1.orig/CMakeLists.txt 2014-01-30 09:45:54.000000000 +0000
-++++ yaml-cpp-0.5.1/CMakeLists.txt 2014-01-30 09:51:04.000000000 +0000
-+@@ -140,7 +140,7 @@
-+ set(GCC_EXTRA_OPTIONS "${GCC_EXTRA_OPTIONS} ${FLAG_TESTED}")
-+ endif()
-+ #
-+- set(CMAKE_CXX_FLAGS "-Wall ${GCC_EXTRA_OPTIONS} -pedantic -Wno-long-long ${CMAKE_CXX_FLAGS}")
-++ set(CMAKE_CXX_FLAGS "-Wall ${GCC_EXTRA_OPTIONS} -pedantic -Wno-long-long -fPIC -fvisibility-inlines-hidden -fvisibility=hidden ${CMAKE_CXX_FLAGS}")
-+ #
-+ add_custom_target(debuggable $(MAKE) clean
-+ COMMAND ${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE=Debug ${CMAKE_SOURCE_DIR}
-diff --git a/src/core/Config.cpp b/src/core/Config.cpp
-index 00e1e70..82b5073 100644
---- a/src/core/Config.cpp
-+++ b/src/core/Config.cpp
-@@ -40,6 +40,7 @@
- #include "HashUtils.h"
- #include "Logging.h"
- #include "LookParse.h"
-+#include "Display.h"
- #include "MathUtils.h"
- #include "Mutex.h"
- #include "OpBuilders.h"
-@@ -208,7 +209,6 @@
- if(csname.empty()) return false;
-
- std::string csnamelower = pystring::lower(csname);
--
- for(unsigned int i = 0; i < colorspaces.size(); ++i)
- {
- if(csnamelower == pystring::lower(colorspaces[i]->getName()))
-@@ -220,184 +220,7 @@
-
- return false;
- }
--
--
-- // Displays
-- struct View
-- {
-- std::string name;
-- std::string colorspace;
-- std::string looks;
--
-- View() { }
--
-- View(const std::string & name_,
-- const std::string & colorspace_,
-- const std::string & looksList_) :
-- name(name_),
-- colorspace(colorspace_),
-- looks(looksList_)
-- { }
-- };
--
-- typedef std::vector<View> ViewVec;
-- typedef std::map<std::string, ViewVec> DisplayMap; // (display name : ViewVec)
--
-- void operator >> (const YAML::Node& node, View& v)
-- {
-- if(node.Tag() != "View")
-- return;
--
-- std::string key, stringval;
--
-- for (YAML::Iterator iter = node.begin();
-- iter != node.end();
-- ++iter)
-- {
-- iter.first() >> key;
--
-- if(key == "name")
-- {
-- if (iter.second().Type() != YAML::NodeType::Null &&
-- iter.second().Read<std::string>(stringval))
-- v.name = stringval;
-- }
-- else if(key == "colorspace")
-- {
-- if (iter.second().Type() != YAML::NodeType::Null &&
-- iter.second().Read<std::string>(stringval))
-- v.colorspace = stringval;
-- }
-- else if(key == "looks" || key == "look")
-- {
-- if (iter.second().Type() != YAML::NodeType::Null &&
-- iter.second().Read<std::string>(stringval))
-- v.looks = stringval;
-- }
-- else
-- {
-- LogUnknownKeyWarning(node.Tag(), iter.first());
-- }
-- }
--
-- if(v.name.empty())
-- {
-- throw Exception("View does not specify 'name'.");
-- }
-- if(v.colorspace.empty())
-- {
-- std::ostringstream os;
-- os << "View '" << v.name << "' ";
-- os << "does not specify colorspace.";
-- throw Exception(os.str().c_str());
-- }
-- }
--
-- YAML::Emitter& operator << (YAML::Emitter& out, View view)
-- {
-- out << YAML::VerbatimTag("View");
-- out << YAML::Flow;
-- out << YAML::BeginMap;
-- out << YAML::Key << "name" << YAML::Value << view.name;
-- out << YAML::Key << "colorspace" << YAML::Value << view.colorspace;
-- if(!view.looks.empty()) out << YAML::Key << "looks" << YAML::Value << view.looks;
-- out << YAML::EndMap;
-- return out;
-- }
--
-- DisplayMap::iterator find_display(DisplayMap & displays, const std::string & display)
-- {
-- for(DisplayMap::iterator iter = displays.begin();
-- iter != displays.end();
-- ++iter)
-- {
-- if(StrEqualsCaseIgnore(display, iter->first)) return iter;
-- }
-- return displays.end();
-- }
--
-- DisplayMap::const_iterator find_display_const(const DisplayMap & displays, const std::string & display)
-- {
-- for(DisplayMap::const_iterator iter = displays.begin();
-- iter != displays.end();
-- ++iter)
-- {
-- if(StrEqualsCaseIgnore(display, iter->first)) return iter;
-- }
-- return displays.end();
-- }
--
-- int find_view(const ViewVec & vec, const std::string & name)
-- {
-- for(unsigned int i=0; i<vec.size(); ++i)
-- {
-- if(StrEqualsCaseIgnore(name, vec[i].name)) return i;
-- }
-- return -1;
-- }
--
-- void AddDisplay(DisplayMap & displays,
-- const std::string & display,
-- const std::string & view,
-- const std::string & colorspace,
-- const std::string & looks)
-- {
-- DisplayMap::iterator iter = find_display(displays, display);
-- if(iter == displays.end())
-- {
-- ViewVec views;
-- views.push_back( View(view, colorspace, looks) );
-- displays[display] = views;
-- }
-- else
-- {
-- ViewVec & views = iter->second;
-- int index = find_view(views, view);
-- if(index<0)
-- {
-- views.push_back( View(view, colorspace, looks) );
-- }
-- else
-- {
-- views[index].colorspace = colorspace;
-- views[index].looks = looks;
-- }
-- }
-- }
--
-- void ComputeDisplays(StringVec & displayCache,
-- const DisplayMap & displays,
-- const StringVec & activeDisplays,
-- const StringVec & activeDisplaysEnvOverride)
-- {
-- displayCache.clear();
-
-- StringVec displayMasterList;
-- for(DisplayMap::const_iterator iter = displays.begin();
-- iter != displays.end();
-- ++iter)
-- {
-- displayMasterList.push_back(iter->first);
-- }
--
-- // Apply the env override if it's not empty.
-- if(!activeDisplaysEnvOverride.empty())
-- {
-- displayCache = IntersectStringVecsCaseIgnore(displayMasterList, activeDisplaysEnvOverride);
-- if(!displayCache.empty()) return;
-- }
-- // Otherwise, aApply the active displays if it's not empty.
-- else if(!activeDisplays.empty())
-- {
-- displayCache = IntersectStringVecsCaseIgnore(displayMasterList, activeDisplays);
-- if(!displayCache.empty()) return;
-- }
--
-- displayCache = displayMasterList;
-- }
--
--
--
- } // namespace
-
- class Config::Impl
-@@ -431,6 +254,8 @@
- mutable StringMap cacheids_;
- mutable std::string cacheidnocontext_;
-
-+ OCIOYaml io_;
-+
- Impl() :
- context_(Context::Create()),
- strictParsing_(true),
-@@ -497,8 +322,6 @@
- return *this;
- }
-
-- void load(std::istream & istream, const char * name);
--
- // Any time you modify the state of the config, you must call this
- // to reset internal cache states. You also should do this in a
- // thread safe manner by acquiring the cacheidMutex_;
-@@ -536,7 +359,7 @@
- istream.str(INTERNAL_RAW_PROFILE);
-
- ConfigRcPtr config = Config::Create();
-- config->getImpl()->load(istream, "");
-+ config->getImpl()->io_.open(istream, config);
- return config;
- }
-
-@@ -551,14 +374,14 @@
- }
-
- ConfigRcPtr config = Config::Create();
-- config->getImpl()->load(istream, filename);
-+ config->getImpl()->io_.open(istream, config, filename);
- return config;
- }
-
- ConstConfigRcPtr Config::CreateFromStream(std::istream & istream)
- {
- ConfigRcPtr config = Config::Create();
-- config->getImpl()->load(istream, "");
-+ config->getImpl()->io_.open(istream, config);
- return config;
- }
-
-@@ -893,6 +716,27 @@
- getImpl()->resetCacheIDs();
- }
-
-+ void Config::setEnvironmentMode(EnvironmentMode mode)
-+ {
-+ getImpl()->context_->setEnvironmentMode(mode);
-+
-+ AutoMutex lock(getImpl()->cacheidMutex_);
-+ getImpl()->resetCacheIDs();
-+ }
-+
-+ EnvironmentMode Config::getEnvironmentMode() const
-+ {
-+ return getImpl()->context_->getEnvironmentMode();
-+ }
-+
-+ void Config::loadEnvironment()
-+ {
-+ getImpl()->context_->loadEnvironment();
-+
-+ AutoMutex lock(getImpl()->cacheidMutex_);
-+ getImpl()->resetCacheIDs();
-+ }
-+
- const char * Config::getSearchPath() const
- {
- return getImpl()->context_->getSearchPath();
-@@ -1647,60 +1491,7 @@
- {
- try
- {
-- YAML::Emitter out;
-- out << YAML::Block;
-- out << YAML::BeginMap;
-- out << YAML::Key << "ocio_profile_version" << YAML::Value << 1;
-- out << YAML::Newline;
-- if(getImpl()->env_.size() > 0) {
-- out << YAML::Key << "environment";
-- out << YAML::Value << getImpl()->env_;
-- out << YAML::Newline;
-- }
-- out << YAML::Key << "search_path" << YAML::Value << getImpl()->context_->getSearchPath();
-- out << YAML::Key << "strictparsing" << YAML::Value << getImpl()->strictParsing_;
-- out << YAML::Key << "luma" << YAML::Value << YAML::Flow << getImpl()->defaultLumaCoefs_;
--
-- if(getImpl()->description_ != "")
-- {
-- out << YAML::Newline;
-- out << YAML::Key << "description";
-- out << YAML::Value << getImpl()->description_;
-- }
--
-- // Roles
-- out << YAML::Newline;
-- out << YAML::Key << "roles";
-- out << YAML::Value << getImpl()->roles_;
--
-- // Displays
-- out << YAML::Newline;
-- out << YAML::Key << "displays";
-- out << YAML::Value << getImpl()->displays_;
-- out << YAML::Newline;
-- out << YAML::Key << "active_displays";
-- out << YAML::Value << YAML::Flow << getImpl()->activeDisplays_;
-- out << YAML::Key << "active_views";
-- out << YAML::Value << YAML::Flow << getImpl()->activeViews_;
--
-- // Looks
-- if(!getImpl()->looksList_.empty())
-- {
-- out << YAML::Newline;
-- out << YAML::Key << "looks";
-- out << YAML::Value << getImpl()->looksList_;
-- }
--
-- // ColorSpaces
-- {
-- out << YAML::Newline;
-- out << YAML::Key << "colorspaces";
-- out << YAML::Value << getImpl()->colorspaces_;
-- }
--
-- out << YAML::EndMap;
--
-- os << out.c_str();
-+ getImpl()->io_.write(os, this);
- }
- catch( const std::exception & e)
- {
-@@ -1710,246 +1501,6 @@
- }
- }
-
-- void Config::Impl::load(std::istream & istream, const char * filename)
-- {
-- try
-- {
-- YAML::Parser parser(istream);
-- YAML::Node node;
-- parser.GetNextDocument(node);
--
-- // check profile version
-- int profile_version = 0;
-- if(node.FindValue("ocio_profile_version") == NULL)
-- {
-- std::ostringstream os;
-- os << "The specified file ";
-- os << "does not appear to be an OCIO configuration.";
-- throw Exception (os.str().c_str());
-- }
--
-- node["ocio_profile_version"] >> profile_version;
-- if(profile_version > 1)
-- {
-- std::ostringstream os;
-- os << "This .ocio config ";
-- if(filename && *filename)
-- {
-- os << " '" << filename << "' ";
-- }
-- os << "is version " << profile_version << ". ";
-- os << "This version of the OpenColorIO library (" << OCIO_VERSION ") ";
-- os << "is not known to be able to load this profile. ";
-- os << "An attempt will be made, but there are no guarantees that the ";
-- os << "results will be accurate. Continue at your own risk.";
-- LogWarning(os.str());
-- }
--
--
-- std::string key, stringval;
-- bool boolval = false;
-- EnvironmentMode mode = ENV_ENVIRONMENT_LOAD_ALL;
--
-- for (YAML::Iterator iter = node.begin();
-- iter != node.end();
-- ++iter)
-- {
-- iter.first() >> key;
--
-- if(key == "ocio_profile_version") { } // Already handled above.
-- else if(key == "environment")
-- {
-- mode = ENV_ENVIRONMENT_LOAD_PREDEFINED;
-- const YAML::Node& environment = iter.second();
-- if(environment.Type() != YAML::NodeType::Map)
-- {
-- std::ostringstream os;
-- os << "'environment' field needs to be a (name: key) map.";
-- throw Exception(os.str().c_str());
-- }
-- for (YAML::Iterator it = environment.begin();
-- it != environment.end(); ++it)
-- {
-- std::string k, v;
-- it.first() >> k;
-- it.second() >> v;
-- env_[k] = v;
-- context_->setStringVar(k.c_str(), v.c_str());
-- }
-- }
-- else if(key == "search_path" || key == "resource_path")
-- {
-- if (iter.second().Type() != YAML::NodeType::Null &&
-- iter.second().Read<std::string>(stringval))
-- context_->setSearchPath(stringval.c_str());
-- }
-- else if(key == "strictparsing")
-- {
-- if (iter.second().Type() != YAML::NodeType::Null &&
-- iter.second().Read<bool>(boolval))
-- strictParsing_ = boolval;
-- }
-- else if(key == "description")
-- {
-- if (iter.second().Type() != YAML::NodeType::Null &&
-- iter.second().Read<std::string>(stringval))
-- description_ = stringval;
-- }
-- else if(key == "luma")
-- {
-- std::vector<float> val;
-- if (iter.second().Type() != YAML::NodeType::Null)
-- {
-- iter.second() >> val;
-- if(val.size() != 3)
-- {
-- std::ostringstream os;
-- os << "'luma' field must be 3 ";
-- os << "floats. Found '" << val.size() << "'.";
-- throw Exception(os.str().c_str());
-- }
-- defaultLumaCoefs_ = val;
-- }
-- }
-- else if(key == "roles")
-- {
-- const YAML::Node& roles = iter.second();
-- if(roles.Type() != YAML::NodeType::Map)
-- {
-- std::ostringstream os;
-- os << "'roles' field needs to be a (name: key) map.";
-- throw Exception(os.str().c_str());
-- }
-- for (YAML::Iterator it = roles.begin();
-- it != roles.end(); ++it)
-- {
-- std::string k, v;
-- it.first() >> k;
-- it.second() >> v;
-- roles_[pystring::lower(k)] = v;
-- }
-- }
-- else if(key == "displays")
-- {
-- if (iter.second().Type() != YAML::NodeType::Null)
-- {
-- iter.second() >> displays_;
-- }
-- }
-- else if(key == "active_displays")
-- {
-- if (iter.second().Type() != YAML::NodeType::Null)
-- {
-- iter.second() >> activeDisplays_;
-- }
-- }
-- else if(key == "active_views")
-- {
-- if (iter.second().Type() != YAML::NodeType::Null)
-- {
-- iter.second() >> activeViews_;
-- }
-- }
-- else if(key == "colorspaces")
-- {
-- const YAML::Node& colorspaces = iter.second();
--
-- if(colorspaces.Type() != YAML::NodeType::Sequence)
-- {
-- std::ostringstream os;
-- os << "'colorspaces' field needs to be a (- !<ColorSpace>) list.";
-- throw Exception(os.str().c_str());
-- }
--
-- for(unsigned i = 0; i < colorspaces.size(); ++i)
-- {
-- if(colorspaces[i].Tag() == "ColorSpace")
-- {
-- ColorSpaceRcPtr cs = ColorSpace::Create();
-- colorspaces[i] >> cs;
-- colorspaces_.push_back( cs );
-- }
-- else
-- {
-- std::ostringstream os;
-- os << "Unknown element found in colorspaces:";
-- os << colorspaces[i].Tag() << ". Only ColorSpace(s)";
-- os << " currently handled.";
-- LogWarning(os.str());
-- }
-- }
-- }
-- else if(key == "looks")
-- {
-- const YAML::Node& looks = iter.second();
--
-- if(looks.Type() != YAML::NodeType::Sequence)
-- {
-- std::ostringstream os;
-- os << "'looks' field needs to be a (- !<Look>) list.";
-- throw Exception(os.str().c_str());
-- }
--
-- for(unsigned i = 0; i < looks.size(); ++i)
-- {
-- if(looks[i].Tag() == "Look")
-- {
-- LookRcPtr look = Look::Create();
-- looks[i] >> look;
-- looksList_.push_back( look );
-- }
-- else
-- {
-- std::ostringstream os;
-- os << "Unknown element found in looks:";
-- os << looks[i].Tag() << ". Only Look(s)";
-- os << " currently handled.";
-- LogWarning(os.str());
-- }
-- }
-- }
-- else
-- {
-- LogUnknownKeyWarning("profile", iter.first());
-- }
-- }
--
-- if(filename)
-- {
-- std::string realfilename = pystring::os::path::abspath(filename);
-- std::string configrootdir = pystring::os::path::dirname(realfilename);
-- context_->setWorkingDir(configrootdir.c_str());
-- }
--
-- context_->setEnvironmentMode(mode);
-- context_->loadEnvironment();
--
-- if(mode == ENV_ENVIRONMENT_LOAD_ALL)
-- {
-- std::ostringstream os;
-- os << "This .ocio config ";
-- if(filename && *filename)
-- {
-- os << " '" << filename << "' ";
-- }
-- os << "has no environment section defined. The default behaviour is to ";
-- os << "load all environment variables (" << context_->getNumStringVars() << ")";
-- os << ", which reduces the efficiency of OCIO's caching. Considering ";
-- os << "predefining the environment variables used.";
-- LogDebug(os.str());
-- }
--
-- }
-- catch( const std::exception & e)
-- {
-- std::ostringstream os;
-- os << "Error: Loading the OCIO profile ";
-- if(filename) os << "'" << filename << "' ";
-- os << "failed. " << e.what();
-- throw Exception(os.str().c_str());
-- }
-- }
--
- void Config::Impl::resetCacheIDs()
- {
- cacheids_.clear();
-@@ -2287,9 +1838,7 @@
- std::istringstream is;
- is.str(SIMPLE_PROFILE);
- OCIO::ConstConfigRcPtr config;
-- OIIO_CHECK_NO_THOW(config = OCIO::Config::CreateFromStream(is));
--
-- OIIO_CHECK_THOW(config->sanityCheck(), OCIO::Exception);
-+ OIIO_CHECK_THOW(config = OCIO::Config::CreateFromStream(is), OCIO::Exception);
- }
-
- {
-@@ -2330,8 +1879,6 @@
- "colorspaces:\n"
- " - !<ColorSpace>\n"
- " name: raw\n"
-- " - !<ColorSpace>\n"
-- " name: raw\n"
- "strictparsing: false\n"
- "roles:\n"
- " default: raw\n"
-@@ -2345,8 +1892,6 @@
- "colorspaces:\n"
- " - !<ColorSpace>\n"
- " name: raw\n"
-- " - !<ColorSpace>\n"
-- " name: raw\n"
- "strictparsing: false\n"
- "roles:\n"
- " default: raw\n"
-@@ -2370,7 +1915,6 @@
- "testbarchedder") == 0);
- OIIO_CHECK_ASSERT(strcmp(config->getCurrentContext()->resolveStringVar("${SHOW}"),
- "bar") == 0);
-- OIIO_CHECK_THOW(config->sanityCheck(), OCIO::Exception);
- OIIO_CHECK_ASSERT(strcmp(config->getEnvironmentVarDefault("SHOW"), "super") == 0);
-
- OCIO::ConfigRcPtr edit = config->createEditableCopy();
-@@ -2403,6 +1947,10 @@
- "lighting") == 0);
- OCIO::SetLoggingLevel(loglevel);
-
-+ OIIO_CHECK_EQUAL(edit->getEnvironmentMode(), OCIO::ENV_ENVIRONMENT_LOAD_PREDEFINED);
-+ edit->setEnvironmentMode(OCIO::ENV_ENVIRONMENT_LOAD_ALL);
-+ OIIO_CHECK_EQUAL(edit->getEnvironmentMode(), OCIO::ENV_ENVIRONMENT_LOAD_ALL);
-+
- }
- }
-
-diff --git a/src/core/Display.cpp b/src/core/Display.cpp
-new file mode 100644
-index 0000000..7c0a1ef
---- /dev/null
-+++ b/src/core/Display.cpp
-@@ -0,0 +1,145 @@
-+/*
-+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 <string>
-+
-+#include <OpenColorIO/OpenColorIO.h>
-+
-+#include "Display.h"
-+#include "ParseUtils.h"
-+
-+OCIO_NAMESPACE_ENTER
-+{
-+
-+ DisplayMap::iterator find_display(DisplayMap & displays, const std::string & display)
-+ {
-+ for(DisplayMap::iterator iter = displays.begin();
-+ iter != displays.end();
-+ ++iter)
-+ {
-+ if(StrEqualsCaseIgnore(display, iter->first)) return iter;
-+ }
-+ return displays.end();
-+ }
-+
-+ DisplayMap::const_iterator find_display_const(const DisplayMap & displays, const std::string & display)
-+ {
-+ for(DisplayMap::const_iterator iter = displays.begin();
-+ iter != displays.end();
-+ ++iter)
-+ {
-+ if(StrEqualsCaseIgnore(display, iter->first)) return iter;
-+ }
-+ return displays.end();
-+ }
-+
-+ int find_view(const ViewVec & vec, const std::string & name)
-+ {
-+ for(unsigned int i=0; i<vec.size(); ++i)
-+ {
-+ if(StrEqualsCaseIgnore(name, vec[i].name)) return i;
-+ }
-+ return -1;
-+ }
-+
-+ void AddDisplay(DisplayMap & displays,
-+ const std::string & display,
-+ const std::string & view,
-+ const std::string & colorspace,
-+ const std::string & looks)
-+ {
-+ DisplayMap::iterator iter = find_display(displays, display);
-+ if(iter == displays.end())
-+ {
-+ ViewVec views;
-+ views.push_back( View(view, colorspace, looks) );
-+ displays[display] = views;
-+ }
-+ else
-+ {
-+ ViewVec & views = iter->second;
-+ int index = find_view(views, view);
-+ if(index<0)
-+ {
-+ views.push_back( View(view, colorspace, looks) );
-+ }
-+ else
-+ {
-+ views[index].colorspace = colorspace;
-+ views[index].looks = looks;
-+ }
-+ }
-+ }
-+
-+ void ComputeDisplays(StringVec & displayCache,
-+ const DisplayMap & displays,
-+ const StringVec & activeDisplays,
-+ const StringVec & activeDisplaysEnvOverride)
-+ {
-+ displayCache.clear();
-+
-+ StringVec displayMasterList;
-+ for(DisplayMap::const_iterator iter = displays.begin();
-+ iter != displays.end();
-+ ++iter)
-+ {
-+ displayMasterList.push_back(iter->first);
-+ }
-+
-+ // Apply the env override if it's not empty.
-+ if(!activeDisplaysEnvOverride.empty())
-+ {
-+ displayCache = IntersectStringVecsCaseIgnore(displayMasterList, activeDisplaysEnvOverride);
-+ if(!displayCache.empty()) return;
-+ }
-+ // Otherwise, aApply the active displays if it's not empty.
-+ else if(!activeDisplays.empty())
-+ {
-+ displayCache = IntersectStringVecsCaseIgnore(displayMasterList, activeDisplays);
-+ if(!displayCache.empty()) return;
-+ }
-+
-+ displayCache = displayMasterList;
-+ }
-+
-+}
-+OCIO_NAMESPACE_EXIT
-+
-+///////////////////////////////////////////////////////////////////////////////
-+
-+#ifdef OCIO_UNIT_TEST
-+
-+namespace OCIO = OCIO_NAMESPACE;
-+#include "UnitTest.h"
-+
-+OIIO_ADD_TEST(Display, Basic)
-+{
-+
-+}
-+
-+#endif // OCIO_UNIT_TEST
-\ No newline at end of file
-diff --git a/src/core/Display.h b/src/core/Display.h
-new file mode 100644
-index 0000000..6d63a43
---- /dev/null
-+++ b/src/core/Display.h
-@@ -0,0 +1,85 @@
-+/*
-+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.
-+*/
-+
-+
-+#ifndef INCLUDED_OCIO_DISPLAY_H
-+#define INCLUDED_OCIO_DISPLAY_H
-+
-+#include <OpenColorIO/OpenColorIO.h>
-+
-+#include <string>
-+#include <vector>
-+#include <map>
-+
-+#include "PrivateTypes.h"
-+
-+OCIO_NAMESPACE_ENTER
-+{
-+
-+ // Displays
-+ struct View
-+ {
-+ std::string name;
-+ std::string colorspace;
-+ std::string looks;
-+
-+ View() { }
-+
-+ View(const std::string & name_,
-+ const std::string & colorspace_,
-+ const std::string & looksList_) :
-+ name(name_),
-+ colorspace(colorspace_),
-+ looks(looksList_)
-+ { }
-+ };
-+
-+ typedef std::vector<View> ViewVec;
-+ typedef std::map<std::string, ViewVec> DisplayMap; // (display name : ViewVec)
-+
-+ DisplayMap::iterator find_display(DisplayMap & displays, const std::string & display);
-+
-+ DisplayMap::const_iterator find_display_const(const DisplayMap & displays, const std::string & display);
-+
-+ int find_view(const ViewVec & vec, const std::string & name);
-+
-+ void AddDisplay(DisplayMap & displays,
-+ const std::string & display,
-+ const std::string & view,
-+ const std::string & colorspace,
-+ const std::string & looks);
-+
-+ void ComputeDisplays(StringVec & displayCache,
-+ const DisplayMap & displays,
-+ const StringVec & activeDisplays,
-+ const StringVec & activeDisplaysEnvOverride);
-+
-+}
-+OCIO_NAMESPACE_EXIT
-+
-+#endif
-\ No newline at end of file
-diff --git a/src/core/OCIOYaml.cpp b/src/core/OCIOYaml.cpp
-index 7089318..fc2f5f8 100644
---- a/src/core/OCIOYaml.cpp
-+++ b/src/core/OCIOYaml.cpp
-@@ -30,1188 +30,1787 @@
+--- OpenColorIO-1.1.0/src/core/OCIOYaml.cpp.orig 2018-01-05 02:38:27.000000000 +0100
++++ OpenColorIO-1.1.0/src/core/OCIOYaml.cpp 2018-06-25 21:49:48.951035161 +0200
+@@ -30,7 +30,7 @@
#include <OpenColorIO/OpenColorIO.h>
-+#ifndef WINDOWS
-+
-+// fwd declare yaml-cpp visibility
-+#pragma GCC visibility push(hidden)
-+namespace YAML {
-+ class Exception;
-+ class BadDereference;
-+ class RepresentationException;
-+ class EmitterException;
-+ class ParserException;
-+ class InvalidScalar;
-+ class KeyNotFound;
-+ template <typename T> class TypedKeyNotFound;
-+ template <> class TypedKeyNotFound<OCIO_NAMESPACE::ColorSpace>;
-+ template <> class TypedKeyNotFound<OCIO_NAMESPACE::Config>;
-+ template <> class TypedKeyNotFound<OCIO_NAMESPACE::Exception>;
-+ template <> class TypedKeyNotFound<OCIO_NAMESPACE::GpuShaderDesc>;
-+ template <> class TypedKeyNotFound<OCIO_NAMESPACE::ImageDesc>;
-+ template <> class TypedKeyNotFound<OCIO_NAMESPACE::Look>;
-+ template <> class TypedKeyNotFound<OCIO_NAMESPACE::Processor>;
-+ template <> class TypedKeyNotFound<OCIO_NAMESPACE::Transform>;
-+ template <> class TypedKeyNotFound<OCIO_NAMESPACE::AllocationTransform>;
-+ template <> class TypedKeyNotFound<OCIO_NAMESPACE::CDLTransform>;
-+ template <> class TypedKeyNotFound<OCIO_NAMESPACE::ColorSpaceTransform>;
-+ template <> class TypedKeyNotFound<OCIO_NAMESPACE::DisplayTransform>;
-+ template <> class TypedKeyNotFound<OCIO_NAMESPACE::ExponentTransform>;
-+ template <> class TypedKeyNotFound<OCIO_NAMESPACE::FileTransform>;
-+ template <> class TypedKeyNotFound<OCIO_NAMESPACE::GroupTransform>;
-+ template <> class TypedKeyNotFound<OCIO_NAMESPACE::LogTransform>;
-+ template <> class TypedKeyNotFound<OCIO_NAMESPACE::LookTransform>;
-+ template <> class TypedKeyNotFound<OCIO_NAMESPACE::MatrixTransform>;
-+ template <> class TypedKeyNotFound<OCIO_NAMESPACE::TruelightTransform>;
-+}
-+#pragma GCC visibility pop
-+
-+#endif
-+
-+#include <yaml-cpp/yaml.h>
-+
- #include "Logging.h"
- #include "MathUtils.h"
-+#include "pystring/pystring.h"
-+#include "PathUtils.h"
-+#include "ParseUtils.h"
-+#include "Display.h"
- #include "OCIOYaml.h"
-
- OCIO_NAMESPACE_ENTER
- {
-- ///////////////////////////////////////////////////////////////////////////
-- // Core
-
-- void LogUnknownKeyWarning(const std::string & name, const YAML::Node& tag)
-+ namespace
- {
-- std::string key;
-- tag >> key;
--
-- std::ostringstream os;
-- os << "Unknown key in " << name << ": ";
-- os << "'" << key << "'. (line ";
-- os << (tag.GetMark().line+1) << ", column "; // (yaml line numbers start at 0)
-- os << tag.GetMark().column << ")";
-- LogWarning(os.str());
-- }
-
-- void operator >> (const YAML::Node& node, ColorSpaceRcPtr& cs)
-- {
-- if(node.Tag() != "ColorSpace")
-- return; // not a !<ColorSpace> tag
-+#ifdef OLDYAML
-+ typedef YAML::Iterator Iterator;
-+#else
-+ typedef YAML::const_iterator Iterator;
-+#endif
-
-- std::string key, stringval;
-- bool boolval;
-+ // Iterator access
-
-- for (YAML::Iterator iter = node.begin();
-- iter != node.end();
-- ++iter)
-- {
-- iter.first() >> key;
--
-- if(key == "name")
-- {
-- if (iter.second().Type() != YAML::NodeType::Null &&
-- iter.second().Read<std::string>(stringval))
-- cs->setName(stringval.c_str());
-- }
-- else if(key == "description")
-- {
-- if (iter.second().Type() != YAML::NodeType::Null &&
-- iter.second().Read<std::string>(stringval))
-- cs->setDescription(stringval.c_str());
-- }
-- else if(key == "family")
-- {
-- if (iter.second().Type() != YAML::NodeType::Null &&
-- iter.second().Read<std::string>(stringval))
-- cs->setFamily(stringval.c_str());
-- }
-- else if(key == "equalitygroup")
-- {
-- if (iter.second().Type() != YAML::NodeType::Null &&
-- iter.second().Read<std::string>(stringval))
-- cs->setEqualityGroup(stringval.c_str());
-- }
-- else if(key == "bitdepth")
-- {
-- BitDepth ret;
-- if (iter.second().Type() != YAML::NodeType::Null &&
-- iter.second().Read<BitDepth>(ret))
-- cs->setBitDepth(ret);
-- }
-- else if(key == "isdata")
-- {
-- if (iter.second().Type() != YAML::NodeType::Null &&
-- iter.second().Read<bool>(boolval))
-- cs->setIsData(boolval);
-- }
-- else if(key == "allocation")
-- {
-- Allocation val;
-- if (iter.second().Type() != YAML::NodeType::Null &&
-- iter.second().Read<Allocation>(val))
-- cs->setAllocation(val);
-- }
-- else if(key == "allocationvars")
-- {
-- std::vector<float> val;
-- if (iter.second().Type() != YAML::NodeType::Null)
-- {
-- iter.second() >> val;
-- if(!val.empty())
-- {
-- cs->setAllocationVars(static_cast<int>(val.size()), &val[0]);
-- }
-- }
-- }
-- else if(key == "to_reference")
-- {
-- TransformRcPtr val;
-- if (iter.second().Type() != YAML::NodeType::Null &&
-- iter.second().Read<TransformRcPtr>(val))
-- cs->setTransform(val, COLORSPACE_DIR_TO_REFERENCE);
-- }
-- else if(key == "from_reference")
-- {
-- TransformRcPtr val;
-- if (iter.second().Type() != YAML::NodeType::Null &&
-- iter.second().Read<TransformRcPtr>(val))
-- cs->setTransform(val, COLORSPACE_DIR_FROM_REFERENCE);
-- }
-- else
-- {
-- LogUnknownKeyWarning(node.Tag(), iter.first());
-- }
-- }
-- }
--
-- YAML::Emitter& operator << (YAML::Emitter& out, ColorSpaceRcPtr cs)
-- {
-- out << YAML::VerbatimTag("ColorSpace");
-- out << YAML::BeginMap;
--
-- out << YAML::Key << "name" << YAML::Value << cs->getName();
-- out << YAML::Key << "family" << YAML::Value << cs->getFamily();
-- out << YAML::Key << "equalitygroup" << YAML::Value << cs->getEqualityGroup();
-- out << YAML::Key << "bitdepth" << YAML::Value << cs->getBitDepth();
-- if(strlen(cs->getDescription()) > 0)
-+ inline const YAML::Node& get_first(const Iterator it)
- {
-- out << YAML::Key << "description";
-- out << YAML::Value << YAML::Literal << cs->getDescription();
-+#ifdef OLDYAML
-+ return it.first();
-+#else
-+ return it->first;
-+#endif
- }
-- out << YAML::Key << "isdata" << YAML::Value << cs->isData();
-
-- out << YAML::Key << "allocation" << YAML::Value << cs->getAllocation();
-- if(cs->getAllocationNumVars() > 0)
-+ inline const YAML::Node& get_second(const Iterator it)
- {
-- std::vector<float> allocationvars(cs->getAllocationNumVars());
-- cs->getAllocationVars(&allocationvars[0]);
-- out << YAML::Key << "allocationvars";
-- out << YAML::Flow << YAML::Value << allocationvars;
-+#ifdef OLDYAML
-+ return it.second();
-+#else
-+ return it->second;
-+#endif
- }
-
-- ConstTransformRcPtr toref = \
-- cs->getTransform(COLORSPACE_DIR_TO_REFERENCE);
-- if(toref)
-- out << YAML::Key << "to_reference" << YAML::Value << toref;
--
-- ConstTransformRcPtr fromref = \
-- cs->getTransform(COLORSPACE_DIR_FROM_REFERENCE);
-- if(fromref)
-- out << YAML::Key << "from_reference" << YAML::Value << fromref;
--
-- out << YAML::EndMap;
-- out << YAML::Newline;
--
-- return out;
-- }
--
--
-- ///////////////////////////////////////////////////////////////////////////
--
-- // Look. (not the transform, the top-level class)
--
-- void operator >> (const YAML::Node& node, LookRcPtr& look)
-- {
-- if(node.Tag() != "Look")
-- return;
--
-- std::string key, stringval;
-+ // Basic types
-
-- for (YAML::Iterator iter = node.begin();
-- iter != node.end();
-- ++iter)
-+ inline void load(const YAML::Node& node, bool& x)
- {
-- iter.first() >> key;
--
-- if(key == "name")
-- {
-- if (iter.second().Type() != YAML::NodeType::Null &&
-- iter.second().Read<std::string>(stringval))
-- look->setName(stringval.c_str());
-- }
-- else if(key == "process_space")
-- {
-- if (iter.second().Type() != YAML::NodeType::Null &&
-- iter.second().Read<std::string>(stringval))
-- look->setProcessSpace(stringval.c_str());
-- }
-- else if(key == "transform")
-- {
-- TransformRcPtr val;
-- if (iter.second().Type() != YAML::NodeType::Null &&
-- iter.second().Read<TransformRcPtr>(val))
-- look->setTransform(val);
-- }
-- else if(key == "inverse_transform")
-- {
-- TransformRcPtr val;
-- if (iter.second().Type() != YAML::NodeType::Null &&
-- iter.second().Read<TransformRcPtr>(val))
-- look->setInverseTransform(val);
-- }
-- else
-- {
-- LogUnknownKeyWarning(node.Tag(), iter.first());
-- }
-+#ifdef OLDYAML
-+ node.Read<bool>(x);
-+#else
-+ x = node.as<bool>();
-+#endif
- }
-- }
--
-- YAML::Emitter& operator << (YAML::Emitter& out, LookRcPtr look)
-- {
-- out << YAML::VerbatimTag("Look");
-- out << YAML::BeginMap;
-- out << YAML::Key << "name" << YAML::Value << look->getName();
-- out << YAML::Key << "process_space" << YAML::Value << look->getProcessSpace();
-
-- if(look->getTransform())
-+ inline void load(const YAML::Node& node, int& x)
- {
-- out << YAML::Key << "transform";
-- out << YAML::Value << look->getTransform();
-+#ifdef OLDYAML
-+ node.Read<int>(x);
-+#else
-+ x = node.as<int>();
-+#endif
- }
-
-- if(look->getInverseTransform())
-+ inline void load(const YAML::Node& node, float& x)
- {
-- out << YAML::Key << "inverse_transform";
-- out << YAML::Value << look->getInverseTransform();
-+#ifdef OLDYAML
-+ node.Read<float>(x);
-+#else
-+ x = node.as<float>();
-+#endif
- }
-
-- out << YAML::EndMap;
-- out << YAML::Newline;
-+ inline void load(const YAML::Node& node, std::string& x)
-+ {
-+#ifdef OLDYAML
-+ node.Read<std::string>(x);
-+#else
-+ x = node.as<std::string>();
-+#endif
-+ }
-
-- return out;
-- }
--
--
--
-- ///////////////////////////////////////////////////////////////////////////
--
--
-- namespace
-- {
-- void EmitBaseTransformKeyValues(YAML::Emitter & out,
-- const ConstTransformRcPtr & t)
-+ inline void load(const YAML::Node& node, std::vector<std::string>& x)
- {
-- if(t->getDirection() != TRANSFORM_DIR_FORWARD)
-- {
-- out << YAML::Key << "direction";
-- out << YAML::Value << YAML::Flow << t->getDirection();
-- }
-+#ifdef OLDYAML
-+ node >> x;
-+#else
-+ x = node.as<std::vector<std::string> >();
-+#endif
- }
-- }
--
-- void operator >> (const YAML::Node& node, TransformRcPtr& t)
-- {
-- if(node.Type() != YAML::NodeType::Map)
-+
-+ inline void load(const YAML::Node& node, std::vector<float>& x)
- {
-- std::ostringstream os;
-- os << "Unsupported Transform type encountered: (" << node.Type() << ") in OCIO profile. ";
-- os << "Only Mapping types supported. (line ";
-- os << (node.GetMark().line+1) << ", column "; // (yaml line numbers start at 0)
-- os << node.GetMark().column << ")";
-- throw Exception(os.str().c_str());
-+#ifdef OLDYAML
-+ node >> x;
-+#else
-+ x = node.as<std::vector<float> >();
-+#endif
- }
-
-- std::string type = node.Tag();
-+ // Enums
-
-- if(type == "AllocationTransform") {
-- AllocationTransformRcPtr temp;
-- node.Read<AllocationTransformRcPtr>(temp);
-- t = temp;
-+ inline void load(const YAML::Node& node, BitDepth& depth)
-+ {
-+ std::string str;
-+ load(node, str);
-+ depth = BitDepthFromString(str.c_str());
- }
-- else if(type == "CDLTransform") {
-- CDLTransformRcPtr temp;
-- node.Read<CDLTransformRcPtr>(temp);
-- t = temp;
-+
-+ inline void save(YAML::Emitter& out, BitDepth depth)
-+ {
-+ out << BitDepthToString(depth);
- }
-- else if(type == "ColorSpaceTransform") {
-- ColorSpaceTransformRcPtr temp;
-- node.Read<ColorSpaceTransformRcPtr>(temp);
-- t = temp;
-+
-+ inline void load(const YAML::Node& node, Allocation& alloc)
-+ {
-+ std::string str;
-+ load(node, str);
-+ alloc = AllocationFromString(str.c_str());
- }
-- // TODO: DisplayTransform
-- else if(type == "ExponentTransform") {
-- ExponentTransformRcPtr temp;
-- node.Read<ExponentTransformRcPtr>(temp);
-- t = temp;
-+
-+ inline void save(YAML::Emitter& out, Allocation alloc)
-+ {
-+ out << AllocationToString(alloc);
- }
-- else if(type == "FileTransform") {
-- FileTransformRcPtr temp;
-- node.Read<FileTransformRcPtr>(temp);
-- t = temp;
-+
-+ inline void load(const YAML::Node& node, ColorSpaceDirection& dir)
-+ {
-+ std::string str;
-+ load(node, str);
-+ dir = ColorSpaceDirectionFromString(str.c_str());
- }
-- else if(type == "GroupTransform") {
-- GroupTransformRcPtr temp;
-- node.Read<GroupTransformRcPtr>(temp);
-- t = temp;
-+
-+ inline void save(YAML::Emitter& out, ColorSpaceDirection dir)
-+ {
-+ out << ColorSpaceDirectionToString(dir);
- }
-- else if(type == "LogTransform") {
-- LogTransformRcPtr temp;
-- node.Read<LogTransformRcPtr>(temp);
-- t = temp;
-+
-+ inline void load(const YAML::Node& node, TransformDirection& dir)
-+ {
-+ std::string str;
-+ load(node, str);
-+ dir = TransformDirectionFromString(str.c_str());
- }
-- else if(type == "LookTransform") {
-- LookTransformRcPtr temp;
-- node.Read<LookTransformRcPtr>(temp);
-- t = temp;
-+
-+ inline void save(YAML::Emitter& out, TransformDirection dir)
-+ {
-+ out << TransformDirectionToString(dir);
- }
-- else if(type == "MatrixTransform") {
-- MatrixTransformRcPtr temp;
-- node.Read<MatrixTransformRcPtr>(temp);
-- t = temp;
-+
-+ inline void load(const YAML::Node& node, Interpolation& interp)
-+ {
-+ std::string str;
-+ load(node, str);
-+ interp = InterpolationFromString(str.c_str());
- }
-- else if(type == "TruelightTransform") {
-- TruelightTransformRcPtr temp;
-- node.Read<TruelightTransformRcPtr>(temp);
-- t = temp;
-+
-+ inline void save(YAML::Emitter& out, Interpolation interp)
-+ {
-+ out << InterpolationToString(interp);
- }
-- else
-+
-+ //
-+
-+ inline void LogUnknownKeyWarning(const std::string & name,
-+ const YAML::Node& tag)
- {
-- // TODO: add a new empty (better name?) aka passthru Transform()
-- // which does nothing. This is so upsupported !<tag> types don't
-- // throw an exception. Alternativly this could be caught in the
-- // GroupTransformRcPtr >> operator with some type of
-- // supported_tag() method
--
-- // TODO: consider the forwards-compatibility implication of
-- // throwing an exception. Should this be a warning, instead?
--
-- // t = EmptyTransformRcPtr(new EmptyTransform(), &deleter);
-+ std::string key;
-+ load(tag, key);
-+
- std::ostringstream os;
-- os << "Unsupported transform type !<" << type << "> in OCIO profile. ";
-- os << " (line ";
-- os << (node.GetMark().line+1) << ", column "; // (yaml line numbers start at 0)
-- os << node.GetMark().column << ")";
-- throw Exception(os.str().c_str());
-+ os << "Unknown key in " << name << ": '" << key << "'.";
-+ LogWarning(os.str());
- }
-- }
--
-- YAML::Emitter& operator << (YAML::Emitter& out, ConstTransformRcPtr t)
-- {
-- if(ConstAllocationTransformRcPtr Allocation_tran = \
-- DynamicPtrCast<const AllocationTransform>(t))
-- out << Allocation_tran;
-- else if(ConstCDLTransformRcPtr CDL_tran = \
-- DynamicPtrCast<const CDLTransform>(t))
-- out << CDL_tran;
-- else if(ConstColorSpaceTransformRcPtr ColorSpace_tran = \
-- DynamicPtrCast<const ColorSpaceTransform>(t))
-- out << ColorSpace_tran;
-- else if(ConstExponentTransformRcPtr Exponent_tran = \
-- DynamicPtrCast<const ExponentTransform>(t))
-- out << Exponent_tran;
-- else if(ConstFileTransformRcPtr File_tran = \
-- DynamicPtrCast<const FileTransform>(t))
-- out << File_tran;
-- else if(ConstGroupTransformRcPtr Group_tran = \
-- DynamicPtrCast<const GroupTransform>(t))
-- out << Group_tran;
-- else if(ConstLogTransformRcPtr Log_tran = \
-- DynamicPtrCast<const LogTransform>(t))
-- out << Log_tran;
-- else if(ConstLookTransformRcPtr Look_tran = \
-- DynamicPtrCast<const LookTransform>(t))
-- out << Look_tran;
-- else if(ConstMatrixTransformRcPtr Matrix_tran = \
-- DynamicPtrCast<const MatrixTransform>(t))
-- out << Matrix_tran;
-- else if(ConstTruelightTransformRcPtr Truelight_tran = \
-- DynamicPtrCast<const TruelightTransform>(t))
-- out << Truelight_tran;
-- else
-- throw Exception("Unsupported Transform() type for serialization.");
--
-- return out;
-- }
--
--
-- ///////////////////////////////////////////////////////////////////////////
-- // Transforms
--
-- void operator >> (const YAML::Node& node, GroupTransformRcPtr& t)
-- {
-- t = GroupTransform::Create();
-
-- std::string key;
-+ // View
-
-- for (YAML::Iterator iter = node.begin();
-- iter != node.end();
-- ++iter)
-+ inline void load(const YAML::Node& node, View& v)
- {
-- iter.first() >> key;
-+ if(node.Tag() != "View")
-+ return;
-
-- if(key == "children")
-- {
-- const YAML::Node & children = iter.second();
-- for(unsigned i = 0; i <children.size(); ++i)
-+ std::string key, stringval;
-+
-+ for (Iterator iter = node.begin();
-+ iter != node.end();
-+ ++iter)
-+ {
-+ const YAML::Node& first = get_first(iter);
-+ const YAML::Node& second = get_second(iter);
-+
-+ load(first, key);
-+
-+ if (second.Type() == YAML::NodeType::Null) continue;
-+
-+ if(key == "name")
- {
-- TransformRcPtr childTransform;
-- children[i].Read<TransformRcPtr>(childTransform);
--
-- // TODO: consider the forwards-compatibility implication of
-- // throwing an exception. Should this be a warning, instead?
-- if(!childTransform)
-- {
-- throw Exception("Child transform could not be parsed.");
-- }
--
-- t->push_back(childTransform);
-+ load(second, stringval);
-+ v.name = stringval;
-+ }
-+ else if(key == "colorspace")
-+ {
-+ load(second, stringval);
-+ v.colorspace = stringval;
-+ }
-+ else if(key == "looks" || key == "look")
-+ {
-+ load(second, stringval);
-+ v.looks = stringval;
-+ }
-+ else
-+ {
-+ LogUnknownKeyWarning(node.Tag(), first);
- }
- }
-- else if(key == "direction")
-+
-+ if(v.name.empty())
- {
-- TransformDirection val;
-- if (iter.second().Type() != YAML::NodeType::Null &&
-- iter.second().Read<TransformDirection>(val))
-- t->setDirection(val);
-+ throw Exception("View does not specify 'name'.");
- }
-- else
-+ if(v.colorspace.empty())
- {
-- LogUnknownKeyWarning(node.Tag(), iter.first());
-+ std::ostringstream os;
-+ os << "View '" << v.name << "' ";
-+ os << "does not specify colorspace.";
-+ throw Exception(os.str().c_str());
- }
- }
-- }
--
-- YAML::Emitter& operator << (YAML::Emitter& out, ConstGroupTransformRcPtr t)
-- {
-- out << YAML::VerbatimTag("GroupTransform");
-- out << YAML::BeginMap;
-- EmitBaseTransformKeyValues(out, t);
--
-- out << YAML::Key << "children";
-- out << YAML::Value;
-
-- out << YAML::BeginSeq;
-- for(int i = 0; i < t->size(); ++i)
-+ inline void save(YAML::Emitter& out, View view)
- {
-- out << t->getTransform(i);
-+ out << YAML::VerbatimTag("View");
-+ out << YAML::Flow;
-+ out << YAML::BeginMap;
-+ out << YAML::Key << "name" << YAML::Value << view.name;
-+ out << YAML::Key << "colorspace" << YAML::Value << view.colorspace;
-+ if(!view.looks.empty()) out << YAML::Key << "looks" << YAML::Value << view.looks;
-+ out << YAML::EndMap;
- }
-- out << YAML::EndSeq;
--
-- out << YAML::EndMap;
--
-- return out;
-- }
--
--
--
-- void operator >> (const YAML::Node& node, FileTransformRcPtr& t)
-- {
-- t = FileTransform::Create();
-
-- std::string key, stringval;
-+ // Common Transform
-
-- for (YAML::Iterator iter = node.begin();
-- iter != node.end();
-- ++iter)
-+ inline void EmitBaseTransformKeyValues(YAML::Emitter & out,
-+ const ConstTransformRcPtr & t)
- {
-- iter.first() >> key;
--
-- if(key == "src")
-- {
-- if (iter.second().Type() != YAML::NodeType::Null &&
-- iter.second().Read<std::string>(stringval))
-- t->setSrc(stringval.c_str());
-- }
-- else if(key == "cccid")
-- {
-- if (iter.second().Type() != YAML::NodeType::Null &&
-- iter.second().Read<std::string>(stringval))
-- t->setCCCId(stringval.c_str());
-- }
-- else if(key == "interpolation")
-- {
-- Interpolation val;
-- if (iter.second().Type() != YAML::NodeType::Null &&
-- iter.second().Read<Interpolation>(val))
-- t->setInterpolation(val);
-- }
-- else if(key == "direction")
-- {
-- TransformDirection val;
-- if (iter.second().Type() != YAML::NodeType::Null &&
-- iter.second().Read<TransformDirection>(val))
-- t->setDirection(val);
-- }
-- else
-+ if(t->getDirection() != TRANSFORM_DIR_FORWARD)
- {
-- LogUnknownKeyWarning(node.Tag(), iter.first());
-+ out << YAML::Key << "direction";
-+ out << YAML::Value << YAML::Flow;
-+ save(out, t->getDirection());
- }
- }
-- }
--
-- YAML::Emitter& operator << (YAML::Emitter& out, ConstFileTransformRcPtr t)
-- {
-- out << YAML::VerbatimTag("FileTransform");
-- out << YAML::Flow << YAML::BeginMap;
-- out << YAML::Key << "src" << YAML::Value << t->getSrc();
-- const char * cccid = t->getCCCId();
-- if(cccid && *cccid)
-- {
-- out << YAML::Key << "cccid" << YAML::Value << t->getCCCId();
-- }
-- out << YAML::Key << "interpolation";
-- out << YAML::Value << t->getInterpolation();
--
-- EmitBaseTransformKeyValues(out, t);
-- out << YAML::EndMap;
-- return out;
-- }
--
-- void operator >> (const YAML::Node& node, ColorSpaceTransformRcPtr& t)
-- {
-- t = ColorSpaceTransform::Create();
-
-- std::string key, stringval;
-+ // AllocationTransform
-
-- for (YAML::Iterator iter = node.begin();
-- iter != node.end();
-- ++iter)
-+ inline void load(const YAML::Node& node, AllocationTransformRcPtr& t)
- {
-- iter.first() >> key;
-+ t = AllocationTransform::Create();
-
-- if(key == "src")
-- {
-- if (iter.second().Type() != YAML::NodeType::Null &&
-- iter.second().Read<std::string>(stringval))
-- t->setSrc(stringval.c_str());
-- }
-- else if(key == "dst")
-- {
-- if (iter.second().Type() != YAML::NodeType::Null &&
-- iter.second().Read<std::string>(stringval))
-- t->setDst(stringval.c_str());
-- }
-- else if(key == "direction")
-- {
-- TransformDirection val;
-- if (iter.second().Type() != YAML::NodeType::Null &&
-- iter.second().Read<TransformDirection>(val))
-- t->setDirection(val);
-- }
-- else
-- {
-- LogUnknownKeyWarning(node.Tag(), iter.first());
-+ std::string key;
-+
-+ for (Iterator iter = node.begin();
-+ iter != node.end();
-+ ++iter)
-+ {
-+ const YAML::Node& first = get_first(iter);
-+ const YAML::Node& second = get_second(iter);
-+
-+ load(first, key);
-+
-+ if (second.Type() == YAML::NodeType::Null) continue;
-+
-+ if(key == "allocation")
-+ {
-+ Allocation val;
-+ load(second, val);
-+ t->setAllocation(val);
-+ }
-+ else if(key == "vars")
-+ {
-+ std::vector<float> val;
-+ load(second, val);
-+ if(!val.empty())
-+ {
-+ t->setVars(static_cast<int>(val.size()), &val[0]);
-+ }
-+ }
-+ else if(key == "direction")
-+ {
-+ TransformDirection val;
-+ load(second, val);
-+ t->setDirection(val);
-+ }
-+ else
-+ {
-+ LogUnknownKeyWarning(node.Tag(), first);
-+ }
- }
- }
-- }
--
-- YAML::Emitter& operator << (YAML::Emitter& out, ConstColorSpaceTransformRcPtr t)
-- {
-- out << YAML::VerbatimTag("ColorSpaceTransform");
-- out << YAML::Flow << YAML::BeginMap;
-- out << YAML::Key << "src" << YAML::Value << t->getSrc();
-- out << YAML::Key << "dst" << YAML::Value << t->getDst();
-- EmitBaseTransformKeyValues(out, t);
-- out << YAML::EndMap;
-- return out;
-- }
--
-- void operator >> (const YAML::Node& node, LookTransformRcPtr& t)
-- {
-- t = LookTransform::Create();
--
-- std::string key, stringval;
-
-- for (YAML::Iterator iter = node.begin();
-- iter != node.end();
-- ++iter)
-+ inline void save(YAML::Emitter& out, ConstAllocationTransformRcPtr t)
- {
-- iter.first() >> key;
-+ out << YAML::VerbatimTag("AllocationTransform");
-+ out << YAML::Flow << YAML::BeginMap;
-
-- if(key == "src")
-- {
-- if (iter.second().Type() != YAML::NodeType::Null &&
-- iter.second().Read<std::string>(stringval))
-- t->setSrc(stringval.c_str());
-- }
-- else if(key == "dst")
-- {
-- if (iter.second().Type() != YAML::NodeType::Null &&
-- iter.second().Read<std::string>(stringval))
-- t->setDst(stringval.c_str());
-- }
-- else if(key == "looks")
-- {
-- if (iter.second().Type() != YAML::NodeType::Null &&
-- iter.second().Read<std::string>(stringval))
-- t->setLooks(stringval.c_str());
-- }
-- else if(key == "direction")
-- {
-- TransformDirection val;
-- if (iter.second().Type() != YAML::NodeType::Null &&
-- iter.second().Read<TransformDirection>(val))
-- t->setDirection(val);
-- }
-- else
-+ out << YAML::Key << "allocation";
-+ out << YAML::Value << YAML::Flow;
-+ save(out, t->getAllocation());
-+
-+ if(t->getNumVars() > 0)
- {
-- LogUnknownKeyWarning(node.Tag(), iter.first());
-+ std::vector<float> vars(t->getNumVars());
-+ t->getVars(&vars[0]);
-+ out << YAML::Key << "vars";
-+ out << YAML::Flow << YAML::Value << vars;
- }
-+
-+ EmitBaseTransformKeyValues(out, t);
-+ out << YAML::EndMap;
- }
-- }
--
-- YAML::Emitter& operator << (YAML::Emitter& out, ConstLookTransformRcPtr t)
-- {
-- out << YAML::VerbatimTag("LookTransform");
-- out << YAML::Flow << YAML::BeginMap;
-- out << YAML::Key << "src" << YAML::Value << t->getSrc();
-- out << YAML::Key << "dst" << YAML::Value << t->getDst();
-- out << YAML::Key << "looks" << YAML::Value << t->getLooks();
-- EmitBaseTransformKeyValues(out, t);
-- out << YAML::EndMap;
-- return out;
-- }
--
-- void operator >> (const YAML::Node& node, ExponentTransformRcPtr& t)
-- {
-- t = ExponentTransform::Create();
-
-- std::string key;
-+ // CDLTransform
-
-- for (YAML::Iterator iter = node.begin();
-- iter != node.end();
-- ++iter)
-+ inline void load(const YAML::Node& node, CDLTransformRcPtr& t)
- {
-- iter.first() >> key;
-+ t = CDLTransform::Create();
-
-- if(key == "value")
-- {
-- std::vector<float> val;
-- if (iter.second().Type() != YAML::NodeType::Null)
-+ std::string key;
-+ std::vector<float> floatvecval;
-+
-+ for (Iterator iter = node.begin();
-+ iter != node.end();
-+ ++iter)
-+ {
-+ const YAML::Node& first = get_first(iter);
-+ const YAML::Node& second = get_second(iter);
-+
-+ load(first, key);
-+
-+ if (second.Type() == YAML::NodeType::Null) continue;
-+
-+ if(key == "slope")
- {
-- iter.second() >> val;
-- if(val.size() != 4)
-+ load(second, floatvecval);
-+ if(floatvecval.size() != 3)
- {
- std::ostringstream os;
-- os << "ExponentTransform parse error, value field must be 4 ";
-- os << "floats. Found '" << val.size() << "'.";
-+ os << "CDLTransform parse error, 'slope' field must be 3 ";
-+ os << "floats. Found '" << floatvecval.size() << "'.";
- throw Exception(os.str().c_str());
- }
-- t->setValue(&val[0]);
-+ t->setSlope(&floatvecval[0]);
- }
-- }
-- else if(key == "direction")
-- {
-- TransformDirection val;
-- if (iter.second().Type() != YAML::NodeType::Null &&
-- iter.second().Read<TransformDirection>(val))
-- t->setDirection(val);
-- }
-- else
-- {
-- LogUnknownKeyWarning(node.Tag(), iter.first());
-- }
-- }
-- }
--
-- YAML::Emitter& operator << (YAML::Emitter& out, ConstExponentTransformRcPtr t)
-- {
-- out << YAML::VerbatimTag("ExponentTransform");
-- out << YAML::Flow << YAML::BeginMap;
--
-- std::vector<float> value(4, 0.0);
-- t->getValue(&value[0]);
-- out << YAML::Key << "value";
-- out << YAML::Value << YAML::Flow << value;
-- EmitBaseTransformKeyValues(out, t);
-- out << YAML::EndMap;
-- return out;
-- }
--
-- void operator >> (const YAML::Node& node, LogTransformRcPtr& t)
-- {
-- t = LogTransform::Create();
--
-- std::string key;
--
-- for (YAML::Iterator iter = node.begin();
-- iter != node.end();
-- ++iter)
-- {
-- iter.first() >> key;
--
-- if(key == "base")
-- {
-- float val = 0.0f;
-- if (iter.second().Type() != YAML::NodeType::Null &&
-- iter.second().Read<float>(val))
-- t->setBase(val);
-- }
-- else if(key == "direction")
-- {
-- TransformDirection val;
-- if (iter.second().Type() != YAML::NodeType::Null &&
-- iter.second().Read<TransformDirection>(val))
-- t->setDirection(val);
-- }
-- else
-- {
-- LogUnknownKeyWarning(node.Tag(), iter.first());
-- }
-- }
-- }
--
-- YAML::Emitter& operator << (YAML::Emitter& out, ConstLogTransformRcPtr t)
-- {
-- out << YAML::VerbatimTag("LogTransform");
-- out << YAML::Flow << YAML::BeginMap;
-- out << YAML::Key << "base" << YAML::Value << t->getBase();
-- EmitBaseTransformKeyValues(out, t);
-- out << YAML::EndMap;
-- return out;
-- }
--
-- void operator >> (const YAML::Node& node, MatrixTransformRcPtr& t)
-- {
-- t = MatrixTransform::Create();
--
-- std::string key;
--
-- for (YAML::Iterator iter = node.begin();
-- iter != node.end();
-- ++iter)
-- {
-- iter.first() >> key;
--
-- if(key == "matrix")
-- {
-- std::vector<float> val;
-- if (iter.second().Type() != YAML::NodeType::Null)
-+ else if(key == "offset")
- {
-- iter.second() >> val;
-- if(val.size() != 16)
-+ load(second, floatvecval);
-+ if(floatvecval.size() != 3)
- {
- std::ostringstream os;
-- os << "MatrixTransform parse error, matrix field must be 16 ";
-- os << "floats. Found '" << val.size() << "'.";
-+ os << "CDLTransform parse error, 'offset' field must be 3 ";
-+ os << "floats. Found '" << floatvecval.size() << "'.";
- throw Exception(os.str().c_str());
- }
-- t->setMatrix(&val[0]);
-+ t->setOffset(&floatvecval[0]);
- }
-- }
-- else if(key == "offset")
-- {
-- std::vector<float> val;
-- if (iter.second().Type() != YAML::NodeType::Null)
-+ else if(key == "power")
- {
-- iter.second() >> val;
-- if(val.size() != 4)
-+ load(second, floatvecval);
-+ if(floatvecval.size() != 3)
- {
- std::ostringstream os;
-- os << "MatrixTransform parse error, offset field must be 4 ";
-- os << "floats. Found '" << val.size() << "'.";
-+ os << "CDLTransform parse error, 'power' field must be 3 ";
-+ os << "floats. Found '" << floatvecval.size() << "'.";
- throw Exception(os.str().c_str());
- }
-- t->setOffset(&val[0]);
-+ t->setPower(&floatvecval[0]);
-+ }
-+ else if(key == "saturation" || key == "sat")
-+ {
-+ float val = 0.0f;
-+ load(second, val);
-+ t->setSat(val);
- }
-+ else if(key == "direction")
-+ {
-+ TransformDirection val;
-+ load(second, val);
-+ t->setDirection(val);
-+ }
-+ else
-+ {
-+ LogUnknownKeyWarning(node.Tag(), first);
-+ }
-+ }
-+ }
-+
-+ inline void save(YAML::Emitter& out, ConstCDLTransformRcPtr t)
-+ {
-+ out << YAML::VerbatimTag("CDLTransform");
-+ out << YAML::Flow << YAML::BeginMap;
-+
-+ std::vector<float> slope(3);
-+ t->getSlope(&slope[0]);
-+ if(!IsVecEqualToOne(&slope[0], 3))
-+ {
-+ out << YAML::Key << "slope";
-+ out << YAML::Value << YAML::Flow << slope;
- }
-- else if(key == "direction")
-+
-+ std::vector<float> offset(3);
-+ t->getOffset(&offset[0]);
-+ if(!IsVecEqualToZero(&offset[0], 3))
- {
-- TransformDirection val;
-- if (iter.second().Type() != YAML::NodeType::Null &&
-- iter.second().Read<TransformDirection>(val))
-- t->setDirection(val);
-+ out << YAML::Key << "offset";
-+ out << YAML::Value << YAML::Flow << offset;
- }
-- else
-+
-+ std::vector<float> power(3);
-+ t->getPower(&power[0]);
-+ if(!IsVecEqualToOne(&power[0], 3))
-+ {
-+ out << YAML::Key << "power";
-+ out << YAML::Value << YAML::Flow << power;
-+ }
-+
-+ if(!IsScalarEqualToOne(t->getSat()))
- {
-- LogUnknownKeyWarning(node.Tag(), iter.first());
-+ out << YAML::Key << "sat" << YAML::Value << t->getSat();
- }
-+
-+ EmitBaseTransformKeyValues(out, t);
-+ out << YAML::EndMap;
- }
-- }
--
-- YAML::Emitter& operator << (YAML::Emitter& out, ConstMatrixTransformRcPtr t)
-- {
-- out << YAML::VerbatimTag("MatrixTransform");
-- out << YAML::Flow << YAML::BeginMap;
-
-- std::vector<float> matrix(16, 0.0);
-- t->getMatrix(&matrix[0]);
-- if(!IsM44Identity(&matrix[0]))
-+ // ColorSpaceTransform
-+
-+ inline void load(const YAML::Node& node, ColorSpaceTransformRcPtr& t)
- {
-- out << YAML::Key << "matrix";
-- out << YAML::Value << YAML::Flow << matrix;
-+ t = ColorSpaceTransform::Create();
-+
-+ std::string key, stringval;
-+
-+ for (Iterator iter = node.begin();
-+ iter != node.end();
-+ ++iter)
-+ {
-+ const YAML::Node& first = get_first(iter);
-+ const YAML::Node& second = get_second(iter);
-+
-+ load(first, key);
-+
-+ if (second.Type() == YAML::NodeType::Null) continue;
-+
-+ if(key == "src")
-+ {
-+ load(second, stringval);
-+ t->setSrc(stringval.c_str());
-+ }
-+ else if(key == "dst")
-+ {
-+ load(second, stringval);
-+ t->setDst(stringval.c_str());
-+ }
-+ else if(key == "direction")
-+ {
-+ TransformDirection val;
-+ load(second, val);
-+ t->setDirection(val);
-+ }
-+ else
-+ {
-+ LogUnknownKeyWarning(node.Tag(), first);
-+ }
-+ }
- }
-
-- std::vector<float> offset(4, 0.0);
-- t->getOffset(&offset[0]);
-- if(!IsVecEqualToZero(&offset[0],4))
-+ inline void save(YAML::Emitter& out, ConstColorSpaceTransformRcPtr t)
- {
-- out << YAML::Key << "offset";
-- out << YAML::Value << YAML::Flow << offset;
-+ out << YAML::VerbatimTag("ColorSpaceTransform");
-+ out << YAML::Flow << YAML::BeginMap;
-+ out << YAML::Key << "src" << YAML::Value << t->getSrc();
-+ out << YAML::Key << "dst" << YAML::Value << t->getDst();
-+ EmitBaseTransformKeyValues(out, t);
-+ out << YAML::EndMap;
- }
-
-- EmitBaseTransformKeyValues(out, t);
-- out << YAML::EndMap;
-- return out;
-- }
--
-- void operator >> (const YAML::Node& node, CDLTransformRcPtr& t)
-- {
-- t = CDLTransform::Create();
-+ // ExponentTransform
-
-- std::string key;
-- std::vector<float> floatvecval;
--
-- for (YAML::Iterator iter = node.begin();
-- iter != node.end();
-- ++iter)
-+ inline void load(const YAML::Node& node, ExponentTransformRcPtr& t)
- {
-- iter.first() >> key;
-+ t = ExponentTransform::Create();
-
-- if(key == "slope")
-- {
-- if (iter.second().Type() != YAML::NodeType::Null)
-+ std::string key;
-+
-+ for (Iterator iter = node.begin();
-+ iter != node.end();
-+ ++iter)
-+ {
-+ const YAML::Node& first = get_first(iter);
-+ const YAML::Node& second = get_second(iter);
-+
-+ load(first, key);
-+
-+ if (second.Type() == YAML::NodeType::Null) continue;
-+
-+ if(key == "value")
- {
-- iter.second() >> floatvecval;
-- if(floatvecval.size() != 3)
-+ std::vector<float> val;
-+ load(second, val);
-+ if(val.size() != 4)
- {
- std::ostringstream os;
-- os << "CDLTransform parse error, 'slope' field must be 3 ";
-- os << "floats. Found '" << floatvecval.size() << "'.";
-+ os << "ExponentTransform parse error, value field must be 4 ";
-+ os << "floats. Found '" << val.size() << "'.";
- throw Exception(os.str().c_str());
- }
-- t->setSlope(&floatvecval[0]);
-+ t->setValue(&val[0]);
-+ }
-+ else if(key == "direction")
-+ {
-+ TransformDirection val;
-+ load(second, val);
-+ t->setDirection(val);
-+ }
-+ else
-+ {
-+ LogUnknownKeyWarning(node.Tag(), first);
- }
- }
-- else if(key == "offset")
-- {
-- if (iter.second().Type() != YAML::NodeType::Null)
-+ }
-+
-+ inline void save(YAML::Emitter& out, ConstExponentTransformRcPtr t)
-+ {
-+ out << YAML::VerbatimTag("ExponentTransform");
-+ out << YAML::Flow << YAML::BeginMap;
-+
-+ std::vector<float> value(4, 0.0);
-+ t->getValue(&value[0]);
-+ out << YAML::Key << "value";
-+ out << YAML::Value << YAML::Flow << value;
-+ EmitBaseTransformKeyValues(out, t);
-+ out << YAML::EndMap;
-+ }
-+
-+ // FileTransform
-+
-+ inline void load(const YAML::Node& node, FileTransformRcPtr& t)
-+ {
-+ t = FileTransform::Create();
-+
-+ std::string key, stringval;
-+
-+ for (Iterator iter = node.begin();
-+ iter != node.end();
-+ ++iter)
-+ {
-+ const YAML::Node& first = get_first(iter);
-+ const YAML::Node& second = get_second(iter);
-+
-+ load(first, key);
-+
-+ if (second.Type() == YAML::NodeType::Null) continue;
-+
-+ if(key == "src")
- {
-- iter.second() >> floatvecval;
-- if(floatvecval.size() != 3)
-- {
-- std::ostringstream os;
-- os << "CDLTransform parse error, 'offset' field must be 3 ";
-- os << "floats. Found '" << floatvecval.size() << "'.";
-- throw Exception(os.str().c_str());
-- }
-- t->setOffset(&floatvecval[0]);
-+ load(second, stringval);
-+ t->setSrc(stringval.c_str());
-+ }
-+ else if(key == "cccid")
-+ {
-+ load(second, stringval);
-+ t->setCCCId(stringval.c_str());
-+ }
-+ else if(key == "interpolation")
-+ {
-+ Interpolation val;
-+ load(second, val);
-+ t->setInterpolation(val);
-+ }
-+ else if(key == "direction")
-+ {
-+ TransformDirection val;
-+ load(second, val);
-+ t->setDirection(val);
-+ }
-+ else
-+ {
-+ LogUnknownKeyWarning(node.Tag(), first);
- }
- }
-- else if(key == "power")
-+ }
-+
-+ inline void save(YAML::Emitter& out, ConstFileTransformRcPtr t)
-+ {
-+ out << YAML::VerbatimTag("FileTransform");
-+ out << YAML::Flow << YAML::BeginMap;
-+ out << YAML::Key << "src" << YAML::Value << t->getSrc();
-+ const char * cccid = t->getCCCId();
-+ if(cccid && *cccid)
- {
-- if (iter.second().Type() != YAML::NodeType::Null)
-+ out << YAML::Key << "cccid" << YAML::Value << t->getCCCId();
-+ }
-+ out << YAML::Key << "interpolation";
-+ out << YAML::Value;
-+ save(out, t->getInterpolation());
-+
-+ EmitBaseTransformKeyValues(out, t);
-+ out << YAML::EndMap;
-+ }
-+
-+ // GroupTransform
-+
-+ void load(const YAML::Node& node, TransformRcPtr& t);
-+ void save(YAML::Emitter& out, ConstTransformRcPtr t);
-+
-+ inline void load(const YAML::Node& node, GroupTransformRcPtr& t)
-+ {
-+ t = GroupTransform::Create();
-+
-+ std::string key;
-+
-+ for (Iterator iter = node.begin();
-+ iter != node.end();
-+ ++iter)
-+ {
-+ const YAML::Node& first = get_first(iter);
-+ const YAML::Node& second = get_second(iter);
-+
-+ load(first, key);
-+
-+ if (second.Type() == YAML::NodeType::Null) continue;
-+
-+ if(key == "children")
- {
-- iter.second() >> floatvecval;
-- if(floatvecval.size() != 3)
-+ for(unsigned i = 0; i < second.size(); ++i)
- {
-- std::ostringstream os;
-- os << "CDLTransform parse error, 'power' field must be 3 ";
-- os << "floats. Found '" << floatvecval.size() << "'.";
-- throw Exception(os.str().c_str());
-+ TransformRcPtr childTransform;
-+ load(second[i], childTransform);
-+
-+ // TODO: consider the forwards-compatibility implication of
-+ // throwing an exception. Should this be a warning, instead?
-+ if(!childTransform)
-+ {
-+ throw Exception("Child transform could not be parsed.");
-+ }
-+
-+ t->push_back(childTransform);
- }
-- t->setPower(&floatvecval[0]);
-+ }
-+ else if(key == "direction")
-+ {
-+ TransformDirection val;
-+ load(second, val);
-+ t->setDirection(val);
-+ }
-+ else
-+ {
-+ LogUnknownKeyWarning(node.Tag(), first);
- }
- }
-- else if(key == "saturation" || key == "sat")
-- {
-- float val = 0.0f;
-- if (iter.second().Type() != YAML::NodeType::Null &&
-- iter.second().Read<float>(val))
-- t->setSat(val);
-- }
-- else if(key == "direction")
-- {
-- TransformDirection val;
-- if (iter.second().Type() != YAML::NodeType::Null &&
-- iter.second().Read<TransformDirection>(val))
-- t->setDirection(val);
-- }
-- else
-+ }
-+
-+ inline void save(YAML::Emitter& out, ConstGroupTransformRcPtr t)
-+ {
-+ out << YAML::VerbatimTag("GroupTransform");
-+ out << YAML::BeginMap;
-+ EmitBaseTransformKeyValues(out, t);
-+
-+ out << YAML::Key << "children";
-+ out << YAML::Value;
-+
-+ out << YAML::BeginSeq;
-+ for(int i = 0; i < t->size(); ++i)
- {
-- LogUnknownKeyWarning(node.Tag(), iter.first());
-+ save(out, t->getTransform(i));
- }
-+ out << YAML::EndSeq;
-+
-+ out << YAML::EndMap;
- }
-- }
--
-- YAML::Emitter& operator << (YAML::Emitter& out, ConstCDLTransformRcPtr t)
-- {
-- out << YAML::VerbatimTag("CDLTransform");
-- out << YAML::Flow << YAML::BeginMap;
-
-- std::vector<float> slope(3);
-- t->getSlope(&slope[0]);
-- if(!IsVecEqualToOne(&slope[0], 3))
-+ // LogTransform
-+
-+ inline void load(const YAML::Node& node, LogTransformRcPtr& t)
- {
-- out << YAML::Key << "slope";
-- out << YAML::Value << YAML::Flow << slope;
-+ t = LogTransform::Create();
-+
-+ std::string key;
-+
-+ for (Iterator iter = node.begin();
-+ iter != node.end();
-+ ++iter)
-+ {
-+ const YAML::Node& first = get_first(iter);
-+ const YAML::Node& second = get_second(iter);
-+
-+ load(first, key);
-+
-+ if (second.Type() == YAML::NodeType::Null) continue;
-+
-+ if(key == "base")
-+ {
-+ float val = 0.0f;
-+ load(second, val);
-+ t->setBase(val);
-+ }
-+ else if(key == "direction")
-+ {
-+ TransformDirection val;
-+ load(second, val);
-+ t->setDirection(val);
-+ }
-+ else
-+ {
-+ LogUnknownKeyWarning(node.Tag(), first);
-+ }
-+ }
- }
-
-- std::vector<float> offset(3);
-- t->getOffset(&offset[0]);
-- if(!IsVecEqualToZero(&offset[0], 3))
-+ inline void save(YAML::Emitter& out, ConstLogTransformRcPtr t)
- {
-- out << YAML::Key << "offset";
-- out << YAML::Value << YAML::Flow << offset;
-+ out << YAML::VerbatimTag("LogTransform");
-+ out << YAML::Flow << YAML::BeginMap;
-+ out << YAML::Key << "base" << YAML::Value << t->getBase();
-+ EmitBaseTransformKeyValues(out, t);
-+ out << YAML::EndMap;
- }
-
-- std::vector<float> power(3);
-- t->getPower(&power[0]);
-- if(!IsVecEqualToOne(&power[0], 3))
-+ // LookTransform
-+
-+ inline void load(const YAML::Node& node, LookTransformRcPtr& t)
- {
-- out << YAML::Key << "power";
-- out << YAML::Value << YAML::Flow << power;
-+ t = LookTransform::Create();
-+
-+ std::string key, stringval;
-+
-+ for (Iterator iter = node.begin();
-+ iter != node.end();
-+ ++iter)
-+ {
-+ const YAML::Node& first = get_first(iter);
-+ const YAML::Node& second = get_second(iter);
-+
-+ load(first, key);
-+
-+ if (second.Type() == YAML::NodeType::Null) continue;
-+
-+ if(key == "src")
-+ {
-+ load(second, stringval);
-+ t->setSrc(stringval.c_str());
-+ }
-+ else if(key == "dst")
-+ {
-+ load(second, stringval);
-+ t->setDst(stringval.c_str());
-+ }
-+ else if(key == "looks")
-+ {
-+ load(second, stringval);
-+ t->setLooks(stringval.c_str());
-+ }
-+ else if(key == "direction")
-+ {
-+ TransformDirection val;
-+ load(second, val);
-+ t->setDirection(val);
-+ }
-+ else
-+ {
-+ LogUnknownKeyWarning(node.Tag(), first);
-+ }
-+ }
- }
-
-- if(!IsScalarEqualToOne(t->getSat()))
-+ inline void save(YAML::Emitter& out, ConstLookTransformRcPtr t)
- {
-- out << YAML::Key << "sat" << YAML::Value << t->getSat();
-+ out << YAML::VerbatimTag("LookTransform");
-+ out << YAML::Flow << YAML::BeginMap;
-+ out << YAML::Key << "src" << YAML::Value << t->getSrc();
-+ out << YAML::Key << "dst" << YAML::Value << t->getDst();
-+ out << YAML::Key << "looks" << YAML::Value << t->getLooks();
-+ EmitBaseTransformKeyValues(out, t);
-+ out << YAML::EndMap;
- }
-
-- EmitBaseTransformKeyValues(out, t);
-- out << YAML::EndMap;
-- return out;
-- }
--
-- void operator >> (const YAML::Node& node, AllocationTransformRcPtr& t)
-- {
-- t = AllocationTransform::Create();
--
-- std::string key;
-+ // MatrixTransform
-
-- for (YAML::Iterator iter = node.begin();
-- iter != node.end();
-- ++iter)
-+ inline void load(const YAML::Node& node, MatrixTransformRcPtr& t)
- {
-- iter.first() >> key;
-+ t = MatrixTransform::Create();
-
-- if(key == "allocation")
-- {
-- Allocation val;
-- if (iter.second().Type() != YAML::NodeType::Null &&
-- iter.second().Read<Allocation>(val))
-- t->setAllocation(val);
-- }
-- else if(key == "vars")
-- {
-- std::vector<float> val;
-- if (iter.second().Type() != YAML::NodeType::Null)
-+ std::string key;
-+
-+ for (Iterator iter = node.begin();
-+ iter != node.end();
-+ ++iter)
-+ {
-+ const YAML::Node& first = get_first(iter);
-+ const YAML::Node& second = get_second(iter);
-+
-+ load(first, key);
-+
-+ if (second.Type() == YAML::NodeType::Null) continue;
-+
-+ if(key == "matrix")
- {
-- iter.second() >> val;
-- if(!val.empty())
-+ std::vector<float> val;
-+ load(second, val);
-+ if(val.size() != 16)
- {
-- t->setVars(static_cast<int>(val.size()), &val[0]);
-+ std::ostringstream os;
-+ os << "MatrixTransform parse error, matrix field must be 16 ";
-+ os << "floats. Found '" << val.size() << "'.";
-+ throw Exception(os.str().c_str());
-+ }
-+ t->setMatrix(&val[0]);
-+ }
-+ else if(key == "offset")
-+ {
-+ std::vector<float> val;
-+ load(second, val);
-+ if(val.size() != 4)
-+ {
-+ std::ostringstream os;
-+ os << "MatrixTransform parse error, offset field must be 4 ";
-+ os << "floats. Found '" << val.size() << "'.";
-+ throw Exception(os.str().c_str());
- }
-+ t->setOffset(&val[0]);
-+ }
-+ else if(key == "direction")
-+ {
-+ TransformDirection val;
-+ load(second, val);
-+ t->setDirection(val);
-+ }
-+ else
-+ {
-+ LogUnknownKeyWarning(node.Tag(), first);
- }
- }
-- else if(key == "direction")
-+ }
-+
-+ inline void save(YAML::Emitter& out, ConstMatrixTransformRcPtr t)
-+ {
-+ out << YAML::VerbatimTag("MatrixTransform");
-+ out << YAML::Flow << YAML::BeginMap;
-+
-+ std::vector<float> matrix(16, 0.0);
-+ t->getMatrix(&matrix[0]);
-+ if(!IsM44Identity(&matrix[0]))
- {
-- TransformDirection val;
-- if (iter.second().Type() != YAML::NodeType::Null &&
-- iter.second().Read<TransformDirection>(val))
-- t->setDirection(val);
-+ out << YAML::Key << "matrix";
-+ out << YAML::Value << YAML::Flow << matrix;
- }
-- else
-+
-+ std::vector<float> offset(4, 0.0);
-+ t->getOffset(&offset[0]);
-+ if(!IsVecEqualToZero(&offset[0],4))
- {
-- LogUnknownKeyWarning(node.Tag(), iter.first());
-+ out << YAML::Key << "offset";
-+ out << YAML::Value << YAML::Flow << offset;
- }
-+
-+ EmitBaseTransformKeyValues(out, t);
-+ out << YAML::EndMap;
- }
-- }
--
-- YAML::Emitter& operator << (YAML::Emitter& out, ConstAllocationTransformRcPtr t)
-- {
-- out << YAML::VerbatimTag("AllocationTransform");
-- out << YAML::Flow << YAML::BeginMap;
-
-- out << YAML::Key << "allocation";
-- out << YAML::Value << YAML::Flow << t->getAllocation();
-+ // TruelightTransform
-
-- if(t->getNumVars() > 0)
-+ inline void load(const YAML::Node& node, TruelightTransformRcPtr& t)
- {
-- std::vector<float> vars(t->getNumVars());
-- t->getVars(&vars[0]);
-- out << YAML::Key << "vars";
-- out << YAML::Flow << YAML::Value << vars;
-+ t = TruelightTransform::Create();
-+
-+ std::string key, stringval;
-+
-+ for (Iterator iter = node.begin();
-+ iter != node.end();
-+ ++iter)
-+ {
-+ const YAML::Node& first = get_first(iter);
-+ const YAML::Node& second = get_second(iter);
-+
-+ load(first, key);
-+
-+ if (second.Type() == YAML::NodeType::Null) continue;
-+
-+ if(key == "config_root")
-+ {
-+ load(second, stringval);
-+ t->setConfigRoot(stringval.c_str());
-+ }
-+ else if(key == "profile")
-+ {
-+ load(second, stringval);
-+ t->setProfile(stringval.c_str());
-+ }
-+ else if(key == "camera")
-+ {
-+ load(second, stringval);
-+ t->setCamera(stringval.c_str());
-+ }
-+ else if(key == "input_display")
-+ {
-+ load(second, stringval);
-+ t->setInputDisplay(stringval.c_str());
-+ }
-+ else if(key == "recorder")
-+ {
-+ load(second, stringval);
-+ t->setRecorder(stringval.c_str());
-+ }
-+ else if(key == "print")
-+ {
-+ load(second, stringval);
-+ t->setPrint(stringval.c_str());
-+ }
-+ else if(key == "lamp")
-+ {
-+ load(second, stringval);
-+ t->setLamp(stringval.c_str());
-+ }
-+ else if(key == "output_camera")
-+ {
-+ load(second, stringval);
-+ t->setOutputCamera(stringval.c_str());
-+ }
-+ else if(key == "display")
-+ {
-+ load(second, stringval);
-+ t->setDisplay(stringval.c_str());
-+ }
-+ else if(key == "cube_input")
-+ {
-+ load(second, stringval);
-+ t->setCubeInput(stringval.c_str());
-+ }
-+ else if(key == "direction")
-+ {
-+ TransformDirection val;
-+ load(second, val);
-+ t->setDirection(val);
-+ }
-+ else
-+ {
-+ LogUnknownKeyWarning(node.Tag(), first);
-+ }
-+ }
- }
-
-- EmitBaseTransformKeyValues(out, t);
-- out << YAML::EndMap;
-- return out;
-- }
--
-- void operator >> (const YAML::Node& node, TruelightTransformRcPtr& t)
-- {
-- t = TruelightTransform::Create();
--
-- std::string key, stringval;
--
-- for (YAML::Iterator iter = node.begin();
-- iter != node.end();
-- ++iter)
-+ inline void save(YAML::Emitter& out, ConstTruelightTransformRcPtr t)
- {
-- iter.first() >> key;
-
-- if(key == "config_root")
-+ out << YAML::VerbatimTag("TruelightTransform");
-+ out << YAML::Flow << YAML::BeginMap;
-+ if(strcmp(t->getConfigRoot(), "") != 0)
- {
-- if (iter.second().Type() != YAML::NodeType::Null &&
-- iter.second().Read<std::string>(stringval))
-- t->setConfigRoot(stringval.c_str());
-+ out << YAML::Key << "config_root";
-+ out << YAML::Value << YAML::Flow << t->getConfigRoot();
- }
-- else if(key == "profile")
-+ if(strcmp(t->getProfile(), "") != 0)
- {
-- if (iter.second().Type() != YAML::NodeType::Null &&
-- iter.second().Read<std::string>(stringval))
-- t->setProfile(stringval.c_str());
-+ out << YAML::Key << "profile";
-+ out << YAML::Value << YAML::Flow << t->getProfile();
- }
-- else if(key == "camera")
-+ if(strcmp(t->getCamera(), "") != 0)
- {
-- if (iter.second().Type() != YAML::NodeType::Null &&
-- iter.second().Read<std::string>(stringval))
-- t->setCamera(stringval.c_str());
-+ out << YAML::Key << "camera";
-+ out << YAML::Value << YAML::Flow << t->getCamera();
- }
-- else if(key == "input_display")
-+ if(strcmp(t->getInputDisplay(), "") != 0)
- {
-- if (iter.second().Type() != YAML::NodeType::Null &&
-- iter.second().Read<std::string>(stringval))
-- t->setInputDisplay(stringval.c_str());
-+ out << YAML::Key << "input_display";
-+ out << YAML::Value << YAML::Flow << t->getInputDisplay();
- }
-- else if(key == "recorder")
-+ if(strcmp(t->getRecorder(), "") != 0)
- {
-- if (iter.second().Type() != YAML::NodeType::Null &&
-- iter.second().Read<std::string>(stringval))
-- t->setRecorder(stringval.c_str());
-+ out << YAML::Key << "recorder";
-+ out << YAML::Value << YAML::Flow << t->getRecorder();
- }
-- else if(key == "print")
-+ if(strcmp(t->getPrint(), "") != 0)
- {
-- if (iter.second().Type() != YAML::NodeType::Null &&
-- iter.second().Read<std::string>(stringval))
-- t->setPrint(stringval.c_str());
-+ out << YAML::Key << "print";
-+ out << YAML::Value << YAML::Flow << t->getPrint();
- }
-- else if(key == "lamp")
-+ if(strcmp(t->getLamp(), "") != 0)
- {
-- if (iter.second().Type() != YAML::NodeType::Null &&
-- iter.second().Read<std::string>(stringval))
-- t->setLamp(stringval.c_str());
-+ out << YAML::Key << "lamp";
-+ out << YAML::Value << YAML::Flow << t->getLamp();
- }
-- else if(key == "output_camera")
-+ if(strcmp(t->getOutputCamera(), "") != 0)
- {
-- if (iter.second().Type() != YAML::NodeType::Null &&
-- iter.second().Read<std::string>(stringval))
-- t->setOutputCamera(stringval.c_str());
-+ out << YAML::Key << "output_camera";
-+ out << YAML::Value << YAML::Flow << t->getOutputCamera();
- }
-- else if(key == "display")
-+ if(strcmp(t->getDisplay(), "") != 0)
- {
-- if (iter.second().Type() != YAML::NodeType::Null &&
-- iter.second().Read<std::string>(stringval))
-- t->setDisplay(stringval.c_str());
-+ out << YAML::Key << "display";
-+ out << YAML::Value << YAML::Flow << t->getDisplay();
- }
-- else if(key == "cube_input")
-+ if(strcmp(t->getCubeInput(), "") != 0)
- {
-- if (iter.second().Type() != YAML::NodeType::Null &&
-- iter.second().Read<std::string>(stringval))
-- t->setCubeInput(stringval.c_str());
-+ out << YAML::Key << "cube_input";
-+ out << YAML::Value << YAML::Flow << t->getCubeInput();
- }
-- else if(key == "direction")
-+
-+ EmitBaseTransformKeyValues(out, t);
-+
-+ out << YAML::EndMap;
-+ }
-+
-+ // Transform
-+
-+ void load(const YAML::Node& node, TransformRcPtr& t)
-+ {
-+ if(node.Type() != YAML::NodeType::Map)
- {
-- TransformDirection val;
-- if (iter.second().Type() != YAML::NodeType::Null &&
-- iter.second().Read<TransformDirection>(val))
-- t->setDirection(val);
-+ std::ostringstream os;
-+ os << "Unsupported Transform type encountered: (" << node.Type() << ") in OCIO profile. ";
-+ os << "Only Mapping types supported.";
-+ throw Exception(os.str().c_str());
-+ }
-+
-+ std::string type = node.Tag();
-+
-+ if(type == "AllocationTransform") {
-+ AllocationTransformRcPtr temp;
-+ load(node, temp);
-+ t = temp;
-+ }
-+ else if(type == "CDLTransform") {
-+ CDLTransformRcPtr temp;
-+ load(node, temp);
-+ t = temp;
-+ }
-+ else if(type == "ColorSpaceTransform") {
-+ ColorSpaceTransformRcPtr temp;
-+ load(node, temp);
-+ t = temp;
-+ }
-+ // TODO: DisplayTransform
-+ else if(type == "ExponentTransform") {
-+ ExponentTransformRcPtr temp;
-+ load(node, temp);
-+ t = temp;
-+ }
-+ else if(type == "FileTransform") {
-+ FileTransformRcPtr temp;
-+ load(node, temp);
-+ t = temp;
-+ }
-+ else if(type == "GroupTransform") {
-+ GroupTransformRcPtr temp;
-+ load(node, temp);
-+ t = temp;
-+ }
-+ else if(type == "LogTransform") {
-+ LogTransformRcPtr temp;
-+ load(node, temp);
-+ t = temp;
-+ }
-+ else if(type == "LookTransform") {
-+ LookTransformRcPtr temp;
-+ load(node, temp);
-+ t = temp;
-+ }
-+ else if(type == "MatrixTransform") {
-+ MatrixTransformRcPtr temp;
-+ load(node, temp);
-+ t = temp;
-+ }
-+ else if(type == "TruelightTransform") {
-+ TruelightTransformRcPtr temp;
-+ load(node, temp);
-+ t = temp;
- }
- else
- {
-- LogUnknownKeyWarning(node.Tag(), iter.first());
-+ // TODO: add a new empty (better name?) aka passthru Transform()
-+ // which does nothing. This is so upsupported !<tag> types don't
-+ // throw an exception. Alternativly this could be caught in the
-+ // GroupTransformRcPtr >> operator with some type of
-+ // supported_tag() method
-+
-+ // TODO: consider the forwards-compatibility implication of
-+ // throwing an exception. Should this be a warning, instead?
-+
-+ // t = EmptyTransformRcPtr(new EmptyTransform(), &deleter);
-+ std::ostringstream os;
-+ os << "Unsupported transform type !<" << type << "> in OCIO profile. ";
-+ throw Exception(os.str().c_str());
- }
- }
-- }
--
-- YAML::Emitter& operator << (YAML::Emitter& out, ConstTruelightTransformRcPtr t)
-- {
-
-- out << YAML::VerbatimTag("TruelightTransform");
-- out << YAML::Flow << YAML::BeginMap;
-- if(strcmp(t->getConfigRoot(), "") != 0)
-- {
-- out << YAML::Key << "config_root";
-- out << YAML::Value << YAML::Flow << t->getConfigRoot();
-- }
-- if(strcmp(t->getProfile(), "") != 0)
-+ void save(YAML::Emitter& out, ConstTransformRcPtr t)
- {
-- out << YAML::Key << "profile";
-- out << YAML::Value << YAML::Flow << t->getProfile();
-- }
-- if(strcmp(t->getCamera(), "") != 0)
-- {
-- out << YAML::Key << "camera";
-- out << YAML::Value << YAML::Flow << t->getCamera();
-- }
-- if(strcmp(t->getInputDisplay(), "") != 0)
-- {
-- out << YAML::Key << "input_display";
-- out << YAML::Value << YAML::Flow << t->getInputDisplay();
-+ if(ConstAllocationTransformRcPtr Allocation_tran = \
-+ DynamicPtrCast<const AllocationTransform>(t))
-+ save(out, Allocation_tran);
-+ else if(ConstCDLTransformRcPtr CDL_tran = \
-+ DynamicPtrCast<const CDLTransform>(t))
-+ save(out, CDL_tran);
-+ else if(ConstColorSpaceTransformRcPtr ColorSpace_tran = \
-+ DynamicPtrCast<const ColorSpaceTransform>(t))
-+ save(out, ColorSpace_tran);
-+ else if(ConstExponentTransformRcPtr Exponent_tran = \
-+ DynamicPtrCast<const ExponentTransform>(t))
-+ save(out, Exponent_tran);
-+ else if(ConstFileTransformRcPtr File_tran = \
-+ DynamicPtrCast<const FileTransform>(t))
-+ save(out, File_tran);
-+ else if(ConstGroupTransformRcPtr Group_tran = \
-+ DynamicPtrCast<const GroupTransform>(t))
-+ save(out, Group_tran);
-+ else if(ConstLogTransformRcPtr Log_tran = \
-+ DynamicPtrCast<const LogTransform>(t))
-+ save(out, Log_tran);
-+ else if(ConstLookTransformRcPtr Look_tran = \
-+ DynamicPtrCast<const LookTransform>(t))
-+ save(out, Look_tran);
-+ else if(ConstMatrixTransformRcPtr Matrix_tran = \
-+ DynamicPtrCast<const MatrixTransform>(t))
-+ save(out, Matrix_tran);
-+ else if(ConstTruelightTransformRcPtr Truelight_tran = \
-+ DynamicPtrCast<const TruelightTransform>(t))
-+ save(out, Truelight_tran);
-+ else
-+ throw Exception("Unsupported Transform() type for serialization.");
- }
-- if(strcmp(t->getRecorder(), "") != 0)
-+
-+ // ColorSpace
-+
-+ inline void load(const YAML::Node& node, ColorSpaceRcPtr& cs)
- {
-- out << YAML::Key << "recorder";
-- out << YAML::Value << YAML::Flow << t->getRecorder();
-+ if(node.Tag() != "ColorSpace")
-+ return; // not a !<ColorSpace> tag
-+
-+ std::string key, stringval;
-+ bool boolval;
-+
-+ for (Iterator iter = node.begin();
-+ iter != node.end();
-+ ++iter)
-+ {
-+ const YAML::Node& first = get_first(iter);
-+ const YAML::Node& second = get_second(iter);
-+
-+ load(first, key);
-+
-+ if (second.Type() == YAML::NodeType::Null) continue;
-+
-+ if(key == "name")
-+ {
-+ load(second, stringval);
-+ cs->setName(stringval.c_str());
-+ }
-+ else if(key == "description")
-+ {
-+ load(second, stringval);
-+ cs->setDescription(stringval.c_str());
-+ }
-+ else if(key == "family")
-+ {
-+ load(second, stringval);
-+ cs->setFamily(stringval.c_str());
-+ }
-+ else if(key == "equalitygroup")
-+ {
-+ load(second, stringval);
-+ cs->setEqualityGroup(stringval.c_str());
-+ }
-+ else if(key == "bitdepth")
-+ {
-+ BitDepth ret;
-+ load(second, ret);
-+ cs->setBitDepth(ret);
-+ }
-+ else if(key == "isdata")
-+ {
-+ load(second, boolval);
-+ cs->setIsData(boolval);
-+ }
-+ else if(key == "allocation")
-+ {
-+ Allocation val;
-+ load(second, val);
-+ cs->setAllocation(val);
-+ }
-+ else if(key == "allocationvars")
-+ {
-+ std::vector<float> val;
-+ load(second, val);
-+ if(!val.empty())
-+ cs->setAllocationVars(static_cast<int>(val.size()), &val[0]);
-+ }
-+ else if(key == "to_reference")
-+ {
-+ TransformRcPtr val;
-+ load(second, val);
-+ cs->setTransform(val, COLORSPACE_DIR_TO_REFERENCE);
-+ }
-+ else if(key == "from_reference")
-+ {
-+ TransformRcPtr val;
-+ load(second, val);
-+ cs->setTransform(val, COLORSPACE_DIR_FROM_REFERENCE);
-+ }
-+ else
-+ {
-+ LogUnknownKeyWarning(node.Tag(), first);
-+ }
-+ }
- }
-- if(strcmp(t->getPrint(), "") != 0)
-+
-+ inline void save(YAML::Emitter& out, ConstColorSpaceRcPtr cs)
- {
-- out << YAML::Key << "print";
-- out << YAML::Value << YAML::Flow << t->getPrint();
-+ out << YAML::VerbatimTag("ColorSpace");
-+ out << YAML::BeginMap;
-+
-+ out << YAML::Key << "name" << YAML::Value << cs->getName();
-+ out << YAML::Key << "family" << YAML::Value << cs->getFamily();
-+ out << YAML::Key << "equalitygroup" << YAML::Value << cs->getEqualityGroup();
-+ out << YAML::Key << "bitdepth" << YAML::Value;
-+ save(out, cs->getBitDepth());
-+ if(cs->getDescription() != NULL && strlen(cs->getDescription()) > 0)
-+ {
-+ out << YAML::Key << "description";
-+ out << YAML::Value << YAML::Literal << cs->getDescription();
-+ }
-+ out << YAML::Key << "isdata" << YAML::Value << cs->isData();
-+
-+ out << YAML::Key << "allocation" << YAML::Value;
-+ save(out, cs->getAllocation());
-+ if(cs->getAllocationNumVars() > 0)
-+ {
-+ std::vector<float> allocationvars(cs->getAllocationNumVars());
-+ cs->getAllocationVars(&allocationvars[0]);
-+ out << YAML::Key << "allocationvars";
-+ out << YAML::Flow << YAML::Value << allocationvars;
-+ }
-+
-+ ConstTransformRcPtr toref = \
-+ cs->getTransform(COLORSPACE_DIR_TO_REFERENCE);
-+ if(toref)
-+ {
-+ out << YAML::Key << "to_reference" << YAML::Value;
-+ save(out, toref);
-+ }
-+
-+ ConstTransformRcPtr fromref = \
-+ cs->getTransform(COLORSPACE_DIR_FROM_REFERENCE);
-+ if(fromref)
-+ {
-+ out << YAML::Key << "from_reference" << YAML::Value;
-+ save(out, fromref);
-+ }
-+
-+ out << YAML::EndMap;
-+ out << YAML::Newline;
- }
-- if(strcmp(t->getLamp(), "") != 0)
-+
-+ // Look
-+
-+ inline void load(const YAML::Node& node, LookRcPtr& look)
- {
-- out << YAML::Key << "lamp";
-- out << YAML::Value << YAML::Flow << t->getLamp();
-+ if(node.Tag() != "Look")
-+ return;
-+
-+ std::string key, stringval;
-+
-+ for (Iterator iter = node.begin();
-+ iter != node.end();
-+ ++iter)
-+ {
-+ const YAML::Node& first = get_first(iter);
-+ const YAML::Node& second = get_second(iter);
-+
-+ load(first, key);
-+
-+ if (second.Type() == YAML::NodeType::Null) continue;
-+
-+ if(key == "name")
-+ {
-+ load(second, stringval);
-+ look->setName(stringval.c_str());
-+ }
-+ else if(key == "process_space")
-+ {
-+ load(second, stringval);
-+ look->setProcessSpace(stringval.c_str());
-+ }
-+ else if(key == "transform")
-+ {
-+ TransformRcPtr val;
-+ load(second, val);
-+ look->setTransform(val);
-+ }
-+ else if(key == "inverse_transform")
-+ {
-+ TransformRcPtr val;
-+ load(second, val);
-+ look->setInverseTransform(val);
-+ }
-+ else
-+ {
-+ LogUnknownKeyWarning(node.Tag(), first);
-+ }
-+ }
- }
-- if(strcmp(t->getOutputCamera(), "") != 0)
-+
-+ inline void save(YAML::Emitter& out, ConstLookRcPtr look)
- {
-- out << YAML::Key << "output_camera";
-- out << YAML::Value << YAML::Flow << t->getOutputCamera();
-+ out << YAML::VerbatimTag("Look");
-+ out << YAML::BeginMap;
-+ out << YAML::Key << "name" << YAML::Value << look->getName();
-+ out << YAML::Key << "process_space" << YAML::Value << look->getProcessSpace();
-+
-+ if(look->getTransform())
-+ {
-+ out << YAML::Key << "transform";
-+ out << YAML::Value;
-+ save(out, look->getTransform());
-+ }
-+
-+ if(look->getInverseTransform())
-+ {
-+ out << YAML::Key << "inverse_transform";
-+ out << YAML::Value;
-+ save(out, look->getInverseTransform());
-+ }
-+
-+ out << YAML::EndMap;
-+ out << YAML::Newline;
- }
-- if(strcmp(t->getDisplay(), "") != 0)
-+
-+ // Config
-+
-+ inline void load(const YAML::Node& node, ConfigRcPtr& c, const char* filename)
- {
-- out << YAML::Key << "display";
-- out << YAML::Value << YAML::Flow << t->getDisplay();
-+
-+ // check profile version
-+ int profile_version = 0;
-+#ifdef OLDYAML
-+ if(node.FindValue("ocio_profile_version") == NULL)
-+#else
-+ if(node["ocio_profile_version"] == NULL)
-+#endif
-+ {
-+ std::ostringstream os;
-+ os << "The specified file ";
-+ os << "does not appear to be an OCIO configuration.";
-+ throw Exception (os.str().c_str());
-+ }
-+
-+ load(node["ocio_profile_version"], profile_version);
-+ if(profile_version > 1)
-+ {
-+ std::ostringstream os;
-+ os << "This .ocio config ";
-+ if(filename && *filename)
-+ {
-+ os << " '" << filename << "' ";
-+ }
-+ os << "is version " << profile_version << ". ";
-+ os << "This version of the OpenColorIO library (" << OCIO_VERSION ") ";
-+ os << "is not known to be able to load this profile. ";
-+ os << "An attempt will be made, but there are no guarantees that the ";
-+ os << "results will be accurate. Continue at your own risk.";
-+ LogWarning(os.str());
-+ }
-+
-+ std::string key, stringval;
-+ bool boolval = false;
-+ EnvironmentMode mode = ENV_ENVIRONMENT_LOAD_ALL;
-+
-+ for (Iterator iter = node.begin();
-+ iter != node.end();
-+ ++iter)
-+ {
-+ const YAML::Node& first = get_first(iter);
-+ const YAML::Node& second = get_second(iter);
-+
-+ load(first, key);
-+
-+ if (second.Type() == YAML::NodeType::Null) continue;
-+
-+ if(key == "ocio_profile_version") { } // Already handled above.
-+ else if(key == "environment")
-+ {
-+ mode = ENV_ENVIRONMENT_LOAD_PREDEFINED;
-+ if(second.Type() != YAML::NodeType::Map)
-+ {
-+ std::ostringstream os;
-+ os << "'environment' field needs to be a (name: key) map.";
-+ throw Exception(os.str().c_str());
-+ }
-+ for (Iterator it = second.begin();
-+ it != second.end();
-+ ++it)
-+ {
-+ std::string k, v;
-+ load(get_first(it), k);
-+ load(get_second(it), v);
-+ c->addEnvironmentVar(k.c_str(), v.c_str());
-+ }
-+ }
-+ else if(key == "search_path" || key == "resource_path")
-+ {
-+ load(second, stringval);
-+ c->setSearchPath(stringval.c_str());
-+ }
-+ else if(key == "strictparsing")
-+ {
-+ load(second, boolval);
-+ c->setStrictParsingEnabled(boolval);
-+ }
-+ else if(key == "description")
-+ {
-+ load(second, stringval);
-+ c->setDescription(stringval.c_str());
-+ }
-+ else if(key == "luma")
-+ {
-+ std::vector<float> val;
-+ load(second, val);
-+ if(val.size() != 3)
-+ {
-+ std::ostringstream os;
-+ os << "'luma' field must be 3 ";
-+ os << "floats. Found '" << val.size() << "'.";
-+ throw Exception(os.str().c_str());
-+ }
-+ c->setDefaultLumaCoefs(&val[0]);
-+ }
-+ else if(key == "roles")
-+ {
-+ if(second.Type() != YAML::NodeType::Map)
-+ {
-+ std::ostringstream os;
-+ os << "'roles' field needs to be a (name: key) map.";
-+ throw Exception(os.str().c_str());
-+ }
-+ for (Iterator it = second.begin();
-+ it != second.end();
-+ ++it)
-+ {
-+ std::string k, v;
-+ load(get_first(it), k);
-+ load(get_second(it), v);
-+ c->setRole(k.c_str(), v.c_str());
-+ }
-+ }
-+ else if(key == "displays")
-+ {
-+ if(second.Type() != YAML::NodeType::Map)
-+ {
-+ std::ostringstream os;
-+ os << "'displays' field needs to be a (name: key) map.";
-+ throw Exception(os.str().c_str());
-+ }
-+ for (Iterator it = second.begin();
-+ it != second.end();
-+ ++it)
-+ {
-+ std::string display;
-+ load(get_first(it), display);
-+ const YAML::Node& dsecond = get_second(it);
-+ for(unsigned i = 0; i < dsecond.size(); ++i)
-+ {
-+ View view;
-+ load(dsecond[i], view);
-+ c->addDisplay(display.c_str(), view.name.c_str(),
-+ view.colorspace.c_str(), view.looks.c_str());
-+ }
-+ }
-+ }
-+ else if(key == "active_displays")
-+ {
-+ std::vector<std::string> display;
-+ load(second, display);
-+ const char* displays = JoinStringEnvStyle(display).c_str();
-+ c->setActiveDisplays(displays);
-+ }
-+ else if(key == "active_views")
-+ {
-+ std::vector<std::string> view;
-+ load(second, view);
-+ const char* views = JoinStringEnvStyle(view).c_str();
-+ c->setActiveViews(views);
-+ }
-+ else if(key == "colorspaces")
-+ {
-+ if(second.Type() != YAML::NodeType::Sequence)
-+ {
-+ std::ostringstream os;
-+ os << "'colorspaces' field needs to be a (- !<ColorSpace>) list.";
-+ throw Exception(os.str().c_str());
-+ }
-+ for(unsigned i = 0; i < second.size(); ++i)
-+ {
-+ if(second[i].Tag() == "ColorSpace")
-+ {
-+ ColorSpaceRcPtr cs = ColorSpace::Create();
-+ load(second[i], cs);
-+ for(int ii = 0; ii < c->getNumColorSpaces(); ++ii)
-+ {
-+ if(strcmp(c->getColorSpaceNameByIndex(ii), cs->getName()) == 0)
-+ {
-+ std::ostringstream os;
-+ os << "Colorspace with name '" << cs->getName() << "' already defined.";
-+ throw Exception(os.str().c_str());
-+ }
-+ }
-+ c->addColorSpace(cs);
-+ }
-+ else
-+ {
-+ std::ostringstream os;
-+ os << "Unknown element found in colorspaces:";
-+ os << second[i].Tag() << ". Only ColorSpace(s)";
-+ os << " currently handled.";
-+ LogWarning(os.str());
-+ }
-+ }
-+ }
-+ else if(key == "looks")
-+ {
-+ if(second.Type() != YAML::NodeType::Sequence)
-+ {
-+ std::ostringstream os;
-+ os << "'looks' field needs to be a (- !<Look>) list.";
-+ throw Exception(os.str().c_str());
-+ }
-+
-+ for(unsigned i = 0; i < second.size(); ++i)
-+ {
-+ if(second[i].Tag() == "Look")
-+ {
-+ LookRcPtr look = Look::Create();
-+ load(second[i], look);
-+ c->addLook(look);
-+ }
-+ else
-+ {
-+ std::ostringstream os;
-+ os << "Unknown element found in looks:";
-+ os << second[i].Tag() << ". Only Look(s)";
-+ os << " currently handled.";
-+ LogWarning(os.str());
-+ }
-+ }
-+ }
-+ else
-+ {
-+ LogUnknownKeyWarning("profile", first);
-+ }
-+ }
-+
-+ if(filename)
-+ {
-+ std::string realfilename = pystring::os::path::abspath(filename);
-+ std::string configrootdir = pystring::os::path::dirname(realfilename);
-+ c->setWorkingDir(configrootdir.c_str());
-+ }
-+
-+ c->setEnvironmentMode(mode);
-+ c->loadEnvironment();
-+
-+ if(mode == ENV_ENVIRONMENT_LOAD_ALL)
-+ {
-+ std::ostringstream os;
-+ os << "This .ocio config ";
-+ if(filename && *filename)
-+ {
-+ os << " '" << filename << "' ";
-+ }
-+ os << "has no environment section defined. The default behaviour is to ";
-+ os << "load all environment variables (" << c->getNumEnvironmentVars() << ")";
-+ os << ", which reduces the efficiency of OCIO's caching. Considering ";
-+ os << "predefining the environment variables used.";
-+ LogDebug(os.str());
-+ }
-+
- }
-- if(strcmp(t->getCubeInput(), "") != 0)
-+
-+ inline void save(YAML::Emitter& out, const Config* c)
- {
-- out << YAML::Key << "cube_input";
-- out << YAML::Value << YAML::Flow << t->getCubeInput();
-+ out << YAML::Block;
-+ out << YAML::BeginMap;
-+ out << YAML::Key << "ocio_profile_version" << YAML::Value << 1;
-+ out << YAML::Newline;
-+#ifndef OLDYAML
-+ out << YAML::Newline;
-+#endif
-+
-+ if(c->getNumEnvironmentVars() > 0)
-+ {
-+ out << YAML::Key << "environment";
-+ out << YAML::Value << YAML::BeginMap;
-+ for(unsigned i = 0; i < c->getNumEnvironmentVars(); ++i)
-+ {
-+ const char* name = c->getEnvironmentVarNameByIndex(i);
-+ out << YAML::Key << name;
-+ out << YAML::Value << c->getEnvironmentVarDefault(name);
-+ }
-+ out << YAML::EndMap;
-+ out << YAML::Newline;
-+ }
-+ out << YAML::Key << "search_path" << YAML::Value << c->getSearchPath();
-+ out << YAML::Key << "strictparsing" << YAML::Value << c->isStrictParsingEnabled();
-+
-+ std::vector<float> luma(3, 0.f);
-+ c->getDefaultLumaCoefs(&luma[0]);
-+ out << YAML::Key << "luma" << YAML::Value << YAML::Flow << luma;
-+
-+ if(c->getDescription() != NULL && strlen(c->getDescription()) > 0)
-+ {
-+ out << YAML::Newline;
-+ out << YAML::Key << "description";
-+ out << YAML::Value << c->getDescription();
-+ out << YAML::Newline;
-+ }
-+
-+ // Roles
-+ out << YAML::Newline;
-+#ifndef OLDYAML
-+ out << YAML::Newline;
-+#endif
-+ out << YAML::Key << "roles";
-+ out << YAML::Value << YAML::BeginMap;
-+ for(unsigned i = 0; i < c->getNumRoles(); ++i)
-+ {
-+ const char* role = c->getRoleName(i);
-+ out << YAML::Key << role;
-+ out << YAML::Value << c->getColorSpace(role)->getName();
-+ }
-+ out << YAML::EndMap;
-+#ifndef OLDYAML
-+ out << YAML::Newline;
-+#endif
-+
-+ // Displays
-+ out << YAML::Newline;
-+ out << YAML::Key << "displays";
-+ out << YAML::Value << YAML::BeginMap;
-+ for(unsigned i = 0; i < c->getNumDisplays(); ++i)
-+ {
-+ const char* display = c->getDisplay(i);
-+ out << YAML::Key << display;
-+ out << YAML::Value << YAML::BeginSeq;
-+ for(unsigned v = 0; v < c->getNumViews(display); ++v)
-+ {
-+ View dview;
-+ dview.name = c->getView(display, v);
-+ dview.colorspace = c->getDisplayColorSpaceName(display, dview.name.c_str());
-+ if(c->getDisplayLooks(display, dview.name.c_str()) != NULL)
-+ dview.looks = c->getDisplayLooks(display, dview.name.c_str());
-+ save(out, dview);
-+
-+ }
-+ out << YAML::EndSeq;
-+ }
-+ out << YAML::EndMap;
-+
-+#ifndef OLDYAML
-+ out << YAML::Newline;
-+#endif
-+ out << YAML::Newline;
-+ out << YAML::Key << "active_displays";
-+ std::vector<std::string> active_displays;
-+ if(c->getActiveDisplays() != NULL && strlen(c->getActiveDisplays()) > 0)
-+ SplitStringEnvStyle(active_displays, c->getActiveDisplays());
-+ out << YAML::Value << YAML::Flow << active_displays;
-+ out << YAML::Key << "active_views";
-+ std::vector<std::string> active_views;
-+ if(c->getActiveViews() != NULL && strlen(c->getActiveViews()) > 0)
-+ SplitStringEnvStyle(active_views, c->getActiveViews());
-+ out << YAML::Value << YAML::Flow << active_views;
-+#ifndef OLDYAML
-+ out << YAML::Newline;
-+#endif
-+
-+ // Looks
-+ if(c->getNumLooks() > 0)
-+ {
-+ out << YAML::Newline;
-+ out << YAML::Key << "looks";
-+ out << YAML::Value << YAML::BeginSeq;
-+ for(unsigned i = 0; i < c->getNumLooks(); ++i)
-+ {
-+ const char* name = c->getLookNameByIndex(i);
-+ save(out, c->getLook(name));
-+ }
-+ out << YAML::EndSeq;
-+ out << YAML::Newline;
-+ }
-+
-+ // ColorSpaces
-+ {
-+ out << YAML::Newline;
-+ out << YAML::Key << "colorspaces";
-+ out << YAML::Value << YAML::BeginSeq;
-+ for(unsigned i = 0; i < c->getNumColorSpaces(); ++i)
-+ {
-+ const char* name = c->getColorSpaceNameByIndex(i);
-+ save(out, c->getColorSpace(name));
-+ }
<Skipped 223 lines>
================================================================
---- gitweb:
http://git.pld-linux.org/gitweb.cgi/packages/OpenColorIO.git/commitdiff/b9df10ac532e1c18bd2ecbbfcd089f6d463d6060
More information about the pld-cvs-commit
mailing list