From 7fa68c6f763dbaf784acbbaf969165654b8b5919 Mon Sep 17 00:00:00 2001 From: Brooke Galvin Date: Thu, 16 Nov 2023 13:11:49 -0500 Subject: [PATCH] OFX File Transform Signed-off-by: Brooke Galvin --- share/dev/windows/ocio.bat | 1 + share/dev/windows/ocio_deps.bat | 2 +- .../openfx/resources/OpenColorIO.OCIOFile.png | Bin 0 -> 3591 bytes .../openfx/resources/OpenColorIO.OCIOFile.svg | 1 + vendor/openfx/CMakeLists.txt | 3 + vendor/openfx/OCIOFile.cpp | 126 ++++++++++++++++++ vendor/openfx/OCIOFile.h | 44 ++++++ vendor/openfx/OCIOMain.cpp | 9 +- 8 files changed, 183 insertions(+), 3 deletions(-) create mode 100644 share/openfx/resources/OpenColorIO.OCIOFile.png create mode 100644 share/openfx/resources/OpenColorIO.OCIOFile.svg create mode 100644 vendor/openfx/OCIOFile.cpp create mode 100644 vendor/openfx/OCIOFile.h diff --git a/share/dev/windows/ocio.bat b/share/dev/windows/ocio.bat index a4762a97d9..2950f12c9a 100644 --- a/share/dev/windows/ocio.bat +++ b/share/dev/windows/ocio.bat @@ -203,6 +203,7 @@ if !DO_CONFIGURE!==1 ( -DPython_ROOT="!PYTHON_PATH!"^ -DBUILD_SHARED_LIBS=ON^ -DOCIO_BUILD_APPS=ON^ + -DOCIO_BUILD_OPENFX=ON^ -DOCIO_BUILD_TESTS=ON^ -DOCIO_BUILD_GPU_TESTS=ON^ -DOCIO_BUILD_DOCS=OFF^ diff --git a/share/dev/windows/ocio_deps.bat b/share/dev/windows/ocio_deps.bat index af420cd33d..ac396a1a41 100644 --- a/share/dev/windows/ocio_deps.bat +++ b/share/dev/windows/ocio_deps.bat @@ -105,7 +105,7 @@ if ErrorLevel 1 ( echo Checking for Microsoft Visual Studio... set MSVS=0 -for /d %%a in ("%programfiles%\Microsoft Visual Studio*") do ( +for /d %%a in ("D:\Program Files\Microsoft Visual Studio*") do ( for /f "tokens=3 delims=\" %%x in ("%%a") do set MSVS=1 ) diff --git a/share/openfx/resources/OpenColorIO.OCIOFile.png b/share/openfx/resources/OpenColorIO.OCIOFile.png new file mode 100644 index 0000000000000000000000000000000000000000..69fbdad548baab1a5f6a1cbbfe5aff2c8e07bc63 GIT binary patch literal 3591 zcmV+i4*2njP)J7xJ3ZS5qKTJY9IAv9Kn$z zu>8cMMFfY9z#;(Eg$NGHKt$mCpw?L}=8q(1G(Ds4DvGsTX2s~IZ+d!qy8rm~>leh- zSmuQ@0OJe)e3<8}gN#yl`$J%D1ffq5&T8+V_s5POn**reO>6JPJYVf()CJaCP*x!N z^gaXN8M>T3fL-;P=c`m;9Wbl}r(b(bnP2jj)HfX>yn}-^^TG*$CweU`{whZTcLQKE z&sT-O>K34Z1?t(=UR?**Sy*X`uK-)Qk|2G=uq_7=6S#%I$_G*( zKr}!VZR+1{07N#&daZ|5AnoKLSP8AQunMHZgVs7&X-hK}NR>jnw85vf23A_##{iy% zFD*W8JkM8=z}8&>5~pAlP@T3<^L(|@`3oL;f^>}XaGR|7-Cb~{*88jis`Iw)D>BfBvL*tmyP(eV zRp3N4fPB=Ca!&ld&07{k?P~Eg%!c^x>dFYCErX=7mpz?;5w%=07 z7OHD@q!qu>Qk=?Qr4ZF&K%njc6nKj-?�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 N002ovPDHLkV1i8^-Dv;- literal 0 HcmV?d00001 diff --git a/share/openfx/resources/OpenColorIO.OCIOFile.svg b/share/openfx/resources/OpenColorIO.OCIOFile.svg new file mode 100644 index 0000000000..594fa912b4 --- /dev/null +++ b/share/openfx/resources/OpenColorIO.OCIOFile.svg @@ -0,0 +1 @@ +ocio_dot_m \ No newline at end of file diff --git a/vendor/openfx/CMakeLists.txt b/vendor/openfx/CMakeLists.txt index 2d2f880b2a..0d67a1adf7 100644 --- a/vendor/openfx/CMakeLists.txt +++ b/vendor/openfx/CMakeLists.txt @@ -4,6 +4,7 @@ set(SOURCES OCIOColorSpace.cpp OCIODisplayView.cpp + OCIOFile.cpp OCIOMain.cpp OCIOProcessor.cpp OCIOUtils.cpp @@ -26,6 +27,8 @@ set(RESOURCES ${PROJECT_SOURCE_DIR}/share/openfx/resources/OpenColorIO.OCIOColorSpace.svg ${PROJECT_SOURCE_DIR}/share/openfx/resources/OpenColorIO.OCIODisplayView.png ${PROJECT_SOURCE_DIR}/share/openfx/resources/OpenColorIO.OCIODisplayView.svg + ${PROJECT_SOURCE_DIR}/share/openfx/resources/OpenColorIO.OCIOFile.png + ${PROJECT_SOURCE_DIR}/share/openfx/resources/OpenColorIO.OCIOFile.svg ) add_library(ofxplugin MODULE ${SOURCES} ${OFXS_SOURCES}) diff --git a/vendor/openfx/OCIOFile.cpp b/vendor/openfx/OCIOFile.cpp new file mode 100644 index 0000000000..bb4e0c91aa --- /dev/null +++ b/vendor/openfx/OCIOFile.cpp @@ -0,0 +1,126 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright Contributors to the OpenColorIO Project. + +#include "OCIOFile.h" +#include "OCIOProcessor.h" +#include "OCIOUtils.h" + +namespace OCIO = OCIO_NAMESPACE; + +namespace +{ + const std::string PLUGIN_TYPE = "OCIOFile"; + +} // namespace + +OCIOFile::OCIOFile(OfxImageEffectHandle handle) + : ImageEffect(handle) + , dstClip_(0) + , srcClip_(0) + , srcPathNameParam_(0) + , inverseParam_(0) +{ + dstClip_ = fetchClip(kOfxImageEffectOutputClipName); + srcClip_ = fetchClip(kOfxImageEffectSimpleSourceClipName); + + srcPathNameParam_ = fetchStringParam(kOfxParamStringIsFilePath); + + inverseParam_ = fetchBooleanParam("inverse"); + + fetchContextParams(*this, contextParams_); +} + +void OCIOFile::render(const OFX::RenderArguments& args) +{ + // Get images + std::unique_ptr dst(dstClip_->fetchImage(args.time)); + std::unique_ptr src(srcClip_->fetchImage(args.time)); + + // Get file path + std::string srcFileName; + srcPathNameParam_->getValue(srcFileName); + + bool inverse = inverseParam_->getValue(); + + // Create context with overrides + OCIO::ContextRcPtr context = createOCIOContext(contextParams_); + + // Build file transform + OCIO::FileTransformRcPtr tr = OCIO::FileTransform::Create(); + tr->setSrc(srcFileName.c_str()); + + // Setup and apply processor + OCIOProcessor proc(*this); + + proc.setDstImg(dst.get()); + proc.setSrcImg(src.get()); + proc.setRenderWindow(args.renderWindow); + proc.setTransform(context, tr, (inverse ? OCIO::TRANSFORM_DIR_INVERSE + : OCIO::TRANSFORM_DIR_FORWARD)); + + proc.process(); +} + +bool OCIOFile::isIdentity(const OFX::IsIdentityArguments& args, + OFX::Clip*& identityClip, + double& identityTime) +{ + + std::string srcFileName; + srcPathNameParam_->getValue(srcFileName); + + // Is processing needed? + if (srcFileName.empty()) + { + identityClip = srcClip_; + identityTime = args.time; + return true; + } + + return false; +} + +void OCIOFile::changedParam(const OFX::InstanceChangedArgs& /*args*/, + const std::string& paramName) +{ + // Store context overrides + contextParamChanged(*this, paramName); +} + +void OCIOFileFactory::describe(OFX::ImageEffectDescriptor& desc) +{ + baseDescribe(PLUGIN_TYPE, desc); +} + +void OCIOFileFactory::describeInContext(OFX::ImageEffectDescriptor& desc, + OFX::ContextEnum /*context*/) +{ + baseDescribeInContext(desc); + + // Define parameters + OFX::PageParamDescriptor* page = desc.definePageParam(PARAM_NAME_PAGE_0); + + // Src path string + defineStringParam(desc, page, + "src_path", + "Source File Path", + "Source file path name", + 0); + + // Inverse + defineBooleanParam(desc, page, + "inverse", + "Inverse", + "Invert the transform", + 0); + + // Context overrides + defineContextParams(desc, page); +} + +OFX::ImageEffect* OCIOFileFactory::createInstance( + OfxImageEffectHandle handle, + OFX::ContextEnum /*context*/) +{ + return new OCIOFile(handle); +} \ No newline at end of file diff --git a/vendor/openfx/OCIOFile.h b/vendor/openfx/OCIOFile.h new file mode 100644 index 0000000000..1de7337f81 --- /dev/null +++ b/vendor/openfx/OCIOFile.h @@ -0,0 +1,44 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright Contributors to the OpenColorIO Project. + +#ifndef INCLUDED_OFX_OCIOFILE_H +#define INCLUDED_OFX_OCIOFILE_H + +#include "OCIOUtils.h" + +#include + +#include "ofxsImageEffect.h" + +class OCIOFile : public OFX::ImageEffect +{ +protected: + // Do not need to delete these. The ImageEffect is managing them for us. + OFX::Clip* dstClip_; + OFX::Clip* srcClip_; + + OFX::StringParam* srcPathNameParam_; + OFX::BooleanParam* inverseParam_; + + ParamMap contextParams_; + +public: + OCIOFile(OfxImageEffectHandle handle); + + /* Override the render */ + void render(const OFX::RenderArguments& args) override; + + /* Override identity (~no-op) check */ + bool isIdentity(const OFX::IsIdentityArguments& args, + OFX::Clip*& identityClip, + double& identityTime) override; + + /* Override changedParam */ + void changedParam(const OFX::InstanceChangedArgs& args, + const std::string& paramName) override; + +}; + +mDeclarePluginFactory(OCIOFileFactory, {}, {}); + +#endif // INCLUDED_OFX_OCIOFILE_H \ No newline at end of file diff --git a/vendor/openfx/OCIOMain.cpp b/vendor/openfx/OCIOMain.cpp index 9312892023..9a35a1036a 100644 --- a/vendor/openfx/OCIOMain.cpp +++ b/vendor/openfx/OCIOMain.cpp @@ -3,8 +3,9 @@ #include "OCIOColorSpace.h" #include "OCIODisplayView.h" +#include "OCIOFile.h" -void OFX::Plugin::getPluginIDs(OFX::PluginFactoryArray & ids) +void OFX::Plugin::getPluginIDs(OFX::PluginFactoryArray& ids) { static OCIOColorSpaceFactory ocioColorSpace( "OpenColorIO.OCIOColorSpace", 1, 0); @@ -13,4 +14,8 @@ void OFX::Plugin::getPluginIDs(OFX::PluginFactoryArray & ids) static OCIODisplayViewFactory ocioDisplayView( "OpenColorIO.OCIODisplayView", 1, 0); ids.push_back(&ocioDisplayView); -} + + static OCIOFileFactory ocioFile( + "OpenColorIO.OCIOFile", 1, 0); + ids.push_back(&ocioFile); +} \ No newline at end of file