diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000000..5c63af73f5 --- /dev/null +++ b/.clang-format @@ -0,0 +1,235 @@ +--- +Language: Cpp +# BasedOnStyle: LLVM +AccessModifierOffset: -4 +AlignAfterOpenBracket: AlwaysBreak +AlignArrayOfStructures: Right +AlignConsecutiveAssignments: + Enabled: true + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + PadOperators: true +AlignConsecutiveBitFields: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + PadOperators: false +AlignConsecutiveDeclarations: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + PadOperators: false +AlignConsecutiveMacros: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + PadOperators: false +AlignConsecutiveShortCaseStatements: + Enabled: true + AcrossEmptyLines: false + AcrossComments: false + AlignCaseColons: false +AlignEscapedNewlines: Right +AlignOperands: Align +AlignTrailingComments: + Kind: Always + OverEmptyLines: 0 +AllowAllArgumentsOnNextLine: false +AllowAllParametersOfDeclarationOnNextLine: false +AllowShortBlocksOnASingleLine: Never +AllowShortCaseLabelsOnASingleLine: false +AllowShortEnumsOnASingleLine: true +AllowShortFunctionsOnASingleLine: InlineOnly +AllowShortIfStatementsOnASingleLine: Never +AllowShortLambdasOnASingleLine: All +AllowShortLoopsOnASingleLine: false +AlwaysBreakAfterDefinitionReturnType: None +AlwaysBreakAfterReturnType: None +AlwaysBreakBeforeMultilineStrings: false +AlwaysBreakTemplateDeclarations: MultiLine +AttributeMacros: + - __capability +BinPackArguments: false +BinPackParameters: false +BitFieldColonSpacing: Both +BraceWrapping: + AfterCaseLabel: true + AfterClass: true + AfterControlStatement: Always + AfterEnum: true + AfterExternBlock: true + AfterFunction: true + AfterNamespace: true + AfterObjCDeclaration: true + AfterStruct: true + AfterUnion: true + BeforeCatch: true + BeforeElse: true + BeforeLambdaBody: false + BeforeWhile: true + IndentBraces: false + SplitEmptyFunction: true + SplitEmptyRecord: true + SplitEmptyNamespace: true +BreakAfterAttributes: Never +BreakAfterJavaFieldAnnotations: false +BreakArrays: true +BreakBeforeBinaryOperators: All +BreakBeforeConceptDeclarations: Always +BreakBeforeBraces: Custom +BreakBeforeInlineASMColon: OnlyMultiline +BreakBeforeTernaryOperators: true +BreakConstructorInitializers: BeforeComma +BreakInheritanceList: BeforeColon +BreakStringLiterals: true +ColumnLimit: 100 +CommentPragmas: '^ IWYU pragma:' +CompactNamespaces: false +ConstructorInitializerIndentWidth: 4 +ContinuationIndentWidth: 4 +Cpp11BracedListStyle: true +DerivePointerAlignment: false +DisableFormat: false +EmptyLineAfterAccessModifier: Never +EmptyLineBeforeAccessModifier: LogicalBlock +ExperimentalAutoDetectBinPacking: false +FixNamespaceComments: true +ForEachMacros: + - foreach + - Q_FOREACH + - BOOST_FOREACH +IfMacros: + - KJ_IF_MAYBE +IncludeBlocks: Preserve +IncludeCategories: + - Regex: '^"(llvm|llvm-c|clang|clang-c)/' + Priority: 2 + SortPriority: 0 + CaseSensitive: false + - Regex: '^(<|"(gtest|gmock|isl|json)/)' + Priority: 3 + SortPriority: 0 + CaseSensitive: false + - Regex: '.*' + Priority: 1 + SortPriority: 0 + CaseSensitive: false +IncludeIsMainRegex: '(Test)?$' +IncludeIsMainSourceRegex: '' +IndentAccessModifiers: false +IndentCaseBlocks: false +IndentCaseLabels: true +IndentExternBlock: AfterExternBlock +IndentGotoLabels: true +IndentPPDirectives: None +IndentRequiresClause: true +IndentWidth: 4 +IndentWrappedFunctionNames: false +InsertBraces: false +InsertNewlineAtEOF: false +InsertTrailingCommas: None +IntegerLiteralSeparator: + Binary: 0 + BinaryMinDigits: 0 + Decimal: 0 + DecimalMinDigits: 0 + Hex: 0 + HexMinDigits: 0 +JavaScriptQuotes: Leave +JavaScriptWrapImports: true +KeepEmptyLinesAtTheStartOfBlocks: true +KeepEmptyLinesAtEOF: false +LambdaBodyIndentation: Signature +LineEnding: DeriveLF +MacroBlockBegin: '' +MacroBlockEnd: '' +MaxEmptyLinesToKeep: 1 +NamespaceIndentation: None +ObjCBinPackProtocolList: Auto +ObjCBlockIndentWidth: 2 +ObjCBreakBeforeNestedBlockParam: true +ObjCSpaceAfterProperty: false +ObjCSpaceBeforeProtocolList: true +PackConstructorInitializers: Never +PenaltyBreakAssignment: 2 +PenaltyBreakBeforeFirstCallParameter: 19 +PenaltyBreakComment: 300 +PenaltyBreakFirstLessLess: 120 +PenaltyBreakOpenParenthesis: 0 +PenaltyBreakString: 1000 +PenaltyBreakTemplateDeclaration: 10 +PenaltyExcessCharacter: 1000000 +PenaltyIndentedWhitespace: 0 +PenaltyReturnTypeOnItsOwnLine: 200 +PointerAlignment: Middle +PPIndentWidth: -1 +QualifierAlignment: Leave +ReferenceAlignment: Pointer +ReflowComments: true +RemoveBracesLLVM: false +RemoveParentheses: Leave +RemoveSemicolon: false +RequiresClausePosition: OwnLine +RequiresExpressionIndentation: OuterScope +SeparateDefinitionBlocks: Leave +ShortNamespaceLines: 1 +SortIncludes: CaseSensitive +SortJavaStaticImport: Before +SortUsingDeclarations: LexicographicNumeric +SpaceAfterCStyleCast: false +SpaceAfterLogicalNot: false +SpaceAfterTemplateKeyword: true +SpaceAroundPointerQualifiers: Default +SpaceBeforeAssignmentOperators: true +SpaceBeforeCaseColon: false +SpaceBeforeCpp11BracedList: false +SpaceBeforeCtorInitializerColon: true +SpaceBeforeInheritanceColon: true +SpaceBeforeJsonColon: false +SpaceBeforeParens: ControlStatements +SpaceBeforeParensOptions: + AfterControlStatements: true + AfterForeachMacros: true + AfterFunctionDefinitionName: false + AfterFunctionDeclarationName: false + AfterIfMacros: true + AfterOverloadedOperator: false + AfterRequiresInClause: false + AfterRequiresInExpression: false + BeforeNonEmptyParentheses: false +SpaceBeforeRangeBasedForLoopColon: true +SpaceBeforeSquareBrackets: false +SpaceInEmptyBlock: false +SpacesBeforeTrailingComments: 1 +SpacesInAngles: Never +SpacesInContainerLiterals: true +SpacesInLineCommentPrefix: + Minimum: 1 + Maximum: -1 +SpacesInParens: Never +SpacesInParensOptions: + InCStyleCasts: false + InConditionalStatements: false + InEmptyParentheses: false + Other: false +SpacesInSquareBrackets: false +Standard: c++20 +StatementAttributeLikeMacros: + - Q_EMIT +StatementMacros: + - Q_UNUSED + - QT_REQUIRE_VERSION +TabWidth: 4 +UseTab: Never +VerilogBreakBetweenInstancePorts: true +WhitespaceSensitiveMacros: + - BOOST_PP_STRINGIZE + - CF_SWIFT_NAME + - NS_SWIFT_NAME + - PP_STRINGIZE + - STRINGIZE +... diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.github/workflows/ci_workflow.yml b/.github/workflows/ci_workflow.yml index 3eb0008998..90460586f1 100644 --- a/.github/workflows/ci_workflow.yml +++ b/.github/workflows/ci_workflow.yml @@ -756,3 +756,58 @@ jobs: ./${{ matrix.build-type }}/consumer shell: bash working-directory: _build/tests/cmake-consumer-dist + + # --------------------------------------------------------------------------- + # clang-format + # --------------------------------------------------------------------------- + + clang-format: + name: 'Linux Latest clang-format' + # Avoid duplicated checks when a pull_request is opened from a local branch. + if: | + github.event_name == 'push' || + github.event.pull_request.head.repo.full_name != github.repository + runs-on: ubuntu-latest + steps: + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: 3.12 + - name: Install clang-format + run: | + pip install clang-format + - name: Checkout + uses: actions/checkout@v4 + - name: Create build directories + run: | + mkdir _install + mkdir _build + - name: Configure + run: | + cmake ../. \ + -DCMAKE_INSTALL_PREFIX=../_install \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_CXX_STANDARD=17 \ + -DBUILD_SHARED_LIBS=ON \ + -DOCIO_BUILD_DOCS=OFF \ + -DOCIO_BUILD_OPENFX=ON \ + -DOCIO_BUILD_GPU_TESTS=OFF \ + -DOCIO_USE_SIMD=ON \ + -DOCIO_USE_OIIO_FOR_APPS=OFF \ + -DOCIO_INSTALL_EXT_PACKAGES=ALL \ + -DOCIO_WARNING_AS_ERROR=ON \ + -DPython_EXECUTABLE=$(which python) + working-directory: _build + - name: Build + run: | + cmake --build . \ + --target clang-format \ + --config Release \ + -- -j$(nproc) + working-directory: _build + - name: Test clang-format + run: | + if [[ `git status --porcelain` ]]; then + echo "Failing clang-format check, please run locally before submitting the PR." + exit 1 + fi diff --git a/CMakeLists.txt b/CMakeLists.txt index 3d2ad73654..89a0e1db37 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -533,3 +533,55 @@ install( FILES "${OCIO_PROJECT_CONFIG}" "${OCIO_VERSION_CONFIG}" DESTINATION "${OCIO_CONFIG_INSTALL_DIR}" ) + + +########################################################################### +# Setup clang-format custom target (based on OpenImageIO). + +if (PROJECT_IS_TOP_LEVEL) + set (CLANG_FORMAT_EXE_HINT "" CACHE PATH "clang-format executable's directory (will search if not specified") + set (CLANG_FORMAT_INCLUDES + "include/*.h" + "src/*.h" + "src/*.cpp" + # Ignore tests for the time being as formating tends to make the code + # less readable (declarations of test values, ...). + # "tests/*.h" + # "tests/*.cpp" + "vendor/openfx/*.h" + "vendor/openfx/*.cpp" + CACHE STRING "Glob patterns to include for clang-format" + ) + set (CLANG_FORMAT_EXCLUDES + "msl.h" + "vendor/openfx/Support/*" + CACHE STRING "Glob patterns to exclude for clang-format" + ) + + find_program (CLANG_FORMAT_EXE + NAMES clang-format bin/clang-format + HINTS ${CLANG_FORMAT_EXE_HINT} + ENV CLANG_FORMAT_EXE_HINT + ENV LLVM_DIRECTORY + NO_DEFAULT_PATH + DOC "Path to clang-format executable" + ) + find_program (CLANG_FORMAT_EXE + NAMES clang-format bin/clang-format + ) + + if (CLANG_FORMAT_EXE) + message (STATUS "clang-format found: ${CLANG_FORMAT_EXE}") + # Start with the list of files to include when formatting... + file (GLOB_RECURSE FILES_TO_FORMAT ${CLANG_FORMAT_INCLUDES}) + # ... then process any list of excludes we are given + foreach (_pat ${CLANG_FORMAT_EXCLUDES}) + file (GLOB_RECURSE _excl ${_pat}) + list (REMOVE_ITEM FILES_TO_FORMAT ${_excl}) + endforeach () + file (COPY ${CMAKE_CURRENT_SOURCE_DIR}/.clang-format DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) + add_custom_target (clang-format COMMAND "${CLANG_FORMAT_EXE}" --verbose -i -style=file ${FILES_TO_FORMAT} ) + else () + message (STATUS "clang-format not found.") + endif () +endif () \ No newline at end of file diff --git a/docs/guides/contributing/coding_style_guide.rst b/docs/guides/contributing/coding_style_guide.rst index 67109597a0..b01d4c7d4a 100644 --- a/docs/guides/contributing/coding_style_guide.rst +++ b/docs/guides/contributing/coding_style_guide.rst @@ -18,6 +18,21 @@ There are two main rules when contributing to OpenColorIO: Use your head and ask for advice if your common sense seems to disagree with the conventions. +clang-format +************ + +OpenColorIO now uses `clang-format +` to enforce its coding +conventions. You can obtain clang-format from various sources, including +packages managers and Python pip install. When submitting a PR against +OpenColorIO repository, a check will make sure that clang-format has been run +locally before pushing the changes. + +Once clang-format is available on your system, from your build directory run +CMake configure step, then build the `clang-format` target:: + + cmake --build . --target clang-format + File conventions **************** diff --git a/include/OpenColorIO/OpenColorAppHelpers.h b/include/OpenColorIO/OpenColorAppHelpers.h index e461d1d474..a1115684cc 100644 --- a/include/OpenColorIO/OpenColorAppHelpers.h +++ b/include/OpenColorIO/OpenColorAppHelpers.h @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_OPENCOLORAPPHELPERS_H #define INCLUDED_OCIO_OPENCOLORAPPHELPERS_H @@ -11,7 +10,6 @@ #error This header cannot be used directly. Use instead. #endif - namespace OCIO_NAMESPACE { @@ -102,25 +100,24 @@ class OCIOEXPORT ColorSpaceMenuParameters static ColorSpaceMenuParametersRcPtr Create(ConstConfigRcPtr config); /// Config is required to be able to create a ColorSpaceMenuHelper. virtual void setConfig(ConstConfigRcPtr config) noexcept = 0; - virtual ConstConfigRcPtr getConfig() const noexcept = 0; + virtual ConstConfigRcPtr getConfig() const noexcept = 0; /// If role is a valid role, other parameters are ignored and menu will contain only that role. virtual void setRole(const char * role) noexcept = 0; - virtual const char * getRole() const noexcept = 0; - + virtual const char * getRole() const noexcept = 0; /** * Include all color spaces (or not) to ColorSpaceMenuHelper. Default is to include color * spaces. */ virtual void setIncludeColorSpaces(bool include) noexcept = 0; - virtual bool getIncludeColorSpaces() const noexcept = 0; + virtual bool getIncludeColorSpaces() const noexcept = 0; /** * Can be used to restrict the search using the ReferenceSpaceType of the color spaces. * It has no effect on roles and named transforms. */ - virtual SearchReferenceSpaceType getSearchReferenceSpaceType() const noexcept = 0; + virtual SearchReferenceSpaceType getSearchReferenceSpaceType() const noexcept = 0; virtual void setSearchReferenceSpaceType(SearchReferenceSpaceType colorSpaceType) noexcept = 0; /** @@ -128,22 +125,21 @@ class OCIOEXPORT ColorSpaceMenuParameters * named transforms. */ virtual void setIncludeNamedTransforms(bool include) noexcept = 0; - virtual bool getIncludeNamedTransforms() const noexcept = 0; - + virtual bool getIncludeNamedTransforms() const noexcept = 0; /** * App categories is a comma separated list of categories. If appCategories is not NULL and * not empty, all color spaces that have one of the categories will be part of the menu. */ virtual void setAppCategories(const char * appCategories) noexcept = 0; - virtual const char * getAppCategories() const noexcept = 0; + virtual const char * getAppCategories() const noexcept = 0; /** * Encodings is a comma separated list of encodings. When not empty, is retricting the search * to color spaces that are using one of the encodings. */ virtual void setEncodings(const char * encodings) noexcept = 0; - virtual const char * getEncodings() const noexcept = 0; + virtual const char * getEncodings() const noexcept = 0; /** * User categories is a comma separated list of categories. If OCIO_USER_CATEGORIES_ENVVAR @@ -151,15 +147,14 @@ class OCIOEXPORT ColorSpaceMenuParameters * env. variable is used for user categories. */ virtual void setUserCategories(const char * userCategories) noexcept = 0; - virtual const char * getUserCategories() const noexcept = 0; - + virtual const char * getUserCategories() const noexcept = 0; /** * Include all roles (or not) to ColorSpaceMenuHelper. Default is not to include roles. * Roles are added after color spaces with an single hierarchy level named "Roles". */ virtual void setIncludeRoles(bool include) noexcept = 0; - virtual bool getIncludeRoles() const noexcept = 0; + virtual bool getIncludeRoles() const noexcept = 0; /** * Add an additional color space (or named transform) to the menu. @@ -176,9 +171,9 @@ class OCIOEXPORT ColorSpaceMenuParameters */ virtual void addColorSpace(const char * name) noexcept = 0; - virtual size_t getNumAddedColorSpaces() const noexcept = 0; + virtual size_t getNumAddedColorSpaces() const noexcept = 0; virtual const char * getAddedColorSpace(size_t index) const noexcept = 0; - virtual void clearAddedColorSpaces() noexcept = 0; + virtual void clearAddedColorSpaces() noexcept = 0; /// Do not use (needed only for pybind11). virtual ~ColorSpaceMenuParameters() = default; @@ -233,17 +228,17 @@ class OCIOEXPORT ColorSpaceMenuHelper * Get the index of the element of a given name. Return (size_t)-1 name if NULL or empty, or if * no element with that name is found. */ - virtual size_t getIndexFromName(const char * name) const noexcept = 0; + virtual size_t getIndexFromName(const char * name) const noexcept = 0; virtual size_t getIndexFromUIName(const char * name) const noexcept = 0; virtual const char * getDescription(size_t idx) const noexcept = 0; - virtual const char * getFamily(size_t idx) const noexcept = 0; + virtual const char * getFamily(size_t idx) const noexcept = 0; /** * Hierarchy levels are created from the family string. It is split into levels using the * 'family separator'. */ - virtual size_t getNumHierarchyLevels(size_t idx) const noexcept = 0; + virtual size_t getNumHierarchyLevels(size_t idx) const noexcept = 0; virtual const char * getHierarchyLevel(size_t idx, size_t i) const noexcept = 0; /// Get the color space name from the UI name. @@ -251,7 +246,7 @@ class OCIOEXPORT ColorSpaceMenuHelper /// Get the color space UI name from the name. virtual const char * getUINameFromName(const char * name) const noexcept = 0; - ColorSpaceMenuHelper(const ColorSpaceMenuHelper &) = delete; + ColorSpaceMenuHelper(const ColorSpaceMenuHelper &) = delete; ColorSpaceMenuHelper & operator=(const ColorSpaceMenuHelper &) = delete; /// Do not use (needed only for pybind11). @@ -269,16 +264,17 @@ namespace ColorSpaceHelpers * Add a new color space to the config instance. The output of the userTransform must be in the * specified connectionColorSpace. * - * Note: If the config does not already use categories, we do not add them since that would + * Note: If the config does not already use categories, we do not add them since that would * make a big change to how existing color spaces show up in menus. */ -extern OCIOEXPORT void AddColorSpace(ConfigRcPtr & config, - const char * name, - const char * transformFilePath, - const char * categories, // Could be null or empty. - const char * connectionColorSpaceName); +extern OCIOEXPORT void AddColorSpace( + ConfigRcPtr & config, + const char * name, + const char * transformFilePath, + const char * categories, // Could be null or empty. + const char * connectionColorSpaceName); -} // ColorSpaceHelpers +} // namespace ColorSpaceHelpers namespace DisplayViewHelpers { @@ -290,20 +286,22 @@ namespace DisplayViewHelpers * ExposureContrastTransforms to enable changing exposure, contrast, and gamma after the processor * has been created using dynamic properties. */ -extern OCIOEXPORT ConstProcessorRcPtr GetProcessor(const ConstConfigRcPtr & config, - const ConstContextRcPtr & context, - const char * workingName, - const char * displayName, - const char * viewName, - const ConstMatrixTransformRcPtr & channelView, - TransformDirection direction); - -extern OCIOEXPORT ConstProcessorRcPtr GetProcessor(const ConstConfigRcPtr & config, - const char * workingName, - const char * displayName, - const char * viewName, - const ConstMatrixTransformRcPtr & channelView, - TransformDirection direction); +extern OCIOEXPORT ConstProcessorRcPtr GetProcessor( + const ConstConfigRcPtr & config, + const ConstContextRcPtr & context, + const char * workingName, + const char * displayName, + const char * viewName, + const ConstMatrixTransformRcPtr & channelView, + TransformDirection direction); + +extern OCIOEXPORT ConstProcessorRcPtr GetProcessor( + const ConstConfigRcPtr & config, + const char * workingName, + const char * displayName, + const char * viewName, + const ConstMatrixTransformRcPtr & channelView, + TransformDirection direction); /// Get an identity processor containing only the ExposureContrastTransforms. extern OCIOEXPORT ConstProcessorRcPtr GetIdentityProcessor(const ConstConfigRcPtr & config); @@ -312,27 +310,26 @@ extern OCIOEXPORT ConstProcessorRcPtr GetIdentityProcessor(const ConstConfigRcPt * Add a new (display, view) pair and the new color space to a configuration instance. * The input to the userTransform must be in the specified connectionColorSpace. */ -extern OCIOEXPORT void AddDisplayView(ConfigRcPtr & config, - const char * displayName, - const char * viewName, - const char * lookDefinition, // Could be empty or null - const char * colorSpaceName, // Could be empty or null - const char * colorSpaceFamily, // Could be empty or null - const char * colorSpaceDescription, // Could be empty or null - const char * categories, // Could be empty or null - const char * transformFilePath, - const char * connectionColorSpaceName); +extern OCIOEXPORT void AddDisplayView( + ConfigRcPtr & config, + const char * displayName, + const char * viewName, + const char * lookDefinition, // Could be empty or null + const char * colorSpaceName, // Could be empty or null + const char * colorSpaceFamily, // Could be empty or null + const char * colorSpaceDescription, // Could be empty or null + const char * categories, // Could be empty or null + const char * transformFilePath, + const char * connectionColorSpaceName); /** * Remove a (display, view) pair including the associated color space (only if not used). * Note that the view is always removed but the display is only removed if empty. */ -extern OCIOEXPORT void RemoveDisplayView(ConfigRcPtr & config, - const char * displayName, - const char * viewName); - -} // DisplayViewHelpers +extern OCIOEXPORT void +RemoveDisplayView(ConfigRcPtr & config, const char * displayName, const char * viewName); +} // namespace DisplayViewHelpers /** * Whereas the DisplayViewTransform simply applies a specific view from an OCIO display, the @@ -365,19 +362,19 @@ class OCIOEXPORT LegacyViewingPipeline public: static LegacyViewingPipelineRcPtr Create(); - virtual ConstDisplayViewTransformRcPtr getDisplayViewTransform() const noexcept = 0; + virtual ConstDisplayViewTransformRcPtr getDisplayViewTransform() const noexcept = 0; virtual void setDisplayViewTransform(const ConstDisplayViewTransformRcPtr & dt) noexcept = 0; - virtual ConstTransformRcPtr getLinearCC() const noexcept = 0; + virtual ConstTransformRcPtr getLinearCC() const noexcept = 0; virtual void setLinearCC(const ConstTransformRcPtr & cc) noexcept = 0; - virtual ConstTransformRcPtr getColorTimingCC() const noexcept = 0; + virtual ConstTransformRcPtr getColorTimingCC() const noexcept = 0; virtual void setColorTimingCC(const ConstTransformRcPtr & cc) noexcept = 0; - virtual ConstTransformRcPtr getChannelView() const noexcept = 0; + virtual ConstTransformRcPtr getChannelView() const noexcept = 0; virtual void setChannelView(const ConstTransformRcPtr & transform) noexcept = 0; - virtual ConstTransformRcPtr getDisplayCC() const noexcept = 0; + virtual ConstTransformRcPtr getDisplayCC() const noexcept = 0; virtual void setDisplayCC(const ConstTransformRcPtr & cc) noexcept = 0; /** @@ -385,7 +382,7 @@ class OCIOEXPORT LegacyViewingPipeline * it's often useful to override "looks" to an empty string. */ virtual void setLooksOverrideEnabled(bool enable) = 0; - virtual bool getLooksOverrideEnabled() const = 0; + virtual bool getLooksOverrideEnabled() const = 0; /** * A user can optionally override the looks that are, by default, used with the expected @@ -395,20 +392,22 @@ class OCIOEXPORT LegacyViewingPipeline * default. Thus, with this mechanism the viewing app could override to looks = "", and * this will allow image display to continue (though hopefully) the interface would reflect * this fallback option. - * + * * Looks is a potentially comma (or colon) delimited list of lookNames, where +/- prefixes * are optionally allowed to denote forward/inverse look specification (and forward is * assumed in the absence of either). */ virtual void setLooksOverride(const char * looks) = 0; - virtual const char * getLooksOverride() const = 0; + virtual const char * getLooksOverride() const = 0; - virtual ConstProcessorRcPtr getProcessor(const ConstConfigRcPtr & config, - const ConstContextRcPtr & context) const = 0; + virtual ConstProcessorRcPtr getProcessor( + const ConstConfigRcPtr & config, + const ConstContextRcPtr & context) const + = 0; virtual ConstProcessorRcPtr getProcessor(const ConstConfigRcPtr & config) const = 0; - LegacyViewingPipeline(const LegacyViewingPipeline &) = delete; + LegacyViewingPipeline(const LegacyViewingPipeline &) = delete; LegacyViewingPipeline & operator=(const LegacyViewingPipeline &) = delete; /// Do not use (needed only for pybind11). @@ -421,21 +420,21 @@ class OCIOEXPORT LegacyViewingPipeline extern OCIOEXPORT std::ostream & operator<<(std::ostream &, const LegacyViewingPipeline &); /** - * The MixingSlider and MixingColorSpaceManager classes are to help applications implement correct - * color pickers. The term "color mixing" is used here to describe what is done in a typical + * The MixingSlider and MixingColorSpaceManager classes are to help applications implement correct + * color pickers. The term "color mixing" is used here to describe what is done in a typical * application "color picker" user interface. - * - * A user may want to mix colors in different color spaces. The two most common mixing space - * options are a scene-linear working space or the display space. - * - * Since scene-linear color spaces are not perceptually uniform, it is necessary to compensate UI + * + * A user may want to mix colors in different color spaces. The two most common mixing space + * options are a scene-linear working space or the display space. + * + * Since scene-linear color spaces are not perceptually uniform, it is necessary to compensate UI * widgets such as sliders. For example, it is nice if mid-gray falls near the center of mixing - * controls rather than way over near the black end. This may be done by using a mapping from - * linear into an approximately perceptually uniform space. - * + * controls rather than way over near the black end. This may be done by using a mapping from + * linear into an approximately perceptually uniform space. + * * Also note that a color picking/mixing UI may want to present a given color space in several * different encodings. The most common two encodings for color mixing are RGB and HSV. - * + * * Note that these helpers anticipate that a user may want to mix colors using values that extend * outside the typical [0,1] domain. */ @@ -460,7 +459,7 @@ class OCIOEXPORT MixingSlider /// Convert from mixing space units to distance along the slider. virtual float mixingToSlider(float mixingUnits) const noexcept = 0; - MixingSlider(const MixingSlider &) = delete; + MixingSlider(const MixingSlider &) = delete; MixingSlider & operator=(const MixingSlider &) = delete; /// Do not use (needed only for pybind11). @@ -478,38 +477,39 @@ extern OCIOEXPORT std::ostream & operator<<(std::ostream &, const MixingSlider & class OCIOEXPORT MixingColorSpaceManager { public: - static MixingColorSpaceManagerRcPtr Create(ConstConfigRcPtr & config); /// Access to the mixing spaces. - virtual size_t getNumMixingSpaces() const noexcept = 0; - virtual const char * getMixingSpaceUIName(size_t idx) const = 0; - virtual size_t getSelectedMixingSpaceIdx() const noexcept = 0; - virtual void setSelectedMixingSpaceIdx(size_t idx) = 0; + virtual size_t getNumMixingSpaces() const noexcept = 0; + virtual const char * getMixingSpaceUIName(size_t idx) const = 0; + virtual size_t getSelectedMixingSpaceIdx() const noexcept = 0; + virtual void setSelectedMixingSpaceIdx(size_t idx) = 0; virtual void setSelectedMixingSpace(const char * mixingSpace) = 0; virtual bool isPerceptuallyUniform() const noexcept = 0; /// Access to the mixing encodings. - virtual size_t getNumMixingEncodings() const noexcept = 0; - virtual const char * getMixingEncodingName(size_t idx) const = 0; - virtual size_t getSelectedMixingEncodingIdx() const noexcept = 0; - virtual void setSelectedMixingEncodingIdx(size_t idx) = 0; + virtual size_t getNumMixingEncodings() const noexcept = 0; + virtual const char * getMixingEncodingName(size_t idx) const = 0; + virtual size_t getSelectedMixingEncodingIdx() const noexcept = 0; + virtual void setSelectedMixingEncodingIdx(size_t idx) = 0; virtual void setSelectedMixingEncoding(const char * mixingEncoding) = 0; /// Refresh the instance (i.e. needed following a configuration change for example). virtual void refresh(ConstConfigRcPtr config) = 0; - virtual ConstProcessorRcPtr getProcessor(const char * workingName, - const char * displayName, - const char * viewName, - TransformDirection direction) const = 0; + virtual ConstProcessorRcPtr getProcessor( + const char * workingName, + const char * displayName, + const char * viewName, + TransformDirection direction) const + = 0; virtual MixingSlider & getSlider() noexcept = 0; - virtual MixingSlider & getSlider(float sliderMixingMinEdge, - float sliderMixingMaxEdge) noexcept = 0; + virtual MixingSlider & getSlider(float sliderMixingMinEdge, float sliderMixingMaxEdge) noexcept + = 0; - MixingColorSpaceManager(const MixingColorSpaceManager &) = delete; + MixingColorSpaceManager(const MixingColorSpaceManager &) = delete; MixingColorSpaceManager & operator=(const MixingColorSpaceManager &) = delete; /// Do not use (needed only for pybind11). diff --git a/include/OpenColorIO/OpenColorIO.h b/include/OpenColorIO/OpenColorIO.h index 784cf8d2fd..66cbec199e 100644 --- a/include/OpenColorIO/OpenColorIO.h +++ b/include/OpenColorIO/OpenColorIO.h @@ -1,22 +1,21 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_OPENCOLORIO_H #define INCLUDED_OCIO_OPENCOLORIO_H #include +#include #include #include #include #include -#include #include #include "OpenColorABI.h" -#include "OpenColorTypes.h" -#include "OpenColorTransforms.h" #include "OpenColorAppHelpers.h" +#include "OpenColorTransforms.h" +#include "OpenColorTypes.h" /* @@ -64,8 +63,8 @@ namespace OCIO_NAMESPACE // Silence warning C4275 under Visual Studio: // Exceptions derive from std::runtime_error but STL classes are not exportable. #ifdef _MSC_VER -#pragma warning( push ) -#pragma warning( disable : 4275 ) +#pragma warning(push) +#pragma warning(disable : 4275) #endif /** @@ -82,16 +81,16 @@ class OCIOEXPORT Exception : public std::runtime_error explicit Exception(const char *); /// Constructor that takes an existing exception. Exception(const Exception &); - Exception & operator= (const Exception &) = delete; + Exception & operator=(const Exception &) = delete; ~Exception(); }; /** * \brief An exception class for errors detected at runtime. - * - * Thrown when OCIO cannot find a file that is expected to exist. This is provided as a custom - * type to distinguish cases where one wants to continue looking for missing files, but wants + * + * Thrown when OCIO cannot find a file that is expected to exist. This is provided as a custom + * type to distinguish cases where one wants to continue looking for missing files, but wants * to properly fail for other error conditions. */ class OCIOEXPORT ExceptionMissingFile : public Exception @@ -102,14 +101,14 @@ class OCIOEXPORT ExceptionMissingFile : public Exception explicit ExceptionMissingFile(const char *); /// Constructor that takes an existing exception. ExceptionMissingFile(const ExceptionMissingFile &); - ExceptionMissingFile & operator= (const ExceptionMissingFile &) = delete; + ExceptionMissingFile & operator=(const ExceptionMissingFile &) = delete; ~ExceptionMissingFile(); }; // Restore default warning behaviour for Visual Studio. #ifdef _MSC_VER -#pragma warning( pop ) +#pragma warning(pop) #endif /////////////////////////////////////////////////////////////////////////// @@ -125,18 +124,18 @@ class OCIOEXPORT ExceptionMissingFile : public Exception * Under normal usage, this is not necessary, but it can be helpful in particular instances, * such as designing OCIO profiles, and wanting to re-read luts without restarting. * - * \note + * \note * This method does not apply to instance-specific caches such as the Processor cache in * a Config instance or the GPU and CPU Processor caches in a Processor instance. So in cases - * where you still have a Config instance after calling ClearAllCaches, you should also call + * where you still have a Config instance after calling ClearAllCaches, you should also call * the Config's clearProcessorCache method. */ extern OCIOEXPORT void ClearAllCaches(); /** - * \brief Get the version number for the library, as a dot-delimited string + * \brief Get the version number for the library, as a dot-delimited string * (e.g., "1.0.0"). - * + * * This is also available at compile time as OCIO_VERSION_FULL_STR. */ extern OCIOEXPORT const char * GetVersion(); @@ -145,14 +144,14 @@ extern OCIOEXPORT const char * GetVersion(); * \brief Get the version number for the library, as a * single 4-byte hex number (e.g., 0x01050200 for "1.5.2"), to be used * for numeric comparisons. - * + * * This is also at compile time as OCIO_VERSION_HEX. */ extern OCIOEXPORT int GetVersionHex(); /** * \brief Get the global logging level. - * + * * You can override this at runtime using the \ref OCIO_LOGGING_LEVEL * environment variable. The client application that sets this should use * \ref SetLoggingLevel, and not the environment variable. The default value is INFO. @@ -165,8 +164,8 @@ extern OCIOEXPORT void SetLoggingLevel(LoggingLevel level); /** * \brief Set the logging function to use; otherwise, use the default * (i.e. std::cerr). - * - * \note + * + * \note * The logging mechanism is thread-safe. */ extern OCIOEXPORT void SetLoggingFunction(LoggingFunction logFunction); @@ -176,9 +175,9 @@ extern OCIOEXPORT void LogMessage(LoggingLevel level, const char * message); /** * \brief Set the Compute Hash Function to use; otherwise, use the default. - * + * * This is not used when using CreateFromFile with an OCIOZ archive or CreateFromConfigIOProxy. - * + * * \param ComputeHashFunction */ extern OCIOEXPORT void SetComputeHashFunction(ComputeHashFunction hashFunction); @@ -188,7 +187,7 @@ extern OCIOEXPORT void ResetComputeHashFunction(); // Note that the following environment variable access methods are not thread safe. // -/** +/** * Another call modifies the string obtained from a previous call as the method always uses the * same memory buffer. */ @@ -197,7 +196,7 @@ extern OCIOEXPORT const char * GetEnvVariable(const char * name); extern OCIOEXPORT void SetEnvVariable(const char * name, const char * value); /// \warning This method is not thread safe. extern OCIOEXPORT void UnsetEnvVariable(const char * name); -//!cpp:function:: +//! cpp:function:: extern OCIOEXPORT bool IsEnvVariablePresent(const char * name); /// Get the current configuration. @@ -207,70 +206,67 @@ extern OCIOEXPORT ConstConfigRcPtr GetCurrentConfig(); extern OCIOEXPORT void SetCurrentConfig(const ConstConfigRcPtr & config); /** - * \brief Make a config path forward-compatible by replacing special built-in config names + * \brief Make a config path forward-compatible by replacing special built-in config names * with the current name. - * - * Application developers should call this function on any config path they intend to persist + * + * Application developers should call this function on any config path they intend to persist * (e.g., to include in a file saved from a DCC). - * - * As the built-in config collection evolves, special names such as "ocio://default" and - * "ocio://studio-config-latest" will point to newer versions of those configs. Therefore, it is - * recommended that application developers not save those strings and instead save the string that - * refers to the current version of that config. That way, it's guaranteed that there will be no + * + * As the built-in config collection evolves, special names such as "ocio://default" and + * "ocio://studio-config-latest" will point to newer versions of those configs. Therefore, it is + * recommended that application developers not save those strings and instead save the string that + * refers to the current version of that config. That way, it's guaranteed that there will be no * change of behavior in the future. For example, as of OCIO 2.3, "ocio://default" should be saved * as "ocio://cg-config-v2.1.0_aces-v1.3_ocio-v2.3". - * - * Note that there is no validation done on the path. That is left to the application since + * + * Note that there is no validation done on the path. That is left to the application since * typically the application will load the config before attempting to save its path * and therefore catch, for example, a badly formed URI such as "ocio:default". - * + * * \return Resolved path if possible. Otherwise, the original path is returned unmodified. */ extern OCIOEXPORT const char * ResolveConfigPath(const char * originalPath) noexcept; /** * \brief Extract an OCIO Config archive. - * + * * Converts an archived config file (.ocioz file) back to its original form as a config file * and associated LUT files. This creates destinationDir and then creates a config.ocio file * at the root of that working directory and then unpacks the LUT files into their relative * locations relative to that working directory, creating any necessary sub-directories in the * process. Note that configs which contain LUT files outside the working directory are not * archivable, and so this function will not create directories outside the working directory. - * + * * \param archivePath Absolute path to the .ocioz file. * \param destinationDir Absolute path of the directory you want to be created to contain the * contents of the unarchived config. * \throw Exception If the archive is not found or there is a problem extracting it. */ -extern OCIOEXPORT void ExtractOCIOZArchive( - const char * archivePath, - const char * destinationDir -); +extern OCIOEXPORT void ExtractOCIOZArchive(const char * archivePath, const char * destinationDir); /** * \brief * A config defines all the color spaces to be available at runtime. * - * The color configuration (Config) is the main object for interacting with this library. It + * The color configuration (Config) is the main object for interacting with this library. It * encapsulates all of the information necessary to use customized ColorSpaceTransform and * DisplayViewTransform operations. * - * See the \ref user-guide for more information on selecting, creating, and working with custom + * See the \ref user-guide for more information on selecting, creating, and working with custom * color configurations. * * For applications interested in using only one color config at a time (this is the vast majority - * of apps), their API would traditionally get the global configuration and use that, as opposed - * to creating a new one. This simplifies the use case for plugins and bindings, as it alleviates + * of apps), their API would traditionally get the global configuration and use that, as opposed + * to creating a new one. This simplifies the use case for plugins and bindings, as it alleviates * the need to pass around configuration handles. * * An example of an application where this would not be sufficient would be a multi-threaded image - * proxy server (daemon), which wished to handle multiple show configurations in a single process + * proxy server (daemon), which wished to handle multiple show configurations in a single process * concurrently. This app would need to keep multiple configurations alive, and to manage them * appropriately. * - * Roughly speaking, a novice user should select a default configuration that most closely - * approximates the use case (animation, visual effects, etc.), and set the :envvar:`OCIO` + * Roughly speaking, a novice user should select a default configuration that most closely + * approximates the use case (animation, visual effects, etc.), and set the :envvar:`OCIO` * environment variable to point at the root of that configuration. * * \note @@ -283,8 +279,7 @@ extern OCIOEXPORT void ExtractOCIOZArchive( class OCIOEXPORT Config { public: - - // + // // Initialization // @@ -298,7 +293,7 @@ class OCIOEXPORT Config /** * \brief Create a fall-back config. - * + * * This may be useful to allow client apps to launch in cases when the * supplied config path is not loadable. * \return The Config object. @@ -307,11 +302,11 @@ class OCIOEXPORT Config /** * \brief Create a configuration using the OCIO environment variable. - * + * * Also supports the OCIO URI format for Built-in configs and supports archived configs. * See \ref Config::CreateFromFile. - * - * If the variable is missing or empty, returns the same result as + * + * If the variable is missing or empty, returns the same result as * \ref Config::CreateRaw. * \return The Config object. */ @@ -319,12 +314,12 @@ class OCIOEXPORT Config /** * \brief Create a configuration using a specific config file. - * + * * Supports the OCIO URI format for Built-in configs. * See \ref Config::CreateFromBuiltinConfig. * * Supports archived configs (.ocioz files). - * + * * \throw Exception If the file may not be read or does not parse. * \return The Config object. */ @@ -332,14 +327,14 @@ class OCIOEXPORT Config /** * \brief Create a configuration using a stream. - * + * * Note that CreateFromStream does not set the working directory so the caller would need to * set that separately in order to resolve FileTransforms. This function is typically only * used for self-contained configs (no LUTs). * - * Configs created from CreateFromStream can not be archived unless the working directory is + * Configs created from CreateFromStream can not be archived unless the working directory is * set and contains any necessary LUT files. - * + * * \param istream Stream to the config. * \throw Exception If the stream does not parse. * \return The Config object. @@ -350,41 +345,41 @@ class OCIOEXPORT Config * \brief Create a config from the supplied ConfigIOProxy object. This allows the calling * program to directly provide the config and associated LUTs rather than reading them from * the standard file system. - * + * * See the \ref ConfigIOProxy class documentation for more info. - * + * * \param ciop ConfigIOProxy object providing access to the config's files. * \throw Exception If the config may not be read from the proxy, or does not parse. * \return The Config object. */ static ConstConfigRcPtr CreateFromConfigIOProxy(ConfigIOProxyRcPtr ciop); - + /** * \brief Create a configuration using an OCIO built-in config. - * + * * \param configName Built-in config name (with or without the "ocio://" URI prefix). - * + * * Also supports the following OCIO URI format for Built-in configs: * "ocio://default" - Default Built-in config. * "ocio://cg-config-latest" - Latest Built-in CG config. * "ocio://studio-config-latest" - Latest Built-in Studio config. * "ocio://" - A specific Built-in config. - * + * * The available configNames are: - * + * * ACES Studio config, contains a more complete collection of color spaces and displays: * "studio-config-v1.0.0_aces-v1.3_ocio-v2.1" * "studio-config-v2.1.0_aces-v1.3_ocio-v2.3" - * + * * ACES CG config, basic color spaces for computer graphics apps: * "cg-config-v1.0.0_aces-v1.3_ocio-v2.1" * "cg-config-v2.1.0_aces-v1.3_ocio-v2.3" - * - * More information is available at: + * + * More information is available at: * %https://github.com/AcademySoftwareFoundation/OpenColorIO-Config-ACES - * + * * Information about the available configs is available from the \ref BuiltinConfigRegistry. - * + * * \throw Exception If the configName is not recognized. * \return One of the configs built into the OCIO library. */ @@ -416,7 +411,7 @@ class OCIOEXPORT Config /** * \brief Performs a thorough validation for the most common user errors. - * + * * This will throw an exception if the config is malformed. The most * common error occurs when references are made to colorspaces that do not * exist. @@ -435,7 +430,7 @@ class OCIOEXPORT Config /** * \brief Get the family separator - * + * * A single character used to separate the family string into tokens for use in hierarchical * menus. Defaults to '/'. */ @@ -455,27 +450,27 @@ class OCIOEXPORT Config /** * \brief Returns the string representation of the Config in YAML text form. - * + * * This is typically stored on disk in a file with the extension .ocio. * NB: This does not validate the config. Applications should validate before serializing. */ void serialize(std::ostream & os) const; /** - * This will produce a hash of the all colorspace definitions, etc. All external references, - * such as files used in FileTransforms, etc., will be incorporated into the cacheID. While - * the contents of the files are not read, the file system is queried for relevant information + * This will produce a hash of the all colorspace definitions, etc. All external references, + * such as files used in FileTransforms, etc., will be incorporated into the cacheID. While + * the contents of the files are not read, the file system is queried for relevant information * (mtime, inode) so that the config's cacheID will change when the underlying luts are updated. - * + * * If a context is not provided, the current Context will be used. - * - * If a null context is provided, file references will not be taken into + * + * If a null context is provided, file references will not be taken into * account (this is essentially a hash of Config::serialize). */ const char * getCacheID() const; const char * getCacheID(const ConstContextRcPtr & context) const; - // + // // Resources // @@ -507,8 +502,8 @@ class OCIOEXPORT Config const char * getSearchPath() const; /** - * \brief Set all search paths as a concatenated string, use ':' to separate the paths. - * + * \brief Set all search paths as a concatenated string, use ':' to separate the paths. + * * See \ref addSearchPath for a more robust and platform-agnostic method of * setting the search paths. */ @@ -517,7 +512,7 @@ class OCIOEXPORT Config int getNumSearchPaths() const; /** * Get a search path from the list. - * + * * The paths are in the order they will be searched (that is, highest to * lowest priority). */ @@ -525,7 +520,7 @@ class OCIOEXPORT Config void clearSearchPaths(); /** * \brief Add a single search path to the end of the list. - * + * * Paths may be either absolute or relative. Relative paths are * relative to the working directory. Forward slashes will be * normalized to reverse for Windows. Environment (context) variables @@ -536,7 +531,7 @@ class OCIOEXPORT Config const char * getWorkingDir() const; /** * \brief - * + * * The working directory defaults to the location of the * config file. It is used to convert any relative paths to absolute. * If no search paths have been set, the working directory will be used @@ -545,7 +540,7 @@ class OCIOEXPORT Config */ void setWorkingDir(const char * dirname); - // + // // ColorSpaces // @@ -570,21 +565,24 @@ class OCIOEXPORT Config * \brief Work on the color spaces selected by the reference color space type * and visibility. */ - int getNumColorSpaces(SearchReferenceSpaceType searchReferenceType, - ColorSpaceVisibility visibility) const; + int getNumColorSpaces( + SearchReferenceSpaceType searchReferenceType, + ColorSpaceVisibility visibility) const; /** * \brief Work on the color spaces selected by the reference color space * type and visibility (active or inactive). - * + * * Return empty for invalid index. */ - const char * getColorSpaceNameByIndex(SearchReferenceSpaceType searchReferenceType, - ColorSpaceVisibility visibility, int index) const; + const char * getColorSpaceNameByIndex( + SearchReferenceSpaceType searchReferenceType, + ColorSpaceVisibility visibility, + int index) const; /** * \brief Work on the active color spaces only. - * + * * \note * Only works from the list of active color spaces. */ @@ -592,7 +590,7 @@ class OCIOEXPORT Config /** * Work on the active color spaces only and return null for invalid index. - * + * * \note * Only works from the list of active color spaces. */ @@ -685,46 +683,46 @@ class OCIOEXPORT Config /// Return true if the color space name is present in the inactive_colorspaces list. bool isInactiveColorSpace(const char * colorspace) const noexcept; - + /** * \brief Return true if the specified color space is linear. - * - * The determination of linearity is made with respect to one of the two reference spaces - * (i.e., either the scene-referred one or the display-referred one). If the reference space - * type of the color space is the opposite of the requested reference space type, false is - * returned immediately rather than trying to invoke the default view transform to convert + * + * The determination of linearity is made with respect to one of the two reference spaces + * (i.e., either the scene-referred one or the display-referred one). If the reference space + * type of the color space is the opposite of the requested reference space type, false is + * returned immediately rather than trying to invoke the default view transform to convert * between the reference spaces. - * - * Note: This function relies on heuristics that may sometimes give an incorrect result. - * For example, if the encoding attribute is not set appropriately or the sampled values fail + * + * Note: This function relies on heuristics that may sometimes give an incorrect result. + * For example, if the encoding attribute is not set appropriately or the sampled values fail * to detect non-linearity. - * + * * The algorithm proceeds as follows: * -- If the color space isdata attribute is true, return false. - * -- If the reference space type of the color space differs from the requested reference + * -- If the reference space type of the color space differs from the requested reference * space type, return false. - * -- If the color space's encoding attribute is present, return true if it matches the - * expected reference space type (i.e., "scene-linear" for REFERENCE_SPACE_SCENE or + * -- If the color space's encoding attribute is present, return true if it matches the + * expected reference space type (i.e., "scene-linear" for REFERENCE_SPACE_SCENE or * "display-linear" for REFERENCE_SPACE_DISPLAY) and false otherwise. * -- If the color space has no to_reference or from_reference transform, return true. - * -- Evaluate several points through the color space's transform and check if the output only + * -- Evaluate several points through the color space's transform and check if the output only * differs by a scale factor (which may be different per channel, e.g. allowing an arbitrary * matrix transform, with no offset). - * - * Note that the encoding test happens before the sampled value test to give config authors - * ultimate control over the linearity determination. For example, they could set the encoding - * attribute to indicate linearity if they want to ignore some areas of non-linearity - * (e.g., at extreme values). Or they could set it to indicate that a color space should not + * + * Note that the encoding test happens before the sampled value test to give config authors + * ultimate control over the linearity determination. For example, they could set the encoding + * attribute to indicate linearity if they want to ignore some areas of non-linearity + * (e.g., at extreme values). Or they could set it to indicate that a color space should not * be considered linear, even if it is, in a mathematical sense. - * + * * \param colorSpace Color space to evaluate. - * \param referenceSpaceType Evaluate linearity with respect to the specified reference space + * \param referenceSpaceType Evaluate linearity with respect to the specified reference space * (either scene-referred or display-referred). */ bool isColorSpaceLinear(const char * colorSpace, ReferenceSpaceType referenceSpaceType) const; /** - * \brief Find the name of the color space in the source config that is the same as + * \brief Find the name of the color space in the source config that is the same as * a color space in the default built-in config. For example, setting the * builtinColorSpaceName to "sRGB - Texture" (a color space name from that * config), would return the name for the corresponding sRGB texture space in @@ -734,20 +732,22 @@ class OCIOEXPORT Config * * The method only looks at active color spaces. If the interchange roles are * missing and heuristics are used, only scene-referred color spaces are searched. - * + * * \param srcConfig The config to search for the desired color space. * \param builtinConfig The built-in config to use. See \ref Config::CreateFromBuiltinConfig. * \param builtinColorSpaceName Color space name in the built-in default config. * \return Matching color space name from the source config. Empty if not found. - * - * \throw Exception if an interchange space cannot be found or the equivalent space cannot be found. + * + * \throw Exception if an interchange space cannot be found or the equivalent space cannot be + * found. */ - static const char * IdentifyBuiltinColorSpace(const ConstConfigRcPtr & srcConfig, - const ConstConfigRcPtr & builtinConfig, - const char * builtinColorSpaceName); + static const char * IdentifyBuiltinColorSpace( + const ConstConfigRcPtr & srcConfig, + const ConstConfigRcPtr & builtinConfig, + const char * builtinColorSpaceName); /** - * \brief Identify the two names of a common color space that exists in both the + * \brief Identify the two names of a common color space that exists in both the * given config and the provided built-in config that may be used for converting * color spaces between the two configs. If both configs have the interchange * role set, than the color spaces set to that role will be returned. Otherwise, @@ -756,7 +756,7 @@ class OCIOEXPORT Config * identifyBuiltinColorSpace and GetProcessorTo/FromBuiltinColorSpace. * * Using this method in connection with GetProcessorFromConfigs is more efficient - * if you need to call GetProcessorTo/FromBuiltinColorSpace multiple times since it + * if you need to call GetProcessorTo/FromBuiltinColorSpace multiple times since it * is only necessary to run the heuristics once (to identify the interchange spaces). * * The srcColorSpaceName and builtinColorSpace name are used to decide which @@ -766,32 +766,33 @@ class OCIOEXPORT Config * so it is not necessary to call this function multiple times if all the spaces * are of the same type. (These are the same arguments that would also be set if * you were instead calling GetProcessorTo/FromBuiltinColorSpace.) - * + * * \param[out] srcInterchangeName Color space name from the source config. * \param[out] builtinInterchangeName Corresponding color space name from the built-in config. * \param srcConfig The config to search for the desired color space. * \param srcColorSpaceName Color space name in the given config to convert to/from. * \param builtinConfig The built-in config to use. See \ref Config::CreateFromBuiltinConfig. * \param builtinColorSpaceName Color space name in the default built-in config. - * + * * \throw Exception if either the srcInterchange or builtinInterchange cannot be identified. */ - static void IdentifyInterchangeSpace(const char ** srcInterchangeName, - const char ** builtinInterchangeName, - const ConstConfigRcPtr & srcConfig, - const char * srcColorSpaceName, - const ConstConfigRcPtr & builtinConfig, - const char * builtinColorSpaceName); + static void IdentifyInterchangeSpace( + const char ** srcInterchangeName, + const char ** builtinInterchangeName, + const ConstConfigRcPtr & srcConfig, + const char * srcColorSpaceName, + const ConstConfigRcPtr & builtinConfig, + const char * builtinColorSpaceName); /** * Methods related to Roles. * * A role allows a config author to indicate that a given color space should be used - * for a particular purpose. + * for a particular purpose. * - * Role names may be passed to most functions that accept color space names, such as - * getColorSpace. So for example, you may find the name of the color space assigned - * to the scene_linear role by getting the color space object for "scene_linear" and + * Role names may be passed to most functions that accept color space names, such as + * getColorSpace. So for example, you may find the name of the color space assigned + * to the scene_linear role by getting the color space object for "scene_linear" and * then calling getName on the color space object. */ @@ -808,19 +809,19 @@ class OCIOEXPORT Config /** * \brief Get the role name at index, this will return values * like 'scene_linear', 'compositing_log'. - * + * * Return empty string if index is out of range. */ const char * getRoleName(int index) const; /** * \brief Get the role color space at index. - * + * * Return empty string if index is out of range. */ const char * getRoleColorSpace(int index) const; /** * \brief Get the color space name used for the specified role. - * + * * Return an empty string if the role is not present */ const char * getRoleColorSpace(const char * roleName) const noexcept; @@ -850,9 +851,13 @@ class OCIOEXPORT Config * the matching display color space. */ /// Will throw if view or colorSpaceName are null or empty. - void addSharedView(const char * view, const char * viewTransformName, - const char * colorSpaceName, const char * looks, - const char * ruleName, const char * description); + void addSharedView( + const char * view, + const char * viewTransformName, + const char * colorSpaceName, + const char * looks, + const char * ruleName, + const char * description); /// Remove a shared view. Will throw if the view does not exist. void removeSharedView(const char * view); @@ -901,12 +906,15 @@ class OCIOEXPORT Config * For the (display, view) pair, specify which color space and look to use. * If a look is not desired, then just pass a null or empty string. */ - void addDisplayView(const char * display, const char * view, - const char * colorSpaceName, const char * looks); + void addDisplayView( + const char * display, + const char * view, + const char * colorSpaceName, + const char * looks); /** * \brief - * + * * For the (display, view) pair, specify the color space or alternatively * specify the view transform and display color space. The looks, viewing rule, and * description are optional. Pass a null or empty string for any optional arguments. @@ -916,15 +924,20 @@ class OCIOEXPORT Config * * Display, view or colorSpace are null or empty. * * Display already has a shared view with the same name. */ - void addDisplayView(const char * display, const char * view, const char * viewTransformName, - const char * colorSpaceName, const char * looks, - const char * ruleName, const char * description); + void addDisplayView( + const char * display, + const char * view, + const char * viewTransformName, + const char * colorSpaceName, + const char * looks, + const char * ruleName, + const char * description); /** * \brief Add a (reference to a) shared view to a display. - * + * * The shared view must be part of the config. See \ref Config::addSharedView - * + * * This will throw if: * * Display or view are null or empty. * * Display already has a view (shared or not) with the same name. @@ -933,11 +946,11 @@ class OCIOEXPORT Config /** * \brief Remove the view and the display if no more views. - * + * * It does not remove the associated color space. If the view name is a * shared view, it only removes the reference to the view from the display * but the shared view, remains in the config. - * + * * Will throw if the view does not exist. */ void removeDisplayView(const char * display, const char * view); @@ -954,18 +967,19 @@ class OCIOEXPORT Config * create a new display for an ICC profile. They serve as a kind of template that lets OCIO * know how to build the new display. * - * Typically the views will define a View Transform and set the colorSpaceName to + * Typically the views will define a View Transform and set the colorSpaceName to * "" so that it will use the display color space with the same name as the * display, in this case corresponding to the ICC profile. * */ - void addVirtualDisplayView(const char * view, - const char * viewTransformName, - const char * colorSpaceName, - const char * looks, - const char * ruleName, - const char * description); + void addVirtualDisplayView( + const char * view, + const char * viewTransformName, + const char * colorSpaceName, + const char * looks, + const char * ruleName, + const char * description); void addVirtualDisplaySharedView(const char * sharedView); @@ -988,7 +1002,7 @@ class OCIOEXPORT Config /** * \brief Instantiate a new display from a virtual display, using the monitor name. - * + * * This method uses the virtual display to create an actual display for the given monitorName. * The new display will receive the views from the virtual display. * @@ -1004,7 +1018,8 @@ class OCIOEXPORT Config * config file. If there is a need to make it a permanent color space, it may be desirable to * copy the ICC profile somewhere under the config search_path. * - * Will throw if the config does not have a virtual display or if the monitorName does not exist. + * Will throw if the config does not have a virtual display or if the monitorName does not + * exist. * * If there is already a display or a display color space with the name monitorName, it will be * replaced/updated. @@ -1015,10 +1030,11 @@ class OCIOEXPORT Config /** * \brief Instantiate a new display from a virtual display, using an ICC profile. - * + * * On platforms such as Linux, where the SystemMonitors class is not able to obtain a list of - * ICC profiles from the OS, this method may be used to manually specify a path to an ICC profile. - * + * ICC profiles from the OS, this method may be used to manually specify a path to an ICC + * profile. + * * Will throw if the virtual display definition is missing from the config. * * Returns the index of the display. @@ -1027,14 +1043,14 @@ class OCIOEXPORT Config /** * \brief - * + * * $OCIO_ACTIVE_DISPLAYS envvar can, at runtime, optionally override the * allowed displays. It is a comma or colon delimited list. Active displays * that are not in the specified profile will be ignored, and the * left-most defined display will be the default. - * + * * Comma-delimited list of names to filter and order the active displays. - * + * * \note * The setter does not override the envvar. The getter does not take into * account the envvar value and thus may not represent what the user is seeing. @@ -1044,14 +1060,14 @@ class OCIOEXPORT Config /** * \brief - * + * * $OCIO_ACTIVE_VIEWS envvar can, at runtime, optionally override the allowed views. * It is a comma or colon delimited list. * Active views that are not in the specified profile will be ignored, and the * left-most defined view will be the default. - * + * * Comma-delimited list of names to filter and order the active views. - * + * * \note * The setter does not override the envvar. The getter does not take * into account the envvar value and thus may not represent what the @@ -1079,7 +1095,7 @@ class OCIOEXPORT Config int getNumViews(ViewType type, const char * display) const; const char * getView(ViewType type, const char * display, int index) const; - // + // // Viewing Rules // @@ -1088,13 +1104,13 @@ class OCIOEXPORT Config /** * \brief Set viewing rules. - * + * * \note * The argument is cloned. */ void setViewingRules(ConstViewingRulesRcPtr viewingRules); - // + // // Luma // ^^^^ @@ -1115,8 +1131,7 @@ class OCIOEXPORT Config /// These should be normalized (sum to 1.0 exactly). void setDefaultLumaCoefs(const double * rgb); - - // + // // Look // @@ -1132,7 +1147,6 @@ class OCIOEXPORT Config void clearLooks(); - // // View Transforms // @@ -1149,7 +1163,7 @@ class OCIOEXPORT Config /** * \brief - * + * * This view transform is the one that will be used by default if a ColorSpaceTransform is * needed between a scene-referred and display-referred color space. The config author may * specify a transform to use via the default_view_transform entry in the config. If that is @@ -1161,14 +1175,13 @@ class OCIOEXPORT Config /** * Get or set the default_view_transform string from the config. - * + * * Note that if this is not the name of a valid view transform from the scene-referred * connection space, it will be ignored. */ const char * getDefaultViewTransformName() const noexcept; void setDefaultViewTransformName(const char * defaultName) noexcept; - void clearViewTransforms(); /** @@ -1185,8 +1198,8 @@ class OCIOEXPORT Config * * Return an empty string for invalid index. */ - const char * getNamedTransformNameByIndex(NamedTransformVisibility visibility, - int index) const noexcept; + const char * getNamedTransformNameByIndex(NamedTransformVisibility visibility, int index) + const noexcept; /// Work on the active named transforms only. int getNumNamedTransforms() const noexcept; @@ -1215,7 +1228,7 @@ class OCIOEXPORT Config /// Clear all named transforms. void clearNamedTransforms(); - // + // // File Rules // @@ -1224,7 +1237,7 @@ class OCIOEXPORT Config /** * \brief Set file rules. - * + * * \note * The argument is cloned. */ @@ -1244,7 +1257,7 @@ class OCIOEXPORT Config /** * \brief - * + * * Returns true if the only rule matched by filePath is the default rule. * This is a convenience method for applications that want to require the user to manually * choose a color space when strictParsing is true and no other rules match. @@ -1260,7 +1273,8 @@ class OCIOEXPORT Config * * If strict parsing is disabled, return ROLE_DEFAULT (if defined). * * If the default role is not defined, return an empty string. */ - OCIO_DEPRECATED("This was marked as deprecated starting in v2.0, please use Config::getColorSpaceFromFilepath().") + OCIO_DEPRECATED("This was marked as deprecated starting in v2.0, please use " + "Config::getColorSpaceFromFilepath().") const char * parseColorSpaceFromString(const char * str) const; bool isStrictParsingEnabled() const; @@ -1276,11 +1290,13 @@ class OCIOEXPORT Config /// Get the processor to apply a ColorSpaceTransform from a source to a destination /// color space. - ConstProcessorRcPtr getProcessor(const ConstContextRcPtr & context, - const ConstColorSpaceRcPtr & srcColorSpace, - const ConstColorSpaceRcPtr & dstColorSpace) const; - ConstProcessorRcPtr getProcessor(const ConstColorSpaceRcPtr & srcColorSpace, - const ConstColorSpaceRcPtr & dstColorSpace) const; + ConstProcessorRcPtr getProcessor( + const ConstContextRcPtr & context, + const ConstColorSpaceRcPtr & srcColorSpace, + const ConstColorSpaceRcPtr & dstColorSpace) const; + ConstProcessorRcPtr getProcessor( + const ConstColorSpaceRcPtr & srcColorSpace, + const ConstColorSpaceRcPtr & dstColorSpace) const; /** * \brief @@ -1288,189 +1304,208 @@ class OCIOEXPORT Config * \note * Names can be colorspace name, role name, or a combination of both. */ - ConstProcessorRcPtr getProcessor(const char * srcColorSpaceName, - const char * dstColorSpaceName) const; - ConstProcessorRcPtr getProcessor(const ConstContextRcPtr & context, - const char * srcColorSpaceName, - const char * dstColorSpaceName) const; - + ConstProcessorRcPtr getProcessor(const char * srcColorSpaceName, const char * dstColorSpaceName) + const; + ConstProcessorRcPtr getProcessor( + const ConstContextRcPtr & context, + const char * srcColorSpaceName, + const char * dstColorSpaceName) const; + /// Get the processor to apply a DisplayViewTransform for a display and view. Refer to the /// Display/View Registration section above for more info on the display and view arguments. - ConstProcessorRcPtr getProcessor(const char * srcColorSpaceName, - const char * display, - const char * view, - TransformDirection direction) const; - - ConstProcessorRcPtr getProcessor(const ConstContextRcPtr & context, - const char * srcColorSpaceName, - const char * display, - const char * view, - TransformDirection direction) const; + ConstProcessorRcPtr getProcessor( + const char * srcColorSpaceName, + const char * display, + const char * view, + TransformDirection direction) const; + + ConstProcessorRcPtr getProcessor( + const ConstContextRcPtr & context, + const char * srcColorSpaceName, + const char * display, + const char * view, + TransformDirection direction) const; /// Get the processor to apply a NamedTransform in the specified direction. - ConstProcessorRcPtr getProcessor(const ConstNamedTransformRcPtr & namedTransform, - TransformDirection direction) const; - ConstProcessorRcPtr getProcessor(const ConstContextRcPtr & context, - const ConstNamedTransformRcPtr & namedTransform, - TransformDirection direction) const; - - ConstProcessorRcPtr getProcessor(const char * namedTransformName, - TransformDirection direction) const; - ConstProcessorRcPtr getProcessor(const ConstContextRcPtr & context, - const char * namedTransformName, - TransformDirection direction) const; + ConstProcessorRcPtr getProcessor( + const ConstNamedTransformRcPtr & namedTransform, + TransformDirection direction) const; + ConstProcessorRcPtr getProcessor( + const ConstContextRcPtr & context, + const ConstNamedTransformRcPtr & namedTransform, + TransformDirection direction) const; + + ConstProcessorRcPtr getProcessor(const char * namedTransformName, TransformDirection direction) + const; + ConstProcessorRcPtr getProcessor( + const ConstContextRcPtr & context, + const char * namedTransformName, + TransformDirection direction) const; /** * \brief Get the processor for the specified transform. - * + * * Not often needed, but will allow for the re-use of atomic OCIO * functionality (such as to apply an individual LUT file). */ ConstProcessorRcPtr getProcessor(const ConstTransformRcPtr & transform) const; - ConstProcessorRcPtr getProcessor(const ConstTransformRcPtr & transform, - TransformDirection direction) const; - ConstProcessorRcPtr getProcessor(const ConstContextRcPtr & context, - const ConstTransformRcPtr & transform, - TransformDirection direction) const; + ConstProcessorRcPtr getProcessor( + const ConstTransformRcPtr & transform, + TransformDirection direction) const; + ConstProcessorRcPtr getProcessor( + const ConstContextRcPtr & context, + const ConstTransformRcPtr & transform, + TransformDirection direction) const; /** * \brief Get a Processor to or from a known external color space. - * - * These methods provide a way to interface color spaces in a config with known standard - * external color spaces. The set of external color space are those contained in the current - * default Built-in config. This includes common spaces such as "Linear Rec.709 (sRGB)", + * + * These methods provide a way to interface color spaces in a config with known standard + * external color spaces. The set of external color space are those contained in the current + * default Built-in config. This includes common spaces such as "Linear Rec.709 (sRGB)", * "sRGB - Texture", "ACEScg", and "ACES2065-1". - * - * If the source config defines the necessary Interchange Role (typically "aces_interchange"), + * + * If the source config defines the necessary Interchange Role (typically "aces_interchange"), * then the conversion will be well-defined and equivalent to calling GetProcessorFromConfigs * with the source config and the Built-in config. - * - * However, if the Interchange Roles are not present, heuristics will be used to try and - * identify a common color space in the source config that may be used to allow the conversion - * to proceed. If the heuristics fail to find a suitable space, an exception is thrown. - * The heuristics may evolve, so the results returned by this function for a given source config - * and color space may change in future releases of the library. However, the Interchange Roles - * are required in config versions 2.2 and higher, so it is hoped that the need for the heuristics - * will decrease over time. - * + * + * However, if the Interchange Roles are not present, heuristics will be used to try and + * identify a common color space in the source config that may be used to allow the conversion + * to proceed. If the heuristics fail to find a suitable space, an exception is thrown. + * The heuristics may evolve, so the results returned by this function for a given source config + * and color space may change in future releases of the library. However, the Interchange Roles + * are required in config versions 2.2 and higher, so it is hoped that the need for the + * heuristics will decrease over time. + * * \param srcConfig The user's source config. * \param srcColorSpaceName The name of the color space in the source config. - * \param builtinColorSpaceName The name of the color space in the current default Built-in config. - * + * \param builtinColorSpaceName The name of the color space in the current default Built-in + * config. + * * \throw Exception if either the src or builtin interchange space cannot be identified. */ - static ConstProcessorRcPtr GetProcessorToBuiltinColorSpace(ConstConfigRcPtr srcConfig, - const char * srcColorSpaceName, - const char * builtinColorSpaceName); + static ConstProcessorRcPtr GetProcessorToBuiltinColorSpace( + ConstConfigRcPtr srcConfig, + const char * srcColorSpaceName, + const char * builtinColorSpaceName); /** * \brief See description of GetProcessorToBuiltinColorSpace. - * - * \param builtinColorSpaceName The name of the color space in the current default Built-in config. - * \param srcConfig The user's source config. - * \param srcColorSpaceName The name of the color space in the source config. + * + * \param builtinColorSpaceName The name of the color space in the current default Built-in + * config. \param srcConfig The user's source config. \param srcColorSpaceName The name of the + * color space in the source config. */ - static ConstProcessorRcPtr GetProcessorFromBuiltinColorSpace(const char * builtinColorSpaceName, - ConstConfigRcPtr srcConfig, - const char * srcColorSpaceName); + static ConstProcessorRcPtr GetProcessorFromBuiltinColorSpace( + const char * builtinColorSpaceName, + ConstConfigRcPtr srcConfig, + const char * srcColorSpaceName); /** * \brief Get a processor to convert between color spaces in two separate configs. - * + * * This relies on both configs having the aces_interchange role (when srcName * is scene-referred) or the role cie_xyz_d65_interchange (when srcName is * display-referred) defined. An exception is thrown if that is not the case. */ - static ConstProcessorRcPtr GetProcessorFromConfigs(const ConstConfigRcPtr & srcConfig, - const char * srcColorSpaceName, - const ConstConfigRcPtr & dstConfig, - const char * dstColorSpaceName); - static ConstProcessorRcPtr GetProcessorFromConfigs(const ConstContextRcPtr & srcContext, - const ConstConfigRcPtr & srcConfig, - const char * srcColorSpaceName, - const ConstContextRcPtr & dstContext, - const ConstConfigRcPtr & dstConfig, - const char * dstColorSpaceName); + static ConstProcessorRcPtr GetProcessorFromConfigs( + const ConstConfigRcPtr & srcConfig, + const char * srcColorSpaceName, + const ConstConfigRcPtr & dstConfig, + const char * dstColorSpaceName); + static ConstProcessorRcPtr GetProcessorFromConfigs( + const ConstContextRcPtr & srcContext, + const ConstConfigRcPtr & srcConfig, + const char * srcColorSpaceName, + const ConstContextRcPtr & dstContext, + const ConstConfigRcPtr & dstConfig, + const char * dstColorSpaceName); /** * The srcInterchangeName and dstInterchangeName must refer to a pair of * color spaces in the two configs that are the same. A role name may also be used. * - * Note: For all of the two-config GetProcessor functions, if either the source or + * Note: For all of the two-config GetProcessor functions, if either the source or * destination color spaces are data spaces, the entire processor will be a no-op. */ - static ConstProcessorRcPtr GetProcessorFromConfigs(const ConstConfigRcPtr & srcConfig, - const char * srcColorSpaceName, - const char * srcInterchangeName, - const ConstConfigRcPtr & dstConfig, - const char * dstColorSpaceName, - const char * dstInterchangeName); - - static ConstProcessorRcPtr GetProcessorFromConfigs(const ConstContextRcPtr & srcContext, - const ConstConfigRcPtr & srcConfig, - const char * srcColorSpaceName, - const char * srcInterchangeName, - const ConstContextRcPtr & dstContext, - const ConstConfigRcPtr & dstConfig, - const char * dstColorSpaceName, - const char * dstInterchangeName); + static ConstProcessorRcPtr GetProcessorFromConfigs( + const ConstConfigRcPtr & srcConfig, + const char * srcColorSpaceName, + const char * srcInterchangeName, + const ConstConfigRcPtr & dstConfig, + const char * dstColorSpaceName, + const char * dstInterchangeName); + + static ConstProcessorRcPtr GetProcessorFromConfigs( + const ConstContextRcPtr & srcContext, + const ConstConfigRcPtr & srcConfig, + const char * srcColorSpaceName, + const char * srcInterchangeName, + const ConstContextRcPtr & dstContext, + const ConstConfigRcPtr & dstConfig, + const char * dstColorSpaceName, + const char * dstInterchangeName); /** * \brief Get a processor to convert from a color space to a display and view in * two separate configs. */ - static ConstProcessorRcPtr GetProcessorFromConfigs(const ConstConfigRcPtr & srcConfig, - const char * srcColorSpaceName, - const ConstConfigRcPtr & dstConfig, - const char * dstDisplay, - const char * dstView, - TransformDirection direction); - - static ConstProcessorRcPtr GetProcessorFromConfigs(const ConstContextRcPtr & srcContext, - const ConstConfigRcPtr & srcConfig, - const char * srcColorSpaceName, - const ConstContextRcPtr & dstContext, - const ConstConfigRcPtr & dstConfig, - const char * dstDisplay, - const char * dstView, - TransformDirection direction); + static ConstProcessorRcPtr GetProcessorFromConfigs( + const ConstConfigRcPtr & srcConfig, + const char * srcColorSpaceName, + const ConstConfigRcPtr & dstConfig, + const char * dstDisplay, + const char * dstView, + TransformDirection direction); + + static ConstProcessorRcPtr GetProcessorFromConfigs( + const ConstContextRcPtr & srcContext, + const ConstConfigRcPtr & srcConfig, + const char * srcColorSpaceName, + const ConstContextRcPtr & dstContext, + const ConstConfigRcPtr & dstConfig, + const char * dstDisplay, + const char * dstView, + TransformDirection direction); /** * The srcInterchangeName and dstInterchangeName must refer to a pair of * color spaces in the two configs that are the same. A role name may also be used. */ - static ConstProcessorRcPtr GetProcessorFromConfigs(const ConstConfigRcPtr & srcConfig, - const char * srcColorSpaceName, - const char * srcInterchangeName, - const ConstConfigRcPtr & dstConfig, - const char * dstDisplay, - const char * dstView, - const char * dstInterchangeName, - TransformDirection direction); - - static ConstProcessorRcPtr GetProcessorFromConfigs(const ConstContextRcPtr & srcContext, - const ConstConfigRcPtr & srcConfig, - const char * srcColorSpaceName, - const char * srcInterchangeName, - const ConstContextRcPtr & dstContext, - const ConstConfigRcPtr & dstConfig, - const char * dstDisplay, - const char * dstView, - const char * dstInterchangeName, - TransformDirection direction); + static ConstProcessorRcPtr GetProcessorFromConfigs( + const ConstConfigRcPtr & srcConfig, + const char * srcColorSpaceName, + const char * srcInterchangeName, + const ConstConfigRcPtr & dstConfig, + const char * dstDisplay, + const char * dstView, + const char * dstInterchangeName, + TransformDirection direction); + + static ConstProcessorRcPtr GetProcessorFromConfigs( + const ConstContextRcPtr & srcContext, + const ConstConfigRcPtr & srcConfig, + const char * srcColorSpaceName, + const char * srcInterchangeName, + const ConstContextRcPtr & dstContext, + const ConstConfigRcPtr & dstConfig, + const char * dstDisplay, + const char * dstView, + const char * dstInterchangeName, + TransformDirection direction); /// Get the Processor Cache flags. ProcessorCacheFlags getProcessorCacheFlags() const noexcept; - /// Control the caching of processors in the config instance. By default, caching is on. + /// Control the caching of processors in the config instance. By default, caching is on. /// The flags allow turning caching off entirely or only turning it off if dynamic /// properties are being used by the processor. void setProcessorCacheFlags(ProcessorCacheFlags flags) const noexcept; /** - * \brief Clears this config's cache of Processor, CPUProcessor, and GPUProcessor instances. - * - * This must be done if any of the LUT files used by these Processors have been modified. - * Note that setProcessorCacheFlags(PROCESSOR_CACHE_OFF) turns off caching but does not clear + * \brief Clears this config's cache of Processor, CPUProcessor, and GPUProcessor instances. + * + * This must be done if any of the LUT files used by these Processors have been modified. + * Note that setProcessorCacheFlags(PROCESSOR_CACHE_OFF) turns off caching but does not clear * any existing cache. */ void clearProcessorCache() noexcept; @@ -1488,26 +1523,26 @@ class OCIOEXPORT Config * -- It contains FileTransforms with a src outside the working directory * -- The search path contains paths outside the working directory * -- The search path contains paths that start with a context variable - * + * * Context variables are allowed but the intent is that they may only resolve to paths that * are within or below the working directory. This is because the archiving function will * only archive files that are within the working directory in order to ensure that if it is * later expanded, that it will not create any files outside this directory. * - * For example, a context variable on the search path intended to contain the name of a + * For example, a context variable on the search path intended to contain the name of a * sub-directory under the working directory must have the form "./$DIR_NAME" rather than just * "$DIR_NAME" to be considered archivable. This is imperfect since there is no way to * prevent the context variable from creating a path outside the working dir, but it should * at least draw attention to the fact that the archive would fail if used with context vars * that try to abuse the intended functionality. - * + * * \return bool Archivable if true. */ bool isArchivable() const; /** * \brief Archive the config and its LUTs into the specified output stream. - * + * * The config is archived by serializing the Config object into a file named "config.ocio" and * then walking through the current working directory and any sub-directories. Any files that * have an extension matching a supported LUT file format are added to the archive. Any files @@ -1520,19 +1555,19 @@ class OCIOEXPORT Config * The reason the archive is created using all supported LUT file extensions rather than by * trying to resolve all the FileTransforms in the Config to specific files is because of the * goal to allow context variables to continue to work. - * - * If a Config is created with CreateFromStream, CreateFromFile with an OCIOZ archive, or - * CreateFromConfigIOProxy, it cannot be archived unless the working directory is manually set - * to a directory that contains any necessary LUT files. - * + * + * If a Config is created with CreateFromStream, CreateFromFile with an OCIOZ archive, or + * CreateFromConfigIOProxy, it cannot be archived unless the working directory is manually set + * to a directory that contains any necessary LUT files. + * * The provided output stream must be closed by the caller, if necessary (e.g., an ofstream). * * \param ostream The output stream to write to. */ void archive(std::ostream & ostream) const; - Config(const Config &) = delete; - Config& operator= (const Config &) = delete; + Config(const Config &) = delete; + Config & operator=(const Config &) = delete; /// Do not use (needed only for pybind11). ~Config(); @@ -1540,7 +1575,7 @@ class OCIOEXPORT Config private: Config(); - static void deleter(Config* c); + static void deleter(Config * c); class Impl; Impl * m_impl; @@ -1548,8 +1583,7 @@ class OCIOEXPORT Config const Impl * getImpl() const { return m_impl; } }; -extern OCIOEXPORT std::ostream& operator<< (std::ostream&, const Config&); - +extern OCIOEXPORT std::ostream & operator<<(std::ostream &, const Config &); /** * \brief @@ -1566,13 +1600,13 @@ extern OCIOEXPORT std::ostream& operator<< (std::ostream&, const Config&); * * pattern: Glob pattern to be used for the main part of the name/path. * * extension: Glob pattern to be used for the file extension. Note that if glob tokens * are not used, the extension will be used in a non-case-sensitive way by default. - * + * * * *Regex Rule*: This is similar to the basic rule but allows additional capabilities for * power-users. It contains the keys: * * name: Name of the rule * * colorspace: Color space name to be returned. * * regex: Regular expression to be evaluated. - * + * * * *OCIO v1 style Rule*: This rule allows the use of the OCIO v1 style, where the string * is searched for color space names from the config. This rule may occur 0 or 1 times * in the list. The position in the list prioritizes it with respect to the other rules. @@ -1581,7 +1615,7 @@ extern OCIOEXPORT std::ostream& operator<< (std::ostream&, const Config&); * see \ref insertPathSearchRule. * It has the key: * * name: Must be "ColorSpaceNamePathSearch". - * + * * * *Default Rule*: The file_rules must always end with this rule. If no prior rules match, * this rule specifies the color space applications will use. * see \ref setDefaultRuleColorSpace. @@ -1598,14 +1632,13 @@ extern OCIOEXPORT std::ostream& operator<< (std::ostream&, const Config&); * getter will return NULL and setter will throw. * * When loading a v1 config, a set of FileRules are created with ColorSpaceNamePathSearch followed - * by the Default rule pointing to the default role. This allows getColorSpaceFromFilepath to emulate - * OCIO v1 code that used parseColorSpaceFromString with strictparsing set to false. + * by the Default rule pointing to the default role. This allows getColorSpaceFromFilepath to + * emulate OCIO v1 code that used parseColorSpaceFromString with strictparsing set to false. */ class OCIOEXPORT FileRules { public: - /// Reserved rule name for the default rule. static const char * DefaultRuleName; /// Reserved rule name for the file path search rule \see FileRules::insertPathSearchRule. @@ -1659,7 +1692,7 @@ class OCIOEXPORT FileRules /** * \brief Insert a rule at a given ruleIndex. - * + * * Rule currently at ruleIndex will be pushed to index: ruleIndex + 1. * Name must be unique. * - "Default" is a reserved name for the default rule. The default rule is automatically @@ -1671,13 +1704,17 @@ class OCIOEXPORT FileRules * * Will throw if ruleIndex is not less than \ref FileRules::getNumEntries . */ - void insertRule(size_t ruleIndex, const char * name, const char * colorSpace, - const char * pattern, const char * extension); - void insertRule(size_t ruleIndex, const char * name, const char * colorSpace, - const char * regex); + void insertRule( + size_t ruleIndex, + const char * name, + const char * colorSpace, + const char * pattern, + const char * extension); + void + insertRule(size_t ruleIndex, const char * name, const char * colorSpace, const char * regex); /** - * \brief Helper function to insert a rule. - * + * \brief Helper function to insert a rule. + * * Uses \ref Config:parseColorSpaceFromString to search the path for any of * the color spaces named in the config (as per OCIO v1). */ @@ -1687,7 +1724,7 @@ class OCIOEXPORT FileRules /** * \brief - * + * * \note * Default rule can't be removed. * Will throw if ruleIndex + 1 is not less than \ref FileRules::getNumEntries . @@ -1706,8 +1743,8 @@ class OCIOEXPORT FileRules */ bool isDefault() const noexcept; - FileRules(const FileRules &) = delete; - FileRules & operator= (const FileRules &) = delete; + FileRules(const FileRules &) = delete; + FileRules & operator=(const FileRules &) = delete; /// Do not use (needed only for pybind11). virtual ~FileRules(); @@ -1715,7 +1752,7 @@ class OCIOEXPORT FileRules private: FileRules(); - static void deleter(FileRules* c); + static void deleter(FileRules * c); friend class Config; @@ -1725,19 +1762,17 @@ class OCIOEXPORT FileRules const Impl * getImpl() const { return m_impl; } }; -extern OCIOEXPORT std::ostream & operator<< (std::ostream &, const FileRules &); - - +extern OCIOEXPORT std::ostream & operator<<(std::ostream &, const FileRules &); /** * ViewingRules - * + * * Viewing Rules allow config authors to filter the list of views an application should offer * based on the color space of an image. For example, a config may define a large number of * views but not all of them may be appropriate for use with all color spaces. E.g., some views * may be intended for use with scene-linear color space encodings and others with video color * space encodings. - * + * * Each rule has a name key for applications to refer to the rule. Name values must be unique * (using case insensitive comparison). Viewing Rules may also have the following keys: * @@ -1750,7 +1785,7 @@ extern OCIOEXPORT std::ostream & operator<< (std::ostream &, const FileRules &); * * Getters and setters are using the rule position, they will throw if the position is not * valid. -*/ + */ class OCIOEXPORT ViewingRules { public: @@ -1777,7 +1812,7 @@ class OCIOEXPORT ViewingRules const char * getColorSpace(size_t ruleIndex, size_t colorSpaceIndex) const; /** * \brief - * + * * Add colorspace name. Will throw if: * * RuleIndex is invalid. * * \ref ViewingRules::getNumEncodings is not 0. @@ -1815,8 +1850,8 @@ class OCIOEXPORT ViewingRules /** * \brief Insert a rule at a given ruleIndex. - * - * Rule currently at ruleIndex will be pushed to index: ruleIndex + 1. If ruleIndex is + * + * Rule currently at ruleIndex will be pushed to index: ruleIndex + 1. If ruleIndex is * \ref ViewingRules::getNumEntries, a new rule will be added at the end. Will throw if: * * RuleIndex is invalid (must be less than or equal to * \ref ViewingRules::getNumEntries). @@ -1827,15 +1862,15 @@ class OCIOEXPORT ViewingRules /// Remove a rule. Throws if ruleIndex is not valid. void removeRule(size_t ruleIndex); - ViewingRules(const ViewingRules &) = delete; - ViewingRules & operator= (const ViewingRules &) = delete; + ViewingRules(const ViewingRules &) = delete; + ViewingRules & operator=(const ViewingRules &) = delete; /// Do not use (needed only for pybind11). virtual ~ViewingRules(); private: ViewingRules(); - static void deleter(ViewingRules* c); + static void deleter(ViewingRules * c); friend class Config; @@ -1845,7 +1880,7 @@ class OCIOEXPORT ViewingRules const Impl * getImpl() const { return m_impl; } }; -extern OCIOEXPORT std::ostream & operator<< (std::ostream &, const ViewingRules &); +extern OCIOEXPORT std::ostream & operator<<(std::ostream &, const ViewingRules &); // // ColorSpace @@ -1920,38 +1955,38 @@ class OCIOEXPORT ColorSpace // Categories // - /** + /** * A category is used to allow applications to filter the list of color spaces * they display in menus based on what that color space is used for. * * Here is an example config entry that could appear under a ColorSpace: - * + * * \code{.yaml} * categories: [ file-io, working-space, basic-3d ] * \endcode - * + * * The example contains three categories: 'file-io', 'working-space' and 'basic-3d'. - * + * * \note * Category strings are not case-sensitive and the order is not significant. - * + * * There is no limit imposed on length or number. Although users may add their own categories, - * the strings will typically come from a fixed set listed in the documentation (similar to + * the strings will typically come from a fixed set listed in the documentation (similar to * roles). */ /// Return true if the category is present. bool hasCategory(const char * category) const; /** * \brief Add a single category. - * + * * \note * Will do nothing if the category already exists. */ void addCategory(const char * category); /** * \brief Remove a category. - * - * \note + * + * \note * Will do nothing if the category is missing. */ void removeCategory(const char * category); @@ -1959,7 +1994,7 @@ class OCIOEXPORT ColorSpace int getNumCategories() const; /** * \brief Return the category name using its index - * + * * \note * Will be null if the index is invalid. */ @@ -1977,7 +2012,7 @@ class OCIOEXPORT ColorSpace * (rather than being config-specific) to make it easier for applications to utilize. * * Here is an example config entry that could appear under a ColorSpace: - * + * * \code{.yaml} * encoding: scene-linear * \endcode @@ -1990,7 +2025,7 @@ class OCIOEXPORT ColorSpace /** * *Data* - * + * * ColorSpaces that are data are treated a bit special. Basically, any colorspace transforms * you try to apply to them are ignored. (Think of applying a gamut mapping transform to an * ID pass). However, the setDataBypass method on ColorSpaceTransform and DisplayViewTransform @@ -2005,7 +2040,7 @@ class OCIOEXPORT ColorSpace /** * *Allocation* - * + * * If this colorspace needs to be transferred to a limited dynamic * range coding space (such as during display with a GPU path), use this * allocation to maximize bit efficiency. @@ -2032,7 +2067,7 @@ class OCIOEXPORT ColorSpace /** * *Transform* - * + * * If a transform in the specified direction has been specified, * return it. Otherwise return a null ConstTransformRcPtr */ @@ -2043,8 +2078,8 @@ class OCIOEXPORT ColorSpace */ void setTransform(const ConstTransformRcPtr & transform, ColorSpaceDirection dir); - ColorSpace(const ColorSpace &) = delete; - ColorSpace& operator= (const ColorSpace &) = delete; + ColorSpace(const ColorSpace &) = delete; + ColorSpace & operator=(const ColorSpace &) = delete; /// Do not use (needed only for pybind11). ~ColorSpace(); @@ -2052,7 +2087,7 @@ class OCIOEXPORT ColorSpace explicit ColorSpace(ReferenceSpaceType referenceSpace); ColorSpace(); - static void deleter(ColorSpace* c); + static void deleter(ColorSpace * c); class Impl; Impl * m_impl; @@ -2060,16 +2095,12 @@ class OCIOEXPORT ColorSpace const Impl * getImpl() const { return m_impl; } }; -extern OCIOEXPORT std::ostream& operator<< (std::ostream&, const ColorSpace&); - - - +extern OCIOEXPORT std::ostream & operator<<(std::ostream &, const ColorSpace &); // // ColorSpaceSet // - /** * The *ColorSpaceSet* is a set of color spaces (i.e. no color space duplication) * which could be the result of \ref Config::getColorSpaces @@ -2092,7 +2123,7 @@ class OCIOEXPORT ColorSpaceSet /** * \brief Return true if the two sets are equal. - * + * * \note * The comparison is done on the color space names (not a deep comparison). */ @@ -2115,29 +2146,29 @@ class OCIOEXPORT ColorSpaceSet /** * \brief - * + * * \note * Only accepts color space names (i.e. no role name). - * + * * Will return null if the name is not found. */ ConstColorSpaceRcPtr getColorSpace(const char * name) const; /** * Will return -1 if the name is not found. - * + * * \note * Only accepts color space names (i.e. no role name). */ int getColorSpaceIndex(const char * name) const; /** - * \brief - * + * \brief + * * \note * Only accepts color space names (i.e. no role name) - * - * \param name - * \return true - * \return false + * + * \param name + * \return true + * \return false */ bool hasColorSpace(const char * name) const; @@ -2172,7 +2203,7 @@ class OCIOEXPORT ColorSpaceSet ColorSpaceSet(); ColorSpaceSet(const ColorSpaceSet &); - ColorSpaceSet & operator= (const ColorSpaceSet &); + ColorSpaceSet & operator=(const ColorSpaceSet &); static void deleter(ColorSpaceSet * c); @@ -2187,41 +2218,40 @@ class OCIOEXPORT ColorSpaceSet /** * \brief Perform the union of two sets. - * + * * \note * This function provides operations on two color space sets * where the result contains copied color spaces and no duplicates. - * - * \param lcss - * \param rcss + * + * \param lcss + * \param rcss */ -extern OCIOEXPORT ConstColorSpaceSetRcPtr operator||(const ConstColorSpaceSetRcPtr & lcss, - const ConstColorSpaceSetRcPtr & rcss); - /** - * \brief Perform the intersection of two sets. - * - * \note - * This function provides operations on two color space sets - * where the result contains copied color spaces and no duplicates. - * - * \param lcss - * \param rcss +extern OCIOEXPORT ConstColorSpaceSetRcPtr +operator||(const ConstColorSpaceSetRcPtr & lcss, const ConstColorSpaceSetRcPtr & rcss); +/** + * \brief Perform the intersection of two sets. + * + * \note + * This function provides operations on two color space sets + * where the result contains copied color spaces and no duplicates. + * + * \param lcss + * \param rcss */ -extern OCIOEXPORT ConstColorSpaceSetRcPtr operator&&(const ConstColorSpaceSetRcPtr & lcss, - const ConstColorSpaceSetRcPtr & rcss); +extern OCIOEXPORT ConstColorSpaceSetRcPtr +operator&&(const ConstColorSpaceSetRcPtr & lcss, const ConstColorSpaceSetRcPtr & rcss); /** - * \brief Perform the difference of two sets. - * + * \brief Perform the difference of two sets. + * * \note * This function provides operations on two color space sets * where the result contains copied color spaces and no duplicates. * - * \param lcss - * \param rcss + * \param lcss + * \param rcss */ -extern OCIOEXPORT ConstColorSpaceSetRcPtr operator-(const ConstColorSpaceSetRcPtr & lcss, - const ConstColorSpaceSetRcPtr & rcss); - +extern OCIOEXPORT ConstColorSpaceSetRcPtr +operator-(const ConstColorSpaceSetRcPtr & lcss, const ConstColorSpaceSetRcPtr & rcss); // // Look @@ -2257,15 +2287,15 @@ class OCIOEXPORT Look const char * getDescription() const; void setDescription(const char * description); - Look(const Look &) = delete; - Look& operator= (const Look &) = delete; + Look(const Look &) = delete; + Look & operator=(const Look &) = delete; /// Do not use (needed only for pybind11). ~Look(); private: Look(); - static void deleter(Look* c); + static void deleter(Look * c); class Impl; Impl * m_impl; @@ -2273,8 +2303,7 @@ class OCIOEXPORT Look const Impl * getImpl() const { return m_impl; } }; -extern OCIOEXPORT std::ostream& operator<< (std::ostream&, const Look&); - +extern OCIOEXPORT std::ostream & operator<<(std::ostream &, const Look &); /** * \brief NamedTransform. @@ -2291,7 +2320,7 @@ class OCIOEXPORT NamedTransform virtual NamedTransformRcPtr createEditableCopy() const = 0; - virtual const char * getName() const noexcept = 0; + virtual const char * getName() const noexcept = 0; virtual void setName(const char * name) noexcept = 0; /// Aliases can be used instead of the name. They must be unique within the config. @@ -2299,20 +2328,20 @@ class OCIOEXPORT NamedTransform /// Return empty string if idx is out of range. virtual const char * getAlias(size_t idx) const noexcept = 0; /** - * Nothing is done if alias is NULL or empty, if it is already there, or if it is already - * the named transform name. - */ + * Nothing is done if alias is NULL or empty, if it is already there, or if it is already + * the named transform name. + */ virtual void addAlias(const char * alias) noexcept = 0; /// Does nothing if alias is not present. virtual void removeAlias(const char * alias) noexcept = 0; - virtual void clearAliases() noexcept = 0; + virtual void clearAliases() noexcept = 0; /// \see ColorSpace::getFamily virtual const char * getFamily() const noexcept = 0; /// \see ColorSpace::setFamily virtual void setFamily(const char * family) noexcept = 0; - virtual const char * getDescription() const noexcept = 0; + virtual const char * getDescription() const noexcept = 0; virtual void setDescription(const char * description) noexcept = 0; /// \see ColorSpace::hasCategory @@ -2333,21 +2362,22 @@ class OCIOEXPORT NamedTransform * However, it may be useful to associate a color space encoding that the transform is intended * to be used with, for organizational purposes. */ - virtual const char * getEncoding() const noexcept = 0; + virtual const char * getEncoding() const noexcept = 0; virtual void setEncoding(const char * encoding) noexcept = 0; - virtual ConstTransformRcPtr getTransform(TransformDirection dir) const = 0; + virtual ConstTransformRcPtr getTransform(TransformDirection dir) const = 0; virtual void setTransform(const ConstTransformRcPtr & transform, TransformDirection dir) = 0; /** * Will create the transform from the inverse direction if the transform for requested * direction is missing. */ - static ConstTransformRcPtr GetTransform(const ConstNamedTransformRcPtr & nt, - TransformDirection dir); + static ConstTransformRcPtr GetTransform( + const ConstNamedTransformRcPtr & nt, + TransformDirection dir); - NamedTransform(const NamedTransform &) = delete; - NamedTransform & operator= (const NamedTransform &) = delete; + NamedTransform(const NamedTransform &) = delete; + NamedTransform & operator=(const NamedTransform &) = delete; // Do not use (needed only for pybind11). virtual ~NamedTransform() = default; @@ -2355,8 +2385,7 @@ class OCIOEXPORT NamedTransform NamedTransform() = default; }; -extern OCIOEXPORT std::ostream & operator<< (std::ostream &, const NamedTransform &); - +extern OCIOEXPORT std::ostream & operator<<(std::ostream &, const NamedTransform &); /** * A *ViewTransform* provides a conversion from the main (usually scene-referred) reference space @@ -2417,8 +2446,8 @@ class OCIOEXPORT ViewTransform */ void setTransform(const ConstTransformRcPtr & transform, ViewTransformDirection dir); - ViewTransform(const ViewTransform &) = delete; - ViewTransform & operator= (const ViewTransform &) = delete; + ViewTransform(const ViewTransform &) = delete; + ViewTransform & operator=(const ViewTransform &) = delete; /// Do not use (needed only for pybind11). ~ViewTransform(); @@ -2434,13 +2463,12 @@ class OCIOEXPORT ViewTransform const Impl * getImpl() const { return m_impl; } }; -extern OCIOEXPORT std::ostream& operator<< (std::ostream&, const ViewTransform&); +extern OCIOEXPORT std::ostream & operator<<(std::ostream &, const ViewTransform &); // // Processor // - /** * The *Processor* represents a specific color transformation which is * the result of \ref Config::getProcessor. @@ -2458,7 +2486,8 @@ class OCIOEXPORT Processor /** * Returns a hash string generated by hashing the cachedIDs of the (unoptimized) list of ops - * contained in the Processor. (This forms part of the key used by the config's processor cache.) + * contained in the Processor. (This forms part of the key used by the config's processor + * cache.) */ const char * getCacheID() const; @@ -2482,7 +2511,7 @@ class OCIOEXPORT Processor int getNumTransforms() const; /** * Get a FormatMetadata containing the metadata for a - * transform within the processor. For a processor from a CLF file, this + * transform within the processor. For a processor from a CLF file, this * corresponds to the metadata associated with an individual process node. */ const FormatMetadata & getTransformFormatMetadata(int index) const; @@ -2501,7 +2530,7 @@ class OCIOEXPORT Processor * that if the processor contains several ops that support the requested property, only one * can be dynamic and only this one will be controlled. * - * \note The dynamic properties are a convenient way to change on-the-fly values without + * \note The dynamic properties are a convenient way to change on-the-fly values without * generating again and again a CPU or GPU processor instance. Color transformations can * contain dynamic properties from a ExposureContrastTransform for example. * So, Processor, CPUProcessor and GpuShaderCreator all have ways to manage dynamic @@ -2528,11 +2557,11 @@ class OCIOEXPORT Processor ConstProcessorRcPtr getOptimizedProcessor(OptimizationFlags oFlags) const; /** - * Create a Processor that is optimized for a specific in and out bit-depth (as CPUProcessor + * Create a Processor that is optimized for a specific in and out bit-depth (as CPUProcessor * would do). This method is provided primarily for diagnostic purposes. */ - ConstProcessorRcPtr getOptimizedProcessor(BitDepth inBD, BitDepth outBD, - OptimizationFlags oFlags) const; + ConstProcessorRcPtr + getOptimizedProcessor(BitDepth inBD, BitDepth outBD, OptimizationFlags oFlags) const; // // GPU Renderer @@ -2542,13 +2571,14 @@ class OCIOEXPORT Processor ConstGPUProcessorRcPtr getDefaultGPUProcessor() const; ConstGPUProcessorRcPtr getOptimizedGPUProcessor(OptimizationFlags oFlags) const; - /** + /** * Get an optimized GPUProcessor instance that will emulate the OCIO v1 GPU path. This approach * bakes some of the ops into a single Lut3D and so is less accurate than the current GPU * processing methods. */ - ConstGPUProcessorRcPtr getOptimizedLegacyGPUProcessor(OptimizationFlags oFlags, - unsigned edgelen) const; + ConstGPUProcessorRcPtr getOptimizedLegacyGPUProcessor( + OptimizationFlags oFlags, + unsigned edgelen) const; // // CPU Renderer @@ -2579,17 +2609,18 @@ class OCIOEXPORT Processor * * OCIO::PackedImageDesc img(imgDataPtr, imgWidth, imgHeight, imgChannels); * cpuProcessor->apply(img); - * + * * \endcode */ ConstCPUProcessorRcPtr getDefaultCPUProcessor() const; ConstCPUProcessorRcPtr getOptimizedCPUProcessor(OptimizationFlags oFlags) const; - ConstCPUProcessorRcPtr getOptimizedCPUProcessor(BitDepth inBitDepth, - BitDepth outBitDepth, - OptimizationFlags oFlags) const; + ConstCPUProcessorRcPtr getOptimizedCPUProcessor( + BitDepth inBitDepth, + BitDepth outBitDepth, + OptimizationFlags oFlags) const; - Processor(const Processor &) = delete; - Processor & operator= (const Processor &) = delete; + Processor(const Processor &) = delete; + Processor & operator=(const Processor &) = delete; /// Do not use (needed only for pybind11). ~Processor(); @@ -2598,7 +2629,7 @@ class OCIOEXPORT Processor static ProcessorRcPtr Create(); - static void deleter(Processor* c); + static void deleter(Processor * c); friend class Config; @@ -2608,7 +2639,6 @@ class OCIOEXPORT Processor const Impl * getImpl() const { return m_impl; } }; - /////////////////////////////////////////////////////////////////////////// // CPUProcessor @@ -2619,7 +2649,7 @@ class OCIOEXPORT CPUProcessor bool isNoOp() const; /** - * Equivalent to isNoOp from the underlying Processor, i.e., it ignores + * Equivalent to isNoOp from the underlying Processor, i.e., it ignores * in/out bit-depth differences. */ bool isIdentity() const; @@ -2667,8 +2697,8 @@ class OCIOEXPORT CPUProcessor void applyRGB(float * pixel) const; void applyRGBA(float * pixel) const; - CPUProcessor(const CPUProcessor &) = delete; - CPUProcessor& operator= (const CPUProcessor &) = delete; + CPUProcessor(const CPUProcessor &) = delete; + CPUProcessor & operator=(const CPUProcessor &) = delete; /// Do not use (needed only for pybind11). ~CPUProcessor(); @@ -2685,7 +2715,6 @@ class OCIOEXPORT CPUProcessor const Impl * getImpl() const { return m_impl; } }; - /////////////////////////////////////////////////////////////////////////// // GPUProcessor @@ -2703,9 +2732,9 @@ class OCIOEXPORT GPUProcessor /// Extract the shader information using a custom GpuShaderCreator class. void extractGpuShaderInfo(GpuShaderCreatorRcPtr & shaderCreator) const; - - GPUProcessor(const GPUProcessor &) = delete; - GPUProcessor& operator= (const GPUProcessor &) = delete; + + GPUProcessor(const GPUProcessor &) = delete; + GPUProcessor & operator=(const GPUProcessor &) = delete; /// Do not use (needed only for pybind11). ~GPUProcessor(); @@ -2722,10 +2751,9 @@ class OCIOEXPORT GPUProcessor const Impl * getImpl() const { return m_impl; } }; - /** * \brief - * + * * This class contains meta information about the process that generated * this processor. The results of these functions do not * impact the pixel processing. @@ -2744,15 +2772,15 @@ class OCIOEXPORT ProcessorMetadata void addFile(const char * fname); void addLook(const char * look); - ProcessorMetadata(const ProcessorMetadata &) = delete; - ProcessorMetadata& operator= (const ProcessorMetadata &) = delete; + ProcessorMetadata(const ProcessorMetadata &) = delete; + ProcessorMetadata & operator=(const ProcessorMetadata &) = delete; /// Do not use (needed only for pybind11). ~ProcessorMetadata(); private: ProcessorMetadata(); - static void deleter(ProcessorMetadata* c); + static void deleter(ProcessorMetadata * c); class Impl; Impl * m_impl; @@ -2760,8 +2788,6 @@ class OCIOEXPORT ProcessorMetadata const Impl * getImpl() const { return m_impl; } }; - - /** * In certain situations it is necessary to serialize transforms into a variety * of application specific LUT formats. Note that not all file formats that may @@ -2769,7 +2795,7 @@ class OCIOEXPORT ProcessorMetadata * * **Usage Example:** *Bake a CSP sRGB viewer LUT* * - * \code{.cpp} + * \code{.cpp} * * OCIO::ConstConfigRcPtr config = OCIO::Config::CreateFromEnv(); * OCIO::BakerRcPtr baker = OCIO::Baker::Create(); @@ -2784,7 +2810,7 @@ class OCIOEXPORT ProcessorMetadata * std::ostringstream out; * baker->bake(out); // fresh bread anyone! * std::cout << out.str(); - * + * * \endcode */ class OCIOEXPORT Baker @@ -2838,12 +2864,14 @@ class OCIOEXPORT Baker void setLooks(const char * looks); const char * getTargetSpace() const; - /// Set the target (i.e., output) color space for the LUT. Must not be used if setDisplayView is used. + /// Set the target (i.e., output) color space for the LUT. Must not be used if setDisplayView is + /// used. void setTargetSpace(const char * targetSpace); const char * getDisplay() const; const char * getView() const; - /// Set the display and view to apply during the baking. Must not be used if setTargetSpace is used. + /// Set the display and view to apply during the baking. Must not be used if setTargetSpace is + /// used. void setDisplayView(const char * display, const char * view); int getShaperSize() const; @@ -2878,15 +2906,15 @@ class OCIOEXPORT Baker */ static const char * getFormatExtensionByIndex(int index); - Baker(const Baker &) = delete; - Baker& operator= (const Baker &) = delete; + Baker(const Baker &) = delete; + Baker & operator=(const Baker &) = delete; /// Do not use (needed only for pybind11). ~Baker(); private: Baker(); - static void deleter(Baker* o); + static void deleter(Baker * o); class Impl; Impl * m_impl; @@ -2894,7 +2922,6 @@ class OCIOEXPORT Baker const Impl * getImpl() const { return m_impl; } }; - /////////////////////////////////////////////////////////////////////////// // ImageDesc @@ -2951,11 +2978,10 @@ class OCIOEXPORT ImageDesc private: ImageDesc(const ImageDesc &); - ImageDesc & operator= (const ImageDesc &); + ImageDesc & operator=(const ImageDesc &); }; -extern OCIOEXPORT std::ostream& operator<< (std::ostream&, const ImageDesc&); - +extern OCIOEXPORT std::ostream & operator<<(std::ostream &, const ImageDesc &); /////////////////////////////////////////////////////////////////////////// // PackedImageDesc @@ -2974,38 +3000,37 @@ extern OCIOEXPORT std::ostream& operator<< (std::ostream&, const ImageDesc&); class OCIOEXPORT PackedImageDesc : public ImageDesc { public: - /** * \note * numChannels must be 3 (RGB) or 4 (RGBA). */ - PackedImageDesc(void * data, - long width, long height, - long numChannels); + PackedImageDesc(void * data, long width, long height, long numChannels); /** * \note * numChannels must be 3 (RGB) or 4 (RGBA). */ - PackedImageDesc(void * data, - long width, long height, - long numChannels, - BitDepth bitDepth, - ptrdiff_t chanStrideBytes, - ptrdiff_t xStrideBytes, - ptrdiff_t yStrideBytes); - - PackedImageDesc(void * data, - long width, long height, - ChannelOrdering chanOrder); - - PackedImageDesc(void * data, - long width, long height, - ChannelOrdering chanOrder, - BitDepth bitDepth, - ptrdiff_t chanStrideBytes, - ptrdiff_t xStrideBytes, - ptrdiff_t yStrideBytes); + PackedImageDesc( + void * data, + long width, + long height, + long numChannels, + BitDepth bitDepth, + ptrdiff_t chanStrideBytes, + ptrdiff_t xStrideBytes, + ptrdiff_t yStrideBytes); + + PackedImageDesc(void * data, long width, long height, ChannelOrdering chanOrder); + + PackedImageDesc( + void * data, + long width, + long height, + ChannelOrdering chanOrder, + BitDepth bitDepth, + ptrdiff_t chanStrideBytes, + ptrdiff_t xStrideBytes, + ptrdiff_t yStrideBytes); virtual ~PackedImageDesc(); @@ -3042,10 +3067,9 @@ class OCIOEXPORT PackedImageDesc : public ImageDesc PackedImageDesc(); PackedImageDesc(const PackedImageDesc &); - PackedImageDesc& operator= (const PackedImageDesc &); + PackedImageDesc & operator=(const PackedImageDesc &); }; - /////////////////////////////////////////////////////////////////////////// // PlanarImageDesc @@ -3061,9 +3085,13 @@ class OCIOEXPORT PackedImageDesc : public ImageDesc class OCIOEXPORT PlanarImageDesc : public ImageDesc { public: - - PlanarImageDesc(void * rData, void * gData, void * bData, void * aData, - long width, long height); + PlanarImageDesc( + void * rData, + void * gData, + void * bData, + void * aData, + long width, + long height); /** * @@ -3072,11 +3100,16 @@ class OCIOEXPORT PlanarImageDesc : public ImageDesc * a PackedImageDesc where possible since that allows for additional * optimizations. */ - PlanarImageDesc(void * rData, void * gData, void * bData, void * aData, - long width, long height, - BitDepth bitDepth, - ptrdiff_t xStrideBytes, - ptrdiff_t yStrideBytes); + PlanarImageDesc( + void * rData, + void * gData, + void * bData, + void * aData, + long width, + long height, + BitDepth bitDepth, + ptrdiff_t xStrideBytes, + ptrdiff_t yStrideBytes); virtual ~PlanarImageDesc(); @@ -3105,15 +3138,14 @@ class OCIOEXPORT PlanarImageDesc : public ImageDesc PlanarImageDesc(); PlanarImageDesc(const PlanarImageDesc &); - PlanarImageDesc& operator= (const PlanarImageDesc &); + PlanarImageDesc & operator=(const PlanarImageDesc &); }; - /////////////////////////////////////////////////////////////////////////// // GpuShaderCreator /** * Inherit from the class to fully customize the implementation of a GPU shader program - * from a color transformation. + * from a color transformation. * * When no customizations are needed and the intermediate in-memory step is acceptable then the * \ref GpuShaderDesc is a better choice. @@ -3124,7 +3156,7 @@ class OCIOEXPORT PlanarImageDesc : public ImageDesc * \ref ExposureContrastTransform instance owns three \ref DynamicProperties and they are all * implemented by a double. When creating the GPU fragment shader program, the addUniform() with * GpuShaderCreator::DoubleGetter is called when property is dynamic, up to three times. - * + * * **An OCIO shader program could contain:** * * * A declaration part e.g., uniform sampled3D tex3; @@ -3136,17 +3168,17 @@ class OCIOEXPORT PlanarImageDesc : public ImageDesc * * The function header e.g., void OCIODisplay(in vec4 inColor) { * * The function body e.g., vec4 outColor.rgb = texture3D(tex3, inColor.rgb).rgb; * * The function footer e.g., return outColor; } - * - * + * + * * **Usage Example:** - * + * * Below is a code snippet to highlight the different parts of the OCIO shader program. - * + * * \code{.cpp} - * + * * // All global declarations * uniform sampled3D tex3; - * + * * // All helper methods * vec3 computePosition(vec3 color) * { @@ -3154,23 +3186,22 @@ class OCIOEXPORT PlanarImageDesc : public ImageDesc * // Some processing... * return coords; * } - * + * * // The shader function * vec4 OCIODisplay(in vec4 inColor) // * { // Function Header * vec4 outColor = inColor; // - * + * * outColor.rgb = texture3D(tex3, computePosition(inColor.rgb)).rgb; - * + * * return outColor; // Function Footer * } // - * + * * \endcode */ class OCIOEXPORT GpuShaderCreator { public: - virtual GpuShaderCreatorRcPtr clone() const = 0; const char * getUniqueID() const noexcept; @@ -3207,12 +3238,12 @@ class OCIOEXPORT GpuShaderCreator virtual void end(); /// Some graphic cards could have 1D & 2D textures with size limitations. - virtual void setTextureMaxWidth(unsigned maxWidth) = 0; + virtual void setTextureMaxWidth(unsigned maxWidth) = 0; virtual unsigned getTextureMaxWidth() const noexcept = 0; /// Allow 1D GPU resource type, otherwise always using 2D resources for 1D LUTs. virtual void setAllowTexture1D(bool allowed) = 0; - virtual bool getAllowTexture1D() const = 0; + virtual bool getAllowTexture1D() const = 0; /** * To avoid global texture sampler and uniform name clashes always append an increasing index @@ -3233,22 +3264,21 @@ class OCIOEXPORT GpuShaderCreator /// Function returning an int *, used by uniforms. typedef std::function VectorIntGetter; - virtual bool addUniform(const char * name, - const DoubleGetter & getDouble) = 0; + virtual bool addUniform(const char * name, const DoubleGetter & getDouble) = 0; - virtual bool addUniform(const char * name, - const BoolGetter & getBool) = 0; + virtual bool addUniform(const char * name, const BoolGetter & getBool) = 0; - virtual bool addUniform(const char * name, - const Float3Getter & getFloat3) = 0; + virtual bool addUniform(const char * name, const Float3Getter & getFloat3) = 0; - virtual bool addUniform(const char * name, - const SizeGetter & getSize, - const VectorFloatGetter & getVectorFloat) = 0; + virtual bool addUniform( + const char * name, + const SizeGetter & getSize, + const VectorFloatGetter & getVectorFloat) + = 0; - virtual bool addUniform(const char * name, - const SizeGetter & getSize, - const VectorIntGetter & getVectorInt) = 0; + virtual bool + addUniform(const char * name, const SizeGetter & getSize, const VectorIntGetter & getVectorInt) + = 0; /// Adds the property (used internally). void addDynamicProperty(DynamicPropertyRcPtr & prop); @@ -3273,7 +3303,8 @@ class OCIOEXPORT GpuShaderCreator /** * Dimension enum used to differentiate between 1D and 2D object/resource types. */ - enum TextureDimensions : uint8_t { + enum TextureDimensions : uint8_t + { TEXTURE_1D = 1, TEXTURE_2D = 2, }; @@ -3283,29 +3314,35 @@ class OCIOEXPORT GpuShaderCreator * * \note * The 'values' parameter contains the LUT data which must be used as-is as the dimensions and - * origin are hard-coded in the fragment shader program. So, it means one GPU texture per entry. + * origin are hard-coded in the fragment shader program. So, it means one GPU texture per + *entry. **/ - virtual void addTexture(const char * textureName, - const char * samplerName, - unsigned width, unsigned height, - TextureType channel, - TextureDimensions dimensions, - Interpolation interpolation, - const float * values) = 0; + virtual void addTexture( + const char * textureName, + const char * samplerName, + unsigned width, + unsigned height, + TextureType channel, + TextureDimensions dimensions, + Interpolation interpolation, + const float * values) + = 0; /** * Add a 3D texture with RGB channel type. - * - * \note + * + * \note * The 'values' parameter contains the 3D LUT data which must be used as-is as the dimension * and origin are hard-coded in the fragment shader program. So, it means one GPU 3D texture * per entry. **/ - virtual void add3DTexture(const char * textureName, - const char * samplerName, - unsigned edgelen, - Interpolation interpolation, - const float * values) = 0; + virtual void add3DTexture( + const char * textureName, + const char * samplerName, + unsigned edgelen, + Interpolation interpolation, + const float * values) + = 0; // Methods to specialize parts of a OCIO shader program virtual void addToDeclareShaderCode(const char * shaderCode); @@ -3322,16 +3359,17 @@ class OCIOEXPORT GpuShaderCreator * to change some parts. Some product integrations add the color processing * within a client shader program, imposing constraints requiring this flexibility. */ - virtual void createShaderText(const char * shaderDeclarations, - const char * shaderHelperMethods, - const char * shaderFunctionHeader, - const char * shaderFunctionBody, - const char * shaderFunctionFooter); + virtual void createShaderText( + const char * shaderDeclarations, + const char * shaderHelperMethods, + const char * shaderFunctionHeader, + const char * shaderFunctionBody, + const char * shaderFunctionFooter); virtual void finalize(); - - GpuShaderCreator(const GpuShaderCreator &) = delete; - GpuShaderCreator & operator= (const GpuShaderCreator &) = delete; + + GpuShaderCreator(const GpuShaderCreator &) = delete; + GpuShaderCreator & operator=(const GpuShaderCreator &) = delete; /// Do not use (needed only for pybind11). virtual ~GpuShaderCreator(); @@ -3426,7 +3464,7 @@ class OCIOEXPORT GpuShaderCreator * // // * //////////////////////////////////////////////////////////////////////// * \endcode - * + * * **Usage Example:** *Building a GPU shader* * * This example is based on the code in: src/apps/ociodisplay/main.cpp @@ -3497,7 +3535,6 @@ class OCIOEXPORT GpuShaderCreator class OCIOEXPORT GpuShaderDesc : public GpuShaderCreator { public: - /// Create the default shader description. static GpuShaderDescRcPtr CreateShaderDesc(); @@ -3514,7 +3551,7 @@ class OCIOEXPORT GpuShaderDesc : public GpuShaderCreator */ struct UniformData { - UniformDataType m_type{ UNIFORM_UNKNOWN }; + UniformDataType m_type{UNIFORM_UNKNOWN}; DoubleGetter m_getDouble{}; BoolGetter m_getBool{}; Float3Getter m_getFloat3{}; @@ -3535,30 +3572,34 @@ class OCIOEXPORT GpuShaderDesc : public GpuShaderCreator // 1D lut related methods virtual unsigned getNumTextures() const noexcept = 0; - virtual void getTexture(unsigned index, - const char *& textureName, - const char *& samplerName, - unsigned & width, - unsigned & height, - TextureType & channel, - TextureDimensions & dimensions, - Interpolation & interpolation) const = 0; + virtual void getTexture( + unsigned index, + const char *& textureName, + const char *& samplerName, + unsigned & width, + unsigned & height, + TextureType & channel, + TextureDimensions & dimensions, + Interpolation & interpolation) const + = 0; virtual void getTextureValues(unsigned index, const float *& values) const = 0; // 3D lut related methods virtual unsigned getNum3DTextures() const noexcept = 0; - virtual void get3DTexture(unsigned index, - const char *& textureName, - const char *& samplerName, - unsigned & edgelen, - Interpolation & interpolation) const = 0; + virtual void get3DTexture( + unsigned index, + const char *& textureName, + const char *& samplerName, + unsigned & edgelen, + Interpolation & interpolation) const + = 0; virtual void get3DTextureValues(unsigned index, const float *& values) const = 0; /// Get the complete OCIO shader program. const char * getShaderText() const noexcept; - GpuShaderDesc(const GpuShaderDesc &) = delete; - GpuShaderDesc& operator= (const GpuShaderDesc &) = delete; + GpuShaderDesc(const GpuShaderDesc &) = delete; + GpuShaderDesc & operator=(const GpuShaderDesc &) = delete; /// Do not use (needed only for pybind11). virtual ~GpuShaderDesc(); @@ -3566,19 +3607,18 @@ class OCIOEXPORT GpuShaderDesc : public GpuShaderCreator GpuShaderDesc(); }; - /** * Context - * + * * A context defines some overrides to a Config. For example, it can override the * search path or change the value of a context variable. * - * \note + * \note * Only some \ref Config::getProcessor methods accept a custom context; otherwise, * the default context instance is used (see \ref Config::getCurrentContext). * * Context Variables - * + * * The context variables allow changes at runtime using environment variables. For example, * a color space name (such as src & dst for the ColorSpaceTransform) or a file * name (such as LUT file name for the FileTransform) could be defined by context @@ -3627,13 +3667,13 @@ class OCIOEXPORT Context /// Note that a Context StringVar is the same thing as a Config EnvironmentVar and these /// are both often referred to as a "context var". void setStringVar(const char * name, const char * value) noexcept; - /// Get the context variable value. It returns an empty string if the context + /// Get the context variable value. It returns an empty string if the context /// variable is null or does not exist. const char * getStringVar(const char * name) const noexcept; int getNumStringVars() const; const char * getStringVarNameByIndex(int index) const; - + const char * getStringVarByIndex(int index) const; void clearStringVars(); @@ -3650,11 +3690,12 @@ class OCIOEXPORT Context /// Resolve all the context variables from the string. It could be color space /// names or file names. Note that it recursively applies the context variable resolution. - /// Returns the string unchanged if it does not contain any context variable. + /// Returns the string unchanged if it does not contain any context variable. const char * resolveStringVar(const char * string) const noexcept; /// Resolve all the context variables from the string and return all the context /// variables used to resolve the string (empty if no context variables were used). - const char * resolveStringVar(const char * string, ContextRcPtr & usedContextVars) const noexcept; + const char * resolveStringVar(const char * string, ContextRcPtr & usedContextVars) + const noexcept; /** * Build the resolved and expanded filepath using the search_path when needed, @@ -3676,15 +3717,15 @@ class OCIOEXPORT Context void setConfigIOProxy(ConfigIOProxyRcPtr ciop); ConfigIOProxyRcPtr getConfigIOProxy() const; - Context(const Context &) = delete; - Context& operator= (const Context &) = delete; + Context(const Context &) = delete; + Context & operator=(const Context &) = delete; /// Do not use (needed only for pybind11). ~Context(); private: Context(); - static void deleter(Context* c); + static void deleter(Context * c); class Impl; Impl * m_impl; @@ -3692,8 +3733,7 @@ class OCIOEXPORT Context const Impl * getImpl() const { return m_impl; } }; -extern OCIOEXPORT std::ostream& operator<< (std::ostream&, const Context&); - +extern OCIOEXPORT std::ostream & operator<<(std::ostream &, const Context &); /////////////////////////////////////////////////////////////////////////// // BuiltinTransformRegistry @@ -3705,8 +3745,8 @@ extern OCIOEXPORT std::ostream& operator<< (std::ostream&, const Context&); class OCIOEXPORT BuiltinTransformRegistry { public: - BuiltinTransformRegistry(const BuiltinTransformRegistry &) = delete; - BuiltinTransformRegistry & operator= (const BuiltinTransformRegistry &) = delete; + BuiltinTransformRegistry(const BuiltinTransformRegistry &) = delete; + BuiltinTransformRegistry & operator=(const BuiltinTransformRegistry &) = delete; /// Get the current built-in transform registry. static ConstBuiltinTransformRegistryRcPtr Get() noexcept; @@ -3722,7 +3762,7 @@ class OCIOEXPORT BuiltinTransformRegistry virtual const char * getBuiltinDescription(size_t index) const = 0; protected: - BuiltinTransformRegistry() = default; + BuiltinTransformRegistry() = default; virtual ~BuiltinTransformRegistry() = default; }; @@ -3735,8 +3775,8 @@ class OCIOEXPORT BuiltinTransformRegistry class OCIOEXPORT BuiltinConfigRegistry { public: - BuiltinConfigRegistry(const BuiltinConfigRegistry &) = delete; - BuiltinConfigRegistry & operator= (const BuiltinConfigRegistry &) = delete; + BuiltinConfigRegistry(const BuiltinConfigRegistry &) = delete; + BuiltinConfigRegistry & operator=(const BuiltinConfigRegistry &) = delete; /// Get the current built-in configs registry. static const BuiltinConfigRegistry & Get() noexcept; @@ -3744,61 +3784,64 @@ class OCIOEXPORT BuiltinConfigRegistry /// Get the number of built-in configs available. virtual size_t getNumBuiltinConfigs() const noexcept = 0; - /// Get the name of the config at the specified (zero-based) index. + /// Get the name of the config at the specified (zero-based) index. /// Throws for illegal index. virtual const char * getBuiltinConfigName(size_t configIndex) const = 0; - // Get a user-friendly name for a built-in config, appropriate for displaying in a user interface. + // Get a user-friendly name for a built-in config, appropriate for displaying in a user + // interface. /// Throws for illegal index. virtual const char * getBuiltinConfigUIName(size_t configIndex) const = 0; /// Get Yaml text of the built-in config at the specified index. /// Throws for illegal index. virtual const char * getBuiltinConfig(size_t configIndex) const = 0; - - /// Get the Yaml text of the built-in config with the specified name. + + /// Get the Yaml text of the built-in config with the specified name. /// Throws if the name is not found. virtual const char * getBuiltinConfigByName(const char * configName) const = 0; /** * @brief Check if a specific built-in config is recommended. - * + * * For backwards compatibility reasons, configs will remain in the registry even if they have - * been superseded. If an app is presenting a list of configs to users, it should not include + * been superseded. If an app is presenting a list of configs to users, it should not include * configs that are no longer recommended. - * + * * Throws if the name is not found. - * + * * @param configIndex Index of built-in config. * @return true if the config is recommended. */ virtual bool isBuiltinConfigRecommended(size_t configIndex) const = 0; // Return the full forward-compatible name of the default built-in config. - OCIO_DEPRECATED("This was marked as deprecated starting in v2.3, please use ResolveConfigPath(\"ocio://default\").") + OCIO_DEPRECATED("This was marked as deprecated starting in v2.3, please use " + "ResolveConfigPath(\"ocio://default\").") virtual const char * getDefaultBuiltinConfigName() const = 0; + protected: - BuiltinConfigRegistry() = default; + BuiltinConfigRegistry() = default; virtual ~BuiltinConfigRegistry() = default; }; - /////////////////////////////////////////////////////////////////////////// // SystemMonitors /** - * Provides access to the ICC monitor profile provided by the operating system for each active display. + * Provides access to the ICC monitor profile provided by the operating system for each active + * display. */ class OCIOEXPORT SystemMonitors { public: - SystemMonitors(const SystemMonitors &) = delete; - SystemMonitors & operator= (const SystemMonitors &) = delete; + SystemMonitors(const SystemMonitors &) = delete; + SystemMonitors & operator=(const SystemMonitors &) = delete; - /// Get the existing instance. + /// Get the existing instance. static ConstSystemMonitorsRcPtr Get() noexcept; - /** + /** * True if the OS is able to provide ICC profiles for the attached monitors (macOS, Windows) * and false otherwise. */ @@ -3811,7 +3854,7 @@ class OCIOEXPORT SystemMonitors /// Get the number of active monitors reported by the operating system. virtual size_t getNumMonitors() const noexcept = 0; - /** + /** * \brief Get the monitor profile name. * * Get the string describing the monitor. It is used as an argument to instantiateDisplay. It @@ -3823,57 +3866,56 @@ class OCIOEXPORT SystemMonitors virtual const char * getProfileFilepath(size_t idx) const = 0; protected: - SystemMonitors() = default; + SystemMonitors() = default; virtual ~SystemMonitors() = default; }; - /////////////////////////////////////////////////////////////////////////// // ConfigIOProxy /** * ConfigIOProxy is a proxy class to allow the calling program to supply the config and any - * associated LUT files directly, without relying on the standard file system. - * + * associated LUT files directly, without relying on the standard file system. + * * The OCIOZ archive feature is implemented using this mechanism. */ class OCIOEXPORT ConfigIOProxy { public: - ConfigIOProxy() = default; + ConfigIOProxy() = default; virtual ~ConfigIOProxy() = default; /** * \brief Provide the contents of a LUT file as a buffer of uint8_t data. - * + * * \param filepath Fully resolved path to the "file." - * + * * The file path is based on the Config's current working directory and is the same absolute * path that would have been provided to the file system. - * + * * \return Vector of uint8 with the content of the LUT. */ virtual std::vector getLutData(const char * filepath) const = 0; /** * \brief Provide the config file Yaml to be parsed. - * + * * \return String with the config Yaml. */ virtual std::string getConfigData() const = 0; /** * \brief Provide a fast unique ID for a LUT file. - * + * * This is intended to supply the string that will be used in OCIO's FileCacheMap. * This should be highly performant and typically should not require extensive * computation such as calculating the md5 hash of the file, unless it is pre-computed. - * + * * If the "file" does not exist, in other words, if the proxy is unable to supply the requested * file contents, the function must return an empty string. - * + * * \param filepath Fully resolve the path to the "file." - * + * * The file path is based on the Config's current working directory and is the same absolute * path that would have been provided to the file system. * diff --git a/include/OpenColorIO/OpenColorTransforms.h b/include/OpenColorIO/OpenColorTransforms.h index e37c59e4c2..82d7dfc283 100644 --- a/include/OpenColorIO/OpenColorTransforms.h +++ b/include/OpenColorIO/OpenColorTransforms.h @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_OPENCOLORTRANSFORMS_H #define INCLUDED_OCIO_OPENCOLORTRANSFORMS_H @@ -17,15 +16,13 @@ /** * C++ Transforms * ============== - * + * * Typically only needed when creating and/or manipulating configurations */ namespace OCIO_NAMESPACE { - - /** * The FormatMetadata class is intended to be a generic container to hold metadata from various * file formats. @@ -49,7 +46,7 @@ class OCIOEXPORT FormatMetadata virtual void setElementName(const char *) = 0; virtual const char * getElementValue() const noexcept = 0; - virtual void setElementValue(const char *) = 0; + virtual void setElementValue(const char *) = 0; virtual int getNumAttributes() const noexcept = 0; /// Get the name of a attribute ("" if attribute does not exist). @@ -75,7 +72,7 @@ class OCIOEXPORT FormatMetadata * throw. */ virtual const FormatMetadata & getChildElement(int i) const = 0; - virtual FormatMetadata & getChildElement(int i) = 0; + virtual FormatMetadata & getChildElement(int i) = 0; /** * Add a child element with a given name and value. @@ -96,14 +93,14 @@ class OCIOEXPORT FormatMetadata * ProcessNode name attribute from a CLF / CTF file or the name key of a transform in the * config YAML. */ - virtual const char * getName() const noexcept = 0; + virtual const char * getName() const noexcept = 0; virtual void setName(const char * name) noexcept = 0; /** * Convenience method to easily get/set the 'id' attribute. This corresponds to the * ProcessNode id attribute from a CLF/CTF file or the ColorCorrection id attribute from a * CC/CCC/CDL file. */ - virtual const char * getID() const noexcept = 0; + virtual const char * getID() const noexcept = 0; virtual void setID(const char * id) noexcept = 0; FormatMetadata(const FormatMetadata & rhs) = delete; @@ -116,7 +113,6 @@ class OCIOEXPORT FormatMetadata extern OCIOEXPORT std::ostream & operator<<(std::ostream &, const FormatMetadata &); - /// Base class for all the transform classes class OCIOEXPORT Transform { @@ -132,8 +128,8 @@ class OCIOEXPORT Transform /// Will throw if data is not valid. virtual void validate() const; - Transform(const Transform &) = delete; - Transform & operator= (const Transform &) = delete; + Transform(const Transform &) = delete; + Transform & operator=(const Transform &) = delete; /// Do not use (needed only for pybind11). virtual ~Transform() = default; @@ -141,9 +137,7 @@ class OCIOEXPORT Transform Transform() = default; }; -extern OCIOEXPORT std::ostream& operator<< (std::ostream&, const Transform&); - - +extern OCIOEXPORT std::ostream & operator<<(std::ostream &, const Transform &); /** * Forward direction wraps the 'expanded' range into the @@ -171,7 +165,7 @@ class OCIOEXPORT AllocationTransform : public Transform void getVars(float * vars) const; void setVars(int numvars, const float * vars); - AllocationTransform & operator= (const AllocationTransform &) = delete; + AllocationTransform & operator=(const AllocationTransform &) = delete; /// Do not use (needed only for pybind11). virtual ~AllocationTransform(); @@ -187,8 +181,7 @@ class OCIOEXPORT AllocationTransform : public Transform const Impl * getImpl() const { return m_impl; } }; -extern OCIOEXPORT std::ostream& operator<< (std::ostream&, const AllocationTransform&); - +extern OCIOEXPORT std::ostream & operator<<(std::ostream &, const AllocationTransform &); /** * A built-in transform is similar to a FileTransform, but without the file. @@ -219,16 +212,15 @@ class OCIOEXPORT BuiltinTransform : public Transform BuiltinTransform() = default; private: - BuiltinTransform(const BuiltinTransform &) = delete; - BuiltinTransform & operator= (const BuiltinTransform &) = delete; + BuiltinTransform(const BuiltinTransform &) = delete; + BuiltinTransform & operator=(const BuiltinTransform &) = delete; }; // extern OCIOEXPORT std::ostream & operator<<(std::ostream &, const BuiltinTransform &) noexcept; - /** - * \brief + * \brief * An implementation of the ASC Color Decision List (CDL), based on the ASC v1.2 * specification. * @@ -236,7 +228,7 @@ extern OCIOEXPORT std::ostream & operator<<(std::ostream &, const BuiltinTransfo * * Slope, offset, power:: * out = clamp( (in * slope) + offset ) ^ power - * + * * \note​ * If the config version is 1, negative values are clamped if the power is not 1.0. * For config version 2 and higher, the negative handling is controlled by the CDL style. @@ -256,7 +248,7 @@ class OCIOEXPORT CDLTransform : public Transform * if file does not contain any CDL or if the specified cccid is not found. */ static CDLTransformRcPtr CreateFromFile(const char * src, const char * cccid); - + /** * \brief Load all of the CDLs in a .cdl or .ccc file into a single GroupTransform. * @@ -269,7 +261,7 @@ class OCIOEXPORT CDLTransform : public Transform TransformType getTransformType() const noexcept override { return TRANSFORM_TYPE_CDL; } - virtual FormatMetadata & getFormatMetadata() noexcept = 0; + virtual FormatMetadata & getFormatMetadata() noexcept = 0; virtual const FormatMetadata & getFormatMetadata() const noexcept = 0; virtual bool equals(const CDLTransform & other) const noexcept = 0; @@ -295,7 +287,7 @@ class OCIOEXPORT CDLTransform : public Transform virtual void getSOP(double * vec9) const = 0; virtual void setSOP(const double * vec9) = 0; - virtual double getSat() const = 0; + virtual double getSat() const = 0; virtual void setSat(double sat) = 0; /// These are hard-coded, by spec, to r709. @@ -305,7 +297,7 @@ class OCIOEXPORT CDLTransform : public Transform * The get/setID methods are now deprecated. The preferred way of interacting with the ID is * now via the transform's formatMetadata. */ - virtual const char * getID() const = 0; + virtual const char * getID() const = 0; virtual void setID(const char * id) = 0; /* Get/Set the first Description element under the SOPNode. @@ -315,11 +307,11 @@ class OCIOEXPORT CDLTransform : public Transform * The Description children of the SOPNode element in the CDL XML are named 'SOPDescription' * in the FormatMetadata. NULL or empty string removes the first SOPDescription element. */ - virtual const char * getFirstSOPDescription() const = 0; + virtual const char * getFirstSOPDescription() const = 0; virtual void setFirstSOPDescription(const char * description) = 0; - CDLTransform(const CDLTransform &) = delete; - CDLTransform & operator= (const CDLTransform &) = delete; + CDLTransform(const CDLTransform &) = delete; + CDLTransform & operator=(const CDLTransform &) = delete; /// Do not use (needed only for pybind11). virtual ~CDLTransform() = default; @@ -329,7 +321,6 @@ class OCIOEXPORT CDLTransform : public Transform extern OCIOEXPORT std::ostream & operator<<(std::ostream &, const CDLTransform &); - class OCIOEXPORT ColorSpaceTransform : public Transform { public: @@ -372,7 +363,6 @@ class OCIOEXPORT ColorSpaceTransform : public Transform extern OCIOEXPORT std::ostream & operator<<(std::ostream &, const ColorSpaceTransform &); - class OCIOEXPORT DisplayViewTransform : public Transform { public: @@ -413,7 +403,7 @@ class OCIOEXPORT DisplayViewTransform : public Transform private: DisplayViewTransform(); - DisplayViewTransform(const DisplayViewTransform &) = delete; + DisplayViewTransform(const DisplayViewTransform &) = delete; DisplayViewTransform & operator=(const DisplayViewTransform &) = delete; static void deleter(DisplayViewTransform * t); @@ -440,17 +430,17 @@ struct OCIOEXPORT GradingRGBM , m_master(master) { } - GradingRGBM(const double(&rgbm)[4]) + GradingRGBM(const double (&rgbm)[4]) : m_red(rgbm[0]) , m_green(rgbm[1]) , m_blue(rgbm[2]) , m_master(rgbm[3]) { } - double m_red{ 0. }; - double m_green{ 0. }; - double m_blue{ 0. }; - double m_master{ 0. }; + double m_red{0.}; + double m_green{0.}; + double m_blue{0.}; + double m_master{0.}; }; extern OCIOEXPORT bool operator==(const GradingRGBM & lhs, const GradingRGBM & rhs); @@ -468,18 +458,18 @@ struct OCIOEXPORT GradingPrimary { } - GradingRGBM m_brightness{ 0.0, 0.0, 0.0, 0.0 }; - GradingRGBM m_contrast { 1.0, 1.0, 1.0, 1.0 }; - GradingRGBM m_gamma { 1.0, 1.0, 1.0, 1.0 }; - GradingRGBM m_offset { 0.0, 0.0, 0.0, 0.0 }; - GradingRGBM m_exposure { 0.0, 0.0, 0.0, 0.0 }; - GradingRGBM m_lift { 0.0, 0.0, 0.0, 0.0 }; - GradingRGBM m_gain { 1.0, 1.0, 1.0, 1.0 }; + GradingRGBM m_brightness{0.0, 0.0, 0.0, 0.0}; + GradingRGBM m_contrast{1.0, 1.0, 1.0, 1.0}; + GradingRGBM m_gamma{1.0, 1.0, 1.0, 1.0}; + GradingRGBM m_offset{0.0, 0.0, 0.0, 0.0}; + GradingRGBM m_exposure{0.0, 0.0, 0.0, 0.0}; + GradingRGBM m_lift{0.0, 0.0, 0.0, 0.0}; + GradingRGBM m_gain{1.0, 1.0, 1.0, 1.0}; - double m_saturation{ 1.0 }; + double m_saturation{1.0}; double m_pivot; // For LOG default is -0.2. LIN default is 0.18. - double m_pivotBlack{ 0.0 }; - double m_pivotWhite{ 1.0 }; + double m_pivotBlack{0.0}; + double m_pivotWhite{1.0}; double m_clampBlack; double m_clampWhite; @@ -498,9 +488,13 @@ extern OCIOEXPORT std::ostream & operator<<(std::ostream &, const GradingPrimary struct OCIOEXPORT GradingControlPoint { GradingControlPoint() = default; - GradingControlPoint(float x, float y) : m_x(x), m_y(y) {} - float m_x{ 0.f }; - float m_y{ 0.f }; + GradingControlPoint(float x, float y) + : m_x(x) + , m_y(y) + { + } + float m_x{0.f}; + float m_y{0.f}; }; extern OCIOEXPORT bool operator==(const GradingControlPoint & lhs, const GradingControlPoint & rhs); @@ -516,18 +510,18 @@ class OCIOEXPORT GradingBSplineCurve /// Create a BSpline curve with a list of control points. static GradingBSplineCurveRcPtr Create(std::initializer_list values); - virtual GradingBSplineCurveRcPtr createEditableCopy() const = 0; - virtual size_t getNumControlPoints() const noexcept = 0; - virtual void setNumControlPoints(size_t size) = 0; + virtual GradingBSplineCurveRcPtr createEditableCopy() const = 0; + virtual size_t getNumControlPoints() const noexcept = 0; + virtual void setNumControlPoints(size_t size) = 0; virtual const GradingControlPoint & getControlPoint(size_t index) const = 0; - virtual GradingControlPoint & getControlPoint(size_t index) = 0; - virtual float getSlope(size_t index) const = 0; - virtual void setSlope(size_t index, float slope) = 0; - virtual bool slopesAreDefault() const = 0; - virtual void validate() const = 0; + virtual GradingControlPoint & getControlPoint(size_t index) = 0; + virtual float getSlope(size_t index) const = 0; + virtual void setSlope(size_t index, float slope) = 0; + virtual bool slopesAreDefault() const = 0; + virtual void validate() const = 0; - GradingBSplineCurve(const GradingBSplineCurve &) = delete; - GradingBSplineCurve & operator= (const GradingBSplineCurve &) = delete; + GradingBSplineCurve(const GradingBSplineCurve &) = delete; + GradingBSplineCurve & operator=(const GradingBSplineCurve &) = delete; /// Do not use (needed only for pybind11). virtual ~GradingBSplineCurve() = default; @@ -549,16 +543,17 @@ class OCIOEXPORT GradingRGBCurve public: static GradingRGBCurveRcPtr Create(GradingStyle style); static GradingRGBCurveRcPtr Create(const ConstGradingRGBCurveRcPtr & rhs); - static GradingRGBCurveRcPtr Create(const ConstGradingBSplineCurveRcPtr & red, - const ConstGradingBSplineCurveRcPtr & green, - const ConstGradingBSplineCurveRcPtr & blue, - const ConstGradingBSplineCurveRcPtr & master); - - virtual GradingRGBCurveRcPtr createEditableCopy() const = 0; - virtual void validate() const = 0; - virtual bool isIdentity() const = 0; + static GradingRGBCurveRcPtr Create( + const ConstGradingBSplineCurveRcPtr & red, + const ConstGradingBSplineCurveRcPtr & green, + const ConstGradingBSplineCurveRcPtr & blue, + const ConstGradingBSplineCurveRcPtr & master); + + virtual GradingRGBCurveRcPtr createEditableCopy() const = 0; + virtual void validate() const = 0; + virtual bool isIdentity() const = 0; virtual ConstGradingBSplineCurveRcPtr getCurve(RGBCurveType c) const = 0; - virtual GradingBSplineCurveRcPtr getCurve(RGBCurveType c) = 0; + virtual GradingBSplineCurveRcPtr getCurve(RGBCurveType c) = 0; /// Do not use (needed only for pybind11). virtual ~GradingRGBCurve() = default; @@ -582,21 +577,21 @@ struct OCIOEXPORT GradingRGBMSW { GradingRGBMSW() = default; GradingRGBMSW(double red, double green, double blue, double master, double start, double width) - : m_red (red) - , m_green (green) - , m_blue (blue) + : m_red(red) + , m_green(green) + , m_blue(blue) , m_master(master) - , m_start (start) - , m_width (width) + , m_start(start) + , m_width(width) { } - GradingRGBMSW(const double(&rgbmsw)[6]) - : m_red (rgbmsw[0]) - , m_green (rgbmsw[1]) - , m_blue (rgbmsw[2]) + GradingRGBMSW(const double (&rgbmsw)[6]) + : m_red(rgbmsw[0]) + , m_green(rgbmsw[1]) + , m_blue(rgbmsw[2]) , m_master(rgbmsw[3]) - , m_start (rgbmsw[4]) - , m_width (rgbmsw[5]) + , m_start(rgbmsw[4]) + , m_width(rgbmsw[5]) { } GradingRGBMSW(double start, double width) @@ -604,12 +599,12 @@ struct OCIOEXPORT GradingRGBMSW , m_width(width) { } - double m_red { 1. }; - double m_green { 1. }; - double m_blue { 1. }; - double m_master{ 1. }; - double m_start { 0. }; // Or center for midtones. - double m_width { 1. }; // Or pivot for shadows and highlights. + double m_red{1.}; + double m_green{1.}; + double m_blue{1.}; + double m_master{1.}; + double m_start{0.}; // Or center for midtones. + double m_width{1.}; // Or pivot for shadows and highlights. }; extern OCIOEXPORT bool operator==(const GradingRGBMSW & lhs, const GradingRGBMSW & rhs); @@ -621,21 +616,26 @@ struct OCIOEXPORT GradingTone { GradingTone() = delete; explicit GradingTone(GradingStyle style) - : m_blacks(style == GRADING_LIN ? GradingRGBMSW(0., 4.) : - (style == GRADING_LOG ? GradingRGBMSW(0.4, 0.4) : - GradingRGBMSW(0.4, 0.4))) - , m_shadows(style == GRADING_LIN ? GradingRGBMSW(2., -7.) : - (style == GRADING_LOG ? GradingRGBMSW(0.5, 0.) : - GradingRGBMSW(0.6, 0.))) - , m_midtones(style == GRADING_LIN ? GradingRGBMSW(0., 8.) : - (style == GRADING_LOG ? GradingRGBMSW(0.4, 0.6) : - GradingRGBMSW(0.4, 0.7))) - , m_highlights(style == GRADING_LIN ? GradingRGBMSW(-2., 9.) : - (style == GRADING_LOG ? GradingRGBMSW(0.3, 1.) : - GradingRGBMSW(0.2, 1.))) - , m_whites(style == GRADING_LIN ? GradingRGBMSW(0., 8.) : - (style == GRADING_LOG ? GradingRGBMSW(0.4, 0.5) : - GradingRGBMSW(0.5, 0.5))) + : m_blacks( + style == GRADING_LIN + ? GradingRGBMSW(0., 4.) + : (style == GRADING_LOG ? GradingRGBMSW(0.4, 0.4) : GradingRGBMSW(0.4, 0.4))) + , m_shadows( + style == GRADING_LIN + ? GradingRGBMSW(2., -7.) + : (style == GRADING_LOG ? GradingRGBMSW(0.5, 0.) : GradingRGBMSW(0.6, 0.))) + , m_midtones( + style == GRADING_LIN + ? GradingRGBMSW(0., 8.) + : (style == GRADING_LOG ? GradingRGBMSW(0.4, 0.6) : GradingRGBMSW(0.4, 0.7))) + , m_highlights( + style == GRADING_LIN + ? GradingRGBMSW(-2., 9.) + : (style == GRADING_LOG ? GradingRGBMSW(0.3, 1.) : GradingRGBMSW(0.2, 1.))) + , m_whites( + style == GRADING_LIN + ? GradingRGBMSW(0., 8.) + : (style == GRADING_LOG ? GradingRGBMSW(0.4, 0.5) : GradingRGBMSW(0.5, 0.5))) { } @@ -650,7 +650,7 @@ struct OCIOEXPORT GradingTone GradingRGBMSW m_midtones; GradingRGBMSW m_highlights; GradingRGBMSW m_whites; - double m_scontrast{ 1.0 }; + double m_scontrast{1.0}; }; extern OCIOEXPORT bool operator==(const GradingTone & lhs, const GradingTone & rhs); @@ -708,7 +708,7 @@ class OCIOEXPORT DynamicProperty virtual DynamicPropertyType getType() const noexcept = 0; DynamicProperty & operator=(const DynamicProperty &) = delete; - DynamicProperty(const DynamicProperty &) = delete; + DynamicProperty(const DynamicProperty &) = delete; /// Do not use (needed only for pybind11). virtual ~DynamicProperty() = default; @@ -733,22 +733,23 @@ extern OCIOEXPORT DynamicPropertyGradingPrimaryRcPtr AsGradingPrimary(DynamicPro * Get the property as DynamicPropertyGradingRGBCurveRcPtr to access the GradingRGBCurveRcPtr * value. Will throw if property type is not DYNAMIC_PROPERTY_GRADING_RGBCURVE. */ -extern OCIOEXPORT DynamicPropertyGradingRGBCurveRcPtr AsGradingRGBCurve(DynamicPropertyRcPtr & prop); +extern OCIOEXPORT DynamicPropertyGradingRGBCurveRcPtr +AsGradingRGBCurve(DynamicPropertyRcPtr & prop); /** * Get the property as DynamicPropertyGradingToneRcPtr to access the GradingTone value. Will throw * if property type is not DYNAMIC_PROPERTY_GRADING_TONE. */ extern OCIOEXPORT DynamicPropertyGradingToneRcPtr AsGradingTone(DynamicPropertyRcPtr & prop); -} +} // namespace DynamicPropertyValue /// Interface used to access dynamic property double value. class OCIOEXPORT DynamicPropertyDouble { public: - virtual double getValue() const = 0; + virtual double getValue() const = 0; virtual void setValue(double value) = 0; - DynamicPropertyDouble(const DynamicPropertyDouble &) = delete; + DynamicPropertyDouble(const DynamicPropertyDouble &) = delete; DynamicPropertyDouble & operator=(const DynamicPropertyDouble &) = delete; /// Do not use (needed only for pybind11). virtual ~DynamicPropertyDouble() = default; @@ -765,7 +766,7 @@ class OCIOEXPORT DynamicPropertyGradingPrimary /// Will throw if value is not valid. virtual void setValue(const GradingPrimary & value) = 0; - DynamicPropertyGradingPrimary(const DynamicPropertyGradingPrimary &) = delete; + DynamicPropertyGradingPrimary(const DynamicPropertyGradingPrimary &) = delete; DynamicPropertyGradingPrimary & operator=(const DynamicPropertyGradingPrimary &) = delete; /// Do not use (needed only for pybind11). virtual ~DynamicPropertyGradingPrimary() = default; @@ -782,7 +783,7 @@ class OCIOEXPORT DynamicPropertyGradingRGBCurve /// Will throw if value is not valid. virtual void setValue(const ConstGradingRGBCurveRcPtr & value) = 0; - DynamicPropertyGradingRGBCurve(const DynamicPropertyGradingRGBCurve &) = delete; + DynamicPropertyGradingRGBCurve(const DynamicPropertyGradingRGBCurve &) = delete; DynamicPropertyGradingRGBCurve & operator=(const DynamicPropertyGradingRGBCurve &) = delete; /// Do not use (needed only for pybind11). virtual ~DynamicPropertyGradingRGBCurve() = default; @@ -799,7 +800,7 @@ class OCIOEXPORT DynamicPropertyGradingTone /// Will throw if value is not valid. virtual void setValue(const GradingTone & value) = 0; - DynamicPropertyGradingTone(const DynamicPropertyGradingTone &) = delete; + DynamicPropertyGradingTone(const DynamicPropertyGradingTone &) = delete; DynamicPropertyGradingTone & operator=(const DynamicPropertyGradingTone &) = delete; /// Do not use (needed only for pybind11). virtual ~DynamicPropertyGradingTone() = default; @@ -808,7 +809,6 @@ class OCIOEXPORT DynamicPropertyGradingTone DynamicPropertyGradingTone() = default; }; - /** * \brief Represents exponent transform: pow( clamp(color), value ). * @@ -824,13 +824,13 @@ class OCIOEXPORT ExponentTransform : public Transform TransformType getTransformType() const noexcept override { return TRANSFORM_TYPE_EXPONENT; } virtual const FormatMetadata & getFormatMetadata() const noexcept = 0; - virtual FormatMetadata & getFormatMetadata() noexcept = 0; + virtual FormatMetadata & getFormatMetadata() noexcept = 0; /// Checks if this exactly equals other. virtual bool equals(const ExponentTransform & other) const noexcept = 0; - virtual void getValue(double(&vec4)[4]) const noexcept = 0; - virtual void setValue(const double(&vec4)[4]) noexcept = 0; + virtual void getValue(double (&vec4)[4]) const noexcept = 0; + virtual void setValue(const double (&vec4)[4]) noexcept = 0; /** * Specifies how negative values are handled. Legal values: @@ -840,11 +840,11 @@ class OCIOEXPORT ExponentTransform : public Transform * handle negatives. * * NEGATIVE_PASS_THRU -- Negative values are passed through unchanged. */ - virtual NegativeStyle getNegativeStyle() const = 0; + virtual NegativeStyle getNegativeStyle() const = 0; virtual void setNegativeStyle(NegativeStyle style) = 0; - - ExponentTransform(const ExponentTransform &) = delete; - ExponentTransform & operator= (const ExponentTransform &) = delete; + + ExponentTransform(const ExponentTransform &) = delete; + ExponentTransform & operator=(const ExponentTransform &) = delete; /// Do not use (needed only for pybind11). virtual ~ExponentTransform() = default; @@ -854,7 +854,6 @@ class OCIOEXPORT ExponentTransform : public Transform extern OCIOEXPORT std::ostream & operator<<(std::ostream &, const ExponentTransform &); - /** * Represents power functions with a linear section in the shadows * such as sRGB and L*. @@ -871,32 +870,35 @@ class OCIOEXPORT ExponentWithLinearTransform : public Transform public: static ExponentWithLinearTransformRcPtr Create(); - TransformType getTransformType() const noexcept override { return TRANSFORM_TYPE_EXPONENT_WITH_LINEAR; } + TransformType getTransformType() const noexcept override + { + return TRANSFORM_TYPE_EXPONENT_WITH_LINEAR; + } virtual const FormatMetadata & getFormatMetadata() const noexcept = 0; - virtual FormatMetadata & getFormatMetadata() noexcept = 0; + virtual FormatMetadata & getFormatMetadata() noexcept = 0; /// Checks if this exactly equals other. virtual bool equals(const ExponentWithLinearTransform & other) const noexcept = 0; - virtual void getGamma(double(&values)[4]) const noexcept = 0; + virtual void getGamma(double (&values)[4]) const noexcept = 0; /** * Set the exponent value for the power function for R, G, B, A. * - * \note + * \note * The gamma values must be in the range of [1, 10]. Set the transform direction * to inverse to obtain the effect of values less than 1. */ - virtual void setGamma(const double(&values)[4]) noexcept = 0; + virtual void setGamma(const double (&values)[4]) noexcept = 0; - virtual void getOffset(double(&values)[4]) const noexcept = 0; + virtual void getOffset(double (&values)[4]) const noexcept = 0; /** * Set the offset value for the power function for R, G, B, A. * - * \note + * \note * The offset values must be in the range [0, 0.9]. */ - virtual void setOffset(const double(&values)[4]) noexcept = 0; + virtual void setOffset(const double (&values)[4]) noexcept = 0; /** * Specifies how negative values are handled. Legal values: @@ -905,11 +907,11 @@ class OCIOEXPORT ExponentWithLinearTransform : public Transform * * NEGATIVE_MIRROR -- Positive curve is rotated 180 degrees around the origin to * handle negatives. */ - virtual NegativeStyle getNegativeStyle() const = 0; + virtual NegativeStyle getNegativeStyle() const = 0; virtual void setNegativeStyle(NegativeStyle style) = 0; - - ExponentWithLinearTransform(const ExponentWithLinearTransform &) = delete; - ExponentWithLinearTransform & operator= (const ExponentWithLinearTransform &) = delete; + + ExponentWithLinearTransform(const ExponentWithLinearTransform &) = delete; + ExponentWithLinearTransform & operator=(const ExponentWithLinearTransform &) = delete; /// Do not use (needed only for pybind11). virtual ~ExponentWithLinearTransform() = default; @@ -929,10 +931,13 @@ class OCIOEXPORT ExposureContrastTransform : public Transform public: static ExposureContrastTransformRcPtr Create(); - TransformType getTransformType() const noexcept override { return TRANSFORM_TYPE_EXPOSURE_CONTRAST; } + TransformType getTransformType() const noexcept override + { + return TRANSFORM_TYPE_EXPOSURE_CONTRAST; + } virtual const FormatMetadata & getFormatMetadata() const noexcept = 0; - virtual FormatMetadata & getFormatMetadata() noexcept = 0; + virtual FormatMetadata & getFormatMetadata() noexcept = 0; /// Checks if this exactly equals other. virtual bool equals(const ExposureContrastTransform & other) const noexcept = 0; @@ -952,8 +957,8 @@ class OCIOEXPORT ExposureContrastTransform : public Transform * but if there are several ExposureContrastTransform only one can have a dynamic exposure. */ virtual bool isExposureDynamic() const = 0; - virtual void makeExposureDynamic() = 0; - virtual void makeExposureNonDynamic() = 0; + virtual void makeExposureDynamic() = 0; + virtual void makeExposureNonDynamic() = 0; virtual double getContrast() const = 0; /** @@ -968,18 +973,18 @@ class OCIOEXPORT ExposureContrastTransform : public Transform * but if there are several ExposureContrastTransform only one can have a dynamic contrast. */ virtual bool isContrastDynamic() const = 0; - virtual void makeContrastDynamic() = 0; - virtual void makeContrastNonDynamic() = 0; + virtual void makeContrastDynamic() = 0; + virtual void makeContrastNonDynamic() = 0; - virtual double getGamma() const = 0; + virtual double getGamma() const = 0; virtual void setGamma(double gamma) = 0; /** * Gamma can be made dynamic so the value can be changed through the CPU or GPU processor, * but if there are several ExposureContrastTransform only one can have a dynamic gamma. */ virtual bool isGammaDynamic() const = 0; - virtual void makeGammaDynamic() = 0; - virtual void makeGammaNonDynamic() = 0; + virtual void makeGammaDynamic() = 0; + virtual void makeGammaNonDynamic() = 0; virtual double getPivot() const = 0; /** @@ -1015,13 +1020,11 @@ class OCIOEXPORT ExposureContrastTransform : public Transform ExposureContrastTransform() = default; private: - ExposureContrastTransform(const ExposureContrastTransform &) = delete; - ExposureContrastTransform & operator= (const ExposureContrastTransform &) = delete; + ExposureContrastTransform(const ExposureContrastTransform &) = delete; + ExposureContrastTransform & operator=(const ExposureContrastTransform &) = delete; }; -extern OCIOEXPORT std::ostream & operator<<(std::ostream &, - const ExposureContrastTransform &); - +extern OCIOEXPORT std::ostream & operator<<(std::ostream &, const ExposureContrastTransform &); class OCIOEXPORT FileTransform : public Transform { @@ -1096,7 +1099,6 @@ class OCIOEXPORT FileTransform : public Transform extern OCIOEXPORT std::ostream & operator<<(std::ostream &, const FileTransform &); - /** * Provides a set of hard-coded algorithmic building blocks * that are needed to accurately implement various common color transformations. @@ -1105,14 +1107,16 @@ class OCIOEXPORT FixedFunctionTransform : public Transform { public: static FixedFunctionTransformRcPtr Create(FixedFunctionStyle style); - static FixedFunctionTransformRcPtr Create(FixedFunctionStyle style, - const double * params, - size_t num); + static FixedFunctionTransformRcPtr + Create(FixedFunctionStyle style, const double * params, size_t num); - TransformType getTransformType() const noexcept override { return TRANSFORM_TYPE_FIXED_FUNCTION; } + TransformType getTransformType() const noexcept override + { + return TRANSFORM_TYPE_FIXED_FUNCTION; + } virtual const FormatMetadata & getFormatMetadata() const noexcept = 0; - virtual FormatMetadata & getFormatMetadata() noexcept = 0; + virtual FormatMetadata & getFormatMetadata() noexcept = 0; /// Checks if this exactly equals other. virtual bool equals(const FixedFunctionTransform & other) const noexcept = 0; @@ -1121,13 +1125,13 @@ class OCIOEXPORT FixedFunctionTransform : public Transform /// Select which algorithm to use. virtual void setStyle(FixedFunctionStyle style) = 0; - virtual size_t getNumParams() const = 0; + virtual size_t getNumParams() const = 0; virtual void getParams(double * params) const = 0; /// Set the parameters (for functions that require them). virtual void setParams(const double * params, size_t num) = 0; - FixedFunctionTransform(const FixedFunctionTransform &) = delete; - FixedFunctionTransform & operator= (const FixedFunctionTransform &) = delete; + FixedFunctionTransform(const FixedFunctionTransform &) = delete; + FixedFunctionTransform & operator=(const FixedFunctionTransform &) = delete; /// Do not use (needed only for pybind11). virtual ~FixedFunctionTransform() = default; @@ -1137,7 +1141,6 @@ class OCIOEXPORT FixedFunctionTransform : public Transform extern OCIOEXPORT std::ostream & operator<<(std::ostream &, const FixedFunctionTransform &); - /** * Primary color correction controls. * @@ -1160,10 +1163,13 @@ class OCIOEXPORT GradingPrimaryTransform : public Transform /// Creates an instance of GradingPrimaryTransform. static GradingPrimaryTransformRcPtr Create(GradingStyle style); - TransformType getTransformType() const noexcept override { return TRANSFORM_TYPE_GRADING_PRIMARY; } + TransformType getTransformType() const noexcept override + { + return TRANSFORM_TYPE_GRADING_PRIMARY; + } virtual const FormatMetadata & getFormatMetadata() const noexcept = 0; - virtual FormatMetadata & getFormatMetadata() noexcept = 0; + virtual FormatMetadata & getFormatMetadata() noexcept = 0; /// Checks if this equals other. virtual bool equals(const GradingPrimaryTransform & other) const noexcept = 0; @@ -1182,11 +1188,11 @@ class OCIOEXPORT GradingPrimaryTransform : public Transform * but if there are several GradingPrimaryTransform only one can have dynamic parameters. */ virtual bool isDynamic() const noexcept = 0; - virtual void makeDynamic() noexcept = 0; - virtual void makeNonDynamic() noexcept = 0; + virtual void makeDynamic() noexcept = 0; + virtual void makeNonDynamic() noexcept = 0; - GradingPrimaryTransform(const GradingPrimaryTransform &) = delete; - GradingPrimaryTransform & operator= (const GradingPrimaryTransform &) = delete; + GradingPrimaryTransform(const GradingPrimaryTransform &) = delete; + GradingPrimaryTransform & operator=(const GradingPrimaryTransform &) = delete; /// Do not use (needed only for pybind11). virtual ~GradingPrimaryTransform() = default; @@ -1194,8 +1200,9 @@ class OCIOEXPORT GradingPrimaryTransform : public Transform GradingPrimaryTransform() = default; }; -extern OCIOEXPORT std::ostream & operator<<(std::ostream &, const GradingPrimaryTransform &) noexcept; - +extern OCIOEXPORT std::ostream & operator<<( + std::ostream &, + const GradingPrimaryTransform &) noexcept; /** * RGB curve color correction controls. @@ -1216,10 +1223,13 @@ class OCIOEXPORT GradingRGBCurveTransform : public Transform /// Creates an instance of GradingPrimaryTransform. static GradingRGBCurveTransformRcPtr Create(GradingStyle style); - TransformType getTransformType() const noexcept override { return TRANSFORM_TYPE_GRADING_RGB_CURVE; } + TransformType getTransformType() const noexcept override + { + return TRANSFORM_TYPE_GRADING_RGB_CURVE; + } virtual const FormatMetadata & getFormatMetadata() const noexcept = 0; - virtual FormatMetadata & getFormatMetadata() noexcept = 0; + virtual FormatMetadata & getFormatMetadata() noexcept = 0; /// Checks if this equals other. virtual bool equals(const GradingRGBCurveTransform & other) const noexcept = 0; @@ -1234,23 +1244,23 @@ class OCIOEXPORT GradingRGBCurveTransform : public Transform virtual void setValue(const ConstGradingRGBCurveRcPtr & values) = 0; /** - * It is possible to provide a desired slope value for each control point. The number of slopes is - * always the same as the number of control points and so the control points must be set before - * setting the slopes. The slopes are primarily intended for use by config authors looking to match - * a specific shape with as few control points as possible, they are not intended to be exposed to - * a user interface for direct manipulation. When a curve is being generated for creative purposes - * it is better to let OCIO calculate the slopes automatically. + * It is possible to provide a desired slope value for each control point. The number of slopes + * is always the same as the number of control points and so the control points must be set + * before setting the slopes. The slopes are primarily intended for use by config authors + * looking to match a specific shape with as few control points as possible, they are not + * intended to be exposed to a user interface for direct manipulation. When a curve is being + * generated for creative purposes it is better to let OCIO calculate the slopes automatically. */ - virtual float getSlope(RGBCurveType c, size_t index) const = 0; + virtual float getSlope(RGBCurveType c, size_t index) const = 0; virtual void setSlope(RGBCurveType c, size_t index, float slope) = 0; - virtual bool slopesAreDefault(RGBCurveType c) const = 0; + virtual bool slopesAreDefault(RGBCurveType c) const = 0; /** * The scene-linear grading style applies a lin-to-log transform to the pixel * values before going through the curve. However, in some cases (e.g. drawing curves in a UI) * it may be useful to bypass the lin-to-log. Default value is false. */ - virtual bool getBypassLinToLog() const = 0; + virtual bool getBypassLinToLog() const = 0; virtual void setBypassLinToLog(bool bypass) = 0; /** @@ -1258,11 +1268,11 @@ class OCIOEXPORT GradingRGBCurveTransform : public Transform * but if there are several GradingRGBCurveTransform only one can have dynamic parameters. */ virtual bool isDynamic() const noexcept = 0; - virtual void makeDynamic() noexcept = 0; - virtual void makeNonDynamic() noexcept = 0; + virtual void makeDynamic() noexcept = 0; + virtual void makeNonDynamic() noexcept = 0; - GradingRGBCurveTransform(const GradingRGBCurveTransform &) = delete; - GradingRGBCurveTransform & operator= (const GradingRGBCurveTransform &) = delete; + GradingRGBCurveTransform(const GradingRGBCurveTransform &) = delete; + GradingRGBCurveTransform & operator=(const GradingRGBCurveTransform &) = delete; /// Do not use (needed only for pybind11). virtual ~GradingRGBCurveTransform() = default; @@ -1270,8 +1280,9 @@ class OCIOEXPORT GradingRGBCurveTransform : public Transform GradingRGBCurveTransform() = default; }; -extern OCIOEXPORT std::ostream & operator<<(std::ostream &, const GradingRGBCurveTransform &) noexcept; - +extern OCIOEXPORT std::ostream & operator<<( + std::ostream &, + const GradingRGBCurveTransform &) noexcept; /** * Tonal color correction controls. @@ -1292,7 +1303,7 @@ extern OCIOEXPORT std::ostream & operator<<(std::ostream &, const GradingRGBCurv * Each control allows R, G, B adjustments and a Master adjustment. * * There is also an S-contrast control for imparting an S-shape curve. - * + * * The controls are dynamic, so they may be adjusted even after the Transform has been included * in a Processor. */ @@ -1305,7 +1316,7 @@ class OCIOEXPORT GradingToneTransform : public Transform TransformType getTransformType() const noexcept override { return TRANSFORM_TYPE_GRADING_TONE; } virtual const FormatMetadata & getFormatMetadata() const noexcept = 0; - virtual FormatMetadata & getFormatMetadata() noexcept = 0; + virtual FormatMetadata & getFormatMetadata() noexcept = 0; virtual bool equals(const GradingToneTransform & other) const noexcept = 0; @@ -1314,7 +1325,7 @@ class OCIOEXPORT GradingToneTransform : public Transform /// Will reset value to style's defaults if style is not the current style. virtual void setStyle(GradingStyle style) noexcept = 0; - virtual const GradingTone & getValue() const = 0; + virtual const GradingTone & getValue() const = 0; virtual void setValue(const GradingTone & values) = 0; /** @@ -1322,11 +1333,11 @@ class OCIOEXPORT GradingToneTransform : public Transform * but if there are several GradingToneTransform only one can have dynamic parameters. */ virtual bool isDynamic() const noexcept = 0; - virtual void makeDynamic() noexcept = 0; - virtual void makeNonDynamic() noexcept = 0; + virtual void makeDynamic() noexcept = 0; + virtual void makeNonDynamic() noexcept = 0; - GradingToneTransform(const GradingToneTransform &) = delete; - GradingToneTransform & operator= (const GradingToneTransform &) = delete; + GradingToneTransform(const GradingToneTransform &) = delete; + GradingToneTransform & operator=(const GradingToneTransform &) = delete; /// Do not use (needed only for pybind11). virtual ~GradingToneTransform() = default; @@ -1336,14 +1347,13 @@ class OCIOEXPORT GradingToneTransform : public Transform extern OCIOEXPORT std::ostream & operator<<(std::ostream &, const GradingToneTransform &) noexcept; - class OCIOEXPORT GroupTransform : public Transform { public: static GroupTransformRcPtr Create(); virtual const FormatMetadata & getFormatMetadata() const noexcept = 0; - virtual FormatMetadata & getFormatMetadata() noexcept = 0; + virtual FormatMetadata & getFormatMetadata() noexcept = 0; /// Throws if index is not allowed. virtual ConstTransformRcPtr getTransform(int index) const = 0; @@ -1378,9 +1388,9 @@ class OCIOEXPORT GroupTransform : public Transform * } * \endcode */ - virtual void write(const ConstConfigRcPtr & config, - const char * formatName, - std::ostream & os) const = 0; + virtual void write(const ConstConfigRcPtr & config, const char * formatName, std::ostream & os) + const + = 0; /// Get the number of writers. static int GetNumWriteFormats() noexcept; @@ -1389,7 +1399,7 @@ class OCIOEXPORT GroupTransform : public Transform static const char * GetFormatNameByIndex(int index) noexcept; static const char * GetFormatExtensionByIndex(int index) noexcept; - GroupTransform(const GroupTransform &) = delete; + GroupTransform(const GroupTransform &) = delete; GroupTransform & operator=(const GroupTransform &) = delete; /// Do not use (needed only for pybind11). virtual ~GroupTransform() = default; @@ -1400,8 +1410,6 @@ class OCIOEXPORT GroupTransform : public Transform extern OCIOEXPORT std::ostream & operator<<(std::ostream &, const GroupTransform &); - - /** * Applies a logarithm with an affine transform before and after. * Represents the Cineon lin-to-log type transforms:: @@ -1419,27 +1427,27 @@ class OCIOEXPORT LogAffineTransform : public Transform TransformType getTransformType() const noexcept override { return TRANSFORM_TYPE_LOG_AFFINE; } virtual const FormatMetadata & getFormatMetadata() const noexcept = 0; - virtual FormatMetadata & getFormatMetadata() noexcept = 0; + virtual FormatMetadata & getFormatMetadata() noexcept = 0; /// Checks if this exactly equals other. virtual bool equals(const LogAffineTransform & other) const noexcept = 0; - virtual double getBase() const noexcept = 0; + virtual double getBase() const noexcept = 0; virtual void setBase(double base) noexcept = 0; // !rst:: **Get/Set values for the R, G, B components** - virtual void getLogSideSlopeValue(double(&values)[3]) const noexcept = 0; - virtual void setLogSideSlopeValue(const double(&values)[3]) noexcept = 0; - virtual void getLogSideOffsetValue(double(&values)[3]) const noexcept = 0; - virtual void setLogSideOffsetValue(const double(&values)[3]) noexcept = 0; - virtual void getLinSideSlopeValue(double(&values)[3]) const noexcept = 0; - virtual void setLinSideSlopeValue(const double(&values)[3]) noexcept = 0; - virtual void getLinSideOffsetValue(double(&values)[3]) const noexcept = 0; - virtual void setLinSideOffsetValue(const double(&values)[3]) noexcept = 0; - - LogAffineTransform(const LogAffineTransform &) = delete; - LogAffineTransform & operator= (const LogAffineTransform &) = delete; + virtual void getLogSideSlopeValue(double (&values)[3]) const noexcept = 0; + virtual void setLogSideSlopeValue(const double (&values)[3]) noexcept = 0; + virtual void getLogSideOffsetValue(double (&values)[3]) const noexcept = 0; + virtual void setLogSideOffsetValue(const double (&values)[3]) noexcept = 0; + virtual void getLinSideSlopeValue(double (&values)[3]) const noexcept = 0; + virtual void setLinSideSlopeValue(const double (&values)[3]) noexcept = 0; + virtual void getLinSideOffsetValue(double (&values)[3]) const noexcept = 0; + virtual void setLinSideOffsetValue(const double (&values)[3]) noexcept = 0; + + LogAffineTransform(const LogAffineTransform &) = delete; + LogAffineTransform & operator=(const LogAffineTransform &) = delete; /// Do not use (needed only for pybind11). virtual ~LogAffineTransform() = default; @@ -1449,13 +1457,12 @@ class OCIOEXPORT LogAffineTransform : public Transform extern OCIOEXPORT std::ostream & operator<<(std::ostream &, const LogAffineTransform &); - /** * Same as LogAffineTransform but with the addition of a linear segment near black. This formula * is used for many camera logs (e.g., LogC) as well as ACEScct. * * * The linSideBreak specifies the point on the linear axis where the log and linear - * segments meet. It must be set (there is no default). + * segments meet. It must be set (there is no default). * * The linearSlope specifies the slope of the linear segment of the forward (linToLog) * transform. By default it is set equal to the slope of the log curve at the break point. */ @@ -1463,45 +1470,45 @@ class OCIOEXPORT LogCameraTransform : public Transform { public: /// LinSideBreak must be set for the transform to be valid (there is no default). - static LogCameraTransformRcPtr Create(const double(&linSideBreakValues)[3]); + static LogCameraTransformRcPtr Create(const double (&linSideBreakValues)[3]); TransformType getTransformType() const noexcept override { return TRANSFORM_TYPE_LOG_CAMERA; } virtual const FormatMetadata & getFormatMetadata() const noexcept = 0; - virtual FormatMetadata & getFormatMetadata() noexcept = 0; + virtual FormatMetadata & getFormatMetadata() noexcept = 0; /// Checks if this exactly equals other. virtual bool equals(const LogCameraTransform & other) const noexcept = 0; - virtual double getBase() const noexcept = 0; + virtual double getBase() const noexcept = 0; virtual void setBase(double base) noexcept = 0; /// Get/Set values for the R, G, B components. - virtual void getLogSideSlopeValue(double(&values)[3]) const noexcept = 0; - virtual void setLogSideSlopeValue(const double(&values)[3]) noexcept = 0; - virtual void getLogSideOffsetValue(double(&values)[3]) const noexcept = 0; - virtual void setLogSideOffsetValue(const double(&values)[3]) noexcept = 0; - virtual void getLinSideSlopeValue(double(&values)[3]) const noexcept = 0; - virtual void setLinSideSlopeValue(const double(&values)[3]) noexcept = 0; - virtual void getLinSideOffsetValue(double(&values)[3]) const noexcept = 0; - virtual void setLinSideOffsetValue(const double(&values)[3]) noexcept = 0; - virtual void getLinSideBreakValue(double(&values)[3]) const noexcept = 0; - virtual void setLinSideBreakValue(const double(&values)[3]) noexcept = 0; + virtual void getLogSideSlopeValue(double (&values)[3]) const noexcept = 0; + virtual void setLogSideSlopeValue(const double (&values)[3]) noexcept = 0; + virtual void getLogSideOffsetValue(double (&values)[3]) const noexcept = 0; + virtual void setLogSideOffsetValue(const double (&values)[3]) noexcept = 0; + virtual void getLinSideSlopeValue(double (&values)[3]) const noexcept = 0; + virtual void setLinSideSlopeValue(const double (&values)[3]) noexcept = 0; + virtual void getLinSideOffsetValue(double (&values)[3]) const noexcept = 0; + virtual void setLinSideOffsetValue(const double (&values)[3]) noexcept = 0; + virtual void getLinSideBreakValue(double (&values)[3]) const noexcept = 0; + virtual void setLinSideBreakValue(const double (&values)[3]) noexcept = 0; /// Return true if LinearSlope values were set, false if they were not. - virtual bool getLinearSlopeValue(double(&values)[3]) const = 0; + virtual bool getLinearSlopeValue(double (&values)[3]) const = 0; /** * \brief Set LinearSlope value. - * + * * \note * You must call setLinSideBreakValue before calling this. */ - virtual void setLinearSlopeValue(const double(&values)[3]) = 0; + virtual void setLinearSlopeValue(const double (&values)[3]) = 0; /// Remove LinearSlope values so that default values are used. virtual void unsetLinearSlopeValue() = 0; - - LogCameraTransform(const LogCameraTransform &) = delete; - LogCameraTransform & operator= (const LogCameraTransform &) = delete; + + LogCameraTransform(const LogCameraTransform &) = delete; + LogCameraTransform & operator=(const LogCameraTransform &) = delete; /// Do not use (needed only for pybind11). virtual ~LogCameraTransform() = default; @@ -1511,7 +1518,6 @@ class OCIOEXPORT LogCameraTransform : public Transform extern OCIOEXPORT std::ostream & operator<<(std::ostream &, const LogCameraTransform &); - /** * Represents log transform: log(color, base) * @@ -1527,16 +1533,16 @@ class OCIOEXPORT LogTransform : public Transform TransformType getTransformType() const noexcept override { return TRANSFORM_TYPE_LOG; } virtual const FormatMetadata & getFormatMetadata() const noexcept = 0; - virtual FormatMetadata & getFormatMetadata() noexcept = 0; + virtual FormatMetadata & getFormatMetadata() noexcept = 0; /// Checks if this exactly equals other. virtual bool equals(const LogTransform & other) const noexcept = 0; - virtual double getBase() const noexcept = 0; + virtual double getBase() const noexcept = 0; virtual void setBase(double val) noexcept = 0; - LogTransform(const LogTransform &) = delete; - LogTransform & operator= (const LogTransform &) = delete; + LogTransform(const LogTransform &) = delete; + LogTransform & operator=(const LogTransform &) = delete; /// Do not use (needed only for pybind11). virtual ~LogTransform() = default; @@ -1546,7 +1552,6 @@ class OCIOEXPORT LogTransform : public Transform extern OCIOEXPORT std::ostream & operator<<(std::ostream &, const LogTransform &); - class OCIOEXPORT LookTransform : public Transform { public: @@ -1586,9 +1591,10 @@ class OCIOEXPORT LookTransform : public Transform * to the process space of the last look in the look sequence (and takes into account that * a look fall-back may be used). */ - static const char * GetLooksResultColorSpace(const ConstConfigRcPtr & config, - const ConstContextRcPtr & context, - const char * looks); + static const char * GetLooksResultColorSpace( + const ConstConfigRcPtr & config, + const ConstContextRcPtr & context, + const char * looks); LookTransform & operator=(const LookTransform &) = delete; /// Do not use (needed only for pybind11). @@ -1608,7 +1614,6 @@ class OCIOEXPORT LookTransform : public Transform extern OCIOEXPORT std::ostream & operator<<(std::ostream &, const LookTransform &); - /// Represents a 1D-LUT transform. class OCIOEXPORT Lut1DTransform : public Transform { @@ -1620,8 +1625,7 @@ class OCIOEXPORT Lut1DTransform : public Transform * Create an identity 1D-LUT with specific length and * half-domain setting. Will throw for lengths longer than 1024x1024. */ - static Lut1DTransformRcPtr Create(unsigned long length, - bool isHalfDomain); + static Lut1DTransformRcPtr Create(unsigned long length, bool isHalfDomain); TransformType getTransformType() const noexcept override { return TRANSFORM_TYPE_LUT1D; } @@ -1636,7 +1640,7 @@ class OCIOEXPORT Lut1DTransform : public Transform virtual void setFileOutputBitDepth(BitDepth bitDepth) noexcept = 0; virtual const FormatMetadata & getFormatMetadata() const noexcept = 0; - virtual FormatMetadata & getFormatMetadata() noexcept = 0; + virtual FormatMetadata & getFormatMetadata() noexcept = 0; /// Checks if this exactly equals other. virtual bool equals(const Lut1DTransform & other) const noexcept = 0; @@ -1684,7 +1688,7 @@ class OCIOEXPORT Lut1DTransform : public Transform * For example, the value 1.0 would be written as the integer 15360 * because it has the same bit-pattern. Note that this implies the * values will be quantized to a 16-bit float. Note that this setting - * only controls the output formatting (where supported) and not the + * only controls the output formatting (where supported) and not the * values for getValue/setValue. The only file formats that currently * support this are CLF and CTF. */ @@ -1698,11 +1702,11 @@ class OCIOEXPORT Lut1DTransform : public Transform */ virtual void setHueAdjust(Lut1DHueAdjust algo) = 0; - virtual Interpolation getInterpolation() const = 0; + virtual Interpolation getInterpolation() const = 0; virtual void setInterpolation(Interpolation algo) = 0; - Lut1DTransform(const Lut1DTransform &) = delete; - Lut1DTransform & operator= (const Lut1DTransform &) = delete; + Lut1DTransform(const Lut1DTransform &) = delete; + Lut1DTransform & operator=(const Lut1DTransform &) = delete; /// Do not use (needed only for pybind11). virtual ~Lut1DTransform() = default; @@ -1710,8 +1714,7 @@ class OCIOEXPORT Lut1DTransform : public Transform Lut1DTransform() = default; }; -extern OCIOEXPORT std::ostream& operator<< (std::ostream&, const Lut1DTransform&); - +extern OCIOEXPORT std::ostream & operator<<(std::ostream &, const Lut1DTransform &); /// Represents a 3D-LUT transform. class OCIOEXPORT Lut3DTransform : public Transform @@ -1739,7 +1742,7 @@ class OCIOEXPORT Lut3DTransform : public Transform virtual void setFileOutputBitDepth(BitDepth bitDepth) noexcept = 0; virtual const FormatMetadata & getFormatMetadata() const noexcept = 0; - virtual FormatMetadata & getFormatMetadata() noexcept = 0; + virtual FormatMetadata & getFormatMetadata() noexcept = 0; /// Checks if this exactly equals other. virtual bool equals(const Lut3DTransform & other) const noexcept = 0; @@ -1751,10 +1754,14 @@ class OCIOEXPORT Lut3DTransform : public Transform */ virtual void setGridSize(unsigned long gridSize) = 0; - virtual void getValue(unsigned long indexR, - unsigned long indexG, - unsigned long indexB, - float & r, float & g, float & b) const = 0; + virtual void getValue( + unsigned long indexR, + unsigned long indexG, + unsigned long indexB, + float & r, + float & g, + float & b) const + = 0; /** * Set the values of a 3D-LUT. Will throw if an index is * outside of the range from 0 to (gridSize-1). @@ -1767,16 +1774,20 @@ class OCIOEXPORT Lut3DTransform : public Transform * depth, a value of 1023 in the file is normalized to 1.0. The values * here are unclamped and may extend outside [0,1]. */ - virtual void setValue(unsigned long indexR, - unsigned long indexG, - unsigned long indexB, - float r, float g, float b) = 0; - - virtual Interpolation getInterpolation() const = 0; + virtual void setValue( + unsigned long indexR, + unsigned long indexG, + unsigned long indexB, + float r, + float g, + float b) + = 0; + + virtual Interpolation getInterpolation() const = 0; virtual void setInterpolation(Interpolation algo) = 0; - Lut3DTransform(const Lut3DTransform &) = delete; - Lut3DTransform & operator= (const Lut3DTransform &) = delete; + Lut3DTransform(const Lut3DTransform &) = delete; + Lut3DTransform & operator=(const Lut3DTransform &) = delete; /// Do not use (needed only for pybind11). virtual ~Lut3DTransform() = default; @@ -1784,12 +1795,12 @@ class OCIOEXPORT Lut3DTransform : public Transform Lut3DTransform() = default; }; -extern OCIOEXPORT std::ostream& operator<< (std::ostream&, const Lut3DTransform&); +extern OCIOEXPORT std::ostream & operator<<(std::ostream &, const Lut3DTransform &); /** * Represents an MX+B Matrix transform. * - * \note + * \note * For singular matrices, an inverse direction will throw an exception during finalization. */ class OCIOEXPORT MatrixTransform : public Transform @@ -1800,7 +1811,7 @@ class OCIOEXPORT MatrixTransform : public Transform TransformType getTransformType() const noexcept override { return TRANSFORM_TYPE_MATRIX; } virtual const FormatMetadata & getFormatMetadata() const noexcept = 0; - virtual FormatMetadata & getFormatMetadata() noexcept = 0; + virtual FormatMetadata & getFormatMetadata() noexcept = 0; /// Checks if this exactly equals other. virtual bool equals(const MatrixTransform & other) const noexcept = 0; @@ -1834,7 +1845,7 @@ class OCIOEXPORT MatrixTransform : public Transform * outside [0,1]. */ virtual void setOffset(const double * offset4) = 0; - + /** * Get the bit-depths associated with the matrix values read from a * file or set the bit-depths of values to be written to a file @@ -1846,37 +1857,36 @@ class OCIOEXPORT MatrixTransform : public Transform * values and so this object always holds normalized values and * scaling is done on the way from or to file formats such as CLF. */ - virtual BitDepth getFileInputBitDepth() const noexcept = 0; - virtual void setFileInputBitDepth(BitDepth bitDepth) noexcept = 0; - virtual BitDepth getFileOutputBitDepth() const noexcept = 0; + virtual BitDepth getFileInputBitDepth() const noexcept = 0; + virtual void setFileInputBitDepth(BitDepth bitDepth) noexcept = 0; + virtual BitDepth getFileOutputBitDepth() const noexcept = 0; virtual void setFileOutputBitDepth(BitDepth bitDepth) noexcept = 0; - /// **Convenience functions** /// /// Build the matrix and offset corresponding to higher-level concepts. - /// + /// /// \note /// These can throw an exception if for any component /// ``oldmin == oldmax. (divide by 0)`` - static void Fit(double * m44, double* offset4, - const double * oldmin4, const double * oldmax4, - const double * newmin4, const double * newmax4); + static void Fit( + double * m44, + double * offset4, + const double * oldmin4, + const double * oldmax4, + const double * newmin4, + const double * newmax4); static void Identity(double * m44, double * offset4); - static void Sat(double * m44, double * offset4, - double sat, const double * lumaCoef3); + static void Sat(double * m44, double * offset4, double sat, const double * lumaCoef3); - static void Scale(double * m44, double * offset4, - const double * scale4); + static void Scale(double * m44, double * offset4, const double * scale4); - static void View(double * m44, double * offset4, - int * channelHot4, - const double * lumaCoef3); + static void View(double * m44, double * offset4, int * channelHot4, const double * lumaCoef3); - MatrixTransform(const MatrixTransform &) = delete; - MatrixTransform & operator= (const MatrixTransform &) = delete; + MatrixTransform(const MatrixTransform &) = delete; + MatrixTransform & operator=(const MatrixTransform &) = delete; /// Do not use (needed only for pybind11). virtual ~MatrixTransform() = default; @@ -1886,14 +1896,13 @@ class OCIOEXPORT MatrixTransform : public Transform extern OCIOEXPORT std::ostream & operator<<(std::ostream &, const MatrixTransform &) noexcept; - /** * Represents a range transform * * The Range is used to apply an affine transform (scale & offset) and * clamps values to min/max bounds on all color components except the alpha. * The scale and offset values are computed from the input and output bounds. - * + * * Refer to section 7.2.4 in specification S-2014-006 "A Common File Format * for Look-Up Tables" from the Academy of Motion Picture Arts and Sciences * and the American Society of Cinematographers. @@ -1919,7 +1928,7 @@ class OCIOEXPORT RangeTransform : public Transform virtual void setStyle(RangeStyle style) noexcept = 0; virtual const FormatMetadata & getFormatMetadata() const noexcept = 0; - virtual FormatMetadata & getFormatMetadata() noexcept = 0; + virtual FormatMetadata & getFormatMetadata() noexcept = 0; /// Checks if this equals other. virtual bool equals(const RangeTransform & other) const noexcept = 0; @@ -1937,9 +1946,9 @@ class OCIOEXPORT RangeTransform : public Transform /// Get the bit-depths associated with the range values read from a file /// or set the bit-depths of values to be written to a file (for file /// formats such as CLF that support multiple bit-depths). - virtual BitDepth getFileInputBitDepth() const noexcept = 0; - virtual void setFileInputBitDepth(BitDepth bitDepth) noexcept = 0; - virtual BitDepth getFileOutputBitDepth() const noexcept = 0; + virtual BitDepth getFileInputBitDepth() const noexcept = 0; + virtual void setFileInputBitDepth(BitDepth bitDepth) noexcept = 0; + virtual BitDepth getFileOutputBitDepth() const noexcept = 0; virtual void setFileOutputBitDepth(BitDepth bitDepth) noexcept = 0; /** @@ -1989,8 +1998,8 @@ class OCIOEXPORT RangeTransform : public Transform /// Unset the maximum value for the output. virtual void unsetMaxOutValue() noexcept = 0; - RangeTransform(const RangeTransform &) = delete; - RangeTransform & operator= (const RangeTransform &) = delete; + RangeTransform(const RangeTransform &) = delete; + RangeTransform & operator=(const RangeTransform &) = delete; /// Do not use (needed only for pybind11). virtual ~RangeTransform() = default; diff --git a/include/OpenColorIO/OpenColorTypes.h b/include/OpenColorIO/OpenColorTypes.h index 33654baf83..ec96421ff3 100644 --- a/include/OpenColorIO/OpenColorTypes.h +++ b/include/OpenColorIO/OpenColorTypes.h @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_OPENCOLORTYPES_H #define INCLUDED_OCIO_OPENCOLORTYPES_H @@ -12,10 +11,9 @@ #endif #include +#include #include #include -#include - /*!rst:: C++ Types @@ -120,7 +118,6 @@ typedef OCIO_SHARED_PTR ConfigIOProxyRcPtr; typedef std::array Float3; - // Transforms class OCIOEXPORT Transform; @@ -156,11 +153,13 @@ typedef OCIO_SHARED_PTR ConstDynamicPropertyDoubleR typedef OCIO_SHARED_PTR DynamicPropertyDoubleRcPtr; class OCIOEXPORT DynamicPropertyGradingPrimary; -typedef OCIO_SHARED_PTR ConstDynamicPropertyGradingPrimaryRcPtr; +typedef OCIO_SHARED_PTR + ConstDynamicPropertyGradingPrimaryRcPtr; typedef OCIO_SHARED_PTR DynamicPropertyGradingPrimaryRcPtr; class OCIOEXPORT DynamicPropertyGradingRGBCurve; -typedef OCIO_SHARED_PTR ConstDynamicPropertyGradingRGBCurveRcPtr; +typedef OCIO_SHARED_PTR + ConstDynamicPropertyGradingRGBCurveRcPtr; typedef OCIO_SHARED_PTR DynamicPropertyGradingRGBCurveRcPtr; class OCIOEXPORT DynamicPropertyGradingTone; @@ -235,7 +234,6 @@ class OCIOEXPORT RangeTransform; typedef OCIO_SHARED_PTR ConstRangeTransformRcPtr; typedef OCIO_SHARED_PTR RangeTransformRcPtr; - // Application Helpers class ColorSpaceMenuHelper; @@ -254,24 +252,22 @@ class LegacyViewingPipeline; typedef OCIO_SHARED_PTR LegacyViewingPipelineRcPtr; typedef OCIO_SHARED_PTR ConstLegacyViewingPipelineRcPtr; - -template -inline OCIO_SHARED_PTR DynamicPtrCast(OCIO_SHARED_PTR const & ptr) +template inline OCIO_SHARED_PTR DynamicPtrCast(OCIO_SHARED_PTR const & ptr) { - return OCIO_DYNAMIC_POINTER_CAST(ptr); + return OCIO_DYNAMIC_POINTER_CAST(ptr); } /// Define the logging function signature. -using LoggingFunction = std::function; +using LoggingFunction = std::function; // Enums enum LoggingLevel { - LOGGING_LEVEL_NONE = 0, + LOGGING_LEVEL_NONE = 0, LOGGING_LEVEL_WARNING = 1, - LOGGING_LEVEL_INFO = 2, - LOGGING_LEVEL_DEBUG = 3, + LOGGING_LEVEL_INFO = 2, + LOGGING_LEVEL_DEBUG = 3, LOGGING_LEVEL_UNKNOWN = 255, LOGGING_LEVEL_DEFAULT = LOGGING_LEVEL_INFO @@ -290,8 +286,8 @@ using ComputeHashFunction = std::function; */ enum ReferenceSpaceType { - REFERENCE_SPACE_SCENE = 0, ///< the main scene reference space - REFERENCE_SPACE_DISPLAY ///< the reference space for display color spaces + REFERENCE_SPACE_SCENE = 0, ///< the main scene reference space + REFERENCE_SPACE_DISPLAY ///< the reference space for display color spaces }; enum SearchReferenceSpaceType @@ -389,19 +385,19 @@ enum TransformType */ enum Interpolation { - INTERP_UNKNOWN = 0, - INTERP_NEAREST = 1, ///< nearest neighbor - INTERP_LINEAR = 2, ///< linear interpolation (trilinear for Lut3D) + INTERP_UNKNOWN = 0, + INTERP_NEAREST = 1, ///< nearest neighbor + INTERP_LINEAR = 2, ///< linear interpolation (trilinear for Lut3D) INTERP_TETRAHEDRAL = 3, ///< tetrahedral interpolation (Lut3D only) - INTERP_CUBIC = 4, ///< cubic interpolation (not supported) + INTERP_CUBIC = 4, ///< cubic interpolation (not supported) - INTERP_DEFAULT = 254, ///< the default interpolation type - INTERP_BEST = 255 ///< the 'best' suitable interpolation type + INTERP_DEFAULT = 254, ///< the default interpolation type + INTERP_BEST = 255 ///< the 'best' suitable interpolation type }; /** * Used in a configuration file to indicate the bit-depth of a color space, - * and by the \ref Processor to specify the input and output bit-depths of + * and by the \ref Processor to specify the input and output bit-depths of * images to process. * Note that \ref Processor only supports: UINT8, UINT10, UINT12, UINT16, F16 and F32. */ @@ -436,7 +432,8 @@ enum ChannelOrdering CHANNEL_ORDERING_BGR }; -enum Allocation { +enum Allocation +{ ALLOCATION_UNKNOWN = 0, ALLOCATION_UNIFORM, ALLOCATION_LG2 @@ -445,15 +442,15 @@ enum Allocation { /// Used when there is a choice of hardware shader language. enum GpuLanguage { - GPU_LANGUAGE_CG = 0, ///< Nvidia Cg shader - GPU_LANGUAGE_GLSL_1_2, ///< OpenGL Shading Language - GPU_LANGUAGE_GLSL_1_3, ///< OpenGL Shading Language - GPU_LANGUAGE_GLSL_4_0, ///< OpenGL Shading Language - GPU_LANGUAGE_HLSL_DX11, ///< DirectX Shading Language - LANGUAGE_OSL_1, ///< Open Shading Language - GPU_LANGUAGE_GLSL_ES_1_0, ///< OpenGL ES Shading Language - GPU_LANGUAGE_GLSL_ES_3_0, ///< OpenGL ES Shading Language - GPU_LANGUAGE_MSL_2_0 ///< Metal Shading Language + GPU_LANGUAGE_CG = 0, ///< Nvidia Cg shader + GPU_LANGUAGE_GLSL_1_2, ///< OpenGL Shading Language + GPU_LANGUAGE_GLSL_1_3, ///< OpenGL Shading Language + GPU_LANGUAGE_GLSL_4_0, ///< OpenGL Shading Language + GPU_LANGUAGE_HLSL_DX11, ///< DirectX Shading Language + LANGUAGE_OSL_1, ///< Open Shading Language + GPU_LANGUAGE_GLSL_ES_1_0, ///< OpenGL ES Shading Language + GPU_LANGUAGE_GLSL_ES_3_0, ///< OpenGL ES Shading Language + GPU_LANGUAGE_MSL_2_0 ///< Metal Shading Language }; /// Controls which environment variables are loaded into a Context object. @@ -479,35 +476,37 @@ enum FixedFunctionStyle FIXED_FUNCTION_ACES_GLOW_03, ///< Glow function (ACES 0.3/0.7) FIXED_FUNCTION_ACES_GLOW_10, ///< Glow function (ACES 1.0) FIXED_FUNCTION_ACES_DARK_TO_DIM_10, ///< Dark to dim surround correction (ACES 1.0) - FIXED_FUNCTION_REC2100_SURROUND, ///< Rec.2100 surround correction (takes one double for the gamma param) + FIXED_FUNCTION_REC2100_SURROUND, ///< Rec.2100 surround correction (takes one double for the + ///< gamma param) FIXED_FUNCTION_RGB_TO_HSV, ///< Classic RGB to HSV function FIXED_FUNCTION_XYZ_TO_xyY, ///< CIE XYZ to 1931 xy chromaticity coordinates FIXED_FUNCTION_XYZ_TO_uvY, ///< CIE XYZ to 1976 u'v' chromaticity coordinates FIXED_FUNCTION_XYZ_TO_LUV, ///< CIE XYZ to 1976 CIELUV colour space (D65 white) - FIXED_FUNCTION_ACES_GAMUTMAP_02, ///< ACES 0.2 Gamut clamping algorithm -- NOT IMPLEMENTED YET - FIXED_FUNCTION_ACES_GAMUTMAP_07, ///< ACES 0.7 Gamut clamping algorithm -- NOT IMPLEMENTED YET - FIXED_FUNCTION_ACES_GAMUT_COMP_13 ///< ACES 1.3 Parametric Gamut Compression (expects ACEScg values) + FIXED_FUNCTION_ACES_GAMUTMAP_02, ///< ACES 0.2 Gamut clamping algorithm -- NOT IMPLEMENTED YET + FIXED_FUNCTION_ACES_GAMUTMAP_07, ///< ACES 0.7 Gamut clamping algorithm -- NOT IMPLEMENTED YET + FIXED_FUNCTION_ACES_GAMUT_COMP_13 ///< ACES 1.3 Parametric Gamut Compression (expects ACEScg + ///< values) }; /// Enumeration of the :cpp:class:`ExposureContrastTransform` transform algorithms. enum ExposureContrastStyle { - EXPOSURE_CONTRAST_LINEAR = 0, ///< E/C to be applied to a linear space image - EXPOSURE_CONTRAST_VIDEO, ///< E/C to be applied to a video space image - EXPOSURE_CONTRAST_LOGARITHMIC ///< E/C to be applied to a log space image + EXPOSURE_CONTRAST_LINEAR = 0, ///< E/C to be applied to a linear space image + EXPOSURE_CONTRAST_VIDEO, ///< E/C to be applied to a video space image + EXPOSURE_CONTRAST_LOGARITHMIC ///< E/C to be applied to a log space image }; /** * Enumeration of the :cpp:class:`CDLTransform` transform algorithms. - * + * * \note * The default for reading .cc/.ccc/.cdl files, config file YAML, and CDLTransform is no-clamp, * since that is what is primarily desired in VFX. However, the CLF format default is ASC. */ enum CDLStyle { - CDL_ASC = 0, ///< ASC CDL specification v1.2 - CDL_NO_CLAMP, ///< CDL that does not clamp + CDL_ASC = 0, ///< ASC CDL specification v1.2 + CDL_NO_CLAMP, ///< CDL that does not clamp CDL_TRANSFORM_DEFAULT = CDL_NO_CLAMP }; @@ -518,7 +517,8 @@ enum CDLStyle enum NegativeStyle { NEGATIVE_CLAMP = 0, ///< Clamp negative values - NEGATIVE_MIRROR, ///< Positive curve is rotated 180 degrees around the origin to handle negatives. + NEGATIVE_MIRROR, ///< Positive curve is rotated 180 degrees around the origin to handle + ///< negatives. NEGATIVE_PASS_THRU, ///< Negative values are passed through unchanged. NEGATIVE_LINEAR ///< Linearly extrapolate the curve for negative values. }; @@ -526,9 +526,9 @@ enum NegativeStyle /// Styles for grading transforms. enum GradingStyle { - GRADING_LOG = 0, ///< Algorithms for Logarithmic color spaces. - GRADING_LIN, ///< Algorithms for Scene Linear color spaces. - GRADING_VIDEO ///< Algorithms for Video color spaces. + GRADING_LOG = 0, ///< Algorithms for Logarithmic color spaces. + GRADING_LIN, ///< Algorithms for Scene Linear color spaces. + GRADING_VIDEO ///< Algorithms for Video color spaces. }; /// Types for dynamic properties. @@ -557,9 +557,9 @@ enum UniformDataType { UNIFORM_DOUBLE = 0, UNIFORM_BOOL, - UNIFORM_FLOAT3, ///< Array of 3 floats. - UNIFORM_VECTOR_FLOAT, ///< Vector of floats (size is set by uniform). - UNIFORM_VECTOR_INT, ///< Vector of int pairs (size is set by uniform). + UNIFORM_FLOAT3, ///< Array of 3 floats. + UNIFORM_VECTOR_FLOAT, ///< Vector of floats (size is set by uniform). + UNIFORM_VECTOR_INT, ///< Vector of int pairs (size is set by uniform). UNIFORM_UNKNOWN }; @@ -569,12 +569,12 @@ enum OptimizationFlags : unsigned long // Below are listed all the optimization types. /// Do not optimize. - OPTIMIZATION_NONE = 0x00000000, + OPTIMIZATION_NONE = 0x00000000, /// Replace identity ops (other than gamma). - OPTIMIZATION_IDENTITY = 0x00000001, + OPTIMIZATION_IDENTITY = 0x00000001, /// Replace identity gamma ops. - OPTIMIZATION_IDENTITY_GAMMA = 0x00000002, + OPTIMIZATION_IDENTITY_GAMMA = 0x00000002, /// Replace a pair of ops where one is the inverse of the other. OPTIMIZATION_PAIR_IDENTITY_CDL = 0x00000040, @@ -587,75 +587,65 @@ enum OptimizationFlags : unsigned long OPTIMIZATION_PAIR_IDENTITY_GRADING = 0x00002000, /// Compose a pair of ops into a single op. - OPTIMIZATION_COMP_EXPONENT = 0x00040000, - OPTIMIZATION_COMP_GAMMA = 0x00080000, - OPTIMIZATION_COMP_MATRIX = 0x00100000, - OPTIMIZATION_COMP_LUT1D = 0x00200000, - OPTIMIZATION_COMP_LUT3D = 0x00400000, - OPTIMIZATION_COMP_RANGE = 0x00800000, + OPTIMIZATION_COMP_EXPONENT = 0x00040000, + OPTIMIZATION_COMP_GAMMA = 0x00080000, + OPTIMIZATION_COMP_MATRIX = 0x00100000, + OPTIMIZATION_COMP_LUT1D = 0x00200000, + OPTIMIZATION_COMP_LUT3D = 0x00400000, + OPTIMIZATION_COMP_RANGE = 0x00800000, /** * For integer and half bit-depths only, replace separable ops (i.e. no channel crosstalk * ops) by a single 1D LUT of input bit-depth domain. */ - OPTIMIZATION_COMP_SEPARABLE_PREFIX = 0x01000000, + OPTIMIZATION_COMP_SEPARABLE_PREFIX = 0x01000000, /** * Implement inverse Lut1D and Lut3D evaluations using a a forward LUT (faster but less * accurate). Note that GPU evals always do FAST. */ - OPTIMIZATION_LUT_INV_FAST = 0x02000000, + OPTIMIZATION_LUT_INV_FAST = 0x02000000, // For CPU processor, in SSE mode, use a faster approximation for log, exp, and pow. - OPTIMIZATION_FAST_LOG_EXP_POW = 0x04000000, + OPTIMIZATION_FAST_LOG_EXP_POW = 0x04000000, // Break down certain ops into simpler components where possible. For example, convert a CDL // to a matrix when possible. - OPTIMIZATION_SIMPLIFY_OPS = 0x08000000, + OPTIMIZATION_SIMPLIFY_OPS = 0x08000000, /** * Turn off dynamic control of any ops that offer adjustment of parameter values after * finalization (e.g. ExposureContrast). */ - OPTIMIZATION_NO_DYNAMIC_PROPERTIES = 0x10000000, + OPTIMIZATION_NO_DYNAMIC_PROPERTIES = 0x10000000, /// Apply all possible optimizations. - OPTIMIZATION_ALL = 0xFFFFFFFF, + OPTIMIZATION_ALL = 0xFFFFFFFF, // The following groupings of flags are provided as a convenient way to select an overall // optimization level. - OPTIMIZATION_LOSSLESS = (OPTIMIZATION_IDENTITY | - OPTIMIZATION_IDENTITY_GAMMA | - OPTIMIZATION_PAIR_IDENTITY_CDL | - OPTIMIZATION_PAIR_IDENTITY_EXPOSURE_CONTRAST | - OPTIMIZATION_PAIR_IDENTITY_FIXED_FUNCTION | - OPTIMIZATION_PAIR_IDENTITY_GAMMA | - OPTIMIZATION_PAIR_IDENTITY_GRADING | - OPTIMIZATION_PAIR_IDENTITY_LOG | - OPTIMIZATION_PAIR_IDENTITY_LUT1D | - OPTIMIZATION_PAIR_IDENTITY_LUT3D | - OPTIMIZATION_COMP_EXPONENT | - OPTIMIZATION_COMP_GAMMA | - OPTIMIZATION_COMP_MATRIX | - OPTIMIZATION_COMP_RANGE | - OPTIMIZATION_SIMPLIFY_OPS), - - OPTIMIZATION_VERY_GOOD = (OPTIMIZATION_LOSSLESS | - OPTIMIZATION_COMP_LUT1D | - OPTIMIZATION_LUT_INV_FAST | - OPTIMIZATION_FAST_LOG_EXP_POW | - OPTIMIZATION_COMP_SEPARABLE_PREFIX), - - OPTIMIZATION_GOOD = OPTIMIZATION_VERY_GOOD | OPTIMIZATION_COMP_LUT3D, + OPTIMIZATION_LOSSLESS + = (OPTIMIZATION_IDENTITY | OPTIMIZATION_IDENTITY_GAMMA | OPTIMIZATION_PAIR_IDENTITY_CDL + | OPTIMIZATION_PAIR_IDENTITY_EXPOSURE_CONTRAST | OPTIMIZATION_PAIR_IDENTITY_FIXED_FUNCTION + | OPTIMIZATION_PAIR_IDENTITY_GAMMA | OPTIMIZATION_PAIR_IDENTITY_GRADING + | OPTIMIZATION_PAIR_IDENTITY_LOG | OPTIMIZATION_PAIR_IDENTITY_LUT1D + | OPTIMIZATION_PAIR_IDENTITY_LUT3D | OPTIMIZATION_COMP_EXPONENT | OPTIMIZATION_COMP_GAMMA + | OPTIMIZATION_COMP_MATRIX | OPTIMIZATION_COMP_RANGE | OPTIMIZATION_SIMPLIFY_OPS), + + OPTIMIZATION_VERY_GOOD + = (OPTIMIZATION_LOSSLESS | OPTIMIZATION_COMP_LUT1D | OPTIMIZATION_LUT_INV_FAST + | OPTIMIZATION_FAST_LOG_EXP_POW | OPTIMIZATION_COMP_SEPARABLE_PREFIX), + + OPTIMIZATION_GOOD = OPTIMIZATION_VERY_GOOD | OPTIMIZATION_COMP_LUT3D, /// For quite lossy optimizations. - OPTIMIZATION_DRAFT = OPTIMIZATION_ALL, + OPTIMIZATION_DRAFT = OPTIMIZATION_ALL, - OPTIMIZATION_DEFAULT = OPTIMIZATION_VERY_GOOD + OPTIMIZATION_DEFAULT = OPTIMIZATION_VERY_GOOD }; -//!cpp:type:: Enum to control the behavior of the internal caches e.g. the processor cache in +//! cpp:type:: Enum to control the behavior of the internal caches e.g. the processor cache in // :cpp:class:`Config` and :cpp:class:`Processor` instances. When debugging problems, it be useful // to disable all the internal caches for example. // @@ -663,14 +653,14 @@ enum OptimizationFlags : unsigned long // even if it contains some dynamic properties i.e. it speeds up the processor retrieval. That's the // default behavior to avoid the processor creation hit. However, the caller app must then always // set the dynamic property values prior to any color processing call (in CPU and GPU modes) as the -// same processor instance can now be used between several viewports for example. +// same processor instance can now be used between several viewports for example. enum ProcessorCacheFlags : unsigned int { PROCESSOR_CACHE_OFF = 0x00, PROCESSOR_CACHE_ENABLED = 0x01, // Enable the cache. - PROCESSOR_CACHE_SHARE_DYN_PROPERTIES = 0x02, // i.e. When the cache is enabled processor instances - // are shared even if they contain some dynamic - // properties. + PROCESSOR_CACHE_SHARE_DYN_PROPERTIES = 0x02, // i.e. When the cache is enabled processor + // instances are shared even if they contain some + // dynamic properties. PROCESSOR_CACHE_DEFAULT = (PROCESSOR_CACHE_ENABLED | PROCESSOR_CACHE_SHARE_DYN_PROPERTIES) }; @@ -688,8 +678,8 @@ extern OCIOEXPORT const char * TransformDirectionToString(TransformDirection dir extern OCIOEXPORT TransformDirection TransformDirectionFromString(const char * s); extern OCIOEXPORT TransformDirection GetInverseTransformDirection(TransformDirection dir); -extern OCIOEXPORT TransformDirection CombineTransformDirections(TransformDirection d1, - TransformDirection d2); +extern OCIOEXPORT TransformDirection +CombineTransformDirections(TransformDirection d1, TransformDirection d2); extern OCIOEXPORT const char * BitDepthToString(BitDepth bitDepth); extern OCIOEXPORT BitDepth BitDepthFromString(const char * s); @@ -734,7 +724,6 @@ extern OCIOEXPORT NegativeStyle NegativeStyleFromString(const char * style); // These variables are defined in src/OpenColorIO/Config.cpp. - /// The envvar 'OCIO' provides a path to the config file used by \ref Config::CreateFromEnv extern OCIOEXPORT const char * OCIO_CONFIG_ENVVAR; @@ -916,21 +905,21 @@ Caches */ -//!rst:: +//! rst:: // .. c:var:: const char * OCIO_DISABLE_ALL_CACHES // // Disable all caches, including for FileTransforms and Optimized/CPU/GPU Processors. (Provided only // to facilitate developer investigations.) extern OCIOEXPORT const char * OCIO_DISABLE_ALL_CACHES; -//!rst:: +//! rst:: // .. c:var:: const char * OCIO_DISABLE_PROCESSOR_CACHES // // Disable only the Optimized, CPU, and GPU Processor caches. (Provided only to facilitate developer // investigations.) extern OCIOEXPORT const char * OCIO_DISABLE_PROCESSOR_CACHES; -//!rst:: +//! rst:: // .. c:var:: const char * OCIO_DISABLE_CACHE_FALLBACK // // By default the processor caches check for identical color transformations when cache keys do @@ -938,7 +927,6 @@ extern OCIOEXPORT const char * OCIO_DISABLE_PROCESSOR_CACHES; // variable to disable the fallback. extern OCIOEXPORT const char * OCIO_DISABLE_CACHE_FALLBACK; - // Archive config feature // Default filename (with extension) of an config. extern OCIOEXPORT const char * OCIO_CONFIG_DEFAULT_NAME; diff --git a/src/OpenColorIO/AVX.h b/src/OpenColorIO/AVX.h index b4184f89d1..a217b31c31 100644 --- a/src/OpenColorIO/AVX.h +++ b/src/OpenColorIO/AVX.h @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_AVX_H #define INCLUDED_OCIO_AVX_H @@ -10,8 +9,8 @@ #include -#include #include "BitDepthUtils.h" +#include // Macros for alignment declarations #define AVX_SIMD_BYTES 32 @@ -31,14 +30,21 @@ inline __m256 avx_movehl_ps(__m256 a, __m256 b) return _mm256_castpd_ps(_mm256_unpackhi_pd(_mm256_castps_pd(b), _mm256_castps_pd(a))); } -inline __m256 avx_clamp(__m256 value, const __m256& maxValue) +inline __m256 avx_clamp(__m256 value, const __m256 & maxValue) { value = _mm256_max_ps(value, _mm256_setzero_ps()); return _mm256_min_ps(value, maxValue); } -inline void avxRGBATranspose_4x4_4x4(__m256 row0, __m256 row1, __m256 row2, __m256 row3, - __m256 &out_r, __m256 &out_g, __m256 &out_b, __m256 &out_a ) +inline void avxRGBATranspose_4x4_4x4( + __m256 row0, + __m256 row1, + __m256 row2, + __m256 row3, + __m256 & out_r, + __m256 & out_g, + __m256 & out_b, + __m256 & out_a) { // the rgba transpose result will look this // @@ -61,24 +67,25 @@ inline void avxRGBATranspose_4x4_4x4(__m256 row0, __m256 row1, __m256 row2, __m2 out_g = avx_movehl_ps(tmp2, tmp0); out_b = avx_movelh_ps(tmp1, tmp3); out_a = avx_movehl_ps(tmp3, tmp1); - } inline __m256i avx_load_u8(__m128i a) { - __m128i b = _mm_shuffle_epi32(a, _MM_SHUFFLE(1,0,3,1)); - b = _mm_cvtepu8_epi32(b); - a = _mm_cvtepu8_epi32(a); + __m128i b = _mm_shuffle_epi32(a, _MM_SHUFFLE(1, 0, 3, 1)); + b = _mm_cvtepu8_epi32(b); + a = _mm_cvtepu8_epi32(a); return _mm256_insertf128_si256(_mm256_castsi128_si256(a), b, 1); } inline __m128i avx_pack_u8(__m256i a, __m256i b) { + // clang-format off const __m128i lo0_shuf = _mm_setr_epi8( 0, 4, 8,12, -1,-1,-1, -1, -1,-1,-1,-1, -1,-1,-1,-1); const __m128i lo1_shuf = _mm_setr_epi8( -1,-1,-1,-1, 0, 4, 8, 12, -1,-1,-1,-1, -1,-1,-1,-1); const __m128i hi0_shuf = _mm_setr_epi8( -1,-1,-1,-1, -1,-1,-1, -1, 0, 4, 8, 12, -1,-1,-1,-1); const __m128i hi1_shuf = _mm_setr_epi8( -1,-1,-1,-1, -1,-1,-1, -1, -1,-1,-1,-1, 0, 4, 8, 12); + // clang-format on __m128i lo0 = _mm_shuffle_epi8(_mm256_castsi256_si128(a), lo0_shuf); __m128i lo1 = _mm_shuffle_epi8(_mm256_extractf128_si256(a, 1), lo1_shuf); @@ -91,31 +98,34 @@ inline __m128i avx_pack_u8(__m256i a, __m256i b) // Note Packing functions perform no 0.0 - 1.0 normalization // but perform 0 - max value clamping for integer formats -template struct AVXRGBAPack {}; +template struct AVXRGBAPack +{ +}; -template <> -struct AVXRGBAPack +template <> struct AVXRGBAPack { - static inline void Load(const uint8_t *in, __m256& r, __m256& g, __m256& b, __m256& a) + static inline void Load(const uint8_t * in, __m256 & r, __m256 & g, __m256 & b, __m256 & a) { - __m256i rgba_00_07 = _mm256_loadu_si256((const __m256i*)in); + __m256i rgba_00_07 = _mm256_loadu_si256((const __m256i *)in); - __m128i rgba_00_03 =_mm256_castsi256_si128(rgba_00_07); - __m128i rgba_04_07 =_mm256_extractf128_si256(rgba_00_07, 1); + __m128i rgba_00_03 = _mm256_castsi256_si128(rgba_00_07); + __m128i rgba_04_07 = _mm256_extractf128_si256(rgba_00_07, 1); // : 0, 1, 2, 3 | 4, 5, 6, 7 | 8, 9, 10, 11 | 12, 13, 14, 15 // rgba_x03 : r0, g0, b0, a0 | r1, g1, b1, a1 | r2, g2, b2, a2 | r3, g3, b3, a3 // rgba_x47 : r4, g4, b4, a4 | r5, g5, b5, a5 | r6, g6, b6, a6 | r7, g7, b7, a7 __m256 rgba0 = _mm256_cvtepi32_ps(avx_load_u8(rgba_00_03)); - __m256 rgba1 = _mm256_cvtepi32_ps(avx_load_u8(_mm_shuffle_epi32(rgba_00_03, _MM_SHUFFLE(3, 2, 3, 2)))); + __m256 rgba1 = _mm256_cvtepi32_ps( + avx_load_u8(_mm_shuffle_epi32(rgba_00_03, _MM_SHUFFLE(3, 2, 3, 2)))); __m256 rgba2 = _mm256_cvtepi32_ps(avx_load_u8(rgba_04_07)); - __m256 rgba3 = _mm256_cvtepi32_ps(avx_load_u8(_mm_shuffle_epi32(rgba_04_07, _MM_SHUFFLE(3, 2, 3, 2)))); + __m256 rgba3 = _mm256_cvtepi32_ps( + avx_load_u8(_mm_shuffle_epi32(rgba_04_07, _MM_SHUFFLE(3, 2, 3, 2)))); avxRGBATranspose_4x4_4x4(rgba0, rgba1, rgba2, rgba3, r, g, b, a); } - static inline void Store(uint8_t *out, __m256 r, __m256 g, __m256 b, __m256 a) + static inline void Store(uint8_t * out, __m256 r, __m256 g, __m256 b, __m256 a) { __m256 rgba0, rgba1, rgba2, rgba3; const __m256 maxValue = _mm256_set1_ps(255.0f); @@ -127,7 +137,8 @@ struct AVXRGBAPack rgba2 = avx_clamp(rgba2, maxValue); rgba3 = avx_clamp(rgba3, maxValue); - // NOTE note using cvtps which will round based on MXCSR register defaults to _MM_ROUND_NEAREST + // NOTE note using cvtps which will round based on MXCSR register defaults to + // _MM_ROUND_NEAREST __m256i rgba01 = _mm256_cvtps_epi32(rgba0); __m256i rgba23 = _mm256_cvtps_epi32(rgba1); __m256i rgba45 = _mm256_cvtps_epi32(rgba2); @@ -138,21 +149,22 @@ struct AVXRGBAPack __m256i rgba = _mm256_insertf128_si256(_mm256_castsi128_si256(lo), hi, 1); - _mm256_storeu_si256((__m256i*)out, rgba); + _mm256_storeu_si256((__m256i *)out, rgba); } }; inline __m256i avx_unpack_u16(__m128i a) { - __m128i b = _mm_shuffle_epi32(a, _MM_SHUFFLE(1,0,3,2)); - b = _mm_cvtepu16_epi32(b); - a = _mm_cvtepu16_epi32(a); + __m128i b = _mm_shuffle_epi32(a, _MM_SHUFFLE(1, 0, 3, 2)); + b = _mm_cvtepu16_epi32(b); + a = _mm_cvtepu16_epi32(a); return _mm256_insertf128_si256(_mm256_castsi128_si256(a), b, 1); } inline __m128i avx_pack_u16(__m256i a) { + // clang-format off const __m128i lo_pack_shuffle16 = _mm_setr_epi8( 0, 1, 4, 5, 8, 9, 12, 13, -1, -1, -1, -1, @@ -162,6 +174,7 @@ inline __m128i avx_pack_u16(__m256i a) -1, -1, -1, -1, 0, 1, 4, 5, 8, 9, 12, 13); + // clang-format on __m128i hi = _mm256_extractf128_si256(a, 1); __m128i lo = _mm256_castsi256_si128(a); @@ -172,16 +185,15 @@ inline __m128i avx_pack_u16(__m256i a) return _mm_or_si128(lo, hi); } -template -struct AVXRGBAPack16 +template struct AVXRGBAPack16 { typedef typename BitDepthInfo::Type Type; - static inline void Load(const Type *in, __m256& r, __m256& g, __m256& b, __m256& a) + static inline void Load(const Type * in, __m256 & r, __m256 & g, __m256 & b, __m256 & a) { // const __m256 scale = _mm256_set1_ps(1.0f / (float)BitDepthInfo::maxValue); - __m256i rgba_00_03 = _mm256_loadu_si256((const __m256i*)(in + 0)); - __m256i rgba_04_07 = _mm256_loadu_si256((const __m256i*)(in + 16)); + __m256i rgba_00_03 = _mm256_loadu_si256((const __m256i *)(in + 0)); + __m256i rgba_04_07 = _mm256_loadu_si256((const __m256i *)(in + 16)); __m256 rgba0 = _mm256_cvtepi32_ps(avx_unpack_u16(_mm256_castsi256_si128(rgba_00_03))); __m256 rgba1 = _mm256_cvtepi32_ps(avx_unpack_u16(_mm256_extractf128_si256(rgba_00_03, 1))); @@ -191,7 +203,7 @@ struct AVXRGBAPack16 avxRGBATranspose_4x4_4x4(rgba0, rgba1, rgba2, rgba3, r, g, b, a); } - static inline void Store(Type *out, __m256 r, __m256 g, __m256 b, __m256 a) + static inline void Store(Type * out, __m256 r, __m256 g, __m256 b, __m256 a) { __m256 rgba0, rgba1, rgba2, rgba3; __m128i lo, hi; @@ -205,7 +217,8 @@ struct AVXRGBAPack16 rgba2 = avx_clamp(rgba2, maxValue); rgba3 = avx_clamp(rgba3, maxValue); - // NOTE note using cvtps which will round based on MXCSR register defaults to _MM_ROUND_NEAREST + // NOTE note using cvtps which will round based on MXCSR register defaults to + // _MM_ROUND_NEAREST __m256i rgba01 = _mm256_cvtps_epi32(rgba0); __m256i rgba23 = _mm256_cvtps_epi32(rgba1); __m256i rgba45 = _mm256_cvtps_epi32(rgba2); @@ -215,50 +228,47 @@ struct AVXRGBAPack16 hi = avx_pack_u16(rgba23); rgba = _mm256_insertf128_si256(_mm256_castsi128_si256(lo), hi, 1); - _mm256_storeu_si256((__m256i*)(out+0), rgba); + _mm256_storeu_si256((__m256i *)(out + 0), rgba); lo = avx_pack_u16(rgba45); hi = avx_pack_u16(rgba67); rgba = _mm256_insertf128_si256(_mm256_castsi128_si256(lo), hi, 1); - _mm256_storeu_si256((__m256i*)(out+16), rgba); + _mm256_storeu_si256((__m256i *)(out + 16), rgba); } }; -template <> -struct AVXRGBAPack +template <> struct AVXRGBAPack { - static inline void Load(const uint16_t *in, __m256& r, __m256& g, __m256& b, __m256& a) + static inline void Load(const uint16_t * in, __m256 & r, __m256 & g, __m256 & b, __m256 & a) { AVXRGBAPack16::Load(in, r, g, b, a); } - static inline void Store(uint16_t *out, __m256 r, __m256 g, __m256 b, __m256 a) + static inline void Store(uint16_t * out, __m256 r, __m256 g, __m256 b, __m256 a) { AVXRGBAPack16::Store(out, r, g, b, a); } }; -template <> -struct AVXRGBAPack +template <> struct AVXRGBAPack { - static inline void Load(const uint16_t *in, __m256& r, __m256& g, __m256& b, __m256& a) + static inline void Load(const uint16_t * in, __m256 & r, __m256 & g, __m256 & b, __m256 & a) { AVXRGBAPack16::Load(in, r, g, b, a); } - static inline void Store(uint16_t *out, __m256 r, __m256 g, __m256 b, __m256 a) + static inline void Store(uint16_t * out, __m256 r, __m256 g, __m256 b, __m256 a) { AVXRGBAPack16::Store(out, r, g, b, a); } }; -template <> -struct AVXRGBAPack +template <> struct AVXRGBAPack { - static inline void Load(const uint16_t *in, __m256& r, __m256& g, __m256& b, __m256& a) + static inline void Load(const uint16_t * in, __m256 & r, __m256 & g, __m256 & b, __m256 & a) { AVXRGBAPack16::Load(in, r, g, b, a); } - static inline void Store(uint16_t *out, __m256 r, __m256 g, __m256 b, __m256 a) + static inline void Store(uint16_t * out, __m256 r, __m256 g, __m256 b, __m256 a) { AVXRGBAPack16::Store(out, r, g, b, a); } @@ -266,14 +276,13 @@ struct AVXRGBAPack #if OCIO_USE_F16C -template <> -struct AVXRGBAPack +template <> struct AVXRGBAPack { - static inline void Load(const half *in, __m256& r, __m256& g, __m256& b, __m256& a) + static inline void Load(const half * in, __m256 & r, __m256 & g, __m256 & b, __m256 & a) { - __m256i rgba_00_03 = _mm256_loadu_si256((const __m256i*)(in + 0)); - __m256i rgba_04_07 = _mm256_loadu_si256((const __m256i*)(in + 16)); + __m256i rgba_00_03 = _mm256_loadu_si256((const __m256i *)(in + 0)); + __m256i rgba_04_07 = _mm256_loadu_si256((const __m256i *)(in + 16)); __m256 rgba0 = _mm256_cvtph_ps(_mm256_castsi256_si128(rgba_00_03)); __m256 rgba1 = _mm256_cvtph_ps(_mm256_extractf128_si256(rgba_00_03, 1)); @@ -283,7 +292,7 @@ struct AVXRGBAPack avxRGBATranspose_4x4_4x4(rgba0, rgba1, rgba2, rgba3, r, g, b, a); } - static inline void Store(half *out, __m256 r, __m256 g, __m256 b, __m256 a) + static inline void Store(half * out, __m256 r, __m256 g, __m256 b, __m256 a) { __m256 rgba0, rgba1, rgba2, rgba3; __m256i rgba; @@ -296,36 +305,34 @@ struct AVXRGBAPack __m128i rgba12_16 = _mm256_cvtps_ph(rgba3, 0); rgba = _mm256_insertf128_si256(_mm256_castsi128_si256(rgba00_03), rgba04_07, 1); - _mm256_storeu_si256((__m256i*)(out+0), rgba); + _mm256_storeu_si256((__m256i *)(out + 0), rgba); rgba = _mm256_insertf128_si256(_mm256_castsi128_si256(rgba08_11), rgba12_16, 1); - _mm256_storeu_si256((__m256i*)(out+16), rgba); + _mm256_storeu_si256((__m256i *)(out + 16), rgba); } }; #endif -template <> -struct AVXRGBAPack +template <> struct AVXRGBAPack { - static inline void Load(const float *in, __m256& r, __m256& g, __m256& b, __m256& a) + static inline void Load(const float * in, __m256 & r, __m256 & g, __m256 & b, __m256 & a) { - __m256 rgba0 = _mm256_loadu_ps(in + 0); - __m256 rgba1 = _mm256_loadu_ps(in + 8); + __m256 rgba0 = _mm256_loadu_ps(in + 0); + __m256 rgba1 = _mm256_loadu_ps(in + 8); __m256 rgba2 = _mm256_loadu_ps(in + 16); __m256 rgba3 = _mm256_loadu_ps(in + 24); avxRGBATranspose_4x4_4x4(rgba0, rgba1, rgba2, rgba3, r, g, b, a); - } - static inline void Store(float *out, __m256 r, __m256 g, __m256 b, __m256 a) + static inline void Store(float * out, __m256 r, __m256 g, __m256 b, __m256 a) { __m256 rgba0, rgba1, rgba2, rgba3; avxRGBATranspose_4x4_4x4(r, g, b, a, rgba0, rgba1, rgba2, rgba3); - _mm256_storeu_ps(out + 0, rgba0); - _mm256_storeu_ps(out + 8, rgba1); + _mm256_storeu_ps(out + 0, rgba0); + _mm256_storeu_ps(out + 8, rgba1); _mm256_storeu_ps(out + 16, rgba2); _mm256_storeu_ps(out + 24, rgba3); } diff --git a/src/OpenColorIO/AVX2.h b/src/OpenColorIO/AVX2.h index 85bf48dc8d..83f49e22bb 100644 --- a/src/OpenColorIO/AVX2.h +++ b/src/OpenColorIO/AVX2.h @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_AVX2_H #define INCLUDED_OCIO_AVX2_H @@ -10,8 +9,8 @@ #include -#include #include "BitDepthUtils.h" +#include // Macros for alignment declarations #define AVX2_SIMD_BYTES 32 @@ -31,15 +30,22 @@ inline __m256 avx2_movehl_ps(__m256 a, __m256 b) return _mm256_castpd_ps(_mm256_unpackhi_pd(_mm256_castps_pd(b), _mm256_castps_pd(a))); } -inline __m256 avx2_clamp(__m256 value, const __m256& maxValue) +inline __m256 avx2_clamp(__m256 value, const __m256 & maxValue) { value = _mm256_max_ps(value, _mm256_setzero_ps()); return _mm256_min_ps(value, maxValue); } -inline void avx2RGBATranspose_4x4_4x4(__m256 row0, __m256 row1, __m256 row2, __m256 row3, - - __m256 &out_r, __m256 &out_g, __m256 &out_b, __m256 &out_a ) +inline void avx2RGBATranspose_4x4_4x4( + __m256 row0, + __m256 row1, + __m256 row2, + __m256 row3, + + __m256 & out_r, + __m256 & out_g, + __m256 & out_b, + __m256 & out_a) { // the rgba transpose result will look this // @@ -62,36 +68,38 @@ inline void avx2RGBATranspose_4x4_4x4(__m256 row0, __m256 row1, __m256 row2, __m out_g = avx2_movehl_ps(tmp2, tmp0); out_b = avx2_movelh_ps(tmp1, tmp3); out_a = avx2_movehl_ps(tmp3, tmp1); - } // Note Packing functions perform no 0.0 - 1.0 normalization // but perform 0 - max value clamping for integer formats -template struct AVX2RGBAPack {}; +template struct AVX2RGBAPack +{ +}; -template <> -struct AVX2RGBAPack +template <> struct AVX2RGBAPack { - static inline void Load(const uint8_t *in, __m256& r, __m256& g, __m256& b, __m256& a) + static inline void Load(const uint8_t * in, __m256 & r, __m256 & g, __m256 & b, __m256 & a) { - __m256i rgba_00_07 = _mm256_loadu_si256((const __m256i*)in); + __m256i rgba_00_07 = _mm256_loadu_si256((const __m256i *)in); - __m128i rgba_00_03 =_mm256_castsi256_si128(rgba_00_07); - __m128i rgba_04_07 =_mm256_extractf128_si256(rgba_00_07, 1); + __m128i rgba_00_03 = _mm256_castsi256_si128(rgba_00_07); + __m128i rgba_04_07 = _mm256_extractf128_si256(rgba_00_07, 1); // : 0, 1, 2, 3 | 4, 5, 6, 7 | 8, 9, 10, 11 | 12, 13, 14, 15 // rgba_x03 : r0, g0, b0, a0 | r1, g1, b1, a1 | r2, g2, b2, a2 | r3, g3, b3, a3 // rgba_x47 : r4, g4, b4, a4 | r5, g5, b5, a5 | r6, g6, b6, a6 | r7, g7, b7, a7 __m256 rgba0 = _mm256_cvtepi32_ps(_mm256_cvtepu8_epi32(rgba_00_03)); - __m256 rgba1 = _mm256_cvtepi32_ps(_mm256_cvtepu8_epi32(_mm_shuffle_epi32(rgba_00_03, _MM_SHUFFLE(3, 2, 3, 2)))); + __m256 rgba1 = _mm256_cvtepi32_ps( + _mm256_cvtepu8_epi32(_mm_shuffle_epi32(rgba_00_03, _MM_SHUFFLE(3, 2, 3, 2)))); __m256 rgba2 = _mm256_cvtepi32_ps(_mm256_cvtepu8_epi32(rgba_04_07)); - __m256 rgba3 = _mm256_cvtepi32_ps(_mm256_cvtepu8_epi32(_mm_shuffle_epi32(rgba_04_07, _MM_SHUFFLE(3, 2, 3, 2)))); + __m256 rgba3 = _mm256_cvtepi32_ps( + _mm256_cvtepu8_epi32(_mm_shuffle_epi32(rgba_04_07, _MM_SHUFFLE(3, 2, 3, 2)))); avx2RGBATranspose_4x4_4x4(rgba0, rgba1, rgba2, rgba3, r, g, b, a); } - static inline void Store(uint8_t *out, __m256 r, __m256 g, __m256 b, __m256 a) + static inline void Store(uint8_t * out, __m256 r, __m256 g, __m256 b, __m256 a) { __m256 rgba0, rgba1, rgba2, rgba3; const __m256 maxValue = _mm256_set1_ps(255.0f); @@ -103,56 +111,64 @@ struct AVX2RGBAPack rgba2 = avx2_clamp(rgba2, maxValue); rgba3 = avx2_clamp(rgba3, maxValue); - // NOTE note using cvtps which will round based on MXCSR register defaults to _MM_ROUND_NEAREST + // NOTE note using cvtps which will round based on MXCSR register defaults to + // _MM_ROUND_NEAREST __m256i rgba01 = _mm256_cvtps_epi32(rgba0); __m256i rgba23 = _mm256_cvtps_epi32(rgba1); __m256i rgba45 = _mm256_cvtps_epi32(rgba2); __m256i rgba67 = _mm256_cvtps_epi32(rgba3); + // clang-format off const __m256i rgba_shuf_a = _mm256_setr_epi8( 0, 4, 8, 12, -1,-1,-1, -1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1, -1, 0, 4, 8, 12, -1,-1,-1,-1, -1,-1,-1,-1); const __m256i rgba_shuf_b = _mm256_setr_epi8(-1,-1,-1,-1, -1,-1,-1,-1, 0, 4, 8, 12, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1, -1, 0, 4, 8, 12); + // clang-format on rgba01 = _mm256_shuffle_epi8(rgba01, rgba_shuf_a); rgba23 = _mm256_shuffle_epi8(rgba23, rgba_shuf_b); rgba01 = _mm256_or_si256(rgba01, rgba23); - __m128i lo = _mm_or_si128(_mm256_castsi256_si128(rgba01), _mm256_extractf128_si256(rgba01, 1)); + __m128i lo + = _mm_or_si128(_mm256_castsi256_si128(rgba01), _mm256_extractf128_si256(rgba01, 1)); rgba45 = _mm256_shuffle_epi8(rgba45, rgba_shuf_a); rgba67 = _mm256_shuffle_epi8(rgba67, rgba_shuf_b); rgba45 = _mm256_or_si256(rgba45, rgba67); - __m128i hi = _mm_or_si128(_mm256_castsi256_si128(rgba45), _mm256_extractf128_si256(rgba45, 1)); + __m128i hi + = _mm_or_si128(_mm256_castsi256_si128(rgba45), _mm256_extractf128_si256(rgba45, 1)); __m256i rgba = _mm256_inserti128_si256(_mm256_castsi128_si256(lo), hi, 1); - _mm256_storeu_si256((__m256i*)out, rgba); + _mm256_storeu_si256((__m256i *)out, rgba); } }; -template -struct AVX2RGBAPack16 +template struct AVX2RGBAPack16 { typedef typename BitDepthInfo::Type Type; - static inline void Load(const Type *in, __m256& r, __m256& g, __m256& b, __m256& a) + static inline void Load(const Type * in, __m256 & r, __m256 & g, __m256 & b, __m256 & a) { // const __m256 scale = _mm256_set1_ps(1.0f / (float)BitDepthInfo::maxValue); - __m256i rgba_00_03 = _mm256_loadu_si256((const __m256i*)(in + 0)); - __m256i rgba_04_07 = _mm256_loadu_si256((const __m256i*)(in + 16)); - - __m256 rgba0 = _mm256_cvtepi32_ps(_mm256_cvtepu16_epi32(_mm256_castsi256_si128(rgba_00_03))); - __m256 rgba1 = _mm256_cvtepi32_ps(_mm256_cvtepu16_epi32(_mm256_extractf128_si256(rgba_00_03, 1))); - __m256 rgba2 = _mm256_cvtepi32_ps(_mm256_cvtepu16_epi32(_mm256_castsi256_si128(rgba_04_07))); - __m256 rgba3 = _mm256_cvtepi32_ps(_mm256_cvtepu16_epi32(_mm256_extractf128_si256(rgba_04_07, 1))); + __m256i rgba_00_03 = _mm256_loadu_si256((const __m256i *)(in + 0)); + __m256i rgba_04_07 = _mm256_loadu_si256((const __m256i *)(in + 16)); + + __m256 rgba0 + = _mm256_cvtepi32_ps(_mm256_cvtepu16_epi32(_mm256_castsi256_si128(rgba_00_03))); + __m256 rgba1 + = _mm256_cvtepi32_ps(_mm256_cvtepu16_epi32(_mm256_extractf128_si256(rgba_00_03, 1))); + __m256 rgba2 + = _mm256_cvtepi32_ps(_mm256_cvtepu16_epi32(_mm256_castsi256_si128(rgba_04_07))); + __m256 rgba3 + = _mm256_cvtepi32_ps(_mm256_cvtepu16_epi32(_mm256_extractf128_si256(rgba_04_07, 1))); avx2RGBATranspose_4x4_4x4(rgba0, rgba1, rgba2, rgba3, r, g, b, a); } - static inline void Store(Type *out, __m256 r, __m256 g, __m256 b, __m256 a) + static inline void Store(Type * out, __m256 r, __m256 g, __m256 b, __m256 a) { __m256 rgba0, rgba1, rgba2, rgba3; __m128i lo, hi; @@ -166,69 +182,69 @@ struct AVX2RGBAPack16 rgba2 = avx2_clamp(rgba2, maxValue); rgba3 = avx2_clamp(rgba3, maxValue); - // NOTE note using cvtps which will round based on MXCSR register defaults to _MM_ROUND_NEAREST + // NOTE note using cvtps which will round based on MXCSR register defaults to + // _MM_ROUND_NEAREST __m256i rgba01 = _mm256_cvtps_epi32(rgba0); __m256i rgba23 = _mm256_cvtps_epi32(rgba1); __m256i rgba45 = _mm256_cvtps_epi32(rgba2); __m256i rgba67 = _mm256_cvtps_epi32(rgba3); + // clang-format off const __m256i rgba_shuf = _mm256_setr_epi8( 0, 1, 4, 5, 8, 9, 12, 13, -1,-1,-1,-1, -1,-1, -1 ,-1, - -1,-1,-1,-1, -1, -1, -1, -1, 0, 1, 4, 5, 8, 9, 12, 13); + -1,-1,-1,-1, -1, -1, -1, -1, 0, 1, 4, 5, 8, 9, 12, 13); + // clang-format on rgba01 = _mm256_shuffle_epi8(rgba01, rgba_shuf); - lo = _mm_or_si128(_mm256_castsi256_si128(rgba01), _mm256_extractf128_si256(rgba01, 1)); + lo = _mm_or_si128(_mm256_castsi256_si128(rgba01), _mm256_extractf128_si256(rgba01, 1)); rgba23 = _mm256_shuffle_epi8(rgba23, rgba_shuf); - hi = _mm_or_si128(_mm256_castsi256_si128(rgba23), _mm256_extractf128_si256(rgba23, 1)); + hi = _mm_or_si128(_mm256_castsi256_si128(rgba23), _mm256_extractf128_si256(rgba23, 1)); rgba = _mm256_inserti128_si256(_mm256_castsi128_si256(lo), hi, 1); - _mm256_storeu_si256((__m256i*)(out+0), rgba); + _mm256_storeu_si256((__m256i *)(out + 0), rgba); rgba45 = _mm256_shuffle_epi8(rgba45, rgba_shuf); - lo = _mm_or_si128(_mm256_castsi256_si128(rgba45), _mm256_extractf128_si256(rgba45, 1)); + lo = _mm_or_si128(_mm256_castsi256_si128(rgba45), _mm256_extractf128_si256(rgba45, 1)); rgba67 = _mm256_shuffle_epi8(rgba67, rgba_shuf); - hi = _mm_or_si128(_mm256_castsi256_si128(rgba67), _mm256_extractf128_si256(rgba67, 1)); + hi = _mm_or_si128(_mm256_castsi256_si128(rgba67), _mm256_extractf128_si256(rgba67, 1)); rgba = _mm256_inserti128_si256(_mm256_castsi128_si256(lo), hi, 1); - _mm256_storeu_si256((__m256i*)(out+16), rgba); + _mm256_storeu_si256((__m256i *)(out + 16), rgba); } }; -template <> -struct AVX2RGBAPack +template <> struct AVX2RGBAPack { - static inline void Load(const uint16_t *in, __m256& r, __m256& g, __m256& b, __m256& a) + static inline void Load(const uint16_t * in, __m256 & r, __m256 & g, __m256 & b, __m256 & a) { AVX2RGBAPack16::Load(in, r, g, b, a); } - static inline void Store(uint16_t *out, __m256 r, __m256 g, __m256 b, __m256 a) + static inline void Store(uint16_t * out, __m256 r, __m256 g, __m256 b, __m256 a) { AVX2RGBAPack16::Store(out, r, g, b, a); } }; -template <> -struct AVX2RGBAPack +template <> struct AVX2RGBAPack { - static inline void Load(const uint16_t *in, __m256& r, __m256& g, __m256& b, __m256& a) + static inline void Load(const uint16_t * in, __m256 & r, __m256 & g, __m256 & b, __m256 & a) { AVX2RGBAPack16::Load(in, r, g, b, a); } - static inline void Store(uint16_t *out, __m256 r, __m256 g, __m256 b, __m256 a) + static inline void Store(uint16_t * out, __m256 r, __m256 g, __m256 b, __m256 a) { AVX2RGBAPack16::Store(out, r, g, b, a); } }; -template <> -struct AVX2RGBAPack +template <> struct AVX2RGBAPack { - static inline void Load(const uint16_t *in, __m256& r, __m256& g, __m256& b, __m256& a) + static inline void Load(const uint16_t * in, __m256 & r, __m256 & g, __m256 & b, __m256 & a) { AVX2RGBAPack16::Load(in, r, g, b, a); } - static inline void Store(uint16_t *out, __m256 r, __m256 g, __m256 b, __m256 a) + static inline void Store(uint16_t * out, __m256 r, __m256 g, __m256 b, __m256 a) { AVX2RGBAPack16::Store(out, r, g, b, a); } @@ -236,14 +252,13 @@ struct AVX2RGBAPack #if OCIO_USE_F16C -template <> -struct AVX2RGBAPack +template <> struct AVX2RGBAPack { - static inline void Load(const half *in, __m256& r, __m256& g, __m256& b, __m256& a) + static inline void Load(const half * in, __m256 & r, __m256 & g, __m256 & b, __m256 & a) { - __m256i rgba_00_03 = _mm256_loadu_si256((const __m256i*)(in + 0)); - __m256i rgba_04_07 = _mm256_loadu_si256((const __m256i*)(in + 16)); + __m256i rgba_00_03 = _mm256_loadu_si256((const __m256i *)(in + 0)); + __m256i rgba_04_07 = _mm256_loadu_si256((const __m256i *)(in + 16)); __m256 rgba0 = _mm256_cvtph_ps(_mm256_castsi256_si128(rgba_00_03)); __m256 rgba1 = _mm256_cvtph_ps(_mm256_extractf128_si256(rgba_00_03, 1)); @@ -253,7 +268,7 @@ struct AVX2RGBAPack avx2RGBATranspose_4x4_4x4(rgba0, rgba1, rgba2, rgba3, r, g, b, a); } - static inline void Store(half *out, __m256 r, __m256 g, __m256 b, __m256 a) + static inline void Store(half * out, __m256 r, __m256 g, __m256 b, __m256 a) { __m256 rgba0, rgba1, rgba2, rgba3; __m256i rgba; @@ -266,34 +281,33 @@ struct AVX2RGBAPack __m128i rgba12_16 = _mm256_cvtps_ph(rgba3, 0); rgba = _mm256_inserti128_si256(_mm256_castsi128_si256(rgba00_03), rgba04_07, 1); - _mm256_storeu_si256((__m256i*)(out+0), rgba); + _mm256_storeu_si256((__m256i *)(out + 0), rgba); rgba = _mm256_inserti128_si256(_mm256_castsi128_si256(rgba08_11), rgba12_16, 1); - _mm256_storeu_si256((__m256i*)(out+16), rgba); + _mm256_storeu_si256((__m256i *)(out + 16), rgba); } }; #endif -template <> -struct AVX2RGBAPack +template <> struct AVX2RGBAPack { - static inline void Load(const float *in, __m256& r, __m256& g, __m256& b, __m256& a) + static inline void Load(const float * in, __m256 & r, __m256 & g, __m256 & b, __m256 & a) { const __m256i rgba_idx = _mm256_setr_epi32(0, 8, 16, 24, 4, 12, 20, 28); - r = _mm256_i32gather_ps(in + 0, rgba_idx, 4); - g = _mm256_i32gather_ps(in + 1, rgba_idx, 4); - b = _mm256_i32gather_ps(in + 2, rgba_idx, 4); - a = _mm256_i32gather_ps(in + 3, rgba_idx, 4); + r = _mm256_i32gather_ps(in + 0, rgba_idx, 4); + g = _mm256_i32gather_ps(in + 1, rgba_idx, 4); + b = _mm256_i32gather_ps(in + 2, rgba_idx, 4); + a = _mm256_i32gather_ps(in + 3, rgba_idx, 4); } - static inline void Store(float *out, __m256 r, __m256 g, __m256 b, __m256 a) + static inline void Store(float * out, __m256 r, __m256 g, __m256 b, __m256 a) { __m256 rgba0, rgba1, rgba2, rgba3; avx2RGBATranspose_4x4_4x4(r, g, b, a, rgba0, rgba1, rgba2, rgba3); - _mm256_storeu_ps(out + 0, rgba0); - _mm256_storeu_ps(out + 8, rgba1); + _mm256_storeu_ps(out + 0, rgba0); + _mm256_storeu_ps(out + 8, rgba1); _mm256_storeu_ps(out + 16, rgba2); _mm256_storeu_ps(out + 24, rgba3); } diff --git a/src/OpenColorIO/AVX512.h b/src/OpenColorIO/AVX512.h index 1ffef09f7e..a593296f40 100644 --- a/src/OpenColorIO/AVX512.h +++ b/src/OpenColorIO/AVX512.h @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_AVX512_H #define INCLUDED_OCIO_AVX512_H @@ -10,8 +9,8 @@ #include -#include #include "BitDepthUtils.h" +#include // Macros for alignment declarations #define AVX512_SIMD_BYTES 64 @@ -20,7 +19,7 @@ namespace OCIO_NAMESPACE { -inline __m512 av512_clamp(__m512 value, const __m512& maxValue) +inline __m512 av512_clamp(__m512 value, const __m512 & maxValue) { value = _mm512_max_ps(value, _mm512_setzero_ps()); return _mm512_min_ps(value, maxValue); @@ -37,27 +36,32 @@ inline __m512 avx512_movehl_ps(__m512 a, __m512 b) return _mm512_castpd_ps(_mm512_unpackhi_pd(_mm512_castps_pd(b), _mm512_castps_pd(a))); } - -inline void avx512RGBATranspose_4x4_4x4_4x4_4x4(__m512 row0, __m512 row1, __m512 row2, __m512 row3, - __m512 &out_r, __m512 &out_g, __m512 &out_b, __m512 &out_a ) +inline void avx512RGBATranspose_4x4_4x4_4x4_4x4( + __m512 row0, + __m512 row1, + __m512 row2, + __m512 row3, + __m512 & out_r, + __m512 & out_g, + __m512 & out_b, + __m512 & out_a) { // the rgba transpose result will look this // - // 0 1 2 3 | 4 5 6 7 8 9 10 11 12 13 14 15 - // r0, g0, b0, a0 | r1, g1, b1, a1 | r2, g2, b2, a2 | r3, g3, b3, a3 - // r4, g4, b4, a4 | r5, g5, b5, a5 | r6, g6, b6, a6 | r7, g7, b7, a7 - // r8 g8, b8, a8 | r9, g9, b9, a9 | r10, g10, b10, a10 | r11, g11, b11, a11 - // r12, g12, b12, a12 | r13, g13, b13, a13 | r14, g14, b14, a14 | r15, g15, b15, a15 + // 0 1 2 3 | 4 5 6 7 8 9 10 11 12 13 14 15 + // r0, g0, b0, a0 | r1, g1, b1, a1 | r2, g2, b2, a2 | r3, g3, b3, a3 + // r4, g4, b4, a4 | r5, g5, b5, a5 | r6, g6, b6, a6 | r7, g7, b7, a7 + // r8 g8, b8, a8 | r9, g9, b9, a9 | r10, g10, b10, a10 | r11, g11, b11, a11 + // r12, g12, b12, a12 | r13, g13, b13, a13 | r14, g14, b14, a14 | r15, g15, b15, a15 // | | | - // | | | | | | | + // | | | | | | | // V | V | V | V - // | | | + // | | | // r0, r4, r8, r12 | r1, r5, r9, r13 | r2, r6, r10, r14 | r3, r7, r11, r15 // g0, g4, g8, g12 | g1, g5, g9, g13 | g2, g6, g10, g14 | g3, g7, g11, g15 // b0, b4, b9, b12 | b1, b5, b9, b13 | b2, b6, b10, b14 | b3, b7, b11, b15 // a0, a4, a8, a12 | a1, a5, a9, a13 | a2, a6, a10, a14 | a3, a7, a11, a15 - // each 128 lane is transposed independently, // the channel values end up with a even/odd shuffled order because of this. // if exact order is important more cross lane shuffling is needed @@ -71,20 +75,19 @@ inline void avx512RGBATranspose_4x4_4x4_4x4_4x4(__m512 row0, __m512 row1, __ out_g = avx512_movehl_ps(tmp2, tmp0); out_b = avx512_movelh_ps(tmp1, tmp3); out_a = avx512_movehl_ps(tmp3, tmp1); - } - // Note Packing functions perform no 0.0 - 1.0 normalization // but perform 0 - max value clamping for integer formats -template struct AVX512RGBAPack {}; +template struct AVX512RGBAPack +{ +}; -template <> -struct AVX512RGBAPack +template <> struct AVX512RGBAPack { - static inline void Load(const uint8_t *in, __m512& r, __m512& g, __m512& b, __m512& a) + static inline void Load(const uint8_t * in, __m512 & r, __m512 & g, __m512 & b, __m512 & a) { - __m512i rgba = _mm512_loadu_si512((const __m512i*)in); + __m512i rgba = _mm512_loadu_si512((const __m512i *)in); __m512 rgba0 = _mm512_cvtepi32_ps(_mm512_cvtepu8_epi32(_mm512_castsi512_si128(rgba))); __m512 rgba1 = _mm512_cvtepi32_ps(_mm512_cvtepu8_epi32(_mm512_extracti32x4_epi32(rgba, 1))); @@ -94,16 +97,23 @@ struct AVX512RGBAPack avx512RGBATranspose_4x4_4x4_4x4_4x4(rgba0, rgba1, rgba2, rgba3, r, g, b, a); } - static inline void LoadMasked(const uint8_t *in, __m512& r, __m512& g, __m512& b, __m512& a, uint32_t pixel_count) + static inline void LoadMasked( + const uint8_t * in, + __m512 & r, + __m512 & g, + __m512 & b, + __m512 & a, + uint32_t pixel_count) { __mmask16 k; uint16_t mask = 0; - for (uint32_t i = 0; i < pixel_count; i++) { + for (uint32_t i = 0; i < pixel_count; i++) + { mask = (mask << 1) | 1; } - k = _mm512_int2mask(mask); - __m512i rgba = _mm512_maskz_loadu_epi32(k, (const __m512i*)in); + k = _mm512_int2mask(mask); + __m512i rgba = _mm512_maskz_loadu_epi32(k, (const __m512i *)in); __m512 rgba0 = _mm512_cvtepi32_ps(_mm512_cvtepu8_epi32(_mm512_castsi512_si128(rgba))); __m512 rgba1 = _mm512_cvtepi32_ps(_mm512_cvtepu8_epi32(_mm512_extracti32x4_epi32(rgba, 1))); @@ -113,10 +123,10 @@ struct AVX512RGBAPack avx512RGBATranspose_4x4_4x4_4x4_4x4(rgba0, rgba1, rgba2, rgba3, r, g, b, a); } - static inline void Store(uint8_t *out, __m512 r, __m512 g, __m512 b, __m512 a) + static inline void Store(uint8_t * out, __m512 r, __m512 g, __m512 b, __m512 a) { const __m512 maxValue = _mm512_set1_ps(255.0f); - __m512 rgba0, rgba1,rgba2, rgba3; + __m512 rgba0, rgba1, rgba2, rgba3; r = av512_clamp(r, maxValue); g = av512_clamp(g, maxValue); @@ -126,20 +136,22 @@ struct AVX512RGBAPack avx512RGBATranspose_4x4_4x4_4x4_4x4(r, g, b, a, rgba0, rgba1, rgba2, rgba3); __mmask16 k = _mm512_int2mask(0xFFFF); - _mm512_mask_cvtepi32_storeu_epi8(out+0, k, _mm512_cvtps_epi32(rgba0)); - _mm512_mask_cvtepi32_storeu_epi8(out+16, k, _mm512_cvtps_epi32(rgba1)); - _mm512_mask_cvtepi32_storeu_epi8(out+32, k, _mm512_cvtps_epi32(rgba2)); - _mm512_mask_cvtepi32_storeu_epi8(out+48, k, _mm512_cvtps_epi32(rgba3)); + _mm512_mask_cvtepi32_storeu_epi8(out + 0, k, _mm512_cvtps_epi32(rgba0)); + _mm512_mask_cvtepi32_storeu_epi8(out + 16, k, _mm512_cvtps_epi32(rgba1)); + _mm512_mask_cvtepi32_storeu_epi8(out + 32, k, _mm512_cvtps_epi32(rgba2)); + _mm512_mask_cvtepi32_storeu_epi8(out + 48, k, _mm512_cvtps_epi32(rgba3)); } - static inline void StoreMasked(uint8_t *out, __m512 r, __m512 g, __m512 b, __m512 a, uint32_t pixel_count) + static inline void + StoreMasked(uint8_t * out, __m512 r, __m512 g, __m512 b, __m512 a, uint32_t pixel_count) { const __m512 maxValue = _mm512_set1_ps(255.0f); - __m512 rgba0, rgba1,rgba2, rgba3; + __m512 rgba0, rgba1, rgba2, rgba3; __mmask16 k; uint64_t mask = 0; - for (uint32_t i = 0; i < pixel_count; i++) { + for (uint32_t i = 0; i < pixel_count; i++) + { mask = (mask << 4) | 0b1111; } @@ -151,61 +163,73 @@ struct AVX512RGBAPack avx512RGBATranspose_4x4_4x4_4x4_4x4(r, g, b, a, rgba0, rgba1, rgba2, rgba3); k = _mm512_int2mask((mask >> 0) & 0xFFFF); - _mm512_mask_cvtepi32_storeu_epi8(out+0, k, _mm512_cvtps_epi32(rgba0)); + _mm512_mask_cvtepi32_storeu_epi8(out + 0, k, _mm512_cvtps_epi32(rgba0)); k = _mm512_int2mask((mask >> 16) & 0xFFFF); - _mm512_mask_cvtepi32_storeu_epi8(out+16, k, _mm512_cvtps_epi32(rgba1)); + _mm512_mask_cvtepi32_storeu_epi8(out + 16, k, _mm512_cvtps_epi32(rgba1)); k = _mm512_int2mask((mask >> 32) & 0xFFFF); - _mm512_mask_cvtepi32_storeu_epi8(out+32, k, _mm512_cvtps_epi32(rgba2)); + _mm512_mask_cvtepi32_storeu_epi8(out + 32, k, _mm512_cvtps_epi32(rgba2)); k = _mm512_int2mask((mask >> 48) & 0xFFFF); - _mm512_mask_cvtepi32_storeu_epi8(out+48, k, _mm512_cvtps_epi32(rgba3)); + _mm512_mask_cvtepi32_storeu_epi8(out + 48, k, _mm512_cvtps_epi32(rgba3)); } }; -template -struct AVX512RGBAPack16 +template struct AVX512RGBAPack16 { typedef typename BitDepthInfo::Type Type; - static inline void Load(const Type *in, __m512& r, __m512& g, __m512& b, __m512& a) + static inline void Load(const Type * in, __m512 & r, __m512 & g, __m512 & b, __m512 & a) { - __m512i rgba_00_07 = _mm512_loadu_si512((const __m512i*)(in + 0)); - __m512i rgba_08_15 = _mm512_loadu_si512((const __m512i*)(in + 32)); - - __m512 rgba0 = _mm512_cvtepi32_ps(_mm512_cvtepu16_epi32(_mm512_castsi512_si256(rgba_00_07))); - __m512 rgba1 = _mm512_cvtepi32_ps(_mm512_cvtepu16_epi32(_mm512_extracti64x4_epi64 (rgba_00_07, 1))); - __m512 rgba2 = _mm512_cvtepi32_ps(_mm512_cvtepu16_epi32(_mm512_castsi512_si256(rgba_08_15))); - __m512 rgba3 = _mm512_cvtepi32_ps(_mm512_cvtepu16_epi32(_mm512_extracti64x4_epi64 (rgba_08_15, 1))); + __m512i rgba_00_07 = _mm512_loadu_si512((const __m512i *)(in + 0)); + __m512i rgba_08_15 = _mm512_loadu_si512((const __m512i *)(in + 32)); + + __m512 rgba0 + = _mm512_cvtepi32_ps(_mm512_cvtepu16_epi32(_mm512_castsi512_si256(rgba_00_07))); + __m512 rgba1 + = _mm512_cvtepi32_ps(_mm512_cvtepu16_epi32(_mm512_extracti64x4_epi64(rgba_00_07, 1))); + __m512 rgba2 + = _mm512_cvtepi32_ps(_mm512_cvtepu16_epi32(_mm512_castsi512_si256(rgba_08_15))); + __m512 rgba3 + = _mm512_cvtepi32_ps(_mm512_cvtepu16_epi32(_mm512_extracti64x4_epi64(rgba_08_15, 1))); avx512RGBATranspose_4x4_4x4_4x4_4x4(rgba0, rgba1, rgba2, rgba3, r, g, b, a); - } - static inline void LoadMasked(const Type *in, __m512& r, __m512& g, __m512& b, __m512& a, uint32_t pixel_count) + static inline void LoadMasked( + const Type * in, + __m512 & r, + __m512 & g, + __m512 & b, + __m512 & a, + uint32_t pixel_count) { __mmask16 k; uint32_t mask = 0; - for (uint32_t i = 0; i < pixel_count; i++) { + for (uint32_t i = 0; i < pixel_count; i++) + { mask = (mask << 2) | 0b11; } - k = _mm512_int2mask((mask >> 0) & 0xFFFF); - __m512i rgba_00_07 = _mm512_maskz_loadu_epi32(k, (const __m512i*)(in + 0)); - k = _mm512_int2mask((mask >> 16) & 0xFFFF); - __m512i rgba_08_15 = _mm512_maskz_loadu_epi32(k, (const __m512i*)(in + 32)); + k = _mm512_int2mask((mask >> 0) & 0xFFFF); + __m512i rgba_00_07 = _mm512_maskz_loadu_epi32(k, (const __m512i *)(in + 0)); + k = _mm512_int2mask((mask >> 16) & 0xFFFF); + __m512i rgba_08_15 = _mm512_maskz_loadu_epi32(k, (const __m512i *)(in + 32)); - __m512 rgba0 = _mm512_cvtepi32_ps(_mm512_cvtepu16_epi32(_mm512_castsi512_si256(rgba_00_07))); - __m512 rgba1 = _mm512_cvtepi32_ps(_mm512_cvtepu16_epi32(_mm512_extracti64x4_epi64 (rgba_00_07, 1))); - __m512 rgba2 = _mm512_cvtepi32_ps(_mm512_cvtepu16_epi32(_mm512_castsi512_si256(rgba_08_15))); - __m512 rgba3 = _mm512_cvtepi32_ps(_mm512_cvtepu16_epi32(_mm512_extracti64x4_epi64 (rgba_08_15, 1))); + __m512 rgba0 + = _mm512_cvtepi32_ps(_mm512_cvtepu16_epi32(_mm512_castsi512_si256(rgba_00_07))); + __m512 rgba1 + = _mm512_cvtepi32_ps(_mm512_cvtepu16_epi32(_mm512_extracti64x4_epi64(rgba_00_07, 1))); + __m512 rgba2 + = _mm512_cvtepi32_ps(_mm512_cvtepu16_epi32(_mm512_castsi512_si256(rgba_08_15))); + __m512 rgba3 + = _mm512_cvtepi32_ps(_mm512_cvtepu16_epi32(_mm512_extracti64x4_epi64(rgba_08_15, 1))); avx512RGBATranspose_4x4_4x4_4x4_4x4(rgba0, rgba1, rgba2, rgba3, r, g, b, a); - } - static inline void Store(Type *out, __m512 r, __m512 g, __m512 b, __m512 a) + static inline void Store(Type * out, __m512 r, __m512 g, __m512 b, __m512 a) { const __m512 maxValue = _mm512_set1_ps((float)BitDepthInfo::maxValue); - __m512 rgba0, rgba1,rgba2, rgba3; + __m512 rgba0, rgba1, rgba2, rgba3; r = av512_clamp(r, maxValue); g = av512_clamp(g, maxValue); @@ -215,21 +239,22 @@ struct AVX512RGBAPack16 avx512RGBATranspose_4x4_4x4_4x4_4x4(r, g, b, a, rgba0, rgba1, rgba2, rgba3); __mmask16 k = _mm512_int2mask(0xFFFF); - _mm512_mask_cvtepi32_storeu_epi16(out+0, k, _mm512_cvtps_epi32(rgba0)); - _mm512_mask_cvtepi32_storeu_epi16(out+16, k, _mm512_cvtps_epi32(rgba1)); - _mm512_mask_cvtepi32_storeu_epi16(out+32, k, _mm512_cvtps_epi32(rgba2)); - _mm512_mask_cvtepi32_storeu_epi16(out+48, k, _mm512_cvtps_epi32(rgba3)); - + _mm512_mask_cvtepi32_storeu_epi16(out + 0, k, _mm512_cvtps_epi32(rgba0)); + _mm512_mask_cvtepi32_storeu_epi16(out + 16, k, _mm512_cvtps_epi32(rgba1)); + _mm512_mask_cvtepi32_storeu_epi16(out + 32, k, _mm512_cvtps_epi32(rgba2)); + _mm512_mask_cvtepi32_storeu_epi16(out + 48, k, _mm512_cvtps_epi32(rgba3)); } - static inline void StoreMasked(Type *out, __m512 r, __m512 g, __m512 b, __m512 a, uint32_t pixel_count) + static inline void + StoreMasked(Type * out, __m512 r, __m512 g, __m512 b, __m512 a, uint32_t pixel_count) { const __m512 maxValue = _mm512_set1_ps((float)BitDepthInfo::maxValue); - __m512 rgba0, rgba1,rgba2, rgba3; + __m512 rgba0, rgba1, rgba2, rgba3; __mmask16 k; uint64_t mask = 0; - for (uint32_t i = 0; i < pixel_count; i++) { + for (uint32_t i = 0; i < pixel_count; i++) + { mask = (mask << 4) | 0b1111; } @@ -241,88 +266,103 @@ struct AVX512RGBAPack16 avx512RGBATranspose_4x4_4x4_4x4_4x4(r, g, b, a, rgba0, rgba1, rgba2, rgba3); k = _mm512_int2mask((mask >> 0) & 0xFFFF); - _mm512_mask_cvtepi32_storeu_epi16(out+0, k, _mm512_cvtps_epi32(rgba0)); + _mm512_mask_cvtepi32_storeu_epi16(out + 0, k, _mm512_cvtps_epi32(rgba0)); k = _mm512_int2mask((mask >> 16) & 0xFFFF); - _mm512_mask_cvtepi32_storeu_epi16(out+16, k, _mm512_cvtps_epi32(rgba1)); + _mm512_mask_cvtepi32_storeu_epi16(out + 16, k, _mm512_cvtps_epi32(rgba1)); k = _mm512_int2mask((mask >> 32) & 0xFFFF); - _mm512_mask_cvtepi32_storeu_epi16(out+32, k, _mm512_cvtps_epi32(rgba2)); + _mm512_mask_cvtepi32_storeu_epi16(out + 32, k, _mm512_cvtps_epi32(rgba2)); k = _mm512_int2mask((mask >> 48) & 0xFFFF); - _mm512_mask_cvtepi32_storeu_epi16(out+48, k, _mm512_cvtps_epi32(rgba3)); - + _mm512_mask_cvtepi32_storeu_epi16(out + 48, k, _mm512_cvtps_epi32(rgba3)); } }; -template <> -struct AVX512RGBAPack +template <> struct AVX512RGBAPack { - static inline void Load(const uint16_t *in, __m512& r, __m512& g, __m512& b, __m512& a) + static inline void Load(const uint16_t * in, __m512 & r, __m512 & g, __m512 & b, __m512 & a) { AVX512RGBAPack16::Load(in, r, g, b, a); } - static inline void LoadMasked(const uint16_t *in, __m512& r, __m512& g, __m512& b, __m512& a, uint32_t pixel_count) + static inline void LoadMasked( + const uint16_t * in, + __m512 & r, + __m512 & g, + __m512 & b, + __m512 & a, + uint32_t pixel_count) { AVX512RGBAPack16::LoadMasked(in, r, g, b, a, pixel_count); } - static inline void Store(uint16_t *out, __m512 r, __m512 g, __m512 b, __m512 a) + static inline void Store(uint16_t * out, __m512 r, __m512 g, __m512 b, __m512 a) { AVX512RGBAPack16::Store(out, r, g, b, a); } - static inline void StoreMasked(uint16_t *out, __m512 r, __m512 g, __m512 b, __m512 a, uint32_t pixel_count) + static inline void + StoreMasked(uint16_t * out, __m512 r, __m512 g, __m512 b, __m512 a, uint32_t pixel_count) { AVX512RGBAPack16::StoreMasked(out, r, g, b, a, pixel_count); } - }; -template <> -struct AVX512RGBAPack +template <> struct AVX512RGBAPack { - static inline void Load(const uint16_t *in, __m512& r, __m512& g, __m512& b, __m512& a) + static inline void Load(const uint16_t * in, __m512 & r, __m512 & g, __m512 & b, __m512 & a) { AVX512RGBAPack16::Load(in, r, g, b, a); } - static inline void LoadMasked(const uint16_t *in, __m512& r, __m512& g, __m512& b, __m512& a, uint32_t pixel_count) + static inline void LoadMasked( + const uint16_t * in, + __m512 & r, + __m512 & g, + __m512 & b, + __m512 & a, + uint32_t pixel_count) { AVX512RGBAPack16::LoadMasked(in, r, g, b, a, pixel_count); } - static inline void Store(uint16_t *out, __m512 r, __m512 g, __m512 b, __m512 a) + static inline void Store(uint16_t * out, __m512 r, __m512 g, __m512 b, __m512 a) { AVX512RGBAPack16::Store(out, r, g, b, a); } - static inline void StoreMasked(uint16_t *out, __m512 r, __m512 g, __m512 b, __m512 a, uint32_t pixel_count) + static inline void + StoreMasked(uint16_t * out, __m512 r, __m512 g, __m512 b, __m512 a, uint32_t pixel_count) { AVX512RGBAPack16::StoreMasked(out, r, g, b, a, pixel_count); } }; -template <> -struct AVX512RGBAPack +template <> struct AVX512RGBAPack { - static inline void Load(const uint16_t *in, __m512& r, __m512& g, __m512& b, __m512& a) + static inline void Load(const uint16_t * in, __m512 & r, __m512 & g, __m512 & b, __m512 & a) { AVX512RGBAPack16::Load(in, r, g, b, a); } - static inline void LoadMasked(const uint16_t *in, __m512& r, __m512& g, __m512& b, __m512& a, uint32_t pixel_count) + static inline void LoadMasked( + const uint16_t * in, + __m512 & r, + __m512 & g, + __m512 & b, + __m512 & a, + uint32_t pixel_count) { AVX512RGBAPack16::LoadMasked(in, r, g, b, a, pixel_count); } - static inline void Store(uint16_t *out, __m512 r, __m512 g, __m512 b, __m512 a) + static inline void Store(uint16_t * out, __m512 r, __m512 g, __m512 b, __m512 a) { AVX512RGBAPack16::Store(out, r, g, b, a); } - static inline void StoreMasked(uint16_t *out, __m512 r, __m512 g, __m512 b, __m512 a, uint32_t pixel_count) + static inline void + StoreMasked(uint16_t * out, __m512 r, __m512 g, __m512 b, __m512 a, uint32_t pixel_count) { AVX512RGBAPack16::StoreMasked(out, r, g, b, a, pixel_count); } }; -template <> -struct AVX512RGBAPack +template <> struct AVX512RGBAPack { - static inline void Load(const half *in, __m512& r, __m512& g, __m512& b, __m512& a) + static inline void Load(const half * in, __m512 & r, __m512 & g, __m512 & b, __m512 & a) { - __m512i rgba_00_07 = _mm512_loadu_si512((const __m512i*)(in + 0)); - __m512i rgba_08_15 = _mm512_loadu_si512((const __m512i*)(in + 32)); + __m512i rgba_00_07 = _mm512_loadu_si512((const __m512i *)(in + 0)); + __m512i rgba_08_15 = _mm512_loadu_si512((const __m512i *)(in + 32)); __m512 rgba0 = _mm512_cvtph_ps(_mm512_castsi512_si256(rgba_00_07)); __m512 rgba1 = _mm512_cvtph_ps(_mm512_extracti64x4_epi64(rgba_00_07, 1)); @@ -331,21 +371,27 @@ struct AVX512RGBAPack __m512 rgba3 = _mm512_cvtph_ps(_mm512_extracti64x4_epi64(rgba_08_15, 1)); avx512RGBATranspose_4x4_4x4_4x4_4x4(rgba0, rgba1, rgba2, rgba3, r, g, b, a); - } - static inline void LoadMasked(const half *in, __m512& r, __m512& g, __m512& b, __m512& a, uint32_t pixel_count) + static inline void LoadMasked( + const half * in, + __m512 & r, + __m512 & g, + __m512 & b, + __m512 & a, + uint32_t pixel_count) { __mmask16 k; uint32_t mask = 0; - for (uint32_t i = 0; i < pixel_count; i++) { + for (uint32_t i = 0; i < pixel_count; i++) + { mask = (mask << 2) | 0b11; } - k = _mm512_int2mask((mask >> 0) & 0xFFFF); - __m512i rgba_00_07 = _mm512_maskz_loadu_epi32(k, (const __m512i*)(in + 0)); - k = _mm512_int2mask((mask >> 16) & 0xFFFF); - __m512i rgba_08_15 = _mm512_maskz_loadu_epi32(k, (const __m512i*)(in + 32)); + k = _mm512_int2mask((mask >> 0) & 0xFFFF); + __m512i rgba_00_07 = _mm512_maskz_loadu_epi32(k, (const __m512i *)(in + 0)); + k = _mm512_int2mask((mask >> 16) & 0xFFFF); + __m512i rgba_08_15 = _mm512_maskz_loadu_epi32(k, (const __m512i *)(in + 32)); __m512 rgba0 = _mm512_cvtph_ps(_mm512_castsi512_si256(rgba_00_07)); __m512 rgba1 = _mm512_cvtph_ps(_mm512_extracti64x4_epi64(rgba_00_07, 1)); @@ -354,50 +400,62 @@ struct AVX512RGBAPack __m512 rgba3 = _mm512_cvtph_ps(_mm512_extracti64x4_epi64(rgba_08_15, 1)); avx512RGBATranspose_4x4_4x4_4x4_4x4(rgba0, rgba1, rgba2, rgba3, r, g, b, a); - } - static inline void Store(half *out, __m512 r, __m512 g, __m512 b, __m512 a) + static inline void Store(half * out, __m512 r, __m512 g, __m512 b, __m512 a) { - __m512 rgba0, rgba1,rgba2, rgba3; + __m512 rgba0, rgba1, rgba2, rgba3; avx512RGBATranspose_4x4_4x4_4x4_4x4(r, g, b, a, rgba0, rgba1, rgba2, rgba3); - __m512i rgba0i = _mm512_inserti64x4(_mm512_castsi256_si512(_mm512_cvtps_ph(rgba0, 0)), _mm512_cvtps_ph(rgba1, 0), 1); - __m512i rgba1i = _mm512_inserti64x4(_mm512_castsi256_si512(_mm512_cvtps_ph(rgba2, 0)), _mm512_cvtps_ph(rgba3, 0), 1); - - _mm512_storeu_si512((__m512i*)(out + 0), rgba0i); - _mm512_storeu_si512((__m512i*)(out + 32), rgba1i); + __m512i rgba0i = _mm512_inserti64x4( + _mm512_castsi256_si512(_mm512_cvtps_ph(rgba0, 0)), + _mm512_cvtps_ph(rgba1, 0), + 1); + __m512i rgba1i = _mm512_inserti64x4( + _mm512_castsi256_si512(_mm512_cvtps_ph(rgba2, 0)), + _mm512_cvtps_ph(rgba3, 0), + 1); + + _mm512_storeu_si512((__m512i *)(out + 0), rgba0i); + _mm512_storeu_si512((__m512i *)(out + 32), rgba1i); } - static inline void StoreMasked(half *out, __m512 r, __m512 g, __m512 b, __m512 a, uint32_t pixel_count) + static inline void + StoreMasked(half * out, __m512 r, __m512 g, __m512 b, __m512 a, uint32_t pixel_count) { - __m512 rgba0, rgba1,rgba2, rgba3; + __m512 rgba0, rgba1, rgba2, rgba3; __mmask16 k; uint64_t mask = 0; - for (uint32_t i = 0; i < pixel_count; i++) { + for (uint32_t i = 0; i < pixel_count; i++) + { mask = (mask << 2) | 0b11; } avx512RGBATranspose_4x4_4x4_4x4_4x4(r, g, b, a, rgba0, rgba1, rgba2, rgba3); - __m512i rgba0i = _mm512_inserti64x4(_mm512_castsi256_si512(_mm512_cvtps_ph(rgba0, 0)), _mm512_cvtps_ph(rgba1, 0), 1); - __m512i rgba1i = _mm512_inserti64x4(_mm512_castsi256_si512(_mm512_cvtps_ph(rgba2, 0)), _mm512_cvtps_ph(rgba3, 0), 1); + __m512i rgba0i = _mm512_inserti64x4( + _mm512_castsi256_si512(_mm512_cvtps_ph(rgba0, 0)), + _mm512_cvtps_ph(rgba1, 0), + 1); + __m512i rgba1i = _mm512_inserti64x4( + _mm512_castsi256_si512(_mm512_cvtps_ph(rgba2, 0)), + _mm512_cvtps_ph(rgba3, 0), + 1); k = _mm512_int2mask((mask >> 0) & 0xFFFF); - _mm512_mask_storeu_epi32((__m512i*)(out + 0), k, rgba0i); + _mm512_mask_storeu_epi32((__m512i *)(out + 0), k, rgba0i); k = _mm512_int2mask((mask >> 16) & 0xFFFF); - _mm512_mask_storeu_epi32((__m512i*)(out + 32), k, rgba1i); + _mm512_mask_storeu_epi32((__m512i *)(out + 32), k, rgba1i); } }; -template <> -struct AVX512RGBAPack +template <> struct AVX512RGBAPack { - static inline void Load(const float *in, __m512& r, __m512& g, __m512& b, __m512& a) + static inline void Load(const float * in, __m512 & r, __m512 & g, __m512 & b, __m512 & a) { - __m512 rgba0 = _mm512_loadu_ps(in + 0); + __m512 rgba0 = _mm512_loadu_ps(in + 0); __m512 rgba1 = _mm512_loadu_ps(in + 16); __m512 rgba2 = _mm512_loadu_ps(in + 32); __m512 rgba3 = _mm512_loadu_ps(in + 48); @@ -405,58 +463,67 @@ struct AVX512RGBAPack avx512RGBATranspose_4x4_4x4_4x4_4x4(rgba0, rgba1, rgba2, rgba3, r, g, b, a); } - static inline void LoadMasked(const float *in, __m512& r, __m512& g, __m512& b, __m512& a, uint32_t pixel_count) + static inline void LoadMasked( + const float * in, + __m512 & r, + __m512 & g, + __m512 & b, + __m512 & a, + uint32_t pixel_count) { __mmask16 k; uint64_t mask = 0; - for (uint32_t i = 0; i < pixel_count; i++) { + for (uint32_t i = 0; i < pixel_count; i++) + { mask = (mask << 4) | 0b1111; } - k = _mm512_int2mask((mask >> 0) & 0xFFFF); - __m512 rgba0 = _mm512_maskz_loadu_ps(k, in + 0); - k = _mm512_int2mask((mask >> 16) & 0xFFFF); + k = _mm512_int2mask((mask >> 0) & 0xFFFF); + __m512 rgba0 = _mm512_maskz_loadu_ps(k, in + 0); + k = _mm512_int2mask((mask >> 16) & 0xFFFF); __m512 rgba1 = _mm512_maskz_loadu_ps(k, in + 16); - k = _mm512_int2mask((mask >> 32) & 0xFFFF); + k = _mm512_int2mask((mask >> 32) & 0xFFFF); __m512 rgba2 = _mm512_maskz_loadu_ps(k, in + 32); - k = _mm512_int2mask((mask >> 48) & 0xFFFF); + k = _mm512_int2mask((mask >> 48) & 0xFFFF); __m512 rgba3 = _mm512_maskz_loadu_ps(k, in + 48); avx512RGBATranspose_4x4_4x4_4x4_4x4(rgba0, rgba1, rgba2, rgba3, r, g, b, a); } - static inline void Store(float *out, __m512 r, __m512 g, __m512 b, __m512 a) + static inline void Store(float * out, __m512 r, __m512 g, __m512 b, __m512 a) { - __m512 rgba0, rgba1,rgba2, rgba3; + __m512 rgba0, rgba1, rgba2, rgba3; avx512RGBATranspose_4x4_4x4_4x4_4x4(r, g, b, a, rgba0, rgba1, rgba2, rgba3); - _mm512_storeu_ps((__m512*)(out+0), rgba0); - _mm512_storeu_ps((__m512*)(out+16), rgba1); - _mm512_storeu_ps((__m512*)(out+32), rgba2); - _mm512_storeu_ps((__m512*)(out+48), rgba3); + _mm512_storeu_ps((__m512 *)(out + 0), rgba0); + _mm512_storeu_ps((__m512 *)(out + 16), rgba1); + _mm512_storeu_ps((__m512 *)(out + 32), rgba2); + _mm512_storeu_ps((__m512 *)(out + 48), rgba3); } - static inline void StoreMasked(float *out, __m512 r, __m512 g, __m512 b, __m512 a, uint32_t pixel_count) + static inline void + StoreMasked(float * out, __m512 r, __m512 g, __m512 b, __m512 a, uint32_t pixel_count) { - __m512 rgba0, rgba1,rgba2, rgba3; + __m512 rgba0, rgba1, rgba2, rgba3; __mmask16 k; uint64_t mask = 0; - for (uint32_t i = 0; i < pixel_count; i++) { + for (uint32_t i = 0; i < pixel_count; i++) + { mask = (mask << 4) | 0b1111; } avx512RGBATranspose_4x4_4x4_4x4_4x4(r, g, b, a, rgba0, rgba1, rgba2, rgba3); k = _mm512_int2mask((mask >> 0) & 0xFFFF); - _mm512_mask_storeu_ps((__m512*)(out+0), k, rgba0); + _mm512_mask_storeu_ps((__m512 *)(out + 0), k, rgba0); k = _mm512_int2mask((mask >> 16) & 0xFFFF); - _mm512_mask_storeu_ps((__m512*)(out+16), k, rgba1); + _mm512_mask_storeu_ps((__m512 *)(out + 16), k, rgba1); k = _mm512_int2mask((mask >> 32) & 0xFFFF); - _mm512_mask_storeu_ps((__m512*)(out+32), k, rgba2); + _mm512_mask_storeu_ps((__m512 *)(out + 32), k, rgba2); k = _mm512_int2mask((mask >> 48) & 0xFFFF); - _mm512_mask_storeu_ps((__m512*)(out+48), k, rgba3); + _mm512_mask_storeu_ps((__m512 *)(out + 48), k, rgba3); } }; diff --git a/src/OpenColorIO/Baker.cpp b/src/OpenColorIO/Baker.cpp old mode 100755 new mode 100644 index b8a78a958c..96e5522168 --- a/src/OpenColorIO/Baker.cpp +++ b/src/OpenColorIO/Baker.cpp @@ -1,15 +1,13 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #include #include -#include "transforms/FileTransform.h" #include "BakingUtils.h" #include "MathUtils.h" - +#include "transforms/FileTransform.h" namespace OCIO_NAMESPACE { @@ -19,7 +17,7 @@ BakerRcPtr Baker::Create() return BakerRcPtr(new Baker(), &deleter); } -void Baker::deleter(Baker* c) +void Baker::deleter(Baker * c) { delete c; } @@ -27,10 +25,9 @@ void Baker::deleter(Baker* c) class Baker::Impl { public: - ConfigRcPtr m_config; std::string m_formatName; - FormatMetadataImpl m_formatMetadata{ METADATA_ROOT, "" }; + FormatMetadataImpl m_formatMetadata{METADATA_ROOT, ""}; std::string m_inputSpace; std::string m_shaperSpace; std::string m_looks; @@ -40,40 +37,38 @@ class Baker::Impl int m_shapersize; int m_cubesize; - Impl() : - m_shapersize(-1), - m_cubesize(-1) + Impl() + : m_shapersize(-1) + , m_cubesize(-1) { } Impl(const Impl &) = delete; - ~Impl() - { - } + ~Impl() {} - Impl& operator= (const Impl & rhs) + Impl & operator=(const Impl & rhs) { if (this != &rhs) { - m_config = rhs.m_config; - m_formatName = rhs.m_formatName; + m_config = rhs.m_config; + m_formatName = rhs.m_formatName; m_formatMetadata = rhs.m_formatMetadata; - m_inputSpace = rhs.m_inputSpace; - m_shaperSpace = rhs.m_shaperSpace; - m_looks = rhs.m_looks; - m_targetSpace = rhs.m_targetSpace; - m_display = rhs.m_display; - m_view = rhs.m_view; - m_shapersize = rhs.m_shapersize; - m_cubesize = rhs.m_cubesize; + m_inputSpace = rhs.m_inputSpace; + m_shaperSpace = rhs.m_shaperSpace; + m_looks = rhs.m_looks; + m_targetSpace = rhs.m_targetSpace; + m_display = rhs.m_display; + m_view = rhs.m_view; + m_shapersize = rhs.m_shapersize; + m_cubesize = rhs.m_cubesize; } return *this; } }; Baker::Baker() -: m_impl(new Baker::Impl) + : m_impl(new Baker::Impl) { } @@ -86,7 +81,7 @@ Baker::~Baker() BakerRcPtr Baker::createEditableCopy() const { BakerRcPtr oven = Baker::Create(); - *oven->m_impl = *m_impl; + *oven->m_impl = *m_impl; return oven; } @@ -211,7 +206,7 @@ void Baker::setDisplayView(const char * display, const char * view) } getImpl()->m_display = display; - getImpl()->m_view = view; + getImpl()->m_view = view; } void Baker::setShaperSize(int shapersize) @@ -236,9 +231,9 @@ int Baker::getCubeSize() const void Baker::bake(std::ostream & os) const { - FileFormat* fmt = FormatRegistry::GetInstance().getFileFormatByName(getImpl()->m_formatName); + FileFormat * fmt = FormatRegistry::GetInstance().getFileFormatByName(getImpl()->m_formatName); - if(!fmt) + if (!fmt) { std::ostringstream err; err << "The format named '" << getImpl()->m_formatName; @@ -250,58 +245,57 @@ void Baker::bake(std::ostream & os) const fmt->getFormatInfo(fmtInfoVec); FormatInfo fmtInfo = fmtInfoVec[0]; - const std::string & inputSpace = getImpl()->m_inputSpace; + const std::string & inputSpace = getImpl()->m_inputSpace; const std::string & targetSpace = getImpl()->m_targetSpace; const std::string & shaperSpace = getImpl()->m_shaperSpace; - const std::string & display = getImpl()->m_display; - const std::string & view = getImpl()->m_view; + const std::string & display = getImpl()->m_display; + const std::string & view = getImpl()->m_view; const bool displayViewMode = !display.empty() && !view.empty(); - const bool colorSpaceMode = !targetSpace.empty(); + const bool colorSpaceMode = !targetSpace.empty(); // Settings validation. - if(!getConfig()) + if (!getConfig()) { throw Exception("No OCIO config has been set."); } - if(inputSpace.empty()) + if (inputSpace.empty()) { throw Exception("No input space has been set."); } - if(!displayViewMode && !colorSpaceMode) + if (!displayViewMode && !colorSpaceMode) { throw Exception("No display / view or target colorspace has been set."); } - if(displayViewMode && colorSpaceMode) + if (displayViewMode && colorSpaceMode) { throw Exception("Cannot use both display / view and target colorspace."); } - if(!getConfig()->getColorSpace(inputSpace.c_str())) + if (!getConfig()->getColorSpace(inputSpace.c_str())) { std::ostringstream os; os << "Could not find input colorspace '" << inputSpace << "'."; throw Exception(os.str().c_str()); } - if(colorSpaceMode && !getConfig()->getColorSpace(targetSpace.c_str())) + if (colorSpaceMode && !getConfig()->getColorSpace(targetSpace.c_str())) { std::ostringstream os; os << "Could not find target colorspace '" << targetSpace << "'."; throw Exception(os.str().c_str()); } - if(displayViewMode) + if (displayViewMode) { bool foundDisplay = false; - bool foundView = false; + bool foundView = false; // Make sure we also search through inactive views. - auto hasViewByType = [this](ViewType type, const char * display, const char * view) - { + auto hasViewByType = [this](ViewType type, const char * display, const char * view) { for (int i = 0; i < getConfig()->getNumViews(type, display); ++i) { if (std::string(getConfig()->getView(type, display, i)) == std::string(view)) @@ -343,7 +337,7 @@ void Baker::bake(std::ostream & os) const } const bool bake_1D = fmtInfo.bake_capabilities == FORMAT_BAKE_CAPABILITY_1DLUT; - if(bake_1D && GetInputToTargetProcessor(*this)->hasChannelCrosstalk()) + if (bake_1D && GetInputToTargetProcessor(*this)->hasChannelCrosstalk()) { std::ostringstream os; os << "The format '" << getImpl()->m_formatName << "' does not support"; @@ -351,22 +345,21 @@ void Baker::bake(std::ostream & os) const throw Exception(os.str().c_str()); } - if(getCubeSize() != -1 && getCubeSize() < 2) + if (getCubeSize() != -1 && getCubeSize() < 2) { throw Exception("Cube size must be at least 2 if set."); } - const bool supportShaper = - fmtInfo.bake_capabilities & FORMAT_BAKE_CAPABILITY_1D_3D_LUT || - fmtInfo.bake_capabilities & FORMAT_BAKE_CAPABILITY_1DLUT; - if(!shaperSpace.empty() && !supportShaper) + const bool supportShaper = fmtInfo.bake_capabilities & FORMAT_BAKE_CAPABILITY_1D_3D_LUT + || fmtInfo.bake_capabilities & FORMAT_BAKE_CAPABILITY_1DLUT; + if (!shaperSpace.empty() && !supportShaper) { std::ostringstream os; os << "The format '" << getImpl()->m_formatName << "' does not support shaper space."; throw Exception(os.str().c_str()); } - if(!shaperSpace.empty() && getShaperSize() != -1 && getShaperSize() < 2) + if (!shaperSpace.empty() && getShaperSize() != -1 && getShaperSize() < 2) { std::ostringstream os; os << "A shaper space '" << getShaperSpace() << "' has"; @@ -374,12 +367,12 @@ void Baker::bake(std::ostream & os) const throw Exception(os.str().c_str()); } - if(!shaperSpace.empty()) + if (!shaperSpace.empty()) { ConstCPUProcessorRcPtr inputToShaper = GetInputToShaperProcessor(*this); ConstCPUProcessorRcPtr shaperToInput = GetShaperToInputProcessor(*this); - if(inputToShaper->hasChannelCrosstalk() || shaperToInput->hasChannelCrosstalk()) + if (inputToShaper->hasChannelCrosstalk() || shaperToInput->hasChannelCrosstalk()) { std::ostringstream os; os << "The specified shaper space, '" << getShaperSpace(); @@ -394,7 +387,7 @@ void Baker::bake(std::ostream & os) const { fmt->bake(*this, getImpl()->m_formatName, os); } - catch(std::exception & e) + catch (std::exception & e) { std::ostringstream err; err << "Error baking " << getImpl()->m_formatName << ":"; @@ -402,9 +395,9 @@ void Baker::bake(std::ostream & os) const throw Exception(err.str().c_str()); } - // + // // TODO: - // + // // - check limits of shaper and target, throw exception if we can't // write that much data in x format // - add some checks to make sure we are monotonic diff --git a/src/OpenColorIO/BakingUtils.cpp b/src/OpenColorIO/BakingUtils.cpp index 0929fa10c5..ea5db293d6 100644 --- a/src/OpenColorIO/BakingUtils.cpp +++ b/src/OpenColorIO/BakingUtils.cpp @@ -8,82 +8,76 @@ namespace OCIO_NAMESPACE namespace { - GroupTransformRcPtr GetInputToTargetTransform(const Baker & baker) - { - const std::string input = baker.getInputSpace(); - const std::string looks = baker.getLooks(); - const std::string display = baker.getDisplay(); - const std::string view = baker.getView(); +GroupTransformRcPtr GetInputToTargetTransform(const Baker & baker) +{ + const std::string input = baker.getInputSpace(); + const std::string looks = baker.getLooks(); + const std::string display = baker.getDisplay(); + const std::string view = baker.getView(); - GroupTransformRcPtr group = GroupTransform::Create(); + GroupTransformRcPtr group = GroupTransform::Create(); - if (!display.empty() && !view.empty()) - { - if (!looks.empty()) - { - LookTransformRcPtr look = LookTransform::Create(); - look->setLooks(looks.c_str()); - look->setSrc(input.c_str()); - look->setDst(input.c_str()); - - group->appendTransform(look); - } - - DisplayViewTransformRcPtr disp = DisplayViewTransform::Create(); - disp->setSrc(input.c_str()); - disp->setDisplay(display.c_str()); - disp->setView(view.c_str()); - disp->setLooksBypass(!looks.empty()); - - group->appendTransform(disp); - } - else + if (!display.empty() && !view.empty()) + { + if (!looks.empty()) { LookTransformRcPtr look = LookTransform::Create(); - look->setLooks(!looks.empty() ? looks.c_str() : ""); + look->setLooks(looks.c_str()); look->setSrc(input.c_str()); - look->setDst(baker.getTargetSpace()); + look->setDst(input.c_str()); group->appendTransform(look); } - return group; + DisplayViewTransformRcPtr disp = DisplayViewTransform::Create(); + disp->setSrc(input.c_str()); + disp->setDisplay(display.c_str()); + disp->setView(view.c_str()); + disp->setLooksBypass(!looks.empty()); + + group->appendTransform(disp); } - - void GetSrcRange(const Baker & baker, - const char * src, - float & start, - float & end) + else { - // Calculate min/max value - ConstProcessorRcPtr proc = baker.getConfig()->getProcessor( - src, baker.getInputSpace()); - ConstCPUProcessorRcPtr cpu = proc->getOptimizedCPUProcessor( - OPTIMIZATION_LOSSLESS); + LookTransformRcPtr look = LookTransform::Create(); + look->setLooks(!looks.empty() ? looks.c_str() : ""); + look->setSrc(input.c_str()); + look->setDst(baker.getTargetSpace()); + + group->appendTransform(look); + } - float minval[3] = {0.0f, 0.0f, 0.0f}; - float maxval[3] = {1.0f, 1.0f, 1.0f}; + return group; +} - cpu->applyRGB(minval); - cpu->applyRGB(maxval); +void GetSrcRange(const Baker & baker, const char * src, float & start, float & end) +{ + // Calculate min/max value + ConstProcessorRcPtr proc = baker.getConfig()->getProcessor(src, baker.getInputSpace()); + ConstCPUProcessorRcPtr cpu = proc->getOptimizedCPUProcessor(OPTIMIZATION_LOSSLESS); - start = std::min(std::min(minval[0], minval[1]), minval[2]); - end = std::max(std::max(maxval[0], maxval[1]), maxval[2]); - } -} // Anonymous namespace + float minval[3] = {0.0f, 0.0f, 0.0f}; + float maxval[3] = {1.0f, 1.0f, 1.0f}; + cpu->applyRGB(minval); + cpu->applyRGB(maxval); + + start = std::min(std::min(minval[0], minval[1]), minval[2]); + end = std::max(std::max(maxval[0], maxval[1]), maxval[2]); +} +} // Anonymous namespace ConstCPUProcessorRcPtr GetInputToShaperProcessor(const Baker & baker) { - ConstProcessorRcPtr processor = baker.getConfig()->getProcessor( - baker.getInputSpace(), baker.getShaperSpace()); + ConstProcessorRcPtr processor + = baker.getConfig()->getProcessor(baker.getInputSpace(), baker.getShaperSpace()); return processor->getOptimizedCPUProcessor(OPTIMIZATION_LOSSLESS); } ConstCPUProcessorRcPtr GetShaperToInputProcessor(const Baker & baker) { - ConstProcessorRcPtr processor = baker.getConfig()->getProcessor( - baker.getShaperSpace(), baker.getInputSpace()); + ConstProcessorRcPtr processor + = baker.getConfig()->getProcessor(baker.getShaperSpace(), baker.getInputSpace()); return processor->getOptimizedCPUProcessor(OPTIMIZATION_LOSSLESS); } @@ -92,8 +86,8 @@ ConstCPUProcessorRcPtr GetInputToTargetProcessor(const Baker & baker) if (baker.getInputSpace() && *baker.getInputSpace()) { ConstProcessorRcPtr processor = baker.getConfig()->getProcessor( - GetInputToTargetTransform(baker), TRANSFORM_DIR_FORWARD - ); + GetInputToTargetTransform(baker), + TRANSFORM_DIR_FORWARD); return processor->getOptimizedCPUProcessor(OPTIMIZATION_LOSSLESS); } @@ -111,21 +105,20 @@ ConstCPUProcessorRcPtr GetShaperToTargetProcessor(const Baker & baker) GroupTransformRcPtr group = GetInputToTargetTransform(baker); group->prependTransform(csc); - ConstProcessorRcPtr processor = baker.getConfig()->getProcessor( - group, TRANSFORM_DIR_FORWARD - ); + ConstProcessorRcPtr processor + = baker.getConfig()->getProcessor(group, TRANSFORM_DIR_FORWARD); return processor->getOptimizedCPUProcessor(OPTIMIZATION_LOSSLESS); } throw Exception("Shaper space is empty."); } -void GetShaperRange(const Baker & baker, float& start, float& end) +void GetShaperRange(const Baker & baker, float & start, float & end) { return GetSrcRange(baker, baker.getShaperSpace(), start, end); } -void GetTargetRange(const Baker & baker, float& start, float& end) +void GetTargetRange(const Baker & baker, float & start, float & end) { return GetSrcRange(baker, baker.getTargetSpace(), start, end); } diff --git a/src/OpenColorIO/BakingUtils.h b/src/OpenColorIO/BakingUtils.h index 5dc2641214..6c7ee8432b 100644 --- a/src/OpenColorIO/BakingUtils.h +++ b/src/OpenColorIO/BakingUtils.h @@ -1,13 +1,11 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_BAKING_UTILS_H #define INCLUDED_OCIO_BAKING_UTILS_H #include - namespace OCIO_NAMESPACE { @@ -19,10 +17,9 @@ ConstCPUProcessorRcPtr GetInputToTargetProcessor(const Baker & baker); ConstCPUProcessorRcPtr GetShaperToTargetProcessor(const Baker & baker); -void GetShaperRange(const Baker & baker, float& start, float& end); - -void GetTargetRange(const Baker & baker, float& start, float& end); +void GetShaperRange(const Baker & baker, float & start, float & end); +void GetTargetRange(const Baker & baker, float & start, float & end); } // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/BitDepthUtils.cpp b/src/OpenColorIO/BitDepthUtils.cpp index 7c503fa9a8..88357c92d9 100644 --- a/src/OpenColorIO/BitDepthUtils.cpp +++ b/src/OpenColorIO/BitDepthUtils.cpp @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #include #include "BitDepthUtils.h" @@ -17,7 +16,7 @@ namespace OCIO_NAMESPACE { double GetBitDepthMaxValue(BitDepth in) { - switch(in) + switch (in) { case BIT_DEPTH_UINT8: return (double)BitDepthInfo::maxValue; @@ -48,13 +47,12 @@ double GetBitDepthMaxValue(BitDepth in) namespace { -template -constexpr unsigned MiddleMaxValue() +template constexpr unsigned MiddleMaxValue() { return (BitDepthInfo::maxValue + BitDepthInfo::maxValue) / 2; } -} +} // namespace // For formats that do not explicitly identify the intended bit-depth scaling, // we must infer it based on the LUT values. However LUTs sometimes contain @@ -86,10 +84,9 @@ BitDepth GetBitdepthFromMaxValue(unsigned maxValue) return BIT_DEPTH_UINT16; } - bool IsFloatBitDepth(BitDepth in) { - switch(in) + switch (in) { case BIT_DEPTH_UINT8: return BitDepthInfo::isFloat; @@ -117,10 +114,9 @@ bool IsFloatBitDepth(BitDepth in) } } - unsigned GetChannelSizeInBytes(BitDepth in) { - switch(in) + switch (in) { case BIT_DEPTH_UINT8: return sizeof(BitDepthInfo::Type); @@ -148,4 +144,3 @@ unsigned GetChannelSizeInBytes(BitDepth in) } } // namespace OCIO_NAMESPACE - diff --git a/src/OpenColorIO/BitDepthUtils.h b/src/OpenColorIO/BitDepthUtils.h index b05d3cb5a3..47bcc6c46b 100644 --- a/src/OpenColorIO/BitDepthUtils.h +++ b/src/OpenColorIO/BitDepthUtils.h @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_BIT_DEPTH_UTILS_H #define INCLUDED_OCIO_BIT_DEPTH_UTILS_H @@ -9,7 +8,6 @@ #include - namespace OCIO_NAMESPACE { @@ -28,48 +26,49 @@ unsigned GetChannelSizeInBytes(BitDepth in); // some bit depth information at compile time. // Incomplete structure to have a compile time build break for unsupported bit depths. -template -struct BitDepthInfo {}; +template struct BitDepthInfo +{ +}; -template<> struct BitDepthInfo +template <> struct BitDepthInfo { typedef uint8_t Type; - static const bool isFloat = false; + static const bool isFloat = false; static const unsigned maxValue = 255; }; -template<> struct BitDepthInfo +template <> struct BitDepthInfo { typedef uint16_t Type; - static const bool isFloat = false; + static const bool isFloat = false; static const unsigned maxValue = 1023; }; -template<> struct BitDepthInfo +template <> struct BitDepthInfo { typedef uint16_t Type; - static const bool isFloat = false; + static const bool isFloat = false; static const unsigned maxValue = 4095; }; -template<> struct BitDepthInfo +template <> struct BitDepthInfo { typedef uint16_t Type; - static const bool isFloat = false; + static const bool isFloat = false; static const unsigned maxValue = 65535; }; -template<> struct BitDepthInfo +template <> struct BitDepthInfo { typedef half Type; - static const bool isFloat = true; + static const bool isFloat = true; static const unsigned maxValue = 1; }; -template<> struct BitDepthInfo +template <> struct BitDepthInfo { typedef float Type; - static const bool isFloat = true; + static const bool isFloat = true; static const unsigned maxValue = 1; }; @@ -77,18 +76,17 @@ template<> struct BitDepthInfo BitDepth GetBitdepthFromMaxValue(unsigned maxValue); // Clamp helper method. -#define CLAMP(a, min, max) \ - ((a)>(max) ? (max) : ((min)>(a) ? (min) : (a))) - +#define CLAMP(a, min, max) ((a) > (max) ? (max) : ((min) > (a) ? (min) : (a))) // Converting from float to any integer type require to first correctly round // the float value before casting. // Incomplete structure to have a compile time build break for unsupported bit depths. -template struct Converter { }; +template struct Converter +{ +}; -template<> -struct Converter +template <> struct Converter { typedef typename BitDepthInfo::Type Type; @@ -100,8 +98,7 @@ struct Converter } }; -template<> -struct Converter +template <> struct Converter { typedef typename BitDepthInfo::Type Type; @@ -113,8 +110,7 @@ struct Converter } }; -template<> -struct Converter +template <> struct Converter { typedef typename BitDepthInfo::Type Type; @@ -126,8 +122,7 @@ struct Converter } }; -template<> -struct Converter +template <> struct Converter { typedef typename BitDepthInfo::Type Type; @@ -139,29 +134,20 @@ struct Converter } }; -template<> -struct Converter +template <> struct Converter { typedef typename BitDepthInfo::Type Type; - static Type CastValue(float value) - { - return Type(value); - } + static Type CastValue(float value) { return Type(value); } }; -template<> -struct Converter +template <> struct Converter { typedef typename BitDepthInfo::Type Type; - static Type CastValue(float value) - { - return Type(value); - } + static Type CastValue(float value) { return Type(value); } }; - } // namespace OCIO_NAMESPACE #endif // INCLUDED_OCIO_BIT_DEPTH_UTILS_H diff --git a/src/OpenColorIO/CPUInfo.cpp b/src/OpenColorIO/CPUInfo.cpp index dce813a4ff..f1e27188ca 100644 --- a/src/OpenColorIO/CPUInfo.cpp +++ b/src/OpenColorIO/CPUInfo.cpp @@ -1,15 +1,14 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #include "CPUInfo.h" #include #if _WIN32 -#include #include -typedef unsigned __int32 uint32_t; -typedef __int64 int64_t; +#include +typedef unsigned __int32 uint32_t; +typedef __int64 int64_t; #else #include #endif @@ -19,13 +18,15 @@ namespace OCIO_NAMESPACE #if !defined(__aarch64__) && OCIO_ARCH_X86 // Intel-based processor or Apple Rosetta x86_64. -namespace { +namespace +{ union CPUIDResult { int i[4]; char c[16]; - struct { + struct + { uint32_t eax; uint32_t ebx; uint32_t ecx; @@ -41,29 +42,27 @@ static inline int64_t xgetbv() #else int eax = 0; int edx = 0; - __asm__ volatile (".byte 0x0f, 0x01, 0xd0" : "=a"(eax), "=d"(edx) : "c" (index)); - return (int64_t)edx << 32 | (int64_t)eax; + __asm__ volatile(".byte 0x0f, 0x01, 0xd0" : "=a"(eax), "=d"(edx) : "c"(index)); + return (int64_t)edx << 32 | (int64_t)eax; #endif } -static inline void cpuid(int index, int *data) +static inline void cpuid(int index, int * data) { #if _MSC_VER __cpuid(data, index); #elif OCIO_ARCH_X86_32 - __asm__ volatile ( - "mov %%ebx, %%esi \n\t" - "cpuid \n\t" - "xchg %%ebx, %%esi" - : "=a" (data[0]), "=S" (data[1]), "=c" (data[2]), "=d" (data[3]) - : "0" (index), "2"(0)); + __asm__ volatile("mov %%ebx, %%esi \n\t" + "cpuid \n\t" + "xchg %%ebx, %%esi" + : "=a"(data[0]), "=S"(data[1]), "=c"(data[2]), "=d"(data[3]) + : "0"(index), "2"(0)); #else - __asm__ volatile ( - "mov %%rbx, %%rsi \n\t" - "cpuid \n\t" - "xchg %%rbx, %%rsi" - : "=a" (data[0]), "=S" (data[1]), "=c" (data[2]), "=d" (data[3]) - : "0" (index), "2"(0)); + __asm__ volatile("mov %%rbx, %%rsi \n\t" + "cpuid \n\t" + "xchg %%rbx, %%rsi" + : "=a"(data[0]), "=S"(data[1]), "=c"(data[2]), "=d"(data[3]) + : "0"(index), "2"(0)); #endif } @@ -110,10 +109,12 @@ CPUInfo::CPUInfo() if ((info.reg.ecx & 0x18000000) == 0x18000000) { xcr = xgetbv(); - if((xcr & 0x6) == 0x6) { + if ((xcr & 0x6) == 0x6) + { flags |= X86_CPU_FLAG_AVX; - if(info.reg.ecx & 0x20000000) { + if (info.reg.ecx & 0x20000000) + { flags |= X86_CPU_FLAG_F16C; } } @@ -128,7 +129,8 @@ CPUInfo::CPUInfo() flags |= X86_CPU_FLAG_AVX2; /* OPMASK/ZMM state */ - if ((xcr & 0xe0) == 0xe0) { + if ((xcr & 0xe0) == 0xe0) + { if ((flags & X86_CPU_FLAG_AVX2) && ((info.reg.ebx & 0xd0030000) == 0xd0030000)) flags |= X86_CPU_FLAG_AVX512; } @@ -140,7 +142,8 @@ CPUInfo::CPUInfo() if (max_ext_level >= 0x80000001) { cpuid(0x80000001, info.i); - if (!strncmp(vendor, "AuthenticAMD", 12)) { + if (!strncmp(vendor, "AuthenticAMD", 12)) + { /* Athlon64, some Opteron, and some Sempron processors */ if (flags & X86_CPU_FLAG_SSE2 && !(info.reg.ecx & 0x00000040)) @@ -168,7 +171,8 @@ CPUInfo::CPUInfo() } /* Conroe has a slow shuffle unit */ - if ((flags & X86_CPU_FLAG_SSSE3) && !(flags & X86_CPU_FLAG_SSE4) && family == 6 && model < 23) + if ((flags & X86_CPU_FLAG_SSSE3) && !(flags & X86_CPU_FLAG_SSE4) && family == 6 + && model < 23) flags |= X86_CPU_FLAG_SSSE3_SLOW; /* Haswell has slow gather */ @@ -177,9 +181,9 @@ CPUInfo::CPUInfo() } // get cpu brand string - for(int index = 0; index < 3; index++) + for (int index = 0; index < 3; index++) { - cpuid(0x80000002 + index, (int *)(name + 16*index)); + cpuid(0x80000002 + index, (int *)(name + 16 * index)); } } @@ -194,7 +198,7 @@ CPUInfo::CPUInfo() snprintf(name, sizeof(name), "%s", "ARM"); #if __APPLE__ snprintf(vendor, sizeof(vendor), "%s", "Apple"); -# else +#else snprintf(vendor, sizeof(vendor), "%s", "ARM"); #endif @@ -223,7 +227,7 @@ CPUInfo::CPUInfo() // Unknown Processor #endif -CPUInfo& CPUInfo::instance() +CPUInfo & CPUInfo::instance() { static CPUInfo singleton = CPUInfo(); return singleton; diff --git a/src/OpenColorIO/CPUInfo.h b/src/OpenColorIO/CPUInfo.h index 80e9792e01..e47dfed009 100644 --- a/src/OpenColorIO/CPUInfo.h +++ b/src/OpenColorIO/CPUInfo.h @@ -1,40 +1,44 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef CPUInfo_H #define CPUInfo_H -#include #include "CPUInfoConfig.h" +#include namespace OCIO_NAMESPACE { -#define X86_CPU_FLAG_SSE2 (1 << 0) // SSE2 functions -#define X86_CPU_FLAG_SSE2_SLOW (1 << 1) // SSE2 supported, but usually not faster than regular MMX/SSE (e.g. Core1) +#define X86_CPU_FLAG_SSE2 (1 << 0) // SSE2 functions +#define X86_CPU_FLAG_SSE2_SLOW \ + (1 << 1) // SSE2 supported, but usually not faster than regular MMX/SSE (e.g. Core1) -#define X86_CPU_FLAG_SSE3 (1 << 2) // Prescott SSE3 functions -#define X86_CPU_FLAG_SSE3_SLOW (1 << 3) // SSE3 supported, but usually not faster than regular MMX/SSE (e.g. Core1) +#define X86_CPU_FLAG_SSE3 (1 << 2) // Prescott SSE3 functions +#define X86_CPU_FLAG_SSE3_SLOW \ + (1 << 3) // SSE3 supported, but usually not faster than regular MMX/SSE (e.g. Core1) -#define X86_CPU_FLAG_SSSE3 (1 << 4) // Conroe SSSE3 functions -#define X86_CPU_FLAG_SSSE3_SLOW (1 << 5) // SSSE3 supported, but usually not faster than SSE2 +#define X86_CPU_FLAG_SSSE3 (1 << 4) // Conroe SSSE3 functions +#define X86_CPU_FLAG_SSSE3_SLOW (1 << 5) // SSSE3 supported, but usually not faster than SSE2 -#define X86_CPU_FLAG_SSE4 (1 << 6) // Penryn SSE4.1 functions -#define X86_CPU_FLAG_SSE42 (1 << 7) // Nehalem SSE4.2 functions +#define X86_CPU_FLAG_SSE4 (1 << 6) // Penryn SSE4.1 functions +#define X86_CPU_FLAG_SSE42 (1 << 7) // Nehalem SSE4.2 functions -#define X86_CPU_FLAG_AVX (1 << 8) // AVX functions: requires OS support even if YMM registers aren't used -#define X86_CPU_FLAG_AVX_SLOW (1 << 9) // AVX supported, but slow when using YMM registers (e.g. Bulldozer) +#define X86_CPU_FLAG_AVX \ + (1 << 8) // AVX functions: requires OS support even if YMM registers aren't used +#define X86_CPU_FLAG_AVX_SLOW \ + (1 << 9) // AVX supported, but slow when using YMM registers (e.g. Bulldozer) -#define X86_CPU_FLAG_AVX2 (1 << 10) // AVX2 functions: requires OS support even if YMM registers aren't used +#define X86_CPU_FLAG_AVX2 \ + (1 << 10) // AVX2 functions: requires OS support even if YMM registers aren't used #define X86_CPU_FLAG_AVX2_SLOWGATHER (1 << 11) // CPU has slow gathers. -#define X86_CPU_FLAG_AVX512 (1 << 12) // AVX-512 functions: requires OS support even if YMM/ZMM registers aren't used +#define X86_CPU_FLAG_AVX512 \ + (1 << 12) // AVX-512 functions: requires OS support even if YMM/ZMM registers aren't used -#define X86_CPU_FLAG_F16C (1 << 13) // CPU Has FP16C half float, AVX2 should always have this?? +#define X86_CPU_FLAG_F16C (1 << 13) // CPU Has FP16C half float, AVX2 should always have this?? -#define x86_check_flags(cpuext) \ - (OCIO_USE_ ## cpuext && ((flags) & X86_CPU_FLAG_ ## cpuext)) +#define x86_check_flags(cpuext) (OCIO_USE_##cpuext && ((flags) & X86_CPU_FLAG_##cpuext)) struct CPUInfo { @@ -46,10 +50,10 @@ struct CPUInfo CPUInfo(); - static CPUInfo& instance(); + static CPUInfo & instance(); - const char *getName() const { return name;} - const char *getVendor() const { return vendor; } + const char * getName() const { return name; } + const char * getVendor() const { return vendor; } bool hasSSE2() const { return x86_check_flags(SSE2); } bool SSE2Slow() const { return (OCIO_USE_SSE2 && (flags & X86_CPU_FLAG_SSE2_SLOW)); } @@ -67,12 +71,14 @@ struct CPUInfo bool AVXSlow() const { return (OCIO_USE_AVX && (flags & X86_CPU_FLAG_AVX_SLOW)); } bool hasAVX2() const { return x86_check_flags(AVX2); } - bool AVX2SlowGather() const { return (OCIO_USE_AVX2 && (flags & X86_CPU_FLAG_AVX2_SLOWGATHER)); } + bool AVX2SlowGather() const + { + return (OCIO_USE_AVX2 && (flags & X86_CPU_FLAG_AVX2_SLOWGATHER)); + } bool hasAVX512() const { return x86_check_flags(AVX512); } bool hasF16C() const { return x86_check_flags(F16C); } - }; #undef x86_check_flags diff --git a/src/OpenColorIO/CPUProcessor.cpp b/src/OpenColorIO/CPUProcessor.cpp index 033083aed3..0fafcd05f3 100644 --- a/src/OpenColorIO/CPUProcessor.cpp +++ b/src/OpenColorIO/CPUProcessor.cpp @@ -7,60 +7,57 @@ #include "BitDepthUtils.h" #include "CPUProcessor.h" +#include "ScanlineHelper.h" #include "ops/lut1d/Lut1DOpCPU.h" #include "ops/lut3d/Lut3DOpCPU.h" #include "ops/matrix/MatrixOp.h" #include "ops/range/RangeOpCPU.h" -#include "ScanlineHelper.h" - namespace OCIO_NAMESPACE { -template -class BitDepthCast : public OpCPU +template class BitDepthCast : public OpCPU { typedef typename BitDepthInfo::Type InType; typedef typename BitDepthInfo::Type OutType; public: BitDepthCast() = default; - ~BitDepthCast() override {}; + ~BitDepthCast() override{}; void apply(const void * inImg, void * outImg, long numPixels) const override { - const InType * in = reinterpret_cast(inImg); - OutType * out = reinterpret_cast(outImg); + const InType * in = reinterpret_cast(inImg); + OutType * out = reinterpret_cast(outImg); - for(long pxl=0; pxl::CastValue(in[0] * m_scale); out[1] = Converter::CastValue(in[1] * m_scale); out[2] = Converter::CastValue(in[2] * m_scale); out[3] = Converter::CastValue(in[3] * m_scale); - in += 4; + in += 4; out += 4; } } protected: - const float m_scale = float(BitDepthInfo::maxValue) - / float(BitDepthInfo::maxValue); + const float m_scale + = float(BitDepthInfo::maxValue) / float(BitDepthInfo::maxValue); }; -template<> -class BitDepthCast : public OpCPU +template <> class BitDepthCast : public OpCPU { public: BitDepthCast() = default; - ~BitDepthCast() override {}; + ~BitDepthCast() override{}; void apply(const void * inImg, void * outImg, long numPixels) const override { - if(inImg!=outImg) + if (inImg != outImg) { - memcpy(outImg, inImg, 4*numPixels*sizeof(float)); + memcpy(outImg, inImg, 4 * numPixels * sizeof(float)); } } }; @@ -68,37 +65,35 @@ class BitDepthCast : public OpCPU ConstOpCPURcPtr CreateGenericBitDepthHelper(BitDepth in, BitDepth out) { -#define ADD_OUT_BIT_DEPTH(in, out) \ -case out: \ -{ \ - return std::make_shared>(); \ - break; \ -} - -#define ADD_IN_BIT_DEPTH(in) \ -case in: \ -{ \ - switch(out) \ - { \ - ADD_OUT_BIT_DEPTH(in, BIT_DEPTH_UINT8) \ - ADD_OUT_BIT_DEPTH(in, BIT_DEPTH_UINT10) \ - ADD_OUT_BIT_DEPTH(in, BIT_DEPTH_UINT12) \ - ADD_OUT_BIT_DEPTH(in, BIT_DEPTH_UINT16) \ - ADD_OUT_BIT_DEPTH(in, BIT_DEPTH_F16) \ - ADD_OUT_BIT_DEPTH(in, BIT_DEPTH_F32) \ - case BIT_DEPTH_UINT14: \ - case BIT_DEPTH_UINT32: \ - case BIT_DEPTH_UNKNOWN: \ - default: \ - throw Exception("Unsupported bit-depth"); \ - break; \ - \ - } \ - break; \ -} +#define ADD_OUT_BIT_DEPTH(in, out) \ + case out: \ + { \ + return std::make_shared>(); \ + break; \ + } +#define ADD_IN_BIT_DEPTH(in) \ + case in: \ + { \ + switch (out) \ + { \ + ADD_OUT_BIT_DEPTH(in, BIT_DEPTH_UINT8) \ + ADD_OUT_BIT_DEPTH(in, BIT_DEPTH_UINT10) \ + ADD_OUT_BIT_DEPTH(in, BIT_DEPTH_UINT12) \ + ADD_OUT_BIT_DEPTH(in, BIT_DEPTH_UINT16) \ + ADD_OUT_BIT_DEPTH(in, BIT_DEPTH_F16) \ + ADD_OUT_BIT_DEPTH(in, BIT_DEPTH_F32) \ + case BIT_DEPTH_UINT14: \ + case BIT_DEPTH_UINT32: \ + case BIT_DEPTH_UNKNOWN: \ + default: \ + throw Exception("Unsupported bit-depth"); \ + break; \ + } \ + break; \ + } - switch(in) + switch (in) { ADD_IN_BIT_DEPTH(BIT_DEPTH_UINT8) ADD_IN_BIT_DEPTH(BIT_DEPTH_UINT10) @@ -119,32 +114,33 @@ case in: \ throw Exception("Unsupported bit-depths"); } -void CreateCPUEngine(const OpRcPtrVec & ops, - BitDepth in, - BitDepth out, - OptimizationFlags oFlags, - // The bit-depth 'cast' or the first CPU Op. - ConstOpCPURcPtr & inBitDepthOp, - // The remaining CPU Ops. - ConstOpCPURcPtrVec & cpuOps, - // The bit-depth 'cast' or the last CPU Op. - ConstOpCPURcPtr & outBitDepthOp) +void CreateCPUEngine( + const OpRcPtrVec & ops, + BitDepth in, + BitDepth out, + OptimizationFlags oFlags, + // The bit-depth 'cast' or the first CPU Op. + ConstOpCPURcPtr & inBitDepthOp, + // The remaining CPU Ops. + ConstOpCPURcPtrVec & cpuOps, + // The bit-depth 'cast' or the last CPU Op. + ConstOpCPURcPtr & outBitDepthOp) { - const size_t maxOps = ops.size(); + const size_t maxOps = ops.size(); const bool fastLogExpPow = HasFlag(oFlags, OPTIMIZATION_FAST_LOG_EXP_POW); - for(size_t idx=0; idxdata(); - if(idx==0) + if (idx == 0) { - if(opData->getType()==OpData::Lut1DType) + if (opData->getType() == OpData::Lut1DType) { ConstLut1DOpDataRcPtr lut = DynamicPtrCast(opData); - inBitDepthOp = GetLut1DRenderer(lut, in, BIT_DEPTH_F32); + inBitDepthOp = GetLut1DRenderer(lut, in, BIT_DEPTH_F32); } - else if(in==BIT_DEPTH_F32) + else if (in == BIT_DEPTH_F32) { inBitDepthOp = op->getCPUOp(fastLogExpPow); } @@ -154,19 +150,19 @@ void CreateCPUEngine(const OpRcPtrVec & ops, cpuOps.push_back(op->getCPUOp(fastLogExpPow)); } - if(maxOps==1) + if (maxOps == 1) { outBitDepthOp = CreateGenericBitDepthHelper(BIT_DEPTH_F32, out); } } - else if(idx==(maxOps-1)) + else if (idx == (maxOps - 1)) { - if(opData->getType()==OpData::Lut1DType) + if (opData->getType() == OpData::Lut1DType) { ConstLut1DOpDataRcPtr lut = DynamicPtrCast(opData); - outBitDepthOp = GetLut1DRenderer(lut, BIT_DEPTH_F32, out); + outBitDepthOp = GetLut1DRenderer(lut, BIT_DEPTH_F32, out); } - else if(out==BIT_DEPTH_F32) + else if (out == BIT_DEPTH_F32) { outBitDepthOp = op->getCPUOp(fastLogExpPow); } @@ -183,42 +179,45 @@ void CreateCPUEngine(const OpRcPtrVec & ops, } } - -ScanlineHelper * CreateScanlineHelper(BitDepth in, const ConstOpCPURcPtr & inBitDepthOp, - BitDepth out, const ConstOpCPURcPtr & outBitDepthOp) +ScanlineHelper * CreateScanlineHelper( + BitDepth in, + const ConstOpCPURcPtr & inBitDepthOp, + BitDepth out, + const ConstOpCPURcPtr & outBitDepthOp) { -#define ADD_OUT_BIT_DEPTH(in, out) \ -case out: \ -{ \ - return new GenericScanlineHelper::Type, \ - BitDepthInfo::Type>(in, inBitDepthOp, \ - out, outBitDepthOp);\ - break; \ -} +#define ADD_OUT_BIT_DEPTH(in, out) \ + case out: \ + { \ + return new GenericScanlineHelper::Type, BitDepthInfo::Type>( \ + in, \ + inBitDepthOp, \ + out, \ + outBitDepthOp); \ + break; \ + } -#define ADD_IN_BIT_DEPTH(in) \ -case in: \ -{ \ - switch(out) \ - { \ - ADD_OUT_BIT_DEPTH(in, BIT_DEPTH_UINT8) \ - ADD_OUT_BIT_DEPTH(in, BIT_DEPTH_UINT10) \ - ADD_OUT_BIT_DEPTH(in, BIT_DEPTH_UINT12) \ - ADD_OUT_BIT_DEPTH(in, BIT_DEPTH_UINT16) \ - ADD_OUT_BIT_DEPTH(in, BIT_DEPTH_F16) \ - ADD_OUT_BIT_DEPTH(in, BIT_DEPTH_F32) \ - case BIT_DEPTH_UINT14: \ - case BIT_DEPTH_UINT32: \ - case BIT_DEPTH_UNKNOWN: \ - default: \ - throw Exception("Unsupported bit-depth"); \ - \ - } \ - break; \ -} +#define ADD_IN_BIT_DEPTH(in) \ + case in: \ + { \ + switch (out) \ + { \ + ADD_OUT_BIT_DEPTH(in, BIT_DEPTH_UINT8) \ + ADD_OUT_BIT_DEPTH(in, BIT_DEPTH_UINT10) \ + ADD_OUT_BIT_DEPTH(in, BIT_DEPTH_UINT12) \ + ADD_OUT_BIT_DEPTH(in, BIT_DEPTH_UINT16) \ + ADD_OUT_BIT_DEPTH(in, BIT_DEPTH_F16) \ + ADD_OUT_BIT_DEPTH(in, BIT_DEPTH_F32) \ + case BIT_DEPTH_UINT14: \ + case BIT_DEPTH_UINT32: \ + case BIT_DEPTH_UNKNOWN: \ + default: \ + throw Exception("Unsupported bit-depth"); \ + } \ + break; \ + } - switch(in) + switch (in) { ADD_IN_BIT_DEPTH(BIT_DEPTH_UINT8) ADD_IN_BIT_DEPTH(BIT_DEPTH_UINT10) @@ -308,13 +307,16 @@ DynamicPropertyRcPtr CPUProcessor::Impl::getDynamicProperty(DynamicPropertyType throw Exception("Cannot find dynamic property; not used by CPU processor."); } -void FinalizeOpsForCPU(OpRcPtrVec & ops, const OpRcPtrVec & rawOps, - BitDepth in, BitDepth out, - OptimizationFlags oFlags) +void FinalizeOpsForCPU( + OpRcPtrVec & ops, + const OpRcPtrVec & rawOps, + BitDepth in, + BitDepth out, + OptimizationFlags oFlags) { ops = rawOps; - if(!ops.empty()) + if (!ops.empty()) { // Finalize of all ops. ops.finalize(); @@ -325,7 +327,7 @@ void FinalizeOpsForCPU(OpRcPtrVec & ops, const OpRcPtrVec & rawOps, } // The previous code could change the list of ops so an explicit check to empty is still needed. - if(ops.empty()) + if (ops.empty()) { // Needs at least one op (even an identity one) as the input and output buffers could be // different. @@ -338,9 +340,11 @@ void FinalizeOpsForCPU(OpRcPtrVec & ops, const OpRcPtrVec & rawOps, } } -void CPUProcessor::Impl::finalize(const OpRcPtrVec & rawOps, - BitDepth in, BitDepth out, - OptimizationFlags oFlags) +void CPUProcessor::Impl::finalize( + const OpRcPtrVec & rawOps, + BitDepth in, + BitDepth out, + OptimizationFlags oFlags) { AutoMutex lock(m_mutex); @@ -353,7 +357,7 @@ void CPUProcessor::Impl::finalize(const OpRcPtrVec & rawOps, m_outBitDepth = out; m_isIdentity = ops.isNoOp(); - m_isNoOp = m_isIdentity && m_inBitDepth==m_outBitDepth; + m_isNoOp = m_isIdentity && m_inBitDepth == m_outBitDepth; // Does the color processing introduce crosstalk between the pixel channels? m_hasChannelCrosstalk = ops.hasChannelCrosstalk(); @@ -361,41 +365,39 @@ void CPUProcessor::Impl::finalize(const OpRcPtrVec & rawOps, // Get the CPU Ops while taking care of the input and output bit-depths. m_cpuOps.clear(); - m_inBitDepthOp = nullptr; + m_inBitDepthOp = nullptr; m_outBitDepthOp = nullptr; CreateCPUEngine(ops, in, out, oFlags, m_inBitDepthOp, m_cpuOps, m_outBitDepthOp); // Compute the cache id. std::stringstream ss; - ss << "CPU Processor: from " << BitDepthToString(in) - << " to " << BitDepthToString(out) - << " oFlags " << oFlags - << " ops: " << ops.getCacheID(); + ss << "CPU Processor: from " << BitDepthToString(in) << " to " << BitDepthToString(out) + << " oFlags " << oFlags << " ops: " << ops.getCacheID(); m_cacheID = ss.str(); } void CPUProcessor::Impl::apply(const ImageDesc & imgDesc) const -{ +{ // Get the ScanlineHelper for this thread (no significant performance impact). - std::unique_ptr - scanlineBuilder(CreateScanlineHelper(m_inBitDepth, m_inBitDepthOp, - m_outBitDepth, m_outBitDepthOp)); + std::unique_ptr scanlineBuilder( + CreateScanlineHelper(m_inBitDepth, m_inBitDepthOp, m_outBitDepth, m_outBitDepthOp)); // Prepare the processing. scanlineBuilder->init(imgDesc); float * rgbaBuffer = nullptr; - long numPixels = 0; + long numPixels = 0; - while(true) + while (true) { scanlineBuilder->prepRGBAScanline(&rgbaBuffer, numPixels); - if(numPixels == 0) break; + if (numPixels == 0) + break; const size_t numOps = m_cpuOps.size(); - for(size_t i = 0; iapply(rgbaBuffer, rgbaBuffer, numPixels); } @@ -407,23 +409,23 @@ void CPUProcessor::Impl::apply(const ImageDesc & imgDesc) const void CPUProcessor::Impl::apply(const ImageDesc & srcImgDesc, ImageDesc & dstImgDesc) const { // Get the ScanlineHelper for this thread (no significant performance impact). - std::unique_ptr - scanlineBuilder(CreateScanlineHelper(m_inBitDepth, m_inBitDepthOp, - m_outBitDepth, m_outBitDepthOp)); + std::unique_ptr scanlineBuilder( + CreateScanlineHelper(m_inBitDepth, m_inBitDepthOp, m_outBitDepth, m_outBitDepthOp)); // Prepare the processing. scanlineBuilder->init(srcImgDesc, dstImgDesc); float * rgbaBuffer = nullptr; - long numPixels = 0; + long numPixels = 0; - while(true) + while (true) { scanlineBuilder->prepRGBAScanline(&rgbaBuffer, numPixels); - if(numPixels == 0) break; + if (numPixels == 0) + break; const size_t numOps = m_cpuOps.size(); - for(size_t i = 0; iapply(rgbaBuffer, rgbaBuffer, numPixels); } @@ -439,7 +441,7 @@ void CPUProcessor::Impl::applyRGB(float * pixel) const m_inBitDepthOp->apply(v, v, 1); const size_t numOps = m_cpuOps.size(); - for(size_t i = 0; iapply(v, v, 1); } @@ -456,7 +458,7 @@ void CPUProcessor::Impl::applyRGBA(float * pixel) const m_inBitDepthOp->apply(pixel, pixel, 1); const size_t numOps = m_cpuOps.size(); - for(size_t i = 0; iapply(pixel, pixel, 1); } @@ -464,21 +466,15 @@ void CPUProcessor::Impl::applyRGBA(float * pixel) const m_outBitDepthOp->apply(pixel, pixel, 1); } - - - ////////////////////////////////////////////////////////////////////////// - - - void CPUProcessor::deleter(CPUProcessor * c) { delete c; } CPUProcessor::CPUProcessor() - : m_impl(new Impl) + : m_impl(new Impl) { } diff --git a/src/OpenColorIO/CPUProcessor.h b/src/OpenColorIO/CPUProcessor.h index d5fcb43802..2934c949fe 100644 --- a/src/OpenColorIO/CPUProcessor.h +++ b/src/OpenColorIO/CPUProcessor.h @@ -1,16 +1,13 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_CPUPROCESSOR_H #define INCLUDED_OCIO_CPUPROCESSOR_H - #include #include "Op.h" - namespace OCIO_NAMESPACE { @@ -19,16 +16,16 @@ class ScanlineHelper; class CPUProcessor::Impl { public: - Impl() = default; - Impl(const Impl &) = delete; - Impl& operator=(const Impl &) = delete; + Impl() = default; + Impl(const Impl &) = delete; + Impl & operator=(const Impl &) = delete; ~Impl() = default; // Note: The in and out bit-depths must be equal for isNoOp to be true. bool isNoOp() const noexcept { return m_isNoOp; } - // Note: Equivalent to isNoOp from the underlying Processor, + // Note: Equivalent to isNoOp from the underlying Processor, // i.e., it ignores in/out bit-depth differences. bool isIdentity() const noexcept { return m_isIdentity; } @@ -58,18 +55,18 @@ class CPUProcessor::Impl void finalize(const OpRcPtrVec & rawOps, BitDepth in, BitDepth out, OptimizationFlags oFlags); private: - ConstOpCPURcPtr m_inBitDepthOp; // Converts from in to F32. It could be done by the first op. - ConstOpCPURcPtrVec m_cpuOps; // It could be empty if the OpVec only contains a 1D LUT op - // (e.g. the 1D LUT CPUOp instance would be in the m_inBitDepthOp). - ConstOpCPURcPtr m_outBitDepthOp;// Converts from F32 to out. It could be done by the last op. - - BitDepth m_inBitDepth = BIT_DEPTH_F32; - BitDepth m_outBitDepth = BIT_DEPTH_F32; - bool m_isNoOp = false; - bool m_isIdentity = false; - bool m_hasChannelCrosstalk = true; - std::string m_cacheID; - Mutex m_mutex; + ConstOpCPURcPtr m_inBitDepthOp; // Converts from in to F32. It could be done by the first op. + ConstOpCPURcPtrVec m_cpuOps; // It could be empty if the OpVec only contains a 1D LUT op + // (e.g. the 1D LUT CPUOp instance would be in the m_inBitDepthOp). + ConstOpCPURcPtr m_outBitDepthOp; // Converts from F32 to out. It could be done by the last op. + + BitDepth m_inBitDepth = BIT_DEPTH_F32; + BitDepth m_outBitDepth = BIT_DEPTH_F32; + bool m_isNoOp = false; + bool m_isIdentity = false; + bool m_hasChannelCrosstalk = true; + std::string m_cacheID; + Mutex m_mutex; }; } // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/Caching.cpp b/src/OpenColorIO/Caching.cpp old mode 100755 new mode 100644 index 2899e7157b..ab1e17b874 --- a/src/OpenColorIO/Caching.cpp +++ b/src/OpenColorIO/Caching.cpp @@ -1,15 +1,13 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #include #include "Caching.h" -#include "transforms/CDLTransform.h" #include "PathUtils.h" +#include "transforms/CDLTransform.h" #include "transforms/FileTransform.h" - namespace OCIO_NAMESPACE { @@ -17,7 +15,6 @@ const char * OCIO_DISABLE_ALL_CACHES = "OCIO_DISABLE_ALL_CACHES"; const char * OCIO_DISABLE_PROCESSOR_CACHES = "OCIO_DISABLE_PROCESSOR_CACHES"; const char * OCIO_DISABLE_CACHE_FALLBACK = "OCIO_DISABLE_CACHE_FALLBACK"; - // TODO: Processors which the user hangs onto have local caches. // Should these be cleared? diff --git a/src/OpenColorIO/Caching.h b/src/OpenColorIO/Caching.h index 9d4c595f89..d80e6e18e0 100644 --- a/src/OpenColorIO/Caching.h +++ b/src/OpenColorIO/Caching.h @@ -1,11 +1,9 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_CACHING_H #define INCLUDED_OCIO_CACHING_H - #include #include @@ -13,30 +11,27 @@ #include "Mutex.h" #include "Platform.h" - namespace OCIO_NAMESPACE { // Generic cache mechanism where EntryType is the instance type to cache and KeyType is the // instance type of the key. Note that having efficient key generation & comparison are critical. // For example integer comparison is efficent but string one could be far less efficient depending -// of its length & where changes occur (e.g. absolute filepaths are inefficient). -template -class GenericCache +// of its length & where changes occur (e.g. absolute filepaths are inefficient). +template class GenericCache { public: - - using Entries = std::map; + using Entries = std::map; using Iterator = typename Entries::iterator; - // Forbid copy & move semantics. - GenericCache(const GenericCache &) = delete; - GenericCache(GenericCache && other) = delete; + // Forbid copy & move semantics. + GenericCache(const GenericCache &) = delete; + GenericCache(GenericCache && other) = delete; GenericCache & operator=(const GenericCache &) = delete; GenericCache & operator=(GenericCache && other) = delete; GenericCache() - : m_envDisableAllCaches(Platform::isEnvPresent(OCIO_DISABLE_ALL_CACHES)) + : m_envDisableAllCaches(Platform::isEnvPresent(OCIO_DISABLE_ALL_CACHES)) { } @@ -77,16 +72,16 @@ class GenericCache } Iterator begin() noexcept { return m_entries.begin(); } - Iterator end() noexcept { return m_entries.end(); } + Iterator end() noexcept { return m_entries.end(); } protected: explicit GenericCache(bool disableCaches) - : m_envDisableAllCaches(Platform::isEnvPresent(OCIO_DISABLE_ALL_CACHES) || disableCaches) + : m_envDisableAllCaches(Platform::isEnvPresent(OCIO_DISABLE_ALL_CACHES) || disableCaches) { } const bool m_envDisableAllCaches = false; - bool m_enabled = true; + bool m_enabled = true; private: Mutex m_mutex; @@ -96,20 +91,18 @@ class GenericCache // A Processor instance uses this class to cache its derived optimized, CPU, and GPU Processors. // These caches may be disabled using either of two environment variables. The env. variables allow // either disabling all caches (including the FileTransform cache), or just the Processor caches. -template +template class ProcessorCache : public GenericCache { public: ProcessorCache() - : GenericCache(Platform::isEnvPresent(OCIO_DISABLE_PROCESSOR_CACHES)) + : GenericCache(Platform::isEnvPresent(OCIO_DISABLE_PROCESSOR_CACHES)) { } ~ProcessorCache() = default; }; - } // namespace OCIO_NAMESPACE - #endif // INCLUDED_OCIO_CACHING_H diff --git a/src/OpenColorIO/ColorSpace.cpp b/src/OpenColorIO/ColorSpace.cpp index ef51458698..c31e6ada93 100644 --- a/src/OpenColorIO/ColorSpace.cpp +++ b/src/OpenColorIO/ColorSpace.cpp @@ -7,11 +7,10 @@ #include -#include "TokensManager.h" #include "PrivateTypes.h" +#include "TokensManager.h" #include "utils/StringUtils.h" - namespace OCIO_NAMESPACE { @@ -25,19 +24,19 @@ class ColorSpace::Impl std::string m_encoding; StringUtils::StringVec m_aliases; - BitDepth m_bitDepth{ BIT_DEPTH_UNKNOWN }; - bool m_isData{ false }; + BitDepth m_bitDepth{BIT_DEPTH_UNKNOWN}; + bool m_isData{false}; - ReferenceSpaceType m_referenceSpaceType{ REFERENCE_SPACE_SCENE }; + ReferenceSpaceType m_referenceSpaceType{REFERENCE_SPACE_SCENE}; - Allocation m_allocation{ ALLOCATION_UNIFORM }; + Allocation m_allocation{ALLOCATION_UNIFORM}; std::vector m_allocationVars; TransformRcPtr m_toRefTransform; TransformRcPtr m_fromRefTransform; - bool m_toRefSpecified{ false }; - bool m_fromRefSpecified{ false }; + bool m_toRefSpecified{false}; + bool m_fromRefSpecified{false}; TokensManager m_categories; @@ -51,40 +50,37 @@ class ColorSpace::Impl ~Impl() = default; - Impl& operator= (const Impl & rhs) + Impl & operator=(const Impl & rhs) { if (this != &rhs) { - m_name = rhs.m_name; - m_aliases = rhs.m_aliases; - m_family = rhs.m_family; - m_equalityGroup = rhs.m_equalityGroup; - m_description = rhs.m_description; - m_encoding = rhs.m_encoding; - m_bitDepth = rhs.m_bitDepth; - m_isData = rhs.m_isData; + m_name = rhs.m_name; + m_aliases = rhs.m_aliases; + m_family = rhs.m_family; + m_equalityGroup = rhs.m_equalityGroup; + m_description = rhs.m_description; + m_encoding = rhs.m_encoding; + m_bitDepth = rhs.m_bitDepth; + m_isData = rhs.m_isData; m_referenceSpaceType = rhs.m_referenceSpaceType; - m_allocation = rhs.m_allocation; - m_allocationVars = rhs.m_allocationVars; + m_allocation = rhs.m_allocation; + m_allocationVars = rhs.m_allocationVars; - m_toRefTransform = rhs.m_toRefTransform? - rhs.m_toRefTransform->createEditableCopy() - : rhs.m_toRefTransform; + m_toRefTransform = rhs.m_toRefTransform ? rhs.m_toRefTransform->createEditableCopy() + : rhs.m_toRefTransform; - m_fromRefTransform = rhs.m_fromRefTransform? - rhs.m_fromRefTransform->createEditableCopy() - : rhs.m_fromRefTransform; + m_fromRefTransform = rhs.m_fromRefTransform + ? rhs.m_fromRefTransform->createEditableCopy() + : rhs.m_fromRefTransform; - m_toRefSpecified = rhs.m_toRefSpecified; + m_toRefSpecified = rhs.m_toRefSpecified; m_fromRefSpecified = rhs.m_fromRefSpecified; - m_categories = rhs.m_categories; + m_categories = rhs.m_categories; } return *this; } - }; - /////////////////////////////////////////////////////////////////////////// ColorSpaceRcPtr ColorSpace::Create() @@ -92,7 +88,7 @@ ColorSpaceRcPtr ColorSpace::Create() return ColorSpaceRcPtr(new ColorSpace(REFERENCE_SPACE_SCENE), &deleter); } -void ColorSpace::deleter(ColorSpace* c) +void ColorSpace::deleter(ColorSpace * c) { delete c; } @@ -104,7 +100,7 @@ ColorSpaceRcPtr ColorSpace::Create(ReferenceSpaceType referenceSpace) } ColorSpace::ColorSpace(ReferenceSpaceType referenceSpace) -: m_impl(new ColorSpace::Impl(referenceSpace)) + : m_impl(new ColorSpace::Impl(referenceSpace)) { } @@ -117,7 +113,7 @@ ColorSpace::~ColorSpace() ColorSpaceRcPtr ColorSpace::createEditableCopy() const { ColorSpaceRcPtr cs = ColorSpace::Create(); - *cs->m_impl = *m_impl; + *cs->m_impl = *m_impl; return cs; } @@ -165,7 +161,7 @@ void ColorSpace::removeAlias(const char * name) noexcept { if (name && *name) { - const std::string alias{ name }; + const std::string alias{name}; StringUtils::Remove(getImpl()->m_aliases, alias); } } @@ -287,11 +283,12 @@ int ColorSpace::getAllocationNumVars() const void ColorSpace::getAllocationVars(float * vars) const { - if(!getImpl()->m_allocationVars.empty()) + if (!getImpl()->m_allocationVars.empty()) { - memcpy(vars, + memcpy( + vars, &getImpl()->m_allocationVars[0], - getImpl()->m_allocationVars.size()*sizeof(float)); + getImpl()->m_allocationVars.size() * sizeof(float)); } } @@ -299,11 +296,9 @@ void ColorSpace::setAllocationVars(int numvars, const float * vars) { getImpl()->m_allocationVars.resize(numvars); - if(!getImpl()->m_allocationVars.empty()) + if (!getImpl()->m_allocationVars.empty()) { - memcpy(&getImpl()->m_allocationVars[0], - vars, - numvars*sizeof(float)); + memcpy(&getImpl()->m_allocationVars[0], vars, numvars * sizeof(float)); } } @@ -311,32 +306,32 @@ ConstTransformRcPtr ColorSpace::getTransform(ColorSpaceDirection dir) const noex { switch (dir) { - case COLORSPACE_DIR_TO_REFERENCE: - return getImpl()->m_toRefTransform; - case COLORSPACE_DIR_FROM_REFERENCE: - return getImpl()->m_fromRefTransform; + case COLORSPACE_DIR_TO_REFERENCE: + return getImpl()->m_toRefTransform; + case COLORSPACE_DIR_FROM_REFERENCE: + return getImpl()->m_fromRefTransform; } return ConstTransformRcPtr(); } -void ColorSpace::setTransform(const ConstTransformRcPtr & transform, - ColorSpaceDirection dir) +void ColorSpace::setTransform(const ConstTransformRcPtr & transform, ColorSpaceDirection dir) { TransformRcPtr transformCopy; - if(transform) transformCopy = transform->createEditableCopy(); + if (transform) + transformCopy = transform->createEditableCopy(); switch (dir) { - case COLORSPACE_DIR_TO_REFERENCE: - getImpl()->m_toRefTransform = transformCopy; - break; - case COLORSPACE_DIR_FROM_REFERENCE: - getImpl()->m_fromRefTransform = transformCopy; - break; + case COLORSPACE_DIR_TO_REFERENCE: + getImpl()->m_toRefTransform = transformCopy; + break; + case COLORSPACE_DIR_FROM_REFERENCE: + getImpl()->m_fromRefTransform = transformCopy; + break; } } -std::ostream & operator<< (std::ostream & os, const ColorSpace & cs) +std::ostream & operator<<(std::ostream & os, const ColorSpace & cs) { const int numVars(cs.getAllocationNumVars()); std::vector vars(numVars); @@ -350,15 +345,15 @@ std::ostream & operator<< (std::ostream & os, const ColorSpace & cs) const auto refType = cs.getReferenceSpaceType(); switch (refType) { - case REFERENCE_SPACE_SCENE: - os << "scene, "; - break; - case REFERENCE_SPACE_DISPLAY: - os << "display, "; - break; + case REFERENCE_SPACE_SCENE: + os << "scene, "; + break; + case REFERENCE_SPACE_DISPLAY: + os << "display, "; + break; } os << "name=" << cs.getName() << ", "; - std::string str{ cs.getFamily() }; + std::string str{cs.getFamily()}; const auto numAliases = cs.getNumAliases(); if (numAliases == 1) { @@ -416,12 +411,12 @@ std::ostream & operator<< (std::ostream & os, const ColorSpace & cs) { os << ", description=" << str; } - if(cs.getTransform(COLORSPACE_DIR_TO_REFERENCE)) + if (cs.getTransform(COLORSPACE_DIR_TO_REFERENCE)) { os << ",\n " << cs.getName() << " --> Reference"; os << "\n " << *cs.getTransform(COLORSPACE_DIR_TO_REFERENCE); } - if(cs.getTransform(COLORSPACE_DIR_FROM_REFERENCE)) + if (cs.getTransform(COLORSPACE_DIR_FROM_REFERENCE)) { os << ",\n Reference --> " << cs.getName(); os << "\n " << *cs.getTransform(COLORSPACE_DIR_FROM_REFERENCE); @@ -430,4 +425,3 @@ std::ostream & operator<< (std::ostream & os, const ColorSpace & cs) return os; } } // namespace OCIO_NAMESPACE - diff --git a/src/OpenColorIO/ColorSpaceSet.cpp b/src/OpenColorIO/ColorSpaceSet.cpp index 99c659a61b..335f95164f 100644 --- a/src/OpenColorIO/ColorSpaceSet.cpp +++ b/src/OpenColorIO/ColorSpaceSet.cpp @@ -9,25 +9,24 @@ #include "PrivateTypes.h" #include "utils/StringUtils.h" - namespace OCIO_NAMESPACE { class ColorSpaceSet::Impl { public: - Impl() = default; + Impl() = default; ~Impl() = default; Impl(const Impl &) = delete; - Impl & operator= (const Impl & rhs) + Impl & operator=(const Impl & rhs) { if (this != &rhs) { clear(); - for (auto & cs: rhs.m_colorSpaces) + for (auto & cs : rhs.m_colorSpaces) { m_colorSpaces.push_back(cs->createEditableCopy()); } @@ -35,9 +34,10 @@ class ColorSpaceSet::Impl return *this; } - bool operator== (const Impl & rhs) const + bool operator==(const Impl & rhs) const { - if (this == &rhs) return true; + if (this == &rhs) + return true; if (m_colorSpaces.size() != rhs.m_colorSpaces.size()) { @@ -56,12 +56,9 @@ class ColorSpaceSet::Impl return true; } - int size() const - { - return static_cast(m_colorSpaces.size()); - } + int size() const { return static_cast(m_colorSpaces.size()); } - ConstColorSpaceRcPtr get(int index) const + ConstColorSpaceRcPtr get(int index) const { if (index < 0 || index >= size()) { @@ -71,7 +68,7 @@ class ColorSpaceSet::Impl return m_colorSpaces[index]; } - const char * getName(int index) const + const char * getName(int index) const { if (index < 0 || index >= size()) { @@ -81,12 +78,9 @@ class ColorSpaceSet::Impl return m_colorSpaces[index]->getName(); } - ConstColorSpaceRcPtr getByName(const char * csName) const - { - return get(getIndex(csName)); - } + ConstColorSpaceRcPtr getByName(const char * csName) const { return get(getIndex(csName)); } - int getIndex(const char * csName) const + int getIndex(const char * csName) const { // Search for name and aliases. if (csName && *csName) @@ -112,10 +106,7 @@ class ColorSpaceSet::Impl return -1; } - bool isPresent(const char * csName) const - { - return -1 != getIndex(csName); - } + bool isPresent(const char * csName) const { return -1 != getIndex(csName); } void add(const ConstColorSpaceRcPtr & cs) { @@ -125,7 +116,7 @@ class ColorSpaceSet::Impl throw Exception("Cannot add a color space with an empty name."); } - auto entryIdx = getIndex(csName); + auto entryIdx = getIndex(csName); size_t replaceIdx = (size_t)-1; if (entryIdx != -1) { @@ -148,7 +139,7 @@ class ColorSpaceSet::Impl for (size_t aidx = 0; aidx < numAliases; ++aidx) { const char * alias = cs->getAlias(aidx); - entryIdx = getIndex(alias); + entryIdx = getIndex(alias); // Is an alias of the color space already used by a color space? // Skip existing colorspace that might be replaced. if (entryIdx != -1 && static_cast(replaceIdx) != entryIdx) @@ -181,11 +172,12 @@ class ColorSpaceSet::Impl void remove(const char * csName) { const std::string name = StringUtils::Lower(csName); - if (name.empty()) return; + if (name.empty()) + return; for (auto itr = m_colorSpaces.begin(); itr != m_colorSpaces.end(); ++itr) { - if (StringUtils::Lower((*itr)->getName())==name) + if (StringUtils::Lower((*itr)->getName()) == name) { m_colorSpaces.erase(itr); return; @@ -201,17 +193,13 @@ class ColorSpaceSet::Impl } } - void clear() - { - m_colorSpaces.clear(); - } + void clear() { m_colorSpaces.clear(); } private: typedef std::vector ColorSpaceVec; ColorSpaceVec m_colorSpaces; }; - /////////////////////////////////////////////////////////////////////////// ColorSpaceSetRcPtr ColorSpaceSet::Create() @@ -219,18 +207,15 @@ ColorSpaceSetRcPtr ColorSpaceSet::Create() return ColorSpaceSetRcPtr(new ColorSpaceSet(), &deleter); } -void ColorSpaceSet::deleter(ColorSpaceSet* c) +void ColorSpaceSet::deleter(ColorSpaceSet * c) { delete c; } - /////////////////////////////////////////////////////////////////////////// - - ColorSpaceSet::ColorSpaceSet() - : m_impl(new ColorSpaceSet::Impl) + : m_impl(new ColorSpaceSet::Impl) { } @@ -243,7 +228,7 @@ ColorSpaceSet::~ColorSpaceSet() ColorSpaceSetRcPtr ColorSpaceSet::createEditableCopy() const { ColorSpaceSetRcPtr css = ColorSpaceSet::Create(); - *css->m_impl = *m_impl; // Deep Copy. + *css->m_impl = *m_impl; // Deep Copy. return css; } @@ -254,12 +239,12 @@ bool ColorSpaceSet::operator==(const ColorSpaceSet & css) const bool ColorSpaceSet::operator!=(const ColorSpaceSet & css) const { - return !( *m_impl == *css.m_impl ); + return !(*m_impl == *css.m_impl); } int ColorSpaceSet::getNumColorSpaces() const { - return m_impl->size(); + return m_impl->size(); } const char * ColorSpaceSet::getColorSpaceNameByIndex(int index) const @@ -312,16 +297,18 @@ void ColorSpaceSet::clearColorSpaces() m_impl->clear(); } -ConstColorSpaceSetRcPtr operator||(const ConstColorSpaceSetRcPtr & lcss, - const ConstColorSpaceSetRcPtr & rcss) +ConstColorSpaceSetRcPtr operator||( + const ConstColorSpaceSetRcPtr & lcss, + const ConstColorSpaceSetRcPtr & rcss) { ColorSpaceSetRcPtr css = lcss->createEditableCopy(); css->addColorSpaces(rcss); - return css; + return css; } -ConstColorSpaceSetRcPtr operator&&(const ConstColorSpaceSetRcPtr & lcss, - const ConstColorSpaceSetRcPtr & rcss) +ConstColorSpaceSetRcPtr operator&&( + const ConstColorSpaceSetRcPtr & lcss, + const ConstColorSpaceSetRcPtr & rcss) { ColorSpaceSetRcPtr css = ColorSpaceSet::Create(); @@ -337,8 +324,9 @@ ConstColorSpaceSetRcPtr operator&&(const ConstColorSpaceSetRcPtr & lcss, return css; } -ConstColorSpaceSetRcPtr operator-(const ConstColorSpaceSetRcPtr & lcss, - const ConstColorSpaceSetRcPtr & rcss) +ConstColorSpaceSetRcPtr operator-( + const ConstColorSpaceSetRcPtr & lcss, + const ConstColorSpaceSetRcPtr & rcss) { ColorSpaceSetRcPtr css = ColorSpaceSet::Create(); @@ -356,4 +344,3 @@ ConstColorSpaceSetRcPtr operator-(const ConstColorSpaceSetRcPtr & lcss, } } // namespace OCIO_NAMESPACE - diff --git a/src/OpenColorIO/Config.cpp b/src/OpenColorIO/Config.cpp index 3d2a863986..945c002e27 100644 --- a/src/OpenColorIO/Config.cpp +++ b/src/OpenColorIO/Config.cpp @@ -1,26 +1,23 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #include #include +#include +#include +#include #include #include -#include #include #include -#include -#include #include #include -#include "builtinconfigs/BuiltinConfigRegistry.h" #include "ConfigUtils.h" #include "ContextVariableUtils.h" #include "Display.h" -#include "fileformats/FileFormatICC.h" #include "FileRules.h" #include "HashUtils.h" #include "Logging.h" @@ -36,10 +33,12 @@ #include "Platform.h" #include "PrivateTypes.h" #include "Processor.h" +#include "SystemMonitor.h" +#include "ViewingRules.h" +#include "builtinconfigs/BuiltinConfigRegistry.h" +#include "fileformats/FileFormatICC.h" #include "transforms/FileTransform.h" #include "utils/StringUtils.h" -#include "ViewingRules.h" -#include "SystemMonitor.h" namespace OCIO_NAMESPACE { @@ -52,15 +51,15 @@ const char * OCIO_OPTIMIZATION_FLAGS_ENVVAR = "OCIO_OPTIMIZATION_FLAGS"; const char * OCIO_USER_CATEGORIES_ENVVAR = "OCIO_USER_CATEGORIES"; // Default filename (with extension) of a config and archived config. -const char * OCIO_CONFIG_DEFAULT_NAME = "config"; -const char * OCIO_CONFIG_DEFAULT_FILE_EXT = ".ocio"; -const char * OCIO_CONFIG_ARCHIVE_FILE_EXT = ".ocioz"; +const char * OCIO_CONFIG_DEFAULT_NAME = "config"; +const char * OCIO_CONFIG_DEFAULT_FILE_EXT = ".ocio"; +const char * OCIO_CONFIG_ARCHIVE_FILE_EXT = ".ocioz"; // A shared view using this for the color space name will use a display color space that // has the same name as the display the shared view is used by. -const char * OCIO_VIEW_USE_DISPLAY_NAME = ""; +const char * OCIO_VIEW_USE_DISPLAY_NAME = ""; -const char * OCIO_BUILTIN_URI_PREFIX = "ocio://"; +const char * OCIO_BUILTIN_URI_PREFIX = "ocio://"; namespace { @@ -70,29 +69,27 @@ constexpr double DEFAULT_LUMA_COEFF_R = 0.2126; constexpr double DEFAULT_LUMA_COEFF_G = 0.7152; constexpr double DEFAULT_LUMA_COEFF_B = 0.0722; +constexpr char INTERNAL_RAW_PROFILE[] + = "ocio_profile_version: 2\n" + "strictparsing: false\n" + "roles:\n" + " default: raw\n" + "file_rules:\n" + " - ! {name: Default, colorspace: default}\n" + "displays:\n" + " sRGB:\n" + " - ! {name: Raw, colorspace: raw}\n" + "colorspaces:\n" + " - !\n" + " name: raw\n" + " family: raw\n" + " equalitygroup:\n" + " bitdepth: 32f\n" + " isdata: true\n" + " allocation: uniform\n" + " description: 'A raw color space. Conversions to and from this space are no-ops.'\n"; -constexpr char INTERNAL_RAW_PROFILE[] = - "ocio_profile_version: 2\n" - "strictparsing: false\n" - "roles:\n" - " default: raw\n" - "file_rules:\n" - " - ! {name: Default, colorspace: default}\n" - "displays:\n" - " sRGB:\n" - " - ! {name: Raw, colorspace: raw}\n" - "colorspaces:\n" - " - !\n" - " name: raw\n" - " family: raw\n" - " equalitygroup:\n" - " bitdepth: 32f\n" - " isdata: true\n" - " allocation: uniform\n" - " description: 'A raw color space. Conversions to and from this space are no-ops.'\n"; - -} // anon. - +} // namespace /////////////////////////////////////////////////////////////////////////// @@ -110,13 +107,13 @@ namespace { ConstConfigRcPtr g_currentConfig; Mutex g_currentConfigLock; -} +} // namespace ConstConfigRcPtr GetCurrentConfig() { AutoMutex lock(g_currentConfigLock); - if(!g_currentConfig) + if (!g_currentConfig) { g_currentConfig = Config::CreateFromEnv(); } @@ -135,36 +132,37 @@ namespace { // Environment -const char* LookupEnvironment(const StringMap & env, const std::string & name) +const char * LookupEnvironment(const StringMap & env, const std::string & name) { StringMap::const_iterator iter = env.find(name); - if(iter == env.end()) return ""; + if (iter == env.end()) + return ""; return iter->second.c_str(); } // Roles // (lower case role name: colorspace name) -const char* LookupRole(const StringMap & roles, const std::string & rolename) +const char * LookupRole(const StringMap & roles, const std::string & rolename) { StringMap::const_iterator iter = roles.find(StringUtils::Lower(rolename)); - if(iter == roles.end()) return ""; + if (iter == roles.end()) + return ""; return iter->second.c_str(); } void GetFileReferences(std::set & files, const ConstTransformRcPtr & transform) { - if(!transform) return; + if (!transform) + return; - if(ConstGroupTransformRcPtr groupTransform = \ - DynamicPtrCast(transform)) + if (ConstGroupTransformRcPtr groupTransform = DynamicPtrCast(transform)) { - for(int i=0; igetNumTransforms(); ++i) + for (int i = 0; i < groupTransform->getNumTransforms(); ++i) { GetFileReferences(files, groupTransform->getTransform(i)); } } - else if(ConstFileTransformRcPtr fileTransform = \ - DynamicPtrCast(transform)) + else if (ConstFileTransformRcPtr fileTransform = DynamicPtrCast(transform)) { files.insert(fileTransform->getSrc()); } @@ -173,33 +171,35 @@ void GetFileReferences(std::set & files, const ConstTransformRcPtr // Return the list of all color spaces referenced by the transform (including all sub-transforms in // a group). All legal context variables are expanded, so if any are remaining, the caller may want // to throw. -void GetColorSpaceReferences(std::set & colorSpaceNames, - const ConstTransformRcPtr & transform, - const ConstContextRcPtr & context) +void GetColorSpaceReferences( + std::set & colorSpaceNames, + const ConstTransformRcPtr & transform, + const ConstContextRcPtr & context) { - if(!transform) return; + if (!transform) + return; - if(ConstGroupTransformRcPtr groupTransform = \ - DynamicPtrCast(transform)) + if (ConstGroupTransformRcPtr groupTransform = DynamicPtrCast(transform)) { - for(int i=0; igetNumTransforms(); ++i) + for (int i = 0; i < groupTransform->getNumTransforms(); ++i) { GetColorSpaceReferences(colorSpaceNames, groupTransform->getTransform(i), context); } } - else if(ConstColorSpaceTransformRcPtr colorSpaceTransform = \ - DynamicPtrCast(transform)) + else if ( + ConstColorSpaceTransformRcPtr colorSpaceTransform + = DynamicPtrCast(transform)) { colorSpaceNames.insert(context->resolveStringVar(colorSpaceTransform->getSrc())); colorSpaceNames.insert(context->resolveStringVar(colorSpaceTransform->getDst())); } - else if(ConstDisplayViewTransformRcPtr displayViewTransform = \ - DynamicPtrCast(transform)) + else if ( + ConstDisplayViewTransformRcPtr displayViewTransform + = DynamicPtrCast(transform)) { colorSpaceNames.insert(displayViewTransform->getSrc()); } - else if(ConstLookTransformRcPtr lookTransform = \ - DynamicPtrCast(transform)) + else if (ConstLookTransformRcPtr lookTransform = DynamicPtrCast(transform)) { colorSpaceNames.insert(lookTransform->getSrc()); colorSpaceNames.insert(lookTransform->getDst()); @@ -243,12 +243,13 @@ std::ostringstream GetDisplayViewPrefixErrorMsg(const std::string & display, con } static constexpr unsigned FirstSupportedMajorVersion = 1; -static constexpr unsigned LastSupportedMajorVersion = OCIO_VERSION_MAJOR; +static constexpr unsigned LastSupportedMajorVersion = OCIO_VERSION_MAJOR; // For each major version keep the most recent minor. -static const unsigned int LastSupportedMinorVersion[] = {0, // Version 1 - 4 // Version 2 - }; +static const unsigned int LastSupportedMinorVersion[] = { + 0, // Version 1 + 4 // Version 2 +}; } // namespace @@ -268,7 +269,7 @@ class Config::Impl ContextRcPtr m_context; std::string m_name; static constexpr char DefaultFamilySeparator = '/'; - char m_familySeparator = DefaultFamilySeparator; + char m_familySeparator = DefaultFamilySeparator; std::string m_description; // The final list of inactive color spaces is built from several inputs. @@ -278,8 +279,8 @@ class Config::Impl // // Refer to Config::Impl::refreshActiveColorSpaces() to have the implementation details. - ColorSpaceSetRcPtr m_allColorSpaces; // All the color spaces (i.e. no filtering). - StringUtils::StringVec m_activeColorSpaceNames; // Active color space names. + ColorSpaceSetRcPtr m_allColorSpaces; // All the color spaces (i.e. no filtering). + StringUtils::StringVec m_activeColorSpaceNames; // Active color space names. StringUtils::StringVec m_inactiveColorSpaceNames; // inactive color space names. // Inactive color space or named transform filter from API request. @@ -329,18 +330,18 @@ class Config::Impl mutable std::string m_cacheidnocontext; FileRulesRcPtr m_fileRules; - mutable ProcessorCacheFlags m_cacheFlags { PROCESSOR_CACHE_DEFAULT }; + mutable ProcessorCacheFlags m_cacheFlags{PROCESSOR_CACHE_DEFAULT}; mutable ProcessorCache m_processorCache; - Impl() : - m_majorVersion(LastSupportedMajorVersion), - m_minorVersion(LastSupportedMinorVersion[LastSupportedMajorVersion - 1]), - m_context(Context::Create()), - m_allColorSpaces(ColorSpaceSet::Create()), - m_viewingRules(ViewingRules::Create()), - m_strictParsing(true), - m_validation(VALIDATION_UNKNOWN), - m_fileRules(FileRules::Create()) + Impl() + : m_majorVersion(LastSupportedMajorVersion) + , m_minorVersion(LastSupportedMinorVersion[LastSupportedMajorVersion - 1]) + , m_context(Context::Create()) + , m_allColorSpaces(ColorSpaceSet::Create()) + , m_viewingRules(ViewingRules::Create()) + , m_strictParsing(true) + , m_validation(VALIDATION_UNKNOWN) + , m_fileRules(FileRules::Create()) { std::string activeDisplays; Platform::Getenv(OCIO_ACTIVE_DISPLAYS_ENVVAR, activeDisplays); @@ -366,31 +367,32 @@ class Config::Impl Platform::Getenv(OCIO_INACTIVE_COLORSPACES_ENVVAR, m_inactiveColorSpaceNamesEnv); m_inactiveColorSpaceNamesEnv = StringUtils::Trim(m_inactiveColorSpaceNamesEnv); - m_processorCache.enable((m_cacheFlags & PROCESSOR_CACHE_ENABLED) == PROCESSOR_CACHE_ENABLED); + m_processorCache.enable( + (m_cacheFlags & PROCESSOR_CACHE_ENABLED) == PROCESSOR_CACHE_ENABLED); // This is used to allow the YAML writer to not save any virtual displays that were // instantiated. m_virtualDisplay.m_temporary = true; } - ~Impl() = default; - Impl(const Impl&) = delete; + ~Impl() = default; + Impl(const Impl &) = delete; - Impl& operator= (const Impl & rhs) + Impl & operator=(const Impl & rhs) { - if(this!=&rhs) + if (this != &rhs) { m_majorVersion = rhs.m_majorVersion; m_minorVersion = rhs.m_minorVersion; - m_env = rhs.m_env; - m_context = rhs.m_context->createEditableCopy(); - m_name = rhs.m_name; + m_env = rhs.m_env; + m_context = rhs.m_context->createEditableCopy(); + m_name = rhs.m_name; m_familySeparator = rhs.m_familySeparator; - m_description = rhs.m_description; + m_description = rhs.m_description; // Deep copy the colorspaces. - m_allColorSpaces = rhs.m_allColorSpaces->createEditableCopy(); + m_allColorSpaces = rhs.m_allColorSpaces->createEditableCopy(); m_activeColorSpaceNames = rhs.m_activeColorSpaceNames; m_inactiveColorSpaceNames = rhs.m_inactiveColorSpaceNames; m_inactiveColorSpaceNamesConf = rhs.m_inactiveColorSpaceNamesConf; @@ -414,18 +416,18 @@ class Config::Impl { m_allNamedTransforms.push_back(nt->createEditableCopy()); } - m_activeNamedTransformNames = rhs.m_activeNamedTransformNames; + m_activeNamedTransformNames = rhs.m_activeNamedTransformNames; m_inactiveNamedTransformNames = rhs.m_inactiveNamedTransformNames; - m_displays = rhs.m_displays; - m_activeDisplays = rhs.m_activeDisplays; - m_activeViews = rhs.m_activeViews; - m_activeViewsEnvOverride = rhs.m_activeViewsEnvOverride; + m_displays = rhs.m_displays; + m_activeDisplays = rhs.m_activeDisplays; + m_activeViews = rhs.m_activeViews; + m_activeViewsEnvOverride = rhs.m_activeViewsEnvOverride; m_activeDisplaysEnvOverride = rhs.m_activeDisplaysEnvOverride; - m_activeDisplaysStr = rhs.m_activeDisplaysStr; - m_displayCache = rhs.m_displayCache; - m_viewingRules = rhs.m_viewingRules->createEditableCopy(); - m_sharedViews = rhs.m_sharedViews; + m_activeDisplaysStr = rhs.m_activeDisplaysStr; + m_displayCache = rhs.m_displayCache; + m_viewingRules = rhs.m_viewingRules->createEditableCopy(); + m_sharedViews = rhs.m_sharedViews; m_virtualDisplay = rhs.m_virtualDisplay; @@ -437,21 +439,22 @@ class Config::Impl m_viewTransforms.push_back(vt->createEditableCopy()); } m_defaultViewTransform = rhs.m_defaultViewTransform; - m_defaultLumaCoefs = rhs.m_defaultLumaCoefs; - m_strictParsing = rhs.m_strictParsing; + m_defaultLumaCoefs = rhs.m_defaultLumaCoefs; + m_strictParsing = rhs.m_strictParsing; - m_validation = rhs.m_validation; + m_validation = rhs.m_validation; m_validationtext = rhs.m_validationtext; - m_cacheids = rhs.m_cacheids; + m_cacheids = rhs.m_cacheids; m_cacheidnocontext = rhs.m_cacheidnocontext; m_fileRules = rhs.m_fileRules->createEditableCopy(); - + m_cacheFlags = rhs.m_cacheFlags; m_processorCache.clear(); - m_processorCache.enable((m_cacheFlags & PROCESSOR_CACHE_ENABLED) == PROCESSOR_CACHE_ENABLED); + m_processorCache.enable( + (m_cacheFlags & PROCESSOR_CACHE_ENABLED) == PROCESSOR_CACHE_ENABLED); } return *this; } @@ -464,7 +467,7 @@ class Config::Impl { // Check to see if the name is a role. const char * csname = LookupRole(m_roles, name); - cs = m_allColorSpaces->getColorSpace(csname); + cs = m_allColorSpaces->getColorSpace(csname); } return cs; @@ -519,7 +522,7 @@ class Config::Impl enum InactiveType { - INACTIVE_COLORSPACE =0, + INACTIVE_COLORSPACE = 0, INACTIVE_NAMEDTRANSFORM, INACTIVE_ALL }; @@ -589,11 +592,12 @@ class Config::Impl static ConstConfigRcPtr Read(std::istream & istream, ConfigIOProxyRcPtr ciop); // Validate view object that can be a config defined shared view or a display-defined view. - void validateView(const std::string & display, const View & view, bool checkUseDisplayName) const + void validateView(const std::string & display, const View & view, bool checkUseDisplayName) + const { if (view.m_name.empty()) { - std::ostringstream os{ GetDisplayViewPrefixErrorMsg(display, view) }; + std::ostringstream os{GetDisplayViewPrefixErrorMsg(display, view)}; m_validationtext = os.str(); throw Exception(m_validationtext.c_str()); } @@ -603,7 +607,7 @@ class Config::Impl // Validate color space name is not empty. if (view.m_colorspace.empty()) { - std::ostringstream os{ GetDisplayViewPrefixErrorMsg(display, view) }; + std::ostringstream os{GetDisplayViewPrefixErrorMsg(display, view)}; os << "does not refer to a color space."; m_validationtext = os.str(); throw Exception(m_validationtext.c_str()); @@ -614,7 +618,7 @@ class Config::Impl // USE_DISPLAY_NAME can only be used by shared views. if (!sharedViewWithViewTransform && view.useDisplayNameForColorspace()) { - std::ostringstream os{ GetDisplayViewPrefixErrorMsg(display, view) }; + std::ostringstream os{GetDisplayViewPrefixErrorMsg(display, view)}; os << "can not use '" << OCIO_VIEW_USE_DISPLAY_NAME; os << "' keyword for the color space name."; m_validationtext = os.str(); @@ -623,11 +627,10 @@ class Config::Impl } // If USE_DISPLAY_NAME is not present, a valid color space must be specified. - if (!view.useDisplayNameForColorspace() && - !hasColorSpace(view.m_colorspace.c_str()) && - !getNamedTransform(view.m_colorspace.c_str())) + if (!view.useDisplayNameForColorspace() && !hasColorSpace(view.m_colorspace.c_str()) + && !getNamedTransform(view.m_colorspace.c_str())) { - std::ostringstream os{ GetDisplayViewPrefixErrorMsg(display, view) }; + std::ostringstream os{GetDisplayViewPrefixErrorMsg(display, view)}; os << "that refers to a color space or a named transform, '" << view.m_colorspace; os << "', which is not defined."; m_validationtext = os.str(); @@ -642,7 +645,7 @@ class Config::Impl { if (!getViewTransform(view.m_viewTransform.c_str())) { - std::ostringstream os{ GetDisplayViewPrefixErrorMsg(display, view) }; + std::ostringstream os{GetDisplayViewPrefixErrorMsg(display, view)}; os << "that refers to a view transform, '" << view.m_viewTransform << "', "; os << "which is neither a view transform nor a named transform."; m_validationtext = os.str(); @@ -657,7 +660,7 @@ class Config::Impl auto cs = getColorSpace(displayCS); if (cs && cs->getReferenceSpaceType() != REFERENCE_SPACE_DISPLAY) { - std::ostringstream os{ GetDisplayViewPrefixErrorMsg(display, view) }; + std::ostringstream os{GetDisplayViewPrefixErrorMsg(display, view)}; os << "refers to a color space, '" << std::string(displayCS) << "', "; os << "that is not a display-referred color space."; m_validationtext = os.str(); @@ -677,7 +680,7 @@ class Config::Impl if (!look.empty() && !getLook(look.c_str())) { - std::ostringstream os{ GetDisplayViewPrefixErrorMsg(display, view) }; + std::ostringstream os{GetDisplayViewPrefixErrorMsg(display, view)}; os << "refers to a look, '" << look << "', "; os << "which is not defined."; m_validationtext = os.str(); @@ -688,10 +691,10 @@ class Config::Impl if (!view.m_rule.empty()) { - size_t ruleIndex{ 0 }; + size_t ruleIndex{0}; if (!FindRule(m_viewingRules, view.m_rule, ruleIndex)) { - std::ostringstream os{ GetDisplayViewPrefixErrorMsg(display, view) }; + std::ostringstream os{GetDisplayViewPrefixErrorMsg(display, view)}; os << "refers to a viewing rule, '" << view.m_rule << "', "; os << "which is not defined."; m_validationtext = os.str(); @@ -701,10 +704,11 @@ class Config::Impl } // Check a shared view used in a display. View itself has already been checked. - void validateSharedView(const std::string & display, - const ViewVec & viewsOfDisplay, - const std::string & sharedView, - bool checkUseDisplayName) const + void validateSharedView( + const std::string & display, + const ViewVec & viewsOfDisplay, + const std::string & sharedView, + bool checkUseDisplayName) const { // Is the name already used for a display-defined view? // This should never happen because this is checked when adding a view. @@ -783,7 +787,8 @@ class Config::Impl const View * getView(const char * display, const char * view) const { - if (!view || !*view) return nullptr; + if (!view || !*view) + return nullptr; bool searchShared = !display || !*display; @@ -791,14 +796,15 @@ class Config::Impl if (!searchShared) { iter = FindDisplay(m_displays, display); - if (iter == m_displays.end()) return nullptr; + if (iter == m_displays.end()) + return nullptr; const StringUtils::StringVec & sharedViews = iter->second.m_sharedViews; - searchShared = StringUtils::Contain(sharedViews, view); + searchShared = StringUtils::Contain(sharedViews, view); } const ViewVec & views = searchShared ? m_sharedViews : iter->second.m_views; - const auto & viewIt = FindView(views, view); + const auto & viewIt = FindView(views, view); if (viewIt != views.end()) { @@ -842,9 +848,10 @@ class Config::Impl // Get all active views from a display with a rule that refers to color space or an encoding // referred by color space. Note that views that do not have viewing rules are all returned. // ViewNames, created from views, is returned as parameter. - StringUtils::StringVec getFilteredViews(StringUtils::StringVec & viewNames, - const ViewPtrVec & views, - const char * imageCSName) const + StringUtils::StringVec getFilteredViews( + StringUtils::StringVec & viewNames, + const ViewPtrVec & views, + const char * imageCSName) const { ConstColorSpaceRcPtr imageColorSpace = getColorSpace(imageCSName); if (!imageColorSpace) @@ -854,18 +861,18 @@ class Config::Impl throw Exception(os.str().c_str()); } - const std::string viewEncoding{ imageColorSpace->getEncoding() }; + const std::string viewEncoding{imageColorSpace->getEncoding()}; - viewNames = GetViewNames(views); + viewNames = GetViewNames(views); StringUtils::StringVec activeViews = getActiveViews(viewNames); - const std::string imageColorSpaceName{ StringUtils::Lower(imageCSName) }; + const std::string imageColorSpaceName{StringUtils::Lower(imageCSName)}; StringUtils::StringVec filteredActiveViews; for (const auto & view : activeViews) { - const auto idx = FindInStringVecCaseIgnore(viewNames, view); + const auto idx = FindInStringVecCaseIgnore(viewNames, view); const auto & ruleName = views[idx]->m_rule; - size_t ruleIdx{ 0 }; + size_t ruleIdx{0}; if (ruleName.empty()) { // Include all views that do not have a rule. @@ -874,14 +881,14 @@ class Config::Impl else if (FindRule(m_viewingRules, ruleName, ruleIdx)) { const size_t numcs = m_viewingRules->getNumColorSpaces(ruleIdx); - bool added = false; + bool added = false; for (size_t csIdx = 0; csIdx < numcs; ++csIdx) { // Rule can use role names. const char * rolename = m_viewingRules->getColorSpace(ruleIdx, csIdx); - const char * csname = LookupRole(m_roles, rolename); + const char * csname = LookupRole(m_roles, rolename); - const std::string csName{ *csname ? csname : rolename }; + const std::string csName{*csname ? csname : rolename}; if (StringUtils::Lower(csName) == imageColorSpaceName) { // Include a view if its rule contains the image's color space. @@ -895,7 +902,7 @@ class Config::Impl const size_t numEnc = m_viewingRules->getNumEncodings(ruleIdx); for (size_t encIdx = 0; encIdx < numEnc; ++encIdx) { - const std::string encName{ m_viewingRules->getEncoding(ruleIdx, encIdx) }; + const std::string encName{m_viewingRules->getEncoding(ruleIdx, encIdx)}; if (StringUtils::Lower(encName) == viewEncoding) { // Include a view if its rule contains the image's color space encoding. @@ -913,44 +920,43 @@ class Config::Impl { if (m_displayCache.empty()) { - ComputeDisplays(m_displayCache, - m_displays, - m_activeDisplays, - m_activeDisplaysEnvOverride); + ComputeDisplays( + m_displayCache, + m_displays, + m_activeDisplays, + m_activeDisplaysEnvOverride); } - } - ProcessorCacheFlags getProcessorCacheFlags() const noexcept - { - return m_cacheFlags; - } + ProcessorCacheFlags getProcessorCacheFlags() const noexcept { return m_cacheFlags; } void setProcessorCacheFlags(ProcessorCacheFlags flags) const noexcept { m_cacheFlags = flags; - m_processorCache.enable((m_cacheFlags & PROCESSOR_CACHE_ENABLED) == PROCESSOR_CACHE_ENABLED); + m_processorCache.enable( + (m_cacheFlags & PROCESSOR_CACHE_ENABLED) == PROCESSOR_CACHE_ENABLED); } ConstProcessorRcPtr getProcessorWithoutCaching( const Config & config, - const ConstTransformRcPtr & transform, + const ConstTransformRcPtr & transform, TransformDirection direction) const { if (!transform) { throw Exception("Config::GetProcessor failed. Transform is null."); } - + ProcessorRcPtr processor = Processor::Create(); processor->getImpl()->setProcessorCacheFlags(PROCESSOR_CACHE_OFF); processor->getImpl()->setTransform(config, m_context, transform, direction); return processor; } - - int instantiateDisplay(const std::string & monitorName, - const std::string & monitorDescription, - const std::string & ICCProfileFilepath) + + int instantiateDisplay( + const std::string & monitorName, + const std::string & monitorDescription, + const std::string & ICCProfileFilepath) { if (ICCProfileFilepath.empty()) { @@ -967,11 +973,7 @@ class Config::Impl { std::ostringstream oss; oss << "Cannot instantiate a virtual display because the list of active displays is " - << "defined by " - << OCIO_ACTIVE_DISPLAYS_ENVVAR - << " = " - << envContent - << "."; + << "defined by " << OCIO_ACTIVE_DISPLAYS_ENVVAR << " = " << envContent << "."; throw Exception(oss.str().c_str()); } @@ -989,8 +991,7 @@ class Config::Impl // Check if the virtual display definition is present. - if (m_virtualDisplay.m_views.size() == 0 - && m_virtualDisplay.m_sharedViews.size() == 0) + if (m_virtualDisplay.m_views.size() == 0 && m_virtualDisplay.m_sharedViews.size() == 0) { throw Exception("The virtual display information to instantiate a display is missing."); } @@ -1033,10 +1034,10 @@ class Config::Impl // Note that it adds it or updates the existing one. m_allColorSpaces->addColorSpace(cs); } - catch(const Exception & /* ex */) + catch (const Exception & /* ex */) { DisplayMap::iterator iter = FindDisplay(m_displays, colorSpaceName); - if (iter!=m_displays.end()) + if (iter != m_displays.end()) { m_displays.erase(iter); } @@ -1048,8 +1049,7 @@ class Config::Impl // The display must be active. - if (!m_activeDisplays.empty() - && !m_activeDisplays[0].empty() + if (!m_activeDisplays.empty() && !m_activeDisplays[0].empty() && !StringUtils::Contain(m_activeDisplays, colorSpaceName)) { m_activeDisplays.push_back(colorSpaceName); @@ -1080,10 +1080,7 @@ class Config::Impl m_displayCache.clear(); - ComputeDisplays(m_displayCache, - m_displays, - m_activeDisplays, - m_activeDisplaysEnvOverride); + ComputeDisplays(m_displayCache, m_displays, m_activeDisplays, m_activeDisplaysEnvOverride); AutoMutex lock(m_cacheidMutex); resetCacheIDs(); @@ -1094,7 +1091,7 @@ class Config::Impl for (size_t idx = 0; idx < m_displayCache.size(); ++idx) { - if (0==strcmp(m_displayCache[idx].c_str(), colorSpaceName.c_str())) + if (0 == strcmp(m_displayCache[idx].c_str(), colorSpaceName.c_str())) { return static_cast(idx); } @@ -1105,12 +1102,9 @@ class Config::Impl } }; - - // Instantiate the cache with the right types. extern template class ProcessorCache; - /////////////////////////////////////////////////////////////////////////// ConfigRcPtr Config::Create() @@ -1118,7 +1112,7 @@ ConfigRcPtr Config::Create() return ConfigRcPtr(new Config(), &deleter); } -void Config::deleter(Config* c) +void Config::deleter(Config * c) { delete c; } @@ -1140,10 +1134,11 @@ ConstConfigRcPtr Config::CreateFromEnv() // 1) Path to a config file (e.g. /home/user/ocio/config.ocio) // 2) Path to an archived config file (e.g. /home/user/ocio/archived_config.ocioz) // 3) URI to a built-in config (e.g. ocio://cg-config-v0.1.0_aces-v1.3_ocio-v2.1.1) - if(!file.empty()) return CreateFromFile(file.c_str()); + if (!file.empty()) + return CreateFromFile(file.c_str()); - static const char err[] = - "Color management disabled. (Specify the $OCIO environment variable to enable.)"; + static const char err[] + = "Color management disabled. (Specify the $OCIO environment variable to enable.)"; LogInfo(err); @@ -1154,7 +1149,7 @@ ConstConfigRcPtr Config::CreateFromFile(const char * filename) { if (!filename || !*filename) { - throw ExceptionMissingFile ("The config filepath is missing."); + throw ExceptionMissingFile("The config filepath is missing."); } // Check for URI Pattern: ocio:// @@ -1166,20 +1161,18 @@ ConstConfigRcPtr Config::CreateFromFile(const char * filename) return CreateFromBuiltinConfig(uri.c_str()); } - std::ifstream ifstream = Platform::CreateInputFileStream( - filename, - std::ios_base::in | std::ios_base::binary - ); + std::ifstream ifstream + = Platform::CreateInputFileStream(filename, std::ios_base::in | std::ios_base::binary); if (ifstream.fail()) { std::ostringstream os; os << "Error could not read '" << filename; os << "' OCIO profile."; - throw Exception (os.str().c_str()); + throw Exception(os.str().c_str()); } - char magicNumber[2] = { 0 }; + char magicNumber[2] = {0}; if (ifstream.read(magicNumber, 2)) { // Check if it is an OCIOZ archive. @@ -1197,7 +1190,7 @@ ConstConfigRcPtr Config::CreateFromFile(const char * filename) ciop->buildEntries(); return CreateFromConfigIOProxy(ciop); } - } + } // Not an OCIOZ archive. Continue as usual. ifstream.clear(); @@ -1223,16 +1216,16 @@ ConstConfigRcPtr Config::CreateFromConfigIOProxy(ConfigIOProxyRcPtr ciop) { std::ostringstream os; os << "Could not create config using ConfigIOProxy."; - throw Exception (os.str().c_str()); + throw Exception(os.str().c_str()); } - + return config; } ConstConfigRcPtr Config::CreateFromBuiltinConfig(const char * configName) { std::string builtinConfigName = configName; - + // Normalize the input to the URI format. if (!StringUtils::StartsWith(builtinConfigName, OCIO_BUILTIN_URI_PREFIX)) { @@ -1266,7 +1259,7 @@ ConstConfigRcPtr Config::CreateFromBuiltinConfig(const char * configName) /////////////////////////////////////////////////////////////////////////// Config::Config() -: m_impl(new Config::Impl()) + : m_impl(new Config::Impl()) { } @@ -1283,17 +1276,12 @@ unsigned Config::getMajorVersion() const void Config::setMajorVersion(unsigned int version) { - if (version < FirstSupportedMajorVersion - || version > LastSupportedMajorVersion) + if (version < FirstSupportedMajorVersion || version > LastSupportedMajorVersion) { std::ostringstream os; - os << "The version is " << version - << " where supported versions start at " - << FirstSupportedMajorVersion - << " and end at " - << LastSupportedMajorVersion - << "."; - throw Exception(os.str().c_str()); + os << "The version is " << version << " where supported versions start at " + << FirstSupportedMajorVersion << " and end at " << LastSupportedMajorVersion << "."; + throw Exception(os.str().c_str()); } m_impl->m_majorVersion = version; m_impl->m_minorVersion = LastSupportedMinorVersion[version - 1]; @@ -1313,10 +1301,8 @@ void Config::setMinorVersion(unsigned int version) if (version > maxMinor) { std::ostringstream os; - os << "The minor version " << version - << " is not supported for major version " - << m_impl->m_majorVersion - << ". Maximum minor version is " << maxMinor << "."; + os << "The minor version " << version << " is not supported for major version " + << m_impl->m_majorVersion << ". Maximum minor version is " << maxMinor << "."; throw Exception(os.str().c_str()); } m_impl->m_minorVersion = version; @@ -1351,19 +1337,20 @@ void Config::upgradeToLatestVersion() noexcept ConfigRcPtr Config::createEditableCopy() const { ConfigRcPtr config = Config::Create(); - *config->m_impl = *m_impl; + *config->m_impl = *m_impl; return config; } void Config::validate() const { - if(getImpl()->m_validation == Impl::VALIDATION_PASSED) return; - if(getImpl()->m_validation == Impl::VALIDATION_FAILED) + if (getImpl()->m_validation == Impl::VALIDATION_PASSED) + return; + if (getImpl()->m_validation == Impl::VALIDATION_FAILED) { throw Exception(getImpl()->m_validationtext.c_str()); } - getImpl()->m_validation = Impl::VALIDATION_FAILED; + getImpl()->m_validation = Impl::VALIDATION_FAILED; getImpl()->m_validationtext = ""; ///// PREDEFINED CONTEXT VARIABLES @@ -1383,20 +1370,18 @@ void Config::validate() const // only legal case is ENV = $ENV. It means that there is no default value i.e. an // system env. variable must exist. - const std::string ctxVariable1 = std::string("$") + env.first; + const std::string ctxVariable1 = std::string("$") + env.first; const std::string ctxVariable2 = std::string("${") + env.first + std::string("}"); - const std::string ctxVariable3 = std::string("%") + env.first + std::string("%"); + const std::string ctxVariable3 = std::string("%") + env.first + std::string("%"); - const bool isValid = (ctxVariable1 == ctxValue) - || (ctxVariable2 == ctxValue) - || (ctxVariable3 == ctxValue); + const bool isValid = (ctxVariable1 == ctxValue) || (ctxVariable2 == ctxValue) + || (ctxVariable3 == ctxValue); if (!isValid) { std::ostringstream oss; - oss << "Unresolved context variable in environment declaration '" - << env.first << " = " - << env.second << "'."; + oss << "Unresolved context variable in environment declaration '" << env.first + << " = " << env.second << "'."; throw Exception(oss.str().c_str()); } } @@ -1407,11 +1392,11 @@ void Config::validate() const StringSet existingColorSpaces; - bool hasDisplayReferredColorspace = false; - bool hasSceneReferredColorspace = false; + bool hasDisplayReferredColorspace = false; + bool hasSceneReferredColorspace = false; // Confirm all ColorSpaces are valid. - for(int i=0; im_allColorSpaces->getNumColorSpaces(); ++i) + for (int i = 0; i < getImpl()->m_allColorSpaces->getNumColorSpaces(); ++i) { const auto cs = getImpl()->m_allColorSpaces->getColorSpaceByIndex(i); if (!cs) @@ -1430,9 +1415,7 @@ void Config::validate() const if (getMajorVersion() >= 2 && ContainsContextVariableToken(name)) { std::ostringstream oss; - oss << "Config failed color space validation. " - << "A color space name '" - << name + oss << "Config failed color space validation. " << "A color space name '" << name << "' cannot contain a context variable reserved token i.e. % or $."; getImpl()->m_validationtext = oss.str(); @@ -1468,22 +1451,22 @@ void Config::validate() const // Confirm all roles used by the config are valid and that essential roles are present. { - for(StringMap::const_iterator iter = getImpl()->m_roles.begin(), - end = getImpl()->m_roles.end(); iter!=end; ++iter) + for (StringMap::const_iterator iter = getImpl()->m_roles.begin(), + end = getImpl()->m_roles.end(); + iter != end; + ++iter) { // Retest in case version did change. if (getMajorVersion() >= 2 && ContainsContextVariableToken(iter->first)) { std::ostringstream oss; - oss << "Config failed role validation. " - << "A role name '" - << iter->first + oss << "Config failed role validation. " << "A role name '" << iter->first << "' cannot contain a context variable reserved token i.e. % or $."; getImpl()->m_validationtext = oss.str(); throw Exception(getImpl()->m_validationtext.c_str()); } - if(!getImpl()->hasColorSpace(iter->second.c_str())) + if (!getImpl()->hasColorSpace(iter->second.c_str())) { std::ostringstream os; os << "Config failed role validation. "; @@ -1497,26 +1480,25 @@ void Config::validate() const // AddColorSpace, addNamedTransform & setRole already check there is no name conflict. } - // Check for interchange roles requirements - scene-referred and display-referred. if (getMajorVersion() >= 2 && getMinorVersion() >= 2) { - bool hasRoleSceneLinear = false; - bool hasRoleCompositingLog = false; - bool hasRoleColorTiming = false; + bool hasRoleSceneLinear = false; + bool hasRoleCompositingLog = false; + bool hasRoleColorTiming = false; - bool hasRoleAcesInterchange = false; - bool acesInterHasSceneRefColorspace = false; - bool hasRoleCieXyzD65Interchange = false; - bool cieInterHasDisplayRefColorspace = false; + bool hasRoleAcesInterchange = false; + bool acesInterHasSceneRefColorspace = false; + bool hasRoleCieXyzD65Interchange = false; + bool cieInterHasDisplayRefColorspace = false; - for (auto const& role : getImpl()->m_roles) + for (auto const & role : getImpl()->m_roles) { if (Platform::Strcasecmp(role.first.c_str(), ROLE_SCENE_LINEAR) == 0) { hasRoleSceneLinear = true; } - else if (Platform::Strcasecmp(role.first.c_str(), ROLE_COMPOSITING_LOG ) == 0) + else if (Platform::Strcasecmp(role.first.c_str(), ROLE_COMPOSITING_LOG) == 0) { hasRoleCompositingLog = true; } @@ -1529,22 +1511,22 @@ void Config::validate() const hasRoleAcesInterchange = true; ConstColorSpaceRcPtr cs = getColorSpace(role.second.c_str()); - acesInterHasSceneRefColorspace = - cs->getReferenceSpaceType() == REFERENCE_SPACE_SCENE; + acesInterHasSceneRefColorspace + = cs->getReferenceSpaceType() == REFERENCE_SPACE_SCENE; } else if (Platform::Strcasecmp(role.first.c_str(), ROLE_INTERCHANGE_DISPLAY) == 0) { hasRoleCieXyzD65Interchange = true; ConstColorSpaceRcPtr cs = getColorSpace(role.second.c_str()); - cieInterHasDisplayRefColorspace = - cs->getReferenceSpaceType() == REFERENCE_SPACE_DISPLAY; + cieInterHasDisplayRefColorspace + = cs->getReferenceSpaceType() == REFERENCE_SPACE_DISPLAY; } } - // All LogError below are technically a validation failure, but only logging a message - // rather than throwing (for now). This is to make it possible for upgradeToLatestVersion - // to always result in a config that does not fail validation. + // All LogError below are technically a validation failure, but only logging a message + // rather than throwing (for now). This is to make it possible for + // upgradeToLatestVersion to always result in a config that does not fail validation. if (!hasRoleSceneLinear) { @@ -1574,8 +1556,7 @@ void Config::validate() const os << " color spaces and the config version is 2.2 or higher."; LogError(os.str()); } - else if (hasRoleAcesInterchange && - !acesInterHasSceneRefColorspace) + else if (hasRoleAcesInterchange && !acesInterHasSceneRefColorspace) { std::ostringstream os; os << "The aces_interchange role must be a scene-referred color space."; @@ -1589,8 +1570,7 @@ void Config::validate() const os << " display-referred color spaces and the config version is 2.2 or higher."; LogError(os.str()); } - else if (hasRoleCieXyzD65Interchange && - !cieInterHasDisplayRefColorspace) + else if (hasRoleCieXyzD65Interchange && !cieInterHasDisplayRefColorspace) { std::ostringstream os; os << "The cie_xyz_d65_interchange role must be a display-referred color space."; @@ -1620,20 +1600,21 @@ void Config::validate() const // Viewing rules. - try - { - auto colorSpaceAccessor = std::bind(&Config::getColorSpace, this, std::placeholders::_1); - getImpl()->m_viewingRules->getImpl()->validate(colorSpaceAccessor, - getImpl()->m_allColorSpaces); - } - catch (const Exception & e) - { - std::ostringstream os; - os << "Config failed validation. Viewing rules failed validation with: "; - os << e.what(); - getImpl()->m_validationtext = os.str(); - throw Exception(getImpl()->m_validationtext.c_str()); - } + try + { + auto colorSpaceAccessor = std::bind(&Config::getColorSpace, this, std::placeholders::_1); + getImpl()->m_viewingRules->getImpl()->validate( + colorSpaceAccessor, + getImpl()->m_allColorSpaces); + } + catch (const Exception & e) + { + std::ostringstream os; + os << "Config failed validation. Viewing rules failed validation with: "; + os << e.what(); + getImpl()->m_validationtext = os.str(); + throw Exception(getImpl()->m_validationtext.c_str()); + } // Shared views. for (const auto & view : getImpl()->m_sharedViews) @@ -1644,14 +1625,14 @@ void Config::validate() const int numdisplays = 0; // Confirm all Display transforms refer to colorspaces that exist. - for(DisplayMap::const_iterator iter = getImpl()->m_displays.begin(); - iter != getImpl()->m_displays.end(); - ++iter) + for (DisplayMap::const_iterator iter = getImpl()->m_displays.begin(); + iter != getImpl()->m_displays.end(); + ++iter) { - const std::string display = iter->first; - const ViewVec & views = iter->second.m_views; + const std::string display = iter->first; + const ViewVec & views = iter->second.m_views; const StringUtils::StringVec & sharedViews = iter->second.m_sharedViews; - if(views.empty() && sharedViews.empty()) + if (views.empty() && sharedViews.empty()) { std::ostringstream os; os << "Config failed display validation. "; @@ -1669,7 +1650,7 @@ void Config::validate() const } // Confirm view references exist. - for(const auto & view : views) + for (const auto & view : views) { getImpl()->validateView(display, view, true); } @@ -1685,7 +1666,6 @@ void Config::validate() const throw Exception(getImpl()->m_validationtext.c_str()); } - ///// VIRTUAL DISPLAY. if (getMajorVersion() >= 2) @@ -1694,21 +1674,21 @@ void Config::validate() const for (const auto & sharedView : getImpl()->m_virtualDisplay.m_sharedViews) { // Bypass the validation. - getImpl()->validateSharedView("virtual_display", - getImpl()->m_virtualDisplay.m_views, - sharedView, - false); + getImpl()->validateSharedView( + "virtual_display", + getImpl()->m_virtualDisplay.m_views, + sharedView, + false); } // Confirm view references exist. - for(const auto & view : getImpl()->m_virtualDisplay.m_views) + for (const auto & view : getImpl()->m_virtualDisplay.m_views) { // Bypass the validation. getImpl()->validateView("virtual_display", view, false); } } - ///// ACTIVE DISPLAYS & VIEWS StringUtils::StringVec displays; @@ -1719,12 +1699,10 @@ void Config::validate() const displays.push_back(iter->first); } - if (!getImpl()->m_activeDisplaysEnvOverride.empty()) { - const bool useAllDisplays - = getImpl()->m_activeDisplaysEnvOverride.size()==1 - && getImpl()->m_activeDisplaysEnvOverride[0] == ""; + const bool useAllDisplays = getImpl()->m_activeDisplaysEnvOverride.size() == 1 + && getImpl()->m_activeDisplaysEnvOverride[0] == ""; if (!useAllDisplays) { @@ -1734,12 +1712,11 @@ void Config::validate() const { std::ostringstream os; os << "The content of the env. variable for the list of active displays [" - << JoinStringEnvStyle(getImpl()->m_activeDisplaysEnvOverride) - << "] is invalid."; + << JoinStringEnvStyle(getImpl()->m_activeDisplaysEnvOverride) << "] is invalid."; getImpl()->m_validationtext = os.str(); throw Exception(getImpl()->m_validationtext.c_str()); } - if (orderedDisplays.size()!=getImpl()->m_activeDisplaysEnvOverride.size()) + if (orderedDisplays.size() != getImpl()->m_activeDisplaysEnvOverride.size()) { std::ostringstream os; os << "The content of the env. variable for the list of active displays [" @@ -1752,8 +1729,8 @@ void Config::validate() const } else if (!getImpl()->m_activeDisplays.empty()) { - const bool useAllDisplays = getImpl()->m_activeDisplays.size() == 1 && - getImpl()->m_activeDisplays[0] == ""; + const bool useAllDisplays + = getImpl()->m_activeDisplays.size() == 1 && getImpl()->m_activeDisplays[0] == ""; if (!useAllDisplays) { @@ -1768,7 +1745,7 @@ void Config::validate() const getImpl()->m_validationtext = os.str(); throw Exception(getImpl()->m_validationtext.c_str()); } - if (orderedDisplays.size()!=getImpl()->m_activeDisplays.size()) + if (orderedDisplays.size() != getImpl()->m_activeDisplays.size()) { std::ostringstream os; os << "The list of active displays [" @@ -1782,10 +1759,8 @@ void Config::validate() const // TODO: Add validation for active views. - ///// TRANSFORMS - // Confirm for all transforms that reference internal color spaces, // the named color space exists and that all transforms are valid. { @@ -1813,8 +1788,8 @@ void Config::validate() const { std::ostringstream oss; oss << "Config failed transform validation. " - << "This config references a color space '" - << name << "' using an unknown context variable."; + << "This config references a color space '" << name + << "' using an unknown context variable."; getImpl()->m_validationtext = oss.str(); throw Exception(getImpl()->m_validationtext.c_str()); @@ -1838,7 +1813,7 @@ void Config::validate() const throw Exception(getImpl()->m_validationtext.c_str()); } } - else if(!getImpl()->hasColorSpace(csname)) + else if (!getImpl()->hasColorSpace(csname)) { // It's a role, but the color space it points to doesn't exist. os << csname << "' (for role '" << name << "'), which is not defined."; @@ -1852,7 +1827,7 @@ void Config::validate() const ///// LOOKS // For all looks, confirm the process space exists and the look is named. - for(unsigned int i=0; im_looksList.size(); ++i) + for (unsigned int i = 0; i < getImpl()->m_looksList.size(); ++i) { const char * lookName = getImpl()->m_looksList[i]->getName(); if (!lookName || !*lookName) @@ -1913,14 +1888,14 @@ void Config::validate() const if (!fromScene) { getImpl()->m_validationtext = "Config failed validation. If there are view_transforms, " - "at least one must use the scene reference space."; + "at least one must use the scene reference space."; throw Exception(getImpl()->m_validationtext.c_str()); } } else if (hasDisplayReferredColorspace) { getImpl()->m_validationtext = "Config failed validation. If there are display-referred " - "color spaces, there must be view_transforms."; + "color spaces, there must be view_transforms."; throw Exception(getImpl()->m_validationtext.c_str()); } @@ -1978,7 +1953,8 @@ void Config::validate() const const char * path = getImpl()->m_context->getSearchPath(idx); if (!path || !*path) { - errMsg += " The search_path must not be an empty string if there are FileTransforms."; + errMsg += " The search_path must not be an empty string if there are " + "FileTransforms."; continue; } @@ -2028,7 +2004,7 @@ void Config::validate() const std::ostringstream oss; oss << "Config failed validation expanding file transform paths. "; oss << "The file transform source cannot be resolved: '"; - + if (file != resolvedFile) { oss << file << "' vs. '" << resolvedFile << "'."; @@ -2082,7 +2058,6 @@ void Config::validate() const getImpl()->checkVersionConsistency(); - // Everything is groovy. getImpl()->m_validation = Impl::VALIDATION_PASSED; } @@ -2114,7 +2089,7 @@ char Config::GetDefaultFamilySeparator() noexcept void Config::setFamilySeparator(char separator) { const int val = (int)separator; - if (val!=0 && (val<32 || val>126)) + if (val != 0 && (val < 32 || val > 126)) { std::string err("Invalid family separator '"); err += separator; @@ -2162,7 +2137,8 @@ void Config::addEnvironmentVar(const char * name, const char * defaultValue) else { StringMap::const_iterator iter = getImpl()->m_env.find(std::string(name)); - if(iter != getImpl()->m_env.end()) getImpl()->m_env.erase(iter); + if (iter != getImpl()->m_env.end()) + getImpl()->m_env.erase(iter); getImpl()->m_context->setStringVar(name, nullptr); } @@ -2177,15 +2153,18 @@ int Config::getNumEnvironmentVars() const const char * Config::getEnvironmentVarNameByIndex(int index) const { - if(index < 0 || index >= (int)getImpl()->m_env.size()) return ""; + if (index < 0 || index >= (int)getImpl()->m_env.size()) + return ""; StringMap::const_iterator iter = getImpl()->m_env.begin(); - for(int i = 0; i < index; ++i) ++iter; + for (int i = 0; i < index; ++i) + ++iter; return iter->first.c_str(); } const char * Config::getEnvironmentVarDefault(const char * name) const { - if (!name || !*name) return ""; + if (!name || !*name) + return ""; return LookupEnvironment(getImpl()->m_env, name); } @@ -2252,7 +2231,8 @@ void Config::clearSearchPaths() void Config::addSearchPath(const char * path) { - if (!path || !*path) return; + if (!path || !*path) + return; getImpl()->m_context->addSearchPath(path); AutoMutex lock(getImpl()->m_cacheidMutex); @@ -2272,7 +2252,6 @@ void Config::setWorkingDir(const char * dirname) getImpl()->resetCacheIDs(); } - /////////////////////////////////////////////////////////////////////////// ColorSpaceSetRcPtr Config::getColorSpaces(const char * category) const @@ -2281,11 +2260,11 @@ ColorSpaceSetRcPtr Config::getColorSpaces(const char * category) const // Loop on the list of active color spaces. - for(int idx=0; idxm_allColorSpaces->getColorSpace(csName); - if(!category || !*category || cs->hasCategory(category)) + if (!category || !*category || cs->hasCategory(category)) { res->addColorSpace(cs); } @@ -2300,81 +2279,84 @@ bool MatchReferenceType(SearchReferenceSpaceType st, ReferenceSpaceType t) { switch (st) { - case SEARCH_REFERENCE_SPACE_SCENE: - return t == REFERENCE_SPACE_SCENE; - case SEARCH_REFERENCE_SPACE_DISPLAY: - return t == REFERENCE_SPACE_DISPLAY; - case SEARCH_REFERENCE_SPACE_ALL: - return true; + case SEARCH_REFERENCE_SPACE_SCENE: + return t == REFERENCE_SPACE_SCENE; + case SEARCH_REFERENCE_SPACE_DISPLAY: + return t == REFERENCE_SPACE_DISPLAY; + case SEARCH_REFERENCE_SPACE_ALL: + return true; } return false; } -} +} // namespace -int Config::getNumColorSpaces(SearchReferenceSpaceType searchReferenceType, - ColorSpaceVisibility visibility) const +int Config::getNumColorSpaces( + SearchReferenceSpaceType searchReferenceType, + ColorSpaceVisibility visibility) const { int res = 0; switch (visibility) { - case COLORSPACE_ALL: - { - const int nbCS = getImpl()->m_allColorSpaces->getNumColorSpaces(); - if (searchReferenceType == SEARCH_REFERENCE_SPACE_ALL) + case COLORSPACE_ALL: { - return nbCS; - } - for (int i = 0; i < nbCS; ++i) - { - auto cs = getImpl()->m_allColorSpaces->getColorSpaceByIndex(i); - if (MatchReferenceType(searchReferenceType, cs->getReferenceSpaceType())) + const int nbCS = getImpl()->m_allColorSpaces->getNumColorSpaces(); + if (searchReferenceType == SEARCH_REFERENCE_SPACE_ALL) { - ++res; + return nbCS; } - } - break; - } - case COLORSPACE_ACTIVE: - { - const size_t nbCS = getImpl()->m_activeColorSpaceNames.size(); - if (searchReferenceType == SEARCH_REFERENCE_SPACE_ALL) - { - return (int)nbCS; - } - for (auto csname : getImpl()->m_activeColorSpaceNames) - { - auto cs = getColorSpace(csname.c_str()); - if (MatchReferenceType(searchReferenceType, cs->getReferenceSpaceType())) + for (int i = 0; i < nbCS; ++i) { - ++res; + auto cs = getImpl()->m_allColorSpaces->getColorSpaceByIndex(i); + if (MatchReferenceType(searchReferenceType, cs->getReferenceSpaceType())) + { + ++res; + } } + break; } - break; - } - case COLORSPACE_INACTIVE: - { - const auto ics = getImpl()->m_inactiveColorSpaceNames.size(); - if (searchReferenceType == SEARCH_REFERENCE_SPACE_ALL) + case COLORSPACE_ACTIVE: { - return (int)ics; + const size_t nbCS = getImpl()->m_activeColorSpaceNames.size(); + if (searchReferenceType == SEARCH_REFERENCE_SPACE_ALL) + { + return (int)nbCS; + } + for (auto csname : getImpl()->m_activeColorSpaceNames) + { + auto cs = getColorSpace(csname.c_str()); + if (MatchReferenceType(searchReferenceType, cs->getReferenceSpaceType())) + { + ++res; + } + } + break; } - for (auto csname : getImpl()->m_inactiveColorSpaceNames) + case COLORSPACE_INACTIVE: { - auto cs = getColorSpace(csname.c_str()); - if (MatchReferenceType(searchReferenceType, cs->getReferenceSpaceType())) + const auto ics = getImpl()->m_inactiveColorSpaceNames.size(); + if (searchReferenceType == SEARCH_REFERENCE_SPACE_ALL) + { + return (int)ics; + } + for (auto csname : getImpl()->m_inactiveColorSpaceNames) { - ++res; + auto cs = getColorSpace(csname.c_str()); + if (MatchReferenceType(searchReferenceType, cs->getReferenceSpaceType())) + { + ++res; + } } + break; } - break; - } } return res; } -const char * Config::getColorSpaceNameByIndex(SearchReferenceSpaceType searchReferenceType, - ColorSpaceVisibility visibility, int index) const +const char * Config::getColorSpaceNameByIndex( + SearchReferenceSpaceType searchReferenceType, + ColorSpaceVisibility visibility, + int index) const { if (index < 0) { @@ -2384,92 +2366,92 @@ const char * Config::getColorSpaceNameByIndex(SearchReferenceSpaceType searchRef int current = 0; switch (visibility) { - case COLORSPACE_ALL: - { - if (searchReferenceType == SEARCH_REFERENCE_SPACE_ALL) + case COLORSPACE_ALL: { - if (index < getImpl()->m_allColorSpaces->getNumColorSpaces()) - { - return getImpl()->m_allColorSpaces->getColorSpaceNameByIndex(index); - } - else + if (searchReferenceType == SEARCH_REFERENCE_SPACE_ALL) { - return ""; + if (index < getImpl()->m_allColorSpaces->getNumColorSpaces()) + { + return getImpl()->m_allColorSpaces->getColorSpaceNameByIndex(index); + } + else + { + return ""; + } } - } - const int nbCS = getImpl()->m_allColorSpaces->getNumColorSpaces(); - for (int i = 0; i < nbCS; ++i) - { - auto cs = getImpl()->m_allColorSpaces->getColorSpaceByIndex(i); - if (MatchReferenceType(searchReferenceType, cs->getReferenceSpaceType())) + const int nbCS = getImpl()->m_allColorSpaces->getNumColorSpaces(); + for (int i = 0; i < nbCS; ++i) { - if (current == index) + auto cs = getImpl()->m_allColorSpaces->getColorSpaceByIndex(i); + if (MatchReferenceType(searchReferenceType, cs->getReferenceSpaceType())) { - return cs->getName(); + if (current == index) + { + return cs->getName(); + } + ++current; } - ++current; } + break; } - break; - } - case COLORSPACE_ACTIVE: - { - if (searchReferenceType == SEARCH_REFERENCE_SPACE_ALL) + case COLORSPACE_ACTIVE: { - if (index < (int)getImpl()->m_activeColorSpaceNames.size()) + if (searchReferenceType == SEARCH_REFERENCE_SPACE_ALL) { - return getImpl()->m_activeColorSpaceNames[index].c_str(); - } - else - { - return ""; + if (index < (int)getImpl()->m_activeColorSpaceNames.size()) + { + return getImpl()->m_activeColorSpaceNames[index].c_str(); + } + else + { + return ""; + } } - } - const int nbCS = (int)getImpl()->m_activeColorSpaceNames.size(); - for (int i = 0; i < nbCS; ++i) - { - auto csname = getImpl()->m_activeColorSpaceNames[i]; - auto cs = getColorSpace(csname.c_str()); - if (MatchReferenceType(searchReferenceType, cs->getReferenceSpaceType())) + const int nbCS = (int)getImpl()->m_activeColorSpaceNames.size(); + for (int i = 0; i < nbCS; ++i) { - if (current == index) + auto csname = getImpl()->m_activeColorSpaceNames[i]; + auto cs = getColorSpace(csname.c_str()); + if (MatchReferenceType(searchReferenceType, cs->getReferenceSpaceType())) { - return cs->getName(); + if (current == index) + { + return cs->getName(); + } + ++current; } - ++current; } + break; } - break; - } - case COLORSPACE_INACTIVE: - { - if (searchReferenceType == SEARCH_REFERENCE_SPACE_ALL) + case COLORSPACE_INACTIVE: { - if (index < (int)getImpl()->m_inactiveColorSpaceNames.size()) - { - return getImpl()->m_inactiveColorSpaceNames[index].c_str(); - } - else + if (searchReferenceType == SEARCH_REFERENCE_SPACE_ALL) { - return ""; + if (index < (int)getImpl()->m_inactiveColorSpaceNames.size()) + { + return getImpl()->m_inactiveColorSpaceNames[index].c_str(); + } + else + { + return ""; + } } - } - const int nbCS = (int)getImpl()->m_inactiveColorSpaceNames.size(); - for (int i = 0; i < nbCS; ++i) - { - auto csname = getImpl()->m_inactiveColorSpaceNames[i]; - auto cs = getColorSpace(csname.c_str()); - if (MatchReferenceType(searchReferenceType, cs->getReferenceSpaceType())) + const int nbCS = (int)getImpl()->m_inactiveColorSpaceNames.size(); + for (int i = 0; i < nbCS; ++i) { - if (current == index) + auto csname = getImpl()->m_inactiveColorSpaceNames[i]; + auto cs = getColorSpace(csname.c_str()); + if (MatchReferenceType(searchReferenceType, cs->getReferenceSpaceType())) { - return cs->getName(); + if (current == index) + { + return cs->getName(); + } + ++current; } - ++current; } + break; } - break; - } } return ""; @@ -2515,11 +2497,12 @@ int Config::getIndexForColorSpace(const char * name) const } // Check to see if the name is an active color space. - for (int idx = 0; idx < getNumColorSpaces(SEARCH_REFERENCE_SPACE_ALL, - COLORSPACE_ACTIVE); ++idx) + for (int idx = 0; idx < getNumColorSpaces(SEARCH_REFERENCE_SPACE_ALL, COLORSPACE_ACTIVE); ++idx) { - if (strcmp(getColorSpaceNameByIndex(SEARCH_REFERENCE_SPACE_ALL, COLORSPACE_ACTIVE, idx), - cs->getName()) == 0) + if (strcmp( + getColorSpaceNameByIndex(SEARCH_REFERENCE_SPACE_ALL, COLORSPACE_ACTIVE, idx), + cs->getName()) + == 0) { return idx; } @@ -2568,7 +2551,8 @@ void Config::addColorSpace(const ConstColorSpaceRcPtr & original) if (hasRole(name.c_str())) { std::ostringstream os; - os << "Cannot add '" << name << "' color space, there is already a role with this " + os << "Cannot add '" << name + << "' color space, there is already a role with this " "name."; throw Exception(os.str().c_str()); } @@ -2576,8 +2560,10 @@ void Config::addColorSpace(const ConstColorSpaceRcPtr & original) if (nt) { std::ostringstream os; - os << "Cannot add '" << name << "' color space, there is already a named transform using " - "this name as a name or as an alias: '" << nt->getName() << "'."; + os << "Cannot add '" << name + << "' color space, there is already a named transform using " + "this name as a name or as an alias: '" + << nt->getName() << "'."; throw Exception(os.str().c_str()); } @@ -2608,14 +2594,15 @@ void Config::addColorSpace(const ConstColorSpaceRcPtr & original) std::ostringstream os; os << "Cannot add '" << name << "' color space, it has an alias '" << alias << "' and there is already a named transform using this name as a name or as " - "an alias: '" << nt->getName() << "'."; + "an alias: '" + << nt->getName() << "'."; throw Exception(os.str().c_str()); } if (ContainsContextVariableToken(alias)) { std::ostringstream os; os << "Cannot add '" << name << "' color space, it has an alias '" << alias - << "' that cannot contain a context variable reserved token i.e. % or $."; + << "' that cannot contain a context variable reserved token i.e. % or $."; throw Exception(os.str().c_str()); } @@ -2644,7 +2631,8 @@ bool Config::isColorSpaceUsed(const char * name) const noexcept // for example, in a display/view, look, or ColorSpaceTransform. If the color space is // defined in the config, but not used elsewhere, this function returns false. - if (!name || !*name) return false; + if (!name || !*name) + return false; // Check for all color spaces, looks and view transforms. @@ -2672,7 +2660,7 @@ bool Config::isColorSpaceUsed(const char * name) const noexcept for (int idx = 0; idx < numRoles; ++idx) { const char * roleName = getRoleName(idx); - const char * csName = LookupRole(getImpl()->m_roles, roleName); + const char * csName = LookupRole(getImpl()->m_roles, roleName); if (0 == Platform::Strcasecmp(csName, name)) { return true; @@ -2698,7 +2686,7 @@ bool Config::isColorSpaceUsed(const char * name) const noexcept for (const auto & view : display.second.m_views) { const char * viewName = view.m_name.c_str(); - const char * csName = getDisplayViewColorSpaceName(dispName, viewName); + const char * csName = getDisplayViewColorSpaceName(dispName, viewName); if (0 == Platform::Strcasecmp(csName, name)) { return true; @@ -2709,8 +2697,7 @@ bool Config::isColorSpaceUsed(const char * name) const noexcept auto viewIt = FindView(getImpl()->m_sharedViews, sharedView); if (viewIt != getImpl()->m_sharedViews.end()) { - if (!((*viewIt).m_viewTransform.empty()) && - (*viewIt).useDisplayNameForColorspace()) + if (!((*viewIt).m_viewTransform.empty()) && (*viewIt).useDisplayNameForColorspace()) { if (0 == Platform::Strcasecmp(dispName, name)) { @@ -2763,15 +2750,17 @@ void Config::clearColorSpaces() /////////////////////////////////////////////////////////////////////////// -bool Config::isColorSpaceLinear(const char * colorSpace, ReferenceSpaceType referenceSpaceType) const +bool Config::isColorSpaceLinear(const char * colorSpace, ReferenceSpaceType referenceSpaceType) + const { auto cs = getColorSpace(colorSpace); if (cs == nullptr) { std::ostringstream os; - os << "Could not test colorspace linearity. Colorspace " << colorSpace << " does not exist."; - throw Exception(os.str().c_str()); + os << "Could not test colorspace linearity. Colorspace " << colorSpace + << " does not exist."; + throw Exception(os.str().c_str()); } if (cs->isData()) @@ -2788,11 +2777,11 @@ bool Config::isColorSpaceLinear(const char * colorSpace, ReferenceSpaceType refe std::string encoding = cs->getEncoding(); if (!encoding.empty()) { - // Check the encoding value if it is set. - if ((StringUtils::Compare(cs->getEncoding(), "scene-linear") && - referenceSpaceType == REFERENCE_SPACE_SCENE) || - (StringUtils::Compare(cs->getEncoding(), "display-linear") && - referenceSpaceType == REFERENCE_SPACE_DISPLAY)) + // Check the encoding value if it is set. + if ((StringUtils::Compare(cs->getEncoding(), "scene-linear") + && referenceSpaceType == REFERENCE_SPACE_SCENE) + || (StringUtils::Compare(cs->getEncoding(), "display-linear") + && referenceSpaceType == REFERENCE_SPACE_DISPLAY)) { return true; } @@ -2802,11 +2791,11 @@ bool Config::isColorSpaceLinear(const char * colorSpace, ReferenceSpaceType refe } } - // We want to assess linearity over at least a reasonable range of values, so use a very dark - // value and a very bright value. Test neutral, red, green, and blue points to detect situations + // We want to assess linearity over at least a reasonable range of values, so use a very dark + // value and a very bright value. Test neutral, red, green, and blue points to detect situations // where the neutral may be linear but there is non-linearity off the neutral axis. - auto evaluate = [](const Config & config, ConstTransformRcPtr &t) -> bool - { + auto evaluate = [](const Config & config, ConstTransformRcPtr & t) -> bool { + // clang-format off std::vector img = { 0.0625f, 0.0625f, 0.0625f, 4.f, 4.f, 4.f, @@ -2814,14 +2803,14 @@ bool Config::isColorSpaceLinear(const char * colorSpace, ReferenceSpaceType refe 0.f, 0.0625f, 0.f, 0.f, 4.f, 0.f, 0.f, 0.f, 0.0625f, 0.f, 0.f, 4.f }; + // clang-format on std::vector dst(img.size(), 0.f); PackedImageDesc desc(&img[0], 8, 1, CHANNEL_ORDERING_RGB); PackedImageDesc descDst(&dst[0], 8, 1, CHANNEL_ORDERING_RGB); - auto procToReference = config.getImpl()->getProcessorWithoutCaching( - config, t, TRANSFORM_DIR_FORWARD - ); + auto procToReference + = config.getImpl()->getProcessorWithoutCaching(config, t, TRANSFORM_DIR_FORWARD); // TODO: It could be useful to try and avoid evaluating points through ops that are // expensive but highly unlikely to be linear (with inverse Lut3D being the prime example). @@ -2842,34 +2831,34 @@ bool Config::isColorSpaceLinear(const char * colorSpace, ReferenceSpaceType refe auto optCPUProc = procToReference->getOptimizedCPUProcessor(OPTIMIZATION_NONE); optCPUProc->apply(desc, descDst); - float absError = 1e-5f; - float multiplier = 64.f; - bool ret = true; + float absError = 1e-5f; + float multiplier = 64.f; + bool ret = true; // Test the first RGB pair. - ret &= EqualWithAbsError(dst[0]*multiplier, dst[3], absError); - ret &= EqualWithAbsError(dst[1]*multiplier, dst[4], absError); - ret &= EqualWithAbsError(dst[2]*multiplier, dst[5], absError); + ret &= EqualWithAbsError(dst[0] * multiplier, dst[3], absError); + ret &= EqualWithAbsError(dst[1] * multiplier, dst[4], absError); + ret &= EqualWithAbsError(dst[2] * multiplier, dst[5], absError); // Test the second RGB pair. - ret &= EqualWithAbsError(dst[6]*multiplier, dst[9], absError); - ret &= EqualWithAbsError(dst[7]*multiplier, dst[10], absError); - ret &= EqualWithAbsError(dst[8]*multiplier, dst[11], absError); + ret &= EqualWithAbsError(dst[6] * multiplier, dst[9], absError); + ret &= EqualWithAbsError(dst[7] * multiplier, dst[10], absError); + ret &= EqualWithAbsError(dst[8] * multiplier, dst[11], absError); // Test the third RGB pair. - ret &= EqualWithAbsError(dst[12]*multiplier, dst[15], absError); - ret &= EqualWithAbsError(dst[13]*multiplier, dst[16], absError); - ret &= EqualWithAbsError(dst[14]*multiplier, dst[17], absError); + ret &= EqualWithAbsError(dst[12] * multiplier, dst[15], absError); + ret &= EqualWithAbsError(dst[13] * multiplier, dst[16], absError); + ret &= EqualWithAbsError(dst[14] * multiplier, dst[17], absError); // Test the fourth RGB pair. - ret &= EqualWithAbsError(dst[18]*multiplier, dst[21], absError); - ret &= EqualWithAbsError(dst[19]*multiplier, dst[22], absError); - ret &= EqualWithAbsError(dst[20]*multiplier, dst[23], absError); + ret &= EqualWithAbsError(dst[18] * multiplier, dst[21], absError); + ret &= EqualWithAbsError(dst[19] * multiplier, dst[22], absError); + ret &= EqualWithAbsError(dst[20] * multiplier, dst[23], absError); return ret; }; - - ConstTransformRcPtr transformToReference = cs->getTransform(COLORSPACE_DIR_TO_REFERENCE); + + ConstTransformRcPtr transformToReference = cs->getTransform(COLORSPACE_DIR_TO_REFERENCE); ConstTransformRcPtr transformFromReference = cs->getTransform(COLORSPACE_DIR_FROM_REFERENCE); if ((transformToReference && transformFromReference) || transformToReference) { @@ -2882,35 +2871,36 @@ bool Config::isColorSpaceLinear(const char * colorSpace, ReferenceSpaceType refe return evaluate(*this, transformFromReference); } - // Color space matches the desired reference space type, is not a data space, and has no + // Color space matches the desired reference space type, is not a data space, and has no // transforms, so it is equivalent to the reference space and hence linear. return true; } -void Config::IdentifyInterchangeSpace(const char ** srcInterchange, - const char ** builtinInterchange, - const ConstConfigRcPtr & srcConfig, - const char * srcColorSpaceName, - const ConstConfigRcPtr & builtinConfig, - const char * builtinColorSpaceName) +void Config::IdentifyInterchangeSpace( + const char ** srcInterchange, + const char ** builtinInterchange, + const ConstConfigRcPtr & srcConfig, + const char * srcColorSpaceName, + const ConstConfigRcPtr & builtinConfig, + const char * builtinColorSpaceName) { // This will throw if it is unable to identify the interchange spaces. - ConfigUtils::IdentifyInterchangeSpace(srcInterchange, - builtinInterchange, - srcConfig, - srcColorSpaceName, - builtinConfig, - builtinColorSpaceName); + ConfigUtils::IdentifyInterchangeSpace( + srcInterchange, + builtinInterchange, + srcConfig, + srcColorSpaceName, + builtinConfig, + builtinColorSpaceName); } -const char * Config::IdentifyBuiltinColorSpace(const ConstConfigRcPtr & srcConfig, - const ConstConfigRcPtr & builtinConfig, - const char * builtinColorSpaceName) +const char * Config::IdentifyBuiltinColorSpace( + const ConstConfigRcPtr & srcConfig, + const ConstConfigRcPtr & builtinConfig, + const char * builtinColorSpaceName) { // This will throw if it is unable to identify the interchange spaces. - return ConfigUtils::IdentifyBuiltinColorSpace(srcConfig, - builtinConfig, - builtinColorSpaceName); + return ConfigUtils::IdentifyBuiltinColorSpace(srcConfig, builtinConfig, builtinColorSpaceName); } /////////////////////////////////////////////////////////////////////////// @@ -2920,16 +2910,16 @@ const char * Config::parseColorSpaceFromString(const char * str) const int rightMostColorSpaceIndex = ParseColorSpaceFromString(*this, str); // Index is using all color spaces. - if(rightMostColorSpaceIndex>=0) + if (rightMostColorSpaceIndex >= 0) { return getImpl()->m_allColorSpaces->getColorSpaceNameByIndex(rightMostColorSpaceIndex); } - if(!getImpl()->m_strictParsing) + if (!getImpl()->m_strictParsing) { // Is a default role defined? - const char* csname = LookupRole(getImpl()->m_roles, ROLE_DEFAULT); - if(csname && *csname) + const char * csname = LookupRole(getImpl()->m_roles, ROLE_DEFAULT); + if (csname && *csname) { const int csindex = getImpl()->getColorSpaceIndex(csname); if (-1 != csindex) @@ -2972,15 +2962,17 @@ void Config::setRole(const char * role, const char * colorSpaceName) if (getColorSpace(role)) { std::ostringstream os; - os << "Cannot add '" << role << "' role, there is already a color space using this " - "as a name or an alias."; + os << "Cannot add '" << role + << "' role, there is already a color space using this " + "as a name or an alias."; throw Exception(os.str().c_str()); } if (getNamedTransform(role)) { std::ostringstream os; - os << "Cannot add '" << role << "' role, there is already a named transform using " - "this as a name or an alias."; + os << "Cannot add '" << role + << "' role, there is already a named transform using " + "this as a name or an alias."; throw Exception(os.str().c_str()); } if (getMajorVersion() >= 2 && ContainsContextVariableToken(role)) @@ -2990,7 +2982,6 @@ void Config::setRole(const char * role, const char * colorSpaceName) << "' cannot contain a context variable reserved token i.e. % or $."; throw Exception(os.str().c_str()); } - } getImpl()->m_roles[StringUtils::Lower(role)] = std::string(colorSpaceName); } @@ -2998,7 +2989,7 @@ void Config::setRole(const char * role, const char * colorSpaceName) else { StringMap::iterator iter = getImpl()->m_roles.find(StringUtils::Lower(role)); - if(iter != getImpl()->m_roles.end()) + if (iter != getImpl()->m_roles.end()) { getImpl()->m_roles.erase(iter); } @@ -3015,16 +3006,19 @@ int Config::getNumRoles() const bool Config::hasRole(const char * role) const { - if (!role || !*role) return false; - const char* rname = LookupRole(getImpl()->m_roles, role); - return rname && *rname; + if (!role || !*role) + return false; + const char * rname = LookupRole(getImpl()->m_roles, role); + return rname && *rname; } const char * Config::getRoleName(int index) const { - if(index < 0 || index >= (int)getImpl()->m_roles.size()) return ""; + if (index < 0 || index >= (int)getImpl()->m_roles.size()) + return ""; StringMap::const_iterator iter = getImpl()->m_roles.begin(); - for(int i = 0; i < index; ++i) ++iter; + for (int i = 0; i < index; ++i) + ++iter; return iter->first.c_str(); } @@ -3035,7 +3029,8 @@ const char * Config::getRoleColorSpace(int index) const const char * Config::getRoleColorSpace(const char * roleName) const noexcept { - if (!roleName || !roleName[0]) return ""; + if (!roleName || !roleName[0]) + return ""; return LookupRole(getImpl()->m_roles, roleName); } @@ -3043,35 +3038,33 @@ const char * Config::getRoleColorSpace(const char * roleName) const noexcept // // Named Transforms - int Config::getNumNamedTransforms(NamedTransformVisibility visibility) const noexcept { int res = 0; switch (visibility) { - case NAMEDTRANSFORM_ALL: - { - res = (int)getImpl()->m_allNamedTransforms.size(); - break; - } - case NAMEDTRANSFORM_ACTIVE: - { - res = (int)getImpl()->m_activeNamedTransformNames.size(); - break; - } - case NAMEDTRANSFORM_INACTIVE: - { - res = (int)getImpl()->m_inactiveNamedTransformNames.size(); - break; - } + case NAMEDTRANSFORM_ALL: + { + res = (int)getImpl()->m_allNamedTransforms.size(); + break; + } + case NAMEDTRANSFORM_ACTIVE: + { + res = (int)getImpl()->m_activeNamedTransformNames.size(); + break; + } + case NAMEDTRANSFORM_INACTIVE: + { + res = (int)getImpl()->m_inactiveNamedTransformNames.size(); + break; + } } return res; - } -const char * Config::getNamedTransformNameByIndex(NamedTransformVisibility visibility, - int index) const noexcept +const char * Config::getNamedTransformNameByIndex(NamedTransformVisibility visibility, int index) + const noexcept { if (index < 0) { @@ -3080,30 +3073,30 @@ const char * Config::getNamedTransformNameByIndex(NamedTransformVisibility visib switch (visibility) { - case NAMEDTRANSFORM_ALL: - { - if (index < (int)getImpl()->m_allNamedTransforms.size()) + case NAMEDTRANSFORM_ALL: { - return getImpl()->m_allNamedTransforms[index]->getName(); + if (index < (int)getImpl()->m_allNamedTransforms.size()) + { + return getImpl()->m_allNamedTransforms[index]->getName(); + } + return ""; } - return ""; - } - case NAMEDTRANSFORM_ACTIVE: - { - if (index < (int)getImpl()->m_activeNamedTransformNames.size()) + case NAMEDTRANSFORM_ACTIVE: { - return getImpl()->m_activeNamedTransformNames[index].c_str(); + if (index < (int)getImpl()->m_activeNamedTransformNames.size()) + { + return getImpl()->m_activeNamedTransformNames[index].c_str(); + } + return ""; } - return ""; - } - case NAMEDTRANSFORM_INACTIVE: - { - if (index < (int)getImpl()->m_inactiveNamedTransformNames.size()) + case NAMEDTRANSFORM_INACTIVE: { - return getImpl()->m_inactiveNamedTransformNames[index].c_str(); + if (index < (int)getImpl()->m_inactiveNamedTransformNames.size()) + { + return getImpl()->m_inactiveNamedTransformNames[index].c_str(); + } + return ""; } - return ""; - } } return ""; @@ -3145,7 +3138,6 @@ int Config::getIndexForNamedTransform(const char * name) const noexcept // Requests for an inactive named transform or an inactive color space will both fail. return -1; - } void Config::addNamedTransform(const ConstNamedTransformRcPtr & nt) @@ -3159,8 +3151,7 @@ void Config::addNamedTransform(const ConstNamedTransformRcPtr & nt) { throw Exception("Named transform must have a non-empty name."); } - if (!nt->getTransform(TRANSFORM_DIR_FORWARD) && - !nt->getTransform(TRANSFORM_DIR_INVERSE)) + if (!nt->getTransform(TRANSFORM_DIR_FORWARD) && !nt->getTransform(TRANSFORM_DIR_INVERSE)) { throw Exception("Named transform must define at least one transform."); } @@ -3168,7 +3159,8 @@ void Config::addNamedTransform(const ConstNamedTransformRcPtr & nt) if (hasRole(name.c_str())) { std::ostringstream os; - os << "Cannot add '" << name << "' named transform, there is already a role with this " + os << "Cannot add '" << name + << "' named transform, there is already a role with this " "name."; throw Exception(os.str().c_str()); } @@ -3176,8 +3168,10 @@ void Config::addNamedTransform(const ConstNamedTransformRcPtr & nt) if (cs) { std::ostringstream os; - os << "Cannot add '" << name << "' named transform, there is already a color space using " - "this name as a name or as an alias: '" << cs->getName() << "'."; + os << "Cannot add '" << name + << "' named transform, there is already a color space using " + "this name as a name or as an alias: '" + << cs->getName() << "'."; throw Exception(os.str().c_str()); } @@ -3193,10 +3187,10 @@ void Config::addNamedTransform(const ConstNamedTransformRcPtr & nt) size_t existing = getImpl()->getNamedTransformIndex(name.c_str()); size_t replaceIdx = (size_t)-1; - const auto numNT = getImpl()->m_allNamedTransforms.size(); + const auto numNT = getImpl()->m_allNamedTransforms.size(); if (existing < numNT) { - const std::string existingName{ getImpl()->m_allNamedTransforms[existing]->getName() }; + const std::string existingName{getImpl()->m_allNamedTransforms[existing]->getName()}; if (!StringUtils::Compare(existingName, name)) { std::ostringstream os; @@ -3227,7 +3221,8 @@ void Config::addNamedTransform(const ConstNamedTransformRcPtr & nt) std::ostringstream os; os << "Cannot add '" << name << "' named transform, it has an alias '" << alias << "' and there is already a color space using this name as a name or as " - "an alias: '" << cs->getName() << "'."; + "an alias: '" + << cs->getName() << "'."; throw Exception(os.str().c_str()); } if (ContainsContextVariableToken(alias)) @@ -3244,7 +3239,7 @@ void Config::addNamedTransform(const ConstNamedTransformRcPtr & nt) // Skip existing named transform that might be replaced. if (existing != replaceIdx && existing < numNT) { - const std::string existingName{ getImpl()->m_allNamedTransforms[existing]->getName() }; + const std::string existingName{getImpl()->m_allNamedTransforms[existing]->getName()}; std::ostringstream os; os << "Cannot add '" << name << "' named transform, it has '" << alias; os << "' alias and existing named transform, '"; @@ -3255,7 +3250,7 @@ void Config::addNamedTransform(const ConstNamedTransformRcPtr & nt) if (replaceIdx < numNT) { - const std::string existingName{ getImpl()->m_allNamedTransforms[replaceIdx]->getName() }; + const std::string existingName{getImpl()->m_allNamedTransforms[replaceIdx]->getName()}; if (!StringUtils::Compare(existingName, name)) { std::ostringstream os; @@ -3263,14 +3258,14 @@ void Config::addNamedTransform(const ConstNamedTransformRcPtr & nt) os << existingName << "' is using this name as an alias."; throw Exception(os.str().c_str()); } - NamedTransformRcPtr copy = nt->createEditableCopy(); + NamedTransformRcPtr copy = nt->createEditableCopy(); ConstNamedTransformRcPtr namedTransformCopy = copy; // Safe to swap, copy is not used after. getImpl()->m_allNamedTransforms[replaceIdx].swap(namedTransformCopy); } else { - NamedTransformRcPtr copy = nt->createEditableCopy(); + NamedTransformRcPtr copy = nt->createEditableCopy(); ConstNamedTransformRcPtr namedTransformCopy = copy; getImpl()->m_allNamedTransforms.push_back(namedTransformCopy); } @@ -3291,7 +3286,6 @@ void Config::clearNamedTransforms() // // Display/View Registration - ConstViewingRulesRcPtr Config::getViewingRules() const noexcept { return getImpl()->m_viewingRules; @@ -3305,9 +3299,13 @@ void Config::setViewingRules(ConstViewingRulesRcPtr viewingRules) getImpl()->resetCacheIDs(); } -void Config::addSharedView(const char * view, const char * viewTransform, - const char * colorSpace, const char * looks, - const char * rule, const char * description) +void Config::addSharedView( + const char * view, + const char * viewTransform, + const char * colorSpace, + const char * looks, + const char * rule, + const char * description) { if (!view || !*view) { @@ -3338,7 +3336,7 @@ void Config::removeSharedView(const char * view) "a non-empty name."); } ViewVec & views = getImpl()->m_sharedViews; - auto viewIt = FindView(views, view); + auto viewIt = FindView(views, view); if (viewIt != views.end()) { @@ -3352,8 +3350,8 @@ void Config::removeSharedView(const char * view) else { std::ostringstream os; - os << "Shared view could not be removed from config. A shared view named '" - << view << "' could be be found."; + os << "Shared view could not be removed from config. A shared view named '" << view + << "' could be be found."; throw Exception(os.str().c_str()); } } @@ -3374,7 +3372,7 @@ const char * Config::getDisplay(int index) const { getImpl()->updateDisplayCache(); - if(index>=0 && index < static_cast(getImpl()->m_displayCache.size())) + if (index >= 0 && index < static_cast(getImpl()->m_displayCache.size())) { return getImpl()->m_displayCache[index].c_str(); } @@ -3394,29 +3392,33 @@ const char * Config::getDefaultView(const char * display, const char * colorspac int Config::getNumViews(const char * display) const { - if (!display || !*display) return 0; + if (!display || !*display) + return 0; DisplayMap::const_iterator iter = FindDisplay(getImpl()->m_displays, display); - if(iter == getImpl()->m_displays.end()) return 0; + if (iter == getImpl()->m_displays.end()) + return 0; const ViewPtrVec views = getImpl()->getViews(iter->second); - const StringUtils::StringVec masterViews{ GetViewNames(views) }; + const StringUtils::StringVec masterViews{GetViewNames(views)}; StringUtils::StringVec activeViews = getImpl()->getActiveViews(masterViews); return static_cast(activeViews.size()); } const char * Config::getView(const char * display, int index) const { - if (!display || !*display) return ""; + if (!display || !*display) + return ""; // Include all displays, do not limit to active displays. Consider active views only. DisplayMap::const_iterator iter = FindDisplay(getImpl()->m_displays, display); - if(iter == getImpl()->m_displays.end()) return ""; + if (iter == getImpl()->m_displays.end()) + return ""; const ViewPtrVec views = getImpl()->getViews(iter->second); - const StringUtils::StringVec masterViews{ GetViewNames(views) }; + const StringUtils::StringVec masterViews{GetViewNames(views)}; StringUtils::StringVec activeViews = getImpl()->getActiveViews(masterViews); if (index < 0 || static_cast(index) >= activeViews.size()) @@ -3425,7 +3427,7 @@ const char * Config::getView(const char * display, int index) const } int idx = FindInStringVecCaseIgnore(masterViews, activeViews[index]); - if(idx >= 0 && static_cast(idx) < views.size()) + if (idx >= 0 && static_cast(idx) < views.size()) { return views[idx]->m_name.c_str(); } @@ -3435,34 +3437,36 @@ const char * Config::getView(const char * display, int index) const int Config::getNumViews(const char * display, const char * colorspace) const { - if (!display || !*display || !colorspace || !*colorspace) return 0; + if (!display || !*display || !colorspace || !*colorspace) + return 0; DisplayMap::const_iterator iter = FindDisplay(getImpl()->m_displays, display); - if (iter == getImpl()->m_displays.end()) return 0; + if (iter == getImpl()->m_displays.end()) + return 0; const ViewPtrVec views = getImpl()->getViews(iter->second); StringUtils::StringVec viewNames; - const StringUtils::StringVec filteredViews{ getImpl()->getFilteredViews(viewNames, - views, - colorspace) }; + const StringUtils::StringVec filteredViews{ + getImpl()->getFilteredViews(viewNames, views, colorspace)}; return static_cast(filteredViews.size()); } const char * Config::getView(const char * display, const char * colorspace, int index) const { - if (!display || !*display || !colorspace || !*colorspace) return ""; + if (!display || !*display || !colorspace || !*colorspace) + return ""; DisplayMap::const_iterator iter = FindDisplay(getImpl()->m_displays, display); - if (iter == getImpl()->m_displays.end()) return ""; + if (iter == getImpl()->m_displays.end()) + return ""; const ViewPtrVec views = getImpl()->getViews(iter->second); StringUtils::StringVec viewNames; - const StringUtils::StringVec filteredViews{ getImpl()->getFilteredViews(viewNames, - views, - colorspace) }; + const StringUtils::StringVec filteredViews{ + getImpl()->getFilteredViews(viewNames, views, colorspace)}; int idx = index; if (!filteredViews.empty()) @@ -3491,7 +3495,8 @@ const char * Config::getDisplayViewTransformName(const char * display, const cha { const View * viewPtr = getImpl()->getView(display, view); - if (!viewPtr) return ""; + if (!viewPtr) + return ""; return viewPtr->m_viewTransform.c_str(); } @@ -3499,7 +3504,8 @@ const char * Config::getDisplayViewColorSpaceName(const char * display, const ch { const View * viewPtr = getImpl()->getView(display, view); - if (!viewPtr) return ""; + if (!viewPtr) + return ""; return viewPtr->m_colorspace.c_str(); } @@ -3507,7 +3513,8 @@ const char * Config::getDisplayViewLooks(const char * display, const char * view { const View * viewPtr = getImpl()->getView(display, view); - if (!viewPtr) return ""; + if (!viewPtr) + return ""; return viewPtr->m_looks.c_str(); } @@ -3518,7 +3525,8 @@ const char * Config::getDisplayViewRule(const char * display, const char * view) return viewPtr ? viewPtr->m_rule.c_str() : ""; } -const char * Config::getDisplayViewDescription(const char * display, const char * view) const noexcept +const char * Config::getDisplayViewDescription(const char * display, const char * view) + const noexcept { const View * viewPtr = getImpl()->getView(display, view); @@ -3538,19 +3546,19 @@ void Config::addDisplaySharedView(const char * display, const char * sharedView) "is needed."); } - bool invalidateCache = false; + bool invalidateCache = false; DisplayMap::iterator iter = FindDisplay(getImpl()->m_displays, display); if (iter == getImpl()->m_displays.end()) { const auto curSize = getImpl()->m_displays.size(); getImpl()->m_displays.resize(curSize + 1); getImpl()->m_displays[curSize].first = display; - iter = std::prev(getImpl()->m_displays.end()); - invalidateCache = true; + iter = std::prev(getImpl()->m_displays.end()); + invalidateCache = true; } const ViewVec & existingViews = iter->second.m_views; - auto viewIt = FindView(existingViews, sharedView); + auto viewIt = FindView(existingViews, sharedView); if (viewIt != existingViews.end()) { std::ostringstream os; @@ -3576,15 +3584,23 @@ void Config::addDisplaySharedView(const char * display, const char * sharedView) getImpl()->resetCacheIDs(); } -void Config::addDisplayView(const char * display, const char * view, - const char * colorSpace, const char * looks) +void Config::addDisplayView( + const char * display, + const char * view, + const char * colorSpace, + const char * looks) { addDisplayView(display, view, nullptr, colorSpace, looks, nullptr, nullptr); } -void Config::addDisplayView(const char * display, const char * view, const char * viewTransform, - const char * colorSpace, const char * looks, - const char * rule, const char * description) +void Config::addDisplayView( + const char * display, + const char * view, + const char * viewTransform, + const char * colorSpace, + const char * looks, + const char * rule, + const char * description) { if (!display || !*display) { @@ -3608,9 +3624,8 @@ void Config::addDisplayView(const char * display, const char * view, const char const auto curSize = getImpl()->m_displays.size(); getImpl()->m_displays.resize(curSize + 1); getImpl()->m_displays[curSize].first = display; - getImpl()->m_displays[curSize].second.m_views.push_back(View(view, viewTransform, - colorSpace, looks, rule, - description)); + getImpl()->m_displays[curSize].second.m_views.push_back( + View(view, viewTransform, colorSpace, looks, rule, description)); getImpl()->m_displayCache.clear(); } else @@ -3647,14 +3662,14 @@ void Config::removeDisplayView(const char * display, const char * view) // Check if the display exists. DisplayMap::iterator iter = FindDisplay(getImpl()->m_displays, display); - if (iter==getImpl()->m_displays.end()) + if (iter == getImpl()->m_displays.end()) { std::ostringstream os; os << "Could not find a display named '" << display << "' to be removed from config."; throw Exception(os.str().c_str()); } - ViewVec & views = iter->second.m_views; + ViewVec & views = iter->second.m_views; StringUtils::StringVec & sharedViews = iter->second.m_sharedViews; const std::string viewNameRef(view); @@ -3695,12 +3710,13 @@ void Config::clearDisplays() getImpl()->resetCacheIDs(); } -void Config::addVirtualDisplayView(const char * view, - const char * viewTransform, - const char * colorSpace, - const char * looks, - const char * rule, - const char * description) +void Config::addVirtualDisplayView( + const char * view, + const char * viewTransform, + const char * colorSpace, + const char * looks, + const char * rule, + const char * description) { if (!view || !*view) { @@ -3718,8 +3734,7 @@ void Config::addVirtualDisplayView(const char * view, if (iter != getImpl()->m_virtualDisplay.m_views.end()) { std::ostringstream oss; - oss << "View could not be added to virtual_display in config: View '" - << view + oss << "View could not be added to virtual_display in config: View '" << view << "' already exists."; throw Exception(oss.str().c_str()); } @@ -3744,8 +3759,7 @@ void Config::addVirtualDisplaySharedView(const char * sharedView) { std::ostringstream oss; oss << "Shared view could not be added to virtual_display: " - << "There is already a shared view named '" - << sharedView << "'."; + << "There is already a shared view named '" << sharedView << "'."; throw Exception(oss.str().c_str()); } @@ -3757,7 +3771,7 @@ void Config::addVirtualDisplaySharedView(const char * sharedView) int Config::getVirtualDisplayNumViews(ViewType type) const noexcept { - switch(type) + switch (type) { case VIEW_DISPLAY_DEFINED: return static_cast(getImpl()->m_virtualDisplay.m_views.size()); @@ -3770,7 +3784,7 @@ int Config::getVirtualDisplayNumViews(ViewType type) const noexcept const char * Config::getVirtualDisplayView(ViewType type, int index) const noexcept { - switch(type) + switch (type) { case VIEW_DISPLAY_DEFINED: { @@ -3797,7 +3811,8 @@ const char * Config::getVirtualDisplayView(ViewType type, int index) const noexc const char * Config::getVirtualDisplayViewTransformName(const char * view) const noexcept { - if (!view) return ""; + if (!view) + return ""; ViewVec::const_iterator iter = FindView(getImpl()->m_virtualDisplay.m_views, view); if (iter != getImpl()->m_virtualDisplay.m_views.end()) @@ -3810,7 +3825,8 @@ const char * Config::getVirtualDisplayViewTransformName(const char * view) const const char * Config::getVirtualDisplayViewColorSpaceName(const char * view) const noexcept { - if (!view) return ""; + if (!view) + return ""; ViewVec::const_iterator iter = FindView(getImpl()->m_virtualDisplay.m_views, view); if (iter != getImpl()->m_virtualDisplay.m_views.end()) @@ -3823,7 +3839,8 @@ const char * Config::getVirtualDisplayViewColorSpaceName(const char * view) cons const char * Config::getVirtualDisplayViewLooks(const char * view) const noexcept { - if (!view) return ""; + if (!view) + return ""; ViewVec::const_iterator iter = FindView(getImpl()->m_virtualDisplay.m_views, view); if (iter != getImpl()->m_virtualDisplay.m_views.end()) @@ -3836,7 +3853,8 @@ const char * Config::getVirtualDisplayViewLooks(const char * view) const noexcep const char * Config::getVirtualDisplayViewRule(const char * view) const noexcept { - if (!view) return ""; + if (!view) + return ""; ViewVec::const_iterator iter = FindView(getImpl()->m_virtualDisplay.m_views, view); if (iter != getImpl()->m_virtualDisplay.m_views.end()) @@ -3849,7 +3867,8 @@ const char * Config::getVirtualDisplayViewRule(const char * view) const noexcept const char * Config::getVirtualDisplayViewDescription(const char * view) const noexcept { - if (!view) return ""; + if (!view) + return ""; ViewVec::const_iterator iter = FindView(getImpl()->m_virtualDisplay.m_views, view); if (iter != getImpl()->m_virtualDisplay.m_views.end()) @@ -3862,19 +3881,18 @@ const char * Config::getVirtualDisplayViewDescription(const char * view) const n void Config::removeVirtualDisplayView(const char * view) noexcept { - if (!view) return; + if (!view) + return; ViewVec::const_iterator iter = FindView(getImpl()->m_virtualDisplay.m_views, view); if (iter != getImpl()->m_virtualDisplay.m_views.end()) { ViewVec & views = getImpl()->m_virtualDisplay.m_views; - const auto it = std::find_if(views.begin(), views.end(), - [view](const View & v) - { - return StringUtils::Compare(v.m_name.c_str(), view); - }); - if (it!=views.end()) + const auto it = std::find_if(views.begin(), views.end(), [view](const View & v) { + return StringUtils::Compare(v.m_name.c_str(), view); + }); + if (it != views.end()) { views.erase(it); @@ -3910,7 +3928,7 @@ int Config::instantiateDisplayFromMonitorName(const char * monitorName) const std::string ICCProfileFilepath = SystemMonitorsImpl::GetICCProfileFromMonitorName(monitorName); - + const std::string monitorDescription = GetProfileDescriptionFromICCProfile(ICCProfileFilepath.c_str()); @@ -3924,8 +3942,7 @@ int Config::instantiateDisplayFromICCProfile(const char * ICCProfileFilepath) throw Exception("The ICC profile filepath cannot be null."); } - const std::string monitorDescription - = GetProfileDescriptionFromICCProfile(ICCProfileFilepath); + const std::string monitorDescription = GetProfileDescriptionFromICCProfile(ICCProfileFilepath); return getImpl()->instantiateDisplay("", monitorDescription, ICCProfileFilepath); } @@ -3988,12 +4005,12 @@ int Config::getDisplayAllByName(const char * name) const noexcept for (size_t idx = 0; idx < getImpl()->m_displays.size(); ++idx) { - if (0==strcmp(name, getImpl()->m_displays[idx].first.c_str())) + if (0 == strcmp(name, getImpl()->m_displays[idx].first.c_str())) { return static_cast(idx); } } - + return -1; } @@ -4015,14 +4032,15 @@ int Config::getNumViews(ViewType type, const char * display) const } DisplayMap::const_iterator iter = FindDisplay(getImpl()->m_displays, display); - if (iter == getImpl()->m_displays.end()) return 0; + if (iter == getImpl()->m_displays.end()) + return 0; switch (type) { - case VIEW_SHARED: - return static_cast(iter->second.m_sharedViews.size()); - case VIEW_DISPLAY_DEFINED: - return static_cast(iter->second.m_views.size()); + case VIEW_SHARED: + return static_cast(iter->second.m_sharedViews.size()); + case VIEW_DISPLAY_DEFINED: + return static_cast(iter->second.m_views.size()); } return 0; @@ -4040,28 +4058,29 @@ const char * Config::getView(ViewType type, const char * display, int index) con } DisplayMap::const_iterator iter = FindDisplay(getImpl()->m_displays, display); - if(iter == getImpl()->m_displays.end()) return ""; + if (iter == getImpl()->m_displays.end()) + return ""; switch (type) { - case VIEW_SHARED: - { - const StringUtils::StringVec & views = iter->second.m_sharedViews; - if (index >= 0 && index < static_cast(views.size())) + case VIEW_SHARED: { - return views[index].c_str(); + const StringUtils::StringVec & views = iter->second.m_sharedViews; + if (index >= 0 && index < static_cast(views.size())) + { + return views[index].c_str(); + } + break; } - break; - } - case VIEW_DISPLAY_DEFINED: - { - const ViewVec & views = iter->second.m_views; - if (index >= 0 && index < static_cast(views.size())) + case VIEW_DISPLAY_DEFINED: { - return views[index].m_name.c_str(); + const ViewVec & views = iter->second.m_views; + if (index >= 0 && index < static_cast(views.size())) + { + return views[index].m_name.c_str(); + } + break; } - break; - } } return ""; @@ -4071,12 +4090,12 @@ const char * Config::getView(ViewType type, const char * display, int index) con void Config::getDefaultLumaCoefs(double * c3) const { - memcpy(c3, &getImpl()->m_defaultLumaCoefs[0], 3*sizeof(double)); + memcpy(c3, &getImpl()->m_defaultLumaCoefs[0], 3 * sizeof(double)); } void Config::setDefaultLumaCoefs(const double * c3) { - memcpy(&getImpl()->m_defaultLumaCoefs[0], c3, 3*sizeof(double)); + memcpy(&getImpl()->m_defaultLumaCoefs[0], c3, 3 * sizeof(double)); AutoMutex lock(getImpl()->m_cacheidMutex); getImpl()->resetCacheIDs(); @@ -4096,7 +4115,7 @@ int Config::getNumLooks() const const char * Config::getLookNameByIndex(int index) const { - if(index<0 || index>=static_cast(getImpl()->m_looksList.size())) + if (index < 0 || index >= static_cast(getImpl()->m_looksList.size())) { return ""; } @@ -4107,15 +4126,15 @@ const char * Config::getLookNameByIndex(int index) const void Config::addLook(const ConstLookRcPtr & look) { const std::string name = look->getName(); - if(name.empty()) + if (name.empty()) throw Exception("Cannot addLook with an empty name."); const std::string namelower = StringUtils::Lower(name); // If the look exists, replace it - for(unsigned int i=0; im_looksList.size(); ++i) + for (unsigned int i = 0; i < getImpl()->m_looksList.size(); ++i) { - if(StringUtils::Lower(getImpl()->m_looksList[i]->getName()) == namelower) + if (StringUtils::Lower(getImpl()->m_looksList[i]->getName()) == namelower) { getImpl()->m_looksList[i] = look->createEditableCopy(); @@ -4155,7 +4174,7 @@ ConstViewTransformRcPtr Config::getViewTransform(const char * name) const noexce const char * Config::getViewTransformNameByIndex(int index) const noexcept { - if (index<0 || index >= static_cast(getImpl()->m_viewTransforms.size())) + if (index < 0 || index >= static_cast(getImpl()->m_viewTransforms.size())) { return ""; } @@ -4211,8 +4230,8 @@ void Config::addViewTransform(const ConstViewTransformRcPtr & viewTransform) throw Exception("Cannot add view transform with an empty name."); } - if (!viewTransform->getTransform(VIEWTRANSFORM_DIR_TO_REFERENCE) && - !viewTransform->getTransform(VIEWTRANSFORM_DIR_FROM_REFERENCE)) + if (!viewTransform->getTransform(VIEWTRANSFORM_DIR_TO_REFERENCE) + && !viewTransform->getTransform(VIEWTRANSFORM_DIR_FROM_REFERENCE)) { std::ostringstream os; os << "Cannot add view transform '" << name << "' with no transform."; @@ -4228,7 +4247,7 @@ void Config::addViewTransform(const ConstViewTransformRcPtr & viewTransform) { if (StringUtils::Lower(vt->getName()) == namelower) { - vt = viewTransform->createEditableCopy(); + vt = viewTransform->createEditableCopy(); addIt = false; break; } @@ -4269,37 +4288,41 @@ void Config::setFileRules(ConstFileRulesRcPtr fileRules) const char * Config::getColorSpaceFromFilepath(const char * filePath) const { - return getImpl()->m_fileRules->getImpl()->getColorSpaceFromFilepath(*this, - filePath ? filePath : ""); + return getImpl()->m_fileRules->getImpl()->getColorSpaceFromFilepath( + *this, + filePath ? filePath : ""); } const char * Config::getColorSpaceFromFilepath(const char * filePath, size_t & ruleIndex) const { - return getImpl()->m_fileRules->getImpl()->getColorSpaceFromFilepath(*this, - filePath ? filePath : "", - ruleIndex); + return getImpl()->m_fileRules->getImpl()->getColorSpaceFromFilepath( + *this, + filePath ? filePath : "", + ruleIndex); } bool Config::filepathOnlyMatchesDefaultRule(const char * filePath) const { - return getImpl()->m_fileRules->getImpl()->filepathOnlyMatchesDefaultRule(*this, - filePath ? filePath : ""); + return getImpl()->m_fileRules->getImpl()->filepathOnlyMatchesDefaultRule( + *this, + filePath ? filePath : ""); } - /////////////////////////////////////////////////////////////////////////// // GetProcessor -ConstProcessorRcPtr Config::getProcessor(const ConstColorSpaceRcPtr & src, - const ConstColorSpaceRcPtr & dst) const +ConstProcessorRcPtr Config::getProcessor( + const ConstColorSpaceRcPtr & src, + const ConstColorSpaceRcPtr & dst) const { ConstContextRcPtr context = getCurrentContext(); return getProcessor(context, src, dst); } -ConstProcessorRcPtr Config::getProcessor(const ConstContextRcPtr & context, - const ConstColorSpaceRcPtr & src, - const ConstColorSpaceRcPtr & dst) const +ConstProcessorRcPtr Config::getProcessor( + const ConstContextRcPtr & context, + const ConstColorSpaceRcPtr & src, + const ConstColorSpaceRcPtr & dst) const { if (!src) { @@ -4324,9 +4347,10 @@ ConstProcessorRcPtr Config::getProcessor(const char * srcName, const char * dstN } // Names can be color space name or role name -ConstProcessorRcPtr Config::getProcessor(const ConstContextRcPtr & context, - const char * srcName, - const char * dstName) const +ConstProcessorRcPtr Config::getProcessor( + const ConstContextRcPtr & context, + const char * srcName, + const char * dstName) const { auto csTransform = ColorSpaceTransform::Create(); csTransform->setSrc(srcName); @@ -4334,21 +4358,22 @@ ConstProcessorRcPtr Config::getProcessor(const ConstContextRcPtr & context, return getProcessor(context, csTransform, TRANSFORM_DIR_FORWARD); } - -ConstProcessorRcPtr Config::getProcessor(const char * srcColorSpaceName, - const char * display, - const char * view, - TransformDirection direction) const +ConstProcessorRcPtr Config::getProcessor( + const char * srcColorSpaceName, + const char * display, + const char * view, + TransformDirection direction) const { ConstContextRcPtr context = getCurrentContext(); return getProcessor(context, srcColorSpaceName, display, view, direction); } -ConstProcessorRcPtr Config::getProcessor(const ConstContextRcPtr & context, - const char * srcColorSpaceName, - const char * display, - const char * view, - TransformDirection direction) const +ConstProcessorRcPtr Config::getProcessor( + const ConstContextRcPtr & context, + const char * srcColorSpaceName, + const char * display, + const char * view, + TransformDirection direction) const { auto dt = DisplayViewTransform::Create(); dt->setSrc(srcColorSpaceName); @@ -4358,16 +4383,18 @@ ConstProcessorRcPtr Config::getProcessor(const ConstContextRcPtr & context, return getProcessor(context, dt, direction); } -ConstProcessorRcPtr Config::getProcessor(const ConstNamedTransformRcPtr & namedTransform, - TransformDirection direction) const +ConstProcessorRcPtr Config::getProcessor( + const ConstNamedTransformRcPtr & namedTransform, + TransformDirection direction) const { ConstContextRcPtr context = getCurrentContext(); return getProcessor(context, namedTransform, direction); } -ConstProcessorRcPtr Config::getProcessor(const ConstContextRcPtr & context, - const ConstNamedTransformRcPtr & namedTransform, - TransformDirection direction) const +ConstProcessorRcPtr Config::getProcessor( + const ConstContextRcPtr & context, + const ConstNamedTransformRcPtr & namedTransform, + TransformDirection direction) const { // This gets or calculates the named transform in the requested direction. The result // is always applied in the forward direction. @@ -4375,16 +4402,18 @@ ConstProcessorRcPtr Config::getProcessor(const ConstContextRcPtr & context, return getProcessor(context, transform, TRANSFORM_DIR_FORWARD); } -ConstProcessorRcPtr Config::getProcessor(const char * namedTransformName, - TransformDirection direction) const +ConstProcessorRcPtr Config::getProcessor( + const char * namedTransformName, + TransformDirection direction) const { ConstContextRcPtr context = getCurrentContext(); return getProcessor(context, namedTransformName, direction); } -ConstProcessorRcPtr Config::getProcessor(const ConstContextRcPtr & context, - const char * namedTransformName, - TransformDirection direction) const +ConstProcessorRcPtr Config::getProcessor( + const ConstContextRcPtr & context, + const char * namedTransformName, + TransformDirection direction) const { ConstNamedTransformRcPtr namedTransform = getNamedTransform(namedTransformName); return getProcessor(context, namedTransform, direction); @@ -4395,16 +4424,18 @@ ConstProcessorRcPtr Config::getProcessor(const ConstTransformRcPtr & transform) return getProcessor(transform, TRANSFORM_DIR_FORWARD); } -ConstProcessorRcPtr Config::getProcessor(const ConstTransformRcPtr & transform, - TransformDirection direction) const +ConstProcessorRcPtr Config::getProcessor( + const ConstTransformRcPtr & transform, + TransformDirection direction) const { ConstContextRcPtr context = getCurrentContext(); return getProcessor(context, transform, direction); } -ConstProcessorRcPtr Config::getProcessor(const ConstContextRcPtr & context, - const ConstTransformRcPtr & transform, - TransformDirection direction) const +ConstProcessorRcPtr Config::getProcessor( + const ConstContextRcPtr & context, + const ConstTransformRcPtr & transform, + TransformDirection direction) const { if (!context) { @@ -4416,7 +4447,6 @@ ConstProcessorRcPtr Config::getProcessor(const ConstContextRcPtr & context, throw Exception("Config::GetProcessor failed. Transform is null."); } - // The goal of the usedContext is to only contain the context vars that are actually used for // this transform. This allows the cache to be more efficient. However, there are still some // various TODOs since the usedContext will sometimes contain more vars than are needed. @@ -4426,14 +4456,14 @@ ConstProcessorRcPtr Config::getProcessor(const ConstContextRcPtr & context, usedContext->setWorkingDir(context->getWorkingDir()); usedContext->setConfigIOProxy(context->getConfigIOProxy()); - const bool needContextVariables = CollectContextVariables(*this, *context, transform, usedContext); + const bool needContextVariables + = CollectContextVariables(*this, *context, transform, usedContext); // Create helper method. - auto CreateProcessor = [](const Config & config, + auto CreateProcessor = [](const Config & config, const ConstContextRcPtr & context, const ConstTransformRcPtr & transform, - TransformDirection direction) -> ProcessorRcPtr - { + TransformDirection direction) -> ProcessorRcPtr { ProcessorRcPtr processor = Processor::Create(); processor->getImpl()->setProcessorCacheFlags(config.getImpl()->m_cacheFlags); processor->getImpl()->setTransform(config, context, transform, direction); @@ -4448,8 +4478,7 @@ ConstProcessorRcPtr Config::getProcessor(const ConstContextRcPtr & context, // Note that the key includes a string description of the transform which does not include // all the LUT entries (just the arguments of the FileTransforms for LUTs). std::ostringstream oss; - oss << (needContextVariables ? std::string(usedContext->getCacheID()) : "") - << *transform + oss << (needContextVariables ? std::string(usedContext->getCacheID()) : "") << *transform << direction; const std::size_t key = std::hash{}(oss.str()); @@ -4500,21 +4529,28 @@ ConstProcessorRcPtr Config::getProcessor(const ConstContextRcPtr & context, } } -ConstProcessorRcPtr Config::GetProcessorFromConfigs(const ConstConfigRcPtr & srcConfig, - const char * srcName, - const ConstConfigRcPtr & dstConfig, - const char * dstName) +ConstProcessorRcPtr Config::GetProcessorFromConfigs( + const ConstConfigRcPtr & srcConfig, + const char * srcName, + const ConstConfigRcPtr & dstConfig, + const char * dstName) { - return GetProcessorFromConfigs(srcConfig->getCurrentContext(), srcConfig, srcName, - dstConfig->getCurrentContext(), dstConfig, dstName); + return GetProcessorFromConfigs( + srcConfig->getCurrentContext(), + srcConfig, + srcName, + dstConfig->getCurrentContext(), + dstConfig, + dstName); } -ConstProcessorRcPtr Config::GetProcessorFromConfigs(const ConstContextRcPtr & srcContext, - const ConstConfigRcPtr & srcConfig, - const char * srcName, - const ConstContextRcPtr & dstContext, - const ConstConfigRcPtr & dstConfig, - const char * dstName) +ConstProcessorRcPtr Config::GetProcessorFromConfigs( + const ConstContextRcPtr & srcContext, + const ConstConfigRcPtr & srcConfig, + const char * srcName, + const ConstContextRcPtr & dstContext, + const ConstConfigRcPtr & dstConfig, + const char * dstName) { // Extract the appropriate interchange roles based on the reference space type of the // source and destination color spaces. Note that no heuristics are attempted. If these @@ -4523,43 +4559,63 @@ ConstProcessorRcPtr Config::GetProcessorFromConfigs(const ConstContextRcPtr & sr const char * srcInterchangeName = nullptr; const char * dstInterchangeName = nullptr; ReferenceSpaceType interchangeType; - if( !ConfigUtils::GetInterchangeRolesForColorSpaceConversion(&srcInterchangeName, - &dstInterchangeName, - interchangeType, - srcConfig, srcName, - dstConfig, dstName) ) + if (!ConfigUtils::GetInterchangeRolesForColorSpaceConversion( + &srcInterchangeName, + &dstInterchangeName, + interchangeType, + srcConfig, + srcName, + dstConfig, + dstName)) { const char * interchangeRoleName = (interchangeType == REFERENCE_SPACE_SCENE) - ? ROLE_INTERCHANGE_SCENE : ROLE_INTERCHANGE_DISPLAY; + ? ROLE_INTERCHANGE_SCENE + : ROLE_INTERCHANGE_DISPLAY; std::ostringstream os; os << "The required role '" << interchangeRoleName << "' is missing from the source and/or " << "destination config."; throw Exception(os.str().c_str()); } - return GetProcessorFromConfigs(srcContext, srcConfig, srcName, srcInterchangeName, - dstContext, dstConfig, dstName, dstInterchangeName); -} - -ConstProcessorRcPtr Config::GetProcessorFromConfigs(const ConstConfigRcPtr & srcConfig, - const char * srcName, - const char * srcInterchangeName, - const ConstConfigRcPtr & dstConfig, - const char * dstName, - const char * dstInterchangeName) -{ - return GetProcessorFromConfigs(srcConfig->getCurrentContext(), srcConfig, srcName, srcInterchangeName, - dstConfig->getCurrentContext(), dstConfig, dstName, dstInterchangeName); -} - -ConstProcessorRcPtr Config::GetProcessorFromConfigs(const ConstContextRcPtr & srcContext, - const ConstConfigRcPtr & srcConfig, - const char * srcName, - const char * srcInterchangeName, - const ConstContextRcPtr & dstContext, - const ConstConfigRcPtr & dstConfig, - const char * dstName, - const char * dstInterchangeName) + return GetProcessorFromConfigs( + srcContext, + srcConfig, + srcName, + srcInterchangeName, + dstContext, + dstConfig, + dstName, + dstInterchangeName); +} + +ConstProcessorRcPtr Config::GetProcessorFromConfigs( + const ConstConfigRcPtr & srcConfig, + const char * srcName, + const char * srcInterchangeName, + const ConstConfigRcPtr & dstConfig, + const char * dstName, + const char * dstInterchangeName) +{ + return GetProcessorFromConfigs( + srcConfig->getCurrentContext(), + srcConfig, + srcName, + srcInterchangeName, + dstConfig->getCurrentContext(), + dstConfig, + dstName, + dstInterchangeName); +} + +ConstProcessorRcPtr Config::GetProcessorFromConfigs( + const ConstContextRcPtr & srcContext, + const ConstConfigRcPtr & srcConfig, + const char * srcName, + const char * srcInterchangeName, + const ConstContextRcPtr & dstContext, + const ConstConfigRcPtr & dstConfig, + const char * dstName, + const char * dstInterchangeName) { ConstColorSpaceRcPtr srcColorSpace = srcConfig->getColorSpace(srcName); if (!srcColorSpace) @@ -4597,14 +4653,14 @@ ConstProcessorRcPtr Config::GetProcessorFromConfigs(const ConstContextRcPtr & sr if (!p1) { throw Exception("Can't create the processor for the source config and " - "the source color space."); + "the source color space."); } auto p2 = dstConfig->getProcessor(dstContext, dstExCs, dstColorSpace); if (!p2) { throw Exception("Can't create the processor for the destination config " - "and the destination color space."); + "and the destination color space."); } ProcessorRcPtr processor = Processor::Create(); @@ -4620,25 +4676,34 @@ ConstProcessorRcPtr Config::GetProcessorFromConfigs(const ConstContextRcPtr & sr return processor; } -ConstProcessorRcPtr Config::GetProcessorFromConfigs(const ConstConfigRcPtr & srcConfig, - const char * srcName, - const ConstConfigRcPtr & dstConfig, - const char * dstDisplay, - const char * dstView, - TransformDirection direction) -{ - return GetProcessorFromConfigs(srcConfig->getCurrentContext(), srcConfig, srcName, - dstConfig->getCurrentContext(), dstConfig, dstDisplay, dstView, direction); -} - -ConstProcessorRcPtr Config::GetProcessorFromConfigs(const ConstContextRcPtr & srcContext, - const ConstConfigRcPtr & srcConfig, - const char * srcName, - const ConstContextRcPtr & dstContext, - const ConstConfigRcPtr & dstConfig, - const char * dstDisplay, - const char * dstView, - TransformDirection direction) +ConstProcessorRcPtr Config::GetProcessorFromConfigs( + const ConstConfigRcPtr & srcConfig, + const char * srcName, + const ConstConfigRcPtr & dstConfig, + const char * dstDisplay, + const char * dstView, + TransformDirection direction) +{ + return GetProcessorFromConfigs( + srcConfig->getCurrentContext(), + srcConfig, + srcName, + dstConfig->getCurrentContext(), + dstConfig, + dstDisplay, + dstView, + direction); +} + +ConstProcessorRcPtr Config::GetProcessorFromConfigs( + const ConstContextRcPtr & srcContext, + const ConstConfigRcPtr & srcConfig, + const char * srcName, + const ConstContextRcPtr & dstContext, + const ConstConfigRcPtr & dstConfig, + const char * dstDisplay, + const char * dstView, + TransformDirection direction) { ConstColorSpaceRcPtr srcColorSpace = srcConfig->getColorSpace(srcName); if (!srcColorSpace) @@ -4649,8 +4714,9 @@ ConstProcessorRcPtr Config::GetProcessorFromConfigs(const ConstContextRcPtr & sr } const bool sceneReferred = (srcColorSpace->getReferenceSpaceType() == REFERENCE_SPACE_SCENE); - const char* exchangeRoleName = sceneReferred ? ROLE_INTERCHANGE_SCENE : ROLE_INTERCHANGE_DISPLAY; - const char* srcExName = LookupRole(srcConfig->getImpl()->m_roles, exchangeRoleName); + const char * exchangeRoleName + = sceneReferred ? ROLE_INTERCHANGE_SCENE : ROLE_INTERCHANGE_DISPLAY; + const char * srcExName = LookupRole(srcConfig->getImpl()->m_roles, exchangeRoleName); if (!srcExName || !*srcExName) { std::ostringstream os; @@ -4666,7 +4732,7 @@ ConstProcessorRcPtr Config::GetProcessorFromConfigs(const ConstContextRcPtr & sr throw Exception(os.str().c_str()); } - const char* dstExName = LookupRole(dstConfig->getImpl()->m_roles, exchangeRoleName); + const char * dstExName = LookupRole(dstConfig->getImpl()->m_roles, exchangeRoleName); if (!dstExName || !*dstExName) { std::ostringstream os; @@ -4682,33 +4748,53 @@ ConstProcessorRcPtr Config::GetProcessorFromConfigs(const ConstContextRcPtr & sr throw Exception(os.str().c_str()); } - return GetProcessorFromConfigs(srcContext, srcConfig, srcName, srcExName, - dstContext, dstConfig, dstDisplay, dstView, dstExName, direction); -} - -ConstProcessorRcPtr Config::GetProcessorFromConfigs(const ConstConfigRcPtr& srcConfig, - const char * srcName, - const char * srcInterchangeName, - const ConstConfigRcPtr & dstConfig, - const char * dstDisplay, - const char * dstView, - const char* dstInterchangeName, - TransformDirection direction) -{ - return GetProcessorFromConfigs(srcConfig->getCurrentContext(), srcConfig, srcName, srcInterchangeName, - dstConfig->getCurrentContext(), dstConfig, dstDisplay, dstView, dstInterchangeName, direction); -} - -ConstProcessorRcPtr Config::GetProcessorFromConfigs(const ConstContextRcPtr & srcContext, - const ConstConfigRcPtr & srcConfig, - const char * srcName, - const char * srcInterchangeName, - const ConstContextRcPtr & dstContext, - const ConstConfigRcPtr & dstConfig, - const char * dstDisplay, - const char * dstView, - const char * dstInterchangeName, - TransformDirection direction) + return GetProcessorFromConfigs( + srcContext, + srcConfig, + srcName, + srcExName, + dstContext, + dstConfig, + dstDisplay, + dstView, + dstExName, + direction); +} + +ConstProcessorRcPtr Config::GetProcessorFromConfigs( + const ConstConfigRcPtr & srcConfig, + const char * srcName, + const char * srcInterchangeName, + const ConstConfigRcPtr & dstConfig, + const char * dstDisplay, + const char * dstView, + const char * dstInterchangeName, + TransformDirection direction) +{ + return GetProcessorFromConfigs( + srcConfig->getCurrentContext(), + srcConfig, + srcName, + srcInterchangeName, + dstConfig->getCurrentContext(), + dstConfig, + dstDisplay, + dstView, + dstInterchangeName, + direction); +} + +ConstProcessorRcPtr Config::GetProcessorFromConfigs( + const ConstContextRcPtr & srcContext, + const ConstConfigRcPtr & srcConfig, + const char * srcName, + const char * srcInterchangeName, + const ConstContextRcPtr & dstContext, + const ConstConfigRcPtr & dstConfig, + const char * dstDisplay, + const char * dstView, + const char * dstInterchangeName, + TransformDirection direction) { ConstColorSpaceRcPtr srcColorSpace = srcConfig->getColorSpace(srcName); if (!srcColorSpace) @@ -4734,23 +4820,24 @@ ConstProcessorRcPtr Config::GetProcessorFromConfigs(const ConstContextRcPtr & sr if (!p1) { throw Exception("Can't create the processor for the source config and " - "the source color space."); + "the source color space."); } - const char* csName = dstConfig->getDisplayViewColorSpaceName(dstDisplay, dstView); - const char* displayColorSpaceName = View::UseDisplayName(csName) ? dstDisplay : csName; + const char * csName = dstConfig->getDisplayViewColorSpaceName(dstDisplay, dstView); + const char * displayColorSpaceName = View::UseDisplayName(csName) ? dstDisplay : csName; ConstColorSpaceRcPtr displayColorSpace = dstConfig->getColorSpace(displayColorSpaceName); if (!displayColorSpace) { throw Exception("Can't create the processor for the destination config: " - "display color space not found."); + "display color space not found."); } - auto p2 = dstConfig->getProcessor(dstContext, dstInterchangeName, dstDisplay, dstView, direction); + auto p2 + = dstConfig->getProcessor(dstContext, dstInterchangeName, dstDisplay, dstView, direction); if (!p2) { throw Exception("Can't create the processor for the destination config " - "and the destination display view transform."); + "and the destination display view transform."); } ProcessorRcPtr processor = Processor::Create(); @@ -4770,84 +4857,92 @@ ConstProcessorRcPtr Config::GetProcessorFromConfigs(const ConstContextRcPtr & sr return processor; } -static ConstProcessorRcPtr GetProcessorToBuiltinCS(ConstConfigRcPtr srcConfig, - const char * srcColorSpaceName, - const char * builtinColorSpaceName, - TransformDirection direction) +static ConstProcessorRcPtr GetProcessorToBuiltinCS( + ConstConfigRcPtr srcConfig, + const char * srcColorSpaceName, + const char * builtinColorSpaceName, + TransformDirection direction) { - // Use the Default config as the Built-in config to interpret the known color space name. + // Use the Default config as the Built-in config to interpret the known color space name. ConstConfigRcPtr builtinConfig = Config::CreateFromFile("ocio://default"); if (builtinConfig->getColorSpace(builtinColorSpaceName) == nullptr) { std::ostringstream os; - os << "Built-in config does not contain the requested color space: " - << builtinColorSpaceName << "."; + os << "Built-in config does not contain the requested color space: " + << builtinColorSpaceName << "."; throw Exception(os.str().c_str()); } - const char * srcInterchange = nullptr; + const char * srcInterchange = nullptr; const char * builtinInterchange = nullptr; - Config::IdentifyInterchangeSpace(&srcInterchange, - &builtinInterchange, - srcConfig, - srcColorSpaceName, - builtinConfig, - builtinColorSpaceName); + Config::IdentifyInterchangeSpace( + &srcInterchange, + &builtinInterchange, + srcConfig, + srcColorSpaceName, + builtinConfig, + builtinColorSpaceName); if (builtinInterchange && builtinInterchange[0]) { ConstProcessorRcPtr proc; if (direction == TRANSFORM_DIR_FORWARD) { - proc = Config::GetProcessorFromConfigs(srcConfig, - srcColorSpaceName, - srcInterchange, - builtinConfig, - builtinColorSpaceName, - builtinInterchange); + proc = Config::GetProcessorFromConfigs( + srcConfig, + srcColorSpaceName, + srcInterchange, + builtinConfig, + builtinColorSpaceName, + builtinInterchange); } else if (direction == TRANSFORM_DIR_INVERSE) { - proc = Config::GetProcessorFromConfigs(builtinConfig, - builtinColorSpaceName, - builtinInterchange, - srcConfig, - srcColorSpaceName, - srcInterchange); + proc = Config::GetProcessorFromConfigs( + builtinConfig, + builtinColorSpaceName, + builtinInterchange, + srcConfig, + srcColorSpaceName, + srcInterchange); } return proc; } std::ostringstream os; - os << "Heuristics were not able to find a known color space in the provided config.\n" - << "Please set the interchange roles in the config."; + os << "Heuristics were not able to find a known color space in the provided config.\n" + << "Please set the interchange roles in the config."; throw Exception(os.str().c_str()); } -ConstProcessorRcPtr Config::GetProcessorToBuiltinColorSpace(ConstConfigRcPtr srcConfig, - const char * srcColorSpaceName, - const char * builtinColorSpaceName) +ConstProcessorRcPtr Config::GetProcessorToBuiltinColorSpace( + ConstConfigRcPtr srcConfig, + const char * srcColorSpaceName, + const char * builtinColorSpaceName) { - return GetProcessorToBuiltinCS(srcConfig, - srcColorSpaceName, - builtinColorSpaceName, - TRANSFORM_DIR_FORWARD); + return GetProcessorToBuiltinCS( + srcConfig, + srcColorSpaceName, + builtinColorSpaceName, + TRANSFORM_DIR_FORWARD); } -ConstProcessorRcPtr Config::GetProcessorFromBuiltinColorSpace(const char * builtinColorSpaceName, - ConstConfigRcPtr srcConfig, - const char * srcColorSpaceName) +ConstProcessorRcPtr Config::GetProcessorFromBuiltinColorSpace( + const char * builtinColorSpaceName, + ConstConfigRcPtr srcConfig, + const char * srcColorSpaceName) { - return GetProcessorToBuiltinCS(srcConfig, - srcColorSpaceName, - builtinColorSpaceName, - TRANSFORM_DIR_INVERSE); + return GetProcessorToBuiltinCS( + srcConfig, + srcColorSpaceName, + builtinColorSpaceName, + TRANSFORM_DIR_INVERSE); } /////////////////////////////////////////////////////////////////////////// -std::ostream& operator<< (std::ostream& os, const Config& config) +std::ostream & operator<<(std::ostream & os, const Config & config) { config.serialize(os); return os; @@ -4867,26 +4962,27 @@ const char * Config::getCacheID(const ConstContextRcPtr & context) const // A null context will use the empty cacheid std::string contextcacheid; - if(context) contextcacheid = context->getCacheID(); + if (context) + contextcacheid = context->getCacheID(); StringMap::const_iterator cacheiditer = getImpl()->m_cacheids.find(contextcacheid); - if(cacheiditer != getImpl()->m_cacheids.end()) + if (cacheiditer != getImpl()->m_cacheids.end()) { return cacheiditer->second.c_str(); } // Include the hash of the yaml config serialization - if(getImpl()->m_cacheidnocontext.empty()) + if (getImpl()->m_cacheidnocontext.empty()) { std::ostringstream cacheid; serialize(cacheid); - const std::string fullstr = cacheid.str(); + const std::string fullstr = cacheid.str(); getImpl()->m_cacheidnocontext = CacheIDHash(fullstr.c_str(), fullstr.size()); } // Also include all file references, using the context (if specified) std::string fileReferencesFastHash; - if(context) + if (context) { std::ostringstream filehash; @@ -4894,14 +4990,15 @@ const char * Config::getCacheID(const ConstContextRcPtr & context) const getImpl()->getAllInternalTransforms(allTransforms); std::set files; - for(const auto & transform : allTransforms) + for (const auto & transform : allTransforms) { GetFileReferences(files, transform); } - for(const auto & iter : files) + for (const auto & iter : files) { - if(iter.empty()) continue; + if (iter.empty()) + continue; filehash << iter << "="; @@ -4910,7 +5007,7 @@ const char * Config::getCacheID(const ConstContextRcPtr & context) const const std::string resolvedLocation = context->resolveFileLocation(iter.c_str()); filehash << GetFastFileHash(resolvedLocation, *context) << " "; } - catch(...) + catch (...) { filehash << "? "; continue; @@ -4918,17 +5015,18 @@ const char * Config::getCacheID(const ConstContextRcPtr & context) const } const std::string fullstr = filehash.str(); - fileReferencesFastHash = CacheIDHash(fullstr.c_str(), fullstr.size()); + fileReferencesFastHash = CacheIDHash(fullstr.c_str(), fullstr.size()); } - getImpl()->m_cacheids[contextcacheid] = getImpl()->m_cacheidnocontext + ":" + fileReferencesFastHash; + getImpl()->m_cacheids[contextcacheid] + = getImpl()->m_cacheidnocontext + ":" + fileReferencesFastHash; return getImpl()->m_cacheids[contextcacheid].c_str(); } /////////////////////////////////////////////////////////////////////////// // Serialization -void Config::serialize(std::ostream& os) const +void Config::serialize(std::ostream & os) const { try { @@ -4987,35 +5085,35 @@ StringUtils::StringVec Config::Impl::buildInactiveNamesList(InactiveType type) c v = StringUtils::Trim(v); switch (type) { - case INACTIVE_COLORSPACE: - { - const auto & cs = getColorSpace(v.c_str()); - // Only add existing items. - if (cs) + case INACTIVE_COLORSPACE: { - // Use the canonical name (alias or role might have been used). - res.push_back(cs->getName()); + const auto & cs = getColorSpace(v.c_str()); + // Only add existing items. + if (cs) + { + // Use the canonical name (alias or role might have been used). + res.push_back(cs->getName()); + } + break; } - break; - } - case INACTIVE_NAMEDTRANSFORM: - { - const auto & nt = getNamedTransform(v.c_str()); - // Only add existing items. - if (nt) + case INACTIVE_NAMEDTRANSFORM: { - // Use the canonical name (alias might have been used). - res.push_back(nt->getName()); + const auto & nt = getNamedTransform(v.c_str()); + // Only add existing items. + if (nt) + { + // Use the canonical name (alias might have been used). + res.push_back(nt->getName()); + } + break; + } + case INACTIVE_ALL: + { + // This is only used to verify that all items of the list do exists (only used by + // the validate() function. + res.push_back(v); + break; } - break; - } - case INACTIVE_ALL: - { - // This is only used to verify that all items of the list do exists (only used by the - // validate() function. - res.push_back(v); - break; - } } } @@ -5038,7 +5136,7 @@ void Config::Impl::refreshActiveColorSpaces() for (const auto & csName : m_inactiveColorSpaceNames) { - if (csName==name) + if (csName == name) { isActive = false; break; @@ -5079,8 +5177,8 @@ void Config::Impl::resetCacheIDs() { m_cacheids.clear(); m_cacheidnocontext = ""; - m_validation = VALIDATION_UNKNOWN; - m_validationtext = ""; + m_validation = VALIDATION_UNKNOWN; + m_validationtext = ""; // As any changes could impact the cache keys, it's better to always flush the cache // of processors to not keep in memory useless instances. @@ -5209,16 +5307,19 @@ void Config::Impl::checkVersionConsistency(ConstTransformRcPtr & transform) cons } if (m_majorVersion == 2 && m_minorVersion < 1 - && 0 == Platform::Strcasecmp(blt->getStyle(), "ACES-LMT - ACES 1.3 Reference Gamut Compression")) + && 0 + == Platform::Strcasecmp( + blt->getStyle(), + "ACES-LMT - ACES 1.3 Reference Gamut Compression")) { - throw Exception("Only config version 2.1 (or higher) can have " - "BuiltinTransform style 'ACES-LMT - ACES 1.3 Reference Gamut Compression'."); + throw Exception( + "Only config version 2.1 (or higher) can have " + "BuiltinTransform style 'ACES-LMT - ACES 1.3 Reference Gamut Compression'."); } - if (m_majorVersion == 2 && m_minorVersion < 2 - && ( 0 == Platform::Strcasecmp(blt->getStyle(), "ARRI_LOGC4_to_ACES2065-1") - || 0 == Platform::Strcasecmp(blt->getStyle(), "CURVE - CANON_CLOG2_to_LINEAR") - || 0 == Platform::Strcasecmp(blt->getStyle(), "CURVE - CANON_CLOG3_to_LINEAR") ) - ) + if (m_majorVersion == 2 && m_minorVersion < 2 + && (0 == Platform::Strcasecmp(blt->getStyle(), "ARRI_LOGC4_to_ACES2065-1") + || 0 == Platform::Strcasecmp(blt->getStyle(), "CURVE - CANON_CLOG2_to_LINEAR") + || 0 == Platform::Strcasecmp(blt->getStyle(), "CURVE - CANON_CLOG3_to_LINEAR"))) { std::ostringstream os; os << "Only config version 2.2 (or higher) can have BuiltinTransform style '" @@ -5226,15 +5327,14 @@ void Config::Impl::checkVersionConsistency(ConstTransformRcPtr & transform) cons throw Exception(os.str().c_str()); } if (m_majorVersion == 2 && m_minorVersion < 3 - && 0 == Platform::Strcasecmp(blt->getStyle(), "DISPLAY - CIE-XYZ-D65_to_DisplayP3")) + && 0 == Platform::Strcasecmp(blt->getStyle(), "DISPLAY - CIE-XYZ-D65_to_DisplayP3")) { throw Exception("Only config version 2.3 (or higher) can have " "BuiltinTransform style 'DISPLAY - CIE-XYZ-D65_to_DisplayP3'."); } - if (m_majorVersion == 2 && m_minorVersion < 4 - && ( 0 == Platform::Strcasecmp(blt->getStyle(), "APPLE_LOG_to_ACES2065-1") - || 0 == Platform::Strcasecmp(blt->getStyle(), "CURVE - APPLE_LOG_to_LINEAR") ) - ) + if (m_majorVersion == 2 && m_minorVersion < 4 + && (0 == Platform::Strcasecmp(blt->getStyle(), "APPLE_LOG_to_ACES2065-1") + || 0 == Platform::Strcasecmp(blt->getStyle(), "CURVE - APPLE_LOG_to_LINEAR"))) { std::ostringstream os; os << "Only config version 2.4 (or higher) can have BuiltinTransform style '" @@ -5257,8 +5357,8 @@ void Config::Impl::checkVersionConsistency(ConstTransformRcPtr & transform) cons throw Exception("Only config version 2 (or higher) can have DisplayViewTransform."); } } - else if (ConstExponentTransformRcPtr ex = - DynamicPtrCast(transform)) + else if ( + ConstExponentTransformRcPtr ex = DynamicPtrCast(transform)) { if (m_majorVersion < 2 && ex->getNegativeStyle() != NEGATIVE_CLAMP) { @@ -5298,7 +5398,9 @@ void Config::Impl::checkVersionConsistency(ConstTransformRcPtr & transform) cons } } } - else if (ConstFixedFunctionTransformRcPtr ff = DynamicPtrCast(transform)) + else if ( + ConstFixedFunctionTransformRcPtr ff + = DynamicPtrCast(transform)) { if (m_majorVersion < 2) { @@ -5306,7 +5408,8 @@ void Config::Impl::checkVersionConsistency(ConstTransformRcPtr & transform) cons "FixedFunctionTransform."); } - if (m_majorVersion == 2 && m_minorVersion < 1 && ff->getStyle() == FIXED_FUNCTION_ACES_GAMUT_COMP_13) + if (m_majorVersion == 2 && m_minorVersion < 1 + && ff->getStyle() == FIXED_FUNCTION_ACES_GAMUT_COMP_13) { throw Exception("Only config version 2.1 (or higher) can have " "FixedFunctionTransform style 'ACES_GAMUT_COMP_13'."); @@ -5487,7 +5590,7 @@ bool Config::isArchivable() const { ConstContextRcPtr context = getCurrentContext(); - // Current archive implementation needs a working directory to look for LUT files and + // Current archive implementation needs a working directory to look for LUT files and // working directory must be an absolute path. const char * workingDirectory = getWorkingDir(); if ((workingDirectory && !workingDirectory[0]) || !pystring::os::path::isabs(workingDirectory)) @@ -5496,19 +5599,17 @@ bool Config::isArchivable() const } // Utility lambda to check the following criteria. - auto validatePathForArchiving = [](const std::string & path) - { + auto validatePathForArchiving = [](const std::string & path) { // Using the normalized path. const std::string normPath = pystring::os::path::normpath(path); - if ( - // 1) Path may not be absolute. - pystring::os::path::isabs(normPath) || - // 2) Path may not start with double dot ".." (going above working directory). - pystring::startswith(normPath, "..") || - // 3) A context variable may not be located at the start of the path. - (ContainsContextVariables(path) && - (StringUtils::Find(path, "$") == 0 || - StringUtils::Find(path, "%") == 0))) + if ( + // 1) Path may not be absolute. + pystring::os::path::isabs(normPath) || + // 2) Path may not start with double dot ".." (going above working directory). + pystring::startswith(normPath, "..") || + // 3) A context variable may not be located at the start of the path. + (ContainsContextVariables(path) + && (StringUtils::Find(path, "$") == 0 || StringUtils::Find(path, "%") == 0))) { return false; } @@ -5519,7 +5620,7 @@ bool Config::isArchivable() const /////////////////////////////// // Search path verification. // /////////////////////////////// - // Check that search paths are not absolute nor have context variables outside of config + // Check that search paths are not absolute nor have context variables outside of config // working directory. int numSearchPaths = getNumSearchPaths(); for (int i = 0; i < numSearchPaths; i++) @@ -5539,12 +5640,12 @@ bool Config::isArchivable() const getImpl()->getAllInternalTransforms(allTransforms); std::set files; - for(const auto & transform : allTransforms) + for (const auto & transform : allTransforms) { GetFileReferences(files, transform); } - // Check that FileTransform sources are not absolute nor have context variables outside of + // Check that FileTransform sources are not absolute nor have context variables outside of // config working directory. for (const auto & path : files) { diff --git a/src/OpenColorIO/ConfigUtils.cpp b/src/OpenColorIO/ConfigUtils.cpp index 0b45b04de8..c20a9e1b5c 100644 --- a/src/OpenColorIO/ConfigUtils.cpp +++ b/src/OpenColorIO/ConfigUtils.cpp @@ -27,18 +27,15 @@ const char * getSRGBColorSpaceName() return srgbColorSpaceName; } -// Define the set of candidate built-in default config reference linear color spaces that -// will be used when searching through the source config. If the source config scene-referred -// reference space is the equivalent of one of these spaces, it should be possible to identify +// Define the set of candidate built-in default config reference linear color spaces that +// will be used when searching through the source config. If the source config scene-referred +// reference space is the equivalent of one of these spaces, it should be possible to identify // it with the following heuristics. // const char * getBuiltinLinearSpaceName(int index) { - constexpr const char * builtinLinearSpaces[] = { "ACES2065-1", - "ACEScg", - "Linear Rec.709 (sRGB)", - "Linear P3-D65", - "Linear Rec.2020" }; + constexpr const char * builtinLinearSpaces[] + = {"ACES2065-1", "ACEScg", "Linear Rec.709 (sRGB)", "Linear P3-D65", "Linear Rec.2020"}; return builtinLinearSpaces[Clamp(index, 0, 4)]; } @@ -74,13 +71,14 @@ inline int getNumberOfbuiltinLinearSpaces() // dstName -- Name of the color space to be converted from the destination config. // Returns True if the necessary interchange roles were found. // -bool GetInterchangeRolesForColorSpaceConversion(const char ** srcInterchangeCSName, - const char ** dstInterchangeCSName, - ReferenceSpaceType & interchangeType, - const ConstConfigRcPtr & srcConfig, - const char * srcName, - const ConstConfigRcPtr & dstConfig, - const char * dstName) +bool GetInterchangeRolesForColorSpaceConversion( + const char ** srcInterchangeCSName, + const char ** dstInterchangeCSName, + ReferenceSpaceType & interchangeType, + const ConstConfigRcPtr & srcConfig, + const char * srcName, + const ConstConfigRcPtr & dstConfig, + const char * dstName) { ConstColorSpaceRcPtr dstColorSpace = dstConfig->getColorSpace(dstName); if (!dstColorSpace) @@ -113,7 +111,7 @@ bool GetInterchangeRolesForColorSpaceConversion(const char ** srcInterchangeCSNa throw Exception(os.str().c_str()); } - // Only use the display-referred reference space if both color spaces are + // Only use the display-referred reference space if both color spaces are // display-referred. If only one of the spaces is display-referred, it's // better to use the scene-referred space since the conversion to scene- // referred will happen within the config that has the display-referred @@ -122,15 +120,16 @@ bool GetInterchangeRolesForColorSpaceConversion(const char ** srcInterchangeCSNa // that this function always use the same reference space even if the order // of src & dst is swapped, so the result is the inverse (which it might // not be if the view transform in the opposite config is used). - if (srcColorSpace->getReferenceSpaceType() == REFERENCE_SPACE_DISPLAY && - dstColorSpace->getReferenceSpaceType() == REFERENCE_SPACE_DISPLAY) + if (srcColorSpace->getReferenceSpaceType() == REFERENCE_SPACE_DISPLAY + && dstColorSpace->getReferenceSpaceType() == REFERENCE_SPACE_DISPLAY) { interchangeType = REFERENCE_SPACE_DISPLAY; } } const char * interchangeRoleName = (interchangeType == REFERENCE_SPACE_SCENE) - ? ROLE_INTERCHANGE_SCENE : ROLE_INTERCHANGE_DISPLAY; + ? ROLE_INTERCHANGE_SCENE + : ROLE_INTERCHANGE_DISPLAY; if (!srcConfig->hasRole(interchangeRoleName)) { @@ -187,7 +186,7 @@ bool containsSRGB(const ConstColorSpaceRcPtr & cs) return false; } -// Find a color space where isData is false and it has neither a to_ref or from_ref +// Find a color space where isData is false and it has neither a to_ref or from_ref // transform. Currently only selecting scene-referred spaces. Note: this returns // the first reference space found, even if it is inactive. Returns empty if none // are found. @@ -200,9 +199,8 @@ const char * getRefSpaceName(const ConstConfigRcPtr & cfg) for (int i = 0; i < nbCs; i++) { - const char * csname = cfg->getColorSpaceNameByIndex(SEARCH_REFERENCE_SPACE_SCENE, - COLORSPACE_ALL, - i); + const char * csname + = cfg->getColorSpaceNameByIndex(SEARCH_REFERENCE_SPACE_SCENE, COLORSPACE_ALL, i); ConstColorSpaceRcPtr cs = cfg->getColorSpace(csname); if (cs->isData()) @@ -215,7 +213,7 @@ const char * getRefSpaceName(const ConstConfigRcPtr & cfg) continue; } t = cs->getTransform(COLORSPACE_DIR_FROM_REFERENCE); - if (t != nullptr) + if (t != nullptr) { continue; } @@ -233,9 +231,8 @@ const char * getDataSpaceName(const ConstConfigRcPtr & cfg) for (int i = 0; i < nbCs; i++) { - const char * csname = cfg->getColorSpaceNameByIndex(SEARCH_REFERENCE_SPACE_SCENE, - COLORSPACE_ALL, - i); + const char * csname + = cfg->getColorSpaceNameByIndex(SEARCH_REFERENCE_SPACE_SCENE, COLORSPACE_ALL, i); ConstColorSpaceRcPtr cs = cfg->getColorSpace(csname); if (cs->isData()) @@ -249,16 +246,17 @@ const char * getDataSpaceName(const ConstConfigRcPtr & cfg) // Return false if the supplied Processor modifies any of the supplied float values // by more than the supplied absolute tolerance amount. // -bool isIdentityTransform(const ConstProcessorRcPtr & proc, - std::vector & RGBAvals, - float absTolerance) +bool isIdentityTransform( + const ConstProcessorRcPtr & proc, + std::vector & RGBAvals, + float absTolerance) { std::vector out(RGBAvals.size(), 0.f); - PackedImageDesc desc( &RGBAvals[0], (long) RGBAvals.size() / 4, 1, CHANNEL_ORDERING_RGBA ); - PackedImageDesc descDst( &out[0], (long) RGBAvals.size() / 4, 1, CHANNEL_ORDERING_RGBA ); + PackedImageDesc desc(&RGBAvals[0], (long)RGBAvals.size() / 4, 1, CHANNEL_ORDERING_RGBA); + PackedImageDesc descDst(&out[0], (long)RGBAvals.size() / 4, 1, CHANNEL_ORDERING_RGBA); - ConstCPUProcessorRcPtr cpu = proc->getOptimizedCPUProcessor(OPTIMIZATION_NONE); + ConstCPUProcessorRcPtr cpu = proc->getOptimizedCPUProcessor(OPTIMIZATION_NONE); cpu->apply(desc, descDst); for (size_t i = 0; i < out.size(); i++) @@ -291,9 +289,9 @@ bool hasNonTrivialMatrixTransform(const ConstProcessorRcPtr & proc) ConstMatrixTransformRcPtr mtx = DynamicPtrCast(transform); double values[16]; mtx->getMatrix(values); - for (int j = 0; j < 3 ; ++j) // only checking rgb, not alpha + for (int j = 0; j < 3; ++j) // only checking rgb, not alpha { - for (int k = 0; k < 3 ; ++k) // only checking rgb, not alpha + for (int k = 0; k < 3; ++k) // only checking rgb, not alpha { if (j != k) { @@ -333,7 +331,7 @@ bool containsBlockedTransform(const ConstTransformRcPtr & transform) else if (transform->getTransformType() == TRANSFORM_TYPE_FILE) { ConstFileTransformRcPtr ft = DynamicPtrCast(transform); - std::string filepath = ft->getSrc(); + std::string filepath = ft->getSrc(); std::string root, extension; pystring::os::path::splitext(root, extension, filepath); extension = StringUtils::Lower(extension); @@ -344,9 +342,10 @@ bool containsBlockedTransform(const ConstTransformRcPtr & transform) } // Prevent transforms that may be hiding a FileTransform. - else if (transform->getTransformType() == TRANSFORM_TYPE_COLORSPACE - || transform->getTransformType() == TRANSFORM_TYPE_DISPLAY_VIEW - || transform->getTransformType() == TRANSFORM_TYPE_LOOK) + else if ( + transform->getTransformType() == TRANSFORM_TYPE_COLORSPACE + || transform->getTransformType() == TRANSFORM_TYPE_DISPLAY_VIEW + || transform->getTransformType() == TRANSFORM_TYPE_LOOK) { return true; } @@ -367,16 +366,17 @@ bool containsBlockedTransform(const ConstTransformRcPtr & transform) // expensive to fully check. // // Because this check is done before a processor is built, it is inexpensive but it may -// be inaccurate. In other words, it's possible that this check will exclude some +// be inaccurate. In other words, it's possible that this check will exclude some // reasonable color spaces, but that's better than trying to invert 3d-LUTs, etc. // // cs -- Color space object to check. // refSpaceType -- Exclude if the color space is not of the same reference space type. // blockRefSpaces -- Exclude the color space if it does not have any transforms. // -bool excludeColorSpaceFromHeuristics(const ConstColorSpaceRcPtr & cs, - ReferenceSpaceType refSpaceType, - bool blockRefSpaces) +bool excludeColorSpaceFromHeuristics( + const ConstColorSpaceRcPtr & cs, + ReferenceSpaceType refSpaceType, + bool blockRefSpaces) { if (cs->isData()) { @@ -421,18 +421,21 @@ bool excludeColorSpaceFromHeuristics(const ConstColorSpaceRcPtr & cs, // builtinConfig -- The built-in config object. // Returns the index into the list of built-in linear spaces. // -int getReferenceSpaceFromLinearSpace(const ConstConfigRcPtr & srcConfig, - const char * srcRefName, - const ConstColorSpaceRcPtr & cs, - const ConstConfigRcPtr & builtinConfig) +int getReferenceSpaceFromLinearSpace( + const ConstConfigRcPtr & srcConfig, + const char * srcRefName, + const ConstColorSpaceRcPtr & cs, + const ConstConfigRcPtr & builtinConfig) { - // Define a set of (somewhat arbitrary) RGB values to test whether the combined transform is + // Define a set of (somewhat arbitrary) RGB values to test whether the combined transform is // enough of an identity. + // clang-format off std::vector vals = { 0.7f, 0.4f, 0.02f, 0.f, 0.02f, 0.6f, -0.2f, 0.f, 0.3f, 0.02f, 1.5f, 0.f, 0.f, 0.f, 0.f, 0.f, 1.f, 1.f, 1.f, 0.f }; + // clang-format on // Test the transform from the test color space to its reference space against all combinations // of the built-in linear color spaces. If one of them results in an identity, that identifies @@ -468,8 +471,8 @@ int getReferenceSpaceFromLinearSpace(const ConstConfigRcPtr & srcConfig, // Test the supplied color space against a set of color spaces in the built-in config // to see if it matches an sRGB texture color space with one of a set of known primaries -// used as its reference space. If a match is found, it indicates what reference space -// is used by the config. Return the index into the list of built-in linear spaces, +// used as its reference space. If a match is found, it indicates what reference space +// is used by the config. Return the index into the list of built-in linear spaces, // or -1 if not found. // // srcConfig -- Source config object. @@ -478,15 +481,16 @@ int getReferenceSpaceFromLinearSpace(const ConstConfigRcPtr & srcConfig, // builtinConfig -- The built-in config object. // Returns the index into the list of built-in linear spaces. // -int getReferenceSpaceFromSRGBSpace(const ConstConfigRcPtr & srcConfig, - const char * srcRefName, - const ConstColorSpaceRcPtr & cs, - const ConstConfigRcPtr & builtinConfig) +int getReferenceSpaceFromSRGBSpace( + const ConstConfigRcPtr & srcConfig, + const char * srcRefName, + const ConstColorSpaceRcPtr & cs, + const ConstConfigRcPtr & builtinConfig) { // Get a transform in the to-reference direction. ConstTransformRcPtr toRefTransform; ConstTransformRcPtr ctransform = cs->getTransform(COLORSPACE_DIR_TO_REFERENCE); - if (ctransform) + if (ctransform) { toRefTransform = ctransform; } @@ -506,11 +510,12 @@ int getReferenceSpaceFromSRGBSpace(const ConstConfigRcPtr & srcConfig, } } - // First check if it has the right non-linearity. The objective is to fail quickly on color - // spaces that are definitely not sRGB before proceeding to the longer test of guessing the + // First check if it has the right non-linearity. The objective is to fail quickly on color + // spaces that are definitely not sRGB before proceeding to the longer test of guessing the // reference space primaries. // Break point is at 0.039286, so include at least one value below this. + // clang-format off std::vector vals = { 0.5f, 0.5f, 0.5f, @@ -520,26 +525,27 @@ int getReferenceSpaceFromSRGBSpace(const ConstConfigRcPtr & srcConfig, 0.f, 0.f, 0.f, 1.f, 1.f , 1.f }; + // clang-format on std::vector out(vals.size(), 0.f); - PackedImageDesc desc( &vals[0], (long) vals.size() / 3, 1, CHANNEL_ORDERING_RGB ); - PackedImageDesc descDst( &out[0], (long) vals.size() / 3, 1, CHANNEL_ORDERING_RGB ); + PackedImageDesc desc(&vals[0], (long)vals.size() / 3, 1, CHANNEL_ORDERING_RGB); + PackedImageDesc descDst(&out[0], (long)vals.size() / 3, 1, CHANNEL_ORDERING_RGB); ConstProcessorRcPtr proc = srcConfig->getProcessor(toRefTransform, TRANSFORM_DIR_FORWARD); // Ensure that the color space is not only an sRGB curve, it needs to have a color matrix // too or else the last step below could succeed by pairing the built-in sRGB space with // a linear space that cancels out the matrix in the built-in sRGB space. - // NB: This is being done after the getProcessor call rather than simply looking at - // the raw color space transform contents since once it becomes a processor, the complex - // transforms (e.g. File, ColorSpace, Builtins) that could be hiding a matrix are - // converted into ops. + // NB: This is being done after the getProcessor call rather than simply looking at + // the raw color space transform contents since once it becomes a processor, the complex + // transforms (e.g. File, ColorSpace, Builtins) that could be hiding a matrix are + // converted into ops. if (!hasNonTrivialMatrixTransform(proc)) { return -1; } - ConstCPUProcessorRcPtr cpu = proc->getOptimizedCPUProcessor(OPTIMIZATION_NONE); + ConstCPUProcessorRcPtr cpu = proc->getOptimizedCPUProcessor(OPTIMIZATION_NONE); // Convert the non-linear values to linear. cpu->apply(desc, descDst); @@ -561,32 +567,35 @@ int getReferenceSpaceFromSRGBSpace(const ConstConfigRcPtr & srcConfig, { return -1; } - } + } - // Define a (somewhat arbitrary) set of RGB values to test whether the transform is in fact - // converting sRGB texture values to the candidate reference space. It includes 0.02 which is + // Define a (somewhat arbitrary) set of RGB values to test whether the transform is in fact + // converting sRGB texture values to the candidate reference space. It includes 0.02 which is // on the sRGB linear segment, color values, and neutral values. + // clang-format off vals = { 0.7f, 0.4f, 0.02f, 0.f, 0.02f, 0.6f, 0.2f, 0.f, 0.3f, 0.02f, 0.5f, 0.f, 0.f, 0.f, 0.f, 0.f, 1.f, 1.f, 1.f, 0.f, }; + // clang-format on - // The color space has the sRGB non-linearity. Now try combining the transform with a - // transform from the Built-in config that goes from a variety of reference spaces to an + // The color space has the sRGB non-linearity. Now try combining the transform with a + // transform from the Built-in config that goes from a variety of reference spaces to an // sRGB texture space. If the result is an identity, then that tells what the source config // reference space is. - // At this point, cs has the expected non-linearity and a non-trivial matrix to its reference space. - // Now try to identify the matrix. + // At this point, cs has the expected non-linearity and a non-trivial matrix to its reference + // space. Now try to identify the matrix. for (int i = 0; i < getNumberOfbuiltinLinearSpaces(); i++) { - ConstProcessorRcPtr proc = Config::GetProcessorFromConfigs(srcConfig, - cs->getName(), - srcRefName, - builtinConfig, - getSRGBColorSpaceName(), - getBuiltinLinearSpaceName(i)); + ConstProcessorRcPtr proc = Config::GetProcessorFromConfigs( + srcConfig, + cs->getName(), + srcRefName, + builtinConfig, + getSRGBColorSpaceName(), + getBuiltinLinearSpaceName(i)); if (isIdentityTransform(proc, vals, 1e-3f)) { return i; @@ -609,40 +618,45 @@ int getReferenceSpaceFromSRGBSpace(const ConstConfigRcPtr & srcConfig, // // Throws an exception if an interchange space cannot be found. // -void IdentifyInterchangeSpace(const char ** srcInterchange, - const char ** builtinInterchange, - const ConstConfigRcPtr & srcConfig, - const char * srcColorSpaceName, - const ConstConfigRcPtr & builtinConfig, - const char * builtinColorSpaceName) +void IdentifyInterchangeSpace( + const char ** srcInterchange, + const char ** builtinInterchange, + const ConstConfigRcPtr & srcConfig, + const char * srcColorSpaceName, + const ConstConfigRcPtr & builtinConfig, + const char * builtinColorSpaceName) { // Before resorting to heuristics, check if the configs already have the interchange - // roles defined. + // roles defined. // - // Note that this is the only place that srcColorSpaceName and builtinColorSpaceName - // are used, in order to determine whether the scene- or display-referred interchange + // Note that this is the only place that srcColorSpaceName and builtinColorSpaceName + // are used, in order to determine whether the scene- or display-referred interchange // role is most appropriate. These color spaces are not used below for the heuristics. ReferenceSpaceType interchangeType; - if ( GetInterchangeRolesForColorSpaceConversion(srcInterchange, builtinInterchange, - interchangeType, - srcConfig, srcColorSpaceName, - builtinConfig, builtinColorSpaceName) ) + if (GetInterchangeRolesForColorSpaceConversion( + srcInterchange, + builtinInterchange, + interchangeType, + srcConfig, + srcColorSpaceName, + builtinConfig, + builtinColorSpaceName)) { // No need for the heuristics. return; } - // Use heuristics to try and find a color space in the source config that matches + // Use heuristics to try and find a color space in the source config that matches // a color space in the Built-in config. // Currently only handling scene-referred spaces in the heuristics. - if (builtinConfig->getColorSpace(builtinColorSpaceName)->getReferenceSpaceType() + if (builtinConfig->getColorSpace(builtinColorSpaceName)->getReferenceSpaceType() == REFERENCE_SPACE_DISPLAY) { std::ostringstream os; - os << "The heuristics currently only support scene-referred color spaces. " - << "Please set the interchange roles."; + os << "The heuristics currently only support scene-referred color spaces. " + << "Please set the interchange roles."; throw Exception(os.str().c_str()); } @@ -651,7 +665,7 @@ void IdentifyInterchangeSpace(const char ** srcInterchange, if (!**srcInterchange) { std::ostringstream os; - os << "The supplied config does not have a color space for the reference."; + os << "The supplied config does not have a color space for the reference."; throw Exception(os.str().c_str()); } @@ -664,7 +678,7 @@ void IdentifyInterchangeSpace(const char ** srcInterchange, // Check for an sRGB texture space. int refColorSpacePrimsIndex = -1; - int nbCs = srcConfig->getNumColorSpaces(); + int nbCs = srcConfig->getNumColorSpaces(); for (int i = 0; i < nbCs; i++) { ConstColorSpaceRcPtr cs = srcConfig->getColorSpace(srcConfig->getColorSpaceNameByIndex(i)); @@ -678,12 +692,11 @@ void IdentifyInterchangeSpace(const char ** srcInterchange, continue; } - refColorSpacePrimsIndex = getReferenceSpaceFromSRGBSpace(srcConfig, - *srcInterchange, - cs, - builtinConfig); + refColorSpacePrimsIndex + = getReferenceSpaceFromSRGBSpace(srcConfig, *srcInterchange, cs, builtinConfig); // Break out when a match is found. - if (refColorSpacePrimsIndex > -1) break; + if (refColorSpacePrimsIndex > -1) + break; } } @@ -693,7 +706,8 @@ void IdentifyInterchangeSpace(const char ** srcInterchange, nbCs = srcConfig->getNumColorSpaces(); for (int i = 0; i < nbCs; i++) { - ConstColorSpaceRcPtr cs = srcConfig->getColorSpace(srcConfig->getColorSpaceNameByIndex(i)); + ConstColorSpaceRcPtr cs + = srcConfig->getColorSpace(srcConfig->getColorSpaceNameByIndex(i)); // Exclude color spaces that may be too expensive to test or otherwise inappropriate. // Currently only handling scene-referred spaces in the heuristics. @@ -704,12 +718,14 @@ void IdentifyInterchangeSpace(const char ** srcInterchange, if (srcConfig->isColorSpaceLinear(cs->getName(), REFERENCE_SPACE_SCENE)) { - refColorSpacePrimsIndex = getReferenceSpaceFromLinearSpace(srcConfig, - *srcInterchange, - cs, - builtinConfig); + refColorSpacePrimsIndex = getReferenceSpaceFromLinearSpace( + srcConfig, + *srcInterchange, + cs, + builtinConfig); // Break out when a match is found. - if (refColorSpacePrimsIndex > -1) break; + if (refColorSpacePrimsIndex > -1) + break; } } } @@ -721,14 +737,14 @@ void IdentifyInterchangeSpace(const char ** srcInterchange, else { std::ostringstream os; - os << "Heuristics were not able to find a known color space in the provided config. " - << "Please set the interchange roles."; + os << "Heuristics were not able to find a known color space in the provided config. " + << "Please set the interchange roles."; throw Exception(os.str().c_str()); } } // Try to find the name of a color space in the source config that is equivalent to the -// specified color space from the provided built-in config. Only active color spaces +// specified color space from the provided built-in config. Only active color spaces // are searched. // // srcConfig -- The source config object to search. @@ -738,9 +754,10 @@ void IdentifyInterchangeSpace(const char ** srcInterchange, // // \throw Exception if an interchange space cannot be found or the equivalent space cannot be found. // -const char * IdentifyBuiltinColorSpace(const ConstConfigRcPtr & srcConfig, - const ConstConfigRcPtr & builtinConfig, - const char * builtinColorSpaceName) +const char * IdentifyBuiltinColorSpace( + const ConstConfigRcPtr & srcConfig, + const ConstConfigRcPtr & builtinConfig, + const char * builtinColorSpaceName) { // Note: Technically, the built-in config could be any config, if the interchange // roles are set in both configs, and the supplied built-in config supports the list @@ -750,8 +767,8 @@ const char * IdentifyBuiltinColorSpace(const ConstConfigRcPtr & srcConfig, if (!builtinColorSpace) { std::ostringstream os; - os << "Built-in config does not contain the requested color space: " - << builtinColorSpaceName << "."; + os << "Built-in config does not contain the requested color space: " + << builtinColorSpaceName << "."; throw Exception(os.str().c_str()); } @@ -761,7 +778,8 @@ const char * IdentifyBuiltinColorSpace(const ConstConfigRcPtr & srcConfig, if (!*dataName) { std::ostringstream os; - os << "The requested space is a data space but the supplied config does not have a data space."; + os << "The requested space is a data space but the supplied config does not have a " + "data space."; throw Exception(os.str().c_str()); } return dataName; @@ -774,14 +792,15 @@ const char * IdentifyBuiltinColorSpace(const ConstConfigRcPtr & srcConfig, // space type of the interchange role. Will throw if the space cannot be found. // Only color spaces in the srcConfig that have the same reference type as the // builtinColorSpace will be searched by the heuristics below. - const char * srcInterchangeName = nullptr; + const char * srcInterchangeName = nullptr; const char * builtinInterchangeName = nullptr; - IdentifyInterchangeSpace(&srcInterchangeName, - &builtinInterchangeName, - srcConfig, - "", - builtinConfig, - builtinColorSpaceName); + IdentifyInterchangeSpace( + &srcInterchangeName, + &builtinInterchangeName, + srcConfig, + "", + builtinConfig, + builtinColorSpaceName); // The heuristics need to create a lot of Processors and send RGB values through // them to try and identify a known color space. Turn off the Processor cache in @@ -792,11 +811,13 @@ const char * IdentifyBuiltinColorSpace(const ConstConfigRcPtr & srcConfig, if (*builtinInterchangeName) { + // clang-format off std::vector vals = { 0.7f, 0.4f, 0.02f, 0.f, 0.02f, 0.6f, 0.2f, 0.f, 0.3f, 0.02f, 0.5f, 0.f, 0.f, 0.f, 0.f, 0.f, 1.f, 1.f, 1.f, 0.f }; + // clang-format on // Loop over the active, non-excluded, color spaces in the source config and test if the // conversion to the specified space in the built-in config is an identity. @@ -810,19 +831,21 @@ const char * IdentifyBuiltinColorSpace(const ConstConfigRcPtr & srcConfig, int nbCs = srcConfig->getNumColorSpaces(); for (int i = 0; i < nbCs; i++) { - ConstColorSpaceRcPtr cs = srcConfig->getColorSpace(srcConfig->getColorSpaceNameByIndex(i)); + ConstColorSpaceRcPtr cs + = srcConfig->getColorSpace(srcConfig->getColorSpaceNameByIndex(i)); if (excludeColorSpaceFromHeuristics(cs, builtinRefSpaceType, false)) { continue; } - ConstProcessorRcPtr proc = Config::GetProcessorFromConfigs(srcConfig, - cs->getName(), - srcInterchangeName, - builtinConfig, - builtinColorSpaceName, - builtinInterchangeName); + ConstProcessorRcPtr proc = Config::GetProcessorFromConfigs( + srcConfig, + cs->getName(), + srcInterchangeName, + builtinConfig, + builtinColorSpaceName, + builtinInterchangeName); if (isIdentityTransform(proc, vals, 1e-3f)) { return cs->getName(); @@ -831,11 +854,11 @@ const char * IdentifyBuiltinColorSpace(const ConstConfigRcPtr & srcConfig, } std::ostringstream os; - os << "Heuristics were not able to find an equivalent to the requested color space: " - << builtinColorSpaceName << "."; + os << "Heuristics were not able to find an equivalent to the requested color space: " + << builtinColorSpaceName << "."; throw Exception(os.str().c_str()); } -} // namespace ConfigUtils +} // namespace ConfigUtils -} // namespace OCIO_NAMESPACE +} // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/ConfigUtils.h b/src/OpenColorIO/ConfigUtils.h index 3d7d00701b..013a0833f4 100644 --- a/src/OpenColorIO/ConfigUtils.h +++ b/src/OpenColorIO/ConfigUtils.h @@ -12,24 +12,27 @@ namespace OCIO_NAMESPACE namespace ConfigUtils { -bool GetInterchangeRolesForColorSpaceConversion(const char ** srcInterchangeCSName, - const char ** dstInterchangeCSName, - ReferenceSpaceType & interchangeType, - const ConstConfigRcPtr & srcConfig, - const char * srcName, - const ConstConfigRcPtr & dstConfig, - const char * dstName); +bool GetInterchangeRolesForColorSpaceConversion( + const char ** srcInterchangeCSName, + const char ** dstInterchangeCSName, + ReferenceSpaceType & interchangeType, + const ConstConfigRcPtr & srcConfig, + const char * srcName, + const ConstConfigRcPtr & dstConfig, + const char * dstName); -void IdentifyInterchangeSpace(const char ** srcInterchange, - const char ** builtinInterchange, - const ConstConfigRcPtr & srcConfig, - const char * srcColorSpaceName, - const ConstConfigRcPtr & builtinConfig, - const char * builtinColorSpaceName); +void IdentifyInterchangeSpace( + const char ** srcInterchange, + const char ** builtinInterchange, + const ConstConfigRcPtr & srcConfig, + const char * srcColorSpaceName, + const ConstConfigRcPtr & builtinConfig, + const char * builtinColorSpaceName); -const char * IdentifyBuiltinColorSpace(const ConstConfigRcPtr & srcConfig, - const ConstConfigRcPtr & builtinConfig, - const char * builtinColorSpaceName); +const char * IdentifyBuiltinColorSpace( + const ConstConfigRcPtr & srcConfig, + const ConstConfigRcPtr & builtinConfig, + const char * builtinColorSpaceName); // Temporarily deactivate the Processor cache on a Config object. // Currently, this also clears the cache. @@ -38,19 +41,17 @@ class SuspendCacheGuard { public: SuspendCacheGuard(); - SuspendCacheGuard(const SuspendCacheGuard &) = delete; + SuspendCacheGuard(const SuspendCacheGuard &) = delete; SuspendCacheGuard & operator=(const SuspendCacheGuard &) = delete; SuspendCacheGuard(const ConstConfigRcPtr & config) - : m_config(config), m_origCacheFlags(config->getProcessorCacheFlags()) + : m_config(config) + , m_origCacheFlags(config->getProcessorCacheFlags()) { m_config->setProcessorCacheFlags(PROCESSOR_CACHE_OFF); } - ~SuspendCacheGuard() - { - m_config->setProcessorCacheFlags(m_origCacheFlags); - } + ~SuspendCacheGuard() { m_config->setProcessorCacheFlags(m_origCacheFlags); } private: ConstConfigRcPtr m_config = nullptr; diff --git a/src/OpenColorIO/Context.cpp b/src/OpenColorIO/Context.cpp index 3a1294be58..250aac57a8 100644 --- a/src/OpenColorIO/Context.cpp +++ b/src/OpenColorIO/Context.cpp @@ -24,11 +24,12 @@ namespace OCIO_NAMESPACE namespace { -void GetAbsoluteSearchPaths(StringUtils::StringVec & searchpaths, - const StringUtils::StringVec & pathStrings, - const std::string & configRootDir, - const EnvMap & map, - UsedEnvs & envs); +void GetAbsoluteSearchPaths( + StringUtils::StringVec & searchpaths, + const StringUtils::StringVec & pathStrings, + const std::string & configRootDir, + const EnvMap & map, + UsedEnvs & envs); } class Context::Impl @@ -54,20 +55,20 @@ class Context::Impl ConfigIOProxyRcPtr m_configIOProxy; - Impl() = default; + Impl() = default; ~Impl() = default; - Impl& operator= (const Impl & rhs) + Impl & operator=(const Impl & rhs) { - if(this!=&rhs) + if (this != &rhs) { AutoMutex lock1(m_resultsCacheMutex); AutoMutex lock2(rhs.m_resultsCacheMutex); m_searchPaths = rhs.m_searchPaths; - m_searchPath = rhs.m_searchPath; - m_workingDir = rhs.m_workingDir; - m_envMap = rhs.m_envMap; + m_searchPath = rhs.m_searchPath; + m_workingDir = rhs.m_workingDir; + m_envMap = rhs.m_envMap; m_resultsStringCache = rhs.m_resultsStringCache; m_resultsFilepathCache = rhs.m_resultsFilepathCache; @@ -80,7 +81,8 @@ class Context::Impl } // Resolve all context variables from an arbitrary string. - const char * resolveStringVar(const char * string, ContextRcPtr & usedContextVars) const noexcept + const char * resolveStringVar(const char * string, ContextRcPtr & usedContextVars) + const noexcept { if (!string || !*string) { @@ -105,7 +107,7 @@ class Context::Impl // Search some context variables to replace. UsedEnvs envs; const std::string resolvedString = ResolveContextVariables(string, m_envMap, envs); - m_resultsStringCache[string] = std::make_pair(resolvedString, envs); + m_resultsStringCache[string] = std::make_pair(resolvedString, envs); if (usedContextVars) { @@ -124,7 +126,7 @@ class Context::Impl { m_resultsStringCache.clear(); m_resultsFilepathCache.clear(); - m_cacheID.clear(); + m_cacheID.clear(); } }; @@ -135,7 +137,7 @@ ContextRcPtr Context::Create() return ContextRcPtr(new Context(), &deleter); } -void Context::deleter(Context* c) +void Context::deleter(Context * c) { delete c; } @@ -143,7 +145,7 @@ void Context::deleter(Context* c) /////////////////////////////////////////////////////////////////////////// Context::Context() -: m_impl(new Context::Impl) + : m_impl(new Context::Impl) { } @@ -156,7 +158,7 @@ Context::~Context() ContextRcPtr Context::createEditableCopy() const { ContextRcPtr context = Context::Create(); - *context->m_impl = *getImpl(); + *context->m_impl = *getImpl(); return context; } @@ -164,7 +166,7 @@ const char * Context::getCacheID() const { AutoMutex lock(getImpl()->m_resultsCacheMutex); - if(getImpl()->m_cacheID.empty()) + if (getImpl()->m_cacheID.empty()) { std::ostringstream cacheid; if (!getImpl()->m_searchPaths.empty()) @@ -179,13 +181,14 @@ const char * Context::getCacheID() const cacheid << "Environment Mode " << getImpl()->m_envmode << " "; for (EnvMap::const_iterator iter = getImpl()->m_envMap.begin(), - end = getImpl()->m_envMap.end(); - iter != end; ++iter) + end = getImpl()->m_envMap.end(); + iter != end; + ++iter) { cacheid << iter->first << "=" << iter->second << " "; } - std::string fullstr = cacheid.str(); + std::string fullstr = cacheid.str(); getImpl()->m_cacheID = CacheIDHash(fullstr.c_str(), fullstr.size()); } @@ -216,7 +219,8 @@ int Context::getNumSearchPaths() const const char * Context::getSearchPath(int index) const { - if (index < 0 || index >= (int)getImpl()->m_searchPaths.size()) return ""; + if (index < 0 || index >= (int)getImpl()->m_searchPaths.size()) + return ""; return getImpl()->m_searchPaths[index].c_str(); } @@ -336,7 +340,7 @@ const char * Context::getStringVar(const char * name) const noexcept } EnvMap::const_iterator iter = getImpl()->m_envMap.find(name); - if(iter != getImpl()->m_envMap.end()) + if (iter != getImpl()->m_envMap.end()) { return iter->second.c_str(); } @@ -351,22 +355,24 @@ int Context::getNumStringVars() const const char * Context::getStringVarNameByIndex(int index) const { - if(index < 0 || index >= static_cast(getImpl()->m_envMap.size())) + if (index < 0 || index >= static_cast(getImpl()->m_envMap.size())) return ""; EnvMap::const_iterator iter = getImpl()->m_envMap.begin(); - for(int count = 0; countfirst.c_str(); } const char * Context::getStringVarByIndex(int index) const { - if(index < 0 || index >= static_cast(getImpl()->m_envMap.size())) + if (index < 0 || index >= static_cast(getImpl()->m_envMap.size())) return ""; EnvMap::const_iterator iter = getImpl()->m_envMap.begin(); - for(int count = 0; countsecond.c_str(); } @@ -384,7 +390,7 @@ void Context::clearStringVars() getImpl()->m_envMap.clear(); } -const char * Context::resolveStringVar(const char * string) const noexcept +const char * Context::resolveStringVar(const char * string) const noexcept { AutoMutex lock(getImpl()->m_resultsCacheMutex); @@ -393,7 +399,8 @@ const char * Context::resolveStringVar(const char * string) const noexcept return getImpl()->resolveStringVar(string, usedContextVars); } -const char * Context::resolveStringVar(const char * string, ContextRcPtr & usedContextVars) const noexcept +const char * Context::resolveStringVar(const char * string, ContextRcPtr & usedContextVars) + const noexcept { AutoMutex lock(getImpl()->m_resultsCacheMutex); @@ -408,10 +415,11 @@ const char * Context::resolveFileLocation(const char * filename) const } // TODO: Currently usedContextVars includes (for non-absolute filenames) all context vars used in -// the search_path, regardless of whether they were needed to resolve the file location. So +// the search_path, regardless of whether they were needed to resolve the file location. So // usedContextVars may not be empty, even if no context vars are needed. Ideally, usedContextVars // would only contain the vars needed for the specific filename. -const char * Context::resolveFileLocation(const char * filename, ContextRcPtr & usedContextVars) const +const char * Context::resolveFileLocation(const char * filename, ContextRcPtr & usedContextVars) + const { AutoMutex lock(getImpl()->m_resultsCacheMutex); @@ -438,17 +446,18 @@ const char * Context::resolveFileLocation(const char * filename, ContextRcPtr & return iter->second.first.c_str(); } - // If the file reference is absolute, check if the file exists (independent of the search paths). - if(pystring::os::path::isabs(resolvedFilename)) + // If the file reference is absolute, check if the file exists (independent of the search + // paths). + if (pystring::os::path::isabs(resolvedFilename)) { - if(FileExists(resolvedFilename, *this)) + if (FileExists(resolvedFilename, *this)) { // That's already an absolute path so no extra context variables are present. UsedEnvs envs; // Note that the filepath cache key is the 'resolvedFilename'. - getImpl()->m_resultsFilepathCache[resolvedFilename] + getImpl()->m_resultsFilepathCache[resolvedFilename] = std::make_pair(pystring::os::path::normpath(resolvedFilename), envs); return getImpl()->m_resultsFilepathCache[resolvedFilename].first.c_str(); @@ -460,12 +469,13 @@ const char * Context::resolveFileLocation(const char * filename, ContextRcPtr & throw ExceptionMissingFile(errortext.str().c_str()); } - // As that's a relative path search for the right root path using search path(s) or working path. + // As that's a relative path search for the right root path using search path(s) or working + // path. // The search_paths could contain some context variables. UsedEnvs envs; - // TODO: Used context variables from GetAbsoluteSearchPaths() are from all the search_paths + // TODO: Used context variables from GetAbsoluteSearchPaths() are from all the search_paths // of the config i.e. it does not mean that all of them are used to resolve a FileTransform // for example. @@ -473,11 +483,12 @@ const char * Context::resolveFileLocation(const char * filename, ContextRcPtr & // Prep and resolve the search path vector // TODO: Cache this prepped vector? StringUtils::StringVec searchpaths; - GetAbsoluteSearchPaths(searchpaths, - getImpl()->m_searchPaths, - getImpl()->m_workingDir, - getImpl()->m_envMap, - envs); + GetAbsoluteSearchPaths( + searchpaths, + getImpl()->m_searchPaths, + getImpl()->m_workingDir, + getImpl()->m_envMap, + envs); // Loop over each path, and try to find the file std::ostringstream errortext; @@ -488,7 +499,8 @@ const char * Context::resolveFileLocation(const char * filename, ContextRcPtr & for (unsigned int i = 0; i < searchpaths.size(); ++i) { // Make an attempt to find the LUT in one of the search paths. - const std::string resolvedfullpath = pystring::os::path::join(searchpaths[i], resolvedFilename); + const std::string resolvedfullpath + = pystring::os::path::join(searchpaths[i], resolvedFilename); if (!ContainsContextVariables(resolvedfullpath) && FileExists(resolvedfullpath, *this)) { // Collect all the used context variables. @@ -507,7 +519,8 @@ const char * Context::resolveFileLocation(const char * filename, ContextRcPtr & return getImpl()->m_resultsFilepathCache[resolvedFilename].first.c_str(); } - if(i!=0) errortext << " : "; + if (i != 0) + errortext << " : "; errortext << "'" << resolvedfullpath << "'"; } errortext << "."; @@ -525,7 +538,7 @@ ConfigIOProxyRcPtr Context::getConfigIOProxy() const return getImpl()->m_configIOProxy; } -std::ostream& operator<< (std::ostream& os, const Context& context) +std::ostream & operator<<(std::ostream & os, const Context & context) { os << " #include "ContextVariableUtils.h" -#include "utils/StringUtils.h" #include "Platform.h" - +#include "utils/StringUtils.h" #if defined(__APPLE__) && !defined(__IPHONE__) #include // _NSGetEnviron() #elif !defined(_WIN32) -#include +#include extern char ** environ; #endif - namespace { @@ -39,20 +36,22 @@ inline char ** GetEnviron() } #endif -} // anon. +} // namespace namespace OCIO_NAMESPACE { bool ContainsContextVariableToken(const std::string & str) { - if (StringUtils::Find(str, "$") != std::string::npos) return true; - if (StringUtils::Find(str, "%") != std::string::npos) return true; + if (StringUtils::Find(str, "$") != std::string::npos) + return true; + if (StringUtils::Find(str, "%") != std::string::npos) + return true; return false; } -// The method only searches for at least one context variable without checking its existence. +// The method only searches for at least one context variable without checking its existence. bool ContainsContextVariables(const std::string & str) { // As soon as there is the '$' reserved token, a context variable is present. It does not matter @@ -69,7 +68,8 @@ bool ContainsContextVariables(const std::string & str) if (begin != std::string::npos) { const std::string::size_type end = StringUtils::ReverseFind(str, "%"); - if (end != std::string::npos && begin != end) return true; + if (end != std::string::npos && begin != end) + return true; } return false; @@ -80,7 +80,8 @@ void LoadEnvironment(EnvMap & map, bool update) // First, add or update the context variables with existing env. variables. #if defined(_WIN32) && defined(UNICODE) - if (GetEnviron() == NULL) { + if (GetEnviron() == NULL) + { // If the program starts with "main" instead of "wmain", then wenviron returns NULL until // the first call to either wgetenv or wputenv. Calling wgetenv, even with an empty // variable name, will populate wenviron correctly. We also use wgetenv_s (which requires @@ -89,22 +90,22 @@ void LoadEnvironment(EnvMap & map, bool update) _wgetenv_s(&sz, NULL, 0, L""); } - for (wchar_t **env = GetEnviron(); *env != NULL; ++env) + for (wchar_t ** env = GetEnviron(); *env != NULL; ++env) { // Split environment up into std::map[name] = value. - const std::string env_str = Platform::Utf16ToUtf8((wchar_t*)*env); + const std::string env_str = Platform::Utf16ToUtf8((wchar_t *)*env); #else - for (char **env = GetEnviron(); *env != NULL; ++env) + for (char ** env = GetEnviron(); *env != NULL; ++env) { // Split environment up into std::map[name] = value. - const std::string env_str = (char*)*env; + const std::string env_str = (char *)*env; #endif const int pos = static_cast(env_str.find_first_of('=')); const std::string name = env_str.substr(0, pos); - const std::string value = env_str.substr(pos+1, env_str.length()); + const std::string value = env_str.substr(pos + 1, env_str.length()); if (update) { @@ -130,7 +131,7 @@ std::string ResolveContextVariables(const std::string & str, const EnvMap & map, return str; } - std::string orig = str; + std::string orig = str; std::string newstr = str; // This walks through the envmap in key order, @@ -140,12 +141,12 @@ std::string ResolveContextVariables(const std::string & str, const EnvMap & map, for (const auto & entry : map) { - if (StringUtils::ReplaceInPlace(newstr, ("${"+ entry.first + "}"), entry.second)) + if (StringUtils::ReplaceInPlace(newstr, ("${" + entry.first + "}"), entry.second)) { used[entry.first] = entry.second; } - if (StringUtils::ReplaceInPlace(newstr, ("$" + entry.first), entry.second)) + if (StringUtils::ReplaceInPlace(newstr, ("$" + entry.first), entry.second)) { used[entry.first] = entry.second; } @@ -157,7 +158,7 @@ std::string ResolveContextVariables(const std::string & str, const EnvMap & map, } // recursively call till string doesn't expand anymore - if(newstr != orig) + if (newstr != orig) { return ResolveContextVariables(newstr, map, used); } @@ -165,34 +166,40 @@ std::string ResolveContextVariables(const std::string & str, const EnvMap & map, return orig; } -bool CollectContextVariables(const Config & config, - const Context & context, - ConstTransformRcPtr transform, - ContextRcPtr & usedContextVars) +bool CollectContextVariables( + const Config & config, + const Context & context, + ConstTransformRcPtr transform, + ContextRcPtr & usedContextVars) { - if(ConstColorSpaceTransformRcPtr tr = DynamicPtrCast(transform)) + if (ConstColorSpaceTransformRcPtr tr = DynamicPtrCast(transform)) { - if (CollectContextVariables(config, context, *tr, usedContextVars)) return true; + if (CollectContextVariables(config, context, *tr, usedContextVars)) + return true; } - else if(ConstDisplayViewTransformRcPtr tr = DynamicPtrCast(transform)) + else if ( + ConstDisplayViewTransformRcPtr tr = DynamicPtrCast(transform)) { - if (CollectContextVariables(config, context, *tr, usedContextVars)) return true; + if (CollectContextVariables(config, context, *tr, usedContextVars)) + return true; } - else if(ConstFileTransformRcPtr tr = DynamicPtrCast(transform)) + else if (ConstFileTransformRcPtr tr = DynamicPtrCast(transform)) { - if (CollectContextVariables(config, context, *tr, usedContextVars)) return true; + if (CollectContextVariables(config, context, *tr, usedContextVars)) + return true; } - else if(ConstGroupTransformRcPtr tr = DynamicPtrCast(transform)) + else if (ConstGroupTransformRcPtr tr = DynamicPtrCast(transform)) { - if (CollectContextVariables(config, context, *tr, usedContextVars)) return true; + if (CollectContextVariables(config, context, *tr, usedContextVars)) + return true; } - else if(ConstLookTransformRcPtr tr = DynamicPtrCast(transform)) + else if (ConstLookTransformRcPtr tr = DynamicPtrCast(transform)) { - if (CollectContextVariables(config, context, *tr, usedContextVars)) return true; + if (CollectContextVariables(config, context, *tr, usedContextVars)) + return true; } return false; } } // namespace OCIO_NAMESPACE - diff --git a/src/OpenColorIO/ContextVariableUtils.h b/src/OpenColorIO/ContextVariableUtils.h index db6022d7e6..c4ede4beb5 100644 --- a/src/OpenColorIO/ContextVariableUtils.h +++ b/src/OpenColorIO/ContextVariableUtils.h @@ -1,18 +1,15 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_CONTEXT_VARIABLE_UTILS_H #define INCLUDED_OCIO_CONTEXT_VARIABLE_UTILS_H - #include #include #include #include - namespace OCIO_NAMESPACE { @@ -25,24 +22,23 @@ bool ContainsContextVariables(const std::string & str); // The EnvMap is ordered by the length of the keys (long -> short). This is so that recursive string // expansion will deal with similar prefixed keys as expected. // ie. '$TEST_$TESTING_$TE' will expand in this order '2 1 3' -template -struct EnvMapKey +template struct EnvMapKey { - bool operator() (const T & x, const T & y) const + bool operator()(const T & x, const T & y) const { // If the lengths are unequal, sort by length. - if(x.length() != y.length()) + if (x.length() != y.length()) { return (x.length() > y.length()); } // Otherwise, use the standard string sort comparison. else { - return (x > EnvMap; +typedef std::map> EnvMap; // Get map of current env key = value, or update the existing entries void LoadEnvironment(EnvMap & map, bool update = false); @@ -53,52 +49,58 @@ typedef std::map UsedEnvs; // TODO: Keep the resolution order? std::string ResolveContextVariables(const std::string & str, const EnvMap & map, UsedEnvs & envs); - -// Return true if an instance of a transform uses a context variable, either directly or indirectly. +// Return true if an instance of a transform uses a context variable, either directly or indirectly. // Add any context variables that are used to usedContextVars. -bool CollectContextVariables(const Config & config, - const Context & context, - ConstTransformRcPtr tr, - ContextRcPtr & usedContextVars); - -bool CollectContextVariables(const Config & config, - const Context & context, - const ColorSpaceTransform & tr, - ContextRcPtr & usedContextVars); - -bool CollectContextVariables(const Config & config, - const Context & context, - const DisplayViewTransform & tr, - ContextRcPtr & usedContextVars); - -bool CollectContextVariables(const Config & config, - const Context & context, - const FileTransform & tr, - ContextRcPtr & usedContextVars); - -bool CollectContextVariables(const Config & config, - const Context & context, - const GroupTransform & tr, - ContextRcPtr & usedContextVars); - -bool CollectContextVariables(const Config & config, - const Context & context, - const LookTransform & tr, - ContextRcPtr & usedContextVars); - +bool CollectContextVariables( + const Config & config, + const Context & context, + ConstTransformRcPtr tr, + ContextRcPtr & usedContextVars); + +bool CollectContextVariables( + const Config & config, + const Context & context, + const ColorSpaceTransform & tr, + ContextRcPtr & usedContextVars); + +bool CollectContextVariables( + const Config & config, + const Context & context, + const DisplayViewTransform & tr, + ContextRcPtr & usedContextVars); + +bool CollectContextVariables( + const Config & config, + const Context & context, + const FileTransform & tr, + ContextRcPtr & usedContextVars); + +bool CollectContextVariables( + const Config & config, + const Context & context, + const GroupTransform & tr, + ContextRcPtr & usedContextVars); + +bool CollectContextVariables( + const Config & config, + const Context & context, + const LookTransform & tr, + ContextRcPtr & usedContextVars); // Helper methods to search for context variables. -bool CollectContextVariables(const Config & config, - const Context & context, - TransformDirection direction, - const Look & look, - ContextRcPtr & usedContextVars); - -bool CollectContextVariables(const Config & config, - const Context & context, - ConstColorSpaceRcPtr & tr, - ContextRcPtr & usedContextVars); +bool CollectContextVariables( + const Config & config, + const Context & context, + TransformDirection direction, + const Look & look, + ContextRcPtr & usedContextVars); + +bool CollectContextVariables( + const Config & config, + const Context & context, + ConstColorSpaceRcPtr & tr, + ContextRcPtr & usedContextVars); } // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/CustomKeys.h b/src/OpenColorIO/CustomKeys.h index 6b93a74d2e..aa6a2b87ac 100644 --- a/src/OpenColorIO/CustomKeys.h +++ b/src/OpenColorIO/CustomKeys.h @@ -1,11 +1,9 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_CUSTOMKEYS_H #define INCLUDED_OCIO_CUSTOMKEYS_H - #include #include #include @@ -18,16 +16,13 @@ namespace OCIO_NAMESPACE class CustomKeysContainer { public: - CustomKeysContainer() = default; - CustomKeysContainer(const CustomKeysContainer &) = default; + CustomKeysContainer() = default; + CustomKeysContainer(const CustomKeysContainer &) = default; CustomKeysContainer & operator=(const CustomKeysContainer &) = default; using CustomKeys = std::map; - size_t getSize() const noexcept - { - return m_customKeys.size(); - } + size_t getSize() const noexcept { return m_customKeys.size(); } const char * getName(size_t key) const { @@ -75,6 +70,6 @@ class CustomKeysContainer CustomKeys m_customKeys; }; -} // namespace OCIO_NAMESPACE +} // namespace OCIO_NAMESPACE #endif // INCLUDED_OCIO_CUSTOMKEYS_H diff --git a/src/OpenColorIO/Display.cpp b/src/OpenColorIO/Display.cpp index 4280b99231..7bafdf13b8 100644 --- a/src/OpenColorIO/Display.cpp +++ b/src/OpenColorIO/Display.cpp @@ -14,43 +14,40 @@ namespace OCIO_NAMESPACE DisplayMap::iterator FindDisplay(DisplayMap & displays, const std::string & name) { - return std::find_if(displays.begin(), displays.end(), - [name](DisplayPair & display) - { - return 0 == Platform::Strcasecmp(name.c_str(), display.first.c_str()); - }); + return std::find_if(displays.begin(), displays.end(), [name](DisplayPair & display) { + return 0 == Platform::Strcasecmp(name.c_str(), display.first.c_str()); + }); } DisplayMap::const_iterator FindDisplay(const DisplayMap & displays, const std::string & name) { - return std::find_if(displays.begin(), displays.end(), - [name](const DisplayPair & display) - { - return 0 == Platform::Strcasecmp(name.c_str(), display.first.c_str()); - }); + return std::find_if(displays.begin(), displays.end(), [name](const DisplayPair & display) { + return 0 == Platform::Strcasecmp(name.c_str(), display.first.c_str()); + }); } ViewVec::const_iterator FindView(const ViewVec & vec, const std::string & name) { - return std::find_if(vec.begin(), vec.end(), - [name](const View & view) - { - return 0 == Platform::Strcasecmp(name.c_str(), view.m_name.c_str()); - }); + return std::find_if(vec.begin(), vec.end(), [name](const View & view) { + return 0 == Platform::Strcasecmp(name.c_str(), view.m_name.c_str()); + }); } ViewVec::iterator FindView(ViewVec & vec, const std::string & name) { - return std::find_if(vec.begin(), vec.end(), - [name](View & view) - { - return 0 == Platform::Strcasecmp(name.c_str(), view.m_name.c_str()); - }); + return std::find_if(vec.begin(), vec.end(), [name](View & view) { + return 0 == Platform::Strcasecmp(name.c_str(), view.m_name.c_str()); + }); } -void AddView(ViewVec & views, const char * name, const char * viewTransform, - const char * displayColorSpace, const char * looks, - const char * rule, const char * description) +void AddView( + ViewVec & views, + const char * name, + const char * viewTransform, + const char * displayColorSpace, + const char * looks, + const char * rule, + const char * description) { if (0 == Platform::Strcasecmp(displayColorSpace, OCIO_VIEW_USE_DISPLAY_NAME)) { @@ -63,38 +60,41 @@ void AddView(ViewVec & views, const char * name, const char * viewTransform, } else { - (*view).m_viewTransform = viewTransform ? viewTransform : ""; + (*view).m_viewTransform = viewTransform ? viewTransform : ""; (*view).m_colorspace = displayColorSpace ? displayColorSpace : ""; - (*view).m_looks = looks ? looks : ""; - (*view).m_rule = rule ? rule : ""; - (*view).m_description = description ? description : ""; + (*view).m_looks = looks ? looks : ""; + (*view).m_rule = rule ? rule : ""; + (*view).m_description = description ? description : ""; } } -void ComputeDisplays(StringUtils::StringVec & displayCache, - const DisplayMap & displays, - const StringUtils::StringVec & activeDisplays, - const StringUtils::StringVec & activeDisplaysEnvOverride) +void ComputeDisplays( + StringUtils::StringVec & displayCache, + const DisplayMap & displays, + const StringUtils::StringVec & activeDisplays, + const StringUtils::StringVec & activeDisplaysEnvOverride) { displayCache.clear(); StringUtils::StringVec displayMasterList; - for(const auto & display : displays) + for (const auto & display : displays) { displayMasterList.push_back(display.first); } // Apply the env override if it's not empty. - if(!activeDisplaysEnvOverride.empty()) + if (!activeDisplaysEnvOverride.empty()) { displayCache = IntersectStringVecsCaseIgnore(activeDisplaysEnvOverride, displayMasterList); - if(!displayCache.empty()) return; + if (!displayCache.empty()) + return; } // Otherwise, apply the active displays if it's not empty. - else if(!activeDisplays.empty()) + else if (!activeDisplays.empty()) { displayCache = IntersectStringVecsCaseIgnore(activeDisplays, displayMasterList); - if(!displayCache.empty()) return; + if (!displayCache.empty()) + return; } displayCache = displayMasterList; diff --git a/src/OpenColorIO/Display.h b/src/OpenColorIO/Display.h index 43e1b2cc9c..fd6a33ca0b 100644 --- a/src/OpenColorIO/Display.h +++ b/src/OpenColorIO/Display.h @@ -1,11 +1,9 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_DISPLAY_H #define INCLUDED_OCIO_DISPLAY_H - #include #include @@ -15,7 +13,6 @@ #include "PrivateTypes.h" #include "utils/StringUtils.h" - namespace OCIO_NAMESPACE { @@ -25,35 +22,34 @@ struct View std::string m_name; std::string m_viewTransform; // Might be empty. std::string m_colorspace; - std::string m_looks; // Might be empty. - std::string m_rule; // Might be empty. - std::string m_description; // Might be empty. + std::string m_looks; // Might be empty. + std::string m_rule; // Might be empty. + std::string m_description; // Might be empty. View() = default; - View(const char * name, - const char * viewTransform, - const char * colorspace, - const char * looks, - const char * rule, - const char * description) + View( + const char * name, + const char * viewTransform, + const char * colorspace, + const char * looks, + const char * rule, + const char * description) : m_name(name) , m_viewTransform(viewTransform ? viewTransform : "") , m_colorspace(colorspace ? colorspace : "") , m_looks(looks ? looks : "") , m_rule(rule ? rule : "") , m_description(description ? description : "") - { } + { + } // Make sure that csname is not null. static bool UseDisplayName(const char * csname) { return csname && 0 == Platform::Strcasecmp(csname, OCIO_VIEW_USE_DISPLAY_NAME); } - bool useDisplayNameForColorspace() const - { - return UseDisplayName(m_colorspace.c_str()); - } + bool useDisplayNameForColorspace() const { return UseDisplayName(m_colorspace.c_str()); } }; typedef std::vector ViewVec; @@ -61,9 +57,14 @@ typedef std::vector ViewVec; ViewVec::const_iterator FindView(const ViewVec & vec, const std::string & name); ViewVec::iterator FindView(ViewVec & vec, const std::string & name); -void AddView(ViewVec & views, const char * name, const char * viewTransform, - const char * displayColorSpace, const char * looks, - const char * rule, const char * description); +void AddView( + ViewVec & views, + const char * name, + const char * viewTransform, + const char * displayColorSpace, + const char * looks, + const char * rule, + const char * description); // Display can be part of the list of displays (DisplayMap) of a config. struct Display @@ -77,19 +78,20 @@ struct Display StringUtils::StringVec m_sharedViews; }; -// In 0.6, the Yaml lib changed their implementation of a Yaml::Map from a C++ map -// to a std::vector< std::pair<> >. We made the same change here so that the Display list +// In 0.6, the Yaml lib changed their implementation of a Yaml::Map from a C++ map +// to a std::vector< std::pair<> >. We made the same change here so that the Display list // can remain in config order but we left the "Map" in the name since it refers to a Yaml::Map. typedef std::pair DisplayPair; -typedef std::vector DisplayMap; // Pair is (display name : ViewVec) +typedef std::vector DisplayMap; // Pair is (display name : ViewVec) DisplayMap::iterator FindDisplay(DisplayMap & displays, const std::string & display); DisplayMap::const_iterator FindDisplay(const DisplayMap & displays, const std::string & display); -void ComputeDisplays(StringUtils::StringVec & displayCache, - const DisplayMap & displays, - const StringUtils::StringVec & activeDisplays, - const StringUtils::StringVec & activeDisplaysEnvOverride); +void ComputeDisplays( + StringUtils::StringVec & displayCache, + const DisplayMap & displays, + const StringUtils::StringVec & activeDisplays, + const StringUtils::StringVec & activeDisplaysEnvOverride); } // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/DynamicProperty.cpp b/src/OpenColorIO/DynamicProperty.cpp index 5885492cfe..32a5642b0e 100644 --- a/src/OpenColorIO/DynamicProperty.cpp +++ b/src/OpenColorIO/DynamicProperty.cpp @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #include #include "DynamicProperty.h" @@ -17,35 +16,40 @@ namespace DynamicPropertyValue DynamicPropertyDoubleRcPtr AsDouble(DynamicPropertyRcPtr & prop) { auto res = OCIO_DYNAMIC_POINTER_CAST(prop); - if (res) return res; + if (res) + return res; throw Exception("Dynamic property value is not a double."); } DynamicPropertyGradingPrimaryRcPtr AsGradingPrimary(DynamicPropertyRcPtr & prop) { auto res = OCIO_DYNAMIC_POINTER_CAST(prop); - if (res) return res; + if (res) + return res; throw Exception("Dynamic property value is not a grading primary."); } DynamicPropertyGradingRGBCurveRcPtr AsGradingRGBCurve(DynamicPropertyRcPtr & prop) { auto res = OCIO_DYNAMIC_POINTER_CAST(prop); - if (res) return res; + if (res) + return res; throw Exception("Dynamic property value is not a grading RGB curve."); } DynamicPropertyGradingToneRcPtr AsGradingTone(DynamicPropertyRcPtr & prop) { auto res = OCIO_DYNAMIC_POINTER_CAST(prop); - if (res) return res; + if (res) + return res; throw Exception("Dynamic property value is not a grading tone."); } -} +} // namespace DynamicPropertyValue -bool operator==(const DynamicProperty &lhs, const DynamicProperty &rhs) +bool operator==(const DynamicProperty & lhs, const DynamicProperty & rhs) { - if (lhs.getType() != rhs.getType()) return false; + if (lhs.getType() != rhs.getType()) + return false; - DynamicPropertyImpl const * plhs = dynamic_cast(&lhs); - DynamicPropertyImpl const * prhs = dynamic_cast(&rhs); + DynamicPropertyImpl const * plhs = dynamic_cast(&lhs); + DynamicPropertyImpl const * prhs = dynamic_cast(&rhs); if (plhs && prhs) { return plhs->equals(*prhs); @@ -61,7 +65,8 @@ DynamicPropertyImpl::DynamicPropertyImpl(DynamicPropertyType type, bool dynamic) bool DynamicPropertyImpl::equals(const DynamicPropertyImpl & rhs) const { - if (this == &rhs) return true; + if (this == &rhs) + return true; if (m_isDynamic == rhs.m_isDynamic && m_type == rhs.m_type) { @@ -70,32 +75,32 @@ bool DynamicPropertyImpl::equals(const DynamicPropertyImpl & rhs) const // Both not dynamic, same value or not. switch (getType()) { - case DYNAMIC_PROPERTY_CONTRAST: - case DYNAMIC_PROPERTY_EXPOSURE: - case DYNAMIC_PROPERTY_GAMMA: - { - auto lhst = dynamic_cast(this); - auto rhst = dynamic_cast(&rhs); - return lhst && rhst && (lhst->getValue() == rhst->getValue()); - } - case DYNAMIC_PROPERTY_GRADING_PRIMARY: - { - auto lhst = dynamic_cast(this); - auto rhst = dynamic_cast(&rhs); - return lhst && rhst && (lhst->getValue() == rhst->getValue()); - } - case DYNAMIC_PROPERTY_GRADING_RGBCURVE: - { - auto lhst = dynamic_cast(this); - auto rhst = dynamic_cast(&rhs); - return lhst && rhst && (*lhst->getValue() == *rhst->getValue()); - } - case DYNAMIC_PROPERTY_GRADING_TONE: - { - auto lhst = dynamic_cast(this); - auto rhst = dynamic_cast(&rhs); - return lhst && rhst && (lhst->getValue() == rhst->getValue()); - } + case DYNAMIC_PROPERTY_CONTRAST: + case DYNAMIC_PROPERTY_EXPOSURE: + case DYNAMIC_PROPERTY_GAMMA: + { + auto lhst = dynamic_cast(this); + auto rhst = dynamic_cast(&rhs); + return lhst && rhst && (lhst->getValue() == rhst->getValue()); + } + case DYNAMIC_PROPERTY_GRADING_PRIMARY: + { + auto lhst = dynamic_cast(this); + auto rhst = dynamic_cast(&rhs); + return lhst && rhst && (lhst->getValue() == rhst->getValue()); + } + case DYNAMIC_PROPERTY_GRADING_RGBCURVE: + { + auto lhst = dynamic_cast(this); + auto rhst = dynamic_cast(&rhs); + return lhst && rhst && (*lhst->getValue() == *rhst->getValue()); + } + case DYNAMIC_PROPERTY_GRADING_TONE: + { + auto lhst = dynamic_cast(this); + auto rhst = dynamic_cast(&rhs); + return lhst && rhst && (lhst->getValue() == rhst->getValue()); + } } // Different values. return false; @@ -112,9 +117,10 @@ bool DynamicPropertyImpl::equals(const DynamicPropertyImpl & rhs) const return false; } -DynamicPropertyDoubleImpl::DynamicPropertyDoubleImpl(DynamicPropertyType type, - double value, - bool dynamic) +DynamicPropertyDoubleImpl::DynamicPropertyDoubleImpl( + DynamicPropertyType type, + double value, + bool dynamic) : DynamicPropertyImpl(type, dynamic) , m_value(value) { @@ -125,10 +131,11 @@ DynamicPropertyDoubleImplRcPtr DynamicPropertyDoubleImpl::createEditableCopy() c return std::make_shared(getType(), getValue(), isDynamic()); } -DynamicPropertyGradingPrimaryImpl::DynamicPropertyGradingPrimaryImpl(GradingStyle style, - TransformDirection dir, - const GradingPrimary & value, - bool dynamic) +DynamicPropertyGradingPrimaryImpl::DynamicPropertyGradingPrimaryImpl( + GradingStyle style, + TransformDirection dir, + const GradingPrimary & value, + bool dynamic) : DynamicPropertyImpl(DYNAMIC_PROPERTY_GRADING_PRIMARY, dynamic) , m_style(style) , m_direction(dir) @@ -137,9 +144,10 @@ DynamicPropertyGradingPrimaryImpl::DynamicPropertyGradingPrimaryImpl(GradingStyl m_preRenderValues.update(m_style, m_direction, m_value); } -DynamicPropertyGradingPrimaryImpl::DynamicPropertyGradingPrimaryImpl(GradingStyle style, - TransformDirection dir, - const GradingPrimary & value, +DynamicPropertyGradingPrimaryImpl::DynamicPropertyGradingPrimaryImpl( + GradingStyle style, + TransformDirection dir, + const GradingPrimary & value, const GradingPrimaryPreRender & comp, bool dynamic) : DynamicPropertyImpl(DYNAMIC_PROPERTY_GRADING_PRIMARY, dynamic) @@ -152,11 +160,12 @@ DynamicPropertyGradingPrimaryImpl::DynamicPropertyGradingPrimaryImpl(GradingStyl DynamicPropertyGradingPrimaryImplRcPtr DynamicPropertyGradingPrimaryImpl::createEditableCopy() const { - return std::make_shared(m_style, - m_direction, - m_value, - m_preRenderValues, - isDynamic()); + return std::make_shared( + m_style, + m_direction, + m_value, + m_preRenderValues, + isDynamic()); } void DynamicPropertyGradingPrimaryImpl::setValue(const GradingPrimary & value) @@ -184,7 +193,8 @@ void DynamicPropertyGradingPrimaryImpl::setDirection(TransformDirection dir) noe } DynamicPropertyGradingRGBCurveImpl::DynamicPropertyGradingRGBCurveImpl( - const ConstGradingRGBCurveRcPtr & value, bool dynamic) + const ConstGradingRGBCurveRcPtr & value, + bool dynamic) : DynamicPropertyImpl(DYNAMIC_PROPERTY_GRADING_RGBCURVE, dynamic) { m_gradingRGBCurve = GradingRGBCurve::Create(value); @@ -260,25 +270,28 @@ void DynamicPropertyGradingRGBCurveImpl::precompute() // Compute knots and coefficients for each control point and pack all knots and coefs of // all curves in one knots array and one coef array, using an offset array to find specific // curve data. - for (const auto c : { RGB_RED, RGB_GREEN, RGB_BLUE, RGB_MASTER }) + for (const auto c : {RGB_RED, RGB_GREEN, RGB_BLUE, RGB_MASTER}) { ConstGradingBSplineCurveRcPtr curve = m_gradingRGBCurve->getCurve(c); auto curveImpl = dynamic_cast(curve.get()); curveImpl->computeKnotsAndCoefs(m_knotsCoefs, static_cast(c)); } - if (m_knotsCoefs.m_knotsArray.empty()) m_knotsCoefs.m_localBypass = true; + if (m_knotsCoefs.m_knotsArray.empty()) + m_knotsCoefs.m_localBypass = true; } -DynamicPropertyGradingRGBCurveImplRcPtr DynamicPropertyGradingRGBCurveImpl::createEditableCopy() const +DynamicPropertyGradingRGBCurveImplRcPtr DynamicPropertyGradingRGBCurveImpl::createEditableCopy() + const { auto res = std::make_shared(getValue(), isDynamic()); res->m_knotsCoefs = m_knotsCoefs; return res; } -DynamicPropertyGradingToneImpl::DynamicPropertyGradingToneImpl(const GradingTone & value, - GradingStyle style, - bool dynamic) +DynamicPropertyGradingToneImpl::DynamicPropertyGradingToneImpl( + const GradingTone & value, + GradingStyle style, + bool dynamic) : DynamicPropertyImpl(DYNAMIC_PROPERTY_GRADING_TONE, dynamic) , m_value(value) , m_preRenderValues(style) @@ -286,9 +299,10 @@ DynamicPropertyGradingToneImpl::DynamicPropertyGradingToneImpl(const GradingTone m_preRenderValues.update(m_value); } -DynamicPropertyGradingToneImpl::DynamicPropertyGradingToneImpl(const GradingTone & value, - const GradingTonePreRender & comp, - bool dynamic) +DynamicPropertyGradingToneImpl::DynamicPropertyGradingToneImpl( + const GradingTone & value, + const GradingTonePreRender & comp, + bool dynamic) : DynamicPropertyImpl(DYNAMIC_PROPERTY_GRADING_TONE, dynamic) , m_value(value) , m_preRenderValues(comp) @@ -297,7 +311,10 @@ DynamicPropertyGradingToneImpl::DynamicPropertyGradingToneImpl(const GradingTone DynamicPropertyGradingToneImplRcPtr DynamicPropertyGradingToneImpl::createEditableCopy() const { - return std::make_shared(m_value, m_preRenderValues, isDynamic()); + return std::make_shared( + m_value, + m_preRenderValues, + isDynamic()); } void DynamicPropertyGradingToneImpl::setValue(const GradingTone & value) diff --git a/src/OpenColorIO/DynamicProperty.h b/src/OpenColorIO/DynamicProperty.h index 0e398d9b30..b67c6b3769 100644 --- a/src/OpenColorIO/DynamicProperty.h +++ b/src/OpenColorIO/DynamicProperty.h @@ -24,25 +24,13 @@ class DynamicPropertyImpl : public DynamicProperty DynamicPropertyImpl(DynamicPropertyType type, bool dynamic); virtual ~DynamicPropertyImpl() = default; - DynamicPropertyType getType() const noexcept override - { - return m_type; - } - - bool isDynamic() const noexcept - { - return m_isDynamic; - } - - void makeDynamic() noexcept - { - m_isDynamic = true; - } - - void makeNonDynamic() noexcept - { - m_isDynamic = false; - } + DynamicPropertyType getType() const noexcept override { return m_type; } + + bool isDynamic() const noexcept { return m_isDynamic; } + + void makeDynamic() noexcept { m_isDynamic = true; } + + void makeNonDynamic() noexcept { m_isDynamic = false; } // When comparing properties for equality, the following rules apply: // - If neither of the objects are dynamic, simply compare the values as usual. @@ -58,14 +46,13 @@ class DynamicPropertyImpl : public DynamicProperty DynamicPropertyImpl(DynamicPropertyType type); DynamicPropertyImpl & operator=(DynamicPropertyImpl &) = delete; - DynamicPropertyType m_type{ DYNAMIC_PROPERTY_EXPOSURE }; + DynamicPropertyType m_type{DYNAMIC_PROPERTY_EXPOSURE}; - bool m_isDynamic{ false }; + bool m_isDynamic{false}; }; bool operator==(const DynamicProperty &, const DynamicProperty &); - class DynamicPropertyDoubleImpl; typedef OCIO_SHARED_PTR DynamicPropertyDoubleImplRcPtr; @@ -92,16 +79,18 @@ class DynamicPropertyGradingPrimaryImpl : public DynamicPropertyImpl, { public: DynamicPropertyGradingPrimaryImpl() = delete; - DynamicPropertyGradingPrimaryImpl(GradingStyle style, - TransformDirection dir, - const GradingPrimary & val, - bool dynamic); + DynamicPropertyGradingPrimaryImpl( + GradingStyle style, + TransformDirection dir, + const GradingPrimary & val, + bool dynamic); // Only to create a copy. - DynamicPropertyGradingPrimaryImpl(GradingStyle style, - TransformDirection dir, - const GradingPrimary & value, - const GradingPrimaryPreRender & computed, - bool dynamic); + DynamicPropertyGradingPrimaryImpl( + GradingStyle style, + TransformDirection dir, + const GradingPrimary & value, + const GradingPrimaryPreRender & computed, + bool dynamic); ~DynamicPropertyGradingPrimaryImpl() = default; const GradingPrimary & getValue() const override { return m_value; } @@ -128,13 +117,12 @@ class DynamicPropertyGradingPrimaryImpl : public DynamicPropertyImpl, DynamicPropertyGradingPrimaryImplRcPtr createEditableCopy() const; private: - GradingStyle m_style{ GRADING_LOG }; - TransformDirection m_direction{ TRANSFORM_DIR_FORWARD }; + GradingStyle m_style{GRADING_LOG}; + TransformDirection m_direction{TRANSFORM_DIR_FORWARD}; GradingPrimary m_value; GradingPrimaryPreRender m_preRenderValues; }; - class DynamicPropertyGradingRGBCurveImpl; typedef OCIO_SHARED_PTR DynamicPropertyGradingRGBCurveImplRcPtr; @@ -170,22 +158,22 @@ class DynamicPropertyGradingRGBCurveImpl : public DynamicPropertyImpl, ConstGradingRGBCurveRcPtr m_gradingRGBCurve; // Holds curve data as knots and coefs. There are 4 curves. - GradingBSplineCurveImpl::KnotsCoefs m_knotsCoefs{ 4 }; + GradingBSplineCurveImpl::KnotsCoefs m_knotsCoefs{4}; }; class DynamicPropertyGradingToneImpl; typedef OCIO_SHARED_PTR DynamicPropertyGradingToneImplRcPtr; -class DynamicPropertyGradingToneImpl : public DynamicPropertyImpl, - public DynamicPropertyGradingTone +class DynamicPropertyGradingToneImpl : public DynamicPropertyImpl, public DynamicPropertyGradingTone { public: DynamicPropertyGradingToneImpl() = delete; DynamicPropertyGradingToneImpl(const GradingTone & value, GradingStyle style, bool dynamic); // Only to create a copy. - DynamicPropertyGradingToneImpl(const GradingTone & value, - const GradingTonePreRender & computed, - bool dynamic); + DynamicPropertyGradingToneImpl( + const GradingTone & value, + const GradingTonePreRender & computed, + bool dynamic); ~DynamicPropertyGradingToneImpl() = default; const GradingTone & getValue() const override { return m_value; } @@ -199,7 +187,6 @@ class DynamicPropertyGradingToneImpl : public DynamicPropertyImpl, DynamicPropertyGradingToneImplRcPtr createEditableCopy() const; private: - GradingTone m_value; GradingTonePreRender m_preRenderValues; }; diff --git a/src/OpenColorIO/Exception.cpp b/src/OpenColorIO/Exception.cpp index 061324e138..4b78931f54 100644 --- a/src/OpenColorIO/Exception.cpp +++ b/src/OpenColorIO/Exception.cpp @@ -7,12 +7,12 @@ namespace OCIO_NAMESPACE { Exception::Exception(const char * msg) - : std::runtime_error(msg) + : std::runtime_error(msg) { } Exception::Exception(const Exception & e) - : std::runtime_error(e) + : std::runtime_error(e) { } @@ -20,14 +20,13 @@ Exception::~Exception() { } - ExceptionMissingFile::ExceptionMissingFile(const char * msg) - : Exception(msg) + : Exception(msg) { } ExceptionMissingFile::ExceptionMissingFile(const ExceptionMissingFile & e) - : Exception(e) + : Exception(e) { } @@ -36,4 +35,3 @@ ExceptionMissingFile::~ExceptionMissingFile() } } // namespace OCIO_NAMESPACE - diff --git a/src/OpenColorIO/FileRules.cpp b/src/OpenColorIO/FileRules.cpp index 61a5e0f152..8e6746ed0a 100644 --- a/src/OpenColorIO/FileRules.cpp +++ b/src/OpenColorIO/FileRules.cpp @@ -17,7 +17,6 @@ #include "Platform.h" #include "utils/StringUtils.h" - namespace OCIO_NAMESPACE { @@ -51,8 +50,8 @@ std::string SanitizeRegularExpression(const std::string & regexPattern) void ThrowInvalidRegex(const char * globPattern, const char * what) { std::ostringstream oss; - oss << "File rules: invalid regular expression '" << std::string(globPattern) - << "' with '" << std::string(what) << "'."; + oss << "File rules: invalid regular expression '" << std::string(globPattern) << "' with '" + << std::string(what) << "'."; throw Exception(oss.str().c_str()); } @@ -63,18 +62,17 @@ std::string ConvertToRegularExpression(const char * globPattern, bool ignoreCase if (ignoreCase) { const size_t length = strlen(globPattern); - bool respectCase = false; + bool respectCase = false; for (size_t i = 0; i < length; ++i) { - if (globPattern[i] == '[' || globPattern[i] == '*' || - globPattern[i] == '?') + if (globPattern[i] == '[' || globPattern[i] == '*' || globPattern[i] == '?') { respectCase = true; break; } if (isalpha(globPattern[i])) { - std::string replaceBy{ "[" }; + std::string replaceBy{"["}; replaceBy += tolower(globPattern[i]); replaceBy += toupper(globPattern[i]); replaceBy += "]"; @@ -97,15 +95,18 @@ std::string ConvertToRegularExpression(const char * globPattern, bool ignoreCase std::string regexPattern; const size_t globSize = globString.size(); - size_t nextIdx = 0; + size_t nextIdx = 0; for (size_t idx = 0; idx < globSize; idx = nextIdx) { nextIdx = idx + 1; + // clang-format off if (globString[idx] == '.') { regexPattern += "\\."; continue; } if (globString[idx] == '?') { regexPattern += "."; continue; } if (globString[idx] == '*') { regexPattern += ".*"; continue; } + // clang-format on // Escape regex characters. + // clang-format off if (globString[idx] == '+') { regexPattern += "\\+"; continue; } if (globString[idx] == '^') { regexPattern += "\\^"; continue; } if (globString[idx] == '$') { regexPattern += "\\$"; continue; } @@ -114,6 +115,7 @@ std::string ConvertToRegularExpression(const char * globPattern, bool ignoreCase if (globString[idx] == '(') { regexPattern += "\\("; continue; } if (globString[idx] == ')') { regexPattern += "\\)"; continue; } if (globString[idx] == '|') { regexPattern += "\\|"; continue; } + // clang-format on if (globString[idx] == ']') { @@ -131,6 +133,7 @@ std::string ConvertToRegularExpression(const char * globPattern, bool ignoreCase { subString += '^'; } + // clang-format off else if (globString[end] == '+' || globString[end] == '^' || globString[end] == '$' @@ -139,6 +142,7 @@ std::string ConvertToRegularExpression(const char * globPattern, bool ignoreCase || globString[end] == '(' || globString[end] == ')' || globString[end] == '|') + // clang-format on { // Escape regex characters. subString += "\\"; @@ -148,9 +152,7 @@ std::string ConvertToRegularExpression(const char * globPattern, bool ignoreCase { subString += "\\\\"; } - else if (globString[end] == '.' - || globString[end] == '?' - || globString[end] == '*') + else if (globString[end] == '.' || globString[end] == '?' || globString[end] == '*') { if (globString[end - 1] != '\\') { @@ -249,11 +251,8 @@ std::string BuildRegularExpression(const char * filePathPattern, const char * fi catch (std::regex_error & ex) { std::ostringstream oss; - oss << "File rules: invalid regular expression '" - << str - << "' built from pattern '" << filePathPattern - << " and extension '" << fileNameExtension << "': '" - << ex.what() + oss << "File rules: invalid regular expression '" << str << "' built from pattern '" + << filePathPattern << " and extension '" << fileNameExtension << "': '" << ex.what() << "'."; throw Exception(oss.str().c_str()); } @@ -275,11 +274,7 @@ void ValidateRegularExpression(const char * regex) catch (std::regex_error & ex) { std::ostringstream oss; - oss << "File rules: invalid regular expression '" - << regex - << "': '" - << ex.what() - << "'."; + oss << "File rules: invalid regular expression '" << regex << "': '" << ex.what() << "'."; throw Exception(oss.str().c_str()); } } @@ -290,7 +285,7 @@ void ValidateRegularExpression(const char * filePathPattern, const char * fileNa ValidateRegularExpression(exp.c_str()); } -} +} // namespace class FileRule { @@ -303,8 +298,8 @@ class FileRule FILE_RULE_GLOB }; - FileRule() = delete; - FileRule(const FileRule &) = delete; + FileRule() = delete; + FileRule(const FileRule &) = delete; FileRule & operator=(const FileRule &) = delete; explicit FileRule(const char * name) @@ -314,12 +309,12 @@ class FileRule { throw Exception("The file rule name is empty"); } - else if (0==Platform::Strcasecmp(name, FileRules::DefaultRuleName)) + else if (0 == Platform::Strcasecmp(name, FileRules::DefaultRuleName)) { m_name = FileRules::DefaultRuleName; // Enforce case consistency. m_type = FILE_RULE_DEFAULT; } - else if (0==Platform::Strcasecmp(name, FileRules::FilePathSearchRuleName)) + else if (0 == Platform::Strcasecmp(name, FileRules::FilePathSearchRuleName)) { m_name = FileRules::FilePathSearchRuleName; // Enforce case consistency. m_type = FILE_RULE_PARSE_FILEPATH; @@ -346,10 +341,7 @@ class FileRule return rule; } - const char * getName() const noexcept - { - return m_name.c_str(); - } + const char * getName() const noexcept { return m_name.c_str(); } const char * getPattern() const noexcept { @@ -378,8 +370,8 @@ class FileRule } ValidateRegularExpression(pattern, m_extension.c_str()); m_pattern = pattern; - m_regex = ""; - m_type = FILE_RULE_GLOB; + m_regex = ""; + m_type = FILE_RULE_GLOB; } } @@ -410,8 +402,8 @@ class FileRule } ValidateRegularExpression(m_pattern.c_str(), extension); m_extension = extension; - m_regex = ""; - m_type = FILE_RULE_GLOB; + m_regex = ""; + m_type = FILE_RULE_GLOB; } } @@ -437,17 +429,14 @@ class FileRule else { ValidateRegularExpression(regex); - m_regex = regex; - m_pattern = ""; + m_regex = regex; + m_pattern = ""; m_extension = ""; - m_type = FILE_RULE_REGEX; + m_type = FILE_RULE_REGEX; } } - const char * getColorSpace() const - { - return m_colorSpace.c_str(); - } + const char * getColorSpace() const { return m_colorSpace.c_str(); } void setColorSpace(const char * colorSpace) { @@ -473,32 +462,33 @@ class FileRule { switch (m_type) { - case FILE_RULE_DEFAULT: - return true; - case FILE_RULE_PARSE_FILEPATH: - { - const int rightMostColorSpaceIndex = ParseColorSpaceFromString(config, path); - if (rightMostColorSpaceIndex >= 0) - { - m_colorSpace = config.getColorSpaceNameByIndex(SEARCH_REFERENCE_SPACE_ALL, - COLORSPACE_ALL, - rightMostColorSpaceIndex); + case FILE_RULE_DEFAULT: return true; + case FILE_RULE_PARSE_FILEPATH: + { + const int rightMostColorSpaceIndex = ParseColorSpaceFromString(config, path); + if (rightMostColorSpaceIndex >= 0) + { + m_colorSpace = config.getColorSpaceNameByIndex( + SEARCH_REFERENCE_SPACE_ALL, + COLORSPACE_ALL, + rightMostColorSpaceIndex); + return true; + } + return false; + } + case FILE_RULE_REGEX: + { + const std::regex reg(m_regex.c_str()); + return regex_match(path, reg); + } + case FILE_RULE_GLOB: + { + const std::string exp + = BuildRegularExpression(m_pattern.c_str(), m_extension.c_str()); + const std::regex reg(exp.c_str()); + return regex_match(path, reg); } - return false; - } - case FILE_RULE_REGEX: - { - const std::regex reg(m_regex.c_str()); - return regex_match(path, reg); - } - case FILE_RULE_GLOB: - { - const std::string exp = BuildRegularExpression(m_pattern.c_str(), - m_extension.c_str()); - const std::regex reg(exp.c_str()); - return regex_match(path, reg); - } } return false; } @@ -514,8 +504,9 @@ class FileRule { std::ostringstream oss; oss << "File rules: rule named '" << m_name << "' is referencing '" - << m_colorSpace << "' that is neither a color space nor a named " - "transform."; + << m_colorSpace + << "' that is neither a color space nor a named " + "transform."; throw Exception(oss.str().c_str()); } } @@ -525,13 +516,12 @@ class FileRule CustomKeysContainer m_customKeys; private: - std::string m_name; mutable std::string m_colorSpace; std::string m_pattern; std::string m_extension; std::string m_regex; - RuleType m_type{ FILE_RULE_GLOB }; + RuleType m_type{FILE_RULE_GLOB}; }; FileRules::FileRules() @@ -558,7 +548,7 @@ void FileRules::deleter(FileRules * fr) FileRulesRcPtr FileRules::createEditableCopy() const { FileRulesRcPtr rules = Create(); - *rules->m_impl = *m_impl; // Deep copy. + *rules->m_impl = *m_impl; // Deep copy. return rules; } @@ -571,7 +561,7 @@ FileRules::Impl::Impl() FileRules::Impl & FileRules::Impl::operator=(const FileRules::Impl & rhs) { - if (this!=&rhs) + if (this != &rhs) { m_rules.clear(); // Remove the 'Default' rule. @@ -590,8 +580,8 @@ void FileRules::Impl::validatePosition(size_t ruleIndex, DefaultAllowed allowDef if (ruleIndex >= numRules) { std::ostringstream oss; - oss << "File rules: rule index '" << ruleIndex << "' invalid." - << " There are only '" << numRules << "' rules."; + oss << "File rules: rule index '" << ruleIndex << "' invalid." << " There are only '" + << numRules << "' rules."; throw Exception(oss.str().c_str()); } if (allowDefault == DEFAULT_NOT_ALLOWED && ruleIndex + 1 == numRules) @@ -608,11 +598,10 @@ void FileRules::Impl::validateNewRule(size_t ruleIndex, const char * name) const { throw Exception("File rules: rule should have a non-empty name."); } - auto existingRule = std::find_if(m_rules.begin(), m_rules.end(), - [name](const FileRuleRcPtr & rule) - { - return 0==Platform::Strcasecmp(name, rule->getName()); - }); + auto existingRule + = std::find_if(m_rules.begin(), m_rules.end(), [name](const FileRuleRcPtr & rule) { + return 0 == Platform::Strcasecmp(name, rule->getName()); + }); if (existingRule != m_rules.end()) { std::ostringstream oss; @@ -620,17 +609,19 @@ void FileRules::Impl::validateNewRule(size_t ruleIndex, const char * name) const throw Exception(oss.str().c_str()); } validatePosition(ruleIndex, DEFAULT_ALLOWED); - if (0==Platform::Strcasecmp(name, FileRules::DefaultRuleName)) + if (0 == Platform::Strcasecmp(name, FileRules::DefaultRuleName)) { std::ostringstream oss; - oss << "File rules: Default rule already exists at index " - << " '" << m_rules.size() - 1 << "'."; + oss << "File rules: Default rule already exists at index " << " '" << m_rules.size() - 1 + << "'."; throw Exception(oss.str().c_str()); } } -const char * FileRules::Impl::getRuleFromFilepath(const Config & config, const char * filePath, - size_t & ruleIndex) const +const char * FileRules::Impl::getRuleFromFilepath( + const Config & config, + const char * filePath, + size_t & ruleIndex) const { const auto numRules = m_rules.size(); for (size_t i = 0; i < numRules; ++i) @@ -661,7 +652,6 @@ void FileRules::Impl::moveRule(size_t ruleIndex, int offset) m_rules.insert(m_rules.begin() + newIndex, rule); } - void FileRules::Impl::validate(const Config & cfg) const { // All Config objects have a fileRules object, regardless of version. This object is @@ -674,8 +664,7 @@ void FileRules::Impl::validate(const Config & cfg) const // only two rules. In some case (e.g. load a v1 config from disk), the two expected rules are // the 'Default' and 'ColorSpaceNamePathSearch' ones. - if (cfg.getMajorVersion() >= 2 - || (cfg.getMajorVersion() == 1 && m_rules.size() > 2)) + if (cfg.getMajorVersion() >= 2 || (cfg.getMajorVersion() == 1 && m_rules.size() > 2)) { for (auto & rule : m_rules) { @@ -694,7 +683,7 @@ size_t FileRules::getIndexForRule(const char * ruleName) const const size_t numRules = m_impl->m_rules.size(); for (size_t idx = 0; idx < numRules; ++idx) { - if (0==Platform::Strcasecmp(ruleName, m_impl->m_rules[idx]->getName())) + if (0 == Platform::Strcasecmp(ruleName, m_impl->m_rules[idx]->getName())) { return idx; } @@ -777,8 +766,7 @@ const char * FileRules::getCustomKeyName(size_t ruleIndex, size_t key) const { std::ostringstream oss; oss << "File rules: the custom key access for file rule '" - << std::string(m_impl->m_rules[ruleIndex]->getName()) - << "' failed: " << e.what(); + << std::string(m_impl->m_rules[ruleIndex]->getName()) << "' failed: " << e.what(); throw Exception(oss.str().c_str()); } } @@ -794,8 +782,7 @@ const char * FileRules::getCustomKeyValue(size_t ruleIndex, size_t key) const { std::ostringstream oss; oss << "File rules: the custom key access for file rule '" - << std::string(m_impl->m_rules[ruleIndex]->getName()) - << "' failed: " << e.what(); + << std::string(m_impl->m_rules[ruleIndex]->getName()) << "' failed: " << e.what(); throw Exception(oss.str().c_str()); } } @@ -816,8 +803,12 @@ void FileRules::setCustomKey(size_t ruleIndex, const char * key, const char * va } } -void FileRules::insertRule(size_t ruleIndex, const char * name, const char * colorSpace, - const char * pattern, const char * extension) +void FileRules::insertRule( + size_t ruleIndex, + const char * name, + const char * colorSpace, + const char * pattern, + const char * extension) { const std::string ruleName(StringUtils::Trim(name ? name : "")); @@ -830,8 +821,11 @@ void FileRules::insertRule(size_t ruleIndex, const char * name, const char * col m_impl->m_rules.insert(m_impl->m_rules.begin() + ruleIndex, newRule); } -void FileRules::insertRule(size_t ruleIndex, const char * name, const char * colorSpace, - const char * regex) +void FileRules::insertRule( + size_t ruleIndex, + const char * name, + const char * colorSpace, + const char * regex) { const std::string ruleName(StringUtils::Trim(name ? name : "")); @@ -887,48 +881,52 @@ bool FileRules::isDefault() const noexcept return false; } -const char * FileRules::Impl::getColorSpaceFromFilepath(const Config & config, - const char * filePath) const +const char * FileRules::Impl::getColorSpaceFromFilepath( + const Config & config, + const char * filePath) const { size_t ruleIndex = 0; return getColorSpaceFromFilepath(config, filePath, ruleIndex); } -const char * FileRules::Impl::getColorSpaceFromFilepath(const Config & config, const char * filePath, - size_t & ruleIndex) const +const char * FileRules::Impl::getColorSpaceFromFilepath( + const Config & config, + const char * filePath, + size_t & ruleIndex) const { return getRuleFromFilepath(config, filePath, ruleIndex); } -bool FileRules::Impl::filepathOnlyMatchesDefaultRule(const Config & config, const char * filePath) const +bool FileRules::Impl::filepathOnlyMatchesDefaultRule(const Config & config, const char * filePath) + const { size_t rulePos = 0; getColorSpaceFromFilepath(config, filePath, rulePos); return (rulePos + 1) == m_rules.size(); } -std::ostream & operator<< (std::ostream & os, const FileRules & fr) +std::ostream & operator<<(std::ostream & os, const FileRules & fr) { const size_t numRules = fr.getNumEntries(); for (size_t r = 0; r < numRules; ++r) { os << "setColorSpace(1, csName); } @@ -1046,5 +1044,4 @@ void UpdateFileRulesFromV1ToV2(const Config & config, FileRulesRcPtr & fileRules } } - } // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/FileRules.h b/src/OpenColorIO/FileRules.h index 9b4d81598f..036d2f8399 100644 --- a/src/OpenColorIO/FileRules.h +++ b/src/OpenColorIO/FileRules.h @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_FILERULES_H #define INCLUDED_OCIO_FILERULES_H @@ -9,21 +8,20 @@ #include - namespace OCIO_NAMESPACE { namespace FileRuleUtils { -constexpr char Name[] { "name" }; -constexpr char ColorSpace[] { "colorspace" }; -constexpr char Pattern[] { "pattern" }; -constexpr char Extension[] { "extension" }; -constexpr char Regex[] { "regex" }; -constexpr char CustomKey[] { "custom" }; +constexpr char Name[]{"name"}; +constexpr char ColorSpace[]{"colorspace"}; +constexpr char Pattern[]{"pattern"}; +constexpr char Extension[]{"extension"}; +constexpr char Regex[]{"regex"}; +constexpr char CustomKey[]{"custom"}; -} +} // namespace FileRuleUtils class FileRule; using FileRuleRcPtr = OCIO_SHARED_PTR; @@ -42,8 +40,8 @@ class FileRules::Impl Impl & operator=(const Impl & rhs); ~Impl() = default; - const char * getRuleFromFilepath(const Config & config, const char * filePath, - size_t & ruleIndex) const; + const char * + getRuleFromFilepath(const Config & config, const char * filePath, size_t & ruleIndex) const; void validatePosition(size_t ruleIndex, DefaultAllowed allowDefault) const; @@ -54,27 +52,26 @@ class FileRules::Impl const char * getColorSpaceFromFilepath(const Config & config, const char * filePath) const; - const char * getColorSpaceFromFilepath(const Config & config, const char * filePath, - size_t & ruleIndex) const; + const char * getColorSpaceFromFilepath( + const Config & config, + const char * filePath, + size_t & ruleIndex) const; bool filepathOnlyMatchesDefaultRule(const Config & config, const char * filePath) const; void validate(const Config & cfg) const; private: - friend class FileRules; // All rules, default rule always at the end. std::vector m_rules; }; - // Helper method to build valid v2 file rules from a v1 config. Note that it does not change // the config instance version. void UpdateFileRulesFromV1ToV2(const Config & config, FileRulesRcPtr & fileRules); - } // namespace OCIO_NAMESPACE #endif diff --git a/src/OpenColorIO/GPUProcessor.cpp b/src/OpenColorIO/GPUProcessor.cpp index e463903c08..412016e651 100644 --- a/src/OpenColorIO/GPUProcessor.cpp +++ b/src/OpenColorIO/GPUProcessor.cpp @@ -17,7 +17,6 @@ #include "ops/lut3d/Lut3DOp.h" #include "ops/noop/NoOps.h" - namespace OCIO_NAMESPACE { @@ -43,8 +42,8 @@ void WriteShaderHeader(GpuShaderCreatorRcPtr & shaderCreator) } else { - ss.newLine() << ss.float4Keyword() << " " << fcnName - << "(" << ss.float4Keyword() << " inPixel)"; + ss.newLine() << ss.float4Keyword() << " " << fcnName << "(" << ss.float4Keyword() + << " inPixel)"; ss.newLine() << "{"; ss.indent(); ss.newLine() << ss.float4Decl(shaderCreator->getPixelName()) << " = inPixel;"; @@ -53,7 +52,6 @@ void WriteShaderHeader(GpuShaderCreatorRcPtr & shaderCreator) shaderCreator->addToFunctionHeaderShaderCode(ss.string().c_str()); } - void WriteShaderFooter(GpuShaderCreatorRcPtr & shaderCreator) { GpuShaderText ss(shaderCreator->getLanguage()); @@ -67,8 +65,7 @@ void WriteShaderFooter(GpuShaderCreatorRcPtr & shaderCreator) shaderCreator->addToFunctionFooterShaderCode(ss.string().c_str()); } - -} +} // namespace void GPUProcessor::Impl::finalize(const OpRcPtrVec & rawOps, OptimizationFlags oFlags) { @@ -83,7 +80,7 @@ void GPUProcessor::Impl::finalize(const OpRcPtrVec & rawOps, OptimizationFlags o m_ops.validateDynamicProperties(); // Is NoOp ? - m_isNoOp = m_ops.isNoOp(); + m_isNoOp = m_ops.isNoOp(); // Does the color processing introduce crosstalk between the pixel channels? m_hasChannelCrosstalk = m_ops.hasChannelCrosstalk(); @@ -91,8 +88,7 @@ void GPUProcessor::Impl::finalize(const OpRcPtrVec & rawOps, OptimizationFlags o // Calculate and assemble the GPU cache ID from the ops. std::stringstream ss; - ss << "GPU Processor: oFlags " << oFlags - << " ops : " << m_ops.getCacheID(); + ss << "GPU Processor: oFlags " << oFlags << " ops : " << m_ops.getCacheID(); m_cacheID = ss.str(); } @@ -102,7 +98,7 @@ void GPUProcessor::Impl::extractGpuShaderInfo(GpuShaderCreatorRcPtr & shaderCrea AutoMutex lock(m_mutex); // Create the shader program information. - for(const auto & op : m_ops) + for (const auto & op : m_ops) { op->extractGpuShaderInfo(shaderCreator); } @@ -113,17 +109,15 @@ void GPUProcessor::Impl::extractGpuShaderInfo(GpuShaderCreatorRcPtr & shaderCrea shaderCreator->finalize(); } - ////////////////////////////////////////////////////////////////////////// - void GPUProcessor::deleter(GPUProcessor * c) { delete c; } GPUProcessor::GPUProcessor() - : m_impl(new Impl) + : m_impl(new Impl) { } @@ -172,7 +166,7 @@ void GPUProcessor::extractGpuShaderInfo(GpuShaderCreatorRcPtr & shaderCreator) c std::string key(CacheIDHash(tmpKey.c_str(), tmpKey.size())); // Prepend a user defined uid if any. - if (std::strlen(shaderCreator->getUniqueID())!=0) + if (std::strlen(shaderCreator->getUniqueID()) != 0) { key = shaderCreator->getUniqueID() + key; } @@ -184,9 +178,12 @@ void GPUProcessor::extractGpuShaderInfo(GpuShaderCreatorRcPtr & shaderCreator) c } // A resource name only accepts alphanumeric characters. - key.erase(std::remove_if(key.begin(), key.end(), - [](char const & c) -> bool { return !std::isalnum(c) && c!='_'; } ), - key.end()); + key.erase( + std::remove_if( + key.begin(), + key.end(), + [](char const & c) -> bool { return !std::isalnum(c) && c != '_'; }), + key.end()); // Extract the information to fully build the fragment shader program. @@ -196,7 +193,7 @@ void GPUProcessor::extractGpuShaderInfo(GpuShaderCreatorRcPtr & shaderCreator) c { getImpl()->extractGpuShaderInfo(shaderCreator); } - catch(const Exception &) + catch (const Exception &) { shaderCreator->end(); throw; @@ -205,5 +202,4 @@ void GPUProcessor::extractGpuShaderInfo(GpuShaderCreatorRcPtr & shaderCreator) c shaderCreator->end(); } - } // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/GPUProcessor.h b/src/OpenColorIO/GPUProcessor.h index 30039a1cd2..e02052a373 100644 --- a/src/OpenColorIO/GPUProcessor.h +++ b/src/OpenColorIO/GPUProcessor.h @@ -1,23 +1,20 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_GPUPROCESSOR_H #define INCLUDED_OCIO_GPUPROCESSOR_H - #include #include "Op.h" - namespace OCIO_NAMESPACE { class GPUProcessor::Impl { public: - Impl() = default; + Impl() = default; ~Impl() = default; bool isNoOp() const noexcept { return m_isNoOp; } @@ -38,15 +35,13 @@ class GPUProcessor::Impl void finalize(const OpRcPtrVec & rawOps, OptimizationFlags oFlags); private: - OpRcPtrVec m_ops; - bool m_isNoOp = false; - bool m_hasChannelCrosstalk = true; - std::string m_cacheID; + OpRcPtrVec m_ops; + bool m_isNoOp = false; + bool m_hasChannelCrosstalk = true; + std::string m_cacheID; mutable Mutex m_mutex; }; - } // namespace OCIO_NAMESPACE - #endif diff --git a/src/OpenColorIO/GpuShader.cpp b/src/OpenColorIO/GpuShader.cpp index 7fbc30b43a..5e4475fb00 100644 --- a/src/OpenColorIO/GpuShader.cpp +++ b/src/OpenColorIO/GpuShader.cpp @@ -11,8 +11,8 @@ #include "DynamicProperty.h" #include "GpuShader.h" -#include "ops/lut3d/Lut3DOpData.h" #include "Platform.h" +#include "ops/lut3d/Lut3DOpData.h" namespace OCIO_NAMESPACE { @@ -20,22 +20,24 @@ namespace OCIO_NAMESPACE namespace { -static void CreateArray(const float * buf, - unsigned w, unsigned h, unsigned d, - GpuShaderDesc::TextureType type, - std::vector & res) +static void CreateArray( + const float * buf, + unsigned w, + unsigned h, + unsigned d, + GpuShaderDesc::TextureType type, + std::vector & res) { - if(buf==nullptr) + if (buf == nullptr) { throw Exception("The buffer is invalid"); } - const size_t size - = w * h * d * (type==GpuShaderDesc::TEXTURE_RGB_CHANNEL ? 3 : 1); + const size_t size = w * h * d * (type == GpuShaderDesc::TEXTURE_RGB_CHANNEL ? 3 : 1); res.resize(size); std::memcpy(&res[0], buf, size * sizeof(float)); } -} +} // namespace namespace GPUShaderImpl { @@ -45,21 +47,24 @@ class PrivateImpl public: struct Texture { - Texture(const char * textureName, - const char * samplerName, - unsigned w, unsigned h, unsigned d, - GpuShaderDesc::TextureType channel, - unsigned dimensions, - Interpolation interpolation, - const float * v) - : m_textureName(textureName) - , m_samplerName(samplerName) - , m_width(w) - , m_height(h) - , m_depth(d) - , m_type(channel) - , m_dimensions(dimensions) - , m_interp(interpolation) + Texture( + const char * textureName, + const char * samplerName, + unsigned w, + unsigned h, + unsigned d, + GpuShaderDesc::TextureType channel, + unsigned dimensions, + Interpolation interpolation, + const float * v) + : m_textureName(textureName) + , m_samplerName(samplerName) + , m_width(w) + , m_height(h) + , m_depth(d) + , m_type(channel) + , m_dimensions(dimensions) + , m_interp(interpolation) { if (!textureName || !*textureName) { @@ -71,11 +76,11 @@ class PrivateImpl throw Exception("The texture sampler name is invalid."); } - if (w==0 || h==0 || d==0) + if (w == 0 || h == 0 || d == 0) { std::stringstream ss; - ss << "The texture buffer size is invalid: [" - << w << " x " << h << " x " << d << "]."; + ss << "The texture buffer size is invalid: [" << w << " x " << h << " x " << d + << "]."; throw Exception(ss.str().c_str()); } @@ -107,39 +112,43 @@ class PrivateImpl Uniform(const char * name, const GpuShaderCreator::DoubleGetter & getDouble) : Uniform(name) { - m_data.m_type = UNIFORM_DOUBLE; + m_data.m_type = UNIFORM_DOUBLE; m_data.m_getDouble = getDouble; } Uniform(const char * name, const GpuShaderCreator::BoolGetter & getBool) : Uniform(name) { - m_data.m_type = UNIFORM_BOOL; + m_data.m_type = UNIFORM_BOOL; m_data.m_getBool = getBool; } Uniform(const char * name, const GpuShaderCreator::Float3Getter & getFloat3) : Uniform(name) { - m_data.m_type = UNIFORM_FLOAT3; + m_data.m_type = UNIFORM_FLOAT3; m_data.m_getFloat3 = getFloat3; } - Uniform(const char * name, const GpuShaderCreator::SizeGetter & getSize, - const GpuShaderCreator::VectorFloatGetter & getVectorFloat) + Uniform( + const char * name, + const GpuShaderCreator::SizeGetter & getSize, + const GpuShaderCreator::VectorFloatGetter & getVectorFloat) : Uniform(name) { - m_data.m_type = UNIFORM_VECTOR_FLOAT; - m_data.m_vectorFloat.m_getSize = getSize; + m_data.m_type = UNIFORM_VECTOR_FLOAT; + m_data.m_vectorFloat.m_getSize = getSize; m_data.m_vectorFloat.m_getVector = getVectorFloat; } - Uniform(const char * name, const GpuShaderCreator::SizeGetter & getSize, - const GpuShaderCreator::VectorIntGetter & getVectorInt) + Uniform( + const char * name, + const GpuShaderCreator::SizeGetter & getSize, + const GpuShaderCreator::VectorIntGetter & getVectorInt) : Uniform(name) { - m_data.m_type = UNIFORM_VECTOR_INT; - m_data.m_vectorInt.m_getSize = getSize; + m_data.m_type = UNIFORM_VECTOR_INT; + m_data.m_vectorInt.m_getSize = getSize; m_data.m_vectorInt.m_getVector = getVectorInt; } @@ -147,6 +156,7 @@ class PrivateImpl GpuShaderDesc::UniformData m_data; Uniform() = delete; + private: Uniform(const char * name) : m_name(name) @@ -161,9 +171,13 @@ class PrivateImpl typedef std::vector Uniforms; public: - PrivateImpl() : m_max1DLUTWidth(4 * 1024), m_allowTexture1D(true) {} - PrivateImpl(const PrivateImpl & rhs) = delete; - PrivateImpl& operator= (const PrivateImpl & rhs) = delete; + PrivateImpl() + : m_max1DLUTWidth(4 * 1024) + , m_allowTexture1D(true) + { + } + PrivateImpl(const PrivateImpl & rhs) = delete; + PrivateImpl & operator=(const PrivateImpl & rhs) = delete; virtual ~PrivateImpl() {} @@ -175,101 +189,119 @@ class PrivateImpl inline bool getAllowTexture1D() const { return m_allowTexture1D; } inline void setAllowTexture1D(bool allowed) { m_allowTexture1D = allowed; } - void addTexture(const char * textureName, - const char * samplerName, - unsigned width, unsigned height, - GpuShaderDesc::TextureType channel, - GpuShaderDesc::TextureDimensions dimensions, - Interpolation interpolation, - const float * values) + void addTexture( + const char * textureName, + const char * samplerName, + unsigned width, + unsigned height, + GpuShaderDesc::TextureType channel, + GpuShaderDesc::TextureDimensions dimensions, + Interpolation interpolation, + const float * values) { - if(width > get1dLutMaxWidth()) + if (width > get1dLutMaxWidth()) { std::stringstream ss; - ss << "1D LUT size exceeds the maximum: " - << width << " > " << get1dLutMaxWidth(); + ss << "1D LUT size exceeds the maximum: " << width << " > " << get1dLutMaxWidth(); throw Exception(ss.str().c_str()); } unsigned numDimensions = static_cast(dimensions); - Texture t(textureName, samplerName, width, height, 1, channel, numDimensions, interpolation, values); + Texture t( + textureName, + samplerName, + width, + height, + 1, + channel, + numDimensions, + interpolation, + values); m_textures.push_back(t); } - void getTexture(unsigned index, - const char *& textureName, - const char *& samplerName, - unsigned & width, unsigned & height, - GpuShaderDesc::TextureType & channel, - GpuShaderDesc::TextureDimensions& dimensions, - Interpolation & interpolation) const + void getTexture( + unsigned index, + const char *& textureName, + const char *& samplerName, + unsigned & width, + unsigned & height, + GpuShaderDesc::TextureType & channel, + GpuShaderDesc::TextureDimensions & dimensions, + Interpolation & interpolation) const { - if(index >= m_textures.size()) + if (index >= m_textures.size()) { std::ostringstream ss; - ss << "1D LUT access error: index = " << index - << " where size = " << m_textures.size(); + ss << "1D LUT access error: index = " << index << " where size = " << m_textures.size(); throw Exception(ss.str().c_str()); } const Texture & t = m_textures[index]; - textureName = t.m_textureName.c_str(); - samplerName = t.m_samplerName.c_str(); - width = t.m_width; - height = t.m_height; - channel = t.m_type; + textureName = t.m_textureName.c_str(); + samplerName = t.m_samplerName.c_str(); + width = t.m_width; + height = t.m_height; + channel = t.m_type; if (t.m_dimensions > 2) { std::stringstream ss; - ss << "1D LUT cannot have more than two dimensions: " - << t.m_dimensions << " > 2"; + ss << "1D LUT cannot have more than two dimensions: " << t.m_dimensions << " > 2"; throw Exception(ss.str().c_str()); } - dimensions = static_cast(t.m_dimensions); + dimensions = static_cast(t.m_dimensions); interpolation = t.m_interp; } void getTextureValues(unsigned index, const float *& values) const { - if(index >= m_textures.size()) + if (index >= m_textures.size()) { std::ostringstream ss; - ss << "1D LUT access error: index = " << index - << " where size = " << m_textures.size(); + ss << "1D LUT access error: index = " << index << " where size = " << m_textures.size(); throw Exception(ss.str().c_str()); } const Texture & t = m_textures[index]; - values = &t.m_values[0]; + values = &t.m_values[0]; } - void add3DTexture(const char * textureName, - const char * samplerName, - unsigned edgelen, - Interpolation interpolation, - const float * values) + void add3DTexture( + const char * textureName, + const char * samplerName, + unsigned edgelen, + Interpolation interpolation, + const float * values) { - if(edgelen > get3dLutMaxLength()) + if (edgelen > get3dLutMaxLength()) { std::stringstream ss; - ss << "3D LUT edge length exceeds the maximum: " - << edgelen << " > " << get3dLutMaxLength(); + ss << "3D LUT edge length exceeds the maximum: " << edgelen << " > " + << get3dLutMaxLength(); throw Exception(ss.str().c_str()); } - Texture t(textureName, samplerName, edgelen, edgelen, edgelen, - GpuShaderDesc::TEXTURE_RGB_CHANNEL, 3, - interpolation, values); + Texture t( + textureName, + samplerName, + edgelen, + edgelen, + edgelen, + GpuShaderDesc::TEXTURE_RGB_CHANNEL, + 3, + interpolation, + values); m_textures3D.push_back(t); } - void get3DTexture(unsigned index, - const char *& textureName, - const char *& samplerName, - unsigned & edgelen, - Interpolation & interpolation) const + void get3DTexture( + unsigned index, + const char *& textureName, + const char *& samplerName, + unsigned & edgelen, + Interpolation & interpolation) const { - if(index >= m_textures3D.size()) + if (index >= m_textures3D.size()) { std::ostringstream ss; ss << "3D LUT access error: index = " << index @@ -278,15 +310,15 @@ class PrivateImpl } const Texture & t = m_textures3D[index]; - textureName = t.m_textureName.c_str(); - samplerName = t.m_samplerName.c_str(); - edgelen = t.m_width; - interpolation = t.m_interp; + textureName = t.m_textureName.c_str(); + samplerName = t.m_samplerName.c_str(); + edgelen = t.m_width; + interpolation = t.m_interp; } void get3DTextureValues(unsigned index, const float *& values) const { - if(index >= m_textures3D.size()) + if (index >= m_textures3D.size()) { std::ostringstream ss; ss << "3D LUT access error: index = " << index @@ -295,13 +327,10 @@ class PrivateImpl } const Texture & t = m_textures3D[index]; - values = &t.m_values[0]; + values = &t.m_values[0]; } - unsigned getNumUniforms() const - { - return (unsigned)m_uniforms.size(); - } + unsigned getNumUniforms() const { return (unsigned)m_uniforms.size(); } const char * getUniform(unsigned index, GpuShaderDesc::UniformData & data) const { @@ -312,7 +341,7 @@ class PrivateImpl << " where size = " << m_uniforms.size(); throw Exception(ss.str().c_str()); } - data = m_uniforms[index].m_data; + data = m_uniforms[index].m_data; return m_uniforms[index].m_name.c_str(); } @@ -349,9 +378,10 @@ class PrivateImpl return true; } - bool addUniform(const char * name, - const GpuShaderCreator::SizeGetter & getSize, - const GpuShaderCreator::VectorFloatGetter & getVector) + bool addUniform( + const char * name, + const GpuShaderCreator::SizeGetter & getSize, + const GpuShaderCreator::VectorFloatGetter & getVector) { if (uniformNameUsed(name)) { @@ -362,11 +392,12 @@ class PrivateImpl return true; } - bool addUniform(const char * name, - const GpuShaderCreator::SizeGetter & getSize, - const GpuShaderCreator::VectorIntGetter & getVectorInt) + bool addUniform( + const char * name, + const GpuShaderCreator::SizeGetter & getSize, + const GpuShaderCreator::VectorIntGetter & getVectorInt) { - if (uniformNameUsed(name)) + if (uniformNameUsed(name)) { // Uniform is already there. return false; @@ -399,7 +430,10 @@ class PrivateImpl class GenericGpuShaderDesc::ImplGeneric : public GPUShaderImpl::PrivateImpl { public: - ImplGeneric() : GPUShaderImpl::PrivateImpl() {} + ImplGeneric() + : GPUShaderImpl::PrivateImpl() + { + } ~ImplGeneric() {} }; @@ -409,8 +443,8 @@ GpuShaderDescRcPtr GenericGpuShaderDesc::Create() } GenericGpuShaderDesc::GenericGpuShaderDesc() - : GpuShaderDesc() - , m_implGeneric(new ImplGeneric()) + : GpuShaderDesc() + , m_implGeneric(new ImplGeneric()) { } @@ -425,7 +459,8 @@ unsigned GenericGpuShaderDesc::getNumUniforms() const noexcept return getImplGeneric()->getNumUniforms(); } -const char * GenericGpuShaderDesc::getUniform(unsigned index, GpuShaderDesc::UniformData & data) const +const char * GenericGpuShaderDesc::getUniform(unsigned index, GpuShaderDesc::UniformData & data) + const { return getImplGeneric()->getUniform(index, data); } @@ -445,21 +480,22 @@ bool GenericGpuShaderDesc::addUniform(const char * name, const Float3Getter & ge return getImplGeneric()->addUniform(name, getter); } -bool GenericGpuShaderDesc::addUniform(const char * name, - const SizeGetter & getSize, - const VectorFloatGetter & getFloatArray) +bool GenericGpuShaderDesc::addUniform( + const char * name, + const SizeGetter & getSize, + const VectorFloatGetter & getFloatArray) { return getImplGeneric()->addUniform(name, getSize, getFloatArray); } -bool GenericGpuShaderDesc::addUniform(const char * name, - const SizeGetter & getSize, - const VectorIntGetter & getVectorInt) +bool GenericGpuShaderDesc::addUniform( + const char * name, + const SizeGetter & getSize, + const VectorIntGetter & getVectorInt) { return getImplGeneric()->addUniform(name, getSize, getVectorInt); } - unsigned GenericGpuShaderDesc::getTextureMaxWidth() const noexcept { return getImplGeneric()->get1dLutMaxWidth(); @@ -485,26 +521,46 @@ unsigned GenericGpuShaderDesc::getNumTextures() const noexcept return unsigned(getImplGeneric()->m_textures.size()); } -void GenericGpuShaderDesc::addTexture(const char * textureName, - const char * samplerName, - unsigned width, unsigned height, - TextureType channel, - TextureDimensions dimensions, - Interpolation interpolation, - const float * values) +void GenericGpuShaderDesc::addTexture( + const char * textureName, + const char * samplerName, + unsigned width, + unsigned height, + TextureType channel, + TextureDimensions dimensions, + Interpolation interpolation, + const float * values) { - getImplGeneric()->addTexture(textureName, samplerName, width, height, channel, dimensions, interpolation, values); + getImplGeneric()->addTexture( + textureName, + samplerName, + width, + height, + channel, + dimensions, + interpolation, + values); } -void GenericGpuShaderDesc::getTexture(unsigned index, - const char *& textureName, - const char *& samplerName, - unsigned & width, unsigned & height, - TextureType & channel, - TextureDimensions & dimensions, - Interpolation & interpolation) const +void GenericGpuShaderDesc::getTexture( + unsigned index, + const char *& textureName, + const char *& samplerName, + unsigned & width, + unsigned & height, + TextureType & channel, + TextureDimensions & dimensions, + Interpolation & interpolation) const { - getImplGeneric()->getTexture(index, textureName, samplerName, width, height, channel, dimensions, interpolation); + getImplGeneric()->getTexture( + index, + textureName, + samplerName, + width, + height, + channel, + dimensions, + interpolation); } void GenericGpuShaderDesc::getTextureValues(unsigned index, const float *& values) const @@ -517,20 +573,22 @@ unsigned GenericGpuShaderDesc::getNum3DTextures() const noexcept return unsigned(getImplGeneric()->m_textures3D.size()); } -void GenericGpuShaderDesc::add3DTexture(const char * textureName, - const char * samplerName, - unsigned edgelen, - Interpolation interpolation, - const float * values) +void GenericGpuShaderDesc::add3DTexture( + const char * textureName, + const char * samplerName, + unsigned edgelen, + Interpolation interpolation, + const float * values) { getImplGeneric()->add3DTexture(textureName, samplerName, edgelen, interpolation, values); } -void GenericGpuShaderDesc::get3DTexture(unsigned index, - const char *& textureName, - const char *& samplerName, - unsigned & edgelen, - Interpolation & interpolation) const +void GenericGpuShaderDesc::get3DTexture( + unsigned index, + const char *& textureName, + const char *& samplerName, + unsigned & edgelen, + Interpolation & interpolation) const { getImplGeneric()->get3DTexture(index, textureName, samplerName, edgelen, interpolation); } @@ -540,10 +598,9 @@ void GenericGpuShaderDesc::get3DTextureValues(unsigned index, const float *& val getImplGeneric()->get3DTextureValues(index, values); } -void GenericGpuShaderDesc::Deleter(GenericGpuShaderDesc* c) +void GenericGpuShaderDesc::Deleter(GenericGpuShaderDesc * c) { delete c; } } // namespace OCIO_NAMESPACE - diff --git a/src/OpenColorIO/GpuShader.h b/src/OpenColorIO/GpuShader.h index e9c39d56b1..dce7584323 100644 --- a/src/OpenColorIO/GpuShader.h +++ b/src/OpenColorIO/GpuShader.h @@ -4,10 +4,8 @@ #ifndef INCLUDED_OCIO_GPU_SHADER_H #define INCLUDED_OCIO_GPU_SHADER_H - #include - namespace OCIO_NAMESPACE { @@ -39,56 +37,63 @@ class GenericGpuShaderDesc : public GpuShaderDesc bool addUniform(const char * name, const DoubleGetter & getDouble) override; bool addUniform(const char * name, const BoolGetter & getBool) override; bool addUniform(const char * name, const Float3Getter & getter) override; - bool addUniform(const char * name, - const SizeGetter & getSize, - const VectorFloatGetter & getVectorFloat) override; - bool addUniform(const char * name, - const SizeGetter & getSize, - const VectorIntGetter & getVectorInt) override; + bool addUniform( + const char * name, + const SizeGetter & getSize, + const VectorFloatGetter & getVectorFloat) override; + bool addUniform( + const char * name, + const SizeGetter & getSize, + const VectorIntGetter & getVectorInt) override; // Accessors to the 1D & 2D textures built from 1D LUT // unsigned getNumTextures() const noexcept override; - void addTexture(const char * textureName, - const char * samplerName, - unsigned width, unsigned height, - TextureType channel, - TextureDimensions dimensions, - Interpolation interpolation, - const float * values) override; - void getTexture(unsigned index, - const char *& textureName, - const char *& samplerName, - unsigned & width, unsigned & height, - TextureType & channel, - TextureDimensions & dimensions, - Interpolation & interpolation) const override; + void addTexture( + const char * textureName, + const char * samplerName, + unsigned width, + unsigned height, + TextureType channel, + TextureDimensions dimensions, + Interpolation interpolation, + const float * values) override; + void getTexture( + unsigned index, + const char *& textureName, + const char *& samplerName, + unsigned & width, + unsigned & height, + TextureType & channel, + TextureDimensions & dimensions, + Interpolation & interpolation) const override; void getTextureValues(unsigned index, const float *& values) const override; // Accessors to the 3D textures built from 3D LUT // unsigned getNum3DTextures() const noexcept override; - void add3DTexture(const char * textureName, - const char * samplerName, - unsigned edgelen, - Interpolation interpolation, - const float * values) override; - void get3DTexture(unsigned index, - const char *& textureName, - const char *& samplerName, - unsigned & edgelen, - Interpolation & interpolation) const override; + void add3DTexture( + const char * textureName, + const char * samplerName, + unsigned edgelen, + Interpolation interpolation, + const float * values) override; + void get3DTexture( + unsigned index, + const char *& textureName, + const char *& samplerName, + unsigned & edgelen, + Interpolation & interpolation) const override; void get3DTextureValues(unsigned index, const float *& value) const override; private: - GenericGpuShaderDesc(); virtual ~GenericGpuShaderDesc(); - GenericGpuShaderDesc(const GenericGpuShaderDesc &) = delete; - GenericGpuShaderDesc& operator= (const GenericGpuShaderDesc &) = delete; + GenericGpuShaderDesc(const GenericGpuShaderDesc &) = delete; + GenericGpuShaderDesc & operator=(const GenericGpuShaderDesc &) = delete; - static void Deleter(GenericGpuShaderDesc* c); + static void Deleter(GenericGpuShaderDesc * c); class ImplGeneric; ImplGeneric * m_implGeneric; diff --git a/src/OpenColorIO/GpuShaderClassWrapper.cpp b/src/OpenColorIO/GpuShaderClassWrapper.cpp index 35dce54add..40a528769c 100644 --- a/src/OpenColorIO/GpuShaderClassWrapper.cpp +++ b/src/OpenColorIO/GpuShaderClassWrapper.cpp @@ -10,14 +10,15 @@ namespace OCIO_NAMESPACE { -std::string GetArrayLengthVariableName(const std::string& variableName) +std::string GetArrayLengthVariableName(const std::string & variableName) { return variableName + "_count"; } -std::unique_ptr GpuShaderClassWrapper::CreateClassWrapper(GpuLanguage language) +std::unique_ptr GpuShaderClassWrapper::CreateClassWrapper( + GpuLanguage language) { - switch(language) + switch (language) { case GPU_LANGUAGE_MSL_2_0: return std::unique_ptr(new MetalShaderClassWrapper); @@ -49,7 +50,7 @@ std::unique_ptr OSLShaderClassWrapper::clone() const return std::unique_ptr(new OSLShaderClassWrapper()); } -std::string OSLShaderClassWrapper::getClassWrapperHeader(const std::string& originalHeader) +std::string OSLShaderClassWrapper::getClassWrapperHeader(const std::string & originalHeader) { GpuShaderText st(LANGUAGE_OSL_1); @@ -66,10 +67,12 @@ std::string OSLShaderClassWrapper::getClassWrapperHeader(const std::string& orig st.newLine() << "vector4 __operator__mul__(matrix m, vector4 v)"; st.newLine() << "{"; st.indent(); + // clang-format off st.newLine() << "return vector4(v.x * m[0][0] + v.y * m[0][1] + v.z * m[0][2] + v.w * m[0][3], "; st.newLine() << " v.x * m[1][0] + v.y * m[1][1] + v.z * m[1][2] + v.w * m[1][3], "; st.newLine() << " v.x * m[2][0] + v.y * m[2][1] + v.z * m[2][2] + v.w * m[2][3], "; st.newLine() << " v.x * m[3][0] + v.y * m[3][1] + v.z * m[3][2] + v.w * m[3][3]);"; + // clang-format on st.dedent(); st.newLine() << "}"; @@ -150,99 +153,110 @@ std::string OSLShaderClassWrapper::getClassWrapperFooter(const std::string & ori return originalFooter + st.string(); } -std::string MetalShaderClassWrapper::generateClassWrapperHeader(GpuShaderText& kw) const +std::string MetalShaderClassWrapper::generateClassWrapperHeader(GpuShaderText & kw) const { - if(m_className.empty()) + if (m_className.empty()) { throw Exception("Struct name must include at least 1 character"); } - if(std::isdigit(m_className[0])) + if (std::isdigit(m_className[0])) { - throw Exception(("Struct name must not start with a digit. Invalid className passed in: " + m_className).c_str()); + throw Exception( + ("Struct name must not start with a digit. Invalid className passed in: " + m_className) + .c_str()); } kw.newLine() << "struct " << m_className; kw.newLine() << "{"; - kw.newLine() << m_className <<"("; + kw.newLine() << m_className << "("; kw.indent(); std::string separator = ""; - for(const auto& param : m_functionParameters) + for (const auto & param : m_functionParameters) { - kw.newLine() << separator << (param.m_isArray ? "constant " : "") << param.m_type << " " << param.m_name; - if(param.m_isArray) + kw.newLine() << separator << (param.m_isArray ? "constant " : "") << param.m_type << " " + << param.m_name; + if (param.m_isArray) { - kw.newLine() << ", int " << GetArrayLengthVariableName(param.m_name.substr(0, param.m_name.find('['))); + kw.newLine() << ", int " + << GetArrayLengthVariableName( + param.m_name.substr(0, param.m_name.find('['))); } separator = ", "; } kw.dedent(); kw.newLine() << ")"; kw.newLine() << "{"; - + kw.indent(); - for(const auto& param : m_functionParameters) + for (const auto & param : m_functionParameters) { size_t openAngledBracketPos = param.m_name.find('['); - if(!param.m_isArray) + if (!param.m_isArray) { - kw.newLine() << "this->" << param.m_name << " = " << param.m_name << ";"; + kw.newLine() << "this->" << param.m_name << " = " << param.m_name << ";"; } else { size_t closeAngledBracketPos = param.m_name.find(']'); - std::string variableName = param.m_name.substr(0, openAngledBracketPos); - - kw.newLine() << "for(int i = 0; i < " - << GetArrayLengthVariableName(variableName) - << "; ++i)"; - kw.newLine() << "{"; + std::string variableName = param.m_name.substr(0, openAngledBracketPos); + + kw.newLine() << "for(int i = 0; i < " << GetArrayLengthVariableName(variableName) + << "; ++i)"; + kw.newLine() << "{"; kw.indent(); - kw.newLine() << "this->" << variableName << "[i] = " << variableName << "[i];"; + kw.newLine() << "this->" << variableName << "[i] = " << variableName << "[i];"; kw.dedent(); - kw.newLine() << "}"; - - kw.newLine() << "for(int i = " - << GetArrayLengthVariableName(variableName) - << "; i < " - << param.m_name.substr(openAngledBracketPos+1, closeAngledBracketPos-openAngledBracketPos-1) - << "; ++i)"; - kw.newLine() << "{"; + kw.newLine() << "}"; + + kw.newLine() << "for(int i = " << GetArrayLengthVariableName(variableName) << "; i < " + << param.m_name.substr( + openAngledBracketPos + 1, + closeAngledBracketPos - openAngledBracketPos - 1) + << "; ++i)"; + kw.newLine() << "{"; kw.indent(); - kw.newLine() << "this->" << variableName << "[i] = 0;"; + kw.newLine() << "this->" << variableName << "[i] = 0;"; kw.dedent(); - kw.newLine() << "}"; + kw.newLine() << "}"; } } kw.dedent(); - kw.newLine() <<"}"; + kw.newLine() << "}"; return kw.string(); } - -std::string MetalShaderClassWrapper::generateClassWrapperFooter(GpuShaderText& kw, const std::string &ocioFunctionName) const + +std::string MetalShaderClassWrapper::generateClassWrapperFooter( + GpuShaderText & kw, + const std::string & ocioFunctionName) const { - if(m_className.empty()) + if (m_className.empty()) { throw Exception("Struct name must include at least 1 character"); } - if(std::isdigit(m_className[0])) + if (std::isdigit(m_className[0])) { - throw Exception(("Struct name must not start with a digit. Invalid className passed in: " + m_className).c_str()); + throw Exception( + ("Struct name must not start with a digit. Invalid className passed in: " + m_className) + .c_str()); } kw.newLine() << "};"; - - kw.newLine() << kw.float4Keyword() << " " << ocioFunctionName<< "("; + + kw.newLine() << kw.float4Keyword() << " " << ocioFunctionName << "("; std::string texParamOut; - + kw.indent(); std::string separator = ""; - for(const auto& param : m_functionParameters) + for (const auto & param : m_functionParameters) { - kw.newLine() << separator << (param.m_isArray ? "constant " : "") << param.m_type << " " << param.m_name; - if(param.m_isArray) + kw.newLine() << separator << (param.m_isArray ? "constant " : "") << param.m_type << " " + << param.m_name; + if (param.m_isArray) { - kw.newLine() << ", int " << GetArrayLengthVariableName(param.m_name.substr(0, param.m_name.find('['))); + kw.newLine() << ", int " + << GetArrayLengthVariableName( + param.m_name.substr(0, param.m_name.find('['))); } separator = ", "; } @@ -254,166 +268,179 @@ std::string MetalShaderClassWrapper::generateClassWrapperFooter(GpuShaderText& k kw.indent(); separator = ""; - for(const auto& param : m_functionParameters) + for (const auto & param : m_functionParameters) { size_t openAngledBracketPos = param.m_name.find('['); - bool isArray = openAngledBracketPos != std::string::npos; - - if(!isArray) + bool isArray = openAngledBracketPos != std::string::npos; + + if (!isArray) { kw.newLine() << separator << param.m_name; } else { kw.newLine() << separator << param.m_name.substr(0, openAngledBracketPos); - kw.newLine() << ", " << GetArrayLengthVariableName(param.m_name.substr(0, openAngledBracketPos)); + kw.newLine() << ", " + << GetArrayLengthVariableName( + param.m_name.substr(0, openAngledBracketPos)); } separator = ", "; } kw.dedent(); - + kw.newLine() << ")." << ocioFunctionName << "(inPixel);"; kw.dedent(); kw.newLine() << "}"; - + return kw.string(); } -std::string MetalShaderClassWrapper::getClassWrapperName(const std::string &resourcePrefix, const std::string& functionName) +std::string MetalShaderClassWrapper::getClassWrapperName( + const std::string & resourcePrefix, + const std::string & functionName) { return (resourcePrefix.length() == 0 ? "OCIO_" : resourcePrefix) + functionName; } -void MetalShaderClassWrapper::extractFunctionParameters(const std::string& declaration) +void MetalShaderClassWrapper::extractFunctionParameters(const std::string & declaration) { - // We want the caller to always pass 3d luts first with their samplers, and then pass other luts. + // We want the caller to always pass 3d luts first with their samplers, and then pass other + // luts. std::vector> lut3DTextures; std::vector> lutTextures; - std::vector> uniforms; + std::vector> uniforms; m_functionParameters.clear(); - + std::string lineBuffer; - + std::istringstream is(declaration); - while(!is.eof()) + while (!is.eof()) { std::getline(is, lineBuffer); - - if(lineBuffer.empty()) + + if (lineBuffer.empty()) continue; - + size_t i = 0; - + // Skip spaces - while(std::isspace(lineBuffer[i])) ++i; - + while (std::isspace(lineBuffer[i])) + ++i; + // if the line was all skippable characters - if(i >= lineBuffer.size()) + if (i >= lineBuffer.size()) continue; - + // if the line is a comment - if(lineBuffer[i + 0] == '/' && lineBuffer[i + 1] == '/') + if (lineBuffer[i + 0] == '/' && lineBuffer[i + 1] == '/') continue; - if(lineBuffer.compare(i, 7, "texture") == 0) + if (lineBuffer.compare(i, 7, "texture") == 0) { - int textureDim = static_cast(lineBuffer[i+7] - '0'); - - size_t endTextureType = lineBuffer.find('>'); + int textureDim = static_cast(lineBuffer[i + 7] - '0'); + + size_t endTextureType = lineBuffer.find('>'); std::string textureType = lineBuffer.substr(i, (endTextureType - i + 1)); - + i = endTextureType + 1; - while(std::isspace(lineBuffer[i])) ++i; - - size_t endTextureName = lineBuffer.find_first_of(" \t;", i); + while (std::isspace(lineBuffer[i])) + ++i; + + size_t endTextureName = lineBuffer.find_first_of(" \t;", i); std::string textureName = lineBuffer.substr(i, (endTextureName - i)); std::getline(is, lineBuffer); - + i = lineBuffer.find("sampler") + 7; - while(std::isspace(lineBuffer[i])) ++i; - size_t endSamplerName = lineBuffer.find_first_of(" \t;", i); + while (std::isspace(lineBuffer[i])) + ++i; + size_t endSamplerName = lineBuffer.find_first_of(" \t;", i); std::string samplerName = lineBuffer.substr(i, endSamplerName - i); - - if(textureDim == 3) + + if (textureDim == 3) lut3DTextures.emplace_back(textureType, textureName, samplerName); else lutTextures.emplace_back(textureType, textureName, samplerName); } else { - size_t endTypeName = lineBuffer.find_first_of(" \t", i); + size_t endTypeName = lineBuffer.find_first_of(" \t", i); std::string variableType = lineBuffer.substr(i, (endTypeName - i)); - + i = endTypeName + 1; - while(std::isspace(lineBuffer[i])) ++i; - - size_t endVariableName = lineBuffer.find_first_of(" \t;", i); + while (std::isspace(lineBuffer[i])) + ++i; + + size_t endVariableName = lineBuffer.find_first_of(" \t;", i); std::string variableName = lineBuffer.substr(i, (endVariableName - i)); uniforms.emplace_back(variableType, variableName); } } - - for(const auto& lut3D : lut3DTextures) + + for (const auto & lut3D : lut3DTextures) { m_functionParameters.emplace_back(std::get<0>(lut3D).c_str(), std::get<1>(lut3D).c_str()); m_functionParameters.emplace_back("sampler", std::get<2>(lut3D).c_str()); } - - for(const auto& lut : lutTextures) + + for (const auto & lut : lutTextures) { m_functionParameters.emplace_back(std::get<0>(lut).c_str(), std::get<1>(lut).c_str()); m_functionParameters.emplace_back("sampler", std::get<2>(lut).c_str()); } - - for(const auto& uniform : uniforms) + + for (const auto & uniform : uniforms) { m_functionParameters.emplace_back(uniform.first, uniform.second); } } -void MetalShaderClassWrapper::prepareClassWrapper(const std::string& resourcePrefix, const std::string& functionName, const std::string& originalHeader) +void MetalShaderClassWrapper::prepareClassWrapper( + const std::string & resourcePrefix, + const std::string & functionName, + const std::string & originalHeader) { m_functionName = functionName; - m_className = getClassWrapperName(resourcePrefix, functionName); + m_className = getClassWrapperName(resourcePrefix, functionName); extractFunctionParameters(originalHeader); } -std::string MetalShaderClassWrapper::getClassWrapperHeader(const std::string& originalHeader) +std::string MetalShaderClassWrapper::getClassWrapperHeader(const std::string & originalHeader) { GpuShaderText st(GPU_LANGUAGE_MSL_2_0); generateClassWrapperHeader(st); st.newLine(); - + std::string classWrapHeader = "\n// Declaration of class wrapper\n\n"; classWrapHeader += st.string(); - + return classWrapHeader + originalHeader; } -std::string MetalShaderClassWrapper::getClassWrapperFooter(const std::string& originalFooter) +std::string MetalShaderClassWrapper::getClassWrapperFooter(const std::string & originalFooter) { GpuShaderText st(GPU_LANGUAGE_MSL_2_0); - + st.newLine(); generateClassWrapperFooter(st, m_functionName); - + std::string classWrapFooter = "\n// Close class wrapper\n\n"; classWrapFooter += st.string(); - + return originalFooter + classWrapFooter; } std::unique_ptr MetalShaderClassWrapper::clone() const { - std::unique_ptr clonedWrapper = std::unique_ptr(new MetalShaderClassWrapper); + std::unique_ptr clonedWrapper + = std::unique_ptr(new MetalShaderClassWrapper); *clonedWrapper = *this; return clonedWrapper; } -MetalShaderClassWrapper& MetalShaderClassWrapper::operator=(const MetalShaderClassWrapper& rhs) +MetalShaderClassWrapper & MetalShaderClassWrapper::operator=(const MetalShaderClassWrapper & rhs) { this->m_className = rhs.m_className; this->m_functionName = rhs.m_functionName; diff --git a/src/OpenColorIO/GpuShaderClassWrapper.h b/src/OpenColorIO/GpuShaderClassWrapper.h index c76373db90..054c75a037 100644 --- a/src/OpenColorIO/GpuShaderClassWrapper.h +++ b/src/OpenColorIO/GpuShaderClassWrapper.h @@ -20,13 +20,14 @@ namespace OCIO_NAMESPACE class GpuShaderClassWrapper { public: - // Factory method to blindly get the right class wrapper. static std::unique_ptr CreateClassWrapper(GpuLanguage language); - virtual void prepareClassWrapper(const std::string & resourcePrefix, - const std::string & functionName, - const std::string & originalHeader) = 0; + virtual void prepareClassWrapper( + const std::string & resourcePrefix, + const std::string & functionName, + const std::string & originalHeader) + = 0; virtual std::string getClassWrapperHeader(const std::string & originalHeader) = 0; virtual std::string getClassWrapperFooter(const std::string & originalFooter) = 0; @@ -38,9 +39,10 @@ class GpuShaderClassWrapper class NullGpuShaderClassWrapper : public GpuShaderClassWrapper { public: - void prepareClassWrapper(const std::string & /*resourcePrefix*/, - const std::string & /*functionName*/, - const std::string & /*originalHeader*/) final + void prepareClassWrapper( + const std::string & /*resourcePrefix*/, + const std::string & /*functionName*/, + const std::string & /*originalHeader*/) final { } std::string getClassWrapperHeader(const std::string & originalHeader) final @@ -58,9 +60,10 @@ class NullGpuShaderClassWrapper : public GpuShaderClassWrapper class OSLShaderClassWrapper : public GpuShaderClassWrapper { public: - void prepareClassWrapper(const std::string & /*resourcePrefix*/, - const std::string & functionName, - const std::string & /*originalHeader*/) final + void prepareClassWrapper( + const std::string & /*resourcePrefix*/, + const std::string & functionName, + const std::string & /*originalHeader*/) final { m_functionName = functionName; } @@ -77,24 +80,25 @@ class OSLShaderClassWrapper : public GpuShaderClassWrapper class MetalShaderClassWrapper : public GpuShaderClassWrapper { public: - void prepareClassWrapper(const std::string & resourcePrefix, - const std::string & functionName, - const std::string & originalHeader) final; + void prepareClassWrapper( + const std::string & resourcePrefix, + const std::string & functionName, + const std::string & originalHeader) final; std::string getClassWrapperHeader(const std::string & originalHeader) final; std::string getClassWrapperFooter(const std::string & originalFooter) final; std::unique_ptr clone() const final; - MetalShaderClassWrapper& operator=(const MetalShaderClassWrapper& rhs); + MetalShaderClassWrapper & operator=(const MetalShaderClassWrapper & rhs); private: struct FunctionParam { - FunctionParam(const std::string& type, const std::string& name) : - m_type(type), - m_name(name) + FunctionParam(const std::string & type, const std::string & name) + : m_type(type) + , m_name(name) { size_t openAngledBracketPos = name.find('['); - m_isArray = openAngledBracketPos != std::string::npos; + m_isArray = openAngledBracketPos != std::string::npos; } std::string m_type; @@ -102,10 +106,13 @@ class MetalShaderClassWrapper : public GpuShaderClassWrapper bool m_isArray; }; - static std::string getClassWrapperName(const std::string &resourcePrefix, const std::string &functionName); - void extractFunctionParameters(const std::string& declaration); - std::string generateClassWrapperHeader(GpuShaderText& st) const; - std::string generateClassWrapperFooter(GpuShaderText& st, const std::string &ocioFunctionName) const; + static std::string getClassWrapperName( + const std::string & resourcePrefix, + const std::string & functionName); + void extractFunctionParameters(const std::string & declaration); + std::string generateClassWrapperHeader(GpuShaderText & st) const; + std::string generateClassWrapperFooter(GpuShaderText & st, const std::string & ocioFunctionName) + const; std::string m_className; std::string m_functionName; diff --git a/src/OpenColorIO/GpuShaderDesc.cpp b/src/OpenColorIO/GpuShaderDesc.cpp index 9a35f75486..fa19954034 100644 --- a/src/OpenColorIO/GpuShaderDesc.cpp +++ b/src/OpenColorIO/GpuShaderDesc.cpp @@ -1,21 +1,20 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. -#include #include +#include #include #include "DynamicProperty.h" #include "GpuShader.h" -#include "GpuShaderUtils.h" #include "GpuShaderClassWrapper.h" +#include "GpuShaderUtils.h" #include "HashUtils.h" #include "Logging.h" #include "Mutex.h" #include "utils/StringUtils.h" - namespace OCIO_NAMESPACE { @@ -42,14 +41,14 @@ class GpuShaderCreator::Impl std::string m_shaderCodeID; std::vector m_dynamicProperties; - + std::unique_ptr m_classWrappingInterface; Impl() - : m_functionName("OCIOMain") - , m_resourcePrefix("ocio") - , m_pixelName("outColor") - , m_classWrappingInterface(GpuShaderClassWrapper::CreateClassWrapper(m_language)) + : m_functionName("OCIOMain") + , m_resourcePrefix("ocio") + , m_pixelName("outColor") + , m_classWrappingInterface(GpuShaderClassWrapper::CreateClassWrapper(m_language)) { } @@ -57,7 +56,7 @@ class GpuShaderCreator::Impl Impl(const Impl & rhs) = delete; - Impl& operator= (const Impl & rhs) + Impl & operator=(const Impl & rhs) { if (this != &rhs) { @@ -74,7 +73,7 @@ class GpuShaderCreator::Impl m_functionHeader = rhs.m_functionHeader; m_functionBody = rhs.m_functionBody; m_functionFooter = rhs.m_functionFooter; - + m_classWrappingInterface = rhs.m_classWrappingInterface->clone(); m_shaderCode.clear(); @@ -85,7 +84,7 @@ class GpuShaderCreator::Impl }; GpuShaderCreator::GpuShaderCreator() - : m_impl(new GpuShaderDesc::Impl) + : m_impl(new GpuShaderDesc::Impl) { } @@ -110,7 +109,7 @@ const char * GpuShaderCreator::getUniqueID() const noexcept void GpuShaderCreator::setLanguage(GpuLanguage lang) noexcept { AutoMutex lock(getImpl()->m_cacheIDMutex); - + getImpl()->m_language = lang; getImpl()->m_classWrappingInterface = GpuShaderClassWrapper::CreateClassWrapper(getImpl()->m_language); @@ -234,7 +233,7 @@ const char * GpuShaderCreator::getCacheID() const noexcept { AutoMutex lock(getImpl()->m_cacheIDMutex); - if(getImpl()->m_cacheID.empty()) + if (getImpl()->m_cacheID.empty()) { std::ostringstream os; os << GpuLanguageToString(getImpl()->m_language) << " "; @@ -251,7 +250,7 @@ const char * GpuShaderCreator::getCacheID() const noexcept void GpuShaderCreator::addToDeclareShaderCode(const char * shaderCode) { - if(getImpl()->m_declarations.empty()) + if (getImpl()->m_declarations.empty()) { getImpl()->m_declarations += "\n// Declaration of all variables\n\n"; } @@ -260,7 +259,7 @@ void GpuShaderCreator::addToDeclareShaderCode(const char * shaderCode) void GpuShaderCreator::addToHelperShaderCode(const char * shaderCode) { - if(getImpl()->m_helperMethods.empty()) + if (getImpl()->m_helperMethods.empty()) { getImpl()->m_helperMethods += "\n// Declaration of all helper methods\n\n"; } @@ -282,24 +281,30 @@ void GpuShaderCreator::addToFunctionFooterShaderCode(const char * shaderCode) getImpl()->m_functionFooter += (shaderCode && *shaderCode) ? shaderCode : ""; } -void GpuShaderCreator::createShaderText(const char * shaderDeclarations, - const char * shaderHelperMethods, - const char * shaderFunctionHeader, - const char * shaderFunctionBody, - const char * shaderFunctionFooter) +void GpuShaderCreator::createShaderText( + const char * shaderDeclarations, + const char * shaderHelperMethods, + const char * shaderFunctionHeader, + const char * shaderFunctionBody, + const char * shaderFunctionFooter) { AutoMutex lock(getImpl()->m_cacheIDMutex); getImpl()->m_shaderCode.clear(); - getImpl()->m_shaderCode += (shaderDeclarations && *shaderDeclarations) ? shaderDeclarations : ""; - getImpl()->m_shaderCode += (shaderHelperMethods && *shaderHelperMethods) ? shaderHelperMethods : ""; - getImpl()->m_shaderCode += (shaderFunctionHeader && *shaderFunctionHeader) ? shaderFunctionHeader : ""; - getImpl()->m_shaderCode += (shaderFunctionBody && *shaderFunctionBody) ? shaderFunctionBody : ""; - getImpl()->m_shaderCode += (shaderFunctionFooter && *shaderFunctionFooter) ? shaderFunctionFooter : ""; + getImpl()->m_shaderCode + += (shaderDeclarations && *shaderDeclarations) ? shaderDeclarations : ""; + getImpl()->m_shaderCode + += (shaderHelperMethods && *shaderHelperMethods) ? shaderHelperMethods : ""; + getImpl()->m_shaderCode + += (shaderFunctionHeader && *shaderFunctionHeader) ? shaderFunctionHeader : ""; + getImpl()->m_shaderCode + += (shaderFunctionBody && *shaderFunctionBody) ? shaderFunctionBody : ""; + getImpl()->m_shaderCode + += (shaderFunctionFooter && *shaderFunctionFooter) ? shaderFunctionFooter : ""; - getImpl()->m_shaderCodeID = CacheIDHash(getImpl()->m_shaderCode.c_str(), - getImpl()->m_shaderCode.length()); + getImpl()->m_shaderCodeID + = CacheIDHash(getImpl()->m_shaderCode.c_str(), getImpl()->m_shaderCode.length()); getImpl()->m_cacheID.clear(); } @@ -309,9 +314,10 @@ void GpuShaderCreator::finalize() // For some GPU languages, the default header and footer do not fit well so, the class wrapper // encapsulates differences when needed. - getImpl()->m_classWrappingInterface->prepareClassWrapper(getResourcePrefix(), - getImpl()->m_functionName, - getImpl()->m_declarations); + getImpl()->m_classWrappingInterface->prepareClassWrapper( + getResourcePrefix(), + getImpl()->m_functionName, + getImpl()->m_declarations); getImpl()->m_declarations = getImpl()->m_classWrappingInterface->getClassWrapperHeader(getImpl()->m_declarations); @@ -320,14 +326,14 @@ void GpuShaderCreator::finalize() // Build the complete shader program. - createShaderText(getImpl()->m_declarations.c_str(), - getImpl()->m_helperMethods.c_str(), - getImpl()->m_functionHeader.c_str(), - getImpl()->m_functionBody.c_str(), - getImpl()->m_functionFooter.c_str()); - + createShaderText( + getImpl()->m_declarations.c_str(), + getImpl()->m_helperMethods.c_str(), + getImpl()->m_functionHeader.c_str(), + getImpl()->m_functionBody.c_str(), + getImpl()->m_functionFooter.c_str()); - if(IsDebugLoggingEnabled()) + if (IsDebugLoggingEnabled()) { std::ostringstream oss; oss << std::endl @@ -339,15 +345,13 @@ void GpuShaderCreator::finalize() } } - - GpuShaderDescRcPtr GpuShaderDesc::CreateShaderDesc() { return GenericGpuShaderDesc::Create(); } GpuShaderDesc::GpuShaderDesc() - : GpuShaderCreator() + : GpuShaderCreator() { } @@ -358,7 +362,7 @@ GpuShaderDesc::~GpuShaderDesc() GpuShaderCreatorRcPtr GpuShaderDesc::clone() const { GpuShaderDescRcPtr gpuDesc = CreateShaderDesc(); - *(gpuDesc->getImpl()) = *getImpl(); + *(gpuDesc->getImpl()) = *getImpl(); return DynamicPtrCast(gpuDesc); } diff --git a/src/OpenColorIO/GpuShaderUtils.cpp b/src/OpenColorIO/GpuShaderUtils.cpp index a3adefbdc0..1e4abcb9fc 100644 --- a/src/OpenColorIO/GpuShaderUtils.cpp +++ b/src/OpenColorIO/GpuShaderUtils.cpp @@ -14,18 +14,17 @@ namespace OCIO_NAMESPACE // This method converts a float/double to a string adding a dot when // the float does not have a fractional part. Hence, it ensures // that the shader understand that number as a float and not as an integer. -// -// Note: The template selects the appropriate number of digits for either single +// +// Note: The template selects the appropriate number of digits for either single // or double arguments to losslessly represent the value as a string. -// -template -std::string getFloatString(T v, GpuLanguage lang) +// +template std::string getFloatString(T v, GpuLanguage lang) { static_assert(!std::numeric_limits::is_integer, "Only floating point values"); const T value = (lang == GPU_LANGUAGE_CG) ? (T)ClampToNormHalf(v) : v; - T integerpart = (T)0; + T integerpart = (T)0; const T fracpart = std::modf(value, &integerpart); std::ostringstream oss; @@ -34,8 +33,7 @@ std::string getFloatString(T v, GpuLanguage lang) return oss.str(); } -template -std::string getVecKeyword(GpuLanguage lang) +template std::string getVecKeyword(GpuLanguage lang) { std::ostringstream kw; switch (lang) @@ -75,12 +73,13 @@ std::string getVecKeyword(GpuLanguage lang) return kw.str(); } -template -void getTexDecl(GpuLanguage lang, - const std::string & textureName, - const std::string & samplerName, - std::string & textureDecl, - std::string & samplerDecl) +template +void getTexDecl( + GpuLanguage lang, + const std::string & textureName, + const std::string & samplerName, + std::string & textureDecl, + std::string & samplerDecl) { switch (lang) { @@ -132,11 +131,12 @@ void getTexDecl(GpuLanguage lang, } } -template -std::string getTexSample(GpuLanguage lang, - const std::string & textureName, - const std::string & samplerName, - const std::string & coords) +template +std::string getTexSample( + GpuLanguage lang, + const std::string & textureName, + const std::string & samplerName, + const std::string & coords) { std::ostringstream kw; @@ -154,7 +154,8 @@ std::string getTexSample(GpuLanguage lang, } case GPU_LANGUAGE_GLSL_ES_1_0: { - if (N == 1) { + if (N == 1) + { throw Exception("1D textures are unsupported by OpenGL ES."); } @@ -178,7 +179,8 @@ std::string getTexSample(GpuLanguage lang, } case GPU_LANGUAGE_GLSL_ES_3_0: { - if (N == 1) { + if (N == 1) + { throw Exception("1D textures are unsupported by OpenGL ES."); } @@ -204,38 +206,38 @@ std::string getTexSample(GpuLanguage lang, return kw.str(); } -template +template std::string getMatrixValues(const T * mtx, GpuLanguage lang, bool transpose) { std::string vals; - for(int i=0 ; iflushLine(); } } -GpuShaderText::GpuShaderLine& GpuShaderText::GpuShaderLine::operator<<(const char* str) +GpuShaderText::GpuShaderLine & GpuShaderText::GpuShaderLine::operator<<(const char * str) { if (str) { @@ -244,37 +246,38 @@ GpuShaderText::GpuShaderLine& GpuShaderText::GpuShaderLine::operator<<(const cha return *this; } -GpuShaderText::GpuShaderLine& GpuShaderText::GpuShaderLine::operator<<(float value) +GpuShaderText::GpuShaderLine & GpuShaderText::GpuShaderLine::operator<<(float value) { m_text->m_ossLine << getFloatString(value, m_text->m_lang); return *this; } -GpuShaderText::GpuShaderLine& GpuShaderText::GpuShaderLine::operator<<(double value) +GpuShaderText::GpuShaderLine & GpuShaderText::GpuShaderLine::operator<<(double value) { m_text->m_ossLine << getFloatString(value, m_text->m_lang); return *this; } -GpuShaderText::GpuShaderLine& GpuShaderText::GpuShaderLine::operator<<(unsigned value) +GpuShaderText::GpuShaderLine & GpuShaderText::GpuShaderLine::operator<<(unsigned value) { m_text->m_ossLine << value; return *this; } -GpuShaderText::GpuShaderLine& GpuShaderText::GpuShaderLine::operator<<(int value) +GpuShaderText::GpuShaderLine & GpuShaderText::GpuShaderLine::operator<<(int value) { m_text->m_ossLine << value; return *this; } -GpuShaderText::GpuShaderLine& GpuShaderText::GpuShaderLine::operator<<(const std::string& str) +GpuShaderText::GpuShaderLine & GpuShaderText::GpuShaderLine::operator<<(const std::string & str) { m_text->m_ossLine << str; return *this; } -GpuShaderText::GpuShaderLine& GpuShaderText::GpuShaderLine::operator=(const GpuShaderText::GpuShaderLine& rhs) +GpuShaderText::GpuShaderLine & GpuShaderText::GpuShaderLine::operator=( + const GpuShaderText::GpuShaderLine & rhs) { if (this != &rhs) { @@ -284,8 +287,8 @@ GpuShaderText::GpuShaderLine& GpuShaderText::GpuShaderLine::operator=(const GpuS } GpuShaderText::GpuShaderText(GpuLanguage lang) - : m_lang(lang) - , m_indent(0) + : m_lang(lang) + , m_indent(0) { m_ossText.precision(16); m_ossLine.precision(16); @@ -320,9 +323,7 @@ void GpuShaderText::flushLine() { static constexpr unsigned tabSize = 2; - m_ossText << std::string(tabSize * m_indent, ' ') - << m_ossLine.str() - << std::endl; + m_ossText << std::string(tabSize * m_indent, ' ') << m_ossLine.str() << std::endl; m_ossLine.str(""); m_ossLine.clear(); @@ -406,7 +407,7 @@ std::string GpuShaderText::colorDecl(const std::string & name) const throw Exception("GPU variable name is empty."); } - return (m_lang==LANGUAGE_OSL_1 ? "color" : float3Keyword()) + " " + name; + return (m_lang == LANGUAGE_OSL_1 ? "color" : float3Keyword()) + " " + name; } void GpuShaderText::declareVarConst(const std::string & name, float v) @@ -454,10 +455,13 @@ std::string GpuShaderText::declareVarStr(const std::string & name, float v) return floatDecl(name) + " = " + getFloatString(v, m_lang); } -std::string GpuShaderText::vectorCompareExpression(const std::string& lhs, const std::string& op, const std::string& rhs) +std::string GpuShaderText::vectorCompareExpression( + const std::string & lhs, + const std::string & op, + const std::string & rhs) { std::string ret = lhs + " " + op + " " + rhs; - if(m_lang == GPU_LANGUAGE_MSL_2_0) + if (m_lang == GPU_LANGUAGE_MSL_2_0) { ret = "any( " + ret + " )"; } @@ -481,7 +485,7 @@ std::string GpuShaderText::declareVarStr(const std::string & name, bool v) throw Exception("GPU variable name is empty."); } - if (m_lang==LANGUAGE_OSL_1) + if (m_lang == LANGUAGE_OSL_1) { return intKeyword() + " " + name + " = " + (v ? "1" : "0"); } @@ -566,8 +570,8 @@ void GpuShaderText::declareIntArrayConst(const std::string & name, int size, con case GPU_LANGUAGE_GLSL_ES_1_0: case GPU_LANGUAGE_GLSL_ES_3_0: { - nl << intKeywordConst() << " " << name << "[" << size << "] = " - << intKeyword() << "[" << size << "]("; + nl << intKeywordConst() << " " << name << "[" << size << "] = " << intKeyword() << "[" + << size << "]("; for (int i = 0; i < size; ++i) { nl << v[i]; @@ -634,21 +638,24 @@ std::string GpuShaderText::float3Keyword() const std::string GpuShaderText::float3Const(float x, float y, float z) const { - return float3Const(getFloatString(x, m_lang), - getFloatString(y, m_lang), - getFloatString(z, m_lang)); + return float3Const( + getFloatString(x, m_lang), + getFloatString(y, m_lang), + getFloatString(z, m_lang)); } std::string GpuShaderText::float3Const(double x, double y, double z) const { - return float3Const(getFloatString(x, m_lang), - getFloatString(y, m_lang), - getFloatString(z, m_lang)); + return float3Const( + getFloatString(x, m_lang), + getFloatString(y, m_lang), + getFloatString(z, m_lang)); } -std::string GpuShaderText::float3Const(const std::string& x, - const std::string& y, - const std::string& z) const +std::string GpuShaderText::float3Const( + const std::string & x, + const std::string & y, + const std::string & z) const { std::ostringstream kw; kw << float3Keyword() << "(" << x << ", " << y << ", " << z << ")"; @@ -670,7 +677,7 @@ std::string GpuShaderText::float3Const(const std::string & v) const return float3Const(v, v, v); } -std::string GpuShaderText::float3Decl(const std::string & name) const +std::string GpuShaderText::float3Decl(const std::string & name) const { if (name.empty()) { @@ -682,28 +689,32 @@ std::string GpuShaderText::float3Decl(const std::string & name) const void GpuShaderText::declareFloat3(const std::string & name, float x, float y, float z) { - declareFloat3(name, getFloatString(x, m_lang), - getFloatString(y, m_lang), - getFloatString(z, m_lang)); + declareFloat3( + name, + getFloatString(x, m_lang), + getFloatString(y, m_lang), + getFloatString(z, m_lang)); } -void GpuShaderText::declareFloat3(const std::string& name, const Float3 & vec3) +void GpuShaderText::declareFloat3(const std::string & name, const Float3 & vec3) { declareFloat3(name, vec3[0], vec3[1], vec3[2]); } -void GpuShaderText::declareFloat3(const std::string & name, - double x, double y, double z) +void GpuShaderText::declareFloat3(const std::string & name, double x, double y, double z) { - declareFloat3(name, getFloatString(x, m_lang), - getFloatString(y, m_lang), - getFloatString(z, m_lang)); + declareFloat3( + name, + getFloatString(x, m_lang), + getFloatString(y, m_lang), + getFloatString(z, m_lang)); } -void GpuShaderText::declareFloat3(const std::string & name, - const std::string & x, - const std::string & y, - const std::string & z) +void GpuShaderText::declareFloat3( + const std::string & name, + const std::string & x, + const std::string & y, + const std::string & z) { newLine() << float3Decl(name) << " = " << float3Const(x, y, z) << ";"; } @@ -713,33 +724,34 @@ std::string GpuShaderText::float4Keyword() const return getVecKeyword<4>(m_lang); } -std::string GpuShaderText::float4Const(const float x, const float y, const float z, const float w) const +std::string GpuShaderText::float4Const(const float x, const float y, const float z, const float w) + const { - return float4Const(getFloatString(x, m_lang), - getFloatString(y, m_lang), - getFloatString(z, m_lang), - getFloatString(w, m_lang)); + return float4Const( + getFloatString(x, m_lang), + getFloatString(y, m_lang), + getFloatString(z, m_lang), + getFloatString(w, m_lang)); } -std::string GpuShaderText::float4Const(const double x, const double y, const double z, const double w) const +std::string +GpuShaderText::float4Const(const double x, const double y, const double z, const double w) const { - return float4Const(getFloatString(x, m_lang), - getFloatString(y, m_lang), - getFloatString(z, m_lang), - getFloatString(w, m_lang)); + return float4Const( + getFloatString(x, m_lang), + getFloatString(y, m_lang), + getFloatString(z, m_lang), + getFloatString(w, m_lang)); } -std::string GpuShaderText::float4Const(const std::string & x, - const std::string & y, - const std::string & z, - const std::string & w) const +std::string GpuShaderText::float4Const( + const std::string & x, + const std::string & y, + const std::string & z, + const std::string & w) const { std::ostringstream kw; - kw << float4Keyword() << "(" - << x << ", " - << y << ", " - << z << ", " - << w << ")"; + kw << float4Keyword() << "(" << x << ", " << y << ", " << z << ", " << w << ")"; return kw.str(); } @@ -764,40 +776,47 @@ std::string GpuShaderText::float4Decl(const std::string & name) const return float4Keyword() + " " + name; } -void GpuShaderText::declareFloat4(const std::string & name, - const float x, - const float y, - const float z, - const float w) +void GpuShaderText::declareFloat4( + const std::string & name, + const float x, + const float y, + const float z, + const float w) { - declareFloat4(name, getFloatString(x, m_lang), - getFloatString(y, m_lang), - getFloatString(z, m_lang), - getFloatString(w, m_lang)); + declareFloat4( + name, + getFloatString(x, m_lang), + getFloatString(y, m_lang), + getFloatString(z, m_lang), + getFloatString(w, m_lang)); } -void GpuShaderText::declareFloat4(const std::string & name, - const double x, - const double y, - const double z, - const double w) +void GpuShaderText::declareFloat4( + const std::string & name, + const double x, + const double y, + const double z, + const double w) { - declareFloat4(name, getFloatString(x, m_lang), - getFloatString(y, m_lang), - getFloatString(z, m_lang), - getFloatString(w, m_lang)); + declareFloat4( + name, + getFloatString(x, m_lang), + getFloatString(y, m_lang), + getFloatString(z, m_lang), + getFloatString(w, m_lang)); } -void GpuShaderText::declareFloat4(const std::string & name, - const std::string & x, - const std::string & y, - const std::string & z, - const std::string & w) +void GpuShaderText::declareFloat4( + const std::string & name, + const std::string & x, + const std::string & y, + const std::string & z, + const std::string & w) { newLine() << float4Decl(name) << " = " << float4Const(x, y, z, w) << ";"; } -std::string GpuShaderText::getSamplerName(const std::string& textureName) +std::string GpuShaderText::getSamplerName(const std::string & textureName) { return textureName + "Sampler"; } @@ -834,7 +853,7 @@ void GpuShaderText::declareTex2D(const std::string & textureName) } } -void GpuShaderText::declareTex3D(const std::string& textureName) +void GpuShaderText::declareTex3D(const std::string & textureName) { std::string textureDecl, samplerDecl; getTexDecl<3>(m_lang, textureName, getSamplerName(textureName), textureDecl, samplerDecl); @@ -850,52 +869,56 @@ void GpuShaderText::declareTex3D(const std::string& textureName) } } -std::string GpuShaderText::sampleTex1D(const std::string& textureName, - const std::string& coords) const +std::string GpuShaderText::sampleTex1D(const std::string & textureName, const std::string & coords) + const { return getTexSample<1>(m_lang, textureName, getSamplerName(textureName), coords); } -std::string GpuShaderText::sampleTex2D(const std::string& textureName, - const std::string& coords) const +std::string GpuShaderText::sampleTex2D(const std::string & textureName, const std::string & coords) + const { return getTexSample<2>(m_lang, textureName, getSamplerName(textureName), coords); } -std::string GpuShaderText::sampleTex3D(const std::string& textureName, - const std::string& coords) const +std::string GpuShaderText::sampleTex3D(const std::string & textureName, const std::string & coords) + const { return getTexSample<3>(m_lang, textureName, getSamplerName(textureName), coords); } - void GpuShaderText::declareUniformFloat(const std::string & uniformName) { - newLine() << (m_lang == GPU_LANGUAGE_MSL_2_0 ? "" : "uniform ") << floatKeyword() << " " << uniformName << ";"; + newLine() << (m_lang == GPU_LANGUAGE_MSL_2_0 ? "" : "uniform ") << floatKeyword() << " " + << uniformName << ";"; } void GpuShaderText::declareUniformBool(const std::string & uniformName) { - newLine() << (m_lang == GPU_LANGUAGE_MSL_2_0 ? "" : "uniform ") << "bool " << uniformName << ";"; + newLine() << (m_lang == GPU_LANGUAGE_MSL_2_0 ? "" : "uniform ") << "bool " << uniformName + << ";"; } void GpuShaderText::declareUniformFloat3(const std::string & uniformName) { - newLine() << (m_lang == GPU_LANGUAGE_MSL_2_0 ? "" : "uniform ") << float3Keyword() << " " << uniformName << ";"; + newLine() << (m_lang == GPU_LANGUAGE_MSL_2_0 ? "" : "uniform ") << float3Keyword() << " " + << uniformName << ";"; } void GpuShaderText::declareUniformArrayFloat(const std::string & uniformName, unsigned int size) { - newLine() << (m_lang == GPU_LANGUAGE_MSL_2_0 ? "" : "uniform ") << floatKeyword() << " " << uniformName << "[" << size << "];"; + newLine() << (m_lang == GPU_LANGUAGE_MSL_2_0 ? "" : "uniform ") << floatKeyword() << " " + << uniformName << "[" << size << "];"; } void GpuShaderText::declareUniformArrayInt(const std::string & uniformName, unsigned int size) { - newLine() << (m_lang == GPU_LANGUAGE_MSL_2_0 ? "" : "uniform ") << intKeyword() << " " << uniformName << "[" << size << "];"; + newLine() << (m_lang == GPU_LANGUAGE_MSL_2_0 ? "" : "uniform ") << intKeyword() << " " + << uniformName << "[" << size << "];"; } // Keep the method private as only float & double types are expected -template +template std::string matrix4Mul(const T * m4x4, const std::string & vecName, GpuLanguage lang) { if (vecName.empty()) @@ -913,20 +936,19 @@ std::string matrix4Mul(const T * m4x4, const std::string & vecName, GpuLanguage case GPU_LANGUAGE_GLSL_ES_3_0: { // OpenGL shader program requests a transposed matrix - kw << "mat4(" - << getMatrixValues(m4x4, lang, true) << ") * " << vecName; + kw << "mat4(" << getMatrixValues(m4x4, lang, true) << ") * " << vecName; break; } case GPU_LANGUAGE_CG: { - kw << "mul(half4x4(" - << getMatrixValues(m4x4, lang, false) << "), " << vecName << ")"; + kw << "mul(half4x4(" << getMatrixValues(m4x4, lang, false) << "), " << vecName + << ")"; break; } case GPU_LANGUAGE_HLSL_DX11: { - kw << "mul(" << vecName - << ", float4x4(" << getMatrixValues(m4x4, lang, true) << "))"; + kw << "mul(" << vecName << ", float4x4(" << getMatrixValues(m4x4, lang, true) + << "))"; break; } case LANGUAGE_OSL_1: @@ -948,21 +970,18 @@ std::string matrix4Mul(const T * m4x4, const std::string & vecName, GpuLanguage return kw.str(); } -std::string GpuShaderText::mat4fMul(const float * m4x4, - const std::string & vecName) const +std::string GpuShaderText::mat4fMul(const float * m4x4, const std::string & vecName) const { return matrix4Mul(m4x4, vecName, m_lang); } -std::string GpuShaderText::mat4fMul(const double * m4x4, - const std::string & vecName) const +std::string GpuShaderText::mat4fMul(const double * m4x4, const std::string & vecName) const { return matrix4Mul(m4x4, vecName, m_lang); } -std::string GpuShaderText::lerp(const std::string & x, - const std::string & y, - const std::string & a) const +std::string GpuShaderText::lerp(const std::string & x, const std::string & y, const std::string & a) + const { std::ostringstream kw; switch (m_lang) @@ -993,8 +1012,7 @@ std::string GpuShaderText::lerp(const std::string & x, return kw.str(); } -std::string GpuShaderText::float3GreaterThan(const std::string & a, - const std::string & b) const +std::string GpuShaderText::float3GreaterThan(const std::string & a, const std::string & b) const { std::ostringstream kw; switch (m_lang) @@ -1013,10 +1031,9 @@ std::string GpuShaderText::float3GreaterThan(const std::string & a, case GPU_LANGUAGE_MSL_2_0: case GPU_LANGUAGE_HLSL_DX11: { - kw << float3Keyword() << "(" - << "(" << a << "[0] > " << b << "[0]) ? 1.0 : 0.0, " - << "(" << a << "[1] > " << b << "[1]) ? 1.0 : 0.0, " - << "(" << a << "[2] > " << b << "[2]) ? 1.0 : 0.0)"; + kw << float3Keyword() << "(" << "(" << a << "[0] > " << b << "[0]) ? 1.0 : 0.0, " << "(" + << a << "[1] > " << b << "[1]) ? 1.0 : 0.0, " << "(" << a << "[2] > " << b + << "[2]) ? 1.0 : 0.0)"; break; } @@ -1028,8 +1045,7 @@ std::string GpuShaderText::float3GreaterThan(const std::string & a, return kw.str(); } -std::string GpuShaderText::float4GreaterThan(const std::string & a, - const std::string & b) const +std::string GpuShaderText::float4GreaterThan(const std::string & a, const std::string & b) const { std::ostringstream kw; switch (m_lang) @@ -1047,20 +1063,16 @@ std::string GpuShaderText::float4GreaterThan(const std::string & a, case GPU_LANGUAGE_MSL_2_0: case GPU_LANGUAGE_HLSL_DX11: { - kw << float4Keyword() << "(" - << "(" << a << "[0] > " << b << "[0]) ? 1.0 : 0.0, " - << "(" << a << "[1] > " << b << "[1]) ? 1.0 : 0.0, " - << "(" << a << "[2] > " << b << "[2]) ? 1.0 : 0.0, " - << "(" << a << "[3] > " << b << "[3]) ? 1.0 : 0.0)"; + kw << float4Keyword() << "(" << "(" << a << "[0] > " << b << "[0]) ? 1.0 : 0.0, " << "(" + << a << "[1] > " << b << "[1]) ? 1.0 : 0.0, " << "(" << a << "[2] > " << b + << "[2]) ? 1.0 : 0.0, " << "(" << a << "[3] > " << b << "[3]) ? 1.0 : 0.0)"; break; } case LANGUAGE_OSL_1: { - kw << float4Keyword() << "(" - << "(" << a << ".rgb.r > " << b << ".x) ? 1.0 : 0.0, " - << "(" << a << ".rgb.g > " << b << ".y) ? 1.0 : 0.0, " - << "(" << a << ".rgb.b > " << b << ".z) ? 1.0 : 0.0, " - << "(" << a << ".a > " << b << ".w) ? 1.0 : 0.0)"; + kw << float4Keyword() << "(" << "(" << a << ".rgb.r > " << b << ".x) ? 1.0 : 0.0, " + << "(" << a << ".rgb.g > " << b << ".y) ? 1.0 : 0.0, " << "(" << a << ".rgb.b > " + << b << ".z) ? 1.0 : 0.0, " << "(" << a << ".a > " << b << ".w) ? 1.0 : 0.0)"; break; } @@ -1072,11 +1084,10 @@ std::string GpuShaderText::float4GreaterThan(const std::string & a, return kw.str(); } -std::string GpuShaderText::atan2(const std::string & y, - const std::string & x) const +std::string GpuShaderText::atan2(const std::string & y, const std::string & x) const { std::ostringstream kw; - switch(m_lang) + switch (m_lang) { case GPU_LANGUAGE_CG: case GPU_LANGUAGE_GLSL_1_2: @@ -1115,7 +1126,7 @@ std::string GpuShaderText::atan2(const std::string & y, std::string GpuShaderText::sign(const std::string & v) const { std::ostringstream kw; - switch(m_lang) + switch (m_lang) { case GPU_LANGUAGE_CG: case GPU_LANGUAGE_GLSL_1_2: @@ -1131,8 +1142,8 @@ std::string GpuShaderText::sign(const std::string & v) const } case LANGUAGE_OSL_1: { - kw << "sign(" << float4Const(v + ".rgb.r", v + ".rgb.g", - v + ".rgb.b", v + ".a") << ");"; + kw << "sign(" << float4Const(v + ".rgb.r", v + ".rgb.g", v + ".rgb.b", v + ".a") + << ");"; break; } default: @@ -1143,9 +1154,10 @@ std::string GpuShaderText::sign(const std::string & v) const return kw.str(); } - -std::string BuildResourceName(GpuShaderCreatorRcPtr & shaderCreator, const std::string & prefix, - const std::string & base) +std::string BuildResourceName( + GpuShaderCreatorRcPtr & shaderCreator, + const std::string & prefix, + const std::string & base) { std::string name = shaderCreator->getResourcePrefix(); name += "_"; @@ -1167,12 +1179,12 @@ void AddLinToLogShader(GpuShaderCreatorRcPtr & shaderCreator, GpuShaderText & st { const std::string pix(shaderCreator->getPixelName()); - st.newLine() << "{"; // establish scope so local variable names won't conflict + st.newLine() << "{"; // establish scope so local variable names won't conflict st.indent(); st.newLine() << st.floatKeywordConst() << " xbrk = 0.0041318374739483946;"; st.newLine() << st.floatKeywordConst() << " shift = -0.000157849851665374;"; st.newLine() << st.floatKeywordConst() << " m = 1. / (0.18 + shift);"; - st.newLine() << st.floatKeywordConst() << " base2 = 1.4426950408889634;"; // 1/log(2) + st.newLine() << st.floatKeywordConst() << " base2 = 1.4426950408889634;"; // 1/log(2) st.newLine() << st.floatKeywordConst() << " gain = 363.034608563;"; st.newLine() << st.floatKeywordConst() << " offs = -7.;"; st.newLine() << st.float3Decl("ylin") << " = " << pix << ".rgb * gain + offs;"; @@ -1188,15 +1200,15 @@ void AddLogToLinShader(GpuShaderCreatorRcPtr & shaderCreator, GpuShaderText & st { const std::string pix(shaderCreator->getPixelName()); - st.newLine() << "{"; // establish scope so local variable names won't conflict + st.newLine() << "{"; // establish scope so local variable names won't conflict st.indent(); st.newLine() << st.floatKeywordConst() << " ybrk = -5.5;"; st.newLine() << st.floatKeywordConst() << " shift = -0.000157849851665374;"; st.newLine() << st.floatKeywordConst() << " gain = 363.034608563;"; st.newLine() << st.floatKeywordConst() << " offs = -7.;"; st.newLine() << st.float3Decl("xlin") << " = (" << pix << ".rgb - offs) / gain;"; - st.newLine() << st.float3Decl("xlog") << " = pow( " << st.float3Const(2.0f) - << ", " << pix << ".rgb ) * (0.18 + shift) - shift;"; + st.newLine() << st.float3Decl("xlog") << " = pow( " << st.float3Const(2.0f) << ", " << pix + << ".rgb ) * (0.18 + shift) - shift;"; st.newLine() << pix << ".rgb.r = (" << pix << ".rgb.r < ybrk) ? xlin.x : xlog.x;"; st.newLine() << pix << ".rgb.g = (" << pix << ".rgb.g < ybrk) ? xlin.y : xlog.y;"; st.newLine() << pix << ".rgb.b = (" << pix << ".rgb.b < ybrk) ? xlin.z : xlog.z;"; diff --git a/src/OpenColorIO/GpuShaderUtils.h b/src/OpenColorIO/GpuShaderUtils.h index b533110749..537f585863 100644 --- a/src/OpenColorIO/GpuShaderUtils.h +++ b/src/OpenColorIO/GpuShaderUtils.h @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_GPUSHADERUTILS_H #define INCLUDED_OCIO_GPUSHADERUTILS_H @@ -9,7 +8,6 @@ #include - namespace OCIO_NAMESPACE { // Helper class to create shader programs @@ -17,22 +15,21 @@ class GpuShaderText { public: - // Helper class to create shader lines class GpuShaderLine { public: - GpuShaderLine() = delete; + GpuShaderLine() = delete; GpuShaderLine(const GpuShaderLine &) = default; ~GpuShaderLine(); - GpuShaderLine& operator<<(const char * str); - GpuShaderLine& operator<<(float value); - GpuShaderLine& operator<<(double value); - GpuShaderLine& operator<<(unsigned value); - GpuShaderLine& operator<<(int value); - GpuShaderLine& operator<<(const std::string & str); - GpuShaderLine& operator=(const GpuShaderLine & rhs); + GpuShaderLine & operator<<(const char * str); + GpuShaderLine & operator<<(float value); + GpuShaderLine & operator<<(double value); + GpuShaderLine & operator<<(unsigned value); + GpuShaderLine & operator<<(int value); + GpuShaderLine & operator<<(const std::string & str); + GpuShaderLine & operator=(const GpuShaderLine & rhs); friend class GpuShaderText; @@ -45,7 +42,6 @@ class GpuShaderText }; public: - GpuShaderText() = delete; explicit GpuShaderText(GpuLanguage lang); @@ -71,14 +67,17 @@ class GpuShaderText std::string floatKeyword() const; std::string floatKeywordConst() const; - std::string floatDecl(const std::string& name) const; + std::string floatDecl(const std::string & name) const; std::string intKeyword() const; std::string intKeywordConst() const; - std::string colorDecl(const std::string& name) const; - - std::string vectorCompareExpression(const std::string& lhs, const std::string& op, const std::string& rhs); + std::string colorDecl(const std::string & name) const; + + std::string vectorCompareExpression( + const std::string & lhs, + const std::string & op, + const std::string & rhs); // // Scalar & arrays helper functions. @@ -105,7 +104,7 @@ class GpuShaderText // std::string float2Keyword() const; - std::string float2Decl(const std::string& name) const; + std::string float2Decl(const std::string & name) const; // // Float3 helper functions @@ -117,22 +116,26 @@ class GpuShaderText std::string float3Const(float x, float y, float z) const; std::string float3Const(double x, double y, double z) const; // Get the string for creating constant vector with three elements - std::string float3Const(const std::string& x, const std::string& y, const std::string& z) const; + std::string float3Const(const std::string & x, const std::string & y, const std::string & z) + const; // Get the string for creating constant vector with three elements std::string float3Const(float v) const; std::string float3Const(double v) const; // Get the string for creating constant vector with three elements - std::string float3Const(const std::string& v) const; + std::string float3Const(const std::string & v) const; // Get the declaration for a vector with three elements - std::string float3Decl(const std::string& name) const; + std::string float3Decl(const std::string & name) const; // Declare and initialize a vector with three elements - void declareFloat3(const std::string& name, float x, float y, float z); - void declareFloat3(const std::string& name, const Float3 & vec3); - void declareFloat3(const std::string& name, double x, double y, double z); + void declareFloat3(const std::string & name, float x, float y, float z); + void declareFloat3(const std::string & name, const Float3 & vec3); + void declareFloat3(const std::string & name, double x, double y, double z); // Declare and initialize a vector with three elements - void declareFloat3(const std::string& name, - const std::string& x, const std::string& y, const std::string& z); + void declareFloat3( + const std::string & name, + const std::string & x, + const std::string & y, + const std::string & z); // // Float4 helper functions @@ -144,42 +147,46 @@ class GpuShaderText std::string float4Const(float x, float y, float z, float w) const; std::string float4Const(double x, double y, double z, double w) const; // Get the string for creating constant vector with four elements - std::string float4Const(const std::string& x, const std::string& y, - const std::string& z, const std::string& w) const; + std::string float4Const( + const std::string & x, + const std::string & y, + const std::string & z, + const std::string & w) const; // Get the string for creating constant vector with four elements std::string float4Const(float v) const; // Get the string for creating constant vector with four elements - std::string float4Const(const std::string& v) const; + std::string float4Const(const std::string & v) const; // Get the declaration for a vector with four elements - std::string float4Decl(const std::string& name) const; + std::string float4Decl(const std::string & name) const; // Declare and initialize a vector with four elements - void declareFloat4(const std::string& name, - float x, float y, float z, float w); - void declareFloat4(const std::string& name, - double x, double y, double z, double w); - void declareFloat4(const std::string& name, - const std::string& x, const std::string& y, - const std::string& z, const std::string& w); + void declareFloat4(const std::string & name, float x, float y, float z, float w); + void declareFloat4(const std::string & name, double x, double y, double z, double w); + void declareFloat4( + const std::string & name, + const std::string & x, + const std::string & y, + const std::string & z, + const std::string & w); // // Texture helpers // - static std::string getSamplerName(const std::string& textureName); + static std::string getSamplerName(const std::string & textureName); // Declare the global texture and sampler information for a 1D texture. - void declareTex1D(const std::string& textureName); + void declareTex1D(const std::string & textureName); // Declare the global texture and sampler information for a 2D texture. - void declareTex2D(const std::string& textureName); + void declareTex2D(const std::string & textureName); // Declare the global texture and sampler information for a 3D texture. - void declareTex3D(const std::string& textureName); + void declareTex3D(const std::string & textureName); // Get the texture lookup call for a 1D texture. - std::string sampleTex1D(const std::string& textureName, const std::string& coords) const; + std::string sampleTex1D(const std::string & textureName, const std::string & coords) const; // Get the texture lookup call for a 2D texture. - std::string sampleTex2D(const std::string& textureName, const std::string& coords) const; + std::string sampleTex2D(const std::string & textureName, const std::string & coords) const; // Get the texture lookup call for a 3D texture. - std::string sampleTex3D(const std::string& textureName, const std::string& coords) const; + std::string sampleTex3D(const std::string & textureName, const std::string & coords) const; // // Uniform helpers @@ -204,17 +211,16 @@ class GpuShaderText // // Get the string for linearly interpolating two quantities. - std::string lerp(const std::string& x, const std::string& y, - const std::string& a) const; + std::string lerp(const std::string & x, const std::string & y, const std::string & a) const; // Get the string for creating a three or four-elements 'greater than' comparison // Each element i in the resulting vector is 1 if a>b, or 0 otherwise. - std::string float3GreaterThan(const std::string& a, const std::string& b) const; - std::string float4GreaterThan(const std::string& a, const std::string& b) const; + std::string float3GreaterThan(const std::string & a, const std::string & b) const; + std::string float4GreaterThan(const std::string & a, const std::string & b) const; - // Get the string for taking the four-quadrant arctangent + // Get the string for taking the four-quadrant arctangent // (similar to atan(y/x) but takes into account the signs of the arguments). - std::string atan2(const std::string& y, const std::string& x) const; + std::string atan2(const std::string & y, const std::string & x) const; // Get the string for taking the sign of a vector. std::string sign(const std::string & v) const; @@ -230,14 +236,14 @@ class GpuShaderText private: // Shader language to use in the various shader text builder methods. - GpuLanguage m_lang; + GpuLanguage m_lang; // String stream containing the current shader text. std::ostringstream m_ossText; - // In order to avoid repeated allocations of an output string stream - // for multiple shader lines, create a single ostringstream instance - // on the shader text and just reset it after a line has been added - // to the text. This should not pose a racing problem since we're only + // In order to avoid repeated allocations of an output string stream + // for multiple shader lines, create a single ostringstream instance + // on the shader text and just reset it after a line has been added + // to the text. This should not pose a racing problem since we're only // creating a single line at a time for a given shader text. // String stream containing the current shader line. @@ -248,8 +254,10 @@ class GpuShaderText }; // Create a resource name prepending the prefix of the shaderCreator to base. -std::string BuildResourceName(GpuShaderCreatorRcPtr & shaderCreator, const std::string & prefix, - const std::string & base); +std::string BuildResourceName( + GpuShaderCreatorRcPtr & shaderCreator, + const std::string & prefix, + const std::string & base); // // Math functions used by multiple GPU renderers. diff --git a/src/OpenColorIO/HashUtils.cpp b/src/OpenColorIO/HashUtils.cpp index 15f775faa0..2f827e3771 100644 --- a/src/OpenColorIO/HashUtils.cpp +++ b/src/OpenColorIO/HashUtils.cpp @@ -8,11 +8,10 @@ #include "HashUtils.h" #define XXH_INLINE_ALL -#define XXH_STATIC_LINKING_ONLY /* access advanced declarations */ -#define XXH_IMPLEMENTATION /* access definitions */ +#define XXH_STATIC_LINKING_ONLY /* access advanced declarations */ +#define XXH_IMPLEMENTATION /* access definitions */ #include "xxhash.h" - namespace OCIO_NAMESPACE { diff --git a/src/OpenColorIO/HashUtils.h b/src/OpenColorIO/HashUtils.h index 66c3b6e3fd..e04e8053b0 100644 --- a/src/OpenColorIO/HashUtils.h +++ b/src/OpenColorIO/HashUtils.h @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_HASHUTILS_H #define INCLUDED_OCIO_HASHUTILS_H diff --git a/src/OpenColorIO/ImageDesc.cpp b/src/OpenColorIO/ImageDesc.cpp index 2f045f1597..814d304f47 100644 --- a/src/OpenColorIO/ImageDesc.cpp +++ b/src/OpenColorIO/ImageDesc.cpp @@ -13,9 +13,9 @@ namespace OCIO_NAMESPACE { -std::ostream& operator<< (std::ostream& os, const ImageDesc& img) +std::ostream & operator<<(std::ostream & os, const ImageDesc & img) { - if(const PackedImageDesc * packedImg = dynamic_cast(&img)) + if (const PackedImageDesc * packedImg = dynamic_cast(&img)) { os << ""; } - else if(const PlanarImageDesc * planarImg = dynamic_cast(&img)) + else if (const PlanarImageDesc * planarImg = dynamic_cast(&img)) { os << "::Type)) + if (m_chanStrideBytes != sizeof(BitDepthInfo::Type)) { return false; } @@ -202,7 +199,7 @@ struct PackedImageDesc::Impl case BIT_DEPTH_UINT10: { // Note that a 10-bit integer bit-depth value is stored in a uint16_t type. - if(m_chanStrideBytes!=sizeof(BitDepthInfo::Type)) + if (m_chanStrideBytes != sizeof(BitDepthInfo::Type)) { return false; } @@ -211,7 +208,7 @@ struct PackedImageDesc::Impl case BIT_DEPTH_UINT12: { // Note that a 12-bit integer bit-depth value is stored in a uint16_t type. - if(m_chanStrideBytes!=sizeof(BitDepthInfo::Type)) + if (m_chanStrideBytes != sizeof(BitDepthInfo::Type)) { return false; } @@ -219,7 +216,7 @@ struct PackedImageDesc::Impl } case BIT_DEPTH_UINT16: { - if(m_chanStrideBytes!=sizeof(BitDepthInfo::Type)) + if (m_chanStrideBytes != sizeof(BitDepthInfo::Type)) { return false; } @@ -228,7 +225,7 @@ struct PackedImageDesc::Impl case BIT_DEPTH_F16: { // Note that a 16-bit float bit-depth value is stored in a half type. - if(m_chanStrideBytes!=sizeof(BitDepthInfo::Type)) + if (m_chanStrideBytes != sizeof(BitDepthInfo::Type)) { return false; } @@ -236,7 +233,7 @@ struct PackedImageDesc::Impl } case BIT_DEPTH_F32: { - if(m_chanStrideBytes!=sizeof(BitDepthInfo::Type)) + if (m_chanStrideBytes != sizeof(BitDepthInfo::Type)) { return false; } @@ -253,18 +250,23 @@ struct PackedImageDesc::Impl } } - if((char*)m_gData-(char*)m_rData != m_chanStrideBytes) return false; - if((char*)m_bData-(char*)m_gData != m_chanStrideBytes) return false; - if((char*)m_aData-(char*)m_bData != m_chanStrideBytes) return false; + if ((char *)m_gData - (char *)m_rData != m_chanStrideBytes) + return false; + if ((char *)m_bData - (char *)m_gData != m_chanStrideBytes) + return false; + if ((char *)m_aData - (char *)m_bData != m_chanStrideBytes) + return false; { // Confirm xStrideBytes is a pure packing // (I.e., it will divide evenly) const div_t result = div((int)m_xStrideBytes, (int)m_chanStrideBytes); - if(result.rem != 0) return false; + if (result.rem != 0) + return false; const int implicitChannels = result.quot; - if(implicitChannels != 4) return false; + if (implicitChannels != 4) + return false; } // Note: The optimization paths only process line by line @@ -275,7 +277,7 @@ struct PackedImageDesc::Impl bool isFloat() const { - return m_chanStrideBytes==sizeof(float) && m_bitDepth==BIT_DEPTH_F32; + return m_chanStrideBytes == sizeof(float) && m_bitDepth == BIT_DEPTH_F32; } void validate() const @@ -285,7 +287,7 @@ struct PackedImageDesc::Impl throw Exception("PackedImageDesc Error: Invalid image buffer."); } - if (m_width <= 0 || m_height <= 0 ) + if (m_width <= 0 || m_height <= 0) { throw Exception("PackedImageDesc Error: Invalid image dimensions."); } @@ -328,11 +330,9 @@ struct PackedImageDesc::Impl } }; -PackedImageDesc::PackedImageDesc(void * data, - long width, long height, - long numChannels) - : ImageDesc() - , m_impl(new PackedImageDesc::Impl) +PackedImageDesc::PackedImageDesc(void * data, long width, long height, long numChannels) + : ImageDesc() + , m_impl(new PackedImageDesc::Impl) { getImpl()->m_data = data; getImpl()->m_width = width; @@ -340,11 +340,11 @@ PackedImageDesc::PackedImageDesc(void * data, getImpl()->m_numChannels = numChannels; getImpl()->m_bitDepth = BIT_DEPTH_F32; - if(numChannels==4) + if (numChannels == 4) { getImpl()->m_chanOrder = CHANNEL_ORDERING_RGBA; } - else if(numChannels==3) + else if (numChannels == 3) { getImpl()->m_chanOrder = CHANNEL_ORDERING_RGB; } @@ -357,7 +357,7 @@ PackedImageDesc::PackedImageDesc(void * data, getImpl()->m_chanStrideBytes = oneChannelInBytes; getImpl()->m_xStrideBytes = getImpl()->m_chanStrideBytes * getImpl()->m_numChannels; - getImpl()->m_yStrideBytes = getImpl()->m_xStrideBytes* width; + getImpl()->m_yStrideBytes = getImpl()->m_xStrideBytes * width; getImpl()->initValues(); @@ -367,11 +367,9 @@ PackedImageDesc::PackedImageDesc(void * data, getImpl()->validate(); } -PackedImageDesc::PackedImageDesc(void * data, - long width, long height, - ChannelOrdering chanOrder) - : ImageDesc() - , m_impl(new PackedImageDesc::Impl) +PackedImageDesc::PackedImageDesc(void * data, long width, long height, ChannelOrdering chanOrder) + : ImageDesc() + , m_impl(new PackedImageDesc::Impl) { getImpl()->m_data = data; getImpl()->m_width = width; @@ -379,14 +377,12 @@ PackedImageDesc::PackedImageDesc(void * data, getImpl()->m_chanOrder = chanOrder; getImpl()->m_bitDepth = BIT_DEPTH_F32; - if(chanOrder==CHANNEL_ORDERING_RGBA - || chanOrder==CHANNEL_ORDERING_BGRA - || chanOrder==CHANNEL_ORDERING_ABGR) + if (chanOrder == CHANNEL_ORDERING_RGBA || chanOrder == CHANNEL_ORDERING_BGRA + || chanOrder == CHANNEL_ORDERING_ABGR) { getImpl()->m_numChannels = 4; } - else if(chanOrder==CHANNEL_ORDERING_RGB - || chanOrder==CHANNEL_ORDERING_BGR) + else if (chanOrder == CHANNEL_ORDERING_RGB || chanOrder == CHANNEL_ORDERING_BGR) { getImpl()->m_numChannels = 3; } @@ -409,15 +405,17 @@ PackedImageDesc::PackedImageDesc(void * data, getImpl()->validate(); } -PackedImageDesc::PackedImageDesc(void * data, - long width, long height, - ChannelOrdering chanOrder, - BitDepth bitDepth, - ptrdiff_t chanStrideBytes, - ptrdiff_t xStrideBytes, - ptrdiff_t yStrideBytes) - : ImageDesc() - , m_impl(new PackedImageDesc::Impl) +PackedImageDesc::PackedImageDesc( + void * data, + long width, + long height, + ChannelOrdering chanOrder, + BitDepth bitDepth, + ptrdiff_t chanStrideBytes, + ptrdiff_t xStrideBytes, + ptrdiff_t yStrideBytes) + : ImageDesc() + , m_impl(new PackedImageDesc::Impl) { getImpl()->m_data = data; getImpl()->m_width = width; @@ -425,14 +423,12 @@ PackedImageDesc::PackedImageDesc(void * data, getImpl()->m_chanOrder = chanOrder; getImpl()->m_bitDepth = bitDepth; - if(chanOrder==CHANNEL_ORDERING_RGBA - || chanOrder==CHANNEL_ORDERING_BGRA - || chanOrder==CHANNEL_ORDERING_ABGR) + if (chanOrder == CHANNEL_ORDERING_RGBA || chanOrder == CHANNEL_ORDERING_BGRA + || chanOrder == CHANNEL_ORDERING_ABGR) { getImpl()->m_numChannels = 4; } - else if(chanOrder==CHANNEL_ORDERING_RGB - || chanOrder==CHANNEL_ORDERING_BGR) + else if (chanOrder == CHANNEL_ORDERING_RGB || chanOrder == CHANNEL_ORDERING_BGR) { getImpl()->m_numChannels = 3; } @@ -443,12 +439,13 @@ PackedImageDesc::PackedImageDesc(void * data, const unsigned oneChannelInBytes = GetChannelSizeInBytes(bitDepth); - getImpl()->m_chanStrideBytes = (chanStrideBytes == AutoStride) - ? oneChannelInBytes : chanStrideBytes; + getImpl()->m_chanStrideBytes + = (chanStrideBytes == AutoStride) ? oneChannelInBytes : chanStrideBytes; getImpl()->m_xStrideBytes = (xStrideBytes == AutoStride) - ? getImpl()->m_chanStrideBytes * getImpl()->m_numChannels : xStrideBytes; - getImpl()->m_yStrideBytes = (yStrideBytes == AutoStride) - ? getImpl()->m_xStrideBytes * width : yStrideBytes; + ? getImpl()->m_chanStrideBytes * getImpl()->m_numChannels + : xStrideBytes; + getImpl()->m_yStrideBytes + = (yStrideBytes == AutoStride) ? getImpl()->m_xStrideBytes * width : yStrideBytes; getImpl()->initValues(); @@ -458,15 +455,17 @@ PackedImageDesc::PackedImageDesc(void * data, getImpl()->validate(); } -PackedImageDesc::PackedImageDesc(void * data, - long width, long height, - long numChannels, - BitDepth bitDepth, - ptrdiff_t chanStrideBytes, - ptrdiff_t xStrideBytes, - ptrdiff_t yStrideBytes) - : ImageDesc() - , m_impl(new PackedImageDesc::Impl) +PackedImageDesc::PackedImageDesc( + void * data, + long width, + long height, + long numChannels, + BitDepth bitDepth, + ptrdiff_t chanStrideBytes, + ptrdiff_t xStrideBytes, + ptrdiff_t yStrideBytes) + : ImageDesc() + , m_impl(new PackedImageDesc::Impl) { getImpl()->m_data = data; getImpl()->m_width = width; @@ -474,12 +473,11 @@ PackedImageDesc::PackedImageDesc(void * data, getImpl()->m_numChannels = numChannels; getImpl()->m_bitDepth = bitDepth; - - if (numChannels==4) + if (numChannels == 4) { getImpl()->m_chanOrder = CHANNEL_ORDERING_RGBA; } - else if (numChannels==3) + else if (numChannels == 3) { getImpl()->m_chanOrder = CHANNEL_ORDERING_RGB; } @@ -490,12 +488,13 @@ PackedImageDesc::PackedImageDesc(void * data, const unsigned oneChannelInBytes = GetChannelSizeInBytes(bitDepth); - getImpl()->m_chanStrideBytes = (chanStrideBytes == AutoStride) - ? oneChannelInBytes : chanStrideBytes; + getImpl()->m_chanStrideBytes + = (chanStrideBytes == AutoStride) ? oneChannelInBytes : chanStrideBytes; getImpl()->m_xStrideBytes = (xStrideBytes == AutoStride) - ? getImpl()->m_chanStrideBytes * getImpl()->m_numChannels : xStrideBytes; - getImpl()->m_yStrideBytes = (yStrideBytes == AutoStride) - ? getImpl()->m_xStrideBytes * width : yStrideBytes; + ? getImpl()->m_chanStrideBytes * getImpl()->m_numChannels + : xStrideBytes; + getImpl()->m_yStrideBytes + = (yStrideBytes == AutoStride) ? getImpl()->m_xStrideBytes * width : yStrideBytes; getImpl()->initValues(); @@ -544,7 +543,7 @@ void * PackedImageDesc::getBData() const void * PackedImageDesc::getAData() const { return getImpl()->m_aData; -} +} long PackedImageDesc::getWidth() const { @@ -597,7 +596,7 @@ struct PlanarImageDesc::Impl BitDepth m_bitDepth = BIT_DEPTH_UNKNOWN; - long m_width = 0; + long m_width = 0; long m_height = 0; ptrdiff_t m_xStrideBytes = 0; @@ -605,10 +604,7 @@ struct PlanarImageDesc::Impl bool m_isFloat = false; - bool isFloat() const - { - return m_xStrideBytes==sizeof(float) && m_bitDepth==BIT_DEPTH_F32; - } + bool isFloat() const { return m_xStrideBytes == sizeof(float) && m_bitDepth == BIT_DEPTH_F32; } void validate() const { @@ -622,7 +618,7 @@ struct PlanarImageDesc::Impl throw Exception("PlanarImageDesc Error: Invalid y stride."); } - if (std::abs(m_xStrideBytes*m_width) > std::abs(m_yStrideBytes)) + if (std::abs(m_xStrideBytes * m_width) > std::abs(m_yStrideBytes)) { throw Exception("PlanarImageDesc Error: The x and y strides are inconsistent."); } @@ -634,17 +630,22 @@ struct PlanarImageDesc::Impl } }; -PlanarImageDesc::PlanarImageDesc(void * rData, void * gData, void * bData, void * aData, - long width, long height) - : ImageDesc() - , m_impl(new PlanarImageDesc::Impl()) -{ - if(rData==nullptr || gData==nullptr || bData==nullptr) +PlanarImageDesc::PlanarImageDesc( + void * rData, + void * gData, + void * bData, + void * aData, + long width, + long height) + : ImageDesc() + , m_impl(new PlanarImageDesc::Impl()) +{ + if (rData == nullptr || gData == nullptr || bData == nullptr) { throw Exception("PlanarImageDesc Error: Invalid image buffer."); } - if(width<=0 || height<=0) + if (width <= 0 || height <= 0) { throw Exception("PlanarImageDesc Error: Invalid image dimensions."); } @@ -667,20 +668,25 @@ PlanarImageDesc::PlanarImageDesc(void * rData, void * gData, void * bData, void getImpl()->validate(); } -PlanarImageDesc::PlanarImageDesc(void * rData, void * gData, void * bData, void * aData, - long width, long height, - BitDepth bitDepth, - ptrdiff_t xStrideBytes, - ptrdiff_t yStrideBytes) - : ImageDesc() - , m_impl(new PlanarImageDesc::Impl()) -{ - if(rData==nullptr || gData==nullptr || bData==nullptr) +PlanarImageDesc::PlanarImageDesc( + void * rData, + void * gData, + void * bData, + void * aData, + long width, + long height, + BitDepth bitDepth, + ptrdiff_t xStrideBytes, + ptrdiff_t yStrideBytes) + : ImageDesc() + , m_impl(new PlanarImageDesc::Impl()) +{ + if (rData == nullptr || gData == nullptr || bData == nullptr) { throw Exception("PlanarImageDesc Error: Invalid image buffer."); } - if(width<=0 || height<=0) + if (width <= 0 || height <= 0) { throw Exception("PlanarImageDesc Error: Invalid image dimensions."); } @@ -697,11 +703,10 @@ PlanarImageDesc::PlanarImageDesc(void * rData, void * gData, void * bData, void const unsigned oneChannelInBytes = GetChannelSizeInBytes(bitDepth); - getImpl()->m_xStrideBytes = (xStrideBytes == AutoStride) - ? oneChannelInBytes : xStrideBytes; + getImpl()->m_xStrideBytes = (xStrideBytes == AutoStride) ? oneChannelInBytes : xStrideBytes; - getImpl()->m_yStrideBytes = (yStrideBytes == AutoStride) - ? getImpl()->m_xStrideBytes * width : yStrideBytes; + getImpl()->m_yStrideBytes + = (yStrideBytes == AutoStride) ? getImpl()->m_xStrideBytes * width : yStrideBytes; getImpl()->m_isFloat = getImpl()->isFloat(); diff --git a/src/OpenColorIO/ImagePacking.cpp b/src/OpenColorIO/ImagePacking.cpp index 3c24c9a58f..3fd3f53a45 100644 --- a/src/OpenColorIO/ImagePacking.cpp +++ b/src/OpenColorIO/ImagePacking.cpp @@ -13,19 +13,18 @@ #include "BitDepthUtils.h" #include "ImagePacking.h" - namespace OCIO_NAMESPACE { - -template -void Generic::PackRGBAFromImageDesc(const GenericImageDesc & srcImg, - Type * inBitDepthBuffer, - float * outputBuffer, - int outputBufferSize, - long imagePixelStartIndex) +template +void Generic::PackRGBAFromImageDesc( + const GenericImageDesc & srcImg, + Type * inBitDepthBuffer, + float * outputBuffer, + int outputBufferSize, + long imagePixelStartIndex) { - if(outputBuffer==nullptr) + if (outputBuffer == nullptr) { throw Exception("Invalid output image buffer"); } @@ -34,7 +33,7 @@ void Generic::PackRGBAFromImageDesc(const GenericImageDesc & srcImg, const long imgHeight = srcImg.m_height; const long imgPixels = imgWidth * imgHeight; - if(imagePixelStartIndex<0 || imagePixelStartIndex>=imgPixels) + if (imagePixelStartIndex < 0 || imagePixelStartIndex >= imgPixels) { throw Exception("Invalid output image position."); } @@ -43,7 +42,7 @@ void Generic::PackRGBAFromImageDesc(const GenericImageDesc & srcImg, const ptrdiff_t yStrideBytes = srcImg.m_yStrideBytes; const long yIndex = imagePixelStartIndex / imgWidth; - long xIndex = imagePixelStartIndex % imgWidth; + long xIndex = imagePixelStartIndex % imgWidth; // Figure out our initial ptr positions char * rRow = srcImg.m_rData + yStrideBytes * yIndex; @@ -51,36 +50,36 @@ void Generic::PackRGBAFromImageDesc(const GenericImageDesc & srcImg, char * bRow = srcImg.m_bData + yStrideBytes * yIndex; char * aRow = nullptr; - Type * rPtr = reinterpret_cast(rRow + xStrideBytes * xIndex); - Type * gPtr = reinterpret_cast(gRow + xStrideBytes * xIndex); - Type * bPtr = reinterpret_cast(bRow + xStrideBytes * xIndex); + Type * rPtr = reinterpret_cast(rRow + xStrideBytes * xIndex); + Type * gPtr = reinterpret_cast(gRow + xStrideBytes * xIndex); + Type * bPtr = reinterpret_cast(bRow + xStrideBytes * xIndex); Type * aPtr = nullptr; - if(srcImg.m_aData) + if (srcImg.m_aData) { aRow = srcImg.m_aData + yStrideBytes * yIndex; - aPtr = reinterpret_cast(aRow + xStrideBytes*xIndex); + aPtr = reinterpret_cast(aRow + xStrideBytes * xIndex); } // Process one single, complete scanline. int pixelsCopied = 0; - while(pixelsCopied < outputBufferSize) + while (pixelsCopied < outputBufferSize) { // Reorder channels from arbitrary channel ordering to RGBA 32-bit float. - inBitDepthBuffer[4*pixelsCopied+0] = *rPtr; - inBitDepthBuffer[4*pixelsCopied+1] = *gPtr; - inBitDepthBuffer[4*pixelsCopied+2] = *bPtr; - inBitDepthBuffer[4*pixelsCopied+3] = aPtr ? *aPtr : (Type)0.0f; + inBitDepthBuffer[4 * pixelsCopied + 0] = *rPtr; + inBitDepthBuffer[4 * pixelsCopied + 1] = *gPtr; + inBitDepthBuffer[4 * pixelsCopied + 2] = *bPtr; + inBitDepthBuffer[4 * pixelsCopied + 3] = aPtr ? *aPtr : (Type)0.0f; pixelsCopied++; xIndex++; - rPtr = reinterpret_cast(reinterpret_cast(rPtr) + xStrideBytes); - gPtr = reinterpret_cast(reinterpret_cast(gPtr) + xStrideBytes); - bPtr = reinterpret_cast(reinterpret_cast(bPtr) + xStrideBytes); - if(aPtr) + rPtr = reinterpret_cast(reinterpret_cast(rPtr) + xStrideBytes); + gPtr = reinterpret_cast(reinterpret_cast(gPtr) + xStrideBytes); + bPtr = reinterpret_cast(reinterpret_cast(bPtr) + xStrideBytes); + if (aPtr) { - aPtr = reinterpret_cast(reinterpret_cast(aPtr) + xStrideBytes); + aPtr = reinterpret_cast(reinterpret_cast(aPtr) + xStrideBytes); } } @@ -88,14 +87,15 @@ void Generic::PackRGBAFromImageDesc(const GenericImageDesc & srcImg, srcImg.m_bitDepthOp->apply(&inBitDepthBuffer[0], outputBuffer, pixelsCopied); } -template<> -void Generic::PackRGBAFromImageDesc(const GenericImageDesc & srcImg, - float * /*inBitDepthBuffer*/, - float * outputBuffer, - int outputBufferSize, - long imagePixelStartIndex) +template <> +void Generic::PackRGBAFromImageDesc( + const GenericImageDesc & srcImg, + float * /*inBitDepthBuffer*/, + float * outputBuffer, + int outputBufferSize, + long imagePixelStartIndex) { - if(outputBuffer==nullptr) + if (outputBuffer == nullptr) { throw Exception("Invalid output image buffer."); } @@ -104,7 +104,7 @@ void Generic::PackRGBAFromImageDesc(const GenericImageDesc & srcImg, const long imgHeight = srcImg.m_height; const long imgPixels = imgWidth * imgHeight; - if(imagePixelStartIndex<0 || imagePixelStartIndex>=imgPixels) + if (imagePixelStartIndex < 0 || imagePixelStartIndex >= imgPixels) { throw Exception("Invalid output image position."); } @@ -113,7 +113,7 @@ void Generic::PackRGBAFromImageDesc(const GenericImageDesc & srcImg, const ptrdiff_t yStrideBytes = srcImg.m_yStrideBytes; const long yIndex = imagePixelStartIndex / imgWidth; - long xIndex = imagePixelStartIndex % imgWidth; + long xIndex = imagePixelStartIndex % imgWidth; // Figure out our initial ptr positions char * rRow = srcImg.m_rData + yStrideBytes * yIndex; @@ -121,36 +121,36 @@ void Generic::PackRGBAFromImageDesc(const GenericImageDesc & srcImg, char * bRow = srcImg.m_bData + yStrideBytes * yIndex; char * aRow = nullptr; - float * rPtr = reinterpret_cast(rRow + xStrideBytes * xIndex); - float * gPtr = reinterpret_cast(gRow + xStrideBytes * xIndex); - float * bPtr = reinterpret_cast(bRow + xStrideBytes * xIndex); + float * rPtr = reinterpret_cast(rRow + xStrideBytes * xIndex); + float * gPtr = reinterpret_cast(gRow + xStrideBytes * xIndex); + float * bPtr = reinterpret_cast(bRow + xStrideBytes * xIndex); float * aPtr = nullptr; - if(srcImg.m_aData) + if (srcImg.m_aData) { aRow = srcImg.m_aData + yStrideBytes * yIndex; - aPtr = reinterpret_cast(aRow + xStrideBytes*xIndex); + aPtr = reinterpret_cast(aRow + xStrideBytes * xIndex); } // Process one single, complete scanline. int pixelsCopied = 0; - while(pixelsCopied < outputBufferSize) + while (pixelsCopied < outputBufferSize) { // Reorder channels from arbitrary channel ordering to RGBA 32-bit float. - outputBuffer[4*pixelsCopied+0] = *rPtr; - outputBuffer[4*pixelsCopied+1] = *gPtr; - outputBuffer[4*pixelsCopied+2] = *bPtr; - outputBuffer[4*pixelsCopied+3] = aPtr ? *aPtr : 0.0f; + outputBuffer[4 * pixelsCopied + 0] = *rPtr; + outputBuffer[4 * pixelsCopied + 1] = *gPtr; + outputBuffer[4 * pixelsCopied + 2] = *bPtr; + outputBuffer[4 * pixelsCopied + 3] = aPtr ? *aPtr : 0.0f; pixelsCopied++; xIndex++; - rPtr = reinterpret_cast(reinterpret_cast(rPtr) + xStrideBytes); - gPtr = reinterpret_cast(reinterpret_cast(gPtr) + xStrideBytes); - bPtr = reinterpret_cast(reinterpret_cast(bPtr) + xStrideBytes); - if(aPtr) + rPtr = reinterpret_cast(reinterpret_cast(rPtr) + xStrideBytes); + gPtr = reinterpret_cast(reinterpret_cast(gPtr) + xStrideBytes); + bPtr = reinterpret_cast(reinterpret_cast(bPtr) + xStrideBytes); + if (aPtr) { - aPtr = reinterpret_cast(reinterpret_cast(aPtr) + xStrideBytes); + aPtr = reinterpret_cast(reinterpret_cast(aPtr) + xStrideBytes); } } @@ -158,14 +158,15 @@ void Generic::PackRGBAFromImageDesc(const GenericImageDesc & srcImg, srcImg.m_bitDepthOp->apply(&outputBuffer[0], &outputBuffer[0], pixelsCopied); } -template -void Generic::UnpackRGBAToImageDesc(GenericImageDesc & dstImg, - float * inputBuffer, - Type * outBitDepthBuffer, - int numPixelsToUnpack, - long imagePixelStartIndex) +template +void Generic::UnpackRGBAToImageDesc( + GenericImageDesc & dstImg, + float * inputBuffer, + Type * outBitDepthBuffer, + int numPixelsToUnpack, + long imagePixelStartIndex) { - if(inputBuffer==nullptr) + if (inputBuffer == nullptr) { throw Exception("Invalid input image buffer"); } @@ -174,7 +175,7 @@ void Generic::UnpackRGBAToImageDesc(GenericImageDesc & dstImg, const long imgHeight = dstImg.m_height; const long imgPixels = imgWidth * imgHeight; - if(imagePixelStartIndex<0 || imagePixelStartIndex>=imgPixels) + if (imagePixelStartIndex < 0 || imagePixelStartIndex >= imgPixels) { return; } @@ -183,7 +184,7 @@ void Generic::UnpackRGBAToImageDesc(GenericImageDesc & dstImg, const ptrdiff_t yStrideBytes = dstImg.m_yStrideBytes; const long yIndex = imagePixelStartIndex / imgWidth; - long xIndex = imagePixelStartIndex % imgWidth; + long xIndex = imagePixelStartIndex % imgWidth; // Figure out our initial ptr positions char * rRow = dstImg.m_rData + yStrideBytes * yIndex; @@ -191,15 +192,15 @@ void Generic::UnpackRGBAToImageDesc(GenericImageDesc & dstImg, char * bRow = dstImg.m_bData + yStrideBytes * yIndex; char * aRow = nullptr; - Type * rPtr = reinterpret_cast(rRow + xStrideBytes * xIndex); - Type * gPtr = reinterpret_cast(gRow + xStrideBytes * xIndex); - Type * bPtr = reinterpret_cast(bRow + xStrideBytes * xIndex); + Type * rPtr = reinterpret_cast(rRow + xStrideBytes * xIndex); + Type * gPtr = reinterpret_cast(gRow + xStrideBytes * xIndex); + Type * bPtr = reinterpret_cast(bRow + xStrideBytes * xIndex); Type * aPtr = nullptr; - if(dstImg.m_aData) + if (dstImg.m_aData) { aRow = dstImg.m_aData + yStrideBytes * yIndex; - aPtr = reinterpret_cast(aRow + xStrideBytes * xIndex); + aPtr = reinterpret_cast(aRow + xStrideBytes * xIndex); } // Convert from F32 to the output bit-depth (i.e always RGBA). @@ -207,35 +208,37 @@ void Generic::UnpackRGBAToImageDesc(GenericImageDesc & dstImg, // Process one single, complete scanline. int pixelsCopied = 0; - while(pixelsCopied < numPixelsToUnpack) + while (pixelsCopied < numPixelsToUnpack) { // Copy from RGBA buffer to arbitrary channel ordering. - *rPtr = outBitDepthBuffer[4*pixelsCopied]; - *gPtr = outBitDepthBuffer[4*pixelsCopied+1]; - *bPtr = outBitDepthBuffer[4*pixelsCopied+2]; - if(aPtr) *aPtr = outBitDepthBuffer[4*pixelsCopied+3]; + *rPtr = outBitDepthBuffer[4 * pixelsCopied]; + *gPtr = outBitDepthBuffer[4 * pixelsCopied + 1]; + *bPtr = outBitDepthBuffer[4 * pixelsCopied + 2]; + if (aPtr) + *aPtr = outBitDepthBuffer[4 * pixelsCopied + 3]; pixelsCopied++; xIndex++; - rPtr = reinterpret_cast(reinterpret_cast(rPtr) + xStrideBytes); - gPtr = reinterpret_cast(reinterpret_cast(gPtr) + xStrideBytes); - bPtr = reinterpret_cast(reinterpret_cast(bPtr) + xStrideBytes); - if(aPtr) + rPtr = reinterpret_cast(reinterpret_cast(rPtr) + xStrideBytes); + gPtr = reinterpret_cast(reinterpret_cast(gPtr) + xStrideBytes); + bPtr = reinterpret_cast(reinterpret_cast(bPtr) + xStrideBytes); + if (aPtr) { - aPtr = reinterpret_cast(reinterpret_cast(aPtr) + xStrideBytes); + aPtr = reinterpret_cast(reinterpret_cast(aPtr) + xStrideBytes); } } } -template<> -void Generic::UnpackRGBAToImageDesc(GenericImageDesc & dstImg, - float * inputBuffer, - float * /*outBitDepthBuffer*/, - int numPixelsToUnpack, - long imagePixelStartIndex) +template <> +void Generic::UnpackRGBAToImageDesc( + GenericImageDesc & dstImg, + float * inputBuffer, + float * /*outBitDepthBuffer*/, + int numPixelsToUnpack, + long imagePixelStartIndex) { - if(inputBuffer==nullptr) + if (inputBuffer == nullptr) { throw Exception("Invalid input image buffer"); } @@ -244,7 +247,7 @@ void Generic::UnpackRGBAToImageDesc(GenericImageDesc & dstImg, const long imgHeight = dstImg.m_height; const long imgPixels = imgWidth * imgHeight; - if(imagePixelStartIndex<0 || imagePixelStartIndex>=imgPixels) + if (imagePixelStartIndex < 0 || imagePixelStartIndex >= imgPixels) { return; } @@ -253,7 +256,7 @@ void Generic::UnpackRGBAToImageDesc(GenericImageDesc & dstImg, const ptrdiff_t yStrideBytes = dstImg.m_yStrideBytes; const long yIndex = imagePixelStartIndex / imgWidth; - long xIndex = imagePixelStartIndex % imgWidth; + long xIndex = imagePixelStartIndex % imgWidth; // Figure out our initial ptr positions char * rRow = dstImg.m_rData + yStrideBytes * yIndex; @@ -261,15 +264,15 @@ void Generic::UnpackRGBAToImageDesc(GenericImageDesc & dstImg, char * bRow = dstImg.m_bData + yStrideBytes * yIndex; char * aRow = nullptr; - float * rPtr = reinterpret_cast(rRow + xStrideBytes * xIndex); - float * gPtr = reinterpret_cast(gRow + xStrideBytes * xIndex); - float * bPtr = reinterpret_cast(bRow + xStrideBytes * xIndex); + float * rPtr = reinterpret_cast(rRow + xStrideBytes * xIndex); + float * gPtr = reinterpret_cast(gRow + xStrideBytes * xIndex); + float * bPtr = reinterpret_cast(bRow + xStrideBytes * xIndex); float * aPtr = nullptr; - if(dstImg.m_aData) + if (dstImg.m_aData) { aRow = dstImg.m_aData + yStrideBytes * yIndex; - aPtr = reinterpret_cast(aRow + xStrideBytes * xIndex); + aPtr = reinterpret_cast(aRow + xStrideBytes * xIndex); } // In the float specialization, the BitDepthOp is the last Op of the color processing. @@ -277,35 +280,32 @@ void Generic::UnpackRGBAToImageDesc(GenericImageDesc & dstImg, // Process one single, complete scanline. int pixelsCopied = 0; - while(pixelsCopied < numPixelsToUnpack) + while (pixelsCopied < numPixelsToUnpack) { // Copy from RGBA buffer to arbitrary channel ordering. - *rPtr = inputBuffer[4*pixelsCopied]; - *gPtr = inputBuffer[4*pixelsCopied+1]; - *bPtr = inputBuffer[4*pixelsCopied+2]; - if(aPtr) *aPtr = inputBuffer[4*pixelsCopied+3]; + *rPtr = inputBuffer[4 * pixelsCopied]; + *gPtr = inputBuffer[4 * pixelsCopied + 1]; + *bPtr = inputBuffer[4 * pixelsCopied + 2]; + if (aPtr) + *aPtr = inputBuffer[4 * pixelsCopied + 3]; pixelsCopied++; xIndex++; - rPtr = reinterpret_cast(reinterpret_cast(rPtr) + xStrideBytes); - gPtr = reinterpret_cast(reinterpret_cast(gPtr) + xStrideBytes); - bPtr = reinterpret_cast(reinterpret_cast(bPtr) + xStrideBytes); - if(aPtr) + rPtr = reinterpret_cast(reinterpret_cast(rPtr) + xStrideBytes); + gPtr = reinterpret_cast(reinterpret_cast(gPtr) + xStrideBytes); + bPtr = reinterpret_cast(reinterpret_cast(bPtr) + xStrideBytes); + if (aPtr) { - aPtr = reinterpret_cast(reinterpret_cast(aPtr) + xStrideBytes); + aPtr = reinterpret_cast(reinterpret_cast(aPtr) + xStrideBytes); } } } - - //////////////////////////////////////////////////////////////////////////// - template struct Generic; template struct Generic; template struct Generic; - } // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/ImagePacking.h b/src/OpenColorIO/ImagePacking.h index 578bb997ef..8eec0b1297 100644 --- a/src/OpenColorIO/ImagePacking.h +++ b/src/OpenColorIO/ImagePacking.h @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_IMAGEPACKING_H #define INCLUDED_OCIO_IMAGEPACKING_H @@ -9,7 +8,6 @@ #include "Op.h" - namespace OCIO_NAMESPACE { @@ -32,8 +30,7 @@ struct GenericImageDesc // Is the image buffer a RGBA packed buffer? bool m_isRGBAPacked = false; // Is the image buffer a 32-bit float image buffer? - bool m_isFloat = false; - + bool m_isFloat = false; // Resolves all AutoStride. void init(const ImageDesc & img, BitDepth bitDepth, const ConstOpCPURcPtr & bitDepthOp); @@ -46,20 +43,21 @@ struct GenericImageDesc bool isFloat() const; }; -template -struct Generic +template struct Generic { - static void PackRGBAFromImageDesc(const GenericImageDesc & srcImg, - Type * inBitDepthBuffer, - float * outputBuffer, - int outputBufferSize, - long imagePixelStartIndex); - - static void UnpackRGBAToImageDesc(GenericImageDesc & dstImg, - float * inputBuffer, - Type * outBitDepthBuffer, - int numPixelsToUnpack, - long imagePixelStartIndex); + static void PackRGBAFromImageDesc( + const GenericImageDesc & srcImg, + Type * inBitDepthBuffer, + float * outputBuffer, + int outputBufferSize, + long imagePixelStartIndex); + + static void UnpackRGBAToImageDesc( + GenericImageDesc & dstImg, + float * inputBuffer, + Type * outBitDepthBuffer, + int numPixelsToUnpack, + long imagePixelStartIndex); }; } // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/Logging.cpp b/src/OpenColorIO/Logging.cpp index e40692db7c..4d8e563f00 100644 --- a/src/OpenColorIO/Logging.cpp +++ b/src/OpenColorIO/Logging.cpp @@ -13,7 +13,6 @@ #include "PrivateTypes.h" #include "utils/StringUtils.h" - namespace OCIO_NAMESPACE { namespace @@ -24,25 +23,26 @@ Mutex g_logmutex; LoggingLevel g_logginglevel = LOGGING_LEVEL_UNKNOWN; -bool g_initialized = false; +bool g_initialized = false; bool g_loggingOverride = false; // You must manually acquire the logging mutex before calling this. // This will set g_logginglevel, g_initialized, g_loggingOverride void InitLogging() { - if(g_initialized) return; + if (g_initialized) + return; g_initialized = true; std::string levelstr; Platform::Getenv(OCIO_LOGGING_LEVEL_ENVVAR, levelstr); - if(!levelstr.empty()) + if (!levelstr.empty()) { g_loggingOverride = true; - g_logginglevel = LoggingLevelFromString(levelstr.c_str()); + g_logginglevel = LoggingLevelFromString(levelstr.c_str()); - if(g_logginglevel == LOGGING_LEVEL_UNKNOWN) + if (g_logginglevel == LOGGING_LEVEL_UNKNOWN) { std::cerr << "[OpenColorIO Warning]: Invalid $OCIO_LOGGING_LEVEL specified. "; std::cerr << "Options: none (0), warning (1), info (2), debug (3)" << std::endl; @@ -56,8 +56,7 @@ void InitLogging() if (g_logginglevel == LOGGING_LEVEL_DEBUG) { - std::cerr << "[OpenColorIO Debug]: Using OpenColorIO version: " - << GetVersion() << "\n"; + std::cerr << "[OpenColorIO Debug]: Using OpenColorIO version: " << GetVersion() << "\n"; } } @@ -70,12 +69,11 @@ void DefaultLoggingFunction(const char * message) // Hold the default logging function. LoggingFunction g_loggingFunction = DefaultLoggingFunction; -// If the message contains multiple lines, then preprocess it +// If the message contains multiple lines, then preprocess it // to output the content line by line. void LogMessage(const char * messagePrefix, const std::string & message) { - const StringUtils::StringVec parts - = StringUtils::SplitByLines(StringUtils::RightTrim(message)); + const StringUtils::StringVec parts = StringUtils::SplitByLines(StringUtils::RightTrim(message)); for (const auto & part : parts) { @@ -87,7 +85,7 @@ void LogMessage(const char * messagePrefix, const std::string & message) } } -} +} // namespace LoggingLevel GetLoggingLevel() { @@ -106,7 +104,7 @@ void SetLoggingLevel(LoggingLevel level) // is specified. This is to allow users to optionally debug OCIO at // runtime even in applications that disable logging. - if(!g_loggingOverride) + if (!g_loggingOverride) { g_logginglevel = level; } @@ -124,7 +122,7 @@ void ResetToDefaultLoggingFunction() void LogMessage(LoggingLevel level, const char * message) { - switch(level) + switch (level) { case LOGGING_LEVEL_WARNING: { @@ -158,11 +156,12 @@ void LogError(const std::string & text) AutoMutex lock(g_logmutex); InitLogging(); - // Did not add a LOGGING_LEVEL_ERROR since the enum values are part of the user-facing - // documentation and it is therefore difficult to insert an ERROR value since it would - // naturally need to fall between 0 and 1. But there is no need since presumably users + // Did not add a LOGGING_LEVEL_ERROR since the enum values are part of the user-facing + // documentation and it is therefore difficult to insert an ERROR value since it would + // naturally need to fall between 0 and 1. But there is no need since presumably users // that want to see warnings would also want to see errors. - if(g_logginglevel=LOGGING_LEVEL_DEBUG); + return (GetLoggingLevel() >= LOGGING_LEVEL_DEBUG); } } // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/Logging.h b/src/OpenColorIO/Logging.h index e046900089..e680ddc80b 100644 --- a/src/OpenColorIO/Logging.h +++ b/src/OpenColorIO/Logging.h @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_LOGGING_H #define INCLUDED_OCIO_LOGGING_H diff --git a/src/OpenColorIO/Look.cpp b/src/OpenColorIO/Look.cpp index c0e7cbef13..4ee6733c70 100644 --- a/src/OpenColorIO/Look.cpp +++ b/src/OpenColorIO/Look.cpp @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #include #include #include @@ -10,7 +9,6 @@ #include "ContextVariableUtils.h" - namespace OCIO_NAMESPACE { LookRcPtr Look::Create() @@ -18,7 +16,7 @@ LookRcPtr Look::Create() return LookRcPtr(new Look(), &deleter); } -void Look::deleter(Look* c) +void Look::deleter(Look * c) { delete c; } @@ -32,28 +30,25 @@ class Look::Impl TransformRcPtr m_transform; TransformRcPtr m_inverseTransform; - Impl() - { } + Impl() {} Impl(const Impl &) = delete; - ~Impl() - { } + ~Impl() {} - Impl& operator= (const Impl & rhs) + Impl & operator=(const Impl & rhs) { if (this != &rhs) { - m_name = rhs.m_name; + m_name = rhs.m_name; m_processSpace = rhs.m_processSpace; - m_description = rhs.m_description; + m_description = rhs.m_description; - m_transform = rhs.m_transform? - rhs.m_transform->createEditableCopy() : rhs.m_transform; + m_transform = rhs.m_transform ? rhs.m_transform->createEditableCopy() : rhs.m_transform; - m_inverseTransform = rhs.m_inverseTransform? - rhs.m_inverseTransform->createEditableCopy() - : rhs.m_inverseTransform; + m_inverseTransform = rhs.m_inverseTransform + ? rhs.m_inverseTransform->createEditableCopy() + : rhs.m_inverseTransform; } return *this; } @@ -62,7 +57,7 @@ class Look::Impl /////////////////////////////////////////////////////////////////////////// Look::Look() -: m_impl(new Look::Impl) + : m_impl(new Look::Impl) { } @@ -75,7 +70,7 @@ Look::~Look() LookRcPtr Look::createEditableCopy() const { LookRcPtr cs = Look::Create(); - *cs->m_impl = *m_impl; + *cs->m_impl = *m_impl; return cs; } @@ -129,56 +124,57 @@ void Look::setDescription(const char * description) getImpl()->m_description = description; } -bool CollectContextVariables(const Config & config, - const Context & context, - TransformDirection direction, - const Look & look, - ContextRcPtr & usedContext) +bool CollectContextVariables( + const Config & config, + const Context & context, + TransformDirection direction, + const Look & look, + ContextRcPtr & usedContext) { bool foundContextVars = false; switch (direction) { - case TRANSFORM_DIR_FORWARD: - { - ConstTransformRcPtr tr = look.getTransform(); - if (tr) + case TRANSFORM_DIR_FORWARD: { - if (CollectContextVariables(config, context, tr, usedContext)) + ConstTransformRcPtr tr = look.getTransform(); + if (tr) { - foundContextVars = true; + if (CollectContextVariables(config, context, tr, usedContext)) + { + foundContextVars = true; + } } - } - else - { - tr = look.getInverseTransform(); - if (tr && CollectContextVariables(config, context, tr, usedContext)) + else { - foundContextVars = true; + tr = look.getInverseTransform(); + if (tr && CollectContextVariables(config, context, tr, usedContext)) + { + foundContextVars = true; + } } + break; } - break; - } - case TRANSFORM_DIR_INVERSE: - { - ConstTransformRcPtr tr = look.getInverseTransform(); - if (tr) + case TRANSFORM_DIR_INVERSE: { - if (CollectContextVariables(config, context, tr, usedContext)) + ConstTransformRcPtr tr = look.getInverseTransform(); + if (tr) { - foundContextVars = true; + if (CollectContextVariables(config, context, tr, usedContext)) + { + foundContextVars = true; + } } - } - else - { - tr = look.getTransform(); - if (tr && CollectContextVariables(config, context, tr, usedContext)) + else { - foundContextVars = true; + tr = look.getTransform(); + if (tr && CollectContextVariables(config, context, tr, usedContext)) + { + foundContextVars = true; + } } + break; } - break; - } } const char * ps = look.getProcessSpace(); @@ -204,25 +200,25 @@ bool CollectContextVariables(const Config & config, return foundContextVars; } -std::ostream& operator<< (std::ostream& os, const Look& look) +std::ostream & operator<<(std::ostream & os, const Look & look) { os << " #include #include @@ -14,11 +13,11 @@ namespace OCIO_NAMESPACE { -template -bool IsScalarEqualToZero(T v) +template bool IsScalarEqualToZero(T v) { - static_assert(std::is_floating_point::value, - "Only single and double precision floats are supported"); + static_assert( + std::is_floating_point::value, + "Only single and double precision floats are supported"); return !FloatsDiffer(0.0f, (float)v, 2, false); } @@ -26,11 +25,11 @@ bool IsScalarEqualToZero(T v) template bool IsScalarEqualToZero(float v); template bool IsScalarEqualToZero(double v); -template -bool IsScalarEqualToOne(T v) +template bool IsScalarEqualToOne(T v) { - static_assert(std::is_floating_point::value, - "Only single and double precision floats are supported"); + static_assert( + std::is_floating_point::value, + "Only single and double precision floats are supported"); return !FloatsDiffer(1.0f, (float)v, 2, false); } @@ -38,15 +37,16 @@ bool IsScalarEqualToOne(T v) template bool IsScalarEqualToOne(float v); template bool IsScalarEqualToOne(double v); -template -bool IsVecEqualToZero(const T * v, unsigned int size) +template bool IsVecEqualToZero(const T * v, unsigned int size) { - static_assert(std::is_floating_point::value, - "Only single and double precision floats are supported"); + static_assert( + std::is_floating_point::value, + "Only single and double precision floats are supported"); - for(unsigned int i=0; i -bool IsVecEqualToOne(const T * v, unsigned int size) +template bool IsVecEqualToOne(const T * v, unsigned int size) { - static_assert(std::is_floating_point::value, - "Only single and double precision floats are supported"); + static_assert( + std::is_floating_point::value, + "Only single and double precision floats are supported"); - for(unsigned int i=0; i -bool VecsEqualWithRelError(const T * v1, unsigned int size1, - const T * v2, unsigned int size2, - T e) +template +bool VecsEqualWithRelError(const T * v1, unsigned int size1, const T * v2, unsigned int size2, T e) { - static_assert(std::is_floating_point::value, - "Only single and double precision floats are supported"); + static_assert( + std::is_floating_point::value, + "Only single and double precision floats are supported"); - if (size1 != size2) return false; + if (size1 != size2) + return false; - for (unsigned int i = 0; i -GetHalfNormMin() && val -GetHalfNormMin() && val < GetHalfNormMin()) { return 0.0; } - if(val > GetHalfMax()) + if (val > GetHalfMax()) { return GetHalfMax(); } @@ -159,27 +174,29 @@ float SanitizeFloat(float f) return f; } -template -bool IsM44Identity(const T * m44) +template bool IsM44Identity(const T * m44) { - static_assert(std::is_floating_point::value, - "Only single and double precision floats are supported"); + static_assert( + std::is_floating_point::value, + "Only single and double precision floats are supported"); - unsigned int index=0; + unsigned int index = 0; - for(unsigned int j=0; j<4; ++j) + for (unsigned int j = 0; j < 4; ++j) { - for(unsigned int i=0; i<4; ++i) + for (unsigned int i = 0; i < 4; ++i) { - index = 4*j+i; + index = 4 * j + i; - if(i==j) + if (i == j) { - if(!IsScalarEqualToOne(m44[index])) return false; + if (!IsScalarEqualToOne(m44[index])) + return false; } else { - if(!IsScalarEqualToZero(m44[index])) return false; + if (!IsScalarEqualToZero(m44[index])) + return false; } } } @@ -195,6 +212,7 @@ template bool IsM44Identity(const double * m44); // (We have seen IsScalarEqualToZero sensitivities here on 32-bit // virtual machines) +// clang-format off bool GetM44Inverse(float* inverse_out, const float* m_) { double m[16]; @@ -298,50 +316,55 @@ void GetM44V4Product(float* vout, const float* m, const float* v_) vout[2] = m[ 8]*v[0] + m[ 9]*v[1] + m[10]*v[2] + m[11]*v[3]; vout[3] = m[12]*v[0] + m[13]*v[1] + m[14]*v[2] + m[15]*v[3]; } +// clang-format on -void GetV4Sum(float* vout, const float* v1, const float* v2) +void GetV4Sum(float * vout, const float * v1, const float * v2) { - for(int i=0; i<4; ++i) + for (int i = 0; i < 4; ++i) { vout[i] = v1[i] + v2[i]; } } -} // anon namespace +} // namespace // All m(s) are 4x4. All v(s) are size 4 vectors. // Return mout, vout, where mout*x+vout == m2*(m1*x+v1)+v2 // mout = m2*m1 // vout = m2*v1 + v2 -void GetMxbCombine(float* mout, float* vout, - const float* m1_, const float* v1_, - const float* m2_, const float* v2_) +void GetMxbCombine( + float * mout, + float * vout, + const float * m1_, + const float * v1_, + const float * m2_, + const float * v2_) { float m1[16]; float v1[4]; float m2[16]; float v2[4]; - memcpy(m1, m1_, 16*sizeof(float)); - memcpy(v1, v1_, 4*sizeof(float)); - memcpy(m2, m2_, 16*sizeof(float)); - memcpy(v2, v2_, 4*sizeof(float)); + memcpy(m1, m1_, 16 * sizeof(float)); + memcpy(v1, v1_, 4 * sizeof(float)); + memcpy(m2, m2_, 16 * sizeof(float)); + memcpy(v2, v2_, 4 * sizeof(float)); GetM44M44Product(mout, m2, m1); GetM44V4Product(vout, m2, v1); GetV4Sum(vout, vout, v2); } -bool GetMxbInverse(float* mout, float* vout, - const float* m_, const float* v_) +bool GetMxbInverse(float * mout, float * vout, const float * m_, const float * v_) { float m[16]; float v[4]; - memcpy(m, m_, 16*sizeof(float)); - memcpy(v, v_, 4*sizeof(float)); + memcpy(m, m_, 16 * sizeof(float)); + memcpy(v, v_, 4 * sizeof(float)); - if(!GetM44Inverse(mout, m)) return false; + if (!GetM44Inverse(mout, m)) + return false; - for(int i=0; i<4; ++i) + for (int i = 0; i < 4; ++i) { v[i] = -v[i]; } @@ -350,6 +373,8 @@ bool GetMxbInverse(float* mout, float* vout, return true; } +// clang-format off + //------------------------------------------------------------------------------ // // Map a floating-point number (already represented as an integer) to an ordered @@ -394,11 +419,15 @@ bool GetMxbInverse(float* mout, float* vout, // | -NaN | Negative floats | Negative denorms | Positive denorms | Positive floats | NaN | // +------------+-----------------+------------------+------------------+-----------------+-----------+ // +// clang-format on inline int FloatForCompare(const unsigned floatBits) { - return floatBits < 0x80000000 ? (0x80000000 + floatBits) : (0x80000000 - (floatBits & 0x7FFFFFFF)); + return floatBits < 0x80000000 ? (0x80000000 + floatBits) + : (0x80000000 - (floatBits & 0x7FFFFFFF)); } +// clang-format off + //------------------------------------------------------------------------------ // // Map a floating-point number (already represented as an integer) to an ordered diff --git a/src/OpenColorIO/MathUtils.h b/src/OpenColorIO/MathUtils.h index 9ed0bcb6be..cd77bc2545 100644 --- a/src/OpenColorIO/MathUtils.h +++ b/src/OpenColorIO/MathUtils.h @@ -14,9 +14,10 @@ namespace OCIO_NAMESPACE { -template -bool IsNan(T val) { return std::isnan(val); } - +template bool IsNan(T val) +{ + return std::isnan(val); +} // From Imath //-------------------------------------------------------------------------- @@ -26,28 +27,26 @@ bool IsNan(T val) { return std::isnan(val); } // // Returns true if x1 is the same as x2 with an absolute error of // no more than e, -// +// // abs (x1 - x2) <= e // // EqualWithRelError (x1, x2, e) // // Returns true if x1 is the same as x2 with an relative error of // no more than e, -// +// // abs (x1 - x2) <= e * x1 // //-------------------------------------------------------------------------- -template -inline bool EqualWithAbsError (T x1, T x2, T e) +template inline bool EqualWithAbsError(T x1, T x2, T e) { - return ((x1 > x2)? x1 - x2: x2 - x1) <= e; + return ((x1 > x2) ? x1 - x2 : x2 - x1) <= e; } -template -inline bool EqualWithRelError (T x1, T x2, T e) +template inline bool EqualWithRelError(T x1, T x2, T e) { - return ((x1 > x2)? x1 - x2: x2 - x1) <= e * ((x1 > 0)? x1: -x1); + return ((x1 > x2) ? x1 - x2 : x2 - x1) <= e * ((x1 > 0) ? x1 : -x1); } inline float lerpf(float a, float b, float z) @@ -57,11 +56,10 @@ inline float lerpf(float a, float b, float z) // Clamp value a to[min, max] // First compare with max, then with min. -// +// // Note: Does not validate max >= min. // Note: NaN values become 0. -template -inline T Clamp(T a, T min, T max) +template inline T Clamp(T a, T min, T max) { return std::min(std::max(min, a), max); } @@ -76,40 +74,34 @@ inline T Clamp(T a, T min, T max) float SanitizeFloat(float f); // Checks within fltmin tolerance -template -bool IsScalarEqualToZero(T v); -template -bool IsScalarEqualToOne(T v); +template bool IsScalarEqualToZero(T v); +template bool IsScalarEqualToOne(T v); // Are all the vector components the specified value? -template -bool IsVecEqualToZero(const T * v, unsigned int size); -template -bool IsVecEqualToOne(const T * v, unsigned int size); +template bool IsVecEqualToZero(const T * v, unsigned int size); +template bool IsVecEqualToOne(const T * v, unsigned int size); // Is at least one of the specified components equal to 0? -bool VecContainsZero(const float* v, int size); -bool VecContainsOne(const float* v, int size); +bool VecContainsZero(const float * v, int size); +bool VecContainsOne(const float * v, int size); // Are two vectors equal? (Same size, same values?) -template -bool VecsEqualWithRelError(const T * v1, unsigned int size1, - const T * v2, unsigned int size2, - T e); +template +bool VecsEqualWithRelError(const T * v1, unsigned int size1, const T * v2, unsigned int size2, T e); inline double GetHalfMax() { - return 65504.0; // Largest positive half + return 65504.0; // Largest positive half } inline double GetHalfMin() { - return 5.96046448e-08; // Smallest positive half + return 5.96046448e-08; // Smallest positive half } inline double GetHalfNormMin() { - return 6.10351562e-05; // Smallest positive normalized half + return 6.10351562e-05; // Smallest positive normalized half } // Clamp the specified value to the valid range of normalized half. @@ -121,7 +113,6 @@ float ConvertHalfBitsToFloat(unsigned short val); float GetSafeScalarInverse(float v, float defaultValue = 1.0); - // All matrix / vector operations use the following sizing... // // m : 4x4 matrix @@ -129,22 +120,24 @@ float GetSafeScalarInverse(float v, float defaultValue = 1.0); // Return the 4x4 inverse, and whether the inverse has succeeded. // Supports in-place operations. -bool GetM44Inverse(float* mout, const float* m); +bool GetM44Inverse(float * mout, const float * m); // Is an identity matrix? (with fltmin tolerance) -template -bool IsM44Identity(const T * m); +template bool IsM44Identity(const T * m); // Combine two transforms in the mx+b form, into a single transform. // mout*x+vout == m2*(m1*x+v1)+v2 // Supports in-place operations. -void GetMxbCombine(float* mout, float* vout, - const float* m1, const float* v1, - const float* m2, const float* v2); +void GetMxbCombine( + float * mout, + float * vout, + const float * m1, + const float * v1, + const float * m2, + const float * v2); // Supports in-place operations -bool GetMxbInverse(float* mout, float* vout, - const float* m, const float* v); +bool GetMxbInverse(float * mout, float * vout, const float * m, const float * v); // Reinterpret the binary representation of a single-precision floating-point number // as a 32-bit integer. @@ -154,7 +147,8 @@ bool GetMxbInverse(float* mout, float* vout, // Return reinterpreted float bit representation as an integer. inline unsigned FloatAsInt(const float x) { - union { + union + { float f; unsigned i; } v; @@ -171,7 +165,8 @@ inline unsigned FloatAsInt(const float x) // Return reinterpreted integer bit representation as a float. inline float IntAsFloat(const unsigned x) { - union { + union + { float f; unsigned i; } v; @@ -189,7 +184,7 @@ inline float IntAsFloat(const unsigned x) // Return the original floating-point number added by the number of ULPs. inline float AddULP(const float f, const int ulp) { - return IntAsFloat( FloatAsInt(f) + ulp ); + return IntAsFloat(FloatAsInt(f) + ulp); } // Verify if two floating-point numbers are within a tolerance given in ULPs. @@ -198,7 +193,7 @@ inline float AddULP(const float f, const int ulp) // as being equivalent to zero for comparison purposes. This is a form of relative // comparison where 1 ULP is equivalent to 2^(exponent - 23) for normalized values // and to 2^(-149) for denormalized numbers. -// One ULP on the domain [1.0, 2.0] is 2^(0-23)=1.19e-7. A correctly rounded float value +// One ULP on the domain [1.0, 2.0] is 2^(0-23)=1.19e-7. A correctly rounded float value // is always within 0.5 ULPs of the exact value. // // expected : reference floating-point value @@ -210,8 +205,11 @@ inline float AddULP(const float f, const int ulp) // Return true if the floating-point number are different, that is, their difference is not // within the acceptable tolerance, under the conditions imposed by the // compressDenorms flag. -bool FloatsDiffer(const float expected, const float actual, - const int tolerance, const bool compressDenorms); +bool FloatsDiffer( + const float expected, + const float actual, + const int tolerance, + const bool compressDenorms); // Compares half-floats as raw integers with a tolerance (essentially in ULPs). // Returns true if the integer difference is strictly greater than the tolerance. diff --git a/src/OpenColorIO/Mutex.h b/src/OpenColorIO/Mutex.h index e296abdb46..58d1038992 100644 --- a/src/OpenColorIO/Mutex.h +++ b/src/OpenColorIO/Mutex.h @@ -1,15 +1,12 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_MUTEX_H #define INCLUDED_OCIO_MUTEX_H - -#include -#include #include - +#include +#include /** For internal use only */ @@ -22,9 +19,9 @@ namespace OCIO_NAMESPACE class DebugLock { public: - DebugLock() = default; - DebugLock(const DebugLock &) = delete; - DebugLock& operator=(const DebugLock &) = delete; + DebugLock() = default; + DebugLock(const DebugLock &) = delete; + DebugLock & operator=(const DebugLock &) = delete; ~DebugLock() { assert(m_owner == std::thread::id()); } void lock() @@ -41,13 +38,13 @@ class DebugLock } bool try_lock() { - assert(m_owner != std::this_thread::get_id()); - return m_mutex.try_lock(); + assert(m_owner != std::this_thread::get_id()); + return m_mutex.try_lock(); } private: // An exclusive and non-recursive ownership lock. - std::mutex m_mutex; + std::mutex m_mutex; std::thread::id m_owner; }; diff --git a/src/OpenColorIO/NamedTransform.cpp b/src/OpenColorIO/NamedTransform.cpp index bf8274807e..723e7e3d93 100644 --- a/src/OpenColorIO/NamedTransform.cpp +++ b/src/OpenColorIO/NamedTransform.cpp @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #include #include "NamedTransform.h" @@ -20,13 +19,13 @@ void NamedTransformImpl::Deleter(NamedTransform * t) NamedTransformRcPtr NamedTransformImpl::createEditableCopy() const { - auto copy = std::make_shared(); - copy->m_name = m_name; - copy->m_aliases = m_aliases; + auto copy = std::make_shared(); + copy->m_name = m_name; + copy->m_aliases = m_aliases; copy->m_description = m_description; - copy->m_family = m_family; - copy->m_categories = m_categories; - copy->m_encoding = m_encoding; + copy->m_family = m_family; + copy->m_categories = m_categories; + copy->m_encoding = m_encoding; if (m_forwardTransform) { copy->m_forwardTransform = m_forwardTransform->createEditableCopy(); @@ -82,7 +81,7 @@ void NamedTransformImpl::removeAlias(const char * name) noexcept { if (name && *name) { - const std::string alias{ name }; + const std::string alias{name}; StringUtils::Remove(m_aliases, alias); } } @@ -165,8 +164,9 @@ ConstTransformRcPtr NamedTransformImpl::getTransform(TransformDirection dir) con throw Exception("Named transform: Unspecified TransformDirection."); } -ConstTransformRcPtr NamedTransform::GetTransform(const ConstNamedTransformRcPtr & nt, - TransformDirection dir) +ConstTransformRcPtr NamedTransform::GetTransform( + const ConstNamedTransformRcPtr & nt, + TransformDirection dir) { if (nt) { @@ -236,10 +236,10 @@ void NamedTransformImpl::setTransform(const ConstTransformRcPtr & transform, Tra } } -std::ostream & operator<< (std::ostream & os, const NamedTransform & t) +std::ostream & operator<<(std::ostream & os, const NamedTransform & t) { os << " & x) { try { - x = node.as >(); + x = node.as>(); } catch (const std::exception & e) { std::ostringstream os; - os << "At line " << (node.Mark().line + 1) - << ", '" << node.Tag() << "' parsing vector failed " - << "with: " << e.what(); + os << "At line " << (node.Mark().line + 1) << ", '" << node.Tag() + << "' parsing vector failed " << "with: " << e.what(); throw Exception(os.str().c_str()); } } -inline void load(const YAML::Node& node, std::vector& x) +inline void load(const YAML::Node & node, std::vector & x) { try { - x = node.as >(); + x = node.as>(); } catch (const std::exception & e) { std::ostringstream os; - os << "At line " << (node.Mark().line + 1) - << ", '" << node.Tag() << "' parsing vector failed " - << "with: " << e.what(); + os << "At line " << (node.Mark().line + 1) << ", '" << node.Tag() + << "' parsing vector failed " << "with: " << e.what(); throw Exception(os.str().c_str()); } } // Enums -inline void load(const YAML::Node& node, BitDepth& depth) +inline void load(const YAML::Node & node, BitDepth & depth) { std::string str; load(node, str); depth = BitDepthFromString(str.c_str()); } -inline void save(YAML::Emitter& out, BitDepth depth) +inline void save(YAML::Emitter & out, BitDepth depth) { out << BitDepthToString(depth); } -inline void load(const YAML::Node& node, Allocation& alloc) +inline void load(const YAML::Node & node, Allocation & alloc) { std::string str; load(node, str); alloc = AllocationFromString(str.c_str()); } -inline void save(YAML::Emitter& out, Allocation alloc) +inline void save(YAML::Emitter & out, Allocation alloc) { out << AllocationToString(alloc); } - -inline void load(const YAML::Node& node, TransformDirection& dir) +inline void load(const YAML::Node & node, TransformDirection & dir) { std::string str; load(node, str); dir = TransformDirectionFromString(str.c_str()); } -inline void save(YAML::Emitter& out, TransformDirection dir) +inline void save(YAML::Emitter & out, TransformDirection dir) { out << TransformDirectionToString(dir); } -inline void load(const YAML::Node& node, Interpolation& interp) +inline void load(const YAML::Node & node, Interpolation & interp) { std::string str; load(node, str); interp = InterpolationFromString(str.c_str()); } -inline void save(YAML::Emitter& out, Interpolation interp) +inline void save(YAML::Emitter & out, Interpolation interp) { out << InterpolationToString(interp); } -inline void loadDescription(const YAML::Node& node, std::string& x) +inline void loadDescription(const YAML::Node & node, std::string & x) { load(node, x); if (!x.empty()) @@ -211,7 +203,7 @@ inline void saveDescription(YAML::Emitter & out, const char * desc) if (desc && *desc) { // Remove trailing newlines so that only one is saved because they won't be read back. - std::string descStr{ desc }; + std::string descStr{desc}; { auto last = descStr.back(); while (last == '\n' && descStr.length()) @@ -231,21 +223,19 @@ inline void saveDescription(YAML::Emitter & out, const char * desc) } // -inline void LogUnknownKeyWarning(const YAML::Node & node, - const YAML::Node & key) +inline void LogUnknownKeyWarning(const YAML::Node & node, const YAML::Node & key) { std::string keyName; load(key, keyName); std::ostringstream os; - os << "At line " << (key.Mark().line + 1) - << ", unknown key '" << keyName << "' in '" << node.Tag() << "'."; + os << "At line " << (key.Mark().line + 1) << ", unknown key '" << keyName << "' in '" + << node.Tag() << "'."; LogWarning(os.str()); } -inline void LogUnknownKeyWarning(const std::string & name, - const YAML::Node & tag) +inline void LogUnknownKeyWarning(const std::string & name, const YAML::Node & tag) { std::string key; load(tag, key); @@ -255,42 +245,36 @@ inline void LogUnknownKeyWarning(const std::string & name, LogWarning(os.str()); } -inline void throwError(const YAML::Node & node, - const std::string & msg) +inline void throwError(const YAML::Node & node, const std::string & msg) { std::ostringstream os; - os << "At line " << (node.Mark().line + 1) - << ", '" << node.Tag() << "' parsing failed: " - << msg; + os << "At line " << (node.Mark().line + 1) << ", '" << node.Tag() + << "' parsing failed: " << msg; throw Exception(os.str().c_str()); } -inline void throwValueError(const std::string & nodeName, - const YAML::Node & key, - const std::string & msg) +inline void +throwValueError(const std::string & nodeName, const YAML::Node & key, const std::string & msg) { std::string keyName; load(key, keyName); std::ostringstream os; - os << "At line " << (key.Mark().line + 1) - << ", the value parsing of the key '" << keyName - << "' from '" << nodeName << "' failed: " << msg; + os << "At line " << (key.Mark().line + 1) << ", the value parsing of the key '" << keyName + << "' from '" << nodeName << "' failed: " << msg; throw Exception(os.str().c_str()); } -inline void throwValueError(const YAML::Node & key, - const std::string & msg) +inline void throwValueError(const YAML::Node & key, const std::string & msg) { std::string keyName; load(key, keyName); std::ostringstream os; - os << "At line " << (key.Mark().line + 1) - << ", the value parsing of the key '" << keyName - << "' failed: " << msg; + os << "At line " << (key.Mark().line + 1) << ", the value parsing of the key '" << keyName + << "' failed: " << msg; throw Exception(os.str().c_str()); } @@ -321,23 +305,24 @@ inline void CheckDuplicates(const YAML::Node & node) // View -inline void load(const YAML::Node& node, View& v) +inline void load(const YAML::Node & node, View & v) { - if(node.Tag() != "View") + if (node.Tag() != "View") return; CheckDuplicates(node); - bool expectingSceneCS = false; + bool expectingSceneCS = false; bool expectingDisplayCS = false; for (Iterator iter = node.begin(); iter != node.end(); ++iter) { const std::string & key = iter->first.as(); - if (iter->second.IsNull() || !iter->second.IsDefined()) continue; + if (iter->second.IsNull() || !iter->second.IsDefined()) + continue; - if(key == "name") + if (key == "name") { load(iter->second, v.m_name); } @@ -346,7 +331,7 @@ inline void load(const YAML::Node& node, View& v) expectingDisplayCS = true; load(iter->second, v.m_viewTransform); } - else if(key == "colorspace") + else if (key == "colorspace") { expectingSceneCS = true; load(iter->second, v.m_colorspace); @@ -356,7 +341,7 @@ inline void load(const YAML::Node& node, View& v) expectingDisplayCS = true; load(iter->second, v.m_colorspace); } - else if(key == "looks" || key == "look") + else if (key == "looks" || key == "look") { load(iter->second, v.m_looks); } @@ -373,18 +358,18 @@ inline void load(const YAML::Node& node, View& v) LogUnknownKeyWarning(node, iter->first); } } - if(v.m_name.empty()) + if (v.m_name.empty()) { throwError(node, "View does not specify 'name'."); } if (expectingDisplayCS == expectingSceneCS) { std::ostringstream os; - os << "View '" << v.m_name << - "' must specify colorspace or view_transform and display_colorspace."; + os << "View '" << v.m_name + << "' must specify colorspace or view_transform and display_colorspace."; throwError(node, os.str().c_str()); } - if(v.m_colorspace.empty()) + if (v.m_colorspace.empty()) { std::ostringstream os; os << "View '" << v.m_name << "' does not specify colorspace."; @@ -392,7 +377,7 @@ inline void load(const YAML::Node& node, View& v) } } -inline void save(YAML::Emitter& out, const View & view) +inline void save(YAML::Emitter & out, const View & view) { out << YAML::VerbatimTag("View"); out << YAML::Flow; @@ -421,26 +406,24 @@ inline void save(YAML::Emitter& out, const View & view) // Common Transform -inline void EmitBaseTransformKeyValues(YAML::Emitter & out, - const ConstTransformRcPtr & t) +inline void EmitBaseTransformKeyValues(YAML::Emitter & out, const ConstTransformRcPtr & t) { switch (t->getDirection()) { - case TRANSFORM_DIR_FORWARD: - break; - case TRANSFORM_DIR_INVERSE: - out << YAML::Key << "direction"; - out << YAML::Value << YAML::Flow; - save(out, t->getDirection()); - break; + case TRANSFORM_DIR_FORWARD: + break; + case TRANSFORM_DIR_INVERSE: + out << YAML::Key << "direction"; + out << YAML::Value << YAML::Flow; + save(out, t->getDirection()); + break; } } -inline void EmitTransformName(YAML::Emitter & out, - const FormatMetadata & metadata) +inline void EmitTransformName(YAML::Emitter & out, const FormatMetadata & metadata) { const FormatMetadataImpl & data = dynamic_cast(metadata); - const std::string & name = data.getName(); + const std::string & name = data.getName(); if (!name.empty()) { out << YAML::Key << "name" << YAML::Value << name; @@ -449,7 +432,7 @@ inline void EmitTransformName(YAML::Emitter & out, // AllocationTransform -inline void load(const YAML::Node& node, AllocationTransformRcPtr& t) +inline void load(const YAML::Node & node, AllocationTransformRcPtr & t) { t = AllocationTransform::Create(); @@ -459,24 +442,25 @@ inline void load(const YAML::Node& node, AllocationTransformRcPtr& t) { const std::string & key = iter->first.as(); - if (iter->second.IsNull() || !iter->second.IsDefined()) continue; + if (iter->second.IsNull() || !iter->second.IsDefined()) + continue; - if(key == "allocation") + if (key == "allocation") { Allocation val; load(iter->second, val); t->setAllocation(val); } - else if(key == "vars") + else if (key == "vars") { std::vector val; load(iter->second, val); - if(!val.empty()) + if (!val.empty()) { t->setVars(static_cast(val.size()), &val[0]); } } - else if(key == "direction") + else if (key == "direction") { TransformDirection val; load(iter->second, val); @@ -489,7 +473,7 @@ inline void load(const YAML::Node& node, AllocationTransformRcPtr& t) } } -inline void save(YAML::Emitter& out, ConstAllocationTransformRcPtr t) +inline void save(YAML::Emitter & out, ConstAllocationTransformRcPtr t) { out << YAML::VerbatimTag("AllocationTransform"); out << YAML::Flow << YAML::BeginMap; @@ -498,7 +482,7 @@ inline void save(YAML::Emitter& out, ConstAllocationTransformRcPtr t) out << YAML::Value << YAML::Flow; save(out, t->getAllocation()); - if(t->getNumVars() > 0) + if (t->getNumVars() > 0) { std::vector vars(t->getNumVars()); t->getVars(&vars[0]); @@ -522,7 +506,8 @@ inline void load(const YAML::Node & node, BuiltinTransformRcPtr & t) { const std::string & key = iter->first.as(); - if (iter->second.IsNull() || !iter->second.IsDefined()) continue; + if (iter->second.IsNull() || !iter->second.IsDefined()) + continue; if (key == "style") { @@ -558,7 +543,7 @@ inline void save(YAML::Emitter & out, const ConstBuiltinTransformRcPtr & t) // CDLTransform -inline void load(const YAML::Node& node, CDLTransformRcPtr& t) +inline void load(const YAML::Node & node, CDLTransformRcPtr & t) { t = CDLTransform::Create(); @@ -568,13 +553,14 @@ inline void load(const YAML::Node& node, CDLTransformRcPtr& t) { const std::string & key = iter->first.as(); - if (iter->second.IsNull() || !iter->second.IsDefined()) continue; + if (iter->second.IsNull() || !iter->second.IsDefined()) + continue; if (key == "slope") { std::vector floatvecval; load(iter->second, floatvecval); - if(floatvecval.size() != 3) + if (floatvecval.size() != 3) { std::ostringstream os; os << "'slope' values must be 3 "; @@ -587,7 +573,7 @@ inline void load(const YAML::Node& node, CDLTransformRcPtr& t) { std::vector floatvecval; load(iter->second, floatvecval); - if(floatvecval.size() != 3) + if (floatvecval.size() != 3) { std::ostringstream os; os << "'offset' values must be 3 "; @@ -600,7 +586,7 @@ inline void load(const YAML::Node& node, CDLTransformRcPtr& t) { std::vector floatvecval; load(iter->second, floatvecval); - if(floatvecval.size() != 3) + if (floatvecval.size() != 3) { std::ostringstream os; os << "'power' values must be 3 "; @@ -640,7 +626,7 @@ inline void load(const YAML::Node& node, CDLTransformRcPtr& t) } } -inline void save(YAML::Emitter& out, ConstCDLTransformRcPtr t, unsigned int majorVersion) +inline void save(YAML::Emitter & out, ConstCDLTransformRcPtr t, unsigned int majorVersion) { out << YAML::VerbatimTag("CDLTransform"); out << YAML::Flow << YAML::BeginMap; @@ -690,7 +676,7 @@ inline void save(YAML::Emitter& out, ConstCDLTransformRcPtr t, unsigned int majo // ColorSpaceTransform -inline void load(const YAML::Node& node, ColorSpaceTransformRcPtr& t) +inline void load(const YAML::Node & node, ColorSpaceTransformRcPtr & t) { t = ColorSpaceTransform::Create(); @@ -700,27 +686,28 @@ inline void load(const YAML::Node& node, ColorSpaceTransformRcPtr& t) { const std::string & key = iter->first.as(); - if (iter->second.IsNull() || !iter->second.IsDefined()) continue; + if (iter->second.IsNull() || !iter->second.IsDefined()) + continue; - if(key == "src") + if (key == "src") { std::string stringval; load(iter->second, stringval); t->setSrc(stringval.c_str()); } - else if(key == "dst") + else if (key == "dst") { std::string stringval; load(iter->second, stringval); t->setDst(stringval.c_str()); } - else if(key == "direction") + else if (key == "direction") { TransformDirection val; load(iter->second, val); t->setDirection(val); } - else if(key == "data_bypass") + else if (key == "data_bypass") { bool val; load(iter->second, val); @@ -733,7 +720,7 @@ inline void load(const YAML::Node& node, ColorSpaceTransformRcPtr& t) } } -inline void save(YAML::Emitter& out, ConstColorSpaceTransformRcPtr t) +inline void save(YAML::Emitter & out, ConstColorSpaceTransformRcPtr t) { out << YAML::VerbatimTag("ColorSpaceTransform"); out << YAML::Flow << YAML::BeginMap; @@ -752,7 +739,7 @@ inline void save(YAML::Emitter& out, ConstColorSpaceTransformRcPtr t) // DisplayViewTransform -inline void load(const YAML::Node& node, DisplayViewTransformRcPtr& t) +inline void load(const YAML::Node & node, DisplayViewTransformRcPtr & t) { t = DisplayViewTransform::Create(); @@ -760,7 +747,8 @@ inline void load(const YAML::Node& node, DisplayViewTransformRcPtr& t) { const std::string & key = iter->first.as(); - if (iter->second.IsNull() || !iter->second.IsDefined()) continue; + if (iter->second.IsNull() || !iter->second.IsDefined()) + continue; if (key == "src") { @@ -788,13 +776,13 @@ inline void load(const YAML::Node& node, DisplayViewTransformRcPtr& t) } else if (key == "looks_bypass") { - bool boolval{ true }; + bool boolval{true}; load(iter->second, boolval); t->setLooksBypass(boolval); } else if (key == "data_bypass") { - bool boolval{ true }; + bool boolval{true}; load(iter->second, boolval); t->setDataBypass(boolval); } @@ -805,7 +793,7 @@ inline void load(const YAML::Node& node, DisplayViewTransformRcPtr& t) } } -inline void save(YAML::Emitter& out, ConstDisplayViewTransformRcPtr t) +inline void save(YAML::Emitter & out, ConstDisplayViewTransformRcPtr t) { out << YAML::VerbatimTag("DisplayViewTransform"); out << YAML::Flow << YAML::BeginMap; @@ -829,7 +817,7 @@ inline void save(YAML::Emitter& out, ConstDisplayViewTransformRcPtr t) // ExponentTransform -inline void load(const YAML::Node& node, ExponentTransformRcPtr& t) +inline void load(const YAML::Node & node, ExponentTransformRcPtr & t) { t = ExponentTransform::Create(); @@ -839,7 +827,8 @@ inline void load(const YAML::Node& node, ExponentTransformRcPtr& t) { const std::string & key = iter->first.as(); - if (iter->second.IsNull() || !iter->second.IsDefined()) continue; + if (iter->second.IsNull() || !iter->second.IsDefined()) + continue; if (key == "value") { @@ -863,7 +852,7 @@ inline void load(const YAML::Node& node, ExponentTransformRcPtr& t) os << "floats. Found '" << val.size() << "'."; throwValueError(node.Tag(), iter->first, os.str()); } - const double v[4] = { val[0], val[1], val[2], val[3] }; + const double v[4] = {val[0], val[1], val[2], val[3]}; t->setValue(v); } else if (key == "style") @@ -872,13 +861,13 @@ inline void load(const YAML::Node& node, ExponentTransformRcPtr& t) load(iter->second, style); t->setNegativeStyle(NegativeStyleFromString(style.c_str())); } - else if(key == "direction") + else if (key == "direction") { TransformDirection val; load(iter->second, val); t->setDirection(val); } - else if(key == "name") + else if (key == "name") { std::string name; load(iter->second, name); @@ -891,7 +880,7 @@ inline void load(const YAML::Node& node, ExponentTransformRcPtr& t) } } -inline void save(YAML::Emitter& out, ConstExponentTransformRcPtr t, unsigned int majorVersion) +inline void save(YAML::Emitter & out, ConstExponentTransformRcPtr t, unsigned int majorVersion) { out << YAML::VerbatimTag("ExponentTransform"); out << YAML::Flow << YAML::BeginMap; @@ -930,7 +919,7 @@ inline void save(YAML::Emitter& out, ConstExponentTransformRcPtr t, unsigned int // ExponentWithLinear -inline void load(const YAML::Node& node, ExponentWithLinearTransformRcPtr& t) +inline void load(const YAML::Node & node, ExponentWithLinearTransformRcPtr & t) { t = ExponentWithLinearTransform::Create(); @@ -939,7 +928,7 @@ inline void load(const YAML::Node& node, ExponentWithLinearTransformRcPtr& t) NOTHING_FOUND = 0x00, GAMMA_FOUND = 0x01, OFFSET_FOUND = 0x02, - FIELDS_FOUND = (GAMMA_FOUND|OFFSET_FOUND) + FIELDS_FOUND = (GAMMA_FOUND | OFFSET_FOUND) }; FieldFound fields = NOTHING_FOUND; @@ -952,7 +941,8 @@ inline void load(const YAML::Node& node, ExponentWithLinearTransformRcPtr& t) { const std::string & key = iter->first.as(); - if (iter->second.IsNull() || !iter->second.IsDefined()) continue; + if (iter->second.IsNull() || !iter->second.IsDefined()) + continue; if (key == "gamma") { @@ -972,17 +962,14 @@ inline void load(const YAML::Node& node, ExponentWithLinearTransformRcPtr& t) if (val.size() != 4) { std::ostringstream os; - os << err - << "gamma field must be 4 floats. Found '" - << val.size() - << "'."; + os << err << "gamma field must be 4 floats. Found '" << val.size() << "'."; throw Exception(os.str().c_str()); } - const double v[4] = { val[0], val[1], val[2], val[3] }; + const double v[4] = {val[0], val[1], val[2], val[3]}; t->setGamma(v); - fields = FieldFound(fields|GAMMA_FOUND); + fields = FieldFound(fields | GAMMA_FOUND); } - else if(key == "offset") + else if (key == "offset") { std::vector val; if (iter->second.Type() == YAML::NodeType::Sequence) @@ -1000,15 +987,12 @@ inline void load(const YAML::Node& node, ExponentWithLinearTransformRcPtr& t) if (val.size() != 4) { std::ostringstream os; - os << err - << "offset field must be 4 floats. Found '" - << val.size() - << "'."; + os << err << "offset field must be 4 floats. Found '" << val.size() << "'."; throw Exception(os.str().c_str()); } - const double v[4] = { val[0], val[1], val[2], val[3] }; + const double v[4] = {val[0], val[1], val[2], val[3]}; t->setOffset(v); - fields = FieldFound(fields|OFFSET_FOUND); + fields = FieldFound(fields | OFFSET_FOUND); } else if (key == "style") { @@ -1016,13 +1000,13 @@ inline void load(const YAML::Node& node, ExponentWithLinearTransformRcPtr& t) load(iter->second, style); t->setNegativeStyle(NegativeStyleFromString(style.c_str())); } - else if(key == "direction") + else if (key == "direction") { TransformDirection val; load(iter->second, val); t->setDirection(val); } - else if(key == "name") + else if (key == "name") { std::string name; load(iter->second, name); @@ -1034,14 +1018,14 @@ inline void load(const YAML::Node& node, ExponentWithLinearTransformRcPtr& t) } } - if(fields!=FIELDS_FOUND) + if (fields != FIELDS_FOUND) { std::string e = err; - if(fields==NOTHING_FOUND) + if (fields == NOTHING_FOUND) { e += "gamma and offset fields are missing"; } - else if((fields&GAMMA_FOUND)!=GAMMA_FOUND) + else if ((fields & GAMMA_FOUND) != GAMMA_FOUND) { e += "gamma field is missing"; } @@ -1054,7 +1038,7 @@ inline void load(const YAML::Node& node, ExponentWithLinearTransformRcPtr& t) } } -inline void save(YAML::Emitter& out, ConstExponentWithLinearTransformRcPtr t) +inline void save(YAML::Emitter & out, ConstExponentWithLinearTransformRcPtr t) { out << YAML::VerbatimTag("ExponentWithLinearTransform"); out << YAML::Flow << YAML::BeginMap; @@ -1079,7 +1063,7 @@ inline void save(YAML::Emitter& out, ConstExponentWithLinearTransformRcPtr t) double offset[4]; t->getOffset(offset); - + if (offset[0] == offset[1] && offset[0] == offset[2] && offset[3] == 0.) { out << YAML::Key << "offset" << YAML::Value << offset[0]; @@ -1106,7 +1090,7 @@ inline void save(YAML::Emitter& out, ConstExponentWithLinearTransformRcPtr t) // ExposureContrastTransform -inline void load(const YAML::Node& node, ExposureContrastTransformRcPtr& t) +inline void load(const YAML::Node & node, ExposureContrastTransformRcPtr & t) { t = ExposureContrastTransform::Create(); @@ -1120,7 +1104,8 @@ inline void load(const YAML::Node& node, ExposureContrastTransformRcPtr& t) { const std::string & key = iter->first.as(); - if (iter->second.IsNull() || !iter->second.IsDefined()) continue; + if (iter->second.IsNull() || !iter->second.IsDefined()) + continue; if (key == "exposure") { @@ -1200,7 +1185,7 @@ inline void load(const YAML::Node& node, ExposureContrastTransformRcPtr& t) } } -inline void save(YAML::Emitter& out, ConstExposureContrastTransformRcPtr t) +inline void save(YAML::Emitter & out, ConstExposureContrastTransformRcPtr t) { out << YAML::VerbatimTag("ExposureContrastTransform"); out << YAML::Flow << YAML::BeginMap; @@ -1248,7 +1233,7 @@ inline void save(YAML::Emitter& out, ConstExposureContrastTransformRcPtr t) // FileTransform -inline void load(const YAML::Node& node, FileTransformRcPtr& t) +inline void load(const YAML::Node & node, FileTransformRcPtr & t) { t = FileTransform::Create(); @@ -1260,7 +1245,8 @@ inline void load(const YAML::Node& node, FileTransformRcPtr& t) { const std::string & key = iter->first.as(); - if (iter->second.IsNull() || !iter->second.IsDefined()) continue; + if (iter->second.IsNull() || !iter->second.IsDefined()) + continue; if (key == "src") { @@ -1296,7 +1282,7 @@ inline void load(const YAML::Node& node, FileTransformRcPtr& t) } } -inline void save(YAML::Emitter& out, ConstFileTransformRcPtr t, unsigned int majorVersion) +inline void save(YAML::Emitter & out, ConstFileTransformRcPtr t, unsigned int majorVersion) { out << YAML::VerbatimTag("FileTransform"); out << YAML::Flow << YAML::BeginMap; @@ -1333,40 +1319,41 @@ inline void save(YAML::Emitter& out, ConstFileTransformRcPtr t, unsigned int maj // FixedFunctionTransform -inline void load(const YAML::Node& node, FixedFunctionTransformRcPtr& t) +inline void load(const YAML::Node & node, FixedFunctionTransformRcPtr & t) { t = FixedFunctionTransform::Create(FIXED_FUNCTION_ACES_RED_MOD_03); CheckDuplicates(node); - bool styleFound{ false }; + bool styleFound{false}; for (Iterator iter = node.begin(); iter != node.end(); ++iter) { const std::string & key = iter->first.as(); - if (iter->second.IsNull() || !iter->second.IsDefined()) continue; + if (iter->second.IsNull() || !iter->second.IsDefined()) + continue; - if(key == "params") + if (key == "params") { std::vector params; load(iter->second, params); t->setParams(¶ms[0], params.size()); } - else if(key == "style") + else if (key == "style") { std::string style; load(iter->second, style); - t->setStyle( FixedFunctionStyleFromString(style.c_str()) ); + t->setStyle(FixedFunctionStyleFromString(style.c_str())); styleFound = true; } - else if(key == "direction") + else if (key == "direction") { TransformDirection val; load(iter->second, val); t->setDirection(val); } - else if(key == "name") + else if (key == "name") { std::string name; load(iter->second, name); @@ -1383,7 +1370,7 @@ inline void load(const YAML::Node& node, FixedFunctionTransformRcPtr& t) } } -inline void save(YAML::Emitter& out, ConstFixedFunctionTransformRcPtr t) +inline void save(YAML::Emitter & out, ConstFixedFunctionTransformRcPtr t) { out << YAML::VerbatimTag("FixedFunctionTransform"); out << YAML::Flow << YAML::BeginMap; @@ -1394,7 +1381,7 @@ inline void save(YAML::Emitter& out, ConstFixedFunctionTransformRcPtr t) out << YAML::Value << YAML::Flow << FixedFunctionStyleToString(t->getStyle()); const size_t numParams = t->getNumParams(); - if(numParams>0) + if (numParams > 0) { std::vector params(numParams, 0.); t->getParams(¶ms[0]); @@ -1412,14 +1399,15 @@ inline void load(const YAML::Node & parent, const YAML::Node & node, GradingRGBM { if (node.Type() == YAML::NodeType::Map) { - bool rgbOK{ false }; - bool masterOK{ false }; + bool rgbOK{false}; + bool masterOK{false}; for (Iterator iter = node.begin(); iter != node.end(); ++iter) { const std::string & key = iter->first.as(); - if (iter->second.IsNull() || !iter->second.IsDefined()) continue; + if (iter->second.IsNull() || !iter->second.IsDefined()) + continue; if (key == "rgb") { @@ -1429,10 +1417,10 @@ inline void load(const YAML::Node & parent, const YAML::Node & node, GradingRGBM { throwError(iter->first, "The RGB value needs to be a 3 doubles."); } - rgbm.m_red = vals[0]; + rgbm.m_red = vals[0]; rgbm.m_green = vals[1]; - rgbm.m_blue = vals[2]; - rgbOK = true; + rgbm.m_blue = vals[2]; + rgbOK = true; } else if (key == "master") { @@ -1455,10 +1443,15 @@ inline void load(const YAML::Node & parent, const YAML::Node & node, GradingRGBM } } -inline void loadPivot(const YAML::Node & parent, const YAML::Node & node, - double & val, bool & valLoaded, - double & blackVal, bool & blackValLoaded, - double & whiteVal, bool & whiteValLoaded) +inline void loadPivot( + const YAML::Node & parent, + const YAML::Node & node, + double & val, + bool & valLoaded, + double & blackVal, + bool & blackValLoaded, + double & whiteVal, + bool & whiteValLoaded) { if (node.Type() == YAML::NodeType::Map) { @@ -1466,7 +1459,8 @@ inline void loadPivot(const YAML::Node & parent, const YAML::Node & node, { const std::string & key = iter->first.as(); - if (iter->second.IsNull() || !iter->second.IsDefined()) continue; + if (iter->second.IsNull() || !iter->second.IsDefined()) + continue; if (key == "contrast") { @@ -1500,9 +1494,13 @@ inline void loadPivot(const YAML::Node & parent, const YAML::Node & node, } } -inline void loadClamp(const YAML::Node & parent, const YAML::Node & node, - double & blackVal, bool & blackValLoaded, - double & whiteVal, bool & whiteValLoaded) +inline void loadClamp( + const YAML::Node & parent, + const YAML::Node & node, + double & blackVal, + bool & blackValLoaded, + double & whiteVal, + bool & whiteValLoaded) { if (node.Type() == YAML::NodeType::Map) { @@ -1510,7 +1508,8 @@ inline void loadClamp(const YAML::Node & parent, const YAML::Node & node, { const std::string & key = iter->first.as(); - if (iter->second.IsNull() || !iter->second.IsDefined()) continue; + if (iter->second.IsNull() || !iter->second.IsDefined()) + continue; if (key == "black") { @@ -1544,26 +1543,27 @@ inline void load(const YAML::Node & node, GradingPrimaryTransformRcPtr & t) CheckDuplicates(node); t = GradingPrimaryTransform::Create(GRADING_LOG); - GradingPrimary values{ GRADING_LOG }; - bool brightnessLoaded{ false }; - bool contrastLoaded{ false }; - bool gammaLoaded{ false }; - bool offsetLoaded{ false }; - bool exposureLoaded{ false }; - bool liftLoaded{ false }; - bool gainLoaded{ false }; - bool saturationLoaded{ false }; - bool pivotLoaded{ false }; - bool pivotBlackLoaded{ false }; - bool pivotWhiteLoaded{ false }; - bool clampBlackLoaded{ false }; - bool clampWhiteLoaded{ false }; + GradingPrimary values{GRADING_LOG}; + bool brightnessLoaded{false}; + bool contrastLoaded{false}; + bool gammaLoaded{false}; + bool offsetLoaded{false}; + bool exposureLoaded{false}; + bool liftLoaded{false}; + bool gainLoaded{false}; + bool saturationLoaded{false}; + bool pivotLoaded{false}; + bool pivotBlackLoaded{false}; + bool pivotWhiteLoaded{false}; + bool clampBlackLoaded{false}; + bool clampWhiteLoaded{false}; for (Iterator iter = node.begin(); iter != node.end(); ++iter) { const std::string & key = iter->first.as(); - if (iter->second.IsNull() || !iter->second.IsDefined()) continue; + if (iter->second.IsNull() || !iter->second.IsDefined()) + continue; if (key == "style") { @@ -1614,8 +1614,15 @@ inline void load(const YAML::Node & node, GradingPrimaryTransformRcPtr & t) } else if (key == "pivot") { - loadPivot(iter->first, iter->second, values.m_pivot, pivotLoaded, - values.m_pivotBlack, pivotBlackLoaded, values.m_pivotWhite, pivotWhiteLoaded); + loadPivot( + iter->first, + iter->second, + values.m_pivot, + pivotLoaded, + values.m_pivotBlack, + pivotBlackLoaded, + values.m_pivotWhite, + pivotWhiteLoaded); } else if (key == "saturation") { @@ -1624,8 +1631,13 @@ inline void load(const YAML::Node & node, GradingPrimaryTransformRcPtr & t) } else if (key == "clamp") { - loadClamp(iter->first, iter->second, values.m_clampBlack, clampBlackLoaded, - values.m_clampWhite, clampWhiteLoaded); + loadClamp( + iter->first, + iter->second, + values.m_clampBlack, + clampBlackLoaded, + values.m_clampWhite, + clampWhiteLoaded); } else if (key == "name") { @@ -1639,7 +1651,7 @@ inline void load(const YAML::Node & node, GradingPrimaryTransformRcPtr & t) } } - GradingPrimary valuesSet{ t->getStyle() }; + GradingPrimary valuesSet{t->getStyle()}; if (brightnessLoaded) { valuesSet.m_brightness = values.m_brightness; @@ -1696,8 +1708,11 @@ inline void load(const YAML::Node & node, GradingPrimaryTransformRcPtr & t) t->setValue(valuesSet); } -inline void save(YAML::Emitter & out, const char * paramName, const GradingRGBM & rgbm, - const GradingRGBM & defaultRgbm) +inline void save( + YAML::Emitter & out, + const char * paramName, + const GradingRGBM & rgbm, + const GradingRGBM & defaultRgbm) { if (rgbm != defaultRgbm) { @@ -1722,9 +1737,14 @@ inline void save(YAML::Emitter & out, const char * paramName, double val, double } } -inline void savePivot(YAML::Emitter & out, double val, bool saveContrast, - double blackVal, double defaultBlackVal, - double whiteVal, double defaultWhiteVal) +inline void savePivot( + YAML::Emitter & out, + double val, + bool saveContrast, + double blackVal, + double defaultBlackVal, + double whiteVal, + double defaultWhiteVal) { if (saveContrast || blackVal != defaultBlackVal || whiteVal != defaultWhiteVal) { @@ -1740,9 +1760,12 @@ inline void savePivot(YAML::Emitter & out, double val, bool saveContrast, } } -inline void saveClamp(YAML::Emitter & out, - double blackVal, double defaultBlackVal, - double whiteVal, double defaultWhiteVal) +inline void saveClamp( + YAML::Emitter & out, + double blackVal, + double defaultBlackVal, + double whiteVal, + double defaultWhiteVal) { if (blackVal != defaultBlackVal || whiteVal != defaultWhiteVal) { @@ -1758,11 +1781,12 @@ inline void save(YAML::Emitter & out, ConstGradingPrimaryTransformRcPtr t) { out << YAML::VerbatimTag("GradingPrimaryTransform"); - const auto style = t->getStyle(); + const auto style = t->getStyle(); const auto & vals = t->getValue(); - const GradingPrimary defaultVals{ style }; + const GradingPrimary defaultVals{style}; - if (vals == defaultVals) out << YAML::Flow; + if (vals == defaultVals) + out << YAML::Flow; out << YAML::BeginMap; EmitTransformName(out, t->getFormatMetadata()); @@ -1771,44 +1795,59 @@ inline void save(YAML::Emitter & out, ConstGradingPrimaryTransformRcPtr t) out << YAML::Value << YAML::Flow << GradingStyleToString(style); switch (style) { - case GRADING_LOG: - { - save(out, "brightness", vals.m_brightness, defaultVals.m_brightness); - save(out, "contrast", vals.m_contrast, defaultVals.m_contrast); - save(out, "gamma", vals.m_gamma, defaultVals.m_gamma); - save(out, "saturation", vals.m_saturation, defaultVals.m_saturation); - const bool forcePivot = (vals.m_contrast != defaultVals.m_contrast) || - (vals.m_pivot != defaultVals.m_pivot); - savePivot(out, vals.m_pivot, forcePivot, - vals.m_pivotBlack, defaultVals.m_pivotBlack, - vals.m_pivotWhite, defaultVals.m_pivotWhite); - break; - } - case GRADING_LIN: - { - save(out, "offset", vals.m_offset, defaultVals.m_offset); - save(out, "exposure", vals.m_exposure, defaultVals.m_exposure); - save(out, "contrast", vals.m_contrast, defaultVals.m_contrast); - save(out, "saturation", vals.m_saturation, defaultVals.m_saturation); - const bool forcePivot = (vals.m_contrast != defaultVals.m_contrast) || - (vals.m_pivot != defaultVals.m_pivot); - savePivot(out, vals.m_pivot, forcePivot, 0., 0., 0., 0.); - break; - } - case GRADING_VIDEO: - { - save(out, "lift", vals.m_lift, defaultVals.m_lift); - save(out, "gamma", vals.m_gamma, defaultVals.m_gamma); - save(out, "gain", vals.m_gain, defaultVals.m_gain); - save(out, "offset", vals.m_offset, defaultVals.m_offset); - save(out, "saturation", vals.m_saturation, defaultVals.m_saturation); - savePivot(out, 0., false, vals.m_pivotBlack, defaultVals.m_pivotBlack, - vals.m_pivotWhite, defaultVals.m_pivotWhite); - break; - } - } - saveClamp(out, vals.m_clampBlack, defaultVals.m_clampBlack, - vals.m_clampWhite, defaultVals.m_clampWhite); + case GRADING_LOG: + { + save(out, "brightness", vals.m_brightness, defaultVals.m_brightness); + save(out, "contrast", vals.m_contrast, defaultVals.m_contrast); + save(out, "gamma", vals.m_gamma, defaultVals.m_gamma); + save(out, "saturation", vals.m_saturation, defaultVals.m_saturation); + const bool forcePivot = (vals.m_contrast != defaultVals.m_contrast) + || (vals.m_pivot != defaultVals.m_pivot); + savePivot( + out, + vals.m_pivot, + forcePivot, + vals.m_pivotBlack, + defaultVals.m_pivotBlack, + vals.m_pivotWhite, + defaultVals.m_pivotWhite); + break; + } + case GRADING_LIN: + { + save(out, "offset", vals.m_offset, defaultVals.m_offset); + save(out, "exposure", vals.m_exposure, defaultVals.m_exposure); + save(out, "contrast", vals.m_contrast, defaultVals.m_contrast); + save(out, "saturation", vals.m_saturation, defaultVals.m_saturation); + const bool forcePivot = (vals.m_contrast != defaultVals.m_contrast) + || (vals.m_pivot != defaultVals.m_pivot); + savePivot(out, vals.m_pivot, forcePivot, 0., 0., 0., 0.); + break; + } + case GRADING_VIDEO: + { + save(out, "lift", vals.m_lift, defaultVals.m_lift); + save(out, "gamma", vals.m_gamma, defaultVals.m_gamma); + save(out, "gain", vals.m_gain, defaultVals.m_gain); + save(out, "offset", vals.m_offset, defaultVals.m_offset); + save(out, "saturation", vals.m_saturation, defaultVals.m_saturation); + savePivot( + out, + 0., + false, + vals.m_pivotBlack, + defaultVals.m_pivotBlack, + vals.m_pivotWhite, + defaultVals.m_pivotWhite); + break; + } + } + saveClamp( + out, + vals.m_clampBlack, + defaultVals.m_clampBlack, + vals.m_clampWhite, + defaultVals.m_clampWhite); EmitBaseTransformKeyValues(out, t); out << YAML::EndMap; @@ -1820,12 +1859,13 @@ inline void load(const YAML::Node & parent, const YAML::Node & node, GradingBSpl { if (node.Type() == YAML::NodeType::Map) { - bool cpOK{ false }; + bool cpOK{false}; for (Iterator iter = node.begin(); iter != node.end(); ++iter) { const std::string & key = iter->first.as(); - if (iter->second.IsNull() || !iter->second.IsDefined()) continue; + if (iter->second.IsNull() || !iter->second.IsDefined()) + continue; if (key == "control_points") { @@ -1834,7 +1874,10 @@ inline void load(const YAML::Node & parent, const YAML::Node & node, GradingBSpl const size_t numVals = vals.size(); if (numVals % 2 != 0) { - throwValueError(node.Tag(), iter->first, "An even number of float values is " + throwValueError( + node.Tag(), + iter->first, + "An even number of float values is " "required."); } const size_t numCtPts = numVals / 2; @@ -1842,8 +1885,8 @@ inline void load(const YAML::Node & parent, const YAML::Node & node, GradingBSpl for (size_t c = 0; c < numCtPts; ++c) { auto & pt = sc->getControlPoint(c); - pt.m_x = vals[2 * c]; - pt.m_y = vals[2 * c + 1]; + pt.m_x = vals[2 * c]; + pt.m_y = vals[2 * c + 1]; } cpOK = true; } @@ -1851,11 +1894,14 @@ inline void load(const YAML::Node & parent, const YAML::Node & node, GradingBSpl { std::vector vals; load(iter->second, vals); - const size_t numVals = vals.size(); + const size_t numVals = vals.size(); const size_t numCtPts = sc->getNumControlPoints(); if (numVals != numCtPts) { - throwValueError(node.Tag(), iter->first, "Number of slopes must match number " + throwValueError( + node.Tag(), + iter->first, + "Number of slopes must match number " "of control points."); } for (size_t i = 0; i < numVals; ++i) @@ -1895,7 +1941,8 @@ inline void load(const YAML::Node & node, GradingRGBCurveTransformRcPtr & t) { const std::string & key = iter->first.as(); - if (iter->second.IsNull() || !iter->second.IsDefined()) continue; + if (iter->second.IsNull() || !iter->second.IsDefined()) + continue; if (key == "style") { @@ -1947,19 +1994,24 @@ inline void load(const YAML::Node & node, GradingRGBCurveTransformRcPtr & t) } } - auto & defCurve = t->getStyle() == GRADING_LIN ? GradingRGBCurveImpl::DefaultLin : - GradingRGBCurveImpl::Default; + auto & defCurve = t->getStyle() == GRADING_LIN ? GradingRGBCurveImpl::DefaultLin + : GradingRGBCurveImpl::Default; - if (!red) red = defCurve.createEditableCopy(); - if (!green) green = defCurve.createEditableCopy(); - if (!blue) blue = defCurve.createEditableCopy(); - if (!master) master = defCurve.createEditableCopy(); + if (!red) + red = defCurve.createEditableCopy(); + if (!green) + green = defCurve.createEditableCopy(); + if (!blue) + blue = defCurve.createEditableCopy(); + if (!master) + master = defCurve.createEditableCopy(); auto curves = GradingRGBCurve::Create(red, green, blue, master); t->setValue(curves); } -inline void save(YAML::Emitter & out, const char * paramName, const ConstGradingBSplineCurveRcPtr & curve) +inline void +save(YAML::Emitter & out, const char * paramName, const ConstGradingBSplineCurveRcPtr & curve) { std::vector ctPts; const size_t numCtPts = curve->getNumControlPoints(); @@ -1989,9 +2041,9 @@ inline void save(YAML::Emitter & out, const char * paramName, const ConstGrading inline void save(YAML::Emitter & out, ConstGradingRGBCurveTransformRcPtr t) { - const auto & vals = t->getValue(); - auto & defCurve = t->getStyle() == GRADING_LIN ? GradingRGBCurveImpl::DefaultLin : - GradingRGBCurveImpl::Default; + const auto & vals = t->getValue(); + auto & defCurve = t->getStyle() == GRADING_LIN ? GradingRGBCurveImpl::DefaultLin + : GradingRGBCurveImpl::Default; bool useLineBreaks = false; for (int c = 0; c < RGB_NUM_CURVES; ++c) { @@ -2004,7 +2056,8 @@ inline void save(YAML::Emitter & out, ConstGradingRGBCurveTransformRcPtr t) } out << YAML::VerbatimTag("GradingRGBCurveTransform"); - if (!useLineBreaks) out << YAML::Flow; + if (!useLineBreaks) + out << YAML::Flow; out << YAML::BeginMap; EmitTransformName(out, t->getFormatMetadata()); @@ -2019,7 +2072,7 @@ inline void save(YAML::Emitter & out, ConstGradingRGBCurveTransformRcPtr t) out << YAML::Value << YAML::Flow << true; } - static const std::vector curveNames = { "red", "green", "blue", "master" }; + static const std::vector curveNames = {"red", "green", "blue", "master"}; for (int c = 0; c < RGB_NUM_CURVES; ++c) { const auto & curve = vals->getCurve(static_cast(c)); @@ -2035,21 +2088,26 @@ inline void save(YAML::Emitter & out, ConstGradingRGBCurveTransformRcPtr t) // GradingToneTransform -inline void load(const YAML::Node & parent, const YAML::Node & node, GradingRGBMSW & rgbm, - bool center, bool pivot) +inline void load( + const YAML::Node & parent, + const YAML::Node & node, + GradingRGBMSW & rgbm, + bool center, + bool pivot) { if (node.Type() == YAML::NodeType::Map) { - bool rgbOK{ false }; - bool masterOK{ false }; - bool startOK{ false }; - bool widthOK{ false }; + bool rgbOK{false}; + bool masterOK{false}; + bool startOK{false}; + bool widthOK{false}; for (Iterator iter = node.begin(); iter != node.end(); ++iter) { const std::string & key = iter->first.as(); - if (iter->second.IsNull() || !iter->second.IsDefined()) continue; + if (iter->second.IsNull() || !iter->second.IsDefined()) + continue; if (key == "rgb") { @@ -2059,10 +2117,10 @@ inline void load(const YAML::Node & parent, const YAML::Node & node, GradingRGBM { throwError(iter->first, "The RGB value needs to be a 3 doubles."); } - rgbm.m_red = vals[0]; + rgbm.m_red = vals[0]; rgbm.m_green = vals[1]; - rgbm.m_blue = vals[2]; - rgbOK = true; + rgbm.m_blue = vals[2]; + rgbOK = true; } else if (key == "master") { @@ -2105,11 +2163,11 @@ inline void load(const YAML::Node & node, GradingToneTransformRcPtr & t) t = GradingToneTransform::Create(GRADING_LOG); - bool blacksLoaded = false; - bool shadowsLoaded = false; - bool midtonesLoaded = false; + bool blacksLoaded = false; + bool shadowsLoaded = false; + bool midtonesLoaded = false; bool highlightsLoaded = false; - bool whitesLoaded = false; + bool whitesLoaded = false; GradingRGBMSW blacks, shadows, midtones, highlights, whites; double scontrast = 1.0; @@ -2117,7 +2175,8 @@ inline void load(const YAML::Node & node, GradingToneTransformRcPtr & t) { const std::string & key = iter->first.as(); - if (iter->second.IsNull() || !iter->second.IsDefined()) continue; + if (iter->second.IsNull() || !iter->second.IsDefined()) + continue; if (key == "style") { @@ -2172,28 +2231,38 @@ inline void load(const YAML::Node & node, GradingToneTransformRcPtr & t) } } - GradingTone values{ t->getStyle() }; + GradingTone values{t->getStyle()}; values.m_scontrast = scontrast; - if (blacksLoaded) values.m_blacks = blacks; - if (shadowsLoaded) values.m_shadows = shadows; - if (midtonesLoaded) values.m_midtones = midtones; - if (highlightsLoaded) values.m_highlights = highlights; - if (whitesLoaded) values.m_whites = whites; + if (blacksLoaded) + values.m_blacks = blacks; + if (shadowsLoaded) + values.m_shadows = shadows; + if (midtonesLoaded) + values.m_midtones = midtones; + if (highlightsLoaded) + values.m_highlights = highlights; + if (whitesLoaded) + values.m_whites = whites; t->setValue(values); } -inline void save(YAML::Emitter & out, const char * paramName, const GradingRGBMSW & rgbm, - const GradingRGBMSW & defaultRgbm, bool center, bool pivot) +inline void save( + YAML::Emitter & out, + const char * paramName, + const GradingRGBMSW & rgbm, + const GradingRGBMSW & defaultRgbm, + bool center, + bool pivot) { if (rgbm != defaultRgbm) { - std::vector vals{ rgbm.m_red, rgbm.m_green, rgbm.m_blue }; + std::vector vals{rgbm.m_red, rgbm.m_green, rgbm.m_blue}; out << YAML::Key << paramName; out << YAML::Value << YAML::Flow << YAML::BeginMap; out << YAML::Key << "rgb" << YAML::Value << YAML::Flow << vals; out << YAML::Key << "master" << YAML::Value << YAML::Flow << rgbm.m_master; - out << YAML::Key << (center ? "center" : "start") << YAML::Value << YAML::Flow + out << YAML::Key << (center ? "center" : "start") << YAML::Value << YAML::Flow << rgbm.m_start; out << YAML::Key << (pivot ? "pivot" : "width") << YAML::Value << YAML::Flow << rgbm.m_width; @@ -2205,11 +2274,12 @@ inline void save(YAML::Emitter & out, ConstGradingToneTransformRcPtr t) { out << YAML::VerbatimTag("GradingToneTransform"); - const auto style = t->getStyle(); + const auto style = t->getStyle(); const auto & vals = t->getValue(); const GradingTone defaultVals(style); - if (vals == defaultVals) out << YAML::Flow; + if (vals == defaultVals) + out << YAML::Flow; out << YAML::BeginMap; EmitTransformName(out, t->getFormatMetadata()); @@ -2229,10 +2299,10 @@ inline void save(YAML::Emitter & out, ConstGradingToneTransformRcPtr t) // GroupTransform -void load(const YAML::Node& node, TransformRcPtr& t); -void save(YAML::Emitter& out, ConstTransformRcPtr t, unsigned int majorVersion); +void load(const YAML::Node & node, TransformRcPtr & t); +void save(YAML::Emitter & out, ConstTransformRcPtr t, unsigned int majorVersion); -inline void load(const YAML::Node& node, GroupTransformRcPtr& t) +inline void load(const YAML::Node & node, GroupTransformRcPtr & t) { t = GroupTransform::Create(); @@ -2242,9 +2312,10 @@ inline void load(const YAML::Node& node, GroupTransformRcPtr& t) { const std::string & key = iter->first.as(); - if (iter->second.IsNull() || !iter->second.IsDefined()) continue; + if (iter->second.IsNull() || !iter->second.IsDefined()) + continue; - if(key == "children") + if (key == "children") { for (std::size_t i = 0; i < iter->second.size(); i++) { @@ -2255,22 +2326,24 @@ inline void load(const YAML::Node& node, GroupTransformRcPtr& t) // TODO: consider the forwards-compatibility implication of // throwing an exception. Should this be a warning, instead? - if(!childTransform) + if (!childTransform) { - throwValueError(node.Tag(), iter->first, - "Child transform could not be parsed."); + throwValueError( + node.Tag(), + iter->first, + "Child transform could not be parsed."); } t->appendTransform(childTransform); } } - else if(key == "direction") + else if (key == "direction") { TransformDirection val; load(iter->second, val); t->setDirection(val); } - else if(key == "name") + else if (key == "name") { std::string name; load(iter->second, name); @@ -2283,7 +2356,7 @@ inline void load(const YAML::Node& node, GroupTransformRcPtr& t) } } -inline void save(YAML::Emitter& out, ConstGroupTransformRcPtr t, unsigned int majorVersion) +inline void save(YAML::Emitter & out, ConstGroupTransformRcPtr t, unsigned int majorVersion) { out << YAML::VerbatimTag("GroupTransform"); out << YAML::BeginMap; @@ -2298,7 +2371,7 @@ inline void save(YAML::Emitter& out, ConstGroupTransformRcPtr t, unsigned int ma out << YAML::Value; out << YAML::BeginSeq; - for(int i = 0; i < t->getNumTransforms(); ++i) + for (int i = 0; i < t->getNumTransforms(); ++i) { save(out, t->getTransform(i), majorVersion); } @@ -2309,9 +2382,7 @@ inline void save(YAML::Emitter& out, ConstGroupTransformRcPtr t, unsigned int ma // LogAffineTransform -inline void loadLogParam(const YAML::Node & node, - double(¶m)[3], - const std::string & paramName) +inline void loadLogParam(const YAML::Node & node, double (¶m)[3], const std::string & paramName) { if (node.size() == 0) { @@ -2339,23 +2410,24 @@ inline void loadLogParam(const YAML::Node & node, } } -inline void load(const YAML::Node& node, LogAffineTransformRcPtr& t) +inline void load(const YAML::Node & node, LogAffineTransformRcPtr & t) { t = LogAffineTransform::Create(); CheckDuplicates(node); - double base = 2.0; - double logSlope[3] = { 1.0, 1.0, 1.0 }; - double linSlope[3] = { 1.0, 1.0, 1.0 }; - double linOffset[3] = { 0.0, 0.0, 0.0 }; - double logOffset[3] = { 0.0, 0.0, 0.0 }; + double base = 2.0; + double logSlope[3] = {1.0, 1.0, 1.0}; + double linSlope[3] = {1.0, 1.0, 1.0}; + double linOffset[3] = {0.0, 0.0, 0.0}; + double logOffset[3] = {0.0, 0.0, 0.0}; for (Iterator iter = node.begin(); iter != node.end(); ++iter) { const std::string & key = iter->first.as(); - if (iter->second.IsNull() || !iter->second.IsDefined()) continue; + if (iter->second.IsNull() || !iter->second.IsDefined()) + continue; if (key == "base") { @@ -2388,13 +2460,13 @@ inline void load(const YAML::Node& node, LogAffineTransformRcPtr& t) { loadLogParam(iter->second, logSlope, key); } - else if(key == "direction") + else if (key == "direction") { TransformDirection val; load(iter->second, val); t->setDirection(val); } - else if(key == "name") + else if (key == "name") { std::string name; load(iter->second, name); @@ -2412,8 +2484,11 @@ inline void load(const YAML::Node& node, LogAffineTransformRcPtr& t) t->setLogSideOffsetValue(logOffset); } -inline void saveLogParam(YAML::Emitter& out, const double(¶m)[3], - double defaultVal, const char * paramName) +inline void saveLogParam( + YAML::Emitter & out, + const double (¶m)[3], + double defaultVal, + const char * paramName) { // (See test in Config_test.cpp that verifies double precision is preserved.) if (param[0] == param[1] && param[0] == param[2]) @@ -2433,17 +2508,17 @@ inline void saveLogParam(YAML::Emitter& out, const double(¶m)[3], } } -inline void save(YAML::Emitter& out, ConstLogAffineTransformRcPtr t) +inline void save(YAML::Emitter & out, ConstLogAffineTransformRcPtr t) { out << YAML::VerbatimTag("LogAffineTransform"); out << YAML::Flow << YAML::BeginMap; EmitTransformName(out, t->getFormatMetadata()); - double logSlope[3] = { 1.0, 1.0, 1.0 }; - double linSlope[3] = { 1.0, 1.0, 1.0 }; - double linOffset[3] = { 0.0, 0.0, 0.0 }; - double logOffset[3] = { 0.0, 0.0, 0.0 }; + double logSlope[3] = {1.0, 1.0, 1.0}; + double linSlope[3] = {1.0, 1.0, 1.0}; + double linOffset[3] = {0.0, 0.0, 0.0}; + double logOffset[3] = {0.0, 0.0, 0.0}; t->getLogSideSlopeValue(logSlope); t->getLogSideOffsetValue(logOffset); t->getLinSideSlopeValue(linSlope); @@ -2467,25 +2542,26 @@ inline void save(YAML::Emitter& out, ConstLogAffineTransformRcPtr t) inline void load(const YAML::Node & node, LogCameraTransformRcPtr & t) { - double linBreak[3] = { 0.0, 0.0, 0.0 }; - t = LogCameraTransform::Create(linBreak); + double linBreak[3] = {0.0, 0.0, 0.0}; + t = LogCameraTransform::Create(linBreak); CheckDuplicates(node); - double base = 2.0; - double logSlope[3] = { 1.0, 1.0, 1.0 }; - double linSlope[3] = { 1.0, 1.0, 1.0 }; - double linOffset[3] = { 0.0, 0.0, 0.0 }; - double logOffset[3] = { 0.0, 0.0, 0.0 }; - double linearSlope[3] = { 1.0, 1.0, 1.0 }; - bool linBreakFound = false; + double base = 2.0; + double logSlope[3] = {1.0, 1.0, 1.0}; + double linSlope[3] = {1.0, 1.0, 1.0}; + double linOffset[3] = {0.0, 0.0, 0.0}; + double logOffset[3] = {0.0, 0.0, 0.0}; + double linearSlope[3] = {1.0, 1.0, 1.0}; + bool linBreakFound = false; bool linearSlopeFound = false; for (Iterator iter = node.begin(); iter != node.end(); ++iter) { const std::string & key = iter->first.as(); - if (iter->second.IsNull() || !iter->second.IsDefined()) continue; + if (iter->second.IsNull() || !iter->second.IsDefined()) + continue; if (key == "base") { @@ -2561,19 +2637,19 @@ inline void load(const YAML::Node & node, LogCameraTransformRcPtr & t) } } -inline void save(YAML::Emitter& out, ConstLogCameraTransformRcPtr t) +inline void save(YAML::Emitter & out, ConstLogCameraTransformRcPtr t) { out << YAML::VerbatimTag("LogCameraTransform"); out << YAML::Flow << YAML::BeginMap; EmitTransformName(out, t->getFormatMetadata()); - double logSlope[3] = { 1.0, 1.0, 1.0 }; - double linSlope[3] = { 1.0, 1.0, 1.0 }; - double linOffset[3] = { 0.0, 0.0, 0.0 }; - double logOffset[3] = { 0.0, 0.0, 0.0 }; - double linBreak[3] = { 0.0, 0.0, 0.0 }; - double linearSlope[3] = { 1.0, 1.0, 1.0 }; + double logSlope[3] = {1.0, 1.0, 1.0}; + double linSlope[3] = {1.0, 1.0, 1.0}; + double linOffset[3] = {0.0, 0.0, 0.0}; + double logOffset[3] = {0.0, 0.0, 0.0}; + double linBreak[3] = {0.0, 0.0, 0.0}; + double linearSlope[3] = {1.0, 1.0, 1.0}; t->getLogSideSlopeValue(logSlope); t->getLogSideOffsetValue(logOffset); t->getLinSideSlopeValue(linSlope); @@ -2602,7 +2678,7 @@ inline void save(YAML::Emitter& out, ConstLogCameraTransformRcPtr t) // LogTransform -inline void load(const YAML::Node& node, LogTransformRcPtr& t) +inline void load(const YAML::Node & node, LogTransformRcPtr & t) { t = LogTransform::Create(); @@ -2612,12 +2688,13 @@ inline void load(const YAML::Node& node, LogTransformRcPtr& t) { const std::string & key = iter->first.as(); - if (iter->second.IsNull() || !iter->second.IsDefined()) continue; + if (iter->second.IsNull() || !iter->second.IsDefined()) + continue; if (key == "base") { double base = 2.0; - size_t nb = iter->second.size(); + size_t nb = iter->second.size(); if (nb == 0) { load(iter->second, base); @@ -2650,7 +2727,7 @@ inline void load(const YAML::Node& node, LogTransformRcPtr& t) } } -inline void save(YAML::Emitter& out, ConstLogTransformRcPtr t, unsigned int majorVersion) +inline void save(YAML::Emitter & out, ConstLogTransformRcPtr t, unsigned int majorVersion) { out << YAML::VerbatimTag("LogTransform"); out << YAML::Flow << YAML::BeginMap; @@ -2671,7 +2748,7 @@ inline void save(YAML::Emitter& out, ConstLogTransformRcPtr t, unsigned int majo // LookTransform -inline void load(const YAML::Node& node, LookTransformRcPtr& t) +inline void load(const YAML::Node & node, LookTransformRcPtr & t) { t = LookTransform::Create(); @@ -2681,27 +2758,28 @@ inline void load(const YAML::Node& node, LookTransformRcPtr& t) { const std::string & key = iter->first.as(); - if (iter->second.IsNull() || !iter->second.IsDefined()) continue; + if (iter->second.IsNull() || !iter->second.IsDefined()) + continue; - if(key == "src") + if (key == "src") { std::string stringval; load(iter->second, stringval); t->setSrc(stringval.c_str()); } - else if(key == "dst") + else if (key == "dst") { std::string stringval; load(iter->second, stringval); t->setDst(stringval.c_str()); } - else if(key == "looks") + else if (key == "looks") { std::string stringval; load(iter->second, stringval); t->setLooks(stringval.c_str()); } - else if(key == "direction") + else if (key == "direction") { TransformDirection val; load(iter->second, val); @@ -2714,7 +2792,7 @@ inline void load(const YAML::Node& node, LookTransformRcPtr& t) } } -inline void save(YAML::Emitter& out, ConstLookTransformRcPtr t) +inline void save(YAML::Emitter & out, ConstLookTransformRcPtr t) { out << YAML::VerbatimTag("LookTransform"); out << YAML::Flow << YAML::BeginMap; @@ -2727,7 +2805,7 @@ inline void save(YAML::Emitter& out, ConstLookTransformRcPtr t) // MatrixTransform -inline void load(const YAML::Node& node, MatrixTransformRcPtr& t) +inline void load(const YAML::Node & node, MatrixTransformRcPtr & t) { t = MatrixTransform::Create(); @@ -2737,13 +2815,14 @@ inline void load(const YAML::Node& node, MatrixTransformRcPtr& t) { const std::string & key = iter->first.as(); - if (iter->second.IsNull() || !iter->second.IsDefined()) continue; + if (iter->second.IsNull() || !iter->second.IsDefined()) + continue; - if(key == "matrix") + if (key == "matrix") { std::vector val; load(iter->second, val); - if(val.size() != 16) + if (val.size() != 16) { std::ostringstream os; os << "'matrix' values must be 16 "; @@ -2752,11 +2831,11 @@ inline void load(const YAML::Node& node, MatrixTransformRcPtr& t) } t->setMatrix(&val[0]); } - else if(key == "offset") + else if (key == "offset") { std::vector val; load(iter->second, val); - if(val.size() != 4) + if (val.size() != 4) { std::ostringstream os; os << "'offset' values must be 4 "; @@ -2765,13 +2844,13 @@ inline void load(const YAML::Node& node, MatrixTransformRcPtr& t) } t->setOffset(&val[0]); } - else if(key == "direction") + else if (key == "direction") { TransformDirection val; load(iter->second, val); t->setDirection(val); } - else if(key == "name") + else if (key == "name") { std::string name; load(iter->second, name); @@ -2784,7 +2863,7 @@ inline void load(const YAML::Node& node, MatrixTransformRcPtr& t) } } -inline void save(YAML::Emitter& out, ConstMatrixTransformRcPtr t, unsigned int majorVersion) +inline void save(YAML::Emitter & out, ConstMatrixTransformRcPtr t, unsigned int majorVersion) { out << YAML::VerbatimTag("MatrixTransform"); out << YAML::Flow << YAML::BeginMap; @@ -2796,7 +2875,7 @@ inline void save(YAML::Emitter& out, ConstMatrixTransformRcPtr t, unsigned int m std::vector matrix(16, 0.0); t->getMatrix(&matrix[0]); - if(!IsM44Identity(&matrix[0])) + if (!IsM44Identity(&matrix[0])) { out << YAML::Key << "matrix"; out << YAML::Value << YAML::Flow << matrix; @@ -2804,7 +2883,7 @@ inline void save(YAML::Emitter& out, ConstMatrixTransformRcPtr t, unsigned int m std::vector offset(4, 0.0); t->getOffset(&offset[0]); - if(!IsVecEqualToZero(&offset[0],4)) + if (!IsVecEqualToZero(&offset[0], 4)) { out << YAML::Key << "offset"; out << YAML::Value << YAML::Flow << offset; @@ -2816,7 +2895,7 @@ inline void save(YAML::Emitter& out, ConstMatrixTransformRcPtr t, unsigned int m // RangeTransform -inline void load(const YAML::Node& node, RangeTransformRcPtr& t) +inline void load(const YAML::Node & node, RangeTransformRcPtr & t) { t = RangeTransform::Create(); @@ -2826,46 +2905,47 @@ inline void load(const YAML::Node& node, RangeTransformRcPtr& t) { const std::string & key = iter->first.as(); - if (iter->second.IsNull() || !iter->second.IsDefined()) continue; + if (iter->second.IsNull() || !iter->second.IsDefined()) + continue; double val = 0.0; // TODO: parsing could be more strict (same applies for other transforms) // Could enforce that second is 1 float only and that keys // are only there once. - if(key == "min_in_value") + if (key == "min_in_value") { load(iter->second, val); t->setMinInValue(val); } - else if(key == "max_in_value") + else if (key == "max_in_value") { load(iter->second, val); t->setMaxInValue(val); } - else if(key == "min_out_value") + else if (key == "min_out_value") { load(iter->second, val); t->setMinOutValue(val); } - else if(key == "max_out_value") + else if (key == "max_out_value") { load(iter->second, val); t->setMaxOutValue(val); } - else if(key == "style") + else if (key == "style") { std::string style; load(iter->second, style); t->setStyle(RangeStyleFromString(style.c_str())); } - else if(key == "direction") + else if (key == "direction") { TransformDirection dir; load(iter->second, dir); t->setDirection(dir); } - else if(key == "name") + else if (key == "name") { std::string name; load(iter->second, name); @@ -2878,38 +2958,38 @@ inline void load(const YAML::Node& node, RangeTransformRcPtr& t) } } -inline void save(YAML::Emitter& out, ConstRangeTransformRcPtr t) +inline void save(YAML::Emitter & out, ConstRangeTransformRcPtr t) { out << YAML::VerbatimTag("RangeTransform"); out << YAML::Flow << YAML::BeginMap; EmitTransformName(out, t->getFormatMetadata()); - if(t->hasMinInValue()) + if (t->hasMinInValue()) { out << YAML::Key << "min_in_value"; out << YAML::Value << YAML::Flow << t->getMinInValue(); } - if(t->hasMaxInValue()) + if (t->hasMaxInValue()) { out << YAML::Key << "max_in_value"; out << YAML::Value << YAML::Flow << t->getMaxInValue(); } - if(t->hasMinOutValue()) + if (t->hasMinOutValue()) { out << YAML::Key << "min_out_value"; out << YAML::Value << YAML::Flow << t->getMinOutValue(); } - if(t->hasMaxOutValue()) + if (t->hasMaxOutValue()) { out << YAML::Key << "max_out_value"; out << YAML::Value << YAML::Flow << t->getMaxOutValue(); } - if(t->getStyle()!=RANGE_CLAMP) + if (t->getStyle() != RANGE_CLAMP) { out << YAML::Key << "style"; out << YAML::Value << YAML::Flow << RangeStyleToString(t->getStyle()); @@ -2921,38 +3001,37 @@ inline void save(YAML::Emitter& out, ConstRangeTransformRcPtr t) // Transform -void load(const YAML::Node& node, TransformRcPtr& t) +void load(const YAML::Node & node, TransformRcPtr & t) { - if(node.Type() != YAML::NodeType::Map) + if (node.Type() != YAML::NodeType::Map) { std::ostringstream os; - os << "Unsupported Transform type encountered: (" - << node.Type() << ") in OCIO profile. " - << "Only Mapping types supported."; + os << "Unsupported Transform type encountered: (" << node.Type() << ") in OCIO profile. " + << "Only Mapping types supported."; throwError(node, os.str()); } std::string type = node.Tag(); - if(type == "AllocationTransform") + if (type == "AllocationTransform") { AllocationTransformRcPtr temp; load(node, temp); t = temp; } - else if(type == "BuiltinTransform") + else if (type == "BuiltinTransform") { BuiltinTransformRcPtr temp; load(node, temp); t = temp; } - else if(type == "CDLTransform") + else if (type == "CDLTransform") { CDLTransformRcPtr temp; load(node, temp); t = temp; } - else if(type == "ColorSpaceTransform") + else if (type == "ColorSpaceTransform") { ColorSpaceTransformRcPtr temp; load(node, temp); @@ -2964,7 +3043,7 @@ void load(const YAML::Node& node, TransformRcPtr& t) load(node, temp); t = temp; } - else if(type == "ExponentTransform") + else if (type == "ExponentTransform") { ExponentTransformRcPtr temp; load(node, temp); @@ -2982,13 +3061,13 @@ void load(const YAML::Node& node, TransformRcPtr& t) load(node, temp); t = temp; } - else if(type == "FileTransform") + else if (type == "FileTransform") { FileTransformRcPtr temp; load(node, temp); t = temp; } - else if(type == "FixedFunctionTransform") + else if (type == "FixedFunctionTransform") { FixedFunctionTransformRcPtr temp; load(node, temp); @@ -3018,7 +3097,7 @@ void load(const YAML::Node& node, TransformRcPtr& t) load(node, temp); t = temp; } - else if(type == "LogAffineTransform") + else if (type == "LogAffineTransform") { LogAffineTransformRcPtr temp; load(node, temp); @@ -3030,25 +3109,25 @@ void load(const YAML::Node& node, TransformRcPtr& t) load(node, temp); t = temp; } - else if(type == "LogTransform") + else if (type == "LogTransform") { LogTransformRcPtr temp; load(node, temp); t = temp; } - else if(type == "LookTransform") + else if (type == "LookTransform") { LookTransformRcPtr temp; load(node, temp); t = temp; } - else if(type == "MatrixTransform") + else if (type == "MatrixTransform") { MatrixTransformRcPtr temp; load(node, temp); t = temp; } - else if(type == "RangeTransform") + else if (type == "RangeTransform") { RangeTransformRcPtr temp; load(node, temp); @@ -3072,67 +3151,61 @@ void load(const YAML::Node& node, TransformRcPtr& t) } } -void save(YAML::Emitter& out, ConstTransformRcPtr t, unsigned int majorVersion) +void save(YAML::Emitter & out, ConstTransformRcPtr t, unsigned int majorVersion) { - if(ConstAllocationTransformRcPtr Allocation_tran = \ - DynamicPtrCast(t)) + if (ConstAllocationTransformRcPtr Allocation_tran + = DynamicPtrCast(t)) save(out, Allocation_tran); - else if (ConstBuiltinTransformRcPtr builtin_tran = \ - DynamicPtrCast(t)) + else if (ConstBuiltinTransformRcPtr builtin_tran = DynamicPtrCast(t)) save(out, builtin_tran); - else if(ConstCDLTransformRcPtr CDL_tran = \ - DynamicPtrCast(t)) + else if (ConstCDLTransformRcPtr CDL_tran = DynamicPtrCast(t)) save(out, CDL_tran, majorVersion); - else if(ConstColorSpaceTransformRcPtr ColorSpace_tran = \ - DynamicPtrCast(t)) + else if ( + ConstColorSpaceTransformRcPtr ColorSpace_tran + = DynamicPtrCast(t)) save(out, ColorSpace_tran); - else if (ConstDisplayViewTransformRcPtr Display_tran = \ - DynamicPtrCast(t)) + else if ( + ConstDisplayViewTransformRcPtr Display_tran = DynamicPtrCast(t)) save(out, Display_tran); - else if(ConstExponentTransformRcPtr Exponent_tran = \ - DynamicPtrCast(t)) + else if (ConstExponentTransformRcPtr Exponent_tran = DynamicPtrCast(t)) save(out, Exponent_tran, majorVersion); - else if (ConstExponentWithLinearTransformRcPtr ExpLinear_tran = \ - DynamicPtrCast(t)) + else if ( + ConstExponentWithLinearTransformRcPtr ExpLinear_tran + = DynamicPtrCast(t)) save(out, ExpLinear_tran); - else if(ConstFileTransformRcPtr File_tran = \ - DynamicPtrCast(t)) + else if (ConstFileTransformRcPtr File_tran = DynamicPtrCast(t)) save(out, File_tran, majorVersion); - else if (ConstExposureContrastTransformRcPtr File_tran = \ - DynamicPtrCast(t)) + else if ( + ConstExposureContrastTransformRcPtr File_tran + = DynamicPtrCast(t)) save(out, File_tran); - else if(ConstFixedFunctionTransformRcPtr Func_tran = \ - DynamicPtrCast(t)) + else if ( + ConstFixedFunctionTransformRcPtr Func_tran + = DynamicPtrCast(t)) save(out, Func_tran); - else if (ConstGradingPrimaryTransformRcPtr GP_tran = \ - DynamicPtrCast(t)) + else if ( + ConstGradingPrimaryTransformRcPtr GP_tran + = DynamicPtrCast(t)) save(out, GP_tran); - else if (ConstGradingRGBCurveTransformRcPtr GC_tran = \ - DynamicPtrCast(t)) + else if ( + ConstGradingRGBCurveTransformRcPtr GC_tran + = DynamicPtrCast(t)) save(out, GC_tran); - else if (ConstGradingToneTransformRcPtr GT_tran = \ - DynamicPtrCast(t)) + else if (ConstGradingToneTransformRcPtr GT_tran = DynamicPtrCast(t)) save(out, GT_tran); - else if(ConstGroupTransformRcPtr Group_tran = \ - DynamicPtrCast(t)) + else if (ConstGroupTransformRcPtr Group_tran = DynamicPtrCast(t)) save(out, Group_tran, majorVersion); - else if(ConstLogAffineTransformRcPtr Log_tran = \ - DynamicPtrCast(t)) + else if (ConstLogAffineTransformRcPtr Log_tran = DynamicPtrCast(t)) save(out, Log_tran); - else if (ConstLogCameraTransformRcPtr Log_tran = \ - DynamicPtrCast(t)) + else if (ConstLogCameraTransformRcPtr Log_tran = DynamicPtrCast(t)) save(out, Log_tran); - else if(ConstLogTransformRcPtr Log_tran = \ - DynamicPtrCast(t)) + else if (ConstLogTransformRcPtr Log_tran = DynamicPtrCast(t)) save(out, Log_tran, majorVersion); - else if(ConstLookTransformRcPtr Look_tran = \ - DynamicPtrCast(t)) + else if (ConstLookTransformRcPtr Look_tran = DynamicPtrCast(t)) save(out, Look_tran); - else if(ConstMatrixTransformRcPtr Matrix_tran = \ - DynamicPtrCast(t)) + else if (ConstMatrixTransformRcPtr Matrix_tran = DynamicPtrCast(t)) save(out, Matrix_tran, majorVersion); - else if(ConstRangeTransformRcPtr Range_tran = \ - DynamicPtrCast(t)) + else if (ConstRangeTransformRcPtr Range_tran = DynamicPtrCast(t)) save(out, Range_tran); else throw Exception("Unsupported Transform() type for serialization."); @@ -3140,12 +3213,12 @@ void save(YAML::Emitter& out, ConstTransformRcPtr t, unsigned int majorVersion) // ColorSpace -inline void load(const YAML::Node& node, ColorSpaceRcPtr& cs, unsigned int majorVersion) +inline void load(const YAML::Node & node, ColorSpaceRcPtr & cs, unsigned int majorVersion) { - if(node.Tag() != "ColorSpace") + if (node.Tag() != "ColorSpace") return; // not a ! tag - if(node.Type() != YAML::NodeType::Map) + if (node.Type() != YAML::NodeType::Map) { std::ostringstream os; os << "The '!' content needs to be a map."; @@ -3161,9 +3234,10 @@ inline void load(const YAML::Node& node, ColorSpaceRcPtr& cs, unsigned int major { const std::string & key = iter->first.as(); - if (iter->second.IsNull() || !iter->second.IsDefined()) continue; + if (iter->second.IsNull() || !iter->second.IsDefined()) + continue; - if(key == "name") + if (key == "name") { load(iter->second, stringval); cs->setName(stringval.c_str()); @@ -3177,37 +3251,37 @@ inline void load(const YAML::Node& node, ColorSpaceRcPtr& cs, unsigned int major cs->addAlias(alias.c_str()); } } - else if(key == "description") + else if (key == "description") { loadDescription(iter->second, stringval); cs->setDescription(stringval.c_str()); } - else if(key == "family") + else if (key == "family") { load(iter->second, stringval); cs->setFamily(stringval.c_str()); } - else if(key == "equalitygroup") + else if (key == "equalitygroup") { load(iter->second, stringval); cs->setEqualityGroup(stringval.c_str()); } - else if(key == "bitdepth") + else if (key == "bitdepth") { BitDepth ret; load(iter->second, ret); cs->setBitDepth(ret); } - else if(key == "isdata") + else if (key == "isdata") { load(iter->second, boolval); cs->setIsData(boolval); } - else if(key == "categories") + else if (key == "categories") { StringUtils::StringVec categories; load(iter->second, categories); - for(auto name : categories) + for (auto name : categories) { cs->addCategory(name.c_str()); } @@ -3217,25 +3291,27 @@ inline void load(const YAML::Node& node, ColorSpaceRcPtr& cs, unsigned int major load(iter->second, stringval); cs->setEncoding(stringval.c_str()); } - else if(key == "allocation") + else if (key == "allocation") { Allocation val; load(iter->second, val); cs->setAllocation(val); } - else if(key == "allocationvars") + else if (key == "allocationvars") { std::vector val; load(iter->second, val); - if(!val.empty()) + if (!val.empty()) cs->setAllocationVars(static_cast(val.size()), &val[0]); } - else if(key == "to_reference" || (majorVersion >= 2 && key == "to_scene_reference")) + else if (key == "to_reference" || (majorVersion >= 2 && key == "to_scene_reference")) { if (cs->getReferenceSpaceType() == REFERENCE_SPACE_DISPLAY) { - throwError(node, "'to_reference' or 'to_scene_reference' cannot be used for a " - "display color space."); + throwError( + node, + "'to_reference' or 'to_scene_reference' cannot be used for a " + "display color space."); } TransformRcPtr val; load(iter->second, val); @@ -3245,19 +3321,23 @@ inline void load(const YAML::Node& node, ColorSpaceRcPtr& cs, unsigned int major { if (cs->getReferenceSpaceType() == REFERENCE_SPACE_SCENE) { - throwError(node, "'to_display_reference' cannot be used for a " - "non-display color space."); + throwError( + node, + "'to_display_reference' cannot be used for a " + "non-display color space."); } TransformRcPtr val; load(iter->second, val); cs->setTransform(val, COLORSPACE_DIR_TO_REFERENCE); } - else if(key == "from_reference" || (majorVersion >= 2 && key == "from_scene_reference")) + else if (key == "from_reference" || (majorVersion >= 2 && key == "from_scene_reference")) { if (cs->getReferenceSpaceType() == REFERENCE_SPACE_DISPLAY) { - throwError(node, "'from_reference' or 'from_scene_reference' cannot be used for " - "a display color space."); + throwError( + node, + "'from_reference' or 'from_scene_reference' cannot be used for " + "a display color space."); } TransformRcPtr val; load(iter->second, val); @@ -3267,8 +3347,10 @@ inline void load(const YAML::Node& node, ColorSpaceRcPtr& cs, unsigned int major { if (cs->getReferenceSpaceType() == REFERENCE_SPACE_SCENE) { - throwError(node, "'from_display_reference' cannot be used for a " - "non-display color space."); + throwError( + node, + "'from_display_reference' cannot be used for a " + "non-display color space."); } TransformRcPtr val; load(iter->second, val); @@ -3281,7 +3363,7 @@ inline void load(const YAML::Node& node, ColorSpaceRcPtr& cs, unsigned int major } } -inline void save(YAML::Emitter& out, ConstColorSpaceRcPtr cs, unsigned int majorVersion) +inline void save(YAML::Emitter & out, ConstColorSpaceRcPtr cs, unsigned int majorVersion) { out << YAML::VerbatimTag("ColorSpace"); out << YAML::BeginMap; @@ -3305,10 +3387,10 @@ inline void save(YAML::Emitter& out, ConstColorSpaceRcPtr cs, unsigned int major saveDescription(out, cs->getDescription()); out << YAML::Key << "isdata" << YAML::Value << cs->isData(); - if(cs->getNumCategories() > 0) + if (cs->getNumCategories() > 0) { StringUtils::StringVec categories; - for(int idx=0; idxgetNumCategories(); ++idx) + for (int idx = 0; idx < cs->getNumCategories(); ++idx) { categories.push_back(cs->getCategory(idx)); } @@ -3316,7 +3398,7 @@ inline void save(YAML::Emitter& out, ConstColorSpaceRcPtr cs, unsigned int major out << YAML::Flow << YAML::Value << categories; } - const std::string is{ cs->getEncoding() }; + const std::string is{cs->getEncoding()}; if (!is.empty()) { out << YAML::Key << "encoding"; @@ -3325,7 +3407,7 @@ inline void save(YAML::Emitter& out, ConstColorSpaceRcPtr cs, unsigned int major out << YAML::Key << "allocation" << YAML::Value; save(out, cs->getAllocation()); - if(cs->getAllocationNumVars() > 0) + if (cs->getAllocationNumVars() > 0) { std::vector allocationvars(cs->getAllocationNumVars()); cs->getAllocationVars(&allocationvars[0]); @@ -3333,22 +3415,26 @@ inline void save(YAML::Emitter& out, ConstColorSpaceRcPtr cs, unsigned int major out << YAML::Flow << YAML::Value << allocationvars; } - const auto isDisplay = (cs->getReferenceSpaceType() == REFERENCE_SPACE_DISPLAY); + const auto isDisplay = (cs->getReferenceSpaceType() == REFERENCE_SPACE_DISPLAY); ConstTransformRcPtr toref = cs->getTransform(COLORSPACE_DIR_TO_REFERENCE); - if(toref) + if (toref) { - out << YAML::Key << (isDisplay ? "to_display_reference" : - (majorVersion < 2) ? "to_reference" : - "to_scene_reference") << YAML::Value; + out << YAML::Key + << (isDisplay ? "to_display_reference" + : (majorVersion < 2) ? "to_reference" + : "to_scene_reference") + << YAML::Value; save(out, toref, majorVersion); } ConstTransformRcPtr fromref = cs->getTransform(COLORSPACE_DIR_FROM_REFERENCE); - if(fromref) + if (fromref) { - out << YAML::Key << (isDisplay ? "from_display_reference" : - (majorVersion < 2) ? "from_reference" : - "from_scene_reference") << YAML::Value; + out << YAML::Key + << (isDisplay ? "from_display_reference" + : (majorVersion < 2) ? "from_reference" + : "from_scene_reference") + << YAML::Value; save(out, fromref, majorVersion); } @@ -3358,9 +3444,9 @@ inline void save(YAML::Emitter& out, ConstColorSpaceRcPtr cs, unsigned int major // Look -inline void load(const YAML::Node& node, LookRcPtr& look) +inline void load(const YAML::Node & node, LookRcPtr & look) { - if(node.Tag() != "Look") + if (node.Tag() != "Look") return; CheckDuplicates(node); @@ -3369,33 +3455,34 @@ inline void load(const YAML::Node& node, LookRcPtr& look) { const std::string & key = iter->first.as(); - if (iter->second.IsNull() || !iter->second.IsDefined()) continue; + if (iter->second.IsNull() || !iter->second.IsDefined()) + continue; - if(key == "name") + if (key == "name") { std::string stringval; load(iter->second, stringval); look->setName(stringval.c_str()); } - else if(key == "process_space") + else if (key == "process_space") { std::string stringval; load(iter->second, stringval); look->setProcessSpace(stringval.c_str()); } - else if(key == "transform") + else if (key == "transform") { TransformRcPtr val; load(iter->second, val); look->setTransform(val); } - else if(key == "inverse_transform") + else if (key == "inverse_transform") { TransformRcPtr val; load(iter->second, val); look->setInverseTransform(val); } - else if(key == "description") + else if (key == "description") { std::string stringval; loadDescription(iter->second, stringval); @@ -3408,7 +3495,7 @@ inline void load(const YAML::Node& node, LookRcPtr& look) } } -inline void save(YAML::Emitter& out, ConstLookRcPtr look, unsigned int majorVersion) +inline void save(YAML::Emitter & out, ConstLookRcPtr look, unsigned int majorVersion) { out << YAML::VerbatimTag("Look"); out << YAML::BeginMap; @@ -3416,14 +3503,14 @@ inline void save(YAML::Emitter& out, ConstLookRcPtr look, unsigned int majorVers out << YAML::Key << "process_space" << YAML::Value << look->getProcessSpace(); saveDescription(out, look->getDescription()); - if(look->getTransform()) + if (look->getTransform()) { out << YAML::Key << "transform"; out << YAML::Value; save(out, look->getTransform(), majorVersion); } - if(look->getInverseTransform()) + if (look->getInverseTransform()) { out << YAML::Key << "inverse_transform"; out << YAML::Value; @@ -3443,14 +3530,15 @@ inline ReferenceSpaceType peekViewTransformReferenceSpace(const YAML::Node & nod throwError(node, "The '!' content needs to be a map."); } - bool isScene = false; + bool isScene = false; bool isDisplay = false; for (Iterator iter = node.begin(); iter != node.end(); ++iter) { const std::string & key = iter->first.as(); - if (iter->second.IsNull() || !iter->second.IsDefined()) continue; + if (iter->second.IsNull() || !iter->second.IsDefined()) + continue; if (key == "to_scene_reference") { @@ -3476,8 +3564,10 @@ inline ReferenceSpaceType peekViewTransformReferenceSpace(const YAML::Node & nod } else if (isScene && isDisplay) { - throwError(node, "The '!' cannot have both to/from_reference and " - "to/from_display_reference transforms."); + throwError( + node, + "The '!' cannot have both to/from_reference and " + "to/from_display_reference transforms."); } return isDisplay ? REFERENCE_SPACE_DISPLAY : REFERENCE_SPACE_SCENE; @@ -3496,14 +3586,15 @@ inline void load(const YAML::Node & node, ViewTransformRcPtr & vt) os << "The '!' content needs to be a map."; throwError(node, os.str()); } - + CheckDuplicates(node); for (Iterator iter = node.begin(); iter != node.end(); ++iter) { const std::string & key = iter->first.as(); - if (iter->second.IsNull() || !iter->second.IsDefined()) continue; + if (iter->second.IsNull() || !iter->second.IsDefined()) + continue; if (key == "name") { @@ -3587,18 +3678,20 @@ inline void save(YAML::Emitter & out, ConstViewTransformRcPtr & vt, unsigned int out << YAML::Flow << YAML::Value << categories; } - const auto isDisplay = (vt->getReferenceSpaceType() == REFERENCE_SPACE_DISPLAY); + const auto isDisplay = (vt->getReferenceSpaceType() == REFERENCE_SPACE_DISPLAY); ConstTransformRcPtr toref = vt->getTransform(VIEWTRANSFORM_DIR_TO_REFERENCE); if (toref) { - out << YAML::Key << (isDisplay ? "to_display_reference" : "to_scene_reference") << YAML::Value; + out << YAML::Key << (isDisplay ? "to_display_reference" : "to_scene_reference") + << YAML::Value; save(out, toref, majorVersion); } ConstTransformRcPtr fromref = vt->getTransform(VIEWTRANSFORM_DIR_FROM_REFERENCE); if (fromref) { - out << YAML::Key << (isDisplay ? "from_display_reference" : "from_scene_reference") << YAML::Value; + out << YAML::Key << (isDisplay ? "from_display_reference" : "from_scene_reference") + << YAML::Value; save(out, fromref, majorVersion); } @@ -3630,7 +3723,8 @@ inline void load(const YAML::Node & node, NamedTransformRcPtr & nt) { const std::string & key = iter->first.as(); - if (iter->second.IsNull() || !iter->second.IsDefined()) continue; + if (iter->second.IsNull() || !iter->second.IsDefined()) + continue; if (key == "name") { @@ -3758,7 +3852,7 @@ struct CustomKeysLoader StringUtils::StringVec m_keyVals; }; -inline void loadCustomKeys(const YAML::Node& node, CustomKeysLoader & ck) +inline void loadCustomKeys(const YAML::Node & node, CustomKeysLoader & ck) { if (node.Type() == YAML::NodeType::Map) { @@ -3792,7 +3886,8 @@ inline void load(const YAML::Node & node, FileRulesRcPtr & fr, bool & defaultRul { const std::string & key = iter->first.as(); - if (iter->second.IsNull() || !iter->second.IsDefined()) continue; + if (iter->second.IsNull() || !iter->second.IsDefined()) + continue; if (key == FileRuleUtils::Name) { @@ -3834,7 +3929,7 @@ inline void load(const YAML::Node & node, FileRulesRcPtr & fr, bool & defaultRul try { const auto pos = fr->getNumEntries() - 1; - if (0==Platform::Strcasecmp(name.c_str(), FileRules::DefaultRuleName)) + if (0 == Platform::Strcasecmp(name.c_str(), FileRules::DefaultRuleName)) { if (!regex.empty() || !pattern.empty() || !extension.empty()) { @@ -3855,7 +3950,7 @@ inline void load(const YAML::Node & node, FileRulesRcPtr & fr, bool & defaultRul defaultRuleFound = true; fr->setColorSpace(pos, colorspace.c_str()); } - else if (0==Platform::Strcasecmp(name.c_str(), FileRules::FilePathSearchRuleName)) + else if (0 == Platform::Strcasecmp(name.c_str(), FileRules::FilePathSearchRuleName)) { if (!regex.empty() || !pattern.empty() || !extension.empty()) { @@ -3875,7 +3970,7 @@ inline void load(const YAML::Node & node, FileRulesRcPtr & fr, bool & defaultRul << "pattern & extension '" << pattern << "' '" << extension << "'."; throw Exception(oss.str().c_str()); } - + if (colorspace.empty()) { std::ostringstream oss; @@ -3885,8 +3980,12 @@ inline void load(const YAML::Node & node, FileRulesRcPtr & fr, bool & defaultRul if (regex.empty()) { - fr->insertRule(pos, name.c_str(), colorspace.c_str(), - pattern.c_str(), extension.c_str()); + fr->insertRule( + pos, + name.c_str(), + colorspace.c_str(), + pattern.c_str(), + extension.c_str()); } else { @@ -3913,22 +4012,22 @@ inline void save(YAML::Emitter & out, ConstFileRulesRcPtr & fr, size_t position) out << YAML::Flow; out << YAML::BeginMap; out << YAML::Key << FileRuleUtils::Name << YAML::Value << fr->getName(position); - const char * cs{ fr->getColorSpace(position) }; + const char * cs{fr->getColorSpace(position)}; if (cs && *cs) { out << YAML::Key << FileRuleUtils::ColorSpace << YAML::Value << std::string(cs); } - const char * regex{ fr->getRegex(position) }; + const char * regex{fr->getRegex(position)}; if (regex && *regex) { out << YAML::Key << FileRuleUtils::Regex << YAML::Value << std::string(regex); } - const char * pattern{ fr->getPattern(position) }; + const char * pattern{fr->getPattern(position)}; if (pattern && *pattern) { out << YAML::Key << FileRuleUtils::Pattern << YAML::Value << std::string(pattern); } - const char * extension{ fr->getExtension(position) }; + const char * extension{fr->getExtension(position)}; if (extension && *extension) { out << YAML::Key << FileRuleUtils::Extension << YAML::Value << std::string(extension); @@ -3942,8 +4041,8 @@ inline void save(YAML::Emitter & out, ConstFileRulesRcPtr & fr, size_t position) for (size_t i = 0; i < numKeys; ++i) { - out << YAML::Key << fr->getCustomKeyName(position, i) - << YAML::Value << fr->getCustomKeyValue(position, i); + out << YAML::Key << fr->getCustomKeyName(position, i) << YAML::Value + << fr->getCustomKeyValue(position, i); } out << YAML::EndMap; } @@ -3966,7 +4065,8 @@ inline void load(const YAML::Node & node, ViewingRulesRcPtr & vr) { const std::string & key = iter->first.as(); - if (iter->second.IsNull() || !iter->second.IsDefined()) continue; + if (iter->second.IsNull() || !iter->second.IsDefined()) + continue; if (key == ViewingRuleUtils::Name) { @@ -4086,18 +4186,17 @@ inline void save(YAML::Emitter & out, ConstViewingRulesRcPtr & vr, size_t positi for (size_t i = 0; i < numKeys; ++i) { - out << YAML::Key << vr->getCustomKeyName(position, i) - << YAML::Value << vr->getCustomKeyValue(position, i); + out << YAML::Key << vr->getCustomKeyName(position, i) << YAML::Value + << vr->getCustomKeyValue(position, i); } out << YAML::EndMap; } out << YAML::EndMap; } - // Config -inline void load(const YAML::Node& node, ConfigRcPtr & config, const char* filename) +inline void load(const YAML::Node & node, ConfigRcPtr & config, const char * filename) { // check profile version @@ -4107,20 +4206,20 @@ inline void load(const YAML::Node& node, ConfigRcPtr & config, const char* filen bool faulty_version = !node["ocio_profile_version"].IsDefined(); std::string version; - std::vector< std::string > results; + std::vector results; - if(!faulty_version) + if (!faulty_version) { load(node["ocio_profile_version"], version); results = StringUtils::Split(version, '.'); - if(results.size()==1) + if (results.size() == 1) { profile_major_version = std::stoi(results[0].c_str()); profile_minor_version = 0; } - else if(results.size()==2) + else if (results.size() == 2) { profile_major_version = std::stoi(results[0].c_str()); profile_minor_version = std::stoi(results[1].c_str()); @@ -4131,36 +4230,34 @@ inline void load(const YAML::Node& node, ConfigRcPtr & config, const char* filen } } - if(faulty_version) + if (faulty_version) { std::ostringstream os; os << "The specified OCIO configuration file " - << ((filename && *filename) ? filename : "") - << " does not appear to have a valid version " - << (version.empty() ? "" : version) - << "."; + << ((filename && *filename) ? filename : "") + << " does not appear to have a valid version " << (version.empty() ? "" : version) + << "."; throwError(node, os.str()); } try { - config->setVersion((unsigned int)profile_major_version, - (unsigned int)profile_minor_version); + config->setVersion( + (unsigned int)profile_major_version, + (unsigned int)profile_minor_version); } - catch(Exception & ex) + catch (Exception & ex) { std::ostringstream os; os << "This .ocio config "; - if(filename && *filename) + if (filename && *filename) { os << " '" << filename << "' "; } - os << "is version " << profile_major_version - << "." << profile_minor_version - << ". "; + os << "is version " << profile_major_version << "." << profile_minor_version << ". "; os << "This version of the OpenColorIO library (" << GetVersion() << ") "; os << "is not able to load that config version."; @@ -4169,30 +4266,35 @@ inline void load(const YAML::Node& node, ConfigRcPtr & config, const char* filen throw Exception(os.str().c_str()); } - bool fileRulesFound = false; + bool fileRulesFound = false; bool defaultFileRuleFound = false; - auto fileRules = config->getFileRules()->createEditableCopy(); + auto fileRules = config->getFileRules()->createEditableCopy(); CheckDuplicates(node); std::string stringval; - bool boolval = false; + bool boolval = false; EnvironmentMode mode = ENV_ENVIRONMENT_LOAD_ALL; for (Iterator iter = node.begin(); iter != node.end(); ++iter) { const std::string & key = iter->first.as(); - if (iter->second.IsNull() || !iter->second.IsDefined()) continue; + if (iter->second.IsNull() || !iter->second.IsDefined()) + continue; - if(key == "ocio_profile_version") { } // Already handled above. - else if(key == "environment") + if (key == "ocio_profile_version") + { + } // Already handled above. + else if (key == "environment") { mode = ENV_ENVIRONMENT_LOAD_PREDEFINED; - if(iter->second.Type() != YAML::NodeType::Map) + if (iter->second.Type() != YAML::NodeType::Map) { - throwValueError(node.Tag(), iter->first, - "The value type of key 'environment' needs to be a map."); + throwValueError( + node.Tag(), + iter->first, + "The value type of key 'environment' needs to be a map."); } for (Iterator it = iter->second.begin(); it != iter->second.end(); ++it) { @@ -4201,7 +4303,7 @@ inline void load(const YAML::Node& node, ConfigRcPtr & config, const char* filen config->addEnvironmentVar(k.c_str(), v.c_str()); } } - else if(key == "search_path" || key == "resource_path") + else if (key == "search_path" || key == "resource_path") { if (iter->second.size() == 0) { @@ -4218,7 +4320,7 @@ inline void load(const YAML::Node& node, ConfigRcPtr & config, const char* filen } } } - else if(key == "strictparsing") + else if (key == "strictparsing") { load(iter->second, boolval); config->setStrictParsingEnabled(boolval); @@ -4228,7 +4330,7 @@ inline void load(const YAML::Node& node, ConfigRcPtr & config, const char* filen loadDescription(iter->second, stringval); config->setName(stringval.c_str()); } - else if (key=="family_separator") + else if (key == "family_separator") { // Check that the key is not present in a v1 config (checkVersionConsistency is not // able to detect this). @@ -4238,7 +4340,7 @@ inline void load(const YAML::Node& node, ConfigRcPtr & config, const char* filen } load(iter->second, stringval); - if(stringval.size()!=1) + if (stringval.size() != 1) { std::ostringstream os; os << "'family_separator' value must be a single character."; @@ -4247,16 +4349,16 @@ inline void load(const YAML::Node& node, ConfigRcPtr & config, const char* filen } config->setFamilySeparator(stringval[0]); } - else if(key == "description") + else if (key == "description") { loadDescription(iter->second, stringval); config->setDescription(stringval.c_str()); } - else if(key == "luma") + else if (key == "luma") { std::vector val; load(iter->second, val); - if(val.size() != 3) + if (val.size() != 3) { std::ostringstream os; os << "'luma' values must be 3 "; @@ -4265,12 +4367,14 @@ inline void load(const YAML::Node& node, ConfigRcPtr & config, const char* filen } config->setDefaultLumaCoefs(&val[0]); } - else if(key == "roles") + else if (key == "roles") { - if(iter->second.Type() != YAML::NodeType::Map) + if (iter->second.Type() != YAML::NodeType::Map) { - throwValueError(node.Tag(), iter->first, - "The value type of the key 'roles' needs to be a map."); + throwValueError( + node.Tag(), + iter->first, + "The value type of the key 'roles' needs to be a map."); } for (Iterator it = iter->second.begin(); it != iter->second.end(); ++it) { @@ -4301,8 +4405,10 @@ inline void load(const YAML::Node& node, ConfigRcPtr & config, const char* filen { if (defaultFileRuleFound) { - throwError(iter->second, "The 'file_rules' Default rule has to be " - "the last rule."); + throwError( + iter->second, + "The 'file_rules' Default rule has to be " + "the last rule."); } load(val, fileRules, defaultFileRuleFound); } @@ -4325,7 +4431,9 @@ inline void load(const YAML::Node& node, ConfigRcPtr & config, const char* filen { if (iter->second.Type() != YAML::NodeType::Sequence) { - throwError(iter->second, "The 'viewing_rules' field needs to be a (- !) list."); + throwError( + iter->second, + "The 'viewing_rules' field needs to be a (- !) list."); } auto viewingRules = ViewingRules::Create(); @@ -4362,18 +4470,23 @@ inline void load(const YAML::Node& node, ConfigRcPtr & config, const char* filen View view; load(val, view); - config->addSharedView(view.m_name.c_str(), - view.m_viewTransform.c_str(), view.m_colorspace.c_str(), - view.m_looks.c_str(), view.m_rule.c_str(), - view.m_description.c_str()); + config->addSharedView( + view.m_name.c_str(), + view.m_viewTransform.c_str(), + view.m_colorspace.c_str(), + view.m_looks.c_str(), + view.m_rule.c_str(), + view.m_description.c_str()); } } else if (key == "displays") { - if(iter->second.Type() != YAML::NodeType::Map) + if (iter->second.Type() != YAML::NodeType::Map) { - throwValueError(node.Tag(), iter->first, - "The value type of the key 'displays' needs to be a map."); + throwValueError( + node.Tag(), + iter->first, + "The value type of the key 'displays' needs to be a map."); } for (Iterator it = iter->second.begin(); it != iter->second.end(); ++it) { @@ -4392,10 +4505,14 @@ inline void load(const YAML::Node& node, ConfigRcPtr & config, const char* filen { View view; load(node, view); - config->addDisplayView(display.c_str(), view.m_name.c_str(), - view.m_viewTransform.c_str(), view.m_colorspace.c_str(), - view.m_looks.c_str(), view.m_rule.c_str(), - view.m_description.c_str()); + config->addDisplayView( + display.c_str(), + view.m_name.c_str(), + view.m_viewTransform.c_str(), + view.m_colorspace.c_str(), + view.m_looks.c_str(), + view.m_rule.c_str(), + view.m_description.c_str()); } else if (node.Tag() == "Views") { @@ -4424,12 +4541,13 @@ inline void load(const YAML::Node& node, ConfigRcPtr & config, const char* filen { View view; load(val, view); - config->addVirtualDisplayView(view.m_name.c_str(), - view.m_viewTransform.c_str(), - view.m_colorspace.c_str(), - view.m_looks.c_str(), - view.m_rule.c_str(), - view.m_description.c_str()); + config->addVirtualDisplayView( + view.m_name.c_str(), + view.m_viewTransform.c_str(), + view.m_colorspace.c_str(), + view.m_looks.c_str(), + view.m_rule.c_str(), + view.m_description.c_str()); } else if (val.Tag() == "Views") { @@ -4449,45 +4567,47 @@ inline void load(const YAML::Node& node, ConfigRcPtr & config, const char* filen } } } - else if(key == "active_displays") + else if (key == "active_displays") { StringUtils::StringVec display; load(iter->second, display); std::string displays = JoinStringEnvStyle(display); config->setActiveDisplays(displays.c_str()); } - else if(key == "active_views") + else if (key == "active_views") { StringUtils::StringVec view; load(iter->second, view); std::string views = JoinStringEnvStyle(view); config->setActiveViews(views.c_str()); } - else if(key == "inactive_colorspaces") + else if (key == "inactive_colorspaces") { StringUtils::StringVec inactiveCSs; load(iter->second, inactiveCSs); const std::string inactivecCSsStr = JoinStringEnvStyle(inactiveCSs); config->setInactiveColorSpaces(inactivecCSsStr.c_str()); } - else if(key == "colorspaces") + else if (key == "colorspaces") { if (iter->second.Type() != YAML::NodeType::Sequence) { - throwError(iter->second, "'colorspaces' field needs to be a (- !) list."); + throwError( + iter->second, + "'colorspaces' field needs to be a (- !) list."); } for (std::size_t i = 0; i < iter->second.size(); i++) { const YAML::Node & val = iter->second[i]; - if(val.Tag() == "ColorSpace") + if (val.Tag() == "ColorSpace") { ColorSpaceRcPtr cs = ColorSpace::Create(REFERENCE_SPACE_SCENE); load(val, cs, config->getMajorVersion()); - for(int ii = 0; ii < config->getNumColorSpaces(); ++ii) + for (int ii = 0; ii < config->getNumColorSpaces(); ++ii) { - if(strcmp(config->getColorSpaceNameByIndex(ii), cs->getName()) == 0) + if (strcmp(config->getColorSpaceNameByIndex(ii), cs->getName()) == 0) { std::ostringstream os; os << "Colorspace with name '" << cs->getName() << "' already defined."; @@ -4510,7 +4630,9 @@ inline void load(const YAML::Node& node, ConfigRcPtr & config, const char* filen { if (iter->second.Type() != YAML::NodeType::Sequence) { - throwError(iter->second, "'display_colorspaces' field needs to be a (- !) list."); + throwError( + iter->second, + "'display_colorspaces' field needs to be a (- !) list."); } for (std::size_t i = 0; i < iter->second.size(); i++) @@ -4553,7 +4675,7 @@ inline void load(const YAML::Node& node, ConfigRcPtr & config, const char* filen { const YAML::Node & val = iter->second[i]; - if(val.Tag() == "Look") + if (val.Tag() == "Look") { LookRcPtr look = Look::Create(); load(val, look); @@ -4573,7 +4695,9 @@ inline void load(const YAML::Node& node, ConfigRcPtr & config, const char* filen { if (iter->second.Type() != YAML::NodeType::Sequence) { - throwError(iter->second, "'view_transforms' field needs to be a (- !) list."); + throwError( + iter->second, + "'view_transforms' field needs to be a (- !) list."); } for (std::size_t i = 0; i < iter->second.size(); i++) @@ -4583,7 +4707,7 @@ inline void load(const YAML::Node& node, ConfigRcPtr & config, const char* filen if (val.Tag() == "ViewTransform") { ReferenceSpaceType rst = peekViewTransformReferenceSpace(val); - ViewTransformRcPtr vt = ViewTransform::Create(rst); + ViewTransformRcPtr vt = ViewTransform::Create(rst); load(val, vt); config->addViewTransform(vt); } @@ -4606,8 +4730,9 @@ inline void load(const YAML::Node& node, ConfigRcPtr & config, const char* filen { if (iter->second.Type() != YAML::NodeType::Sequence) { - throwError(iter->second, - "'named_transforms' field needs to be a (- !) list."); + throwError( + iter->second, + "'named_transforms' field needs to be a (- !) list."); } for (std::size_t i = 0; i < iter->second.size(); i++) @@ -4648,12 +4773,12 @@ inline void load(const YAML::Node& node, ConfigRcPtr & config, const char* filen } } - // Do not set the working dir when the filename is empty or contains the special string + // Do not set the working dir when the filename is empty or contains the special string // "from Archive/ConfigIOProxy". - if (filename && filename[0] && - Platform::Strcasecmp(filename, "from Archive/ConfigIOProxy") != 0) + if (filename && filename[0] + && Platform::Strcasecmp(filename, "from Archive/ConfigIOProxy") != 0) { - std::string realfilename = AbsPath(filename); + std::string realfilename = AbsPath(filename); std::string configrootdir = pystring::os::path::dirname(realfilename); config->setWorkingDir(configrootdir.c_str()); } @@ -4665,10 +4790,12 @@ inline void load(const YAML::Node& node, ConfigRcPtr & config, const char* filen { if (!defaultCS) { - throwError(node, "The config must contain either a Default file rule or " - "the 'default' role."); + throwError( + node, + "The config must contain either a Default file rule or " + "the 'default' role."); } - } + } else { // In order to use Config::getColorSpaceFromFilepath() method for any version of @@ -4686,14 +4813,14 @@ inline void load(const YAML::Node& node, ConfigRcPtr & config, const char* filen if (defaultCS) { const auto defaultRule = fileRules->getNumEntries() - 1; - const std::string defaultRuleCS{ fileRules->getColorSpace(defaultRule) }; + const std::string defaultRuleCS{fileRules->getColorSpace(defaultRule)}; if (defaultRuleCS != ROLE_DEFAULT) { if (defaultRuleCS != defaultCS->getName()) { std::ostringstream oss; - oss << "file_rules: defines a default rule using color-space '" - << defaultRuleCS << "' that does not match the default role '" + oss << "file_rules: defines a default rule using color-space '" << defaultRuleCS + << "' that does not match the default role '" << std::string(defaultCS->getName()) << "'."; LogWarning(oss.str()); } @@ -4709,7 +4836,7 @@ inline void load(const YAML::Node& node, ConfigRcPtr & config, const char* filen { std::ostringstream os; os << "This .ocio config "; - if(filename && *filename) + if (filename && *filename) { os << " '" << filename << "' "; } @@ -4727,7 +4854,7 @@ inline void save(YAML::Emitter & out, const Config & config) std::stringstream ss; const unsigned configMajorVersion = config.getMajorVersion(); ss << configMajorVersion; - if(config.getMinorVersion()!=0) + if (config.getMinorVersion() != 0) { ss << "." << config.getMinorVersion(); } @@ -4743,9 +4870,9 @@ inline void save(YAML::Emitter & out, const Config & config) // For v2 configs, write the environment section, even if empty. out << YAML::Key << "environment"; out << YAML::Value << YAML::BeginMap; - for(int i = 0; i < config.getNumEnvironmentVars(); ++i) - { - const char* name = config.getEnvironmentVarNameByIndex(i); + for (int i = 0; i < config.getNumEnvironmentVars(); ++i) + { + const char * name = config.getEnvironmentVarNameByIndex(i); out << YAML::Key << name; out << YAML::Value << config.getEnvironmentVarDefault(name); } @@ -4797,7 +4924,7 @@ inline void save(YAML::Emitter & out, const Config & config) if (configMajorVersion >= 2) { - const std::string name{ config.getName() }; + const std::string name{config.getName()}; if (!name.empty()) { out << YAML::Key << "name" << YAML::Value << name; @@ -4810,13 +4937,13 @@ inline void save(YAML::Emitter & out, const Config & config) out << YAML::Newline; out << YAML::Key << "roles"; out << YAML::Value << YAML::BeginMap; - for(int i = 0; i < config.getNumRoles(); ++i) + for (int i = 0; i < config.getNumRoles(); ++i) { - const char* role = config.getRoleName(i); - if(role && *role) + const char * role = config.getRoleName(i); + if (role && *role) { ConstColorSpaceRcPtr colorspace = config.getColorSpace(role); - if(colorspace) + if (colorspace) { out << YAML::Key << role; out << YAML::Value << config.getColorSpace(role)->getName(); @@ -4850,7 +4977,7 @@ inline void save(YAML::Emitter & out, const Config & config) // Viewing rules if (configMajorVersion >= 2) { - auto rules = config.getViewingRules(); + auto rules = config.getViewingRules(); const auto numRules = rules->getNumEntries(); if (numRules) { @@ -4876,12 +5003,13 @@ inline void save(YAML::Emitter & out, const Config & config) for (int v = 0; v < numSharedViews; ++v) { const char * name = config.getView(VIEW_SHARED, nullptr, v); - const View dview{ name, - config.getDisplayViewTransformName(nullptr, name), - config.getDisplayViewColorSpaceName(nullptr, name), - config.getDisplayViewLooks(nullptr, name), - config.getDisplayViewRule(nullptr, name), - config.getDisplayViewDescription(nullptr, name) }; + const View dview{ + name, + config.getDisplayViewTransformName(nullptr, name), + config.getDisplayViewColorSpaceName(nullptr, name), + config.getDisplayViewLooks(nullptr, name), + config.getDisplayViewRule(nullptr, name), + config.getDisplayViewDescription(nullptr, name)}; save(out, dview); } out << YAML::EndSeq; @@ -4893,7 +5021,7 @@ inline void save(YAML::Emitter & out, const Config & config) out << YAML::Key << "displays"; out << YAML::Value << YAML::BeginMap; // All displays are saved (not just active ones). - for(int i = 0; i < config.getNumDisplaysAll(); ++i) + for (int i = 0; i < config.getNumDisplaysAll(); ++i) { // Do not save displays instantiated from a virtual display. if (!config.isDisplayTemporary(i)) @@ -4902,15 +5030,16 @@ inline void save(YAML::Emitter & out, const Config & config) out << YAML::Key << display; out << YAML::Value << YAML::BeginSeq; - for(int v = 0; v < config.getNumViews(VIEW_DISPLAY_DEFINED, display); ++v) + for (int v = 0; v < config.getNumViews(VIEW_DISPLAY_DEFINED, display); ++v) { const char * name = config.getView(VIEW_DISPLAY_DEFINED, display, v); - const View dview{ name, - config.getDisplayViewTransformName(display, name), - config.getDisplayViewColorSpaceName(display, name), - config.getDisplayViewLooks(display, name), - config.getDisplayViewRule(display, name), - config.getDisplayViewDescription(display, name) }; + const View dview{ + name, + config.getDisplayViewTransformName(display, name), + config.getDisplayViewColorSpaceName(display, name), + config.getDisplayViewLooks(display, name), + config.getDisplayViewRule(display, name), + config.getDisplayViewDescription(display, name)}; save(out, dview); } @@ -4930,9 +5059,8 @@ inline void save(YAML::Emitter & out, const Config & config) out << YAML::EndMap; // Virtual Display. - const int numVirtualDisplayViews - = config.getVirtualDisplayNumViews(VIEW_DISPLAY_DEFINED) - + config.getVirtualDisplayNumViews(VIEW_SHARED); + const int numVirtualDisplayViews = config.getVirtualDisplayNumViews(VIEW_DISPLAY_DEFINED) + + config.getVirtualDisplayNumViews(VIEW_SHARED); if (configMajorVersion >= 2 && numVirtualDisplayViews > 0) { @@ -4940,19 +5068,20 @@ inline void save(YAML::Emitter & out, const Config & config) out << YAML::Newline; out << YAML::Key << "virtual_display"; out << YAML::Value << YAML::BeginSeq; - - for(int idx = 0; idx < config.getVirtualDisplayNumViews(VIEW_DISPLAY_DEFINED); ++idx) + + for (int idx = 0; idx < config.getVirtualDisplayNumViews(VIEW_DISPLAY_DEFINED); ++idx) { const char * viewName = config.getVirtualDisplayView(VIEW_DISPLAY_DEFINED, idx); - const View view{ viewName, - config.getVirtualDisplayViewTransformName(viewName), - config.getVirtualDisplayViewColorSpaceName(viewName), - config.getVirtualDisplayViewLooks(viewName), - config.getVirtualDisplayViewRule(viewName), - config.getVirtualDisplayViewDescription(viewName) }; + const View view{ + viewName, + config.getVirtualDisplayViewTransformName(viewName), + config.getVirtualDisplayViewColorSpaceName(viewName), + config.getVirtualDisplayViewLooks(viewName), + config.getVirtualDisplayViewRule(viewName), + config.getVirtualDisplayViewDescription(viewName)}; save(out, view); } - + StringUtils::StringVec sharedViews; for (int idx = 0; idx < config.getVirtualDisplayNumViews(VIEW_SHARED); ++idx) { @@ -4963,7 +5092,7 @@ inline void save(YAML::Emitter & out, const Config & config) out << YAML::VerbatimTag("Views"); out << YAML::Flow << sharedViews; } - + out << YAML::EndSeq; } @@ -4971,19 +5100,19 @@ inline void save(YAML::Emitter & out, const Config & config) out << YAML::Newline; out << YAML::Key << "active_displays"; StringUtils::StringVec active_displays; - if(config.getActiveDisplays() != NULL && strlen(config.getActiveDisplays()) > 0) + if (config.getActiveDisplays() != NULL && strlen(config.getActiveDisplays()) > 0) active_displays = SplitStringEnvStyle(config.getActiveDisplays()); out << YAML::Value << YAML::Flow << active_displays; out << YAML::Key << "active_views"; StringUtils::StringVec active_views; - if(config.getActiveViews() != NULL && strlen(config.getActiveViews()) > 0) + if (config.getActiveViews() != NULL && strlen(config.getActiveViews()) > 0) active_views = SplitStringEnvStyle(config.getActiveViews()); out << YAML::Value << YAML::Flow << active_views; const std::string inactiveCSs = config.getInactiveColorSpaces(); if (!inactiveCSs.empty()) { - const StringUtils::StringVec inactive_colorspaces{ SplitStringEnvStyle(inactiveCSs) }; + const StringUtils::StringVec inactive_colorspaces{SplitStringEnvStyle(inactiveCSs)}; out << YAML::Key << "inactive_colorspaces"; out << YAML::Value << YAML::Flow << inactive_colorspaces; } @@ -4991,14 +5120,14 @@ inline void save(YAML::Emitter & out, const Config & config) out << YAML::Newline; // Looks - if(config.getNumLooks() > 0) + if (config.getNumLooks() > 0) { out << YAML::Newline; out << YAML::Key << "looks"; out << YAML::Value << YAML::BeginSeq; - for(int i = 0; i < config.getNumLooks(); ++i) + for (int i = 0; i < config.getNumLooks(); ++i) { - const char* name = config.getLookNameByIndex(i); + const char * name = config.getLookNameByIndex(i); save(out, config.getLook(name), configMajorVersion); } out << YAML::EndSeq; @@ -5006,7 +5135,7 @@ inline void save(YAML::Emitter & out, const Config & config) } // View transforms. - const std::string defVT{ config.getDefaultViewTransformName() }; + const std::string defVT{config.getDefaultViewTransformName()}; if (!defVT.empty()) { out << YAML::Newline; @@ -5022,7 +5151,7 @@ inline void save(YAML::Emitter & out, const Config & config) for (int i = 0; i < numVT; ++i) { auto name = config.getViewTransformNameByIndex(i); - auto vt = config.getViewTransform(name); + auto vt = config.getViewTransform(name); save(out, vt, configMajorVersion); } out << YAML::EndSeq; @@ -5042,7 +5171,7 @@ inline void save(YAML::Emitter & out, const Config & config) // Check them using their name as they have the same name as the display. const int idx = config.getDisplayAllByName(name); - if (idx==-1 || !config.isDisplayTemporary(idx)) + if (idx == -1 || !config.isDisplayTemporary(idx)) { displayCS.push_back(cs); } @@ -5088,7 +5217,7 @@ inline void save(YAML::Emitter & out, const Config & config) for (int i = 0; i < numNT; ++i) { auto name = config.getNamedTransformNameByIndex(NAMEDTRANSFORM_ALL, i); - auto nt = config.getNamedTransform(name); + auto nt = config.getNamedTransform(name); save(out, nt, configMajorVersion); } out << YAML::EndSeq; @@ -5097,7 +5226,7 @@ inline void save(YAML::Emitter & out, const Config & config) out << YAML::EndMap; } -} +} // namespace /////////////////////////////////////////////////////////////////////////// @@ -5108,12 +5237,12 @@ void OCIOYaml::Read(std::istream & istream, ConfigRcPtr & config, const char * f YAML::Node node = YAML::Load(istream); load(node, config, filename); } - catch(const std::exception & e) + catch (const std::exception & e) { std::ostringstream os; os << "Error: Loading the OCIO profile "; - if (filename && filename[0] && - Platform::Strcasecmp(filename, "from Archive/ConfigIOProxy") != 0) + if (filename && filename[0] + && Platform::Strcasecmp(filename, "from Archive/ConfigIOProxy") != 0) { os << "'" << filename << "' "; } diff --git a/src/OpenColorIO/OCIOZArchive.cpp b/src/OpenColorIO/OCIOZArchive.cpp index 982fce6823..12ccb0e01e 100644 --- a/src/OpenColorIO/OCIOZArchive.cpp +++ b/src/OpenColorIO/OCIOZArchive.cpp @@ -1,12 +1,12 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. -#include #include -#include +#include #include #include -#include +#include +#include #include @@ -14,8 +14,8 @@ #include "Mutex.h" #include "Platform.h" -#include "utils/StringUtils.h" #include "transforms/FileTransform.h" +#include "utils/StringUtils.h" #include "OCIOZArchive.h" @@ -47,31 +47,34 @@ enum ArchiveCompressionMethods }; // Minizip-ng options for archive. -struct ArchiveOptions { - uint8_t include_path = 0; - int16_t compress_level = ArchiveCompressionLevels::BEST; - uint8_t compress_method = ArchiveCompressionMethods::DEFLATE; - uint8_t overwrite = 0; - uint8_t append = 0; - int64_t disk_size = 0; - uint8_t follow_links = 0; - uint8_t store_links = 0; - uint8_t zip_cd = 0; - int32_t encoding = 0; - uint8_t verbose = 0; - uint8_t aes = 0; - const char* cert_path; - const char* cert_pwd; +struct ArchiveOptions +{ + uint8_t include_path = 0; + int16_t compress_level = ArchiveCompressionLevels::BEST; + uint8_t compress_method = ArchiveCompressionMethods::DEFLATE; + uint8_t overwrite = 0; + uint8_t append = 0; + int64_t disk_size = 0; + uint8_t follow_links = 0; + uint8_t store_links = 0; + uint8_t zip_cd = 0; + int32_t encoding = 0; + uint8_t verbose = 0; + uint8_t aes = 0; + const char * cert_path; + const char * cert_pwd; }; /** - * \brief Guard against early throws with Minizip-ng objects. - * + * \brief Guard against early throws with Minizip-ng objects. + * */ struct MinizipNgHandlerGuard { - MinizipNgHandlerGuard(void *& handle, bool isWriter, bool usingEntry) - : m_handle(handle), m_isWriter(isWriter), m_usingEntry(usingEntry) + MinizipNgHandlerGuard(void *& handle, bool isWriter, bool usingEntry) + : m_handle(handle) + , m_isWriter(isWriter) + , m_usingEntry(usingEntry) { // Nothing to do. } @@ -115,8 +118,8 @@ struct MinizipNgHandlerGuard struct MinizipNgMemStreamGuard { - MinizipNgMemStreamGuard(void *& memStream) - : m_memStream(memStream) + MinizipNgMemStreamGuard(void *& memStream) + : m_memStream(memStream) { // Nothing to do. } @@ -127,7 +130,7 @@ struct MinizipNgMemStreamGuard { // Clean up memory stream. mz_stream_mem_close(m_memStream); - mz_stream_mem_delete(&m_memStream); + mz_stream_mem_delete(&m_memStream); m_memStream = nullptr; } } @@ -141,18 +144,18 @@ struct MinizipNgMemStreamGuard ////////////////////////////////////////////////////////////////////////////////////// /** * Utility function for archived Configs. - * + * * \param archiver Minizip-ng handle object. * \param path Path of the file or the folder to add inside the OCIOZ archive. * \param configWorkingDirectory Working directory of the current config. */ void addSupportedFiles(void * archiver, const char * path, const char * configWorkingDirectory) { - DIR *dir = mz_os_open_dir(path); + DIR * dir = mz_os_open_dir(path); if (dir != NULL) { - struct dirent *entry = NULL; - while ((entry = mz_os_read_dir(dir)) != NULL) + struct dirent * entry = NULL; + while ((entry = mz_os_read_dir(dir)) != NULL) { // Join the current path and the directory/file name to get the absolute path. std::string absPath = pystring::os::path::join(path, entry->d_name); @@ -161,8 +164,8 @@ void addSupportedFiles(void * archiver, const char * path, const char * configWo { // Since mz_os_read_dir is listing the whole directory, "." and ".." must be // ignored. - if (!StringUtils::Compare(".", entry->d_name) && - !StringUtils::Compare("..", entry->d_name)) + if (!StringUtils::Compare(".", entry->d_name) + && !StringUtils::Compare("..", entry->d_name)) { // Add the current directory. addSupportedFiles(archiver, absPath.c_str(), configWorkingDirectory); @@ -175,7 +178,7 @@ void addSupportedFiles(void * archiver, const char * path, const char * configWo pystring::os::path::splitext(root, ext, std::string(entry->d_name)); // Strip leading dot character in order to get the extension name only. ext = pystring::lstrip(ext, "."); - + // Check if the extension is supported. Using logic from LoadFileUncached(). FormatRegistry & formatRegistry = FormatRegistry::GetInstance(); FileFormatVector possibleFormats; @@ -184,8 +187,12 @@ void addSupportedFiles(void * archiver, const char * path, const char * configWo { // The extension is supported. Add the current file to the OCIOZ archive. if (mz_zip_writer_add_path( - archiver, absPath.c_str(), - configWorkingDirectory, 0, 1) != MZ_OK) + archiver, + absPath.c_str(), + configWorkingDirectory, + 0, + 1) + != MZ_OK) { // Close DIR object before throwing. mz_os_close_dir(dir); @@ -202,19 +209,22 @@ void addSupportedFiles(void * archiver, const char * path, const char * configWo } ////////////////////////////////////////////////////////////////////////////////////// -void archiveConfig(std::ostream & ostream, const Config & config, const char * configWorkingDirectory) +void archiveConfig( + std::ostream & ostream, + const Config & config, + const char * configWorkingDirectory) { - void * archiver = nullptr; - void *write_mem_stream = NULL; - const uint8_t *buffer_ptr = NULL; - int32_t buffer_size = 0; + void * archiver = nullptr; + void * write_mem_stream = NULL; + const uint8_t * buffer_ptr = NULL; + int32_t buffer_size = 0; mz_zip_file file_info; if (!config.isArchivable()) { std::ostringstream os; os << "Config is not archivable."; - throw Exception(os.str().c_str()); + throw Exception(os.str().c_str()); } // Initialize. @@ -239,7 +249,7 @@ void archiveConfig(std::ostream & ostream, const Config & config, const char * c // Make sure that the compression method is set to DEFLATE. options.compress_method = ArchiveCompressionMethods::DEFLATE; // Make sure that the compression level is set to BEST. - options.compress_level = ArchiveCompressionLevels::BEST; + options.compress_level = ArchiveCompressionLevels::BEST; // Create the writer handle. #if MZ_VERSION_BUILD >= 040000 @@ -261,19 +271,19 @@ void archiveConfig(std::ostream & ostream, const Config & config, const char * c if (mz_zip_writer_open(archiver, write_mem_stream, 0) == MZ_OK) { // Use a hardcoded name for the config's filename inside the archive. - std::string configFullname = std::string(OCIO_CONFIG_DEFAULT_NAME) + - std::string(OCIO_CONFIG_DEFAULT_FILE_EXT); + std::string configFullname + = std::string(OCIO_CONFIG_DEFAULT_NAME) + std::string(OCIO_CONFIG_DEFAULT_FILE_EXT); // Get config string size. - int32_t configSize = (int32_t) configStr.size(); + int32_t configSize = (int32_t)configStr.size(); // Initialize the config file information structure. - file_info.filename = configFullname.c_str(); - file_info.modified_date = time(NULL); - file_info.version_madeby = MZ_VERSION_MADEBY; + file_info.filename = configFullname.c_str(); + file_info.modified_date = time(NULL); + file_info.version_madeby = MZ_VERSION_MADEBY; file_info.compression_method = MZ_COMPRESS_METHOD_DEFLATE; - file_info.flag = MZ_ZIP_FLAG_UTF8; - file_info.uncompressed_size = configSize; + file_info.flag = MZ_ZIP_FLAG_UTF8; + file_info.uncompressed_size = configSize; ////////////////////////////// // Adding config to archive // @@ -303,7 +313,7 @@ void archiveConfig(std::ostream & ostream, const Config & config, const char * c /////////////////////// // Adding LUT files // /////////////////////// - // Add all supported files to in-memory zip from any directories under working directory. + // Add all supported files to in-memory zip from any directories under working directory. // (recursive) addSupportedFiles(archiver, configWorkingDirectory, configWorkingDirectory); @@ -313,29 +323,29 @@ void archiveConfig(std::ostream & ostream, const Config & config, const char * c // Clean up. mz_zip_writer_delete(&archiver); - + // Get the buffer to write to the ostream. mz_stream_mem_get_buffer(write_mem_stream, (const void **)&buffer_ptr); mz_stream_mem_seek(write_mem_stream, 0, MZ_SEEK_END); buffer_size = (int32_t)mz_stream_mem_tell(write_mem_stream); - ostream.write((char*)&buffer_ptr[0], buffer_size); + ostream.write((char *)&buffer_ptr[0], buffer_size); mz_stream_mem_close(write_mem_stream); - mz_stream_mem_delete(&write_mem_stream); + mz_stream_mem_delete(&write_mem_stream); } /** * \brief Extract the specified OCIOZ archive. - * + * * This function can only be used with the OCIOZ archive format (not arbitrary zip files). - * + * * Note: Signature is in OpenColorIO.h since the function is OCIOEXPORT-ed for client apps. */ void ExtractOCIOZArchive(const char * archivePath, const char * destination) { void * extracter = NULL; - int32_t err = MZ_OK; + int32_t err = MZ_OK; // Normalize the path for the platform. std::string outputDestination = pystring::os::path::normpath(destination); @@ -350,24 +360,24 @@ void ExtractOCIOZArchive(const char * archivePath, const char * destination) MinizipNgHandlerGuard extracterGuard(extracter, false, false); // Open the OCIOZ archive. - if (mz_zip_reader_open_file(extracter, archivePath) != MZ_OK) + if (mz_zip_reader_open_file(extracter, archivePath) != MZ_OK) { std::ostringstream os; os << "Could not open " << archivePath << " for reading."; throw Exception(os.str().c_str()); - } - else + } + else { // Extract all entries to outputDestination directory. err = mz_zip_reader_save_all(extracter, outputDestination.c_str()); - if (err == MZ_END_OF_LIST) + if (err == MZ_END_OF_LIST) { // The archive has no files. std::ostringstream os; os << "No files in archive."; throw Exception(os.str().c_str()); - } - else if (err != MZ_OK) + } + else if (err != MZ_OK) { std::ostringstream os; os << "Could not extract: " << archivePath; @@ -376,7 +386,7 @@ void ExtractOCIOZArchive(const char * archivePath, const char * destination) } // Close the OCIOZ archive. - if (mz_zip_reader_close(extracter) != MZ_OK) + if (mz_zip_reader_close(extracter) != MZ_OK) { std::ostringstream os; os << "Could not close " << archivePath << " after reading."; @@ -389,14 +399,14 @@ void ExtractOCIOZArchive(const char * archivePath, const char * destination) /** * \brief Callback function for getFileStringFromArchiveStream in order to get the contents of a - * file inside an OCIOZ archive as a buffer. - * + * file inside an OCIOZ archive as a buffer. + * * The file is retrieved by comparing the paths. - * + * * \param reader Minizip-ng handle object. * \param info File information. * \param filepath Path to find. - * + * * \return Vector of uint8 with the content of the specified file from an OCIOZ archive. */ std::vector getFileBufferByPath(void * reader, mz_zip_file & info, std::string filepath) @@ -416,18 +426,19 @@ std::vector getFileBufferByPath(void * reader, mz_zip_file & info, std: } /** - * \brief Callback function for getFileStringFromArchiveStream in order to Get the content of a - * file inside an OCIOZ archive as a buffer. - * + * \brief Callback function for getFileStringFromArchiveStream in order to Get the content of a + * file inside an OCIOZ archive as a buffer. + * * The file is retrieved by comparing only the extension. (Used for the .ocio file.) - * + * * \param reader Minizip-ng reader object. * \param info File information * \param extension Extension to find - * + * * \return Vector of uint8 with the content of the file from an OCIOZ archive. */ -std::vector getFileBufferByExtension(void * reader, mz_zip_file & info, std::string extension) +std::vector +getFileBufferByExtension(void * reader, mz_zip_file & info, std::string extension) { std::string root, ext; std::vector buffer; @@ -442,24 +453,25 @@ std::vector getFileBufferByExtension(void * reader, mz_zip_file & info, } /** - * \brief Get the content of a file inside an OCIOZ archive as a buffer. - * + * \brief Get the content of a file inside an OCIOZ archive as a buffer. + * * The two possible callbacks are defined above: * getFileBufferByPath and getFileBufferByExtension. - * + * * \param filepath File to retrieve from the OCIOZ archive. * \param archivePath Path to the archive. * \param fn Callback function to get the (file) buffer by path or by extension. - * + * * \return Vector of uint8 with the content of the specified file from an OCIOZ archive. */ -std::vector getFileStringFromArchiveFile(const std::string & filepath, - const std::string & archivePath, - std::vector (*fn)(void*, mz_zip_file&, std::string)) +std::vector getFileStringFromArchiveFile( + const std::string & filepath, + const std::string & archivePath, + std::vector (*fn)(void *, mz_zip_file &, std::string)) { - mz_zip_file *file_info = NULL; - int32_t err = MZ_OK; - void *reader = NULL; + mz_zip_file * file_info = NULL; + int32_t err = MZ_OK; + void * reader = NULL; std::vector buffer; // Create the reader object. @@ -476,8 +488,7 @@ std::vector getFileStringFromArchiveFile(const std::string & filepath, if (err != MZ_OK) { std::ostringstream os; - os << "Could not open " << archivePath.c_str() - << " in order to get the file: " << filepath; + os << "Could not open " << archivePath.c_str() << " in order to get the file: " << filepath; throw Exception(os.str().c_str()); } else @@ -491,12 +502,13 @@ std::vector getFileStringFromArchiveFile(const std::string & filepath, if (mz_zip_reader_entry_get_info(reader, &file_info) == MZ_OK) { buffer = fn(reader, *file_info, filepath); - if (!buffer.empty()) + if (!buffer.empty()) { break; } } - } while (mz_zip_reader_goto_next_entry(reader) == MZ_OK); + } + while (mz_zip_reader_goto_next_entry(reader) == MZ_OK); } } @@ -509,22 +521,27 @@ std::vector getFileStringFromArchiveFile(const std::string & filepath, // API section ////////////////////////////////////////////////////////////////////////////////////// -std::vector getFileBufferFromArchive(const std::string & filepath, const std::string & archivePath) +std::vector getFileBufferFromArchive( + const std::string & filepath, + const std::string & archivePath) { return getFileStringFromArchiveFile(filepath, archivePath, &getFileBufferByPath); } -std::vector getFileBufferFromArchiveByExtension(const std::string & extension, const std::string & archivePath) +std::vector getFileBufferFromArchiveByExtension( + const std::string & extension, + const std::string & archivePath) { return getFileStringFromArchiveFile(extension, archivePath, &getFileBufferByExtension); } -void getEntriesMappingFromArchiveFile(const std::string & archivePath, - std::map & map) +void getEntriesMappingFromArchiveFile( + const std::string & archivePath, + std::map & map) { - mz_zip_file *file_info = NULL; - int32_t err = MZ_OK; - void *reader = NULL; + mz_zip_file * file_info = NULL; + int32_t err = MZ_OK; + void * reader = NULL; // Create the reader object. #if MZ_VERSION_BUILD >= 040000 @@ -537,7 +554,7 @@ void getEntriesMappingFromArchiveFile(const std::string & archivePath, // Open the zip from file. err = mz_zip_reader_open_file(reader, archivePath.c_str()); - if (err != MZ_OK) + if (err != MZ_OK) { std::ostringstream os; os << "Could not open " << archivePath.c_str() << " in order to get the entries."; @@ -555,21 +572,18 @@ void getEntriesMappingFromArchiveFile(const std::string & archivePath, { // file_info->filename is the complete path of the file from the root of the // archive. - map.insert( - std::pair( - file_info->filename, - std::string(file_info->filename) + std::to_string(file_info->crc) - ) - ); + map.insert(std::pair( + file_info->filename, + std::string(file_info->filename) + std::to_string(file_info->crc))); } - } while (mz_zip_reader_goto_next_entry(reader) == MZ_OK); + } + while (mz_zip_reader_goto_next_entry(reader) == MZ_OK); } } } ////////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////////// // Implementation of CIOPOciozArchive class. ////////////////////////////////////////////////////////////////////////////////////// @@ -581,7 +595,7 @@ std::vector CIOPOciozArchive::getLutData(const char * filepath) const // // It is expected that in most cases, the compiler will be able to avoid copying the buffer // (RVO/NRVO). - // + // // During testings with ocioperf, the first iteration was a little slower using the buffer // instead of a std::istream (max 5%). But the following iterations are just as fast due to // the FileTransform cache. @@ -595,12 +609,12 @@ std::string CIOPOciozArchive::getConfigData() const { // In order to ease the implementation and to facilitate a future Python binding, this method // returns a std::string instead of a std::istream. - // + // // It is expected that in most cases, the compiler will be able to avoid copying the buffer // (RVO/NRVO). std::string configData = ""; - std::string configFilename = std::string(OCIO_CONFIG_DEFAULT_NAME) + - std::string(OCIO_CONFIG_DEFAULT_FILE_EXT); + std::string configFilename + = std::string(OCIO_CONFIG_DEFAULT_NAME) + std::string(OCIO_CONFIG_DEFAULT_FILE_EXT); std::vector configBuffer = getFileBufferFromArchive(configFilename, m_archiveAbsPath); if (configBuffer.size() > 0) { @@ -637,15 +651,14 @@ void CIOPOciozArchive::setArchiveAbsPath(const std::string & absPath) void CIOPOciozArchive::buildEntries() { std::ifstream ociozStream = Platform::CreateInputFileStream( - m_archiveAbsPath.c_str(), - std::ios_base::in | std::ios_base::binary - ); + m_archiveAbsPath.c_str(), + std::ios_base::in | std::ios_base::binary); if (ociozStream.fail()) { std::ostringstream os; os << "Error could not read OCIOZ archive: " << m_archiveAbsPath; - throw Exception (os.str().c_str()); + throw Exception(os.str().c_str()); } getEntriesMappingFromArchiveFile(m_archiveAbsPath, m_entries); diff --git a/src/OpenColorIO/OCIOZArchive.h b/src/OpenColorIO/OCIOZArchive.h index 5bdbc6315b..cfdfc5de40 100644 --- a/src/OpenColorIO/OCIOZArchive.h +++ b/src/OpenColorIO/OCIOZArchive.h @@ -1,15 +1,14 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_ARCHIVEUTILS_H #define INCLUDED_OCIO_ARCHIVEUTILS_H -#include #include -#include #include +#include #include +#include #include @@ -17,59 +16,59 @@ namespace OCIO_NAMESPACE { /** * \brief Archive a config into an OCIOZ file. - * + * * Note: The config file inside the archive is hardcoded to "config.ocio". - * + * * \param ostream Output stream to write the data into. * \param config Config object. * \param configWorkingDirectory Working directory of the current config. */ void archiveConfig( - std::ostream & ostream, - const Config & config, + std::ostream & ostream, + const Config & config, const char * configWorkingDirectory); /** - * \brief Get the content of a file inside an OCIOZ archive as a buffer. - * + * \brief Get the content of a file inside an OCIOZ archive as a buffer. + * * The file is retrieve by comparing the paths. - * + * * \param filepath Path to find. * \param archivePath Path to archive - * + * * \return Vector of uint8 with the content of the specified file from an OCIOZ archive. */ std::vector getFileBufferFromArchive( - const std::string & filepath, + const std::string & filepath, const std::string & archivePath); /** - * \brief Get the content of a file inside an OCIOZ archive as a buffer. - * + * \brief Get the content of a file inside an OCIOZ archive as a buffer. + * * The file is retrieve by comparing the extensions. - * + * * \param extension Extension to find * \param archivePath Path to archive - * + * * \return Vector of uint8 with the content of the specified file from an OCIOZ archive. */ std::vector getFileBufferFromArchiveByExtension( - const std::string & extension, + const std::string & extension, const std::string & archivePath); /** * \brief Get the Entries from OCIOZ archive - * + * * Populate a std::map object with the following information: * key => value : full_path_of_the_file_inside_archive => calculated_hash_of_the_file - * + * * The hash is calculated using the full path of the file inside the archive and its CRC32. - * + * * \param archivePath Path to archive. * \param map std::map object to be populated */ void getEntriesMappingFromArchiveFile( - const std::string & archivePath, + const std::string & archivePath, std::map & map); ////////////////////////////////////////////////////////////////////////////////////// @@ -80,7 +79,7 @@ class CIOPOciozArchive : public ConfigIOProxy CIOPOciozArchive() = default; // See OpenColorIO.h for informations on these five methods. - + std::vector getLutData(const char * filepath) const override; std::string getConfigData() const override; // Currently using the filepath of the file + the CRC32. @@ -89,18 +88,19 @@ class CIOPOciozArchive : public ConfigIOProxy // Following methods are specific to CIOPOciozArchive. /** * \brief Set the OCIOZ archive absolute path. - * + * * \param absPath Absolute path to OCIOZ archive. */ void setArchiveAbsPath(const std::string & absPath); /** * \brief Build a map of the zip file table of contents for the files in the archive. - * - * The structure is a std::map with the key as the full path of the file and the value as a + * + * The structure is a std::map with the key as the full path of the file and the value as a * calculated hash. */ void buildEntries(); + private: std::string m_archiveAbsPath; std::map m_entries; diff --git a/src/OpenColorIO/Op.cpp b/src/OpenColorIO/Op.cpp old mode 100755 new mode 100644 index 81dfe9867e..029c8f1c43 --- a/src/OpenColorIO/Op.cpp +++ b/src/OpenColorIO/Op.cpp @@ -41,8 +41,9 @@ DynamicPropertyRcPtr OpCPU::getDynamicProperty(DynamicPropertyType /* type */) c } OpData::OpData() - : m_metadata() -{ } + : m_metadata() +{ +} OpData::OpData(const OpData & rhs) : m_metadata() @@ -71,7 +72,8 @@ void OpData::getSimplerReplacement(OpDataVec & /* ops */) const bool OpData::equals(const OpData & other) const { - if (this == &other) return true; + if (this == &other) + return true; // Ignore metadata. return getType() == other.getType(); @@ -106,35 +108,35 @@ const char * GetTypeName(OpData::Type type) { switch (type) { - case OpData::CDLType: - return "CDL"; - case OpData::ExponentType: - return "Exponent"; - case OpData::ExposureContrastType: - return "ExposureContrast"; - case OpData::FixedFunctionType: - return "FixedFunction"; - case OpData::GammaType: - return "Gamma"; - case OpData::GradingPrimaryType: - return "GradingPrimary"; - case OpData::GradingRGBCurveType: - return "GradingRGBCurve"; - case OpData::GradingToneType: - return "GradingTone"; - case OpData::LogType: - return "Log"; - case OpData::Lut1DType: - return "LUT1D"; - case OpData::Lut3DType: - return "LUT3D"; - case OpData::MatrixType: - return "Matrix"; - case OpData::RangeType: - return "Range"; - case OpData::ReferenceType: - case OpData::NoOpType: - break; + case OpData::CDLType: + return "CDL"; + case OpData::ExponentType: + return "Exponent"; + case OpData::ExposureContrastType: + return "ExposureContrast"; + case OpData::FixedFunctionType: + return "FixedFunction"; + case OpData::GammaType: + return "Gamma"; + case OpData::GradingPrimaryType: + return "GradingPrimary"; + case OpData::GradingRGBCurveType: + return "GradingRGBCurve"; + case OpData::GradingToneType: + return "GradingTone"; + case OpData::LogType: + return "Log"; + case OpData::Lut1DType: + return "LUT1D"; + case OpData::Lut3DType: + return "LUT3D"; + case OpData::MatrixType: + return "Matrix"; + case OpData::RangeType: + return "Range"; + case OpData::ReferenceType: + case OpData::NoOpType: + break; } throw Exception("Unexpected op type."); } @@ -216,14 +218,14 @@ OpRcPtrVec::OpRcPtrVec() OpRcPtrVec::OpRcPtrVec(const OpRcPtrVec & v) : OpRcPtrVec() { - *this = v; + *this = v; } OpRcPtrVec & OpRcPtrVec::operator=(const OpRcPtrVec & v) { - if(this!=&v) + if (this != &v) { - m_ops = v.m_ops; + m_ops = v.m_ops; m_metadata = v.m_metadata; } @@ -245,25 +247,27 @@ OpRcPtrVec & OpRcPtrVec::operator+=(const OpRcPtrVec & v) } } -OpRcPtrVec::iterator OpRcPtrVec::erase(OpRcPtrVec::const_iterator position) -{ - return m_ops.erase(position); +OpRcPtrVec::iterator OpRcPtrVec::erase(OpRcPtrVec::const_iterator position) +{ + return m_ops.erase(position); } -OpRcPtrVec::iterator OpRcPtrVec::erase(OpRcPtrVec::const_iterator first, - OpRcPtrVec::const_iterator last) -{ - return m_ops.erase(first, last); +OpRcPtrVec::iterator OpRcPtrVec::erase( + OpRcPtrVec::const_iterator first, + OpRcPtrVec::const_iterator last) +{ + return m_ops.erase(first, last); } -void OpRcPtrVec::insert(OpRcPtrVec::const_iterator position, - OpRcPtrVec::const_iterator first, - OpRcPtrVec::const_iterator last) +void OpRcPtrVec::insert( + OpRcPtrVec::const_iterator position, + OpRcPtrVec::const_iterator first, + OpRcPtrVec::const_iterator last) { m_ops.insert(position, first, last); } -void OpRcPtrVec::push_back(const OpRcPtrVec::value_type & val) +void OpRcPtrVec::push_back(const OpRcPtrVec::value_type & val) { m_ops.push_back(val); } @@ -282,7 +286,8 @@ bool OpRcPtrVec::isNoOp() const noexcept { for (const auto & op : m_ops) { - if(!op->isNoOp()) return false; + if (!op->isNoOp()) + return false; } return true; @@ -290,23 +295,23 @@ bool OpRcPtrVec::isNoOp() const noexcept bool OpRcPtrVec::hasChannelCrosstalk() const noexcept { - return m_ops.end() != std::find_if(m_ops.begin(), - m_ops.end(), - [](const OpRcPtr & op) { return op->hasChannelCrosstalk(); } ); + return m_ops.end() != std::find_if(m_ops.begin(), m_ops.end(), [](const OpRcPtr & op) { + return op->hasChannelCrosstalk(); + }); } bool OpRcPtrVec::isDynamic() const noexcept { - return m_ops.end() != std::find_if(m_ops.begin(), - m_ops.end(), - [](const OpRcPtr & op) { return op->isDynamic(); } ); + return m_ops.end() != std::find_if(m_ops.begin(), m_ops.end(), [](const OpRcPtr & op) { + return op->isDynamic(); + }); } bool OpRcPtrVec::hasDynamicProperty(DynamicPropertyType type) const noexcept { - return m_ops.end() != std::find_if(m_ops.begin(), - m_ops.end(), - [type](const OpRcPtr & op) { return op->hasDynamicProperty(type); } ); + return m_ops.end() != std::find_if(m_ops.begin(), m_ops.end(), [type](const OpRcPtr & op) { + return op->hasDynamicProperty(type); + }); } DynamicPropertyRcPtr OpRcPtrVec::getDynamicProperty(DynamicPropertyType type) const @@ -322,7 +327,7 @@ DynamicPropertyRcPtr OpRcPtrVec::getDynamicProperty(DynamicPropertyType type) co throw Exception("Cannot find dynamic property."); } -OpRcPtrVec OpRcPtrVec::clone() const +OpRcPtrVec OpRcPtrVec::clone() const { OpRcPtrVec cloned; @@ -340,7 +345,7 @@ OpRcPtrVec OpRcPtrVec::invert() const OpRcPtrVec::const_reverse_iterator iter = m_ops.rbegin(); OpRcPtrVec::const_reverse_iterator end = m_ops.rend(); - for (; iter!=end; ++iter) + for (; iter != end; ++iter) { ConstOpRcPtr op = *iter; if (op->isNoOpType()) @@ -368,7 +373,7 @@ void OpRcPtrVec::validate() const namespace { -template +template void ValidateDynamicProperty(OpRcPtr op, std::shared_ptr & prop, DynamicPropertyType type) { if (op->hasDynamicProperty(type)) @@ -377,7 +382,7 @@ void ValidateDynamicProperty(OpRcPtr op, std::shared_ptr & prop, DynamicPrope { // Initialize property. DynamicPropertyRcPtr dp = op->getDynamicProperty(type); - prop = OCIO_DYNAMIC_POINTER_CAST(dp); + prop = OCIO_DYNAMIC_POINTER_CAST(dp); } else { @@ -386,31 +391,31 @@ void ValidateDynamicProperty(OpRcPtr op, std::shared_ptr & prop, DynamicPrope std::ostringstream os; switch (type) { - case DYNAMIC_PROPERTY_EXPOSURE: - os << "Exposure"; - break; - case DYNAMIC_PROPERTY_CONTRAST: - os << "Contrast"; - break; - case DYNAMIC_PROPERTY_GAMMA: - os << "Gamma"; - break; - case DYNAMIC_PROPERTY_GRADING_PRIMARY: - os << "Grading primary"; - break; - case DYNAMIC_PROPERTY_GRADING_RGBCURVE: - os << "Grading RGB curve"; - break; - case DYNAMIC_PROPERTY_GRADING_TONE: - os << "Grading tone"; - break; + case DYNAMIC_PROPERTY_EXPOSURE: + os << "Exposure"; + break; + case DYNAMIC_PROPERTY_CONTRAST: + os << "Contrast"; + break; + case DYNAMIC_PROPERTY_GAMMA: + os << "Gamma"; + break; + case DYNAMIC_PROPERTY_GRADING_PRIMARY: + os << "Grading primary"; + break; + case DYNAMIC_PROPERTY_GRADING_RGBCURVE: + os << "Grading RGB curve"; + break; + case DYNAMIC_PROPERTY_GRADING_TONE: + os << "Grading tone"; + break; } os << " dynamic property can only be there once."; LogWarning(os.str()); } } } -} +} // namespace // Warn if there is more than one property of a given type that is currently dynamic. There may // be more than one property of a given type, but only one will respond to parameter updates, the @@ -456,7 +461,7 @@ std::string OpRcPtrVec::getCacheID() const return stream.str(); } -std::ostream& operator<< (std::ostream & os, const Op & op) +std::ostream & operator<<(std::ostream & os, const Op & op) { os << op.getInfo(); return os; @@ -480,126 +485,126 @@ std::string SerializeOpVec(const OpRcPtrVec & ops, int indent) return oss.str(); } -void CreateOpVecFromOpData(OpRcPtrVec & ops, - const ConstOpDataRcPtr & opData, - TransformDirection dir) +void CreateOpVecFromOpData( + OpRcPtrVec & ops, + const ConstOpDataRcPtr & opData, + TransformDirection dir) { switch (opData->getType()) { - case OpData::CDLType: - { - auto cdlSrc = std::dynamic_pointer_cast(opData); - auto cdl = std::make_shared(*cdlSrc); - CreateCDLOp(ops, cdl, dir); - break; - } - - case OpData::ExponentType: - { - auto expSrc = std::dynamic_pointer_cast(opData); - auto exp = std::make_shared(*expSrc); - CreateExponentOp(ops, exp, dir); - break; - } + case OpData::CDLType: + { + auto cdlSrc = std::dynamic_pointer_cast(opData); + auto cdl = std::make_shared(*cdlSrc); + CreateCDLOp(ops, cdl, dir); + break; + } - case OpData::ExposureContrastType: - { - auto ecSrc = std::dynamic_pointer_cast(opData); - auto ec = ecSrc->clone(); - CreateExposureContrastOp(ops, ec, dir); - break; - } + case OpData::ExponentType: + { + auto expSrc = std::dynamic_pointer_cast(opData); + auto exp = std::make_shared(*expSrc); + CreateExponentOp(ops, exp, dir); + break; + } - case OpData::FixedFunctionType: - { - auto ffSrc = std::dynamic_pointer_cast(opData); - auto ff = std::make_shared(*ffSrc); - CreateFixedFunctionOp(ops, ff, dir); - break; - } + case OpData::ExposureContrastType: + { + auto ecSrc = std::dynamic_pointer_cast(opData); + auto ec = ecSrc->clone(); + CreateExposureContrastOp(ops, ec, dir); + break; + } - case OpData::GammaType: - { - auto gammaSrc = std::dynamic_pointer_cast(opData); - auto gamma = std::make_shared(*gammaSrc); - CreateGammaOp(ops, gamma, dir); - break; - } + case OpData::FixedFunctionType: + { + auto ffSrc = std::dynamic_pointer_cast(opData); + auto ff = std::make_shared(*ffSrc); + CreateFixedFunctionOp(ops, ff, dir); + break; + } - case OpData::GradingPrimaryType: - { - auto primarySrc = std::dynamic_pointer_cast(opData); - auto primary = std::make_shared(*primarySrc); - CreateGradingPrimaryOp(ops, primary, dir); - break; - } + case OpData::GammaType: + { + auto gammaSrc = std::dynamic_pointer_cast(opData); + auto gamma = std::make_shared(*gammaSrc); + CreateGammaOp(ops, gamma, dir); + break; + } - case OpData::GradingRGBCurveType: - { - auto rgbSrc = std::dynamic_pointer_cast(opData); - auto rgb = std::make_shared(*rgbSrc); - CreateGradingRGBCurveOp(ops, rgb, dir); - break; - } + case OpData::GradingPrimaryType: + { + auto primarySrc = std::dynamic_pointer_cast(opData); + auto primary = std::make_shared(*primarySrc); + CreateGradingPrimaryOp(ops, primary, dir); + break; + } - case OpData::GradingToneType: - { - auto toneSrc = std::dynamic_pointer_cast(opData); - auto tone = std::make_shared(*toneSrc); - CreateGradingToneOp(ops, tone, dir); - break; - } + case OpData::GradingRGBCurveType: + { + auto rgbSrc = std::dynamic_pointer_cast(opData); + auto rgb = std::make_shared(*rgbSrc); + CreateGradingRGBCurveOp(ops, rgb, dir); + break; + } - case OpData::LogType: - { - auto logSrc = std::dynamic_pointer_cast(opData); - auto log = std::make_shared(*logSrc); - CreateLogOp(ops, log, dir); - break; - } + case OpData::GradingToneType: + { + auto toneSrc = std::dynamic_pointer_cast(opData); + auto tone = std::make_shared(*toneSrc); + CreateGradingToneOp(ops, tone, dir); + break; + } - case OpData::Lut1DType: - { - auto lutSrc = std::dynamic_pointer_cast(opData); - auto lut = std::make_shared(*lutSrc); - CreateLut1DOp(ops, lut, dir); - break; - } + case OpData::LogType: + { + auto logSrc = std::dynamic_pointer_cast(opData); + auto log = std::make_shared(*logSrc); + CreateLogOp(ops, log, dir); + break; + } - case OpData::Lut3DType: - { - auto lutSrc = std::dynamic_pointer_cast(opData); - auto lut = std::make_shared(*lutSrc); - CreateLut3DOp(ops, lut, dir); - break; - } + case OpData::Lut1DType: + { + auto lutSrc = std::dynamic_pointer_cast(opData); + auto lut = std::make_shared(*lutSrc); + CreateLut1DOp(ops, lut, dir); + break; + } - case OpData::MatrixType: - { - auto matrixSrc = std::dynamic_pointer_cast(opData); - auto matrix = std::make_shared(*matrixSrc); - CreateMatrixOp(ops, matrix, dir); - break; - } + case OpData::Lut3DType: + { + auto lutSrc = std::dynamic_pointer_cast(opData); + auto lut = std::make_shared(*lutSrc); + CreateLut3DOp(ops, lut, dir); + break; + } - case OpData::RangeType: - { - auto rangeSrc = std::dynamic_pointer_cast(opData); - auto range = std::make_shared(*rangeSrc); - CreateRangeOp(ops, range, dir); - break; - } + case OpData::MatrixType: + { + auto matrixSrc = std::dynamic_pointer_cast(opData); + auto matrix = std::make_shared(*matrixSrc); + CreateMatrixOp(ops, matrix, dir); + break; + } - case OpData::ReferenceType: - { - throw Exception("ReferenceOpData should have been replaced by referenced ops"); - } + case OpData::RangeType: + { + auto rangeSrc = std::dynamic_pointer_cast(opData); + auto range = std::make_shared(*rangeSrc); + CreateRangeOp(ops, range, dir); + break; + } - case OpData::NoOpType: - { - throw Exception("OpData is not supported"); - } + case OpData::ReferenceType: + { + throw Exception("ReferenceOpData should have been replaced by referenced ops"); + } + case OpData::NoOpType: + { + throw Exception("OpData is not supported"); + } } } diff --git a/src/OpenColorIO/Op.h b/src/OpenColorIO/Op.h index d88d8a1f4b..99a6afa8b4 100644 --- a/src/OpenColorIO/Op.h +++ b/src/OpenColorIO/Op.h @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_OP_H #define INCLUDED_OCIO_OP_H @@ -11,8 +10,8 @@ #include #include "DynamicProperty.h" -#include "fileformats/FormatMetadata.h" #include "Mutex.h" +#include "fileformats/FormatMetadata.h" namespace OCIO_NAMESPACE { @@ -23,25 +22,24 @@ typedef OCIO_SHARED_PTR ConstOpCPURcPtr; typedef std::vector OpCPURcPtrVec; typedef std::vector ConstOpCPURcPtrVec; - // OpCPU is a helper class to define the CPU pixel processing method signature. -// Ops may define several optimized renderers tailored to the needs of a given set +// Ops may define several optimized renderers tailored to the needs of a given set // of op parameters. -// For example, in the Range op, if the parameters do not require clamping +// For example, in the Range op, if the parameters do not require clamping // at the high end, a renderer that skips that clamp may be called. // The CPU renderer to use for a given op instance is decided during finalization. -// +// class OpCPU { public: - OpCPU() = default; - OpCPU(const OpCPU &) = delete; - OpCPU(OpCPU &&) = delete; + OpCPU() = default; + OpCPU(const OpCPU &) = delete; + OpCPU(OpCPU &&) = delete; OpCPU & operator=(const OpCPU &) = delete; - OpCPU & operator=(OpCPU &&) = delete; - virtual ~OpCPU() = default; + OpCPU & operator=(OpCPU &&) = delete; + virtual ~OpCPU() = default; - // All the Ops assume float pointers (i.e. always float bit depths) except + // All the Ops assume float pointers (i.e. always float bit depths) except // the 1D LUT CPU Op where the finalization depends on input and output bit depths. virtual void apply(const void * inImg, void * outImg, long numPixels) const = 0; @@ -61,39 +59,38 @@ typedef OCIO_SHARED_PTR OpRcPtr; typedef OCIO_SHARED_PTR ConstOpRcPtr; class OpRcPtrVec; -// The OpData class is a helper class to hold the data part of an Op -// with some basic behaviors (i.e. isNoop(), isIdentity() …). The Op class -// holds an OpData and offers high-level behaviors such as op's combinations, +// The OpData class is a helper class to hold the data part of an Op +// with some basic behaviors (i.e. isNoop(), isIdentity() …). The Op class +// holds an OpData and offers high-level behaviors such as op's combinations, // CPU processing and GPU code generator. -// -// As the specialized Ops are private classes, operations between different -// Op types could not all be done. A 'Read-only' access to the data part of -// an Op allows to question its data, to cast to the specialized OpData +// +// As the specialized Ops are private classes, operations between different +// Op types could not all be done. A 'Read-only' access to the data part of +// an Op allows to question its data, to cast to the specialized OpData // (to have finer knowledge) and to apply any optimization rules. -// -// For example, one optimization is to remove from the color transformation -// an identity Range (but still clamping) followed by any arbitrary LUT 1D -// except if the LUT is a half domain one (i.e. the input domain is -// all possible 16-bit floating-point values so there is not clamping). -// It means that the methods Range::canCombineWith() and Range::combineWith() +// +// For example, one optimization is to remove from the color transformation +// an identity Range (but still clamping) followed by any arbitrary LUT 1D +// except if the LUT is a half domain one (i.e. the input domain is +// all possible 16-bit floating-point values so there is not clamping). +// It means that the methods Range::canCombineWith() and Range::combineWith() // have to question the LUT Op with a ‘not generic’ call (i.e. isInputHalfDomain()). -// +// // The design is to have a read-only access to the OpData of the Op, and // the ability to cast in any specialized OpData classes. -// -// In contrast to several file format readers which could only read 1D -// and/or 3D LUT's, the CLF file format (i.e. Common LUT Format from ACES) -// read a list of arbitrary ops. As the specialized Ops are private classes, -// data must be stored in intermediate structures. The 1D and 3D LUT's -// already having such a structure, all the other Ops need a dedicated one. -// -// The design is to avoid code duplication by using the OpData for the Op +// +// In contrast to several file format readers which could only read 1D +// and/or 3D LUT's, the CLF file format (i.e. Common LUT Format from ACES) +// read a list of arbitrary ops. As the specialized Ops are private classes, +// data must be stored in intermediate structures. The 1D and 3D LUT's +// already having such a structure, all the other Ops need a dedicated one. +// +// The design is to avoid code duplication by using the OpData for the Op // and the Transform. -// +// class OpData { public: - // Enumeration of all possible operator types. enum Type { @@ -122,7 +119,7 @@ class OpData OpData(OpData && rhs) = delete; OpData & operator=(const OpData & rhs); OpData & operator=(OpData && rhs) = delete; - virtual ~OpData() = default; + virtual ~OpData() = default; const std::string & getID() const; void setID(const std::string & id); @@ -159,7 +156,7 @@ class OpData virtual std::string getCacheID() const = 0; // FormatMetadata. - FormatMetadataImpl & getFormatMetadata() { return m_metadata; } + FormatMetadataImpl & getFormatMetadata() { return m_metadata; } const FormatMetadataImpl & getFormatMetadata() const { return m_metadata; } protected: @@ -176,11 +173,11 @@ const char * GetTypeName(OpData::Type type); class Op { public: - Op(const Op & rhs) = delete; - Op(Op && rhs) = delete; + Op(const Op & rhs) = delete; + Op(Op && rhs) = delete; Op & operator=(const Op & rhs) = delete; - Op & operator=(Op && rhs) = delete; - virtual ~Op() = default; + Op & operator=(Op && rhs) = delete; + virtual ~Op() = default; virtual OpRcPtr clone() const = 0; @@ -217,13 +214,12 @@ class Op virtual bool hasChannelCrosstalk() const { return m_data->hasChannelCrosstalk(); } - virtual void dumpMetadata(ProcessorMetadataRcPtr & /*metadata*/) const - { } + virtual void dumpMetadata(ProcessorMetadataRcPtr & /*metadata*/) const {} void validate() const; // Prepare op for optimization and apply. - virtual void finalize() { } + virtual void finalize() {} // This should yield a string of not unreasonable length. virtual std::string getCacheID() const = 0; @@ -237,11 +233,14 @@ class Op // use and so it is ok to hard-code the fastLogExpPow to false. virtual void apply(void * img, long numPixels) const - { getCPUOp(false)->apply(img, img, numPixels); } + { + getCPUOp(false)->apply(img, img, numPixels); + } virtual void apply(const void * inImg, void * outImg, long numPixels) const - { getCPUOp(false)->apply(inImg, outImg, numPixels); } - + { + getCPUOp(false)->apply(inImg, outImg, numPixels); + } // Is this op supported by the legacy shader text generator? virtual bool supportedByLegacyShader() const { return true; } @@ -252,23 +251,27 @@ class Op virtual bool isDynamic() const; virtual bool hasDynamicProperty(DynamicPropertyType type) const; virtual DynamicPropertyRcPtr getDynamicProperty(DynamicPropertyType type) const; - virtual void replaceDynamicProperty(DynamicPropertyType /* type */, - DynamicPropertyDoubleImplRcPtr & /* prop */) + virtual void replaceDynamicProperty( + DynamicPropertyType /* type */, + DynamicPropertyDoubleImplRcPtr & /* prop */) { throw Exception("Op does not implement double dynamic property."); } - virtual void replaceDynamicProperty(DynamicPropertyType /* type */, - DynamicPropertyGradingPrimaryImplRcPtr & /* prop */) + virtual void replaceDynamicProperty( + DynamicPropertyType /* type */, + DynamicPropertyGradingPrimaryImplRcPtr & /* prop */) { throw Exception("Op does not implement grading primary dynamic property."); } - virtual void replaceDynamicProperty(DynamicPropertyType /* type */, - DynamicPropertyGradingRGBCurveImplRcPtr & /* prop */) + virtual void replaceDynamicProperty( + DynamicPropertyType /* type */, + DynamicPropertyGradingRGBCurveImplRcPtr & /* prop */) { throw Exception("Op does not implement grading rgb curve dynamic property."); } - virtual void replaceDynamicProperty(DynamicPropertyType /* type */, - DynamicPropertyGradingToneImplRcPtr & /* prop */) + virtual void replaceDynamicProperty( + DynamicPropertyType /* type */, + DynamicPropertyGradingToneImplRcPtr & /* prop */) { throw Exception("Op does not implement grading tone dynamic property."); } @@ -286,12 +289,11 @@ class Op OpDataRcPtr & data() { return m_data; } private: - // The OpData instance holds the parameters (LUT values, matrix coefs, etc.) being used. OpDataRcPtr m_data; }; -std::ostream& operator<< (std::ostream&, const Op&); +std::ostream & operator<<(std::ostream &, const Op &); // The class handles a list of ops. // @@ -341,14 +343,14 @@ class OpRcPtrVec const OpRcPtr & operator[](size_type idx) const { return m_ops[idx]; } OpRcPtr & operator[](size_type idx) { return m_ops[idx]; } - iterator erase(const_iterator position); + iterator erase(const_iterator position); iterator erase(const_iterator first, const_iterator last); - // Insert at the 'position' the elements from the range ['first', 'last'[ - // respecting the element's order. Inserting elements at a given position + // Insert at the 'position' the elements from the range ['first', 'last'[ + // respecting the element's order. Inserting elements at a given position // shifts elements starting at 'position' to the right. - // - // Note: Inserting an empty range will do nothing and inserting + // + // Note: Inserting an empty range will do nothing and inserting // in an empty list appends elements from the range ['first', 'last'[. // // Note: It copies elements i.e. no clone. @@ -397,17 +399,18 @@ class OpRcPtrVec void optimize(OptimizationFlags oFlags); // Only OptimizationFlags related to bitdepth optimization are used. - void optimizeForBitdepth(const BitDepth & inBitDepth, - const BitDepth & outBitDepth, - OptimizationFlags oFlags); - + void optimizeForBitdepth( + const BitDepth & inBitDepth, + const BitDepth & outBitDepth, + OptimizationFlags oFlags); }; -std::string SerializeOpVec(const OpRcPtrVec & ops, int indent=0); +std::string SerializeOpVec(const OpRcPtrVec & ops, int indent = 0); -void CreateOpVecFromOpData(OpRcPtrVec & ops, - const ConstOpDataRcPtr & opData, - TransformDirection dir); +void CreateOpVecFromOpData( + OpRcPtrVec & ops, + const ConstOpDataRcPtr & opData, + TransformDirection dir); inline bool HasFlag(OptimizationFlags flags, OptimizationFlags queryFlag) { diff --git a/src/OpenColorIO/OpBuilders.h b/src/OpenColorIO/OpBuilders.h index cfeabcf6dd..34fda1f56b 100644 --- a/src/OpenColorIO/OpBuilders.h +++ b/src/OpenColorIO/OpBuilders.h @@ -1,167 +1,171 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_OPBUILDERS_H #define INCLUDED_OCIO_OPBUILDERS_H #include -#include "Op.h" #include "LookParse.h" +#include "Op.h" #include "PrivateTypes.h" namespace OCIO_NAMESPACE { -void BuildOps(OpRcPtrVec & ops, - const Config & config, - const ConstContextRcPtr & context, - const ConstTransformRcPtr & transform, - TransformDirection dir); +void BuildOps( + OpRcPtrVec & ops, + const Config & config, + const ConstContextRcPtr & context, + const ConstTransformRcPtr & transform, + TransformDirection dir); //////////////////////////////////////////////////////////////////////// -void BuildAllocationOp(OpRcPtrVec & ops, - const AllocationTransform & transform, - TransformDirection dir); - -void BuildBuiltinOps(OpRcPtrVec & ops, - const BuiltinTransform & transform, - TransformDirection dir); - -void BuildCDLOp(OpRcPtrVec & ops, - const Config & config, - const CDLTransform & transform, - TransformDirection dir); - -void BuildColorSpaceOps(OpRcPtrVec & ops, - const Config & config, - const ConstContextRcPtr & context, - const ColorSpaceTransform & transform, - TransformDirection dir); - -void BuildColorSpaceOps(OpRcPtrVec & ops, - const Config & config, - const ConstContextRcPtr & context, - const ConstColorSpaceRcPtr & srcColorSpace, - const ConstColorSpaceRcPtr & dstColorSpace, - bool dataBypass); - -void BuildColorSpaceToReferenceOps(OpRcPtrVec & ops, - const Config & config, - const ConstContextRcPtr & context, - const ConstColorSpaceRcPtr & srcColorSpace, - bool dataBypass); - -void BuildColorSpaceFromReferenceOps(OpRcPtrVec & ops, - const Config & config, - const ConstContextRcPtr & context, - const ConstColorSpaceRcPtr & dstColorSpace, - bool dataBypass); - -void BuildReferenceConversionOps(OpRcPtrVec & ops, - const Config & config, - const ConstContextRcPtr & context, - ReferenceSpaceType srcReferenceSpace, - ReferenceSpaceType dstReferenceSpace); - -void BuildDisplayOps(OpRcPtrVec & ops, - const Config & config, - const ConstContextRcPtr & context, - const DisplayViewTransform & transform, - TransformDirection dir); - -void BuildExponentOp(OpRcPtrVec & ops, - const Config & config, - const ExponentTransform & transform, - TransformDirection dir); - -void BuildExponentWithLinearOp(OpRcPtrVec & ops, - const ExponentWithLinearTransform & transform, - TransformDirection dir); - -void BuildExposureContrastOp(OpRcPtrVec & ops, - const ExposureContrastTransform & transform, - TransformDirection dir); - -void BuildFileTransformOps(OpRcPtrVec & ops, - const Config & config, - const ConstContextRcPtr & context, - const FileTransform & transform, - TransformDirection dir); - -void BuildFixedFunctionOp(OpRcPtrVec & ops, - const FixedFunctionTransform & transform, - TransformDirection dir); - -void BuildGradingPrimaryOp(OpRcPtrVec & ops, - const Config & config, - const ConstContextRcPtr & context, - const GradingPrimaryTransform & transform, - TransformDirection dir); - -void BuildGradingRGBCurveOp(OpRcPtrVec & ops, - const Config & config, - const ConstContextRcPtr & context, - const GradingRGBCurveTransform & transform, - TransformDirection dir); - -void BuildGradingToneOp(OpRcPtrVec & ops, - const Config & config, - const ConstContextRcPtr & context, - const GradingToneTransform & transform, - TransformDirection dir); - -void BuildGroupOps(OpRcPtrVec & ops, - const Config & config, - const ConstContextRcPtr & context, - const GroupTransform & transform, - TransformDirection dir); - -void BuildLogOp(OpRcPtrVec & ops, - const LogAffineTransform& transform, - TransformDirection dir); - -void BuildLogOp(OpRcPtrVec & ops, - const LogCameraTransform& transform, - TransformDirection dir); - -void BuildLogOp(OpRcPtrVec & ops, - const LogTransform& transform, - TransformDirection dir); - -void BuildLookOps(OpRcPtrVec & ops, - const Config & config, - const ConstContextRcPtr & context, - const LookTransform & lookTransform, - TransformDirection dir); - -void BuildLookOps(OpRcPtrVec & ops, - ConstColorSpaceRcPtr & currentColorSpace, - bool skipColorSpaceConversion, - const Config & config, - const ConstContextRcPtr & context, - const LookParseResult & looks); - -void BuildLut1DOp(OpRcPtrVec & ops, - const Lut1DTransform & transform, - TransformDirection dir); - -void BuildLut3DOp(OpRcPtrVec & ops, - const Lut3DTransform & transform, - TransformDirection dir); - -void BuildMatrixOp(OpRcPtrVec & ops, - const MatrixTransform & transform, - TransformDirection dir); - -void BuildRangeOp(OpRcPtrVec & ops, - const RangeTransform & transform, - TransformDirection dir); - -const char * LooksResultColorSpace(const Config & config, - const ConstContextRcPtr & context, - const LookParseResult & looks); +void BuildAllocationOp( + OpRcPtrVec & ops, + const AllocationTransform & transform, + TransformDirection dir); + +void BuildBuiltinOps(OpRcPtrVec & ops, const BuiltinTransform & transform, TransformDirection dir); + +void BuildCDLOp( + OpRcPtrVec & ops, + const Config & config, + const CDLTransform & transform, + TransformDirection dir); + +void BuildColorSpaceOps( + OpRcPtrVec & ops, + const Config & config, + const ConstContextRcPtr & context, + const ColorSpaceTransform & transform, + TransformDirection dir); + +void BuildColorSpaceOps( + OpRcPtrVec & ops, + const Config & config, + const ConstContextRcPtr & context, + const ConstColorSpaceRcPtr & srcColorSpace, + const ConstColorSpaceRcPtr & dstColorSpace, + bool dataBypass); + +void BuildColorSpaceToReferenceOps( + OpRcPtrVec & ops, + const Config & config, + const ConstContextRcPtr & context, + const ConstColorSpaceRcPtr & srcColorSpace, + bool dataBypass); + +void BuildColorSpaceFromReferenceOps( + OpRcPtrVec & ops, + const Config & config, + const ConstContextRcPtr & context, + const ConstColorSpaceRcPtr & dstColorSpace, + bool dataBypass); + +void BuildReferenceConversionOps( + OpRcPtrVec & ops, + const Config & config, + const ConstContextRcPtr & context, + ReferenceSpaceType srcReferenceSpace, + ReferenceSpaceType dstReferenceSpace); + +void BuildDisplayOps( + OpRcPtrVec & ops, + const Config & config, + const ConstContextRcPtr & context, + const DisplayViewTransform & transform, + TransformDirection dir); + +void BuildExponentOp( + OpRcPtrVec & ops, + const Config & config, + const ExponentTransform & transform, + TransformDirection dir); + +void BuildExponentWithLinearOp( + OpRcPtrVec & ops, + const ExponentWithLinearTransform & transform, + TransformDirection dir); + +void BuildExposureContrastOp( + OpRcPtrVec & ops, + const ExposureContrastTransform & transform, + TransformDirection dir); + +void BuildFileTransformOps( + OpRcPtrVec & ops, + const Config & config, + const ConstContextRcPtr & context, + const FileTransform & transform, + TransformDirection dir); + +void BuildFixedFunctionOp( + OpRcPtrVec & ops, + const FixedFunctionTransform & transform, + TransformDirection dir); + +void BuildGradingPrimaryOp( + OpRcPtrVec & ops, + const Config & config, + const ConstContextRcPtr & context, + const GradingPrimaryTransform & transform, + TransformDirection dir); + +void BuildGradingRGBCurveOp( + OpRcPtrVec & ops, + const Config & config, + const ConstContextRcPtr & context, + const GradingRGBCurveTransform & transform, + TransformDirection dir); + +void BuildGradingToneOp( + OpRcPtrVec & ops, + const Config & config, + const ConstContextRcPtr & context, + const GradingToneTransform & transform, + TransformDirection dir); + +void BuildGroupOps( + OpRcPtrVec & ops, + const Config & config, + const ConstContextRcPtr & context, + const GroupTransform & transform, + TransformDirection dir); + +void BuildLogOp(OpRcPtrVec & ops, const LogAffineTransform & transform, TransformDirection dir); + +void BuildLogOp(OpRcPtrVec & ops, const LogCameraTransform & transform, TransformDirection dir); + +void BuildLogOp(OpRcPtrVec & ops, const LogTransform & transform, TransformDirection dir); + +void BuildLookOps( + OpRcPtrVec & ops, + const Config & config, + const ConstContextRcPtr & context, + const LookTransform & lookTransform, + TransformDirection dir); + +void BuildLookOps( + OpRcPtrVec & ops, + ConstColorSpaceRcPtr & currentColorSpace, + bool skipColorSpaceConversion, + const Config & config, + const ConstContextRcPtr & context, + const LookParseResult & looks); + +void BuildLut1DOp(OpRcPtrVec & ops, const Lut1DTransform & transform, TransformDirection dir); + +void BuildLut3DOp(OpRcPtrVec & ops, const Lut3DTransform & transform, TransformDirection dir); + +void BuildMatrixOp(OpRcPtrVec & ops, const MatrixTransform & transform, TransformDirection dir); + +void BuildRangeOp(OpRcPtrVec & ops, const RangeTransform & transform, TransformDirection dir); + +const char * LooksResultColorSpace( + const Config & config, + const ConstContextRcPtr & context, + const LookParseResult & looks); } // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/OpOptimizers.cpp b/src/OpenColorIO/OpOptimizers.cpp old mode 100755 new mode 100644 index 7788bfb164..5a98bb4021 --- a/src/OpenColorIO/OpOptimizers.cpp +++ b/src/OpenColorIO/OpOptimizers.cpp @@ -24,41 +24,42 @@ bool IsPairInverseEnabled(OpData::Type type, OptimizationFlags flags) { switch (type) { - case OpData::CDLType: - return HasFlag(flags, OPTIMIZATION_PAIR_IDENTITY_CDL); - case OpData::ExposureContrastType: - return HasFlag(flags, OPTIMIZATION_PAIR_IDENTITY_EXPOSURE_CONTRAST); - case OpData::FixedFunctionType: - return HasFlag(flags, OPTIMIZATION_PAIR_IDENTITY_FIXED_FUNCTION); - case OpData::GammaType: - return HasFlag(flags, OPTIMIZATION_PAIR_IDENTITY_GAMMA); - case OpData::Lut1DType: - return HasFlag(flags, OPTIMIZATION_PAIR_IDENTITY_LUT1D); - case OpData::Lut3DType: - return HasFlag(flags, OPTIMIZATION_PAIR_IDENTITY_LUT3D); - case OpData::LogType: - return HasFlag(flags, OPTIMIZATION_PAIR_IDENTITY_LOG); - - case OpData::GradingPrimaryType: - case OpData::GradingRGBCurveType: - case OpData::GradingToneType: - return HasFlag(flags, OPTIMIZATION_PAIR_IDENTITY_GRADING); - - case OpData::ExponentType: - case OpData::MatrixType: - case OpData::RangeType: - return false; // Use composition to optimize. - - case OpData::ReferenceType: - case OpData::NoOpType: - default: - // Other types are not controlled by a flag. - return true; + case OpData::CDLType: + return HasFlag(flags, OPTIMIZATION_PAIR_IDENTITY_CDL); + case OpData::ExposureContrastType: + return HasFlag(flags, OPTIMIZATION_PAIR_IDENTITY_EXPOSURE_CONTRAST); + case OpData::FixedFunctionType: + return HasFlag(flags, OPTIMIZATION_PAIR_IDENTITY_FIXED_FUNCTION); + case OpData::GammaType: + return HasFlag(flags, OPTIMIZATION_PAIR_IDENTITY_GAMMA); + case OpData::Lut1DType: + return HasFlag(flags, OPTIMIZATION_PAIR_IDENTITY_LUT1D); + case OpData::Lut3DType: + return HasFlag(flags, OPTIMIZATION_PAIR_IDENTITY_LUT3D); + case OpData::LogType: + return HasFlag(flags, OPTIMIZATION_PAIR_IDENTITY_LOG); + + case OpData::GradingPrimaryType: + case OpData::GradingRGBCurveType: + case OpData::GradingToneType: + return HasFlag(flags, OPTIMIZATION_PAIR_IDENTITY_GRADING); + + case OpData::ExponentType: + case OpData::MatrixType: + case OpData::RangeType: + return false; // Use composition to optimize. + + case OpData::ReferenceType: + case OpData::NoOpType: + default: + // Other types are not controlled by a flag. + return true; } } bool IsCombineEnabled(OpData::Type type, OptimizationFlags flags) { + // clang-format off // Some types are controlled by a flag. return (type == OpData::ExponentType && HasFlag(flags, OPTIMIZATION_COMP_EXPONENT)) || (type == OpData::GammaType && HasFlag(flags, OPTIMIZATION_COMP_GAMMA)) || @@ -66,6 +67,7 @@ bool IsCombineEnabled(OpData::Type type, OptimizationFlags flags) (type == OpData::Lut3DType && HasFlag(flags, OPTIMIZATION_COMP_LUT3D)) || (type == OpData::MatrixType && HasFlag(flags, OPTIMIZATION_COMP_MATRIX)) || (type == OpData::RangeType && HasFlag(flags, OPTIMIZATION_COMP_RANGE)); + // clang-format on } constexpr int MAX_OPTIMIZATION_PASSES = 8; @@ -111,7 +113,7 @@ void RemoveDynamicProperties(OpRcPtrVec & opVec) int RemoveNoOps(OpRcPtrVec & opVec) { - int count = 0; + int count = 0; OpRcPtrVec::const_iterator iter = opVec.begin(); while (iter != opVec.end()) { @@ -141,7 +143,7 @@ void FinalizeOps(OpRcPtrVec & opVec) // For instance CDL that does not use power will get replaced. int ReplaceOps(OpRcPtrVec & opVec) { - int count = 0; + int count = 0; int firstindex = 0; // this must be a signed int OpRcPtrVec tmpops; @@ -188,9 +190,9 @@ int ReplaceIdentityOps(OpRcPtrVec & opVec, OptimizationFlags oFlags) ConstOpRcPtr op = opVec[i]; const auto type = op->data()->getType(); if (type != OpData::RangeType && // Do not replace a range identity. - ((type == OpData::GammaType && optIdGamma) || - (type != OpData::GammaType && optIdentity)) && - op->isIdentity()) + ((type == OpData::GammaType && optIdGamma) + || (type != OpData::GammaType && optIdentity)) + && op->isIdentity()) { // Optimization flag is tested before. auto replacedBy = op->getIdentityReplacement(); @@ -235,9 +237,7 @@ int RemoveInverseOps(OpRcPtrVec & opVec, OptimizationFlags oFlags) // ..., A, A', ... // - if (type1 == type2 && - IsPairInverseEnabled(type1, oFlags) && - op1->isInverse(op2)) + if (type1 == type2 && IsPairInverseEnabled(type1, oFlags) && op1->isInverse(op2)) { // When a pair of inverse ops is removed, we want the optimized ops to give the // same result as the original. For certain ops such as Lut1D or Log this may @@ -249,8 +249,10 @@ int RemoveInverseOps(OpRcPtrVec & opVec, OptimizationFlags oFlags) // Lut1D gets special handling so that both halfs of the pair are available. // Only the inverse LUT has the values needed to generate the replacement. - ConstLut1DOpDataRcPtr lut1 = OCIO_DYNAMIC_POINTER_CAST(op1->data()); - ConstLut1DOpDataRcPtr lut2 = OCIO_DYNAMIC_POINTER_CAST(op2->data()); + ConstLut1DOpDataRcPtr lut1 + = OCIO_DYNAMIC_POINTER_CAST(op1->data()); + ConstLut1DOpDataRcPtr lut2 + = OCIO_DYNAMIC_POINTER_CAST(op2->data()); OpDataRcPtr opData = lut1->getPairIdentityReplacement(lut2); @@ -362,7 +364,7 @@ int ReplaceInverseLuts(OpRcPtrVec & opVec) for (size_t i = 0; i < nbOps; ++i) { ConstOpRcPtr op = opVec[i]; - auto opData = op->data(); + auto opData = op->data(); const auto type = opData->getType(); if (type == OpData::Lut1DType) { @@ -392,17 +394,16 @@ int ReplaceInverseLuts(OpRcPtrVec & opVec) } } return count; - } int RemoveLeadingClampIdentity(OpRcPtrVec & opVec) { - int count = 0; + int count = 0; OpRcPtrVec::const_iterator iter = opVec.begin(); while (iter != opVec.end()) { ConstOpRcPtr o = (*iter); - auto oData = o->data(); + auto oData = o->data(); if (oData->getType() == OpData::RangeType && oData->isIdentity()) { iter++; @@ -423,12 +424,12 @@ int RemoveLeadingClampIdentity(OpRcPtrVec & opVec) int RemoveTrailingClampIdentity(OpRcPtrVec & opVec) { - int count = 0; + int count = 0; int current = static_cast(opVec.size()) - 1; while (current >= 0) { ConstOpRcPtr o = opVec[current]; - auto oData = o->data(); + auto oData = o->data(); if (oData->getType() == OpData::RangeType && oData->isIdentity()) { ++count; @@ -484,7 +485,7 @@ unsigned FindSeparablePrefix(const OpRcPtrVec & ops) if (prefixLen == 1) { ConstOpRcPtr constOp0 = ops[0]; - auto opData = constOp0->data(); + auto opData = constOp0->data(); if (opData->getType() == OpData::Lut1DType) { auto lutData = OCIO_DYNAMIC_POINTER_CAST(opData); @@ -545,7 +546,7 @@ void OptimizeSeparablePrefix(OpRcPtrVec & ops, BitDepth in) return; } - // TODO: Investigate whether even the F32 case could be sped up via interpolating + // TODO: Investigate whether even the F32 case could be sped up via interpolating // in a half-domain Lut1D (e.g. replacing a string of exponent, log, etc.). if (in == BIT_DEPTH_F32 || in == BIT_DEPTH_UINT32) { @@ -649,16 +650,16 @@ void OpRcPtrVec::optimize(OptimizationFlags oFlags) // request and they may be altered by the following optimizations, // preserve their values. - int total_noops = 0; - int total_replacedops = 0; - int total_identityops = 0; - int total_inverseops = 0; - int total_combines = 0; - int total_inverses = 0; - int passes = 0; + int total_noops = 0; + int total_replacedops = 0; + int total_identityops = 0; + int total_inverseops = 0; + int total_combines = 0; + int total_inverses = 0; + int passes = 0; const bool optimizeIdentity = HasFlag(oFlags, OPTIMIZATION_IDENTITY); - const bool replaceOps = HasFlag(oFlags, OPTIMIZATION_SIMPLIFY_OPS); + const bool replaceOps = HasFlag(oFlags, OPTIMIZATION_SIMPLIFY_OPS); const bool fastLut = HasFlag(oFlags, OPTIMIZATION_LUT_INV_FAST); @@ -733,9 +734,10 @@ void OpRcPtrVec::optimize(OptimizationFlags oFlags) } } -void OpRcPtrVec::optimizeForBitdepth(const BitDepth & inBitDepth, - const BitDepth & outBitDepth, - OptimizationFlags oFlags) +void OpRcPtrVec::optimizeForBitdepth( + const BitDepth & inBitDepth, + const BitDepth & outBitDepth, + OptimizationFlags oFlags) { if (!empty()) { @@ -755,4 +757,3 @@ void OpRcPtrVec::optimizeForBitdepth(const BitDepth & inBitDepth, } } // namespace OCIO_NAMESPACE - diff --git a/src/OpenColorIO/ParseUtils.cpp b/src/OpenColorIO/ParseUtils.cpp index eaeefc00e4..c87e7025cb 100644 --- a/src/OpenColorIO/ParseUtils.cpp +++ b/src/OpenColorIO/ParseUtils.cpp @@ -11,9 +11,8 @@ #include "ParseUtils.h" #include "Platform.h" -#include "utils/StringUtils.h" #include "utils/NumberUtils.h" - +#include "utils/StringUtils.h" namespace OCIO_NAMESPACE { @@ -24,25 +23,24 @@ struct Element char c; }; -static struct Element elts[] - = { { """, '"' }, - { "'", '\''}, - { "<", '<' }, - { ">", '>' }, - { "&", '&' }, - { "", ' ' } }; +static struct Element elts[] = { + {""", '"'}, + {"'", '\''}, + { "<", '<'}, + { ">", '>'}, + { "&", '&'}, + { "", ' '} +}; -std::string ConvertSpecialCharToXmlToken(const std::string& str) +std::string ConvertSpecialCharToXmlToken(const std::string & str) { std::string res; - for (std::string::const_iterator it(str.begin()); - it != str.end(); - it++) + for (std::string::const_iterator it(str.begin()); it != str.end(); it++) { bool found = false; for (unsigned idx = 0; !elts[idx].str.empty(); ++idx) { - const Element& elt = elts[idx]; + const Element & elt = elts[idx]; if (*it == elt.c) { found = true; @@ -65,34 +63,34 @@ std::string ConvertXmlTokenToSpecialChar(const std::string & str) { switch (*it) { - case '&': - { - unsigned idx = 0; - for (; !elts[idx].str.empty(); ++idx) + case '&': { - const Element& elt = elts[idx]; - const size_t length = elt.str.length(); - if (0 == strncmp(&(*it), elt.str.c_str(), length)) + unsigned idx = 0; + for (; !elts[idx].str.empty(); ++idx) { - res += elt.c; - it += (length - 1); // -1 because for loop will +1 - break; + const Element & elt = elts[idx]; + const size_t length = elt.str.length(); + if (0 == strncmp(&(*it), elt.str.c_str(), length)) + { + res += elt.c; + it += (length - 1); // -1 because for loop will +1 + break; + } } - } - if (elts[idx].str.empty()) + if (elts[idx].str.empty()) + { + std::ostringstream oss; + oss << "Unknown XML tag:" << std::string(&(*it)); + throw Exception(oss.str().c_str()); + } + break; + } + default: { - std::ostringstream oss; - oss << "Unknown XML tag:" << std::string(&(*it)); - throw Exception(oss.str().c_str()); + res += *it; + break; } - break; - } - default: - { - res += *it; - break; - } } } return res; @@ -112,10 +110,14 @@ bool BoolFromString(const char * s) const char * LoggingLevelToString(LoggingLevel level) { - if(level == LOGGING_LEVEL_NONE) return "none"; - else if(level == LOGGING_LEVEL_WARNING) return "warning"; - else if(level == LOGGING_LEVEL_INFO) return "info"; - else if(level == LOGGING_LEVEL_DEBUG) return "debug"; + if (level == LOGGING_LEVEL_NONE) + return "none"; + else if (level == LOGGING_LEVEL_WARNING) + return "warning"; + else if (level == LOGGING_LEVEL_INFO) + return "info"; + else if (level == LOGGING_LEVEL_DEBUG) + return "debug"; return "unknown"; } @@ -123,27 +125,34 @@ LoggingLevel LoggingLevelFromString(const char * s) { const std::string str = StringUtils::Lower(s ? s : ""); - if(str == "0" || str == "none") return LOGGING_LEVEL_NONE; - else if(str == "1" || str == "warning") return LOGGING_LEVEL_WARNING; - else if(str == "2" || str == "info") return LOGGING_LEVEL_INFO; - else if(str == "3" || str == "debug") return LOGGING_LEVEL_DEBUG; + if (str == "0" || str == "none") + return LOGGING_LEVEL_NONE; + else if (str == "1" || str == "warning") + return LOGGING_LEVEL_WARNING; + else if (str == "2" || str == "info") + return LOGGING_LEVEL_INFO; + else if (str == "3" || str == "debug") + return LOGGING_LEVEL_DEBUG; return LOGGING_LEVEL_UNKNOWN; } const char * TransformDirectionToString(TransformDirection dir) { - if(dir == TRANSFORM_DIR_FORWARD) return "forward"; + if (dir == TRANSFORM_DIR_FORWARD) + return "forward"; // TRANSFORM_DIR_INVERSE return "inverse"; } TransformDirection TransformDirectionFromString(const char * s) { - const char * p = (s ? s : ""); + const char * p = (s ? s : ""); const std::string str = StringUtils::Lower(p); - if(str == "forward") return TRANSFORM_DIR_FORWARD; - else if(str == "inverse") return TRANSFORM_DIR_INVERSE; + if (str == "forward") + return TRANSFORM_DIR_FORWARD; + else if (str == "inverse") + return TRANSFORM_DIR_INVERSE; std::ostringstream oss; oss << "Unrecognized transform direction: '" << p << "'."; @@ -152,10 +161,10 @@ TransformDirection TransformDirectionFromString(const char * s) TransformDirection CombineTransformDirections(TransformDirection d1, TransformDirection d2) { - if(d1 == TRANSFORM_DIR_FORWARD && d2 == TRANSFORM_DIR_FORWARD) + if (d1 == TRANSFORM_DIR_FORWARD && d2 == TRANSFORM_DIR_FORWARD) return TRANSFORM_DIR_FORWARD; - if(d1 == TRANSFORM_DIR_INVERSE && d2 == TRANSFORM_DIR_INVERSE) + if (d1 == TRANSFORM_DIR_INVERSE && d2 == TRANSFORM_DIR_INVERSE) return TRANSFORM_DIR_FORWARD; return TRANSFORM_DIR_INVERSE; @@ -163,21 +172,30 @@ TransformDirection CombineTransformDirections(TransformDirection d1, TransformDi TransformDirection GetInverseTransformDirection(TransformDirection dir) { - if(dir == TRANSFORM_DIR_FORWARD) return TRANSFORM_DIR_INVERSE; + if (dir == TRANSFORM_DIR_FORWARD) + return TRANSFORM_DIR_INVERSE; // TRANSFORM_DIR_INVERSE return TRANSFORM_DIR_FORWARD; } const char * BitDepthToString(BitDepth bitDepth) { - if(bitDepth == BIT_DEPTH_UINT8) return "8ui"; - else if(bitDepth == BIT_DEPTH_UINT10) return "10ui"; - else if(bitDepth == BIT_DEPTH_UINT12) return "12ui"; - else if(bitDepth == BIT_DEPTH_UINT14) return "14ui"; - else if(bitDepth == BIT_DEPTH_UINT16) return "16ui"; - else if(bitDepth == BIT_DEPTH_UINT32) return "32ui"; - else if(bitDepth == BIT_DEPTH_F16) return "16f"; - else if(bitDepth == BIT_DEPTH_F32) return "32f"; + if (bitDepth == BIT_DEPTH_UINT8) + return "8ui"; + else if (bitDepth == BIT_DEPTH_UINT10) + return "10ui"; + else if (bitDepth == BIT_DEPTH_UINT12) + return "12ui"; + else if (bitDepth == BIT_DEPTH_UINT14) + return "14ui"; + else if (bitDepth == BIT_DEPTH_UINT16) + return "16ui"; + else if (bitDepth == BIT_DEPTH_UINT32) + return "32ui"; + else if (bitDepth == BIT_DEPTH_F16) + return "16f"; + else if (bitDepth == BIT_DEPTH_F32) + return "32f"; return "unknown"; } @@ -185,40 +203,58 @@ BitDepth BitDepthFromString(const char * s) { const std::string str = StringUtils::Lower(s ? s : ""); - if(str == "8ui") return BIT_DEPTH_UINT8; - else if(str == "10ui") return BIT_DEPTH_UINT10; - else if(str == "12ui") return BIT_DEPTH_UINT12; - else if(str == "14ui") return BIT_DEPTH_UINT14; - else if(str == "16ui") return BIT_DEPTH_UINT16; - else if(str == "32ui") return BIT_DEPTH_UINT32; - else if(str == "16f") return BIT_DEPTH_F16; - else if(str == "32f") return BIT_DEPTH_F32; + if (str == "8ui") + return BIT_DEPTH_UINT8; + else if (str == "10ui") + return BIT_DEPTH_UINT10; + else if (str == "12ui") + return BIT_DEPTH_UINT12; + else if (str == "14ui") + return BIT_DEPTH_UINT14; + else if (str == "16ui") + return BIT_DEPTH_UINT16; + else if (str == "32ui") + return BIT_DEPTH_UINT32; + else if (str == "16f") + return BIT_DEPTH_F16; + else if (str == "32f") + return BIT_DEPTH_F32; return BIT_DEPTH_UNKNOWN; } bool BitDepthIsFloat(BitDepth bitDepth) { - if(bitDepth == BIT_DEPTH_F16) return true; - else if(bitDepth == BIT_DEPTH_F32) return true; + if (bitDepth == BIT_DEPTH_F16) + return true; + else if (bitDepth == BIT_DEPTH_F32) + return true; return false; } int BitDepthToInt(BitDepth bitDepth) { - if(bitDepth == BIT_DEPTH_UINT8) return 8; - else if(bitDepth == BIT_DEPTH_UINT10) return 10; - else if(bitDepth == BIT_DEPTH_UINT12) return 12; - else if(bitDepth == BIT_DEPTH_UINT14) return 14; - else if(bitDepth == BIT_DEPTH_UINT16) return 16; - else if(bitDepth == BIT_DEPTH_UINT32) return 32; + if (bitDepth == BIT_DEPTH_UINT8) + return 8; + else if (bitDepth == BIT_DEPTH_UINT10) + return 10; + else if (bitDepth == BIT_DEPTH_UINT12) + return 12; + else if (bitDepth == BIT_DEPTH_UINT14) + return 14; + else if (bitDepth == BIT_DEPTH_UINT16) + return 16; + else if (bitDepth == BIT_DEPTH_UINT32) + return 32; return 0; } const char * AllocationToString(Allocation alloc) { - if(alloc == ALLOCATION_UNIFORM) return "uniform"; - else if(alloc == ALLOCATION_LG2) return "lg2"; + if (alloc == ALLOCATION_UNIFORM) + return "uniform"; + else if (alloc == ALLOCATION_LG2) + return "lg2"; return "unknown"; } @@ -226,20 +262,28 @@ Allocation AllocationFromString(const char * s) { const std::string str = StringUtils::Lower(s ? s : ""); - if(str == "uniform") return ALLOCATION_UNIFORM; - else if(str == "lg2") return ALLOCATION_LG2; + if (str == "uniform") + return ALLOCATION_UNIFORM; + else if (str == "lg2") + return ALLOCATION_LG2; return ALLOCATION_UNKNOWN; } const char * InterpolationToString(Interpolation interp) { - if(interp == INTERP_NEAREST) return "nearest"; - else if(interp == INTERP_LINEAR) return "linear"; - else if(interp == INTERP_TETRAHEDRAL) return "tetrahedral"; - else if(interp == INTERP_BEST) return "best"; - else if(interp == INTERP_DEFAULT) return "default"; + if (interp == INTERP_NEAREST) + return "nearest"; + else if (interp == INTERP_LINEAR) + return "linear"; + else if (interp == INTERP_TETRAHEDRAL) + return "tetrahedral"; + else if (interp == INTERP_BEST) + return "best"; + else if (interp == INTERP_DEFAULT) + return "default"; // INTERP_CUBIC is not implemented yet, but the string may be useful for error messages. - else if(interp == INTERP_CUBIC) return "cubic"; + else if (interp == INTERP_CUBIC) + return "cubic"; return "unknown"; } @@ -247,27 +291,41 @@ Interpolation InterpolationFromString(const char * s) { const std::string str = StringUtils::Lower(s ? s : ""); - if(str == "nearest") return INTERP_NEAREST; - else if(str == "linear") return INTERP_LINEAR; - else if(str == "tetrahedral") return INTERP_TETRAHEDRAL; - else if(str == "best") return INTERP_BEST; - else if(str == "cubic") return INTERP_CUBIC; + if (str == "nearest") + return INTERP_NEAREST; + else if (str == "linear") + return INTERP_LINEAR; + else if (str == "tetrahedral") + return INTERP_TETRAHEDRAL; + else if (str == "best") + return INTERP_BEST; + else if (str == "cubic") + return INTERP_CUBIC; return INTERP_UNKNOWN; } const char * GpuLanguageToString(GpuLanguage language) { - switch(language) + switch (language) { - case GPU_LANGUAGE_CG: return "cg"; - case GPU_LANGUAGE_GLSL_1_2: return "glsl_1.2"; - case GPU_LANGUAGE_GLSL_1_3: return "glsl_1.3"; - case GPU_LANGUAGE_GLSL_4_0: return "glsl_4.0"; - case GPU_LANGUAGE_GLSL_ES_1_0: return "glsl_es_1.0"; - case GPU_LANGUAGE_GLSL_ES_3_0: return "glsl_es_3.0"; - case GPU_LANGUAGE_HLSL_DX11: return "hlsl_dx11"; - case GPU_LANGUAGE_MSL_2_0: return "msl_2"; - case LANGUAGE_OSL_1: return "osl_1"; + case GPU_LANGUAGE_CG: + return "cg"; + case GPU_LANGUAGE_GLSL_1_2: + return "glsl_1.2"; + case GPU_LANGUAGE_GLSL_1_3: + return "glsl_1.3"; + case GPU_LANGUAGE_GLSL_4_0: + return "glsl_4.0"; + case GPU_LANGUAGE_GLSL_ES_1_0: + return "glsl_es_1.0"; + case GPU_LANGUAGE_GLSL_ES_3_0: + return "glsl_es_3.0"; + case GPU_LANGUAGE_HLSL_DX11: + return "hlsl_dx11"; + case GPU_LANGUAGE_MSL_2_0: + return "msl_2"; + case LANGUAGE_OSL_1: + return "osl_1"; } throw Exception("Unsupported GPU shader language."); @@ -275,18 +333,27 @@ const char * GpuLanguageToString(GpuLanguage language) GpuLanguage GpuLanguageFromString(const char * s) { - const char * p = (s ? s : ""); + const char * p = (s ? s : ""); const std::string str = StringUtils::Lower(p); - if(str == "cg") return GPU_LANGUAGE_CG; - else if(str == "glsl_1.2") return GPU_LANGUAGE_GLSL_1_2; - else if(str == "glsl_1.3") return GPU_LANGUAGE_GLSL_1_3; - else if(str == "glsl_4.0") return GPU_LANGUAGE_GLSL_4_0; - else if(str == "glsl_es_1.0") return GPU_LANGUAGE_GLSL_ES_1_0; - else if(str == "glsl_es_3.0") return GPU_LANGUAGE_GLSL_ES_3_0; - else if(str == "hlsl_dx11") return GPU_LANGUAGE_HLSL_DX11; - else if(str == "osl_1") return LANGUAGE_OSL_1; - else if(str == "msl_2") return GPU_LANGUAGE_MSL_2_0; + if (str == "cg") + return GPU_LANGUAGE_CG; + else if (str == "glsl_1.2") + return GPU_LANGUAGE_GLSL_1_2; + else if (str == "glsl_1.3") + return GPU_LANGUAGE_GLSL_1_3; + else if (str == "glsl_4.0") + return GPU_LANGUAGE_GLSL_4_0; + else if (str == "glsl_es_1.0") + return GPU_LANGUAGE_GLSL_ES_1_0; + else if (str == "glsl_es_3.0") + return GPU_LANGUAGE_GLSL_ES_3_0; + else if (str == "hlsl_dx11") + return GPU_LANGUAGE_HLSL_DX11; + else if (str == "osl_1") + return LANGUAGE_OSL_1; + else if (str == "msl_2") + return GPU_LANGUAGE_MSL_2_0; std::ostringstream oss; oss << "Unsupported GPU shader language: '" << p << "'."; @@ -295,8 +362,10 @@ GpuLanguage GpuLanguageFromString(const char * s) const char * EnvironmentModeToString(EnvironmentMode mode) { - if(mode == ENV_ENVIRONMENT_LOAD_PREDEFINED) return "loadpredefined"; - else if(mode == ENV_ENVIRONMENT_LOAD_ALL) return "loadall"; + if (mode == ENV_ENVIRONMENT_LOAD_PREDEFINED) + return "loadpredefined"; + else if (mode == ENV_ENVIRONMENT_LOAD_ALL) + return "loadall"; return "unknown"; } @@ -304,25 +373,31 @@ EnvironmentMode EnvironmentModeFromString(const char * s) { const std::string str = StringUtils::Lower(s ? s : ""); - if(str == "loadpredefined") return ENV_ENVIRONMENT_LOAD_PREDEFINED; - else if(str == "loadall") return ENV_ENVIRONMENT_LOAD_ALL; + if (str == "loadpredefined") + return ENV_ENVIRONMENT_LOAD_PREDEFINED; + else if (str == "loadall") + return ENV_ENVIRONMENT_LOAD_ALL; return ENV_ENVIRONMENT_UNKNOWN; } const char * CDLStyleToString(CDLStyle style) { - if (style == CDL_ASC) return "asc"; - else if (style == CDL_NO_CLAMP) return "noClamp"; + if (style == CDL_ASC) + return "asc"; + else if (style == CDL_NO_CLAMP) + return "noClamp"; return "asc"; } CDLStyle CDLStyleFromString(const char * style) { - const char * p = (style ? style : ""); + const char * p = (style ? style : ""); const std::string str = StringUtils::Lower(p); - if (str == "asc") return CDL_ASC; - else if (str == "noclamp") return CDL_NO_CLAMP; + if (str == "asc") + return CDL_ASC; + else if (str == "noclamp") + return CDL_NO_CLAMP; std::ostringstream oss; oss << "Wrong CDL style: '" << p << "'."; @@ -331,18 +406,22 @@ CDLStyle CDLStyleFromString(const char * style) const char * RangeStyleToString(RangeStyle style) { - if(style == RANGE_NO_CLAMP) return "noClamp"; - else if(style == RANGE_CLAMP) return "Clamp"; + if (style == RANGE_NO_CLAMP) + return "noClamp"; + else if (style == RANGE_CLAMP) + return "Clamp"; return "Clamp"; } RangeStyle RangeStyleFromString(const char * style) { - const char * p = (style ? style : ""); + const char * p = (style ? style : ""); const std::string str = StringUtils::Lower(p); - if (str == "noclamp") return RANGE_NO_CLAMP; - else if (str == "clamp") return RANGE_CLAMP; + if (str == "noclamp") + return RANGE_NO_CLAMP; + else if (str == "clamp") + return RANGE_CLAMP; std::ostringstream oss; oss << "Wrong Range style '" << p << "'."; @@ -351,19 +430,30 @@ RangeStyle RangeStyleFromString(const char * style) const char * FixedFunctionStyleToString(FixedFunctionStyle style) { - switch(style) + switch (style) { - case FIXED_FUNCTION_ACES_RED_MOD_03: return "ACES_RedMod03"; - case FIXED_FUNCTION_ACES_RED_MOD_10: return "ACES_RedMod10"; - case FIXED_FUNCTION_ACES_GLOW_03: return "ACES_Glow03"; - case FIXED_FUNCTION_ACES_GLOW_10: return "ACES_Glow10"; - case FIXED_FUNCTION_ACES_DARK_TO_DIM_10: return "ACES_DarkToDim10"; - case FIXED_FUNCTION_ACES_GAMUT_COMP_13: return "ACES_GamutComp13"; - case FIXED_FUNCTION_REC2100_SURROUND: return "REC2100_Surround"; - case FIXED_FUNCTION_RGB_TO_HSV: return "RGB_TO_HSV"; - case FIXED_FUNCTION_XYZ_TO_xyY: return "XYZ_TO_xyY"; - case FIXED_FUNCTION_XYZ_TO_uvY: return "XYZ_TO_uvY"; - case FIXED_FUNCTION_XYZ_TO_LUV: return "XYZ_TO_LUV"; + case FIXED_FUNCTION_ACES_RED_MOD_03: + return "ACES_RedMod03"; + case FIXED_FUNCTION_ACES_RED_MOD_10: + return "ACES_RedMod10"; + case FIXED_FUNCTION_ACES_GLOW_03: + return "ACES_Glow03"; + case FIXED_FUNCTION_ACES_GLOW_10: + return "ACES_Glow10"; + case FIXED_FUNCTION_ACES_DARK_TO_DIM_10: + return "ACES_DarkToDim10"; + case FIXED_FUNCTION_ACES_GAMUT_COMP_13: + return "ACES_GamutComp13"; + case FIXED_FUNCTION_REC2100_SURROUND: + return "REC2100_Surround"; + case FIXED_FUNCTION_RGB_TO_HSV: + return "RGB_TO_HSV"; + case FIXED_FUNCTION_XYZ_TO_xyY: + return "XYZ_TO_xyY"; + case FIXED_FUNCTION_XYZ_TO_uvY: + return "XYZ_TO_uvY"; + case FIXED_FUNCTION_XYZ_TO_LUV: + return "XYZ_TO_LUV"; case FIXED_FUNCTION_ACES_GAMUTMAP_02: case FIXED_FUNCTION_ACES_GAMUTMAP_07: throw Exception("Unimplemented fixed function types: " @@ -377,20 +467,31 @@ const char * FixedFunctionStyleToString(FixedFunctionStyle style) FixedFunctionStyle FixedFunctionStyleFromString(const char * style) { - const char * p = (style ? style : ""); + const char * p = (style ? style : ""); const std::string str = StringUtils::Lower(p); - if(str == "aces_redmod03") return FIXED_FUNCTION_ACES_RED_MOD_03; - else if(str == "aces_redmod10") return FIXED_FUNCTION_ACES_RED_MOD_10; - else if(str == "aces_glow03") return FIXED_FUNCTION_ACES_GLOW_03; - else if(str == "aces_glow10") return FIXED_FUNCTION_ACES_GLOW_10; - else if(str == "aces_darktodim10") return FIXED_FUNCTION_ACES_DARK_TO_DIM_10; - else if(str == "aces_gamutcomp13") return FIXED_FUNCTION_ACES_GAMUT_COMP_13; - else if(str == "rec2100_surround") return FIXED_FUNCTION_REC2100_SURROUND; - else if(str == "rgb_to_hsv") return FIXED_FUNCTION_RGB_TO_HSV; - else if(str == "xyz_to_xyy") return FIXED_FUNCTION_XYZ_TO_xyY; - else if(str == "xyz_to_uvy") return FIXED_FUNCTION_XYZ_TO_uvY; - else if(str == "xyz_to_luv") return FIXED_FUNCTION_XYZ_TO_LUV; + if (str == "aces_redmod03") + return FIXED_FUNCTION_ACES_RED_MOD_03; + else if (str == "aces_redmod10") + return FIXED_FUNCTION_ACES_RED_MOD_10; + else if (str == "aces_glow03") + return FIXED_FUNCTION_ACES_GLOW_03; + else if (str == "aces_glow10") + return FIXED_FUNCTION_ACES_GLOW_10; + else if (str == "aces_darktodim10") + return FIXED_FUNCTION_ACES_DARK_TO_DIM_10; + else if (str == "aces_gamutcomp13") + return FIXED_FUNCTION_ACES_GAMUT_COMP_13; + else if (str == "rec2100_surround") + return FIXED_FUNCTION_REC2100_SURROUND; + else if (str == "rgb_to_hsv") + return FIXED_FUNCTION_RGB_TO_HSV; + else if (str == "xyz_to_xyy") + return FIXED_FUNCTION_XYZ_TO_xyY; + else if (str == "xyz_to_uvy") + return FIXED_FUNCTION_XYZ_TO_uvY; + else if (str == "xyz_to_luv") + return FIXED_FUNCTION_XYZ_TO_LUV; // Default style is meaningless. std::stringstream ss; @@ -403,15 +504,18 @@ namespace static constexpr char GRADING_STYLE_LINEAR[] = "linear"; static constexpr char GRADING_STYLE_LOGARITHMIC[] = "log"; static constexpr char GRADING_STYLE_VIDEO[] = "video"; -} +} // namespace const char * GradingStyleToString(GradingStyle style) { switch (style) { - case GRADING_LIN: return GRADING_STYLE_LINEAR; - case GRADING_LOG: return GRADING_STYLE_LOGARITHMIC; - case GRADING_VIDEO: return GRADING_STYLE_VIDEO; + case GRADING_LIN: + return GRADING_STYLE_LINEAR; + case GRADING_LOG: + return GRADING_STYLE_LOGARITHMIC; + case GRADING_VIDEO: + return GRADING_STYLE_VIDEO; } // Default style is meaningless. @@ -420,12 +524,15 @@ const char * GradingStyleToString(GradingStyle style) GradingStyle GradingStyleFromString(const char * style) { - const char * p = (style ? style : ""); + const char * p = (style ? style : ""); const std::string str = StringUtils::Lower(p); - if (str == GRADING_STYLE_LINEAR) return GRADING_LIN; - else if (str == GRADING_STYLE_LOGARITHMIC) return GRADING_LOG; - else if (str == GRADING_STYLE_VIDEO) return GRADING_VIDEO; + if (str == GRADING_STYLE_LINEAR) + return GRADING_LIN; + else if (str == GRADING_STYLE_LOGARITHMIC) + return GRADING_LOG; + else if (str == GRADING_STYLE_VIDEO) + return GRADING_VIDEO; // Default style is meaningless. std::stringstream ss; @@ -438,15 +545,18 @@ namespace static constexpr char EC_STYLE_VIDEO[] = "video"; static constexpr char EC_STYLE_LOGARITHMIC[] = "log"; static constexpr char EC_STYLE_LINEAR[] = "linear"; -} +} // namespace const char * ExposureContrastStyleToString(ExposureContrastStyle style) { switch (style) { - case EXPOSURE_CONTRAST_VIDEO: return EC_STYLE_VIDEO; - case EXPOSURE_CONTRAST_LOGARITHMIC: return EC_STYLE_LOGARITHMIC; - case EXPOSURE_CONTRAST_LINEAR: return EC_STYLE_LINEAR; + case EXPOSURE_CONTRAST_VIDEO: + return EC_STYLE_VIDEO; + case EXPOSURE_CONTRAST_LOGARITHMIC: + return EC_STYLE_LOGARITHMIC; + case EXPOSURE_CONTRAST_LINEAR: + return EC_STYLE_LINEAR; } // Default style is meaningless. @@ -455,12 +565,15 @@ const char * ExposureContrastStyleToString(ExposureContrastStyle style) ExposureContrastStyle ExposureContrastStyleFromString(const char * style) { - const char * p = (style ? style : ""); + const char * p = (style ? style : ""); const std::string str = StringUtils::Lower(p); - if (str == EC_STYLE_LINEAR) return EXPOSURE_CONTRAST_LINEAR; - else if (str == EC_STYLE_VIDEO) return EXPOSURE_CONTRAST_VIDEO; - else if (str == EC_STYLE_LOGARITHMIC) return EXPOSURE_CONTRAST_LOGARITHMIC; + if (str == EC_STYLE_LINEAR) + return EXPOSURE_CONTRAST_LINEAR; + else if (str == EC_STYLE_VIDEO) + return EXPOSURE_CONTRAST_VIDEO; + else if (str == EC_STYLE_LOGARITHMIC) + return EXPOSURE_CONTRAST_LOGARITHMIC; // Default style is meaningless. std::stringstream ss; @@ -468,23 +581,26 @@ ExposureContrastStyle ExposureContrastStyleFromString(const char * style) throw Exception(ss.str().c_str()); } - namespace { static constexpr char NEGATIVE_STYLE_CLAMP[] = "clamp"; static constexpr char NEGATIVE_STYLE_LINEAR[] = "linear"; static constexpr char NEGATIVE_STYLE_MIRROR[] = "mirror"; static constexpr char NEGATIVE_STYLE_PASS_THRU[] = "pass_thru"; -} +} // namespace const char * NegativeStyleToString(NegativeStyle style) { switch (style) { - case NEGATIVE_CLAMP: return NEGATIVE_STYLE_CLAMP; - case NEGATIVE_MIRROR: return NEGATIVE_STYLE_MIRROR; - case NEGATIVE_PASS_THRU: return NEGATIVE_STYLE_PASS_THRU; - case NEGATIVE_LINEAR: return NEGATIVE_STYLE_LINEAR; + case NEGATIVE_CLAMP: + return NEGATIVE_STYLE_CLAMP; + case NEGATIVE_MIRROR: + return NEGATIVE_STYLE_MIRROR; + case NEGATIVE_PASS_THRU: + return NEGATIVE_STYLE_PASS_THRU; + case NEGATIVE_LINEAR: + return NEGATIVE_STYLE_LINEAR; } throw Exception("Unknown exponent style"); @@ -492,13 +608,17 @@ const char * NegativeStyleToString(NegativeStyle style) NegativeStyle NegativeStyleFromString(const char * style) { - const char * p = (style ? style : ""); + const char * p = (style ? style : ""); const std::string str = StringUtils::Lower(p); - if (str == NEGATIVE_STYLE_MIRROR) return NEGATIVE_MIRROR; - else if (str == NEGATIVE_STYLE_PASS_THRU) return NEGATIVE_PASS_THRU; - else if (str == NEGATIVE_STYLE_CLAMP) return NEGATIVE_CLAMP; - else if (str == NEGATIVE_STYLE_LINEAR) return NEGATIVE_LINEAR; + if (str == NEGATIVE_STYLE_MIRROR) + return NEGATIVE_MIRROR; + else if (str == NEGATIVE_STYLE_PASS_THRU) + return NEGATIVE_PASS_THRU; + else if (str == NEGATIVE_STYLE_CLAMP) + return NEGATIVE_CLAMP; + else if (str == NEGATIVE_STYLE_LINEAR) + return NEGATIVE_LINEAR; std::stringstream ss; ss << "Unknown exponent style: '" << p << "'."; @@ -523,7 +643,7 @@ namespace { static constexpr int FLOAT_DECIMALS = 7; static constexpr int DOUBLE_DECIMALS = 16; -} +} // namespace std::string FloatToString(float value) { @@ -536,14 +656,16 @@ std::string FloatToString(float value) std::string FloatVecToString(const float * fval, unsigned int size) { - if(size<=0) return ""; + if (size <= 0) + return ""; std::ostringstream pretty; pretty.imbue(std::locale::classic()); pretty.precision(FLOAT_DECIMALS); - for(unsigned int i=0; i> *ival) || (failIfLeftoverChars && i.get(c))) return false; + char c = 0; + if (!(i >> *ival) || (failIfLeftoverChars && i.get(c))) + return false; return true; } @@ -588,28 +715,30 @@ std::string DoubleToString(double value) std::string DoubleVecToString(const double * val, unsigned int size) { - if (size <= 0) return ""; + if (size <= 0) + return ""; std::ostringstream pretty; pretty.imbue(std::locale::classic()); pretty.precision(DOUBLE_DECIMALS); - for (unsigned int i = 0; i &floatArray, const StringUtils::StringVec &lineParts) +bool StringVecToFloatVec(std::vector & floatArray, const StringUtils::StringVec & lineParts) { floatArray.resize(lineParts.size()); - for(unsigned int i=0; i &floatArray, const StringUtils::Stri // This will resize intArray to the size of lineParts. // Returns true if all lineParts have been recognized as int. // Content of intArray will be unknown if function returns false. -bool StringVecToIntVec(std::vector &intArray, const StringUtils::StringVec &lineParts) +bool StringVecToIntVec(std::vector & intArray, const StringUtils::StringVec & lineParts) { intArray.resize(lineParts.size()); - for(unsigned int i=0; i &intArray, const StringUtils::StringVec // read the next non-empty line, and store it in 'line' // return 'true' on success -bool nextline(std::istream &istream, std::string &line) +bool nextline(std::istream & istream, std::string & line) { - while ( istream.good() ) + while (istream.good()) { std::getline(istream, line); - if(line.size() > 0 && line[line.size() - 1] == '\r') + if (line.size() > 0 && line[line.size() - 1] == '\r') { line.resize(line.size() - 1); } - if(!StringUtils::Trim(line).empty()) + if (!StringUtils::Trim(line).empty()) { return true; } @@ -705,8 +834,9 @@ std::string JoinStringEnvStyle(const StringUtils::StringVec & outputvec) // Return a vector of strings that are both in vec1 and vec2. // Case is ignored to find strings. // Ordering and capitalization from vec1 are preserved. -StringUtils::StringVec IntersectStringVecsCaseIgnore(const StringUtils::StringVec & vec1, - const StringUtils::StringVec & vec2) +StringUtils::StringVec IntersectStringVecsCaseIgnore( + const StringUtils::StringVec & vec1, + const StringUtils::StringVec & vec2) { StringUtils::StringVec newvec; std::set allvalues; @@ -720,7 +850,7 @@ StringUtils::StringVec IntersectStringVecsCaseIgnore(const StringUtils::StringVe for (const auto & val : vec1) { const std::string key = StringUtils::Lower(val); - if(allvalues.find(key) != allvalues.end()) + if (allvalues.find(key) != allvalues.end()) { newvec.push_back(val); } @@ -732,9 +862,10 @@ StringUtils::StringVec IntersectStringVecsCaseIgnore(const StringUtils::StringVe int FindInStringVecCaseIgnore(const StringUtils::StringVec & vec, const std::string & str) { const std::string teststr = StringUtils::Lower(str); - for(unsigned int i=0; i(i); + if (StringUtils::Lower(vec[i]) == teststr) + return static_cast(i); } return -1; diff --git a/src/OpenColorIO/ParseUtils.h b/src/OpenColorIO/ParseUtils.h index 095e8b206f..9147cbe6c0 100644 --- a/src/OpenColorIO/ParseUtils.h +++ b/src/OpenColorIO/ParseUtils.h @@ -4,7 +4,6 @@ #ifndef INCLUDED_OCIO_PARSEUTILS_H #define INCLUDED_OCIO_PARSEUTILS_H - #include #include #include @@ -14,13 +13,12 @@ #include "PrivateTypes.h" #include "utils/StringUtils.h" - namespace OCIO_NAMESPACE { // Prepares a string to be inserted in an XML document by escaping // characters that may not appear directly in XML. // (Note: eXpat does the inverse conversion automatically.) -std::string ConvertSpecialCharToXmlToken(const std::string& str); +std::string ConvertSpecialCharToXmlToken(const std::string & str); std::string ConvertXmlTokenToSpecialChar(const std::string & str); @@ -31,20 +29,18 @@ std::string DoubleToString(double value); std::string DoubleVecToString(const double * fval, unsigned int size); bool StringToFloat(float * fval, const char * str); -bool StringToInt(int * ival, const char * str, bool failIfLeftoverChars=false); +bool StringToInt(int * ival, const char * str, bool failIfLeftoverChars = false); -bool StringVecToFloatVec(std::vector & floatArray, - const StringUtils::StringVec & lineParts); +bool StringVecToFloatVec(std::vector & floatArray, const StringUtils::StringVec & lineParts); -bool StringVecToIntVec(std::vector & intArray, - const StringUtils::StringVec & lineParts); +bool StringVecToIntVec(std::vector & intArray, const StringUtils::StringVec & lineParts); ////////////////////////////////////////////////////////////////////////// // read the next non-empty line, and store it in 'line' // return 'true' on success -bool nextline(std::istream &istream, std::string &line); +bool nextline(std::istream & istream, std::string & line); bool StrEqualsCaseIgnore(const std::string & a, const std::string & b); @@ -58,8 +54,9 @@ StringUtils::StringVec SplitStringEnvStyle(const std::string & str); std::string JoinStringEnvStyle(const StringUtils::StringVec & outputvec); // Ordering and capitalization from vec1 is preserved -StringUtils::StringVec IntersectStringVecsCaseIgnore(const StringUtils::StringVec & vec1, - const StringUtils::StringVec & vec2); +StringUtils::StringVec IntersectStringVecsCaseIgnore( + const StringUtils::StringVec & vec1, + const StringUtils::StringVec & vec2); // Find the index of the specified string, ignoring case. // return -1 if not found. diff --git a/src/OpenColorIO/PathUtils.cpp b/src/OpenColorIO/PathUtils.cpp index bd9fb11351..eaaf8e7cc9 100644 --- a/src/OpenColorIO/PathUtils.cpp +++ b/src/OpenColorIO/PathUtils.cpp @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #include #include @@ -10,10 +9,10 @@ #include #include "Mutex.h" +#include "OCIOZArchive.h" #include "PathUtils.h" #include "Platform.h" #include "utils/StringUtils.h" -#include "OCIOZArchive.h" #if !defined(_WIN32) #include @@ -23,7 +22,6 @@ #define MAXPATHLEN 4096 #endif - namespace OCIO_NAMESPACE { namespace @@ -41,7 +39,7 @@ struct FileHashResult { Mutex mutex; std::string hash; - bool ready { false }; + bool ready{false}; }; typedef OCIO_SHARED_PTR FileHashResultPtr; @@ -49,7 +47,7 @@ typedef std::map FileCacheMap; FileCacheMap g_fastFileHashCache; Mutex g_fastFileHashCache_mutex; -} +} // namespace void SetComputeHashFunction(ComputeHashFunction hashFunction) { @@ -67,13 +65,13 @@ std::string GetFastFileHash(const std::string & filename, const Context & contex { AutoMutex lock(g_fastFileHashCache_mutex); FileCacheMap::iterator iter = g_fastFileHashCache.find(filename); - if(iter != g_fastFileHashCache.end()) + if (iter != g_fastFileHashCache.end()) { fileHashResultPtr = iter->second; } else { - fileHashResultPtr = std::make_shared(); + fileHashResultPtr = std::make_shared(); g_fastFileHashCache[filename] = fileHashResultPtr; } } @@ -81,7 +79,7 @@ std::string GetFastFileHash(const std::string & filename, const Context & contex std::string hash; { AutoMutex lock(fileHashResultPtr->mutex); - if(!fileHashResultPtr->ready) + if (!fileHashResultPtr->ready) { // NB: OCIO does not attempt to detect if files have changed and caused the cache to // become stale. @@ -101,7 +99,7 @@ std::string GetFastFileHash(const std::string & filename, const Context & contex fileHashResultPtr->hash = h; } - + hash = fileHashResultPtr->hash; } @@ -135,47 +133,53 @@ std::string GetCwd() #else current_dir.resize(1024); #endif - while (::getcwd(¤t_dir[0], current_dir.size()) == NULL && errno == ERANGE) { + while (::getcwd(¤t_dir[0], current_dir.size()) == NULL && errno == ERANGE) + { current_dir.resize(current_dir.size() + 1024); } return std::string(¤t_dir[0]); #endif } -} +} // namespace std::string AbsPath(const std::string & path) { std::string p = path; - if(!pystring::os::path::isabs(p)) p = pystring::os::path::join(GetCwd(), p); + if (!pystring::os::path::isabs(p)) + p = pystring::os::path::join(GetCwd(), p); return pystring::os::path::normpath(p); } namespace { -void AdjustRightmost(const std::string & name, int index, int & colorspacePos, - int & rightMostColorPos, std::string & rightMostColorspace, - int & rightMostColorSpaceIndex) +void AdjustRightmost( + const std::string & name, + int index, + int & colorspacePos, + int & rightMostColorPos, + std::string & rightMostColorspace, + int & rightMostColorSpaceIndex) { // If we have found a match, move the pointer over to the right end // of the substring. This will allow us to find the longest name // that matches the rightmost colorspace colorspacePos += (int)name.size(); - if ((colorspacePos > rightMostColorPos) || - ((colorspacePos == rightMostColorPos) && (name.size() > rightMostColorspace.size())) - ) + if ((colorspacePos > rightMostColorPos) + || ((colorspacePos == rightMostColorPos) && (name.size() > rightMostColorspace.size()))) { - rightMostColorPos = colorspacePos; - rightMostColorspace = name; + rightMostColorPos = colorspacePos; + rightMostColorspace = name; rightMostColorSpaceIndex = index; } } -} +} // namespace int ParseColorSpaceFromString(const Config & config, const char * str) { - if (!str) return -1; + if (!str) + return -1; // Search the entire filePath, including directory name (if provided) // convert the filename to lowercase. @@ -184,9 +188,9 @@ int ParseColorSpaceFromString(const Config & config, const char * str) // See if it matches a LUT name. // This is the position of the RIGHT end of the colorspace substring, // not the left - int rightMostColorPos = -1; + int rightMostColorPos = -1; std::string rightMostColorspace = ""; - int rightMostColorSpaceIndex = -1; + int rightMostColorSpaceIndex = -1; // Find the right-most occcurance within the string for each colorspace. for (int i = 0; i < config.getNumColorSpaces(SEARCH_REFERENCE_SPACE_ALL, COLORSPACE_ALL); ++i) @@ -198,20 +202,30 @@ int ParseColorSpaceFromString(const Config & config, const char * str) int colorspacePos = (int)StringUtils::ReverseFind(fullstr, csname); if (colorspacePos >= 0) { - AdjustRightmost(csname, i, colorspacePos, - rightMostColorPos, rightMostColorspace, rightMostColorSpaceIndex); + AdjustRightmost( + csname, + i, + colorspacePos, + rightMostColorPos, + rightMostColorspace, + rightMostColorSpaceIndex); } - auto cs = config.getColorSpace(csname.c_str()); + auto cs = config.getColorSpace(csname.c_str()); const size_t numAliases = cs->getNumAliases(); for (size_t j = 0; j < numAliases; ++j) { const std::string aliasname = StringUtils::Lower(cs->getAlias(j)); - int colorspacePos = (int)StringUtils::ReverseFind(fullstr, aliasname); + int colorspacePos = (int)StringUtils::ReverseFind(fullstr, aliasname); if (colorspacePos >= 0) { - AdjustRightmost(aliasname, i, colorspacePos, - rightMostColorPos, rightMostColorspace, rightMostColorSpaceIndex); + AdjustRightmost( + aliasname, + i, + colorspacePos, + rightMostColorPos, + rightMostColorspace, + rightMostColorSpaceIndex); } } } diff --git a/src/OpenColorIO/PathUtils.h b/src/OpenColorIO/PathUtils.h index 0f1554d34f..b3ce16ca50 100644 --- a/src/OpenColorIO/PathUtils.h +++ b/src/OpenColorIO/PathUtils.h @@ -1,14 +1,11 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_PATHUTILS_H #define INCLUDED_OCIO_PATHUTILS_H #include - - namespace OCIO_NAMESPACE { diff --git a/src/OpenColorIO/Platform.cpp b/src/OpenColorIO/Platform.cpp index 1dbd846f35..50160714ce 100644 --- a/src/OpenColorIO/Platform.cpp +++ b/src/OpenColorIO/Platform.cpp @@ -16,7 +16,6 @@ #include #endif - namespace OCIO_NAMESPACE { @@ -62,7 +61,7 @@ bool Getenv(const char * name, std::string & value) std::string value_str; #endif - if(uint32_t size = GetEnvironmentVariable(name_str.c_str(), nullptr, 0)) + if (uint32_t size = GetEnvironmentVariable(name_str.c_str(), nullptr, 0)) { value_str.resize(size); @@ -91,7 +90,7 @@ bool Getenv(const char * name, std::string & value) } #else const char * val = ::getenv(name); - value = (val && *val) ? val : ""; + value = (val && *val) ? val : ""; return val; // Returns true if the env. variable exists but empty. #endif } @@ -104,7 +103,7 @@ void Setenv(const char * name, const std::string & value) } // Note that the Windows _putenv_s() removes the env. variable if the value is empty. But - // the Linux ::setenv() sets the env. variable to empty if the value is empty i.e. it still + // the Linux ::setenv() sets the env. variable to empty if the value is empty i.e. it still // exists. To avoid the ambiguity, use Unsetenv() when the env. variable removal if needed. #ifdef _WIN32 @@ -175,13 +174,14 @@ void * AlignedMalloc(size_t size, size_t alignment) #ifdef _WIN32 return _aligned_malloc(size, alignment); #else - void* memBlock = 0x0; - if (!posix_memalign(&memBlock, alignment, size)) return memBlock; + void * memBlock = 0x0; + if (!posix_memalign(&memBlock, alignment, size)) + return memBlock; return 0x0; #endif } -void AlignedFree(void* memBlock) +void AlignedFree(void * memBlock) { #ifdef _WIN32 _aligned_free(memBlock); @@ -203,7 +203,7 @@ int GenerateRandomNumber() return dist(engine); } -} +} // namespace std::string CreateTempFilename(const std::string & filenameExt) { @@ -220,13 +220,13 @@ std::string CreateTempFilename(const std::string & filenameExt) #endif char tmpFilename[L_tmpnam_s]; - if(tmpnam_s(tmpFilename)) + if (tmpnam_s(tmpFilename)) { throw Exception("Could not create a temporary file."); } - // Note that when a file name is pre-pended with a backslash and no path information, such as \fname21, this - // indicates that the name is valid for the current working directory. + // Note that when a file name is pre-pended with a backslash and no path information, such as + // \fname21, this indicates that the name is valid for the current working directory. filename = tmpFilename[0] == '\\' ? tmpFilename + 1 : tmpFilename; #else @@ -253,7 +253,10 @@ std::ifstream CreateInputFileStream(const char * filename, std::ios_base::openmo #endif } -void OpenInputFileStream(std::ifstream & stream, const char * filename, std::ios_base::openmode mode) +void OpenInputFileStream( + std::ifstream & stream, + const char * filename, + std::ios_base::openmode mode) { #if defined(_WIN32) && defined(UNICODE) stream.open(Utf8ToUtf16(filename).c_str(), mode); @@ -277,7 +280,8 @@ const std::string filenameToUTF(const std::string & filename) std::wstring Utf8ToUtf16(const std::string & str) { - if (str.empty()) { + if (str.empty()) + { return std::wstring(); } @@ -293,7 +297,8 @@ std::wstring Utf8ToUtf16(const std::string & str) std::string Utf16ToUtf8(const std::wstring & wstr) { - if (wstr.empty()) { + if (wstr.empty()) + { return std::string(); } @@ -316,7 +321,7 @@ std::string Utf16ToUtf8(const std::wstring & wstr) // "The inode, and therefore st_ino, has no meaning in the FAT, HPFS, or NTFS file systems." // That's the default hash method implementation to compute a hash key based on a file content. -std::string CreateFileContentHash(const std::string &filename) +std::string CreateFileContentHash(const std::string & filename) { #if defined(_WIN32) && defined(UNICODE) struct _stat fileInfo; @@ -342,7 +347,6 @@ std::string CreateFileContentHash(const std::string &filename) return ""; } -} // Platform +} // namespace Platform } // namespace OCIO_NAMESPACE - diff --git a/src/OpenColorIO/Platform.h b/src/OpenColorIO/Platform.h index 67413c76f3..a32ec00314 100644 --- a/src/OpenColorIO/Platform.h +++ b/src/OpenColorIO/Platform.h @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_PLATFORM_H #define INCLUDED_OCIO_PLATFORM_H @@ -19,11 +18,9 @@ #endif // _WIN32 - #include #include - // Missing functions on Windows. #ifdef _WIN32 @@ -41,17 +38,16 @@ typedef string tstring; typedef ostringstream tostringstream; #define LogDebugT(x) LogDebug(x) #endif -} +} // namespace std #endif // _WIN32 - namespace OCIO_NAMESPACE { // TODO: Add proper endian detection using architecture / compiler mojo // In the meantime, hardcode to x86 -#define OCIO_LITTLE_ENDIAN 1 // This is correct on x86 +#define OCIO_LITTLE_ENDIAN 1 // This is correct on x86 namespace Platform { @@ -77,7 +73,7 @@ int Strncasecmp(const char * str1, const char * str2, size_t n); // Allocates memory on a specified alignment boundary. Must use // AlignedFree to free the memory block. // An exception is thrown if an allocation error occurs. -void* AlignedMalloc(size_t size, size_t alignment); +void * AlignedMalloc(size_t size, size_t alignment); // Frees a block of memory that was allocated with AlignedMalloc. void AlignedFree(void * memBlock); @@ -93,18 +89,21 @@ std::string CreateTempFilename(const std::string & filenameExt); std::ifstream CreateInputFileStream(const char * filename, std::ios_base::openmode mode); // Open an input file stream (std::ifstream) using a UTF-8 filename on any platform. -void OpenInputFileStream(std::ifstream & stream, const char * filename, std::ios_base::openmode mode); +void OpenInputFileStream( + std::ifstream & stream, + const char * filename, + std::ios_base::openmode mode); #if defined(_WIN32) && defined(UNICODE) - // Returns the specified filename string as a UTF16 wstring for Windows. - const std::wstring filenameToUTF(const std::string & str); +// Returns the specified filename string as a UTF16 wstring for Windows. +const std::wstring filenameToUTF(const std::string & str); #else - // Returns the specified filename string as is for Unix-like OS. - const std::string filenameToUTF(const std::string & str); +// Returns the specified filename string as is for Unix-like OS. +const std::string filenameToUTF(const std::string & str); #endif // Create a unique hash of a file provided as a UTF-8 filename on any platform. -std::string CreateFileContentHash(const std::string &filename); +std::string CreateFileContentHash(const std::string & filename); // Convert UTF-8 string to UTF-16LE. std::wstring Utf8ToUtf16(const std::string & str); @@ -112,7 +111,7 @@ std::wstring Utf8ToUtf16(const std::string & str); // Convert UTF-16LE string to UTF-8. std::string Utf16ToUtf8(const std::wstring & str); -} +} // namespace Platform } // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/PrivateTypes.h b/src/OpenColorIO/PrivateTypes.h index 43226c4fc3..8e3829183c 100644 --- a/src/OpenColorIO/PrivateTypes.h +++ b/src/OpenColorIO/PrivateTypes.h @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_PRIVATE_TYPES_H #define INCLUDED_OCIO_PRIVATE_TYPES_H @@ -11,7 +10,6 @@ #include #include - namespace OCIO_NAMESPACE { // Stl types of OCIO classes @@ -24,8 +22,6 @@ typedef std::vector LookVec; typedef std::vector TransformDirectionVec; - - } // namespace OCIO_NAMESPACE #endif diff --git a/src/OpenColorIO/Processor.cpp b/src/OpenColorIO/Processor.cpp old mode 100755 new mode 100644 index dab0287dfb..be91085c4e --- a/src/OpenColorIO/Processor.cpp +++ b/src/OpenColorIO/Processor.cpp @@ -13,9 +13,9 @@ #include "HashUtils.h" #include "Logging.h" #include "OpBuilders.h" -#include "ops/noop/NoOps.h" #include "Processor.h" #include "TransformBuilder.h" +#include "ops/noop/NoOps.h" #include "utils/StringUtils.h" namespace OCIO_NAMESPACE @@ -38,7 +38,8 @@ ProcessorMetadataRcPtr ProcessorMetadata::Create() ProcessorMetadata::ProcessorMetadata() : m_impl(new ProcessorMetadata::Impl) -{ } +{ +} ProcessorMetadata::~ProcessorMetadata() { @@ -46,7 +47,7 @@ ProcessorMetadata::~ProcessorMetadata() m_impl = nullptr; } -void ProcessorMetadata::deleter(ProcessorMetadata* c) +void ProcessorMetadata::deleter(ProcessorMetadata * c) { delete c; } @@ -58,14 +59,13 @@ int ProcessorMetadata::getNumFiles() const const char * ProcessorMetadata::getFile(int index) const { - if(index < 0 || - index >= (static_cast(getImpl()->files.size()))) + if (index < 0 || index >= (static_cast(getImpl()->files.size()))) { return ""; } StringSet::const_iterator iter = getImpl()->files.begin(); - std::advance( iter, index ); + std::advance(iter, index); return iter->c_str(); } @@ -82,8 +82,7 @@ int ProcessorMetadata::getNumLooks() const const char * ProcessorMetadata::getLook(int index) const { - if(index < 0 || - index >= (static_cast(getImpl()->looks.size()))) + if (index < 0 || index >= (static_cast(getImpl()->looks.size()))) { return ""; } @@ -103,7 +102,7 @@ ProcessorRcPtr Processor::Create() return ProcessorRcPtr(new Processor(), &deleter); } -void Processor::deleter(Processor* c) +void Processor::deleter(Processor * c) { delete c; } @@ -179,8 +178,8 @@ ConstProcessorRcPtr Processor::getOptimizedProcessor(OptimizationFlags oFlags) c return getImpl()->getOptimizedProcessor(oFlags); } -ConstProcessorRcPtr Processor::getOptimizedProcessor(BitDepth inBD, BitDepth outBD, - OptimizationFlags oFlags) const +ConstProcessorRcPtr +Processor::getOptimizedProcessor(BitDepth inBD, BitDepth outBD, OptimizationFlags oFlags) const { return getImpl()->getOptimizedProcessor(inBD, outBD, oFlags); } @@ -195,8 +194,9 @@ ConstGPUProcessorRcPtr Processor::getOptimizedGPUProcessor(OptimizationFlags oFl return getImpl()->getOptimizedGPUProcessor(oFlags); } -ConstGPUProcessorRcPtr Processor::getOptimizedLegacyGPUProcessor(OptimizationFlags oFlags, - unsigned edgelen) const +ConstGPUProcessorRcPtr Processor::getOptimizedLegacyGPUProcessor( + OptimizationFlags oFlags, + unsigned edgelen) const { return getImpl()->getOptimizedLegacyGPUProcessor(oFlags, edgelen); } @@ -211,22 +211,21 @@ ConstCPUProcessorRcPtr Processor::getOptimizedCPUProcessor(OptimizationFlags oFl return getImpl()->getOptimizedCPUProcessor(oFlags); } -ConstCPUProcessorRcPtr Processor::getOptimizedCPUProcessor(BitDepth inBitDepth, - BitDepth outBitDepth, - OptimizationFlags oFlags) const +ConstCPUProcessorRcPtr Processor::getOptimizedCPUProcessor( + BitDepth inBitDepth, + BitDepth outBitDepth, + OptimizationFlags oFlags) const { return getImpl()->getOptimizedCPUProcessor(inBitDepth, outBitDepth, oFlags); } - // Instantiate the cache with the right types. template class ProcessorCache; template class ProcessorCache; template class ProcessorCache; - -Processor::Impl::Impl(): - m_metadata(ProcessorMetadata::Create()) +Processor::Impl::Impl() + : m_metadata(ProcessorMetadata::Create()) { } @@ -328,16 +327,17 @@ const char * Processor::Impl::getCacheID() const { AutoMutex lock(m_resultsCacheMutex); - if(!m_cacheID.empty()) return m_cacheID.c_str(); + if (!m_cacheID.empty()) + return m_cacheID.c_str(); - if(m_ops.empty()) + if (m_ops.empty()) { m_cacheID = ""; } else { const std::string fullstr = m_ops.getCacheID(); - m_cacheID = CacheIDHash(fullstr.c_str(), fullstr.size()); + m_cacheID = CacheIDHash(fullstr.c_str(), fullstr.size()); } return m_cacheID.c_str(); @@ -357,25 +357,25 @@ OptimizationFlags EnvironmentOverride(OptimizationFlags oFlags) } return oFlags; } -} +} // namespace ConstProcessorRcPtr Processor::Impl::getOptimizedProcessor(OptimizationFlags oFlags) const { return getOptimizedProcessor(BIT_DEPTH_F32, BIT_DEPTH_F32, oFlags); } -ConstProcessorRcPtr Processor::Impl::getOptimizedProcessor(BitDepth inBitDepth, - BitDepth outBitDepth, - OptimizationFlags oFlags) const +ConstProcessorRcPtr Processor::Impl::getOptimizedProcessor( + BitDepth inBitDepth, + BitDepth outBitDepth, + OptimizationFlags oFlags) const { // Helper method. auto CreateProcessor = [](const Processor::Impl & procImpl, BitDepth inBitDepth, BitDepth outBitDepth, - OptimizationFlags oFlags) -> ProcessorRcPtr - { + OptimizationFlags oFlags) -> ProcessorRcPtr { ProcessorRcPtr proc = Create(); - *proc->getImpl() = procImpl; + *proc->getImpl() = procImpl; proc->getImpl()->m_ops.finalize(); proc->getImpl()->m_ops.optimize(oFlags); @@ -385,7 +385,6 @@ ConstProcessorRcPtr Processor::Impl::getOptimizedProcessor(BitDepth inBitDepth, return proc; }; - oFlags = EnvironmentOverride(oFlags); if (m_optProcessorCache.isEnabled()) @@ -429,8 +428,9 @@ ConstGPUProcessorRcPtr Processor::Impl::getOptimizedGPUProcessor(OptimizationFla return getGPUProcessor(m_ops, oFlags); } -ConstGPUProcessorRcPtr Processor::Impl::getOptimizedLegacyGPUProcessor(OptimizationFlags oFlags, - unsigned edgelen) const +ConstGPUProcessorRcPtr Processor::Impl::getOptimizedLegacyGPUProcessor( + OptimizationFlags oFlags, + unsigned edgelen) const { OpRcPtrVec gpuOps = m_ops; @@ -453,10 +453,7 @@ ConstGPUProcessorRcPtr Processor::Impl::getOptimizedLegacyGPUProcessor(Optimizat OpRcPtrVec gpuOpsCpuLatticeProcess; OpRcPtrVec gpuOpsHwPostProcess; - PartitionGPUOps(gpuOpsHwPreProcess, - gpuOpsCpuLatticeProcess, - gpuOpsHwPostProcess, - gpuOps); + PartitionGPUOps(gpuOpsHwPreProcess, gpuOpsCpuLatticeProcess, gpuOpsHwPostProcess, gpuOps); LogDebug("Legacy GPU Ops: 3DLUT"); gpuOpsCpuLatticeProcess.finalize(); @@ -473,13 +470,13 @@ ConstGPUProcessorRcPtr Processor::Impl::getOptimizedLegacyGPUProcessor(Optimizat return getGPUProcessor(gpuOps, oFlags); } -ConstGPUProcessorRcPtr Processor::Impl::getGPUProcessor(const OpRcPtrVec & gpuOps, - OptimizationFlags oFlags) const +ConstGPUProcessorRcPtr Processor::Impl::getGPUProcessor( + const OpRcPtrVec & gpuOps, + OptimizationFlags oFlags) const { // Helper method. - auto CreateProcessor = [](const OpRcPtrVec & ops, - OptimizationFlags oFlags) -> GPUProcessorRcPtr - { + auto CreateProcessor + = [](const OpRcPtrVec & ops, OptimizationFlags oFlags) -> GPUProcessorRcPtr { GPUProcessorRcPtr gpu = GPUProcessorRcPtr(new GPUProcessor(), &GPUProcessor::deleter); gpu->getImpl()->finalize(ops, oFlags); return gpu; @@ -498,7 +495,7 @@ ConstGPUProcessorRcPtr Processor::Impl::getGPUProcessor(const OpRcPtrVec & gpuOp { processor = CreateProcessor(gpuOps, oFlags); } - + return processor; } else @@ -519,16 +516,16 @@ ConstCPUProcessorRcPtr Processor::Impl::getOptimizedCPUProcessor(OptimizationFla return getOptimizedCPUProcessor(BIT_DEPTH_F32, BIT_DEPTH_F32, oFlags); } -ConstCPUProcessorRcPtr Processor::Impl::getOptimizedCPUProcessor(BitDepth inBitDepth, - BitDepth outBitDepth, - OptimizationFlags oFlags) const +ConstCPUProcessorRcPtr Processor::Impl::getOptimizedCPUProcessor( + BitDepth inBitDepth, + BitDepth outBitDepth, + OptimizationFlags oFlags) const { // Helper method. auto CreateProcessor = [](const OpRcPtrVec & ops, BitDepth inBitDepth, BitDepth outBitDepth, - OptimizationFlags oFlags) -> CPUProcessorRcPtr - { + OptimizationFlags oFlags) -> CPUProcessorRcPtr { CPUProcessorRcPtr cpu = CPUProcessorRcPtr(new CPUProcessor(), &CPUProcessor::deleter); cpu->getImpl()->finalize(ops, inBitDepth, outBitDepth, oFlags); return cpu; @@ -536,8 +533,8 @@ ConstCPUProcessorRcPtr Processor::Impl::getOptimizedCPUProcessor(BitDepth inBitD oFlags = EnvironmentOverride(oFlags); - const bool shareDynamicProperties - = (m_cacheFlags & PROCESSOR_CACHE_SHARE_DYN_PROPERTIES) == PROCESSOR_CACHE_SHARE_DYN_PROPERTIES; + const bool shareDynamicProperties = (m_cacheFlags & PROCESSOR_CACHE_SHARE_DYN_PROPERTIES) + == PROCESSOR_CACHE_SHARE_DYN_PROPERTIES; const bool useCache = m_ops.isDynamic() ? shareDynamicProperties : true; @@ -557,7 +554,7 @@ ConstCPUProcessorRcPtr Processor::Impl::getOptimizedCPUProcessor(BitDepth inBitD { processor = CreateProcessor(m_ops, inBitDepth, outBitDepth, oFlags); } - + return processor; } else @@ -579,11 +576,11 @@ void Processor::Impl::setProcessorCacheFlags(ProcessorCacheFlags flags) noexcept /////////////////////////////////////////////////////////////////////////// - -void Processor::Impl::setColorSpaceConversion(const Config & config, - const ConstContextRcPtr & context, - const ConstColorSpaceRcPtr & srcColorSpace, - const ConstColorSpaceRcPtr & dstColorSpace) +void Processor::Impl::setColorSpaceConversion( + const Config & config, + const ConstContextRcPtr & context, + const ConstColorSpaceRcPtr & srcColorSpace, + const ConstColorSpaceRcPtr & dstColorSpace) { if (!m_ops.empty()) { @@ -595,8 +592,8 @@ void Processor::Impl::setColorSpaceConversion(const Config & config, BuildColorSpaceOps(m_ops, config, context, srcColorSpace, dstColorSpace, true); std::ostringstream desc; - desc << "Color space conversion from " << srcColorSpace->getName() - << " to " << dstColorSpace->getName(); + desc << "Color space conversion from " << srcColorSpace->getName() << " to " + << dstColorSpace->getName(); m_ops.getFormatMetadata().addAttribute(METADATA_DESCRIPTION, desc.str().c_str()); // NB: No-ops are not removed yet since they are still needed to build the legacy GPU processor. @@ -605,10 +602,11 @@ void Processor::Impl::setColorSpaceConversion(const Config & config, m_ops.validateDynamicProperties(); } -void Processor::Impl::setTransform(const Config & config, - const ConstContextRcPtr & context, - const ConstTransformRcPtr & transform, - TransformDirection direction) +void Processor::Impl::setTransform( + const Config & config, + const ConstContextRcPtr & context, + const ConstTransformRcPtr & transform, + TransformDirection direction) { if (!m_ops.empty()) { @@ -636,13 +634,12 @@ void Processor::Impl::concatenate(ConstProcessorRcPtr & p1, ConstProcessorRcPtr m_ops.validateDynamicProperties(); } - void Processor::Impl::computeMetadata() { AutoMutex lock(m_resultsCacheMutex); // Pull out metadata, before the no-ops are removed. - for(auto & op : m_ops) + for (auto & op : m_ops) { op->dumpMetadata(m_metadata); } diff --git a/src/OpenColorIO/Processor.h b/src/OpenColorIO/Processor.h index 2bbddd9f2a..3b8942b73c 100644 --- a/src/OpenColorIO/Processor.h +++ b/src/OpenColorIO/Processor.h @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_PROCESSOR_H #define INCLUDED_OCIO_PROCESSOR_H @@ -12,7 +11,6 @@ #include "Op.h" #include "PrivateTypes.h" - namespace OCIO_NAMESPACE { class Processor::Impl @@ -27,10 +25,10 @@ class Processor::Impl mutable Mutex m_resultsCacheMutex; - ProcessorCacheFlags m_cacheFlags { PROCESSOR_CACHE_DEFAULT }; + ProcessorCacheFlags m_cacheFlags{PROCESSOR_CACHE_DEFAULT}; // Speedup GPU & CPU Processor accesses by using a cache. - mutable ProcessorCache m_optProcessorCache; + mutable ProcessorCache m_optProcessorCache; mutable ProcessorCache m_gpuProcessorCache; mutable ProcessorCache m_cpuProcessorCache; @@ -60,9 +58,8 @@ class Processor::Impl ConstProcessorRcPtr getOptimizedProcessor(OptimizationFlags oFlags) const; - ConstProcessorRcPtr getOptimizedProcessor(BitDepth inBD, - BitDepth outBD, - OptimizationFlags oFlags) const; + ConstProcessorRcPtr + getOptimizedProcessor(BitDepth inBD, BitDepth outBD, OptimizationFlags oFlags) const; // Get an optimized GPU processor instance for F32 images with default optimizations. ConstGPUProcessorRcPtr getDefaultGPUProcessor() const; @@ -71,7 +68,9 @@ class Processor::Impl ConstGPUProcessorRcPtr getOptimizedGPUProcessor(OptimizationFlags oFlags) const; // Get an optimized legacy GPU processor for F32 images. - ConstGPUProcessorRcPtr getOptimizedLegacyGPUProcessor(OptimizationFlags oFlags, unsigned edgelen) const; + ConstGPUProcessorRcPtr getOptimizedLegacyGPUProcessor( + OptimizationFlags oFlags, + unsigned edgelen) const; // Get an optimized CPU processor instance for F32 images with default optimizations. ConstCPUProcessorRcPtr getDefaultCPUProcessor() const; @@ -80,9 +79,10 @@ class Processor::Impl ConstCPUProcessorRcPtr getOptimizedCPUProcessor(OptimizationFlags oFlags) const; // Get a optimized CPU processor instance for arbitrary input and output bit-depths. - ConstCPUProcessorRcPtr getOptimizedCPUProcessor(BitDepth inBitDepth, - BitDepth outBitDepth, - OptimizationFlags oFlags) const; + ConstCPUProcessorRcPtr getOptimizedCPUProcessor( + BitDepth inBitDepth, + BitDepth outBitDepth, + OptimizationFlags oFlags) const; // Enable or disable the internal caches. void setProcessorCacheFlags(ProcessorCacheFlags flags) noexcept; @@ -91,23 +91,25 @@ class Processor::Impl // // Builder functions, Not exposed - void setColorSpaceConversion(const Config & config, - const ConstContextRcPtr & context, - const ConstColorSpaceRcPtr & srcColorSpace, - const ConstColorSpaceRcPtr & dstColorSpace); + void setColorSpaceConversion( + const Config & config, + const ConstContextRcPtr & context, + const ConstColorSpaceRcPtr & srcColorSpace, + const ConstColorSpaceRcPtr & dstColorSpace); - void setTransform(const Config & config, - const ConstContextRcPtr & context, - const ConstTransformRcPtr& transform, - TransformDirection direction); + void setTransform( + const Config & config, + const ConstContextRcPtr & context, + const ConstTransformRcPtr & transform, + TransformDirection direction); void concatenate(ConstProcessorRcPtr & p1, ConstProcessorRcPtr & p2); void computeMetadata(); protected: - ConstGPUProcessorRcPtr getGPUProcessor(const OpRcPtrVec & gpuOps, - OptimizationFlags oFlags) const; + ConstGPUProcessorRcPtr getGPUProcessor(const OpRcPtrVec & gpuOps, OptimizationFlags oFlags) + const; }; } // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/SSE.h b/src/OpenColorIO/SSE.h index 2494698c57..2926864845 100644 --- a/src/OpenColorIO/SSE.h +++ b/src/OpenColorIO/SSE.h @@ -1,6 +1,7 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. +// clang-format off #ifndef INCLUDED_OCIO_SSE_H #define INCLUDED_OCIO_SSE_H @@ -647,5 +648,6 @@ inline void sseSinCos(const float x, float& sin_x, float& cos_x) #endif // OCIO_USE_SSE2 +// clang-format on -#endif // INCLUDED_OCIO_SSE_H +#endif // INCLUDED_OCIO_SSE_H diff --git a/src/OpenColorIO/SSE2.h b/src/OpenColorIO/SSE2.h index 918694fc86..83564d39e4 100644 --- a/src/OpenColorIO/SSE2.h +++ b/src/OpenColorIO/SSE2.h @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_SSE2_H #define INCLUDED_OCIO_SSE2_H @@ -10,16 +9,16 @@ // Include the appropriate SIMD intrinsics header based on the architecture (Intel vs. ARM). #if !defined(__aarch64__) - #include +#include #elif defined(__aarch64__) - // ARM architecture A64 (ARM64) - #if OCIO_USE_SSE2NEON - #include - #endif +// ARM architecture A64 (ARM64) +#if OCIO_USE_SSE2NEON +#include +#endif #endif -#include #include "BitDepthUtils.h" +#include // Macros for alignment declarations #define SSE2_SIMD_BYTES 16 @@ -31,45 +30,53 @@ namespace OCIO_NAMESPACE // it is redefining two of the functions from sse2neon. #if defined(__aarch64__) - #if OCIO_USE_SSE2NEON - // Using vmaxnmq_f32 and vminnmq_f32 rather than sse2neon's vmaxq_f32 and vminq_f32 due to - // NaN handling. This doesn't seem to be significantly slower than the default sse2neon behavior. - - // With the Intel intrinsics, if one value is a NaN, the second argument is output, as if it were - // a simple (a>b) ? a:b. OCIO sometimes uses this behavior to filter out a possible NaN in the - // first argument. The vmaxq/vminq will return a NaN if either input is a NaN, which omits the - // filtering behavior. The vmaxnmq/vminnmq (similar to std::fmax/fmin) are not quite the same as - // the Intel _mm_max_ps / _mm_min_ps since they always return the non-NaN argument - // (for quiet NaNs, signaling NaNs always get returned), but that's fine for OCIO since a NaN in - // the first argument continues to be filtered out. - static inline __m128 _mm_max_ps(__m128 a, __m128 b) - { - return vreinterpretq_m128_f32( - vmaxnmq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b))); - } - static inline __m128 _mm_min_ps(__m128 a, __m128 b) - { - return vreinterpretq_m128_f32( - vminnmq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b))); - } - #endif +#if OCIO_USE_SSE2NEON +// Using vmaxnmq_f32 and vminnmq_f32 rather than sse2neon's vmaxq_f32 and vminq_f32 due to +// NaN handling. This doesn't seem to be significantly slower than the default sse2neon behavior. + +// With the Intel intrinsics, if one value is a NaN, the second argument is output, as if it were +// a simple (a>b) ? a:b. OCIO sometimes uses this behavior to filter out a possible NaN in the +// first argument. The vmaxq/vminq will return a NaN if either input is a NaN, which omits the +// filtering behavior. The vmaxnmq/vminnmq (similar to std::fmax/fmin) are not quite the same as +// the Intel _mm_max_ps / _mm_min_ps since they always return the non-NaN argument +// (for quiet NaNs, signaling NaNs always get returned), but that's fine for OCIO since a NaN in +// the first argument continues to be filtered out. +static inline __m128 _mm_max_ps(__m128 a, __m128 b) +{ + return vreinterpretq_m128_f32( + vmaxnmq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b))); +} +static inline __m128 _mm_min_ps(__m128 a, __m128 b) +{ + return vreinterpretq_m128_f32( + vminnmq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b))); +} +#endif #endif -inline __m128 sse2_clamp(__m128 value, const __m128& maxValue) +inline __m128 sse2_clamp(__m128 value, const __m128 & maxValue) { value = _mm_max_ps(value, _mm_setzero_ps()); return _mm_min_ps(value, maxValue); } -static inline void sse2RGBATranspose_4x4(__m128 row0, __m128 row1, __m128 row2, __m128 row3, - __m128 &out_r, __m128 &out_g, __m128 &out_b, __m128 &out_a ) +static inline void sse2RGBATranspose_4x4( + __m128 row0, + __m128 row1, + __m128 row2, + __m128 row3, + __m128 & out_r, + __m128 & out_g, + __m128 & out_b, + __m128 & out_a) { __m128 tmp0 = _mm_unpacklo_ps(row0, row1); __m128 tmp2 = _mm_unpacklo_ps(row2, row3); __m128 tmp1 = _mm_unpackhi_ps(row0, row1); __m128 tmp3 = _mm_unpackhi_ps(row2, row3); - out_r = _mm_movelh_ps(tmp0, tmp2); - out_g = _mm_movehl_ps(tmp2, tmp0); // Note movhlps swaps b with a which is different than unpckhpd + out_r = _mm_movelh_ps(tmp0, tmp2); + out_g + = _mm_movehl_ps(tmp2, tmp0); // Note movhlps swaps b with a which is different than unpckhpd out_b = _mm_movelh_ps(tmp1, tmp3); out_a = _mm_movehl_ps(tmp3, tmp1); } @@ -93,11 +100,12 @@ static inline __m128i sse2_cvtps_ph(__m128 a) // sse2 doesn't have _mm_max_epu32, but _mm_max_ps works __m128i exp_max = _mm_set1_epi32(0x38800000u); - x_exp = _mm_castps_si128(_mm_max_ps(_mm_castsi128_ps(x_exp), _mm_castsi128_ps(exp_max))); // max(e, -14) - x_exp = _mm_add_epi32(x_exp, _mm_set1_epi32(15u << 23)); // e += 15 - x = _mm_and_si128(x, _mm_set1_epi32(0x7fffffffu)); // Discard sign + x_exp = _mm_castps_si128( + _mm_max_ps(_mm_castsi128_ps(x_exp), _mm_castsi128_ps(exp_max))); // max(e, -14) + x_exp = _mm_add_epi32(x_exp, _mm_set1_epi32(15u << 23)); // e += 15 + x = _mm_and_si128(x, _mm_set1_epi32(0x7fffffffu)); // Discard sign - __m128 f = _mm_castsi128_ps(x); + __m128 f = _mm_castsi128_ps(x); __m128 magicf = _mm_castsi128_ps(x_exp); // If 15 < e then inf, otherwise e += 2 @@ -111,13 +119,14 @@ static inline __m128i sse2_cvtps_ph(__m128 a) // blend in nan values only if present __m128i nan_mask = _mm_cmpgt_epi32(x, _mm_set1_epi32(0x7f800000u)); - if (_mm_movemask_epi8(nan_mask)) { + if (_mm_movemask_epi8(nan_mask)) + { __m128i nan = _mm_and_si128(_mm_srli_epi32(x, 13), _mm_set1_epi32(0x03FFu)); - nan = _mm_or_si128(_mm_set1_epi32(0x0200u), nan); - h_sig = sse2_blendv(h_sig, nan, nan_mask); + nan = _mm_or_si128(_mm_set1_epi32(0x0200u), nan); + h_sig = sse2_blendv(h_sig, nan, nan_mask); } - __m128i ph = _mm_add_epi32(_mm_srli_epi32(x_sgn, 16),_mm_add_epi32(h_exp, h_sig)); + __m128i ph = _mm_add_epi32(_mm_srli_epi32(x_sgn, 16), _mm_add_epi32(h_exp, h_sig)); // pack u16 values into lower 64 bits ph = _mm_shufflehi_epi16(ph, (1 << 6 | 1 << 4 | 2 << 2 | 0 << 0)); @@ -148,34 +157,36 @@ static inline __m128 sse2_cvtph_ps(__m128i a) // blend in inf/nan values only if present __m128i mask = _mm_castps_si128(_mm_cmpge_ps(o, was_infnan)); - if (_mm_movemask_epi8(mask)) { - __m128i ou = _mm_castps_si128(o); - __m128i ou_nan = _mm_or_si128(ou, _mm_set1_epi32( 0x01FF << 22)); - __m128i ou_inf = _mm_or_si128(ou, _mm_set1_epi32( 0x00FF << 23)); + if (_mm_movemask_epi8(mask)) + { + __m128i ou = _mm_castps_si128(o); + __m128i ou_nan = _mm_or_si128(ou, _mm_set1_epi32(0x01FF << 22)); + __m128i ou_inf = _mm_or_si128(ou, _mm_set1_epi32(0x00FF << 23)); // blend in nans ou = sse2_blendv(ou, ou_nan, mask); // blend in infinities - mask = _mm_cmpeq_epi32( _mm_castps_si128(o), _mm_castps_si128(was_infnan)); - o = _mm_castsi128_ps(sse2_blendv(ou, ou_inf, mask)); + mask = _mm_cmpeq_epi32(_mm_castps_si128(o), _mm_castps_si128(was_infnan)); + o = _mm_castsi128_ps(sse2_blendv(ou, ou_inf, mask)); } - return _mm_or_ps(o, sign); + return _mm_or_ps(o, sign); } #endif // Note Packing functions perform no 0.0 - 1.0 normalization // but perform 0 - max value clamping for integer formats -template struct SSE2RGBAPack {}; -template <> -struct SSE2RGBAPack +template struct SSE2RGBAPack +{ +}; +template <> struct SSE2RGBAPack { - static inline void Load(const uint8_t *in, __m128& r, __m128& g, __m128& b, __m128& a) + static inline void Load(const uint8_t * in, __m128 & r, __m128 & g, __m128 & b, __m128 & a) { const __m128i zero = _mm_setzero_si128(); - __m128i rgba_00_03 = _mm_loadu_si128((const __m128i*)in); + __m128i rgba_00_03 = _mm_loadu_si128((const __m128i *)in); __m128i rgba_00_01 = _mm_unpacklo_epi8(rgba_00_03, zero); __m128i rgba_02_03 = _mm_unpackhi_epi8(rgba_00_03, zero); @@ -188,33 +199,33 @@ struct SSE2RGBAPack sse2RGBATranspose_4x4(rgba0, rgba1, rgba2, rgba3, r, g, b, a); } - static inline void Store(uint8_t *out, __m128 r_in, __m128 g_in, __m128 b_in, __m128 a_in) + static inline void Store(uint8_t * out, __m128 r_in, __m128 g_in, __m128 b_in, __m128 a_in) { const __m128 maxValue = _mm_set1_ps(255.0f); - // NOTE note using cvtps which will round based on MXCSR register defaults to _MM_ROUND_NEAREST + // NOTE note using cvtps which will round based on MXCSR register defaults to + // _MM_ROUND_NEAREST __m128i r = _mm_cvtps_epi32(sse2_clamp(r_in, maxValue)); __m128i g = _mm_cvtps_epi32(sse2_clamp(g_in, maxValue)); __m128i b = _mm_cvtps_epi32(sse2_clamp(b_in, maxValue)); __m128i a = _mm_cvtps_epi32(sse2_clamp(a_in, maxValue)); __m128i rgba = _mm_or_si128(r, _mm_slli_si128(g, 1)); - rgba = _mm_or_si128(rgba, _mm_slli_si128(b, 2)); - rgba = _mm_or_si128(rgba, _mm_slli_si128(a, 3)); - _mm_storeu_si128((__m128i*)out, rgba); + rgba = _mm_or_si128(rgba, _mm_slli_si128(b, 2)); + rgba = _mm_or_si128(rgba, _mm_slli_si128(a, 3)); + _mm_storeu_si128((__m128i *)out, rgba); } }; -template -struct SSE2RGBAPack16 +template struct SSE2RGBAPack16 { typedef typename BitDepthInfo::Type Type; - static inline void Load(const Type *in, __m128& r, __m128& g, __m128& b, __m128& a) + static inline void Load(const Type * in, __m128 & r, __m128 & g, __m128 & b, __m128 & a) { const __m128i zero = _mm_setzero_si128(); - __m128i rgba_00_01 = _mm_loadu_si128((const __m128i*)(in + 0)); - __m128i rgba_02_03 = _mm_loadu_si128((const __m128i*)(in + 8)); + __m128i rgba_00_01 = _mm_loadu_si128((const __m128i *)(in + 0)); + __m128i rgba_02_03 = _mm_loadu_si128((const __m128i *)(in + 8)); __m128 rgba0 = _mm_cvtepi32_ps(_mm_unpacklo_epi16(rgba_00_01, zero)); __m128 rgba1 = _mm_cvtepi32_ps(_mm_unpackhi_epi16(rgba_00_01, zero)); @@ -225,7 +236,7 @@ struct SSE2RGBAPack16 sse2RGBATranspose_4x4(rgba0, rgba1, rgba2, rgba3, r, g, b, a); } - static inline void Store(Type *out, __m128 r, __m128 g, __m128 b, __m128 a) + static inline void Store(Type * out, __m128 r, __m128 g, __m128 b, __m128 a) { const __m128 maxValue = _mm_set1_ps((float)BitDepthInfo::maxValue); @@ -240,82 +251,74 @@ struct SSE2RGBAPack16 __m128i rgba_00_01 = _mm_unpacklo_epi32(rgrg_rgrg, baba_baba); __m128i rgba_02_03 = _mm_unpackhi_epi32(rgrg_rgrg, baba_baba); - _mm_storeu_si128((__m128i*)(out + 0), rgba_00_01); - _mm_storeu_si128((__m128i*)(out + 8), rgba_02_03); + _mm_storeu_si128((__m128i *)(out + 0), rgba_00_01); + _mm_storeu_si128((__m128i *)(out + 8), rgba_02_03); } }; -template <> -struct SSE2RGBAPack +template <> struct SSE2RGBAPack { - static inline void Load(const uint16_t *in, __m128& r, __m128& g, __m128& b, __m128& a) + static inline void Load(const uint16_t * in, __m128 & r, __m128 & g, __m128 & b, __m128 & a) { SSE2RGBAPack16::Load(in, r, g, b, a); } - static inline void Store(uint16_t *out, __m128 r, __m128 g, __m128 b, __m128 a) + static inline void Store(uint16_t * out, __m128 r, __m128 g, __m128 b, __m128 a) { SSE2RGBAPack16::Store(out, r, g, b, a); } }; -template <> -struct SSE2RGBAPack +template <> struct SSE2RGBAPack { - static inline void Load(const uint16_t *in, __m128& r, __m128& g, __m128& b, __m128& a) + static inline void Load(const uint16_t * in, __m128 & r, __m128 & g, __m128 & b, __m128 & a) { SSE2RGBAPack16::Load(in, r, g, b, a); } - static inline void Store(uint16_t *out, __m128 r, __m128 g, __m128 b, __m128 a) + static inline void Store(uint16_t * out, __m128 r, __m128 g, __m128 b, __m128 a) { SSE2RGBAPack16::Store(out, r, g, b, a); } }; -template <> -struct SSE2RGBAPack +template <> struct SSE2RGBAPack { - static inline void Load(const uint16_t *in, __m128& r, __m128& g, __m128& b, __m128& a) + static inline void Load(const uint16_t * in, __m128 & r, __m128 & g, __m128 & b, __m128 & a) { SSE2RGBAPack16::Load(in, r, g, b, a); } - static inline void Store(uint16_t *out, __m128 r, __m128 g, __m128 b, __m128 a) + static inline void Store(uint16_t * out, __m128 r, __m128 g, __m128 b, __m128 a) { SSE2RGBAPack16::Store(out, r, g, b, a); } }; -template <> -struct SSE2RGBAPack +template <> struct SSE2RGBAPack { - static inline void Load(const half *in, __m128& r, __m128& g, __m128& b, __m128& a) + static inline void Load(const half * in, __m128 & r, __m128 & g, __m128 & b, __m128 & a) { - __m128i rgba_00_01 = _mm_loadu_si128((const __m128i*)(in + 0)); - __m128i rgba_02_03 = _mm_loadu_si128((const __m128i*)(in + 8)); + __m128i rgba_00_01 = _mm_loadu_si128((const __m128i *)(in + 0)); + __m128i rgba_02_03 = _mm_loadu_si128((const __m128i *)(in + 8)); #if OCIO_USE_SSE2NEON // use neon hardware support for f16 to f32 __m128 rgba0 = vreinterpretq_m128_f32( - vcvt_f32_f16(vget_low_f16(vreinterpretq_f16_s64(vreinterpretq_s64_m128i(rgba_00_01)))) - ); - __m128 rgba1 = vreinterpretq_m128_f32( - vcvt_f32_f16(vget_high_f16(vreinterpretq_f16_s64(vreinterpretq_s64_m128i(rgba_00_01)))) - ); + vcvt_f32_f16(vget_low_f16(vreinterpretq_f16_s64(vreinterpretq_s64_m128i(rgba_00_01))))); + __m128 rgba1 = vreinterpretq_m128_f32(vcvt_f32_f16( + vget_high_f16(vreinterpretq_f16_s64(vreinterpretq_s64_m128i(rgba_00_01))))); __m128 rgba2 = vreinterpretq_m128_f32( - vcvt_f32_f16(vget_low_f16(vreinterpretq_f16_s64(vreinterpretq_s64_m128i(rgba_02_03)))) - ); - __m128 rgba3 = vreinterpretq_m128_f32( - vcvt_f32_f16(vget_high_f16(vreinterpretq_f16_s64(vreinterpretq_s64_m128i(rgba_02_03)))) - ); + vcvt_f32_f16(vget_low_f16(vreinterpretq_f16_s64(vreinterpretq_s64_m128i(rgba_02_03))))); + __m128 rgba3 = vreinterpretq_m128_f32(vcvt_f32_f16( + vget_high_f16(vreinterpretq_f16_s64(vreinterpretq_s64_m128i(rgba_02_03))))); #else __m128 rgba0 = sse2_cvtph_ps(rgba_00_01); - __m128 rgba1 = sse2_cvtph_ps(_mm_shuffle_epi32(rgba_00_01, _MM_SHUFFLE(1,0,3,2))); + __m128 rgba1 = sse2_cvtph_ps(_mm_shuffle_epi32(rgba_00_01, _MM_SHUFFLE(1, 0, 3, 2))); __m128 rgba2 = sse2_cvtph_ps(rgba_02_03); - __m128 rgba3 = sse2_cvtph_ps(_mm_shuffle_epi32(rgba_02_03, _MM_SHUFFLE(1,0,3,2))); + __m128 rgba3 = sse2_cvtph_ps(_mm_shuffle_epi32(rgba_02_03, _MM_SHUFFLE(1, 0, 3, 2))); #endif sse2RGBATranspose_4x4(rgba0, rgba1, rgba2, rgba3, r, g, b, a); } - static inline void Store(half *out, __m128 r, __m128 g, __m128 b, __m128 a) + static inline void Store(half * out, __m128 r, __m128 g, __m128 b, __m128 a) { __m128 rgba0, rgba1, rgba2, rgba3; sse2RGBATranspose_4x4(r, g, b, a, rgba0, rgba1, rgba2, rgba3); @@ -327,11 +330,11 @@ struct SSE2RGBAPack float16x4_t rgba03_03 = vcvt_f16_f32(vreinterpretq_f32_m128(rgba1)); float16x4_t rgba04_05 = vcvt_f16_f32(vreinterpretq_f32_m128(rgba2)); float16x4_t rgba06_07 = vcvt_f16_f32(vreinterpretq_f32_m128(rgba3)); - rgba = vcombine_f16(rgba00_01, rgba03_03); - vst1q_f16((float16_t *)(out+0), rgba); + rgba = vcombine_f16(rgba00_01, rgba03_03); + vst1q_f16((float16_t *)(out + 0), rgba); rgba = vcombine_f16(rgba04_05, rgba06_07); - vst1q_f16((float16_t *)(out+8), rgba); + vst1q_f16((float16_t *)(out + 8), rgba); #else __m128i rgba; __m128i rgba00_01 = sse2_cvtps_ph(rgba0); @@ -339,41 +342,39 @@ struct SSE2RGBAPack __m128i rgba04_05 = sse2_cvtps_ph(rgba2); __m128i rgba06_07 = sse2_cvtps_ph(rgba3); - rgba = _mm_xor_si128(rgba00_01, _mm_shuffle_epi32(rgba02_03, _MM_SHUFFLE(1,0,3,2))); - _mm_storeu_si128((__m128i*)(out+0), rgba); + rgba = _mm_xor_si128(rgba00_01, _mm_shuffle_epi32(rgba02_03, _MM_SHUFFLE(1, 0, 3, 2))); + _mm_storeu_si128((__m128i *)(out + 0), rgba); - rgba = _mm_xor_si128(rgba04_05, _mm_shuffle_epi32(rgba06_07, _MM_SHUFFLE(1,0,3,2))); - _mm_storeu_si128((__m128i*)(out+8), rgba); + rgba = _mm_xor_si128(rgba04_05, _mm_shuffle_epi32(rgba06_07, _MM_SHUFFLE(1, 0, 3, 2))); + _mm_storeu_si128((__m128i *)(out + 8), rgba); #endif } }; -template <> -struct SSE2RGBAPack +template <> struct SSE2RGBAPack { - static inline void Load(const float *in, __m128& r, __m128& g, __m128& b, __m128& a) + static inline void Load(const float * in, __m128 & r, __m128 & g, __m128 & b, __m128 & a) { - __m128 rgba0 = _mm_loadu_ps(in + 0); - __m128 rgba1 = _mm_loadu_ps(in + 4); - __m128 rgba2 = _mm_loadu_ps(in + 8); + __m128 rgba0 = _mm_loadu_ps(in + 0); + __m128 rgba1 = _mm_loadu_ps(in + 4); + __m128 rgba2 = _mm_loadu_ps(in + 8); __m128 rgba3 = _mm_loadu_ps(in + 12); sse2RGBATranspose_4x4(rgba0, rgba1, rgba2, rgba3, r, g, b, a); } - static inline void Store(float *out, __m128 r, __m128 g, __m128 b, __m128 a) + static inline void Store(float * out, __m128 r, __m128 g, __m128 b, __m128 a) { __m128 rgba0, rgba1, rgba2, rgba3; sse2RGBATranspose_4x4(r, g, b, a, rgba0, rgba1, rgba2, rgba3); - _mm_storeu_ps(out + 0, rgba0); - _mm_storeu_ps(out + 4, rgba1); - _mm_storeu_ps(out + 8, rgba2); + _mm_storeu_ps(out + 0, rgba0); + _mm_storeu_ps(out + 4, rgba1); + _mm_storeu_ps(out + 8, rgba2); _mm_storeu_ps(out + 12, rgba3); } }; - } // namespace OCIO_NAMESPACE #endif // OCIO_USE_SSE2 diff --git a/src/OpenColorIO/ScanlineHelper.cpp b/src/OpenColorIO/ScanlineHelper.cpp index 59a0020a5e..22931e6ac3 100644 --- a/src/OpenColorIO/ScanlineHelper.cpp +++ b/src/OpenColorIO/ScanlineHelper.cpp @@ -8,7 +8,6 @@ #include "BitDepthUtils.h" #include "ScanlineHelper.h" - namespace OCIO_NAMESPACE { @@ -16,11 +15,11 @@ Optimizations GetOptimizationMode(const GenericImageDesc & imgDesc) { Optimizations optim = NO_OPTIMIZATION; - if(imgDesc.isRGBAPacked()) + if (imgDesc.isRGBAPacked()) { optim = PACKED_OPTIMIZATION; - if(imgDesc.isFloat()) + if (imgDesc.isFloat()) { optim = PACKED_FLOAT_OPTIMIZATION; } @@ -29,33 +28,35 @@ Optimizations GetOptimizationMode(const GenericImageDesc & imgDesc) return optim; } - -template -GenericScanlineHelper::GenericScanlineHelper(BitDepth inputBitDepth, - const ConstOpCPURcPtr & inBitDepthOp, - BitDepth outputBitDepth, - const ConstOpCPURcPtr & outBitDepthOp) - : ScanlineHelper() - , m_inputBitDepth(inputBitDepth) - , m_outputBitDepth(outputBitDepth) - , m_inBitDepthOp(inBitDepthOp) - , m_outBitDepthOp(outBitDepthOp) - , m_inOptimizedMode(NO_OPTIMIZATION) - , m_outOptimizedMode(NO_OPTIMIZATION) - , m_yIndex(0) - , m_useDstBuffer(false) +template +GenericScanlineHelper::GenericScanlineHelper( + BitDepth inputBitDepth, + const ConstOpCPURcPtr & inBitDepthOp, + BitDepth outputBitDepth, + const ConstOpCPURcPtr & outBitDepthOp) + : ScanlineHelper() + , m_inputBitDepth(inputBitDepth) + , m_outputBitDepth(outputBitDepth) + , m_inBitDepthOp(inBitDepthOp) + , m_outBitDepthOp(outBitDepthOp) + , m_inOptimizedMode(NO_OPTIMIZATION) + , m_outOptimizedMode(NO_OPTIMIZATION) + , m_yIndex(0) + , m_useDstBuffer(false) { } -template -void GenericScanlineHelper::init(const ImageDesc & srcImg, const ImageDesc & dstImg) +template +void GenericScanlineHelper::init( + const ImageDesc & srcImg, + const ImageDesc & dstImg) { m_yIndex = 0; m_srcImg.init(srcImg, m_inputBitDepth, m_inBitDepthOp); m_dstImg.init(dstImg, m_outputBitDepth, m_outBitDepthOp); - if(m_srcImg.m_width!=m_dstImg.m_width || m_srcImg.m_height!=m_dstImg.m_height) + if (m_srcImg.m_width != m_dstImg.m_width || m_srcImg.m_height != m_dstImg.m_height) { throw Exception("Dimension inconsistency between source and destination image buffers."); } @@ -64,16 +65,15 @@ void GenericScanlineHelper::init(const ImageDesc & srcImg, cons m_outOptimizedMode = GetOptimizationMode(m_dstImg); // Can the output buffer be used as the internal RGBA F32 buffer? - m_useDstBuffer - = (m_outOptimizedMode & PACKED_FLOAT_OPTIMIZATION) == PACKED_FLOAT_OPTIMIZATION; + m_useDstBuffer = (m_outOptimizedMode & PACKED_FLOAT_OPTIMIZATION) == PACKED_FLOAT_OPTIMIZATION; - if( (m_inOptimizedMode & PACKED_OPTIMIZATION) != PACKED_OPTIMIZATION) + if ((m_inOptimizedMode & PACKED_OPTIMIZATION) != PACKED_OPTIMIZATION) { const long bufferSize = 4 * m_dstImg.m_width; m_inBitDepthBuffer.resize(bufferSize); } - if(!m_useDstBuffer) + if (!m_useDstBuffer) { const long bufferSize = 4 * m_dstImg.m_width; m_rgbaFloatBuffer.resize(bufferSize); @@ -81,7 +81,7 @@ void GenericScanlineHelper::init(const ImageDesc & srcImg, cons } } -template +template void GenericScanlineHelper::init(const ImageDesc & img) { m_yIndex = 0; @@ -93,10 +93,9 @@ void GenericScanlineHelper::init(const ImageDesc & img) m_outOptimizedMode = m_inOptimizedMode; // Can the output buffer be used as the internal RGBA F32 buffer? - m_useDstBuffer - = (m_outOptimizedMode & PACKED_FLOAT_OPTIMIZATION) == PACKED_FLOAT_OPTIMIZATION; + m_useDstBuffer = (m_outOptimizedMode & PACKED_FLOAT_OPTIMIZATION) == PACKED_FLOAT_OPTIMIZATION; - if(!m_useDstBuffer) + if (!m_useDstBuffer) { // TODO: Re-use memory from thread-safe memory pool, rather // than doing a new allocation each time. @@ -109,29 +108,29 @@ void GenericScanlineHelper::init(const ImageDesc & img) } } -template +template GenericScanlineHelper::~GenericScanlineHelper() { } // Copy from the src image to our scanline, in our preferred pixel layout. -template -void GenericScanlineHelper::prepRGBAScanline(float** buffer, long & numPixels) +template +void GenericScanlineHelper::prepRGBAScanline(float ** buffer, long & numPixels) { // Note that only a line-by-line processing is done on the image buffer. - if(m_yIndex >= m_dstImg.m_height) + if (m_yIndex >= m_dstImg.m_height) { numPixels = 0; return; } - *buffer = m_useDstBuffer ? (float*)(m_dstImg.m_rData + m_dstImg.m_yStrideBytes * m_yIndex) + *buffer = m_useDstBuffer ? (float *)(m_dstImg.m_rData + m_dstImg.m_yStrideBytes * m_yIndex) : &m_rgbaFloatBuffer[0]; - if((m_inOptimizedMode&PACKED_OPTIMIZATION)==PACKED_OPTIMIZATION) + if ((m_inOptimizedMode & PACKED_OPTIMIZATION) == PACKED_OPTIMIZATION) { - const void * inBuffer = (void*)(m_srcImg.m_rData + m_srcImg.m_yStrideBytes * m_yIndex); + const void * inBuffer = (void *)(m_srcImg.m_rData + m_srcImg.m_yStrideBytes * m_yIndex); m_srcImg.m_bitDepthOp->apply(inBuffer, *buffer, m_dstImg.m_width); } @@ -139,50 +138,47 @@ void GenericScanlineHelper::prepRGBAScanline(float** buffer, lo { // Pack from any channel ordering & bit-depth to a packed RGBA F32 buffer. - Generic::PackRGBAFromImageDesc(m_srcImg, - &m_inBitDepthBuffer[0], - *buffer, - m_dstImg.m_width, - m_yIndex * m_dstImg.m_width); + Generic::PackRGBAFromImageDesc( + m_srcImg, + &m_inBitDepthBuffer[0], + *buffer, + m_dstImg.m_width, + m_yIndex * m_dstImg.m_width); } numPixels = m_dstImg.m_width; } // Write back the result of our work, from the scanline to our destination image. -template +template void GenericScanlineHelper::finishRGBAScanline() { // Note that only a line-by-line processing is done on the image buffer. - if((m_outOptimizedMode&PACKED_OPTIMIZATION)==PACKED_OPTIMIZATION) + if ((m_outOptimizedMode & PACKED_OPTIMIZATION) == PACKED_OPTIMIZATION) { - void * out = (void*)(m_dstImg.m_rData + m_dstImg.m_yStrideBytes * m_yIndex); + void * out = (void *)(m_dstImg.m_rData + m_dstImg.m_yStrideBytes * m_yIndex); - const void * in = m_useDstBuffer ? out : (void*)&m_rgbaFloatBuffer[0]; + const void * in = m_useDstBuffer ? out : (void *)&m_rgbaFloatBuffer[0]; m_dstImg.m_bitDepthOp->apply(in, out, m_dstImg.m_width); } else { // Unpack from packed RGBA F32 to any channel ordering & bit-depth. - Generic::UnpackRGBAToImageDesc(m_dstImg, - &m_rgbaFloatBuffer[0], - &m_outBitDepthBuffer[0], - m_dstImg.m_width, - m_yIndex * m_dstImg.m_width); + Generic::UnpackRGBAToImageDesc( + m_dstImg, + &m_rgbaFloatBuffer[0], + &m_outBitDepthBuffer[0], + m_dstImg.m_width, + m_yIndex * m_dstImg.m_width); } ++m_yIndex; } - - //////////////////////////////////////////////////////////////////////////// - - - template class GenericScanlineHelper; template class GenericScanlineHelper; template class GenericScanlineHelper; @@ -203,5 +199,4 @@ template class GenericScanlineHelper; template class GenericScanlineHelper; template class GenericScanlineHelper; - } // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/ScanlineHelper.h b/src/OpenColorIO/ScanlineHelper.h index f2a7a9c0f5..87bfb3dd30 100644 --- a/src/OpenColorIO/ScanlineHelper.h +++ b/src/OpenColorIO/ScanlineHelper.h @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_SCANLINEHELPER_H #define INCLUDED_OCIO_SCANLINEHELPER_H @@ -16,42 +15,43 @@ namespace OCIO_NAMESPACE enum Optimizations { NO_OPTIMIZATION = 0x00, - PACKED_OPTIMIZATION = 0x01, // The image is a packed RGBA buffer. - FLOAT_OPTIMIZATION = 0x02, // The image is a F32 i.e. 32-bit float. + PACKED_OPTIMIZATION = 0x01, // The image is a packed RGBA buffer. + FLOAT_OPTIMIZATION = 0x02, // The image is a F32 i.e. 32-bit float. - PACKED_FLOAT_OPTIMIZATION = (PACKED_OPTIMIZATION|FLOAT_OPTIMIZATION) + PACKED_FLOAT_OPTIMIZATION = (PACKED_OPTIMIZATION | FLOAT_OPTIMIZATION) }; Optimizations GetOptimizationMode(const GenericImageDesc & imgDesc); - class ScanlineHelper { public: - ScanlineHelper() = default; - ScanlineHelper(const ScanlineHelper &) = delete; - ScanlineHelper& operator=(const ScanlineHelper &) = delete; + ScanlineHelper() = default; + ScanlineHelper(const ScanlineHelper &) = delete; + ScanlineHelper & operator=(const ScanlineHelper &) = delete; virtual ~ScanlineHelper() = default; virtual void init(const ImageDesc & srcImg, const ImageDesc & dstImg) = 0; - virtual void init(const ImageDesc & img) = 0; + virtual void init(const ImageDesc & img) = 0; - virtual void prepRGBAScanline(float** buffer, long & numPixels) = 0; + virtual void prepRGBAScanline(float ** buffer, long & numPixels) = 0; virtual void finishRGBAScanline() = 0; }; -template -class GenericScanlineHelper : public ScanlineHelper +template class GenericScanlineHelper : public ScanlineHelper { public: - GenericScanlineHelper() = delete; - GenericScanlineHelper(const GenericScanlineHelper&) = delete; - GenericScanlineHelper& operator=(const GenericScanlineHelper&) = delete; + GenericScanlineHelper() = delete; + GenericScanlineHelper(const GenericScanlineHelper &) = delete; + GenericScanlineHelper & operator=(const GenericScanlineHelper &) = delete; - GenericScanlineHelper(BitDepth inputBitDepth, const ConstOpCPURcPtr & inBitDepthOp, - BitDepth outputBitDepth, const ConstOpCPURcPtr & outBitDepthOp); + GenericScanlineHelper( + BitDepth inputBitDepth, + const ConstOpCPURcPtr & inBitDepthOp, + BitDepth outputBitDepth, + const ConstOpCPURcPtr & outBitDepthOp); void init(const ImageDesc & srcImg, const ImageDesc & dstImg) override; void init(const ImageDesc & img) override; @@ -61,7 +61,7 @@ class GenericScanlineHelper : public ScanlineHelper // Copy from the src image to our scanline, in our preferred // pixel layout. Return the number of pixels to process. - void prepRGBAScanline(float** buffer, long & numPixels) override; + void prepRGBAScanline(float ** buffer, long & numPixels) override; // Write back the result of our work, from the scanline to our // destination image. @@ -97,7 +97,6 @@ class GenericScanlineHelper : public ScanlineHelper bool m_useDstBuffer; }; - } // namespace OCIO_NAMESPACE #endif diff --git a/src/OpenColorIO/SystemMonitor.cpp b/src/OpenColorIO/SystemMonitor.cpp index 8ee5e915e5..89ee99c709 100644 --- a/src/OpenColorIO/SystemMonitor.cpp +++ b/src/OpenColorIO/SystemMonitor.cpp @@ -1,17 +1,15 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #include -#include #include +#include #include #include "Mutex.h" #include "SystemMonitor.h" - #ifdef OCIO_HEADLESS_ENABLED namespace OCIO_NAMESPACE @@ -22,7 +20,6 @@ void SystemMonitorsImpl::getAllMonitors() // A headless machine does not have any monitors. } - } // namespace OCIO_NAMESPACE #elif __APPLE__ @@ -48,7 +45,6 @@ void SystemMonitorsImpl::getAllMonitors() #endif - namespace OCIO_NAMESPACE { @@ -58,7 +54,7 @@ ConstSystemMonitorsRcPtr SystemMonitors::Get() noexcept static Mutex mutex; AutoMutex guard(mutex); - + if (!monitors) { SystemMonitorsRcPtr m = std::make_shared(); @@ -84,8 +80,8 @@ const char * SystemMonitorsImpl::getMonitorName(size_t index) const if (index >= m_monitors.size()) { std::ostringstream oss; - oss << "Invalid index for the monitor name " << index - << " where the number of monitors is " << m_monitors.size() << "."; + oss << "Invalid index for the monitor name " << index << " where the number of monitors is " + << m_monitors.size() << "."; throw Exception(oss.str().c_str()); } @@ -97,8 +93,8 @@ const char * SystemMonitorsImpl::getProfileFilepath(size_t index) const if (index >= m_monitors.size()) { std::ostringstream oss; - oss << "Invalid index for the monitor name " << index - << " where the number of monitors is " << m_monitors.size() << "."; + oss << "Invalid index for the monitor name " << index << " where the number of monitors is " + << m_monitors.size() << "."; throw Exception(oss.str().c_str()); } diff --git a/src/OpenColorIO/SystemMonitor.h b/src/OpenColorIO/SystemMonitor.h index 37f5019863..1702ae3ab1 100644 --- a/src/OpenColorIO/SystemMonitor.h +++ b/src/OpenColorIO/SystemMonitor.h @@ -4,23 +4,21 @@ #ifndef INCLUDED_OCIO_SYSTEM_MONITOR_H #define INCLUDED_OCIO_SYSTEM_MONITOR_H - #include #include #include - namespace OCIO_NAMESPACE { class SystemMonitorsImpl : public SystemMonitors { public: - SystemMonitorsImpl() = default; - SystemMonitorsImpl(const SystemMonitorsImpl &) = delete; - SystemMonitorsImpl & operator= (const SystemMonitorsImpl &) = delete; - virtual ~SystemMonitorsImpl() = default; + SystemMonitorsImpl() = default; + SystemMonitorsImpl(const SystemMonitorsImpl &) = delete; + SystemMonitorsImpl & operator=(const SystemMonitorsImpl &) = delete; + virtual ~SystemMonitorsImpl() = default; bool isSupported() const noexcept override; @@ -37,19 +35,20 @@ class SystemMonitorsImpl : public SystemMonitors { MonitorInfo() = default; MonitorInfo(const std::string & monitorName, const std::string & ICCFilepath) - : m_monitorName(monitorName) - , m_ICCFilepath(ICCFilepath) - {} + : m_monitorName(monitorName) + , m_ICCFilepath(ICCFilepath) + { + } ~MonitorInfo() = default; - std::string m_monitorName; // Name built using the vendor information from the monitor if accessible. + std::string m_monitorName; // Name built using the vendor information from the monitor if + // accessible. std::string m_ICCFilepath; // The ICC profile path. }; std::vector m_monitors; }; - } // namespace OCIO_NAMESPACE #endif // INCLUDED_OCIO_SYSTEM_MONITOR_H diff --git a/src/OpenColorIO/SystemMonitor_macos.cpp b/src/OpenColorIO/SystemMonitor_macos.cpp index 9957903885..921feb3323 100644 --- a/src/OpenColorIO/SystemMonitor_macos.cpp +++ b/src/OpenColorIO/SystemMonitor_macos.cpp @@ -1,37 +1,35 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #if !defined(__APPLE__) #error The file is for the macOS platform only. #endif - #include #include #include #include "Logging.h" - namespace OCIO_NAMESPACE { - -static constexpr char ErrorMsg[] { "Problem obtaining monitor profile information from operating system." }; - +static constexpr char ErrorMsg[]{ + "Problem obtaining monitor profile information from operating system."}; // Some variables must be released. -template -struct Guard +template struct Guard { - Guard() = delete; - Guard(const Guard &) = delete; + Guard() = delete; + Guard(const Guard &) = delete; Guard & operator=(const Guard &) = delete; - explicit Guard(T & data) : m_data(data) {} + explicit Guard(T & data) + : m_data(data) + { + } ~Guard() { release(); } void release() @@ -60,7 +58,8 @@ std::string GetICCProfilePath(CGDirectDisplayID dispId) throw Exception(ErrorMsg); } - CFDictionaryRef displayInfo = ColorSyncDeviceCopyDeviceInfo(kColorSyncDisplayDeviceClass, displayUUID); + CFDictionaryRef displayInfo + = ColorSyncDeviceCopyDeviceInfo(kColorSyncDisplayDeviceClass, displayUUID); Guard info(displayInfo); uuid.release(); @@ -104,8 +103,7 @@ std::string GetICCProfilePath(CGDirectDisplayID dispId) throw Exception(ErrorMsg); } - profileURL - = (CFURLRef)CFDictionaryGetValue(factoryProfileInfo, kColorSyncDeviceProfileURL); + profileURL = (CFURLRef)CFDictionaryGetValue(factoryProfileInfo, kColorSyncDeviceProfileURL); if (!profileURL) { throw Exception(ErrorMsg); @@ -113,14 +111,13 @@ std::string GetICCProfilePath(CGDirectDisplayID dispId) } char path[PATH_MAX]; - const bool result - = CFURLGetFileSystemRepresentation(profileURL, true, (UInt8 *)path, PATH_MAX); + const bool result = CFURLGetFileSystemRepresentation(profileURL, true, (UInt8 *)path, PATH_MAX); return result ? std::string(path) : throw Exception(ErrorMsg); } // Some references for 'Quartz Display Services' part of the 'Core Graphics' framework: -// * https://developer.apple.com/library/archive/documentation/GraphicsImaging/Conceptual/QuartzDisplayServicesConceptual/Introduction/Introduction.html#//apple_ref/doc/uid/TP40004245-SW1 +// * https://developer.apple.com/library/archive/documentation/GraphicsImaging/Conceptual/QuartzDisplayServicesConceptual/Introduction/Introduction.html#//apple_ref/doc/uid/TP40004245-SW1 // * https://developer.apple.com/documentation/coregraphics/quartz_display_services?language=objc void SystemMonitorsImpl::getAllMonitors() @@ -130,13 +127,13 @@ void SystemMonitorsImpl::getAllMonitors() // TODO: Needs to have all displays with a status to indicate the active ones? // CGGetActiveDisplayList provides only the list of displays that are active (i.e. drawable). - // Note: CGGetOnlineDisplayList provides the list of all displays that are online (active, + // Note: CGGetOnlineDisplayList provides the list of all displays that are online (active, // mirrored, or sleeping). // Get the number of active monitors. uint32_t maxDisplays = 0; - CGDisplayErr err = CGGetActiveDisplayList(0, nullptr, &maxDisplays); + CGDisplayErr err = CGGetActiveDisplayList(0, nullptr, &maxDisplays); if (err != kCGErrorSuccess) { throw Exception(ErrorMsg); @@ -167,8 +164,9 @@ void SystemMonitorsImpl::getAllMonitors() // Build a generic unique name if vendor information is not accessible. std::string displayName = "Monitor " + std::to_string(idx); - CFDictionaryRef displayInfo - = IODisplayCreateInfoDictionary(CGDisplayIOServicePort(dispId), kIODisplayOnlyPreferredName); + CFDictionaryRef displayInfo = IODisplayCreateInfoDictionary( + CGDisplayIOServicePort(dispId), + kIODisplayOnlyPreferredName); Guard info(displayInfo); if (!displayInfo) @@ -189,10 +187,11 @@ void SystemMonitorsImpl::getAllMonitors() std::vector values(number); CFDictionaryGetKeysAndValues(productInfo, nullptr, (const void **)&values[0]); - const CFIndex bufferSize = CFStringGetLength(values[0]) + 1; // +1 for null termination + const CFIndex bufferSize + = CFStringGetLength(values[0]) + 1; // +1 for null termination char buffer[bufferSize]; - // Return false if the buffer is too small or if the conversion fails. + // Return false if the buffer is too small or if the conversion fails. if (CFStringGetCString(values[0], buffer, bufferSize, kCFStringEncodingUTF8)) { // Build a name using the vendor information. @@ -210,12 +209,11 @@ void SystemMonitorsImpl::getAllMonitors() const std::string iccFilepath = GetICCProfilePath(dispId); m_monitors.push_back({displayName, iccFilepath}); } - catch(const Exception & ex) + catch (const Exception & ex) { std::ostringstream oss; - oss << "Failed to access ICC profile for the monitor '" - << displayName << "': " - << ex.what(); + oss << "Failed to access ICC profile for the monitor '" << displayName + << "': " << ex.what(); LogDebug(oss.str()); } diff --git a/src/OpenColorIO/SystemMonitor_windows.cpp b/src/OpenColorIO/SystemMonitor_windows.cpp index 4b8d71584b..2ffaeefb33 100644 --- a/src/OpenColorIO/SystemMonitor_windows.cpp +++ b/src/OpenColorIO/SystemMonitor_windows.cpp @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #if !defined(_WIN32) #error The file is for the Windows platform only. @@ -18,8 +17,8 @@ namespace OCIO_NAMESPACE { - -static constexpr char ErrorMsg[] { "Problem obtaining monitor profile information from operating system." }; +static constexpr char ErrorMsg[]{ + "Problem obtaining monitor profile information from operating system."}; // List all active display paths using QueryDisplayConfig and GetDisplayConfigBufferSizes. // Get the data from each path using DisplayConfigGetDeviceInfo. @@ -31,23 +30,29 @@ void getAllMonitorsWithQueryDisplayConfig(std::vector & monitorsNa std::vector modes; UINT32 flags = QDC_ONLY_ACTIVE_PATHS | QDC_VIRTUAL_MODE_AWARE; - LONG result = ERROR_SUCCESS; + LONG result = ERROR_SUCCESS; do { // Determine how many path and mode structures to allocate. UINT32 pathCount, modeCount; - // The GetDisplayConfigBufferSizes function retrieves the size of the buffers that are + // The GetDisplayConfigBufferSizes function retrieves the size of the buffers that are // required to call the QueryDisplayConfig function. result = GetDisplayConfigBufferSizes(flags, &pathCount, &modeCount); - + // Allocate the path and mode arrays. paths.resize(pathCount); modes.resize(modeCount); - // The QueryDisplayConfig function retrieves information about all possible display paths + // The QueryDisplayConfig function retrieves information about all possible display paths // for all display devices, or views, in the current setting. - result = QueryDisplayConfig(flags, &pathCount, paths.data(), &modeCount, modes.data(), nullptr); + result = QueryDisplayConfig( + flags, + &pathCount, + paths.data(), + &modeCount, + modes.data(), + nullptr); // The function may have returned fewer paths/modes than estimated. paths.resize(pathCount); @@ -55,45 +60,45 @@ void getAllMonitorsWithQueryDisplayConfig(std::vector & monitorsNa // It's possible that between the call to GetDisplayConfigBufferSizes and QueryDisplayConfig // that the display state changed, so loop on the case of ERROR_INSUFFICIENT_BUFFER. - } while (result == ERROR_INSUFFICIENT_BUFFER); + } + while (result == ERROR_INSUFFICIENT_BUFFER); if (result == ERROR_SUCCESS) { // For each active path - for (auto& path : paths) + for (auto & path : paths) { // The DISPLAYCONFIG_TARGET_DEVICE_NAME structure contains information about the target. // Find the target (monitor) friendly name DISPLAYCONFIG_TARGET_DEVICE_NAME targetName = {}; - targetName.header.adapterId = path.targetInfo.adapterId; - targetName.header.id = path.targetInfo.id; - targetName.header.type = DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME; - targetName.header.size = sizeof(targetName); + targetName.header.adapterId = path.targetInfo.adapterId; + targetName.header.id = path.targetInfo.id; + targetName.header.type = DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME; + targetName.header.size = sizeof(targetName); result = DisplayConfigGetDeviceInfo(&targetName.header); if (result == ERROR_SUCCESS) { monitorsName.push_back( - (result == ERROR_SUCCESS && targetName.flags.friendlyNameFromEdid) ? - targetName.monitorFriendlyDeviceName : L"" - ); + (result == ERROR_SUCCESS && targetName.flags.friendlyNameFromEdid) + ? targetName.monitorFriendlyDeviceName + : L""); } } } - } /** * Populate the internal structure with monitors name and ICC profiles name. - * - * Expected monitor display name: - * + * + * Expected monitor display name: + * * DISPLAYn, - * + * * where n is a positive integer starting at 1. * where monitorFriendlyDeviceName comes from DISPLAYCONFIG_TARGET_DEVICE_NAME structure. * where DeviceString comes from DISPLAY_DEVICE structure. - * + * */ void SystemMonitorsImpl::getAllMonitors() { @@ -114,8 +119,8 @@ void SystemMonitorsImpl::getAllMonitors() { const std::tstring deviceName = dispDevice.DeviceName; - // Only select active monitors. - // NOTE: Currently the two DISPLAY enums are equivalent, but we check both in case one may + // Only select active monitors. + // NOTE: Currently the two DISPLAY enums are equivalent, but we check both in case one may // change in the future. if ((dispDevice.StateFlags & DISPLAY_DEVICE_ACTIVE) && (dispDevice.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP)) @@ -128,8 +133,9 @@ void SystemMonitorsImpl::getAllMonitors() // After second call, dispDevice.DeviceString is the monitor name for that device. // Second parameters must be 0 to get the monitor name. - // See https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-enumdisplaydevicesw - EnumDisplayDevices(deviceName.c_str(), 0, &dispDevice, 0); + // See + // https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-enumdisplaydevicesw + EnumDisplayDevices(deviceName.c_str(), 0, &dispDevice, 0); TCHAR icmPath[MAX_PATH + 1]; DWORD pathLength = MAX_PATH; @@ -138,29 +144,31 @@ void SystemMonitorsImpl::getAllMonitors() // TODO: Several ICM profiles could be associated to a single device. - bool idxExists = friendlyMonitorNames.size() >= dispNum+1; + bool idxExists = friendlyMonitorNames.size() >= dispNum + 1; bool friendlyNameExists = idxExists && !friendlyMonitorNames.at(dispNum).empty(); // Check if the distNum index exists in friendlyMonitorNames vector and check if // there is a corresponding friendly name. - const std::tstring extra = friendlyNameExists ? - friendlyMonitorNames.at(dispNum) : std::tstring(dispDevice.DeviceString); + const std::tstring extra = friendlyNameExists + ? friendlyMonitorNames.at(dispNum) + : std::tstring(dispDevice.DeviceString); std::tstring strippedDeviceName = deviceName; - if(StringUtils::StartsWith(Platform::Utf16ToUtf8(deviceName), "\\\\.\\DISPLAY")) + if (StringUtils::StartsWith(Platform::Utf16ToUtf8(deviceName), "\\\\.\\DISPLAY")) { // Remove the slashes. std::string prefix = "\\\\.\\"; strippedDeviceName = deviceName.substr(prefix.length()); } - + const std::tstring displayName = strippedDeviceName + TEXT(", ") + extra; // Get the associated ICM profile path. if (GetICMProfile(hDC, &pathLength, icmPath)) { #ifdef _UNICODE - m_monitors.push_back({Platform::Utf16ToUtf8(displayName), Platform::Utf16ToUtf8(icmPath)}); + m_monitors.push_back( + {Platform::Utf16ToUtf8(displayName), Platform::Utf16ToUtf8(icmPath)}); #else m_monitors.push_back({displayName, icmPath}); #endif @@ -168,8 +176,8 @@ void SystemMonitorsImpl::getAllMonitors() else { std::tostringstream oss; - oss << TEXT("Unable to access the ICM profile for the monitor '") - << displayName << TEXT("'."); + oss << TEXT("Unable to access the ICM profile for the monitor '") << displayName + << TEXT("'."); LogDebugT(oss.str()); } diff --git a/src/OpenColorIO/TokensManager.h b/src/OpenColorIO/TokensManager.h index 706487289e..8e5bf966ce 100644 --- a/src/OpenColorIO/TokensManager.h +++ b/src/OpenColorIO/TokensManager.h @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_TOKENS_MANAGER_H #define INCLUDED_OCIO_TOKENS_MANAGER_H @@ -19,16 +18,17 @@ namespace OCIO_NAMESPACE class TokensManager { public: - TokensManager() = default; - TokensManager(const TokensManager &) = delete; - virtual ~TokensManager() = default; + TokensManager() = default; + TokensManager(const TokensManager &) = delete; + virtual ~TokensManager() = default; TokensManager & operator=(const TokensManager &) = default; typedef StringUtils::StringVec Tokens; Tokens::const_iterator findToken(const char * token) const noexcept { - if (!token || !*token) return m_tokens.end(); + if (!token || !*token) + return m_tokens.end(); // NB: Categories are not case-sensitive and whitespace is stripped. const std::string ref(StringUtils::Trim(StringUtils::Lower(token))); @@ -44,10 +44,7 @@ class TokensManager return m_tokens.end(); } - bool hasToken(const char * token) const noexcept - { - return findToken(token) != m_tokens.end(); - } + bool hasToken(const char * token) const noexcept { return findToken(token) != m_tokens.end(); } void addToken(const char * token) { @@ -59,7 +56,8 @@ class TokensManager void removeToken(const char * token) noexcept { - if (!token || !*token) return; + if (!token || !*token) + return; // NB: Categories are not case-sensitive and whitespace is stripped. const std::string ref(StringUtils::Trim(StringUtils::Lower(token))); @@ -76,22 +74,17 @@ class TokensManager return; } - int getNumTokens() const noexcept - { - return static_cast(m_tokens.size()); - } + int getNumTokens() const noexcept { return static_cast(m_tokens.size()); } const char * getToken(int index) const noexcept { - if (index<0 || index >= (int)m_tokens.size()) return nullptr; + if (index < 0 || index >= (int)m_tokens.size()) + return nullptr; return m_tokens[index].c_str(); } - void clearTokens() noexcept - { - m_tokens.clear(); - } + void clearTokens() noexcept { m_tokens.clear(); } private: Tokens m_tokens; diff --git a/src/OpenColorIO/Transform.cpp b/src/OpenColorIO/Transform.cpp old mode 100755 new mode 100644 index 0d723212e6..68259972f2 --- a/src/OpenColorIO/Transform.cpp +++ b/src/OpenColorIO/Transform.cpp @@ -6,8 +6,9 @@ #include -#include "fileformats/FormatMetadata.h" #include "OpBuilders.h" +#include "TransformBuilder.h" +#include "fileformats/FormatMetadata.h" #include "ops/cdl/CDLOp.h" #include "ops/exponent/ExponentOp.h" #include "ops/exposurecontrast/ExposureContrastOp.h" @@ -21,15 +22,12 @@ #include "ops/lut3d/Lut3DOp.h" #include "ops/matrix/MatrixOp.h" #include "ops/range/RangeOp.h" -#include "TransformBuilder.h" - namespace OCIO_NAMESPACE { void Transform::validate() const { - if (getDirection() != TRANSFORM_DIR_FORWARD - && getDirection() != TRANSFORM_DIR_INVERSE) + if (getDirection() != TRANSFORM_DIR_FORWARD && getDirection() != TRANSFORM_DIR_INVERSE) { std::string err(typeid(*this).name()); err += ": invalid direction."; @@ -38,264 +36,268 @@ void Transform::validate() const } } -void BuildOps(OpRcPtrVec & ops, - const Config & config, - const ConstContextRcPtr & context, - const ConstTransformRcPtr & transform, - TransformDirection dir) +void BuildOps( + OpRcPtrVec & ops, + const Config & config, + const ConstContextRcPtr & context, + const ConstTransformRcPtr & transform, + TransformDirection dir) { // A null transform is valid, and corresponds to a no-op. - if(!transform) + if (!transform) return; - if(ConstAllocationTransformRcPtr allocationTransform = \ - DynamicPtrCast(transform)) + if (ConstAllocationTransformRcPtr allocationTransform + = DynamicPtrCast(transform)) { BuildAllocationOp(ops, *allocationTransform, dir); } - else if(ConstBuiltinTransformRcPtr builtInTransform = \ - DynamicPtrCast(transform)) + else if ( + ConstBuiltinTransformRcPtr builtInTransform + = DynamicPtrCast(transform)) { BuildBuiltinOps(ops, *builtInTransform, dir); } - else if(ConstCDLTransformRcPtr cdlTransform = \ - DynamicPtrCast(transform)) + else if (ConstCDLTransformRcPtr cdlTransform = DynamicPtrCast(transform)) { BuildCDLOp(ops, config, *cdlTransform, dir); } - else if(ConstColorSpaceTransformRcPtr colorSpaceTransform = \ - DynamicPtrCast(transform)) + else if ( + ConstColorSpaceTransformRcPtr colorSpaceTransform + = DynamicPtrCast(transform)) { BuildColorSpaceOps(ops, config, context, *colorSpaceTransform, dir); } - else if(ConstDisplayViewTransformRcPtr displayViewTransform = \ - DynamicPtrCast(transform)) + else if ( + ConstDisplayViewTransformRcPtr displayViewTransform + = DynamicPtrCast(transform)) { BuildDisplayOps(ops, config, context, *displayViewTransform, dir); } - else if(ConstExponentTransformRcPtr exponentTransform = \ - DynamicPtrCast(transform)) + else if ( + ConstExponentTransformRcPtr exponentTransform + = DynamicPtrCast(transform)) { BuildExponentOp(ops, config, *exponentTransform, dir); } - else if(ConstExponentWithLinearTransformRcPtr expWithLinearTransform = \ - DynamicPtrCast(transform)) + else if ( + ConstExponentWithLinearTransformRcPtr expWithLinearTransform + = DynamicPtrCast(transform)) { BuildExponentWithLinearOp(ops, *expWithLinearTransform, dir); } - else if (ConstExposureContrastTransformRcPtr ecTransform = \ - DynamicPtrCast(transform)) + else if ( + ConstExposureContrastTransformRcPtr ecTransform + = DynamicPtrCast(transform)) { BuildExposureContrastOp(ops, *ecTransform, dir); } - else if(ConstFileTransformRcPtr fileTransform = \ - DynamicPtrCast(transform)) + else if (ConstFileTransformRcPtr fileTransform = DynamicPtrCast(transform)) { BuildFileTransformOps(ops, config, context, *fileTransform, dir); } - else if (ConstFixedFunctionTransformRcPtr fixedFunctionTransform = \ - DynamicPtrCast(transform)) + else if ( + ConstFixedFunctionTransformRcPtr fixedFunctionTransform + = DynamicPtrCast(transform)) { BuildFixedFunctionOp(ops, *fixedFunctionTransform, dir); } - else if (ConstGradingPrimaryTransformRcPtr gradingPrimaryTransform = \ - DynamicPtrCast(transform)) + else if ( + ConstGradingPrimaryTransformRcPtr gradingPrimaryTransform + = DynamicPtrCast(transform)) { BuildGradingPrimaryOp(ops, config, context, *gradingPrimaryTransform, dir); } - else if (ConstGradingRGBCurveTransformRcPtr gradingCurveTransform = \ - DynamicPtrCast(transform)) + else if ( + ConstGradingRGBCurveTransformRcPtr gradingCurveTransform + = DynamicPtrCast(transform)) { BuildGradingRGBCurveOp(ops, config, context, *gradingCurveTransform, dir); } - else if (ConstGradingToneTransformRcPtr gradingToneTransform = \ - DynamicPtrCast(transform)) + else if ( + ConstGradingToneTransformRcPtr gradingToneTransform + = DynamicPtrCast(transform)) { BuildGradingToneOp(ops, config, context, *gradingToneTransform, dir); } - else if(ConstGroupTransformRcPtr groupTransform = \ - DynamicPtrCast(transform)) + else if ( + ConstGroupTransformRcPtr groupTransform = DynamicPtrCast(transform)) { BuildGroupOps(ops, config, context, *groupTransform, dir); } - else if(ConstLogAffineTransformRcPtr logAffineTransform = \ - DynamicPtrCast(transform)) + else if ( + ConstLogAffineTransformRcPtr logAffineTransform + = DynamicPtrCast(transform)) { BuildLogOp(ops, *logAffineTransform, dir); } - else if(ConstLogCameraTransformRcPtr logCameraTransform = \ - DynamicPtrCast(transform)) + else if ( + ConstLogCameraTransformRcPtr logCameraTransform + = DynamicPtrCast(transform)) { BuildLogOp(ops, *logCameraTransform, dir); } - else if(ConstLogTransformRcPtr logTransform = \ - DynamicPtrCast(transform)) + else if (ConstLogTransformRcPtr logTransform = DynamicPtrCast(transform)) { BuildLogOp(ops, *logTransform, dir); } - else if(ConstLookTransformRcPtr lookTransform = \ - DynamicPtrCast(transform)) + else if (ConstLookTransformRcPtr lookTransform = DynamicPtrCast(transform)) { BuildLookOps(ops, config, context, *lookTransform, dir); } - else if (ConstLut1DTransformRcPtr lut1dTransform = \ - DynamicPtrCast(transform)) + else if ( + ConstLut1DTransformRcPtr lut1dTransform = DynamicPtrCast(transform)) { BuildLut1DOp(ops, *lut1dTransform, dir); } - else if (ConstLut3DTransformRcPtr lut3dTransform = \ - DynamicPtrCast(transform)) + else if ( + ConstLut3DTransformRcPtr lut3dTransform = DynamicPtrCast(transform)) { BuildLut3DOp(ops, *lut3dTransform, dir); } - else if(ConstMatrixTransformRcPtr matrixTransform = \ - DynamicPtrCast(transform)) + else if ( + ConstMatrixTransformRcPtr matrixTransform + = DynamicPtrCast(transform)) { BuildMatrixOp(ops, *matrixTransform, dir); } - else if(ConstRangeTransformRcPtr rangeTransform = \ - DynamicPtrCast(transform)) + else if ( + ConstRangeTransformRcPtr rangeTransform = DynamicPtrCast(transform)) { BuildRangeOp(ops, *rangeTransform, dir); } else { std::ostringstream error; - error << "Unknown transform type for creation: " - << typeid(transform).name(); + error << "Unknown transform type for creation: " << typeid(transform).name(); throw Exception(error.str().c_str()); } } -std::ostream& operator<< (std::ostream & os, const Transform & transform) +std::ostream & operator<<(std::ostream & os, const Transform & transform) { - const Transform* t = &transform; + const Transform * t = &transform; - if(const AllocationTransform * allocationTransform = \ - dynamic_cast(t)) + if (const AllocationTransform * allocationTransform + = dynamic_cast(t)) { os << *allocationTransform; } - else if(const BuiltinTransform * builtInTransform = \ - dynamic_cast(t)) + else if (const BuiltinTransform * builtInTransform = dynamic_cast(t)) { os << *builtInTransform; } - else if(const CDLTransform * cdlTransform = \ - dynamic_cast(t)) + else if (const CDLTransform * cdlTransform = dynamic_cast(t)) { os << *cdlTransform; } - else if(const ColorSpaceTransform * colorSpaceTransform = \ - dynamic_cast(t)) + else if ( + const ColorSpaceTransform * colorSpaceTransform + = dynamic_cast(t)) { os << *colorSpaceTransform; } - else if(const DisplayViewTransform * displayViewTransform = \ - dynamic_cast(t)) + else if ( + const DisplayViewTransform * displayViewTransform + = dynamic_cast(t)) { os << *displayViewTransform; } - else if(const ExponentTransform * exponentTransform = \ - dynamic_cast(t)) + else if ( + const ExponentTransform * exponentTransform = dynamic_cast(t)) { os << *exponentTransform; } - else if (const ExponentWithLinearTransform * exponentLinearTransform = \ - dynamic_cast(t)) + else if ( + const ExponentWithLinearTransform * exponentLinearTransform + = dynamic_cast(t)) { os << *exponentLinearTransform; } - else if (const ExposureContrastTransform * ecTransform = \ - dynamic_cast(t)) + else if ( + const ExposureContrastTransform * ecTransform + = dynamic_cast(t)) { os << *ecTransform; } - else if(const FileTransform * fileTransform = \ - dynamic_cast(t)) + else if (const FileTransform * fileTransform = dynamic_cast(t)) { os << *fileTransform; } - else if(const FixedFunctionTransform * fixedFunctionTransform = \ - dynamic_cast(t)) + else if ( + const FixedFunctionTransform * fixedFunctionTransform + = dynamic_cast(t)) { os << *fixedFunctionTransform; } - else if (const GradingPrimaryTransform * gradingPrimaryTransform = \ - dynamic_cast(t)) + else if ( + const GradingPrimaryTransform * gradingPrimaryTransform + = dynamic_cast(t)) { os << *gradingPrimaryTransform; } - else if (const GradingRGBCurveTransform * gradingRGBCurveTransform = \ - dynamic_cast(t)) + else if ( + const GradingRGBCurveTransform * gradingRGBCurveTransform + = dynamic_cast(t)) { os << *gradingRGBCurveTransform; } - else if (const GradingToneTransform * gradingToneTransform = \ - dynamic_cast(t)) + else if ( + const GradingToneTransform * gradingToneTransform + = dynamic_cast(t)) { os << *gradingToneTransform; } - else if(const GroupTransform * groupTransform = \ - dynamic_cast(t)) + else if (const GroupTransform * groupTransform = dynamic_cast(t)) { os << *groupTransform; } - else if (const LogAffineTransform * logAffineTransform = \ - dynamic_cast(t)) + else if ( + const LogAffineTransform * logAffineTransform = dynamic_cast(t)) { os << *logAffineTransform; } - else if (const LogCameraTransform * logCamTransform = \ - dynamic_cast(t)) + else if ( + const LogCameraTransform * logCamTransform = dynamic_cast(t)) { os << *logCamTransform; } - else if (const LogTransform * logTransform = \ - dynamic_cast(t)) + else if (const LogTransform * logTransform = dynamic_cast(t)) { os << *logTransform; } - else if(const LookTransform * lookTransform = \ - dynamic_cast(t)) + else if (const LookTransform * lookTransform = dynamic_cast(t)) { os << *lookTransform; } - else if (const Lut1DTransform * lut1dTransform = \ - dynamic_cast(t)) + else if (const Lut1DTransform * lut1dTransform = dynamic_cast(t)) { os << *lut1dTransform; } - else if (const Lut3DTransform * lut3dTransform = \ - dynamic_cast(t)) + else if (const Lut3DTransform * lut3dTransform = dynamic_cast(t)) { os << *lut3dTransform; } - else if(const MatrixTransform * matrixTransform = \ - dynamic_cast(t)) + else if (const MatrixTransform * matrixTransform = dynamic_cast(t)) { os << *matrixTransform; } - else if(const RangeTransform * rangeTransform = \ - dynamic_cast(t)) + else if (const RangeTransform * rangeTransform = dynamic_cast(t)) { os << *rangeTransform; } else { std::ostringstream error; - error << "Unknown transform type for serialization: " - << typeid(transform).name(); + error << "Unknown transform type for serialization: " << typeid(transform).name(); throw Exception(error.str().c_str()); - } return os; } - void CreateTransform(GroupTransformRcPtr & group, ConstOpRcPtr & op) { // AllocationNoOp, FileNoOp, LookNoOp won't create a Transform. @@ -359,8 +361,7 @@ void CreateTransform(GroupTransformRcPtr & group, ConstOpRcPtr & op) else { std::ostringstream error; - error << "CreateTransform from op. Missing implementation for: " - << typeid(op).name(); + error << "CreateTransform from op. Missing implementation for: " << typeid(op).name(); throw Exception(error.str().c_str()); } diff --git a/src/OpenColorIO/ViewTransform.cpp b/src/OpenColorIO/ViewTransform.cpp index 0a7ca21091..742dc37984 100644 --- a/src/OpenColorIO/ViewTransform.cpp +++ b/src/OpenColorIO/ViewTransform.cpp @@ -16,7 +16,7 @@ class ViewTransform::Impl std::string m_name; std::string m_family; std::string m_description; - ReferenceSpaceType m_referenceSpaceType{ REFERENCE_SPACE_SCENE }; + ReferenceSpaceType m_referenceSpaceType{REFERENCE_SPACE_SCENE}; TransformRcPtr m_toRefTransform; TransformRcPtr m_fromRefTransform; @@ -30,9 +30,9 @@ class ViewTransform::Impl } Impl(const Impl &) = delete; - ~Impl() = default; + ~Impl() = default; - Impl & operator= (const Impl & rhs) + Impl & operator=(const Impl & rhs) { if (this != &rhs) { @@ -42,12 +42,12 @@ class ViewTransform::Impl m_referenceSpaceType = rhs.m_referenceSpaceType; - m_toRefTransform = rhs.m_toRefTransform ? rhs.m_toRefTransform->createEditableCopy() : - rhs.m_toRefTransform; + m_toRefTransform = rhs.m_toRefTransform ? rhs.m_toRefTransform->createEditableCopy() + : rhs.m_toRefTransform; - m_fromRefTransform = rhs.m_fromRefTransform ? - rhs.m_fromRefTransform->createEditableCopy() : - rhs.m_fromRefTransform; + m_fromRefTransform = rhs.m_fromRefTransform + ? rhs.m_fromRefTransform->createEditableCopy() + : rhs.m_fromRefTransform; m_categories = rhs.m_categories; } @@ -55,7 +55,6 @@ class ViewTransform::Impl } }; - ViewTransformRcPtr ViewTransform::Create(ReferenceSpaceType referenceSpace) { return ViewTransformRcPtr(new ViewTransform(referenceSpace), &deleter); @@ -69,7 +68,7 @@ void ViewTransform::deleter(ViewTransform * v) ViewTransformRcPtr ViewTransform::createEditableCopy() const { ViewTransformRcPtr cs = ViewTransform::Create(getImpl()->m_referenceSpaceType); - *cs->m_impl = *m_impl; + *cs->m_impl = *m_impl; return cs; } @@ -143,7 +142,6 @@ void ViewTransform::clearCategories() getImpl()->m_categories.clearTokens(); } - ReferenceSpaceType ViewTransform::getReferenceSpaceType() const noexcept { return getImpl()->m_referenceSpaceType; @@ -153,10 +151,10 @@ ConstTransformRcPtr ViewTransform::getTransform(ViewTransformDirection dir) cons { switch (dir) { - case VIEWTRANSFORM_DIR_TO_REFERENCE: - return getImpl()->m_toRefTransform; - case VIEWTRANSFORM_DIR_FROM_REFERENCE: - return getImpl()->m_fromRefTransform; + case VIEWTRANSFORM_DIR_TO_REFERENCE: + return getImpl()->m_toRefTransform; + case VIEWTRANSFORM_DIR_FROM_REFERENCE: + return getImpl()->m_fromRefTransform; } return ConstTransformRcPtr(); } @@ -171,41 +169,42 @@ void ViewTransform::setTransform(const ConstTransformRcPtr & transform, ViewTran switch (dir) { - case VIEWTRANSFORM_DIR_TO_REFERENCE: - getImpl()->m_toRefTransform = transformCopy; - break; - case VIEWTRANSFORM_DIR_FROM_REFERENCE: - getImpl()->m_fromRefTransform = transformCopy; - break; + case VIEWTRANSFORM_DIR_TO_REFERENCE: + getImpl()->m_toRefTransform = transformCopy; + break; + case VIEWTRANSFORM_DIR_FROM_REFERENCE: + getImpl()->m_fromRefTransform = transformCopy; + break; } } - namespace { -static constexpr char REFERENCE_SPACE_SCENE_STR[]{ "scene" }; -static constexpr char REFERENCE_SPACE_DISPLAY_STR[]{ "display" }; +static constexpr char REFERENCE_SPACE_SCENE_STR[]{"scene"}; +static constexpr char REFERENCE_SPACE_DISPLAY_STR[]{"display"}; const char * ReferenceSpaceTypeToString(ReferenceSpaceType reference) { switch (reference) { - case REFERENCE_SPACE_SCENE: return REFERENCE_SPACE_SCENE_STR; - case REFERENCE_SPACE_DISPLAY: return REFERENCE_SPACE_DISPLAY_STR; + case REFERENCE_SPACE_SCENE: + return REFERENCE_SPACE_SCENE_STR; + case REFERENCE_SPACE_DISPLAY: + return REFERENCE_SPACE_DISPLAY_STR; } // Default type is meaningless. throw Exception("Unknown reference type"); } -} +} // namespace -std::ostream & operator<< (std::ostream & os, const ViewTransform & vt) +std::ostream & operator<<(std::ostream & os, const ViewTransform & vt) { os << "getNumColorSpaces(); + const int numCS = colorspaces->getNumColorSpaces(); for (int cs = 0; cs < numCS; ++cs) { auto colorspace = colorspaces->getColorSpaceByIndex(cs); - const std::string csis{ colorspace->getEncoding() }; + const std::string csis{colorspace->getEncoding()}; if (StringUtils::Lower(csis) == teststr) { return true; @@ -32,16 +32,15 @@ bool IsEncodingUsed(const ColorSpaceSetRcPtr & colorspaces, const char * encName } return false; } -} +} // namespace class ViewingRule { public: - using CustomKeys = std::map; - ViewingRule() = delete; - ViewingRule(const ViewingRule &) = delete; + ViewingRule() = delete; + ViewingRule(const ViewingRule &) = delete; ViewingRule & operator=(const ViewingRule &) = delete; explicit ViewingRule(const char * name) @@ -60,13 +59,11 @@ class ViewingRule return rule; } - const char * getName() const noexcept - { - return m_name.c_str(); - } + const char * getName() const noexcept { return m_name.c_str(); } - void validate(std::function colorSpaceAccesssor, - const ColorSpaceSetRcPtr & colorspaces) const + void validate( + std::function colorSpaceAccesssor, + const ColorSpaceSetRcPtr & colorspaces) const { const auto numCS = m_colorSpaces.getNumTokens(); for (int csIdx = 0; csIdx < numCS; ++csIdx) @@ -112,13 +109,11 @@ class ViewingRule } } - CustomKeysContainer m_customKeys; TokensManager m_colorSpaces; TokensManager m_encodings; private: - const std::string m_name; }; @@ -146,7 +141,7 @@ void ViewingRules::deleter(ViewingRules * vr) ViewingRulesRcPtr ViewingRules::createEditableCopy() const { ViewingRulesRcPtr rules = Create(); - *rules->m_impl = *m_impl; // Deep copy. + *rules->m_impl = *m_impl; // Deep copy. return rules; } @@ -171,8 +166,8 @@ void ViewingRules::Impl::validatePosition(size_t ruleIndex) const if (ruleIndex >= numRules) { std::ostringstream oss; - oss << "Viewing rules: rule index '" << ruleIndex << "' invalid." - << " There are only '" << numRules << "' rules."; + oss << "Viewing rules: rule index '" << ruleIndex << "' invalid." << " There are only '" + << numRules << "' rules."; throw Exception(oss.str().c_str()); } } @@ -183,11 +178,10 @@ void ViewingRules::Impl::validateNewRule(const char * name) const { throw Exception("Viewing rules: rule must have a non-empty name."); } - auto existingRule = std::find_if(m_rules.begin(), m_rules.end(), - [name](const ViewingRuleRcPtr & rule) - { - return 0 == Platform::Strcasecmp(name, rule->getName()); - }); + auto existingRule + = std::find_if(m_rules.begin(), m_rules.end(), [name](const ViewingRuleRcPtr & rule) { + return 0 == Platform::Strcasecmp(name, rule->getName()); + }); if (existingRule != m_rules.end()) { std::ostringstream oss; @@ -407,7 +401,7 @@ void ViewingRules::removeRule(size_t ruleIndex) m_impl->m_rules.erase(m_impl->m_rules.begin() + ruleIndex); } -std::ostream & operator<< (std::ostream & os, const ViewingRules & vr) +std::ostream & operator<<(std::ostream & os, const ViewingRules & vr) { const size_t numRules = vr.getNumEntries(); for (size_t r = 0; r < numRules; ++r) @@ -450,7 +444,7 @@ std::ostream & operator<< (std::ostream & os, const ViewingRules & vr) { os << "(" << vr.getCustomKeyName(r, ck); os << ", " << vr.getCustomKeyValue(r, ck) << ")"; - if (ck +1 != numCK) + if (ck + 1 != numCK) { os << ", "; } @@ -471,7 +465,7 @@ bool FindRule(ConstViewingRulesRcPtr vr, const std::string & name, size_t & rule const auto numrules = vr->getNumEntries(); for (size_t index = 0; index < numrules; ++index) { - const std::string ruleName{ vr->getName(index) }; + const std::string ruleName{vr->getName(index)}; if (StrEqualsCaseIgnore(ruleName, name)) { ruleIndex = index; diff --git a/src/OpenColorIO/ViewingRules.h b/src/OpenColorIO/ViewingRules.h index fb853d3627..0306d2cd98 100644 --- a/src/OpenColorIO/ViewingRules.h +++ b/src/OpenColorIO/ViewingRules.h @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_VIEWINGRULES_H #define INCLUDED_OCIO_VIEWINGRULES_H @@ -11,17 +10,16 @@ #include - namespace OCIO_NAMESPACE { namespace ViewingRuleUtils { -constexpr char Name[] { "name" }; -constexpr char ColorSpaces[]{ "colorspaces" }; -constexpr char Encodings[] { "encodings" }; -constexpr char CustomKey[] { "custom" }; -} +constexpr char Name[]{"name"}; +constexpr char ColorSpaces[]{"colorspaces"}; +constexpr char Encodings[]{"encodings"}; +constexpr char CustomKey[]{"custom"}; +} // namespace ViewingRuleUtils bool FindRule(ConstViewingRulesRcPtr vr, const std::string & name, size_t & ruleIndex); @@ -31,8 +29,7 @@ using ViewingRuleRcPtr = OCIO_SHARED_PTR; class ViewingRules::Impl { public: - - Impl() = default; + Impl() = default; Impl(const Impl &) = delete; Impl & operator=(const Impl & rhs); ~Impl() = default; @@ -40,11 +37,11 @@ class ViewingRules::Impl void validatePosition(size_t ruleIndex) const; void validateNewRule(const char * name) const; - void validate(std::function colorSpaceAccessor, - const ColorSpaceSetRcPtr & colorspaces) const; + void validate( + std::function colorSpaceAccessor, + const ColorSpaceSetRcPtr & colorspaces) const; private: - friend class ViewingRules; // All rules. diff --git a/src/OpenColorIO/apphelpers/CategoryHelpers.cpp b/src/OpenColorIO/apphelpers/CategoryHelpers.cpp index f157ecf6af..5bb514b762 100644 --- a/src/OpenColorIO/apphelpers/CategoryHelpers.cpp +++ b/src/OpenColorIO/apphelpers/CategoryHelpers.cpp @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #include #include @@ -9,7 +8,6 @@ #include "CategoryHelpers.h" #include "ColorSpaceHelpers.h" - namespace OCIO_NAMESPACE { @@ -21,8 +19,7 @@ namespace // TODO: Enhance ColorSpaceSet to allow its use here. typedef std::vector ColorSpaceVec; -template -void AddElement(std::vector & vec, T elt) +template void AddElement(std::vector & vec, T elt) { for (auto & entry : vec) { @@ -35,23 +32,22 @@ void AddElement(std::vector & vec, T elt) vec.push_back(elt); } -template -bool HasCategory(const T & elt, const std::string & category) +template bool HasCategory(const T & elt, const std::string & category) { return elt->hasCategory(category.c_str()); } -template -bool HasEncoding(const T & elt, const std::string & encoding) +template bool HasEncoding(const T & elt, const std::string & encoding) { return StringUtils::Compare(encoding, elt->getEncoding()); } -ColorSpaceVec GetColorSpaces(ConstConfigRcPtr config, - bool includeColorSpaces, - SearchReferenceSpaceType colorSpaceType, - const Categories & categories, - const Encodings & encodings) +ColorSpaceVec GetColorSpaces( + ConstConfigRcPtr config, + bool includeColorSpaces, + SearchReferenceSpaceType colorSpaceType, + const Categories & categories, + const Encodings & encodings) { ColorSpaceVec css; if (includeColorSpaces && !categories.empty() && !encodings.empty()) @@ -59,9 +55,8 @@ ColorSpaceVec GetColorSpaces(ConstConfigRcPtr config, const auto numCS = config->getNumColorSpaces(colorSpaceType, COLORSPACE_ACTIVE); for (int idx = 0; idx < numCS; ++idx) { - auto cs = config->getColorSpace(config->getColorSpaceNameByIndex(colorSpaceType, - COLORSPACE_ACTIVE, - idx)); + auto cs = config->getColorSpace( + config->getColorSpaceNameByIndex(colorSpaceType, COLORSPACE_ACTIVE, idx)); for (const auto & cat : categories) { for (const auto & enc : encodings) @@ -77,10 +72,11 @@ ColorSpaceVec GetColorSpaces(ConstConfigRcPtr config, return css; } -ColorSpaceVec GetColorSpaces(ConstConfigRcPtr config, - bool includeColorSpaces, - SearchReferenceSpaceType colorSpaceType, - const Categories & categories) +ColorSpaceVec GetColorSpaces( + ConstConfigRcPtr config, + bool includeColorSpaces, + SearchReferenceSpaceType colorSpaceType, + const Categories & categories) { ColorSpaceVec css; if (includeColorSpaces && !categories.empty()) @@ -88,9 +84,8 @@ ColorSpaceVec GetColorSpaces(ConstConfigRcPtr config, const auto numCS = config->getNumColorSpaces(colorSpaceType, COLORSPACE_ACTIVE); for (int idx = 0; idx < numCS; ++idx) { - auto cs = config->getColorSpace(config->getColorSpaceNameByIndex(colorSpaceType, - COLORSPACE_ACTIVE, - idx)); + auto cs = config->getColorSpace( + config->getColorSpaceNameByIndex(colorSpaceType, COLORSPACE_ACTIVE, idx)); for (const auto & cat : categories) { if (HasCategory(cs, cat)) @@ -99,14 +94,15 @@ ColorSpaceVec GetColorSpaces(ConstConfigRcPtr config, } } } - } + } return css; } -ColorSpaceVec GetColorSpacesFromEncodings(ConstConfigRcPtr config, - bool includeColorSpaces, - SearchReferenceSpaceType colorSpaceType, - const Encodings & encodings) +ColorSpaceVec GetColorSpacesFromEncodings( + ConstConfigRcPtr config, + bool includeColorSpaces, + SearchReferenceSpaceType colorSpaceType, + const Encodings & encodings) { ColorSpaceVec css; if (includeColorSpaces && !encodings.empty()) @@ -114,9 +110,8 @@ ColorSpaceVec GetColorSpacesFromEncodings(ConstConfigRcPtr config, const auto numCS = config->getNumColorSpaces(colorSpaceType, COLORSPACE_ACTIVE); for (int idx = 0; idx < numCS; ++idx) { - auto cs = config->getColorSpace(config->getColorSpaceNameByIndex(colorSpaceType, - COLORSPACE_ACTIVE, - idx)); + auto cs = config->getColorSpace( + config->getColorSpaceNameByIndex(colorSpaceType, COLORSPACE_ACTIVE, idx)); for (const auto & enc : encodings) { if (HasEncoding(cs, enc)) @@ -131,10 +126,11 @@ ColorSpaceVec GetColorSpacesFromEncodings(ConstConfigRcPtr config, typedef std::vector NamedTransformVec; -NamedTransformVec GetNamedTransforms(ConstConfigRcPtr config, - bool includeNamedTransforms, - const Categories & categories, - const Encodings & encodings) +NamedTransformVec GetNamedTransforms( + ConstConfigRcPtr config, + bool includeNamedTransforms, + const Categories & categories, + const Encodings & encodings) { NamedTransformVec nts; if (includeNamedTransforms && !categories.empty() && !encodings.empty()) @@ -157,9 +153,10 @@ NamedTransformVec GetNamedTransforms(ConstConfigRcPtr config, return nts; } -NamedTransformVec GetNamedTransforms(ConstConfigRcPtr config, - bool includeNamedTransforms, - const Categories & categories) +NamedTransformVec GetNamedTransforms( + ConstConfigRcPtr config, + bool includeNamedTransforms, + const Categories & categories) { NamedTransformVec nts; if (includeNamedTransforms && !categories.empty()) @@ -179,9 +176,10 @@ NamedTransformVec GetNamedTransforms(ConstConfigRcPtr config, return nts; } -NamedTransformVec GetNamedTransformsFromEncodings(ConstConfigRcPtr config, - bool includeNamedTransforms, - const Encodings & encodings) +NamedTransformVec GetNamedTransformsFromEncodings( + ConstConfigRcPtr config, + bool includeNamedTransforms, + const Encodings & encodings) { NamedTransformVec nts; if (includeNamedTransforms && !encodings.empty()) @@ -201,9 +199,7 @@ NamedTransformVec GetNamedTransformsFromEncodings(ConstConfigRcPtr config, return nts; } -Infos GetInfos(ConstConfigRcPtr & config, - const ColorSpaceVec & css, - const NamedTransformVec & nts) +Infos GetInfos(ConstConfigRcPtr & config, const ColorSpaceVec & css, const NamedTransformVec & nts) { Infos allInfos; for (const auto & cs : css) @@ -217,8 +213,7 @@ Infos GetInfos(ConstConfigRcPtr & config, return allInfos; } -template -ColorSpaceNames GetNames(const T & list) +template ColorSpaceNames GetNames(const T & list) { ColorSpaceNames allNames; @@ -230,12 +225,11 @@ ColorSpaceNames GetNames(const T & list) return allNames; } -template -T Intersection(const T & list0, const T & list1) +template T Intersection(const T & list0, const T & list1) { T result; const auto begin1 = list1.begin(); - const auto end1 = list1.end(); + const auto end1 = list1.end(); for (const auto & i0 : list0) { if (std::find(begin1, end1, i0) != end1) @@ -246,7 +240,7 @@ T Intersection(const T & list0, const T & list1) return result; } -} // anon. +} // namespace StringUtils::StringVec ExtractItems(const char * strings) { @@ -283,17 +277,16 @@ enum CategoryUsage }; struct LogMessageHelper { - bool m_ignoreEncodings = false; - bool m_ignoreCategories = false; + bool m_ignoreEncodings = false; + bool m_ignoreCategories = false; bool m_emptyIntersection = false; - CategoryUsage m_appCats = NOT_USED; + CategoryUsage m_appCats = NOT_USED; CategoryUsage m_userCats = NOT_USED; ~LogMessageHelper() { - if (GetLoggingLevel() >= LOGGING_LEVEL_INFO && (m_emptyIntersection || - m_ignoreEncodings || m_ignoreCategories || - m_appCats == NONE_FOUND || m_userCats == NONE_FOUND || - m_userCats == IGNORED)) + if (GetLoggingLevel() >= LOGGING_LEVEL_INFO + && (m_emptyIntersection || m_ignoreEncodings || m_ignoreCategories + || m_appCats == NONE_FOUND || m_userCats == NONE_FOUND || m_userCats == IGNORED)) { std::stringstream os; os << "All parameters could not be used to create the menu:"; @@ -331,15 +324,16 @@ struct LogMessageHelper } } }; -} - -Infos FindColorSpaceInfos(ConstConfigRcPtr config, - const Categories & appCategories, - const Categories & userCategories, - bool includeColorSpaces, - bool includeNamedTransforms, - const Encodings & encodings, - SearchReferenceSpaceType colorSpaceType) +} // namespace + +Infos FindColorSpaceInfos( + ConstConfigRcPtr config, + const Categories & appCategories, + const Categories & userCategories, + bool includeColorSpaces, + bool includeNamedTransforms, + const Encodings & encodings, + SearchReferenceSpaceType colorSpaceType) { // At least one of include flags is true. @@ -352,9 +346,9 @@ Infos FindColorSpaceInfos(ConstConfigRcPtr config, NamedTransformVec appNT; ColorSpaceVec appCSNoEncodings; NamedTransformVec appNTNoEncodings; - bool appNoEncodingsComputed{ false }; + bool appNoEncodingsComputed{false}; - size_t appSize{ 0 }; + size_t appSize{0}; bool encsIgnored = encodings.empty(); @@ -369,36 +363,43 @@ Infos FindColorSpaceInfos(ConstConfigRcPtr config, if (!encsIgnored) { - appCS = GetColorSpaces(config, includeColorSpaces, colorSpaceType, - appCategories, encodings); - appNT = GetNamedTransforms(config, includeNamedTransforms, appCategories, - encodings); + appCS = GetColorSpaces( + config, + includeColorSpaces, + colorSpaceType, + appCategories, + encodings); + appNT + = GetNamedTransforms(config, includeNamedTransforms, appCategories, encodings); appSize = appCS.size() + appNT.size(); } // Do not use encodings if empty or drop them if no result is found with them. if (appSize == 0) { - encsIgnored = true; + encsIgnored = true; log.m_ignoreEncodings = !encodings.empty(); - appCS = GetColorSpaces(config, includeColorSpaces, colorSpaceType, appCategories); - appNT = GetNamedTransforms(config, includeNamedTransforms, appCategories); + appCS = GetColorSpaces(config, includeColorSpaces, colorSpaceType, appCategories); + appNT = GetNamedTransforms(config, includeNamedTransforms, appCategories); appSize = appCS.size() + appNT.size(); // Keep these results in case we need them later. appNoEncodingsComputed = true; - appCSNoEncodings = appCS; - appNTNoEncodings = appNT; + appCSNoEncodings = appCS; + appNTNoEncodings = appNT; } // Drop app categories and use encoding if no results. if (appSize == 0 && !encodings.empty()) { - encsIgnored = false; + encsIgnored = false; log.m_ignoreEncodings = false; - log.m_appCats = NONE_FOUND; - appCS = GetColorSpacesFromEncodings(config, includeColorSpaces, colorSpaceType, - encodings); + log.m_appCats = NONE_FOUND; + appCS = GetColorSpacesFromEncodings( + config, + includeColorSpaces, + colorSpaceType, + encodings); appNT = GetNamedTransformsFromEncodings(config, includeNamedTransforms, encodings); appSize = appCS.size() + appNT.size(); } @@ -410,22 +411,25 @@ Infos FindColorSpaceInfos(ConstConfigRcPtr config, } else if (!encsIgnored) { - appCS = GetColorSpacesFromEncodings(config, includeColorSpaces, colorSpaceType, - encodings); - appNT = GetNamedTransformsFromEncodings(config, includeNamedTransforms, encodings); + appCS = GetColorSpacesFromEncodings( + config, + includeColorSpaces, + colorSpaceType, + encodings); + appNT = GetNamedTransformsFromEncodings(config, includeNamedTransforms, encodings); appSize = appCS.size() + appNT.size(); } ColorSpaceVec userCS; NamedTransformVec userNT; - size_t userSize{ 0 }; + size_t userSize{0}; if (!userCategories.empty()) { // 3b) Items using user categories. - userCS = GetColorSpaces(config, includeColorSpaces, colorSpaceType, userCategories); - userNT = GetNamedTransforms(config, includeNamedTransforms, userCategories); + userCS = GetColorSpaces(config, includeColorSpaces, colorSpaceType, userCategories); + userNT = GetNamedTransforms(config, includeNamedTransforms, userCategories); userSize = userCS.size() + userNT.size(); if (userSize == 0) { @@ -437,9 +441,9 @@ Infos FindColorSpaceInfos(ConstConfigRcPtr config, { // 3c) and 3d) Use intersection of app and user categories. - ColorSpaceVec * appCSTest = &appCS; - NamedTransformVec * appNTTest = &appNT; - const auto encsIgnoredBack = encsIgnored; + ColorSpaceVec * appCSTest = &appCS; + NamedTransformVec * appNTTest = &appNT; + const auto encsIgnoredBack = encsIgnored; const auto ignoreEncodingsBack = log.m_ignoreEncodings; // Allow to run twice, with and without encodings. @@ -458,16 +462,19 @@ Infos FindColorSpaceInfos(ConstConfigRcPtr config, { // Intersection is empty, but encodings can be dropped if they were not dropped // already. - encsIgnored = true; + encsIgnored = true; log.m_ignoreEncodings = true; if (!appNoEncodingsComputed) { // If not already computed, compute list with app categories and no // encodings. - appCSNoEncodings = GetColorSpaces(config, includeColorSpaces, - colorSpaceType, appCategories); - appNTNoEncodings = GetNamedTransforms(config, includeNamedTransforms, - appCategories); + appCSNoEncodings = GetColorSpaces( + config, + includeColorSpaces, + colorSpaceType, + appCategories); + appNTNoEncodings + = GetNamedTransforms(config, includeNamedTransforms, appCategories); } appCSTest = &appCSNoEncodings; appNTTest = &appNTNoEncodings; @@ -478,8 +485,8 @@ Infos FindColorSpaceInfos(ConstConfigRcPtr config, } } log.m_emptyIntersection = true; - encsIgnored = encsIgnoredBack; - log.m_ignoreEncodings = ignoreEncodingsBack; + encsIgnored = encsIgnoredBack; + log.m_ignoreEncodings = ignoreEncodingsBack; } if (appSize) @@ -508,8 +515,8 @@ Infos FindColorSpaceInfos(ConstConfigRcPtr config, const auto numCS = config->getNumColorSpaces(colorSpaceType, COLORSPACE_ACTIVE); for (int idx = 0; idx < numCS; ++idx) { - const char * csName = config->getColorSpaceNameByIndex(colorSpaceType, - COLORSPACE_ACTIVE, idx); + const char * csName + = config->getColorSpaceNameByIndex(colorSpaceType, COLORSPACE_ACTIVE, idx); ConstColorSpaceRcPtr cs = config->getColorSpace(csName); allInfos.push_back(ColorSpaceInfo::Create(config, *cs)); } @@ -526,14 +533,13 @@ Infos FindColorSpaceInfos(ConstConfigRcPtr config, // Nothing is found, no need to log anything. if (allInfos.size() == 0) { - log.m_appCats = NOT_USED; - log.m_userCats = NOT_USED; + log.m_appCats = NOT_USED; + log.m_userCats = NOT_USED; log.m_emptyIntersection = false; - log.m_ignoreCategories = false; - log.m_ignoreEncodings = false; + log.m_ignoreCategories = false; + log.m_ignoreEncodings = false; } return allInfos; } - } // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/apphelpers/CategoryHelpers.h b/src/OpenColorIO/apphelpers/CategoryHelpers.h index 08f2f5e790..88d0d92584 100644 --- a/src/OpenColorIO/apphelpers/CategoryHelpers.h +++ b/src/OpenColorIO/apphelpers/CategoryHelpers.h @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_CATEGORY_HELPERS_H #define INCLUDED_OCIO_CATEGORY_HELPERS_H @@ -25,20 +24,21 @@ class ColorSpaceMenuParametersImpl; StringUtils::StringVec ExtractItems(const char * strings); using Categories = StringUtils::StringVec; -using Encodings = StringUtils::StringVec; +using Encodings = StringUtils::StringVec; using ColorSpaceNames = StringUtils::StringVec; // Return all the active color space names having at least one of the categories. ColorSpaceNames FindColorSpaceNames(ConstConfigRcPtr config, const Categories & categories); using Infos = std::vector; -Infos FindColorSpaceInfos(ConstConfigRcPtr config, - const Categories & appCategories, - const Categories & userCategories, - bool includeColorSpaces, - bool includeNamedTransforms, - const Encodings & encodings, - SearchReferenceSpaceType colorSpaceType); +Infos FindColorSpaceInfos( + ConstConfigRcPtr config, + const Categories & appCategories, + const Categories & userCategories, + bool includeColorSpaces, + bool includeNamedTransforms, + const Encodings & encodings, + SearchReferenceSpaceType colorSpaceType); } // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/apphelpers/ColorSpaceHelpers.cpp b/src/OpenColorIO/apphelpers/ColorSpaceHelpers.cpp index 811881c141..f874283d6a 100644 --- a/src/OpenColorIO/apphelpers/ColorSpaceHelpers.cpp +++ b/src/OpenColorIO/apphelpers/ColorSpaceHelpers.cpp @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #include #include #include @@ -15,50 +14,52 @@ #include "Platform.h" #include "utils/StringUtils.h" - namespace OCIO_NAMESPACE { -ConstColorSpaceInfoRcPtr ColorSpaceInfo::Create(const ConstConfigRcPtr & config, - const ColorSpace & cs) +ConstColorSpaceInfoRcPtr ColorSpaceInfo::Create( + const ConstConfigRcPtr & config, + const ColorSpace & cs) { - return ConstColorSpaceInfoRcPtr(new ColorSpaceInfo(config, cs.getName(), nullptr, - cs.getFamily(), - cs.getDescription()), - &ColorSpaceInfo::Deleter); + return ConstColorSpaceInfoRcPtr( + new ColorSpaceInfo(config, cs.getName(), nullptr, cs.getFamily(), cs.getDescription()), + &ColorSpaceInfo::Deleter); } -ConstColorSpaceInfoRcPtr ColorSpaceInfo::Create(const ConstConfigRcPtr & config, - const NamedTransform & nt) +ConstColorSpaceInfoRcPtr ColorSpaceInfo::Create( + const ConstConfigRcPtr & config, + const NamedTransform & nt) { - return ConstColorSpaceInfoRcPtr(new ColorSpaceInfo(config, nt.getName(), nullptr, - nt.getFamily(), - nt.getDescription()), - &ColorSpaceInfo::Deleter); + return ConstColorSpaceInfoRcPtr( + new ColorSpaceInfo(config, nt.getName(), nullptr, nt.getFamily(), nt.getDescription()), + &ColorSpaceInfo::Deleter); } -ConstColorSpaceInfoRcPtr ColorSpaceInfo::Create(const ConstConfigRcPtr & config, - const char * name, - const char * family, - const char * description) +ConstColorSpaceInfoRcPtr ColorSpaceInfo::Create( + const ConstConfigRcPtr & config, + const char * name, + const char * family, + const char * description) { return ColorSpaceInfo::Create(config, name, nullptr, family, description); } -ConstColorSpaceInfoRcPtr ColorSpaceInfo::Create(const ConstConfigRcPtr & config, - const char * name, - const char * uiName, - const char * family, - const char * description) +ConstColorSpaceInfoRcPtr ColorSpaceInfo::Create( + const ConstConfigRcPtr & config, + const char * name, + const char * uiName, + const char * family, + const char * description) { - return ConstColorSpaceInfoRcPtr(new ColorSpaceInfo(config, name, uiName, family, - description), - &ColorSpaceInfo::Deleter); + return ConstColorSpaceInfoRcPtr( + new ColorSpaceInfo(config, name, uiName, family, description), + &ColorSpaceInfo::Deleter); } -ConstColorSpaceInfoRcPtr ColorSpaceInfo::CreateFromRole(const ConstConfigRcPtr & config, - const char * role, - const char * family) +ConstColorSpaceInfoRcPtr ColorSpaceInfo::CreateFromRole( + const ConstConfigRcPtr & config, + const char * role, + const char * family) { if (config->hasRole(role)) { @@ -66,17 +67,19 @@ ConstColorSpaceInfoRcPtr ColorSpaceInfo::CreateFromRole(const ConstConfigRcPtr & std::ostringstream uiName; uiName << role << " (" << cs->getName() << ")"; - return ColorSpaceInfo::Create(config, - role, // use role name - uiName.str().c_str(), - family, - nullptr); + return ColorSpaceInfo::Create( + config, + role, // use role name + uiName.str().c_str(), + family, + nullptr); } return ConstColorSpaceInfoRcPtr(); } -ConstColorSpaceInfoRcPtr ColorSpaceInfo::CreateFromSingleRole(const ConstConfigRcPtr & config, - const char * role) +ConstColorSpaceInfoRcPtr ColorSpaceInfo::CreateFromSingleRole( + const ConstConfigRcPtr & config, + const char * role) { if (config->hasRole(role)) { @@ -84,29 +87,31 @@ ConstColorSpaceInfoRcPtr ColorSpaceInfo::CreateFromSingleRole(const ConstConfigR std::ostringstream uiName; uiName << role << " (" << cs->getName() << ")"; - return ColorSpaceInfo::Create(config, - cs->getName(), // use color space name - uiName.str().c_str(), - nullptr, - nullptr); + return ColorSpaceInfo::Create( + config, + cs->getName(), // use color space name + uiName.str().c_str(), + nullptr, + nullptr); } return ConstColorSpaceInfoRcPtr(); } void ColorSpaceInfo::Deleter(ColorSpaceInfo * cs) { - delete (ColorSpaceInfo*)cs; + delete (ColorSpaceInfo *)cs; } -ColorSpaceInfo::ColorSpaceInfo(const ConstConfigRcPtr & config, - const char * name, - const char * uiName, - const char * family, - const char * description) - : m_name(name ? name : "") - , m_uiName((uiName && *uiName) ? uiName : m_name) - , m_family(family ? family : "") - , m_description(description ? description : "") +ColorSpaceInfo::ColorSpaceInfo( + const ConstConfigRcPtr & config, + const char * name, + const char * uiName, + const char * family, + const char * description) + : m_name(name ? name : "") + , m_uiName((uiName && *uiName) ? uiName : m_name) + , m_family(family ? family : "") + , m_description(description ? description : "") { StringUtils::StringVec vals; if (config->getFamilySeparator() && !m_family.empty()) @@ -164,8 +169,9 @@ const char * ColorSpaceInfo::getHierarchyLevel(size_t i) const noexcept ColorSpaceMenuParametersRcPtr ColorSpaceMenuParameters::Create(ConstConfigRcPtr config) { - return std::shared_ptr(new ColorSpaceMenuParametersImpl(config), - &ColorSpaceMenuParametersImpl::Deleter); + return std::shared_ptr( + new ColorSpaceMenuParametersImpl(config), + &ColorSpaceMenuParametersImpl::Deleter); } ColorSpaceMenuParametersImpl::ColorSpaceMenuParametersImpl(ConstConfigRcPtr config) @@ -175,7 +181,7 @@ ColorSpaceMenuParametersImpl::ColorSpaceMenuParametersImpl(ConstConfigRcPtr conf void ColorSpaceMenuParametersImpl::setParameters(ConstColorSpaceMenuParametersRcPtr parameters) { - const auto & impl = dynamic_cast(*parameters); + const auto & impl = dynamic_cast(*parameters); m_config = impl.m_config; m_role = impl.m_role; m_appCategories = impl.m_appCategories; @@ -300,14 +306,15 @@ SearchReferenceSpaceType ColorSpaceMenuParametersImpl::getSearchReferenceSpaceTy return m_colorSpaceType; } -void ColorSpaceMenuParametersImpl::setSearchReferenceSpaceType(SearchReferenceSpaceType colorSpaceType) noexcept +void ColorSpaceMenuParametersImpl::setSearchReferenceSpaceType( + SearchReferenceSpaceType colorSpaceType) noexcept { m_colorSpaceType = colorSpaceType; } void ColorSpaceMenuParametersImpl::Deleter(ColorSpaceMenuParameters * p) { - delete (ColorSpaceMenuParametersImpl*)p; + delete (ColorSpaceMenuParametersImpl *)p; } std::ostream & operator<<(std::ostream & os, const ColorSpaceMenuParameters & p) @@ -397,7 +404,7 @@ ColorSpaceMenuHelperRcPtr ColorSpaceMenuHelper::Create(ConstColorSpaceMenuParame auto userCategories = StringUtils::Trim(envUserCategories); if (!userCategories.empty()) { - auto newP = ColorSpaceMenuParameters::Create(parameters->getConfig()); + auto newP = ColorSpaceMenuParameters::Create(parameters->getConfig()); auto * impl = dynamic_cast(newP.get()); impl->setParameters(parameters); newP->setUserCategories(userCategories.c_str()); @@ -426,20 +433,22 @@ ColorSpaceMenuHelperRcPtr ColorSpaceMenuHelper::Create(ConstColorSpaceMenuParame ColorSpaceMenuHelperRcPtr & entry = g_entries[key]; if (!entry) { - entry = std::shared_ptr(new ColorSpaceMenuHelperImpl(parameters), - &ColorSpaceMenuHelperImpl::Deleter); + entry = std::shared_ptr( + new ColorSpaceMenuHelperImpl(parameters), + &ColorSpaceMenuHelperImpl::Deleter); } return entry; } - return std::shared_ptr(new ColorSpaceMenuHelperImpl(parameters), - &ColorSpaceMenuHelperImpl::Deleter); + return std::shared_ptr( + new ColorSpaceMenuHelperImpl(parameters), + &ColorSpaceMenuHelperImpl::Deleter); } void ColorSpaceMenuHelperImpl::Deleter(ColorSpaceMenuHelper * incs) { - delete (ColorSpaceMenuHelperImpl*)incs; + delete (ColorSpaceMenuHelperImpl *)incs; } ColorSpaceMenuHelperImpl::ColorSpaceMenuHelperImpl(ConstColorSpaceMenuParametersRcPtr parameters) @@ -460,28 +469,33 @@ void ColorSpaceMenuHelperImpl::refresh() { if (m_parameters.m_config->hasRole(m_parameters.m_role.c_str())) { - m_entries.push_back(ColorSpaceInfo::CreateFromSingleRole(m_parameters.m_config, - m_parameters.m_role.c_str())); + m_entries.push_back(ColorSpaceInfo::CreateFromSingleRole( + m_parameters.m_config, + m_parameters.m_role.c_str())); return; } } // 2) & 3) Identify potential menu items and then filter them by category and encoding. - const Categories allAppCategories = ExtractItems(m_parameters.m_appCategories.c_str()); + const Categories allAppCategories = ExtractItems(m_parameters.m_appCategories.c_str()); const Categories allUserCategories = ExtractItems(m_parameters.m_userCategories.c_str()); - const Encodings allEncodings = ExtractItems(m_parameters.m_encodings.c_str()); - const auto numNT = m_parameters.m_config->getNumNamedTransforms(); - const auto numCS = m_parameters.m_config->getNumColorSpaces(m_parameters.m_colorSpaceType, - COLORSPACE_ACTIVE); - if ((m_parameters.m_includeColorSpaces && numCS != 0) || - (m_parameters.m_includeNamedTransforms && numNT != 0)) - { - m_entries = FindColorSpaceInfos(m_parameters.m_config, - allAppCategories, allUserCategories, - m_parameters.m_includeColorSpaces, - m_parameters.m_includeNamedTransforms, - allEncodings, m_parameters.m_colorSpaceType); + const Encodings allEncodings = ExtractItems(m_parameters.m_encodings.c_str()); + const auto numNT = m_parameters.m_config->getNumNamedTransforms(); + const auto numCS = m_parameters.m_config->getNumColorSpaces( + m_parameters.m_colorSpaceType, + COLORSPACE_ACTIVE); + if ((m_parameters.m_includeColorSpaces && numCS != 0) + || (m_parameters.m_includeNamedTransforms && numNT != 0)) + { + m_entries = FindColorSpaceInfos( + m_parameters.m_config, + allAppCategories, + allUserCategories, + m_parameters.m_includeColorSpaces, + m_parameters.m_includeNamedTransforms, + allEncodings, + m_parameters.m_colorSpaceType); } // 4) Include roles if requested. @@ -490,9 +504,10 @@ void ColorSpaceMenuHelperImpl::refresh() { for (int idx = 0; idx < m_parameters.m_config->getNumRoles(); ++idx) { - auto info = ColorSpaceInfo::CreateFromRole(m_parameters.m_config, - m_parameters.m_config->getRoleName(idx), - "Roles"); + auto info = ColorSpaceInfo::CreateFromRole( + m_parameters.m_config, + m_parameters.m_config->getRoleName(idx), + "Roles"); m_entries.push_back(info); } } @@ -569,9 +584,7 @@ void ColorSpaceMenuHelperImpl::refresh() } } - m_entries.insert(m_entries.end(), - additionalColorSpaces.begin(), - additionalColorSpaces.end()); + m_entries.insert(m_entries.end(), additionalColorSpaces.begin(), additionalColorSpaces.end()); } size_t ColorSpaceMenuHelperImpl::getNumColorSpaces() const noexcept @@ -725,10 +738,11 @@ namespace ColorSpaceHelpers namespace { -void AddColorSpace(ConfigRcPtr & config, - ColorSpaceRcPtr & colorSpace, - FileTransformRcPtr & userTransform, - const char * connectionColorSpaceName) +void AddColorSpace( + ConfigRcPtr & config, + ColorSpaceRcPtr & colorSpace, + FileTransformRcPtr & userTransform, + const char * connectionColorSpaceName) { if (!connectionColorSpaceName || !*connectionColorSpaceName) { @@ -748,7 +762,7 @@ void AddColorSpace(ConfigRcPtr & config, // Step 1 - Create the color transformation. - GroupTransformRcPtr grp = GroupTransform::Create(); + GroupTransformRcPtr grp = GroupTransform::Create(); grp->appendTransform(userTransform); // Check for an active or inactive color space. @@ -786,15 +800,16 @@ void AddColorSpace(ConfigRcPtr & config, colorSpace->setTransform(DynamicPtrCast(grp), COLORSPACE_DIR_TO_REFERENCE); config->addColorSpace(colorSpace); } -} +} // namespace // TODO: This function only adds a color space that uses a to_reference transform. // May want to add support for userTransforms that go in the opposite direction. -void AddColorSpace(ConfigRcPtr & config, - const ColorSpaceInfo & colorSpaceInfo, - FileTransformRcPtr & userTransform, - const char * categories, - const char * connectionColorSpaceName) +void AddColorSpace( + ConfigRcPtr & config, + const ColorSpaceInfo & colorSpaceInfo, + FileTransformRcPtr & userTransform, + const char * categories, + const char * connectionColorSpaceName) { ColorSpaceRcPtr colorSpace = ColorSpace::Create(); @@ -820,11 +835,12 @@ void AddColorSpace(ConfigRcPtr & config, AddColorSpace(config, colorSpace, userTransform, connectionColorSpaceName); } -void AddColorSpace(ConfigRcPtr & config, - const char * name, - const char * transformFilePath, - const char * categories, - const char * connectionColorSpaceName) +void AddColorSpace( + ConfigRcPtr & config, + const char * name, + const char * transformFilePath, + const char * categories, + const char * connectionColorSpaceName) { ConstColorSpaceInfoRcPtr info = ColorSpaceInfo::Create(config, name, nullptr, nullptr); @@ -834,6 +850,6 @@ void AddColorSpace(ConfigRcPtr & config, AddColorSpace(config, *info, file, categories, connectionColorSpaceName); } -} // ColorSpaceHelpers +} // namespace ColorSpaceHelpers } // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/apphelpers/ColorSpaceHelpers.h b/src/OpenColorIO/apphelpers/ColorSpaceHelpers.h index cfe86b8942..ea3e662a78 100644 --- a/src/OpenColorIO/apphelpers/ColorSpaceHelpers.h +++ b/src/OpenColorIO/apphelpers/ColorSpaceHelpers.h @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_COLORSPACE_HELPERS_H #define INCLUDED_OCIO_COLORSPACE_HELPERS_H @@ -12,7 +11,6 @@ #include "CategoryHelpers.h" #include "utils/StringUtils.h" - namespace OCIO_NAMESPACE { @@ -22,35 +20,38 @@ namespace OCIO_NAMESPACE class ColorSpaceInfo { public: - static ConstColorSpaceInfoRcPtr Create(const ConstConfigRcPtr & config, - const char * name, - const char * family, - const char * description); - - static ConstColorSpaceInfoRcPtr Create(const ConstConfigRcPtr & config, - const char * name, - const char * uiName, - const char * family, - const char * description); - - static ConstColorSpaceInfoRcPtr Create(const ConstConfigRcPtr & config, - const ColorSpace & cs); - - static ConstColorSpaceInfoRcPtr Create(const ConstConfigRcPtr & config, - const NamedTransform & nt); - - static ConstColorSpaceInfoRcPtr CreateFromRole(const ConstConfigRcPtr & config, - const char * role, - const char * family); - - static ConstColorSpaceInfoRcPtr CreateFromSingleRole(const ConstConfigRcPtr & config, - const char * role); - - ColorSpaceInfo(const ConstConfigRcPtr & config, - const char * name, - const char * uiName, - const char * family, - const char * description); + static ConstColorSpaceInfoRcPtr Create( + const ConstConfigRcPtr & config, + const char * name, + const char * family, + const char * description); + + static ConstColorSpaceInfoRcPtr Create( + const ConstConfigRcPtr & config, + const char * name, + const char * uiName, + const char * family, + const char * description); + + static ConstColorSpaceInfoRcPtr Create(const ConstConfigRcPtr & config, const ColorSpace & cs); + + static ConstColorSpaceInfoRcPtr Create( + const ConstConfigRcPtr & config, + const NamedTransform & nt); + + static ConstColorSpaceInfoRcPtr + CreateFromRole(const ConstConfigRcPtr & config, const char * role, const char * family); + + static ConstColorSpaceInfoRcPtr CreateFromSingleRole( + const ConstConfigRcPtr & config, + const char * role); + + ColorSpaceInfo( + const ConstConfigRcPtr & config, + const char * name, + const char * uiName, + const char * family, + const char * description); const char * getName() const noexcept; const char * getUIName() const noexcept; @@ -63,9 +64,9 @@ class ColorSpaceInfo static void Deleter(ColorSpaceInfo * cs); - ColorSpaceInfo() = default; - virtual ~ColorSpaceInfo() = default; - ColorSpaceInfo(const ColorSpaceInfo &) = delete; + ColorSpaceInfo() = default; + virtual ~ColorSpaceInfo() = default; + ColorSpaceInfo(const ColorSpaceInfo &) = delete; ColorSpaceInfo & operator=(const ColorSpaceInfo &) = delete; private: @@ -78,13 +79,12 @@ class ColorSpaceInfo StringUtils::StringVec m_hierarchyLevels; }; - class ColorSpaceMenuParametersImpl : public ColorSpaceMenuParameters { public: ColorSpaceMenuParametersImpl(ConstConfigRcPtr config); - ColorSpaceMenuParametersImpl() = delete; + ColorSpaceMenuParametersImpl() = delete; ColorSpaceMenuParametersImpl & operator=(const ColorSpaceMenuParametersImpl &) = delete; void setParameters(ConstColorSpaceMenuParametersRcPtr parameters); @@ -114,7 +114,7 @@ class ColorSpaceMenuParametersImpl : public ColorSpaceMenuParameters void clearAddedColorSpaces() noexcept override; ColorSpaceMenuParametersImpl(const ColorSpaceMenuParametersImpl &) = delete; - virtual ~ColorSpaceMenuParametersImpl() = default; + virtual ~ColorSpaceMenuParametersImpl() = default; static void Deleter(ColorSpaceMenuParameters * p); @@ -124,26 +124,24 @@ class ColorSpaceMenuParametersImpl : public ColorSpaceMenuParameters std::string m_appCategories; std::string m_userCategories; std::string m_encodings; - bool m_includeColorSpaces = true; - bool m_includeRoles = false; - bool m_includeNamedTransforms = false; + bool m_includeColorSpaces = true; + bool m_includeRoles = false; + bool m_includeNamedTransforms = false; SearchReferenceSpaceType m_colorSpaceType = SEARCH_REFERENCE_SPACE_ALL; StringUtils::StringVec m_additionalColorSpaces; }; - class ColorSpaceMenuHelperImpl : public ColorSpaceMenuHelper { public: - - ColorSpaceMenuHelperImpl() = delete; + ColorSpaceMenuHelperImpl() = delete; ColorSpaceMenuHelperImpl & operator=(const ColorSpaceMenuHelperImpl &) = delete; ColorSpaceMenuHelperImpl(ConstColorSpaceMenuParametersRcPtr parameters); ColorSpaceMenuHelperImpl(const ColorSpaceMenuHelperImpl &) = delete; - virtual ~ColorSpaceMenuHelperImpl() = default; + virtual ~ColorSpaceMenuHelperImpl() = default; size_t getNumColorSpaces() const noexcept override; const char * getName(size_t idx) const noexcept override; @@ -175,7 +173,6 @@ class ColorSpaceMenuHelperImpl : public ColorSpaceMenuHelper Infos m_entries; }; - -} // namespace OCIO_NAMESPACE +} // namespace OCIO_NAMESPACE #endif // INCLUDED_OCIO_COLORSPACE_HELPERS_H diff --git a/src/OpenColorIO/apphelpers/DisplayViewHelpers.cpp b/src/OpenColorIO/apphelpers/DisplayViewHelpers.cpp index d4055f46c1..fa08f830c7 100644 --- a/src/OpenColorIO/apphelpers/DisplayViewHelpers.cpp +++ b/src/OpenColorIO/apphelpers/DisplayViewHelpers.cpp @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #include #include #include @@ -11,9 +10,8 @@ #include #include "CategoryHelpers.h" -#include "utils/StringUtils.h" #include "LegacyViewingPipeline.h" - +#include "utils/StringUtils.h" namespace OCIO_NAMESPACE { @@ -21,29 +19,32 @@ namespace OCIO_NAMESPACE namespace DisplayViewHelpers { -ConstProcessorRcPtr GetProcessor(const ConstConfigRcPtr & config, - const char * workingName, - const char * displayName, - const char * viewName, - const ConstMatrixTransformRcPtr & channelView, - TransformDirection direction) +ConstProcessorRcPtr GetProcessor( + const ConstConfigRcPtr & config, + const char * workingName, + const char * displayName, + const char * viewName, + const ConstMatrixTransformRcPtr & channelView, + TransformDirection direction) { - return GetProcessor(config, - config->getCurrentContext(), - workingName, - displayName, - viewName, - channelView, - direction); + return GetProcessor( + config, + config->getCurrentContext(), + workingName, + displayName, + viewName, + channelView, + direction); } -ConstProcessorRcPtr GetProcessor(const ConstConfigRcPtr & config, - const ConstContextRcPtr & context, - const char * workingName, - const char * displayName, - const char * viewName, - const ConstMatrixTransformRcPtr & channelView, - TransformDirection direction) +ConstProcessorRcPtr GetProcessor( + const ConstConfigRcPtr & config, + const ConstContextRcPtr & context, + const char * workingName, + const char * displayName, + const char * viewName, + const ConstMatrixTransformRcPtr & channelView, + TransformDirection direction) { DisplayViewTransformRcPtr displayTransform = DisplayViewTransform::Create(); displayTransform->setDirection(direction); @@ -62,10 +63,11 @@ ConstProcessorRcPtr GetProcessor(const ConstConfigRcPtr & config, GroupTransformRcPtr grpTransform = processor->createGroupTransform(); const int maxTransform = grpTransform->getNumTransforms(); - for (int idx=0; idxgetTransform(idx); - ConstExposureContrastTransformRcPtr ex = DynamicPtrCast(tr); + ConstExposureContrastTransformRcPtr ex + = DynamicPtrCast(tr); if (ex) { @@ -151,7 +153,8 @@ ConstProcessorRcPtr GetIdentityProcessor(const ConstConfigRcPtr & config) void AddActiveDisplayView(ConfigRcPtr & config, const char * displayName, const char * viewName) { - if (!displayName || !viewName) return; + if (!displayName || !viewName) + return; // Add the display to the active display list only if possible. @@ -161,12 +164,11 @@ void AddActiveDisplayView(ConfigRcPtr & config, const char * displayName, const StringUtils::StringVec displays = StringUtils::Split(envActiveDisplays, ','); StringUtils::Trim(displays); - const bool acceptAllDisplays = displays.size()==1 && displays[0]==""; + const bool acceptAllDisplays = displays.size() == 1 && displays[0] == ""; if (!acceptAllDisplays) { std::stringstream err; - err << "Forbidden to add an active display as '" - << OCIO_ACTIVE_DISPLAYS_ENVVAR + err << "Forbidden to add an active display as '" << OCIO_ACTIVE_DISPLAYS_ENVVAR << "' controls the active list."; throw Exception(err.str().c_str()); @@ -180,7 +182,7 @@ void AddActiveDisplayView(ConfigRcPtr & config, const char * displayName, const StringUtils::StringVec displays = StringUtils::Split(activeDisplays, ','); StringUtils::Trim(displays); - const bool acceptAllDisplays = displays.size()==1 && displays[0]==""; + const bool acceptAllDisplays = displays.size() == 1 && displays[0] == ""; if (!acceptAllDisplays && !StringUtils::Contain(displays, displayName)) { @@ -199,12 +201,11 @@ void AddActiveDisplayView(ConfigRcPtr & config, const char * displayName, const StringUtils::StringVec views = StringUtils::Split(envActiveViews, ','); StringUtils::Trim(views); - const bool acceptAllViews = views.size()==1 && views[0]==""; + const bool acceptAllViews = views.size() == 1 && views[0] == ""; if (!acceptAllViews) { std::stringstream err; - err << "Forbidden to add an active view as '" - << OCIO_ACTIVE_VIEWS_ENVVAR + err << "Forbidden to add an active view as '" << OCIO_ACTIVE_VIEWS_ENVVAR << "' controls the active list."; throw Exception(err.str().c_str()); @@ -217,8 +218,8 @@ void AddActiveDisplayView(ConfigRcPtr & config, const char * displayName, const { StringUtils::StringVec views = StringUtils::Split(activeViews, ','); StringUtils::Trim(views); - - const bool acceptAllViews = views.size()==1 && views[0]==""; + + const bool acceptAllViews = views.size() == 1 && views[0] == ""; if (!acceptAllViews && !StringUtils::Contain(views, viewName)) { @@ -232,7 +233,8 @@ void AddActiveDisplayView(ConfigRcPtr & config, const char * displayName, const void RemoveActiveDisplayView(ConfigRcPtr & config, const char * displayName, const char * viewName) { - if (!displayName || !viewName) return; + if (!displayName || !viewName) + return; // Remove the display from the active display list only if possible. @@ -242,12 +244,11 @@ void RemoveActiveDisplayView(ConfigRcPtr & config, const char * displayName, con StringUtils::StringVec displays = StringUtils::Split(envActiveDisplays, ','); StringUtils::Trim(displays); - const bool acceptAllDisplays = displays.size()==1 && displays[0]==""; + const bool acceptAllDisplays = displays.size() == 1 && displays[0] == ""; if (!acceptAllDisplays) { std::stringstream err; - err << "Forbidden to remove an active display as '" - << OCIO_ACTIVE_DISPLAYS_ENVVAR + err << "Forbidden to remove an active display as '" << OCIO_ACTIVE_DISPLAYS_ENVVAR << "' controls the active list."; throw Exception(err.str().c_str()); @@ -261,14 +262,14 @@ void RemoveActiveDisplayView(ConfigRcPtr & config, const char * displayName, con StringUtils::StringVec displays = StringUtils::Split(activeDisplays, ','); StringUtils::Trim(displays); - const bool acceptAllDisplays = displays.size()==1 && displays[0]==""; + const bool acceptAllDisplays = displays.size() == 1 && displays[0] == ""; if (!acceptAllDisplays && StringUtils::Contain(displays, displayName)) { // As the display is an active one, not finding it in the list // means that it could be removed from the 'active_displays' list. - bool toRemove = true; + bool toRemove = true; const int numDisplays = config->getNumDisplays(); for (int dispIdx = 0; dispIdx < numDisplays && toRemove; ++dispIdx) { @@ -297,12 +298,11 @@ void RemoveActiveDisplayView(ConfigRcPtr & config, const char * displayName, con StringUtils::StringVec views = StringUtils::Split(envActiveViews, ','); StringUtils::Trim(views); - const bool acceptAllViews = views.size()==1 && views[0]==""; + const bool acceptAllViews = views.size() == 1 && views[0] == ""; if (!acceptAllViews) { std::stringstream err; - err << "Forbidden to remove an active view as '" - << OCIO_ACTIVE_VIEWS_ENVVAR + err << "Forbidden to remove an active view as '" << OCIO_ACTIVE_VIEWS_ENVVAR << "' controls the active list."; throw Exception(err.str().c_str()); @@ -316,7 +316,7 @@ void RemoveActiveDisplayView(ConfigRcPtr & config, const char * displayName, con StringUtils::StringVec views = StringUtils::Split(activeViews, ','); StringUtils::Trim(views); - const bool acceptAllViews = views.size()==1 && views[0]==""; + const bool acceptAllViews = views.size() == 1 && views[0] == ""; if (!acceptAllViews && StringUtils::Contain(views, viewName)) { // As the view is an active one, not finding it in the list means that it could @@ -325,24 +325,21 @@ void RemoveActiveDisplayView(ConfigRcPtr & config, const char * displayName, con struct EnableAllDisplays { - EnableAllDisplays() = delete; + EnableAllDisplays() = delete; EnableAllDisplays(const EnableAllDisplays &) = delete; // Note that if the 'active_displays' list is controlled by the ennvar either // the code throws before or the following guard is useless. explicit EnableAllDisplays(ConfigRcPtr & config) - : m_config(config) - , m_activeDisplays(config->getActiveDisplays()) + : m_config(config) + , m_activeDisplays(config->getActiveDisplays()) { m_config->setActiveDisplays(""); } - ~EnableAllDisplays() - { - m_config->setActiveDisplays(m_activeDisplays.c_str()); - } + ~EnableAllDisplays() { m_config->setActiveDisplays(m_activeDisplays.c_str()); } - ConfigRcPtr m_config; + ConfigRcPtr m_config; const std::string m_activeDisplays; } guard(config); @@ -375,13 +372,14 @@ void RemoveActiveDisplayView(ConfigRcPtr & config, const char * displayName, con } } -void AddDisplayView(ConfigRcPtr & config, - const char * displayName, - const char * viewName, - const char * lookDefinition, - const ColorSpaceRcPtr & colorSpace, - FileTransformRcPtr & userTransform, - const char * connectionColorSpaceName) +void AddDisplayView( + ConfigRcPtr & config, + const char * displayName, + const char * viewName, + const char * lookDefinition, + const ColorSpaceRcPtr & colorSpace, + FileTransformRcPtr & userTransform, + const char * connectionColorSpaceName) { if (!displayName || !*displayName) { @@ -395,7 +393,7 @@ void AddDisplayView(ConfigRcPtr & config, // Step 1 - Create the color transformation. - GroupTransformRcPtr grp = GroupTransform::Create(); + GroupTransformRcPtr grp = GroupTransform::Create(); // Add the 'reference' to connection color space. { @@ -423,7 +421,8 @@ void AddDisplayView(ConfigRcPtr & config, if (tr) { TransformRcPtr t = tr->createEditableCopy(); - t->setDirection(CombineTransformDirections(tr->getDirection(), TRANSFORM_DIR_INVERSE)); + t->setDirection( + CombineTransformDirections(tr->getDirection(), TRANSFORM_DIR_INVERSE)); grp->appendTransform(t); } } @@ -448,16 +447,17 @@ void AddDisplayView(ConfigRcPtr & config, config->addDisplayView(displayName, viewName, colorSpace->getName(), lookDefinition); } -void AddDisplayView(ConfigRcPtr & config, - const char * displayName, - const char * viewName, - const char * lookDefinition, - const char * colorSpaceName, - const char * colorSpaceFamily, - const char * colorSpaceDescription, - const char * categories, - const char * transformFilePath, - const char * connectionColorSpaceName) +void AddDisplayView( + ConfigRcPtr & config, + const char * displayName, + const char * viewName, + const char * lookDefinition, + const char * colorSpaceName, + const char * colorSpaceFamily, + const char * colorSpaceDescription, + const char * categories, + const char * transformFilePath, + const char * connectionColorSpaceName) { ColorSpaceRcPtr colorSpace = ColorSpace::Create(); colorSpace->setName(colorSpaceName ? colorSpaceName : ""); @@ -494,16 +494,20 @@ void AddDisplayView(ConfigRcPtr & config, FileTransformRcPtr file = FileTransform::Create(); file->setSrc(transformFilePath); - AddDisplayView(config, - displayName, viewName, lookDefinition, - colorSpace, file, - connectionColorSpaceName); + AddDisplayView( + config, + displayName, + viewName, + lookDefinition, + colorSpace, + file, + connectionColorSpaceName); } void RemoveDisplayView(ConfigRcPtr & config, const char * displayName, const char * viewName) { - const std::string name{ config->getDisplayViewColorSpaceName(displayName, viewName) }; - const std::string csName{ name.empty() ? displayName : name }; + const std::string name{config->getDisplayViewColorSpaceName(displayName, viewName)}; + const std::string csName{name.empty() ? displayName : name}; if (csName.empty()) { std::string errMsg = "Missing color space for '"; @@ -530,7 +534,6 @@ void RemoveDisplayView(ConfigRcPtr & config, const char * displayName, const cha } } -} // DisplayViewHelpers - +} // namespace DisplayViewHelpers } // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/apphelpers/LegacyViewingPipeline.cpp b/src/OpenColorIO/apphelpers/LegacyViewingPipeline.cpp index 71fe1941fd..d9795f2979 100644 --- a/src/OpenColorIO/apphelpers/LegacyViewingPipeline.cpp +++ b/src/OpenColorIO/apphelpers/LegacyViewingPipeline.cpp @@ -7,17 +7,17 @@ #include -#include "utils/StringUtils.h" #include "LegacyViewingPipeline.h" +#include "utils/StringUtils.h" namespace OCIO_NAMESPACE { LegacyViewingPipelineRcPtr LegacyViewingPipeline::Create() { - return LegacyViewingPipelineRcPtr(new LegacyViewingPipelineImpl(), - &LegacyViewingPipelineImpl::Deleter); - + return LegacyViewingPipelineRcPtr( + new LegacyViewingPipelineImpl(), + &LegacyViewingPipelineImpl::Deleter); } void LegacyViewingPipelineImpl::Deleter(LegacyViewingPipeline * vp) @@ -30,12 +30,13 @@ ConstDisplayViewTransformRcPtr LegacyViewingPipelineImpl::getDisplayViewTransfor return m_displayViewTransform; } -void LegacyViewingPipelineImpl::setDisplayViewTransform(const ConstDisplayViewTransformRcPtr & dt) noexcept +void LegacyViewingPipelineImpl::setDisplayViewTransform( + const ConstDisplayViewTransformRcPtr & dt) noexcept { if (dt) { - TransformRcPtr tr = dt->createEditableCopy(); - m_displayViewTransform = OCIO_DYNAMIC_POINTER_CAST(tr); + TransformRcPtr tr = dt->createEditableCopy(); + m_displayViewTransform = OCIO_DYNAMIC_POINTER_CAST(tr); m_dtOriginalLooksBypass = m_displayViewTransform->getLooksBypass(); m_displayViewTransform->setLooksBypass(true); } @@ -113,7 +114,6 @@ void LegacyViewingPipelineImpl::setDisplayCC(const ConstTransformRcPtr & cc) noe } } - void LegacyViewingPipelineImpl::setLooksOverrideEnabled(bool enable) { m_looksOverrideEnabled = enable; @@ -166,8 +166,7 @@ void LegacyViewingPipelineImpl::validate() const catch (Exception & e) { std::ostringstream oss; - oss << "LegacyViewingPipeline is not valid: " - << e.what(); + oss << "LegacyViewingPipeline is not valid: " << e.what(); throw Exception(oss.str().c_str()); } } @@ -177,8 +176,9 @@ ConstProcessorRcPtr LegacyViewingPipelineImpl::getProcessor(const ConstConfigRcP return getProcessor(config, config->getCurrentContext()); } -ConstProcessorRcPtr LegacyViewingPipelineImpl::getProcessor(const ConstConfigRcPtr & configIn, - const ConstContextRcPtr & context) const +ConstProcessorRcPtr LegacyViewingPipelineImpl::getProcessor( + const ConstConfigRcPtr & configIn, + const ConstContextRcPtr & context) const { validate(); @@ -188,7 +188,7 @@ ConstProcessorRcPtr LegacyViewingPipelineImpl::getProcessor(const ConstConfigRcP ConstConfigRcPtr config = configIn; const std::string inputColorSpaceName = m_displayViewTransform->getSrc(); - ConstColorSpaceRcPtr inputColorSpace = config->getColorSpace(inputColorSpaceName.c_str()); + ConstColorSpaceRcPtr inputColorSpace = config->getColorSpace(inputColorSpaceName.c_str()); if (!inputColorSpace) { @@ -206,10 +206,10 @@ ConstProcessorRcPtr LegacyViewingPipelineImpl::getProcessor(const ConstConfigRcP } const std::string display = m_displayViewTransform->getDisplay(); - const std::string view = m_displayViewTransform->getView(); + const std::string view = m_displayViewTransform->getView(); - const std::string viewTransformName = config->getDisplayViewTransformName(display.c_str(), - view.c_str()); + const std::string viewTransformName + = config->getDisplayViewTransformName(display.c_str(), view.c_str()); ConstViewTransformRcPtr viewTransform; if (!viewTransformName.empty()) { @@ -218,18 +218,18 @@ ConstProcessorRcPtr LegacyViewingPipelineImpl::getProcessor(const ConstConfigRcP // NB: If the viewTransform is present, then displayColorSpace is a true display color space // rather than a traditional color space. - const std::string name{ config->getDisplayViewColorSpaceName(display.c_str(), view.c_str()) }; + const std::string name{config->getDisplayViewColorSpaceName(display.c_str(), view.c_str())}; // A shared view containing a view transform may set the color space to USE_DISPLAY_NAME, // in which case we look for a display color space with the same name as the display. const bool nameFromDisplay = (0 == strcmp(name.c_str(), OCIO_VIEW_USE_DISPLAY_NAME)); - const std::string displayColorSpaceName{ nameFromDisplay ? display : name }; + const std::string displayColorSpaceName{nameFromDisplay ? display : name}; ConstColorSpaceRcPtr displayColorSpace = config->getColorSpace(displayColorSpaceName.c_str()); // If this is not a color space it can be a named transform. Error handling (missing color // space or named transform) is handled by display view transform. const bool dataBypass = m_displayViewTransform->getDataBypass(); - const bool displayData = (!displayColorSpace || - (displayColorSpace && displayColorSpace->isData())) ? true : false; + const bool displayData + = (!displayColorSpace || (displayColorSpace && displayColorSpace->isData())) ? true : false; bool skipColorSpaceConversions = dataBypass && (inputColorSpace->isData() || displayData); if (dataBypass) @@ -247,14 +247,14 @@ ConstProcessorRcPtr LegacyViewingPipelineImpl::getProcessor(const ConstConfigRcP double matrix44[16]; typedChannelView->getMatrix(matrix44); - if ((matrix44[3]>0.0) || (matrix44[7]>0.0) || (matrix44[11]>0.0)) + if ((matrix44[3] > 0.0) || (matrix44[7] > 0.0) || (matrix44[11] > 0.0)) { skipColorSpaceConversions = true; } } } - std::string currentCSName{ inputColorSpaceName }; + std::string currentCSName{inputColorSpaceName}; ConstColorSpaceRcPtr dtInputColorSpace = inputColorSpace; GroupTransformRcPtr group = GroupTransform::Create(); @@ -266,7 +266,7 @@ ConstProcessorRcPtr LegacyViewingPipelineImpl::getProcessor(const ConstConfigRcP if (!linearCC->isNoOp()) { auto sceneLinearCS = config->getColorSpace(ROLE_SCENE_LINEAR); - dtInputColorSpace = sceneLinearCS; + dtInputColorSpace = sceneLinearCS; if (!dtInputColorSpace) { std::ostringstream os; @@ -296,7 +296,7 @@ ConstProcessorRcPtr LegacyViewingPipelineImpl::getProcessor(const ConstConfigRcP if (!colorTimingCC->isNoOp()) { auto colorTimingCS = config->getColorSpace(ROLE_COLOR_TIMING); - dtInputColorSpace = colorTimingCS; + dtInputColorSpace = colorTimingCS; if (!dtInputColorSpace) { std::ostringstream os; @@ -318,7 +318,7 @@ ConstProcessorRcPtr LegacyViewingPipelineImpl::getProcessor(const ConstConfigRcP } } - TransformRcPtr trans = m_displayViewTransform->createEditableCopy(); + TransformRcPtr trans = m_displayViewTransform->createEditableCopy(); DisplayViewTransformRcPtr dt = OCIO_DYNAMIC_POINTER_CAST(trans); dt->setDirection(TRANSFORM_DIR_FORWARD); @@ -326,8 +326,9 @@ ConstProcessorRcPtr LegacyViewingPipelineImpl::getProcessor(const ConstConfigRcP dt->setSrc(currentCSName.c_str()); // NB: If looksOverrideEnabled is true, always apply the look, even to data color spaces. - // In other cases, follow what the DisplayViewTransform would do, except skip color space conversions - // to the process space for Look transforms for data spaces (DisplayViewTransform never skips). + // In other cases, follow what the DisplayViewTransform would do, except skip color space + // conversions to the process space for Look transforms for data spaces (DisplayViewTransform + // never skips). std::string looks; if (m_looksOverrideEnabled) { @@ -341,9 +342,10 @@ ConstProcessorRcPtr LegacyViewingPipelineImpl::getProcessor(const ConstConfigRcP if (!looks.empty()) { const char * inCS = dtInputColorSpace->getName(); - const char * outCS = skipColorSpaceConversions ? inCS : - LookTransform::GetLooksResultColorSpace(configIn, context, - looks.c_str()); + const char * outCS + = skipColorSpaceConversions + ? inCS + : LookTransform::GetLooksResultColorSpace(configIn, context, looks.c_str()); // Resulting color space could be null in case of a noop look. if (outCS && *outCS) @@ -433,7 +435,7 @@ std::ostream & operator<<(std::ostream & os, const LegacyViewingPipeline & pipel os << "LooksOverrideEnabled"; first = false; } - const std::string lo{ pipeline.getLooksOverride() }; + const std::string lo{pipeline.getLooksOverride()}; if (!lo.empty()) { if (!first) diff --git a/src/OpenColorIO/apphelpers/LegacyViewingPipeline.h b/src/OpenColorIO/apphelpers/LegacyViewingPipeline.h index 86cadf4810..0a2b6a44a4 100644 --- a/src/OpenColorIO/apphelpers/LegacyViewingPipeline.h +++ b/src/OpenColorIO/apphelpers/LegacyViewingPipeline.h @@ -1,26 +1,23 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_LEGACYVIEWINGPIPELINE_H #define INCLUDED_OCIO_LEGACYVIEWINGPIPELINE_H - #include #include - namespace OCIO_NAMESPACE { class LegacyViewingPipelineImpl : public LegacyViewingPipeline { public: - LegacyViewingPipelineImpl() = default; + LegacyViewingPipelineImpl() = default; ~LegacyViewingPipelineImpl() = default; - LegacyViewingPipelineImpl(const LegacyViewingPipelineImpl &) = delete; + LegacyViewingPipelineImpl(const LegacyViewingPipelineImpl &) = delete; LegacyViewingPipelineImpl & operator=(const LegacyViewingPipelineImpl &) = delete; ConstDisplayViewTransformRcPtr getDisplayViewTransform() const noexcept override; @@ -44,8 +41,9 @@ class LegacyViewingPipelineImpl : public LegacyViewingPipeline void setLooksOverride(const char * looks) override; const char * getLooksOverride() const override; - ConstProcessorRcPtr getProcessor(const ConstConfigRcPtr & config, - const ConstContextRcPtr & context) const override; + ConstProcessorRcPtr getProcessor( + const ConstConfigRcPtr & config, + const ConstContextRcPtr & context) const override; ConstProcessorRcPtr getProcessor(const ConstConfigRcPtr & config) const override; @@ -61,13 +59,12 @@ class LegacyViewingPipelineImpl : public LegacyViewingPipeline TransformRcPtr m_displayCC; DisplayViewTransformRcPtr m_displayViewTransform; // Looks from DisplayViewTransform are applied separately. - bool m_dtOriginalLooksBypass{ false }; + bool m_dtOriginalLooksBypass{false}; - bool m_looksOverrideEnabled{ false }; + bool m_looksOverrideEnabled{false}; std::string m_looksOverride; }; } // namespace OCIO_NAMESPACE - #endif // INCLUDED_OCIO_LEGACYVIEWINGPIPELINE_H diff --git a/src/OpenColorIO/apphelpers/MixingHelpers.cpp b/src/OpenColorIO/apphelpers/MixingHelpers.cpp index 9f6fa1e396..0144a0792f 100644 --- a/src/OpenColorIO/apphelpers/MixingHelpers.cpp +++ b/src/OpenColorIO/apphelpers/MixingHelpers.cpp @@ -12,7 +12,6 @@ #include "MixingHelpers.h" #include "utils/StringUtils.h" - namespace OCIO_NAMESPACE { namespace @@ -46,25 +45,25 @@ float perceptualToLinear(float percept) return std::pow(percept, GAMMA); } -} // anon. - +} // namespace MixingSliderImpl::MixingSliderImpl(MixingColorSpaceManager & mixing) - : MixingSlider() - , m_mixing(mixing) + : MixingSlider() + , m_mixing(mixing) { } void MixingSliderImpl::Deleter(MixingSlider * slider) { - delete (MixingSliderImpl*)slider; + delete (MixingSliderImpl *)slider; } float MixingSliderImpl::getSliderMinEdge() const noexcept { - return (!m_mixing.isPerceptuallyUniform() - ? linearToPerceptual(std::min(m_sliderMinEdge, m_sliderMaxEdge - 0.01f)) - : m_sliderMinEdge); + return ( + !m_mixing.isPerceptuallyUniform() + ? linearToPerceptual(std::min(m_sliderMinEdge, m_sliderMaxEdge - 0.01f)) + : m_sliderMinEdge); } void MixingSliderImpl::setSliderMinEdge(float sliderMixingMinEdge) noexcept @@ -74,9 +73,10 @@ void MixingSliderImpl::setSliderMinEdge(float sliderMixingMinEdge) noexcept float MixingSliderImpl::getSliderMaxEdge() const noexcept { - return (!m_mixing.isPerceptuallyUniform() - ? linearToPerceptual(std::max(m_sliderMaxEdge, m_sliderMinEdge + 0.01f)) - : m_sliderMaxEdge); + return ( + !m_mixing.isPerceptuallyUniform() + ? linearToPerceptual(std::max(m_sliderMaxEdge, m_sliderMinEdge + 0.01f)) + : m_sliderMaxEdge); } void MixingSliderImpl::setSliderMaxEdge(float sliderMixingMaxEdge) noexcept @@ -105,7 +105,6 @@ float MixingSliderImpl::mixingToSlider(float mixingUnits) const noexcept return sliderUnits; } - std::ostream & operator<<(std::ostream & os, const MixingSlider & ms) { os << "minEdge: " << ms.getSliderMinEdge(); @@ -115,19 +114,20 @@ std::ostream & operator<<(std::ostream & os, const MixingSlider & ms) MixingColorSpaceManagerRcPtr MixingColorSpaceManager::Create(ConstConfigRcPtr & config) { - return std::shared_ptr(new MixingColorSpaceManagerImpl(config), - &MixingColorSpaceManagerImpl::Deleter); + return std::shared_ptr( + new MixingColorSpaceManagerImpl(config), + &MixingColorSpaceManagerImpl::Deleter); } void MixingColorSpaceManagerImpl::Deleter(MixingColorSpaceManager * incs) { - delete (MixingColorSpaceManagerImpl*)incs; + delete (MixingColorSpaceManagerImpl *)incs; } MixingColorSpaceManagerImpl::MixingColorSpaceManagerImpl(ConstConfigRcPtr & config) - : MixingColorSpaceManager() - , m_config(config) - , m_slider(*this) + : MixingColorSpaceManager() + , m_config(config) + , m_slider(*this) { refresh(); } @@ -155,7 +155,7 @@ void MixingColorSpaceManagerImpl::refresh() else { // TODO: Replace the 'Display Space' entry (i.e. the color space of the monitor) - // by the list of all the display color spaces from the configuration + // by the list of all the display color spaces from the configuration // when the feature is in. m_mixingSpaces.push_back("Rendering Space"); m_mixingSpaces.push_back("Display Space"); @@ -179,8 +179,7 @@ const char * MixingColorSpaceManagerImpl::getMixingSpaceUIName(size_t idx) const } std::stringstream ss; - ss << "Invalid mixing space index " << idx - << " where size is " << m_mixingSpaces.size() << "."; + ss << "Invalid mixing space index " << idx << " where size is " << m_mixingSpaces.size() << "."; throw Exception(ss.str().c_str()); } @@ -195,8 +194,8 @@ void MixingColorSpaceManagerImpl::setSelectedMixingSpaceIdx(size_t idx) if (idx >= m_mixingSpaces.size()) { std::stringstream ss; - ss << "Invalid idx for the mixing space index " << idx - << " where size is " << m_mixingSpaces.size() << "."; + ss << "Invalid idx for the mixing space index " << idx << " where size is " + << m_mixingSpaces.size() << "."; throw Exception(ss.str().c_str()); } @@ -205,7 +204,7 @@ void MixingColorSpaceManagerImpl::setSelectedMixingSpaceIdx(size_t idx) void MixingColorSpaceManagerImpl::setSelectedMixingSpace(const char * mixingSpace) { - for (size_t idx = 0 ; idx < m_mixingSpaces.size(); ++idx) + for (size_t idx = 0; idx < m_mixingSpaces.size(); ++idx) { if (m_mixingSpaces[idx] == mixingSpace) { @@ -225,9 +224,9 @@ bool MixingColorSpaceManagerImpl::isPerceptuallyUniform() const noexcept // (The limited options above allow us to hard-code for now.) // Only Display color spaces are perceptually linear. - // TODO: It's probably not always reasonable to assume the color_picking role is + // TODO: It's probably not always reasonable to assume the color_picking role is // perceptually uniform. - return !m_colorPicker ? getSelectedMixingSpaceIdx()!=0 : true; + return !m_colorPicker ? getSelectedMixingSpaceIdx() != 0 : true; } size_t MixingColorSpaceManagerImpl::getNumMixingEncodings() const noexcept @@ -243,8 +242,8 @@ const char * MixingColorSpaceManagerImpl::getMixingEncodingName(size_t idx) cons } std::stringstream ss; - ss << "Invalid mixing encoding index " << idx - << " where size is " << m_mixingEncodings.size() << "."; + ss << "Invalid mixing encoding index " << idx << " where size is " << m_mixingEncodings.size() + << "."; throw Exception(ss.str().c_str()); } @@ -259,8 +258,8 @@ void MixingColorSpaceManagerImpl::setSelectedMixingEncodingIdx(size_t idx) if (idx >= m_mixingEncodings.size()) { std::stringstream ss; - ss << "Invalid idx for the mixing encoding index " << idx - << " where size is " << m_mixingEncodings.size() << "."; + ss << "Invalid idx for the mixing encoding index " << idx << " where size is " + << m_mixingEncodings.size() << "."; throw Exception(ss.str().c_str()); } @@ -269,7 +268,7 @@ void MixingColorSpaceManagerImpl::setSelectedMixingEncodingIdx(size_t idx) void MixingColorSpaceManagerImpl::setSelectedMixingEncoding(const char * mixingEncoding) { - for (size_t idx = 0 ; idx < m_mixingEncodings.size(); ++idx) + for (size_t idx = 0; idx < m_mixingEncodings.size(); ++idx) { if (m_mixingEncodings[idx] == mixingEncoding) { @@ -283,11 +282,12 @@ void MixingColorSpaceManagerImpl::setSelectedMixingEncoding(const char * mixingE throw Exception(ss.str().c_str()); } -// Get a processor to convert from the working/rendering space to the mixing space +// Get a processor to convert from the working/rendering space to the mixing space // (using the RGB encoding rather than HSV). -ConstProcessorRcPtr MixingColorSpaceManagerImpl::getProcessorWithoutEncoding(const char * workingName, - const char * displayName, - const char * viewName) const +ConstProcessorRcPtr MixingColorSpaceManagerImpl::getProcessorWithoutEncoding( + const char * workingName, + const char * displayName, + const char * viewName) const { if (m_colorPicker) { @@ -296,7 +296,7 @@ ConstProcessorRcPtr MixingColorSpaceManagerImpl::getProcessorWithoutEncoding(con } else { - if (getSelectedMixingSpaceIdx()>0) + if (getSelectedMixingSpaceIdx() > 0) { // Mix colors in the selected (display, view) space. auto dt = DisplayViewTransform::Create(); @@ -314,19 +314,19 @@ ConstProcessorRcPtr MixingColorSpaceManagerImpl::getProcessorWithoutEncoding(con } } -ConstProcessorRcPtr MixingColorSpaceManagerImpl::getProcessor(const char * workingName, - const char * displayName, - const char * viewName, - TransformDirection direction) const +ConstProcessorRcPtr MixingColorSpaceManagerImpl::getProcessor( + const char * workingName, + const char * displayName, + const char * viewName, + TransformDirection direction) const { GroupTransformRcPtr group = GroupTransform::Create(); - ConstProcessorRcPtr processor - = getProcessorWithoutEncoding(workingName, displayName, viewName); + ConstProcessorRcPtr processor = getProcessorWithoutEncoding(workingName, displayName, viewName); group->appendTransform(processor->createGroupTransform()); - if (getSelectedMixingEncodingIdx()==1) // i.e. HSV + if (getSelectedMixingEncodingIdx() == 1) // i.e. HSV { FixedFunctionTransformRcPtr tr = FixedFunctionTransform::Create(FIXED_FUNCTION_RGB_TO_HSV); @@ -341,8 +341,9 @@ MixingSlider & MixingColorSpaceManagerImpl::getSlider() noexcept return m_slider; } -MixingSlider & MixingColorSpaceManagerImpl::getSlider(float sliderMixingMinEdge, - float sliderMixingMaxEdge) noexcept +MixingSlider & MixingColorSpaceManagerImpl::getSlider( + float sliderMixingMinEdge, + float sliderMixingMaxEdge) noexcept { m_slider.setSliderMinEdge(sliderMixingMinEdge); m_slider.setSliderMaxEdge(sliderMixingMaxEdge); diff --git a/src/OpenColorIO/apphelpers/MixingHelpers.h b/src/OpenColorIO/apphelpers/MixingHelpers.h index bb00ce2619..e981df4de1 100644 --- a/src/OpenColorIO/apphelpers/MixingHelpers.h +++ b/src/OpenColorIO/apphelpers/MixingHelpers.h @@ -1,21 +1,18 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_MIXING_HELPERS_H #define INCLUDED_OCIO_MIXING_HELPERS_H - #include - namespace OCIO_NAMESPACE { class MixingSliderImpl : public MixingSlider { public: - MixingSliderImpl() = delete; + MixingSliderImpl() = delete; MixingSliderImpl & operator=(const MixingSliderImpl &) = delete; explicit MixingSliderImpl(MixingColorSpaceManager & mixing); ~MixingSliderImpl() override = default; @@ -42,11 +39,11 @@ class MixingSliderImpl : public MixingSlider class MixingColorSpaceManagerImpl : public MixingColorSpaceManager { public: - MixingColorSpaceManagerImpl() = delete; + MixingColorSpaceManagerImpl() = delete; MixingColorSpaceManagerImpl & operator=(const MixingColorSpaceManagerImpl &) = delete; explicit MixingColorSpaceManagerImpl(ConstConfigRcPtr & config); MixingColorSpaceManagerImpl(const MixingColorSpaceManagerImpl &) = delete; - ~MixingColorSpaceManagerImpl() override = default; + ~MixingColorSpaceManagerImpl() override = default; size_t getNumMixingSpaces() const noexcept override; const char * getMixingSpaceUIName(size_t idx) const override; @@ -64,13 +61,15 @@ class MixingColorSpaceManagerImpl : public MixingColorSpaceManager void refresh(ConstConfigRcPtr config) override; - ConstProcessorRcPtr getProcessor(const char * workingName, - const char * displayName, - const char * viewName, - TransformDirection direction) const override; + ConstProcessorRcPtr getProcessor( + const char * workingName, + const char * displayName, + const char * viewName, + TransformDirection direction) const override; MixingSlider & getSlider() noexcept override; - MixingSlider & getSlider(float sliderMixingMinEdge, float sliderMixingMaxEdge) noexcept override; + MixingSlider & getSlider(float sliderMixingMinEdge, float sliderMixingMaxEdge) noexcept + override; static void Deleter(MixingColorSpaceManager * incs); @@ -78,9 +77,10 @@ class MixingColorSpaceManagerImpl : public MixingColorSpaceManager protected: void refresh(); - ConstProcessorRcPtr getProcessorWithoutEncoding(const char * workingName, - const char * displayName, - const char * viewName) const; + ConstProcessorRcPtr getProcessorWithoutEncoding( + const char * workingName, + const char * displayName, + const char * viewName) const; private: ConstConfigRcPtr m_config; @@ -88,14 +88,14 @@ class MixingColorSpaceManagerImpl : public MixingColorSpaceManager MixingSliderImpl m_slider; ColorSpaceNames m_mixingSpaces; - const ColorSpaceNames m_mixingEncodings{ "RGB", "HSV" }; + const ColorSpaceNames m_mixingEncodings{"RGB", "HSV"}; - size_t m_selectedMixingSpaceIdx = 0; + size_t m_selectedMixingSpaceIdx = 0; size_t m_selectedMixingEncodingIdx = 0; ConstColorSpaceInfoRcPtr m_colorPicker; }; -} // namespace OCIO_NAMESPACE +} // namespace OCIO_NAMESPACE #endif // INCLUDED_OCIO_MIXING_HELPERS_H diff --git a/src/OpenColorIO/builtinconfigs/BuiltinConfigRegistry.cpp b/src/OpenColorIO/builtinconfigs/BuiltinConfigRegistry.cpp index 2cffa39c44..3a35ee38be 100644 --- a/src/OpenColorIO/builtinconfigs/BuiltinConfigRegistry.cpp +++ b/src/OpenColorIO/builtinconfigs/BuiltinConfigRegistry.cpp @@ -1,15 +1,15 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. -#include #include -#include +#include #include +#include // OpenColorIO must be first - order is important. #include -#include "Mutex.h" +#include "Mutex.h" #include "Platform.h" #include "builtinconfigs/BuiltinConfigRegistry.h" @@ -24,11 +24,13 @@ static constexpr char DEFAULT_BUILTIN_CONFIG[] = "cg-config-v2.1.0_aces-v1.3_oci // These are used for ResolveConfigPath function and we need to return a variable that still exists // once the function finishes since we are returning a const char *. static constexpr char DEFAULT_BUILTIN_CONFIG_URI[] = "ocio://cg-config-v2.1.0_aces-v1.3_ocio-v2.3"; -static constexpr char LATEST_CG_BUILTIN_CONFIG_URI[] = "ocio://cg-config-v2.1.0_aces-v1.3_ocio-v2.3"; -static constexpr char LATEST_STUDIO_BUILTIN_CONFIG_URI[] = "ocio://studio-config-v2.1.0_aces-v1.3_ocio-v2.3"; +static constexpr char LATEST_CG_BUILTIN_CONFIG_URI[] + = "ocio://cg-config-v2.1.0_aces-v1.3_ocio-v2.3"; +static constexpr char LATEST_STUDIO_BUILTIN_CONFIG_URI[] + = "ocio://studio-config-v2.1.0_aces-v1.3_ocio-v2.3"; -static constexpr char BUILTIN_DEFAULT_NAME[] = "default"; -static constexpr char BUILTIN_LATEST_CG_NAME[] = "cg-config-latest"; +static constexpr char BUILTIN_DEFAULT_NAME[] = "default"; +static constexpr char BUILTIN_LATEST_CG_NAME[] = "cg-config-latest"; static constexpr char BUILTIN_LATEST_STUDIO_NAME[] = "studio-config-latest"; namespace OCIO_NAMESPACE @@ -67,7 +69,7 @@ const BuiltinConfigRegistry & BuiltinConfigRegistry::Get() noexcept static BuiltinConfigRegistryImpl globalRegistry; static Mutex globalRegistryMutex; - + AutoMutex guard(globalRegistryMutex); globalRegistry.init(); @@ -84,15 +86,19 @@ void BuiltinConfigRegistryImpl::init() noexcept if (m_builtinConfigs.empty()) { m_builtinConfigs.clear(); - + CGCONFIG::Register(*this); STUDIOCONFIG::Register(*this); } } -void BuiltinConfigRegistryImpl::addBuiltin(const char * name, const char * uiName, const char * const config, bool isRecommended) +void BuiltinConfigRegistryImpl::addBuiltin( + const char * name, + const char * uiName, + const char * const config, + bool isRecommended) { - BuiltinConfigData data { name, uiName, config, isRecommended }; + BuiltinConfigData data{name, uiName, config, isRecommended}; for (auto & builtin : m_builtinConfigs) { diff --git a/src/OpenColorIO/builtinconfigs/BuiltinConfigRegistry.h b/src/OpenColorIO/builtinconfigs/BuiltinConfigRegistry.h index 6395e96c74..a6ffae3e7b 100644 --- a/src/OpenColorIO/builtinconfigs/BuiltinConfigRegistry.h +++ b/src/OpenColorIO/builtinconfigs/BuiltinConfigRegistry.h @@ -1,82 +1,86 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_BUILTIN_CONFIGS_REGISTRY_H #define INCLUDED_OCIO_BUILTIN_CONFIGS_REGISTRY_H -#include #include +#include namespace OCIO_NAMESPACE { class BuiltinConfigRegistryImpl : public BuiltinConfigRegistry { -struct BuiltinConfigData -{ - BuiltinConfigData(const char * name, const char * uiName, const char * config, bool isRecommended) - : m_config(config ? config : "") - , m_name(name ? name : "") - , m_uiName(uiName ? uiName : "") - , m_isRecommended(isRecommended) + struct BuiltinConfigData { - } - - BuiltinConfigData() = delete; - BuiltinConfigData(const BuiltinConfigData & o) = default; - BuiltinConfigData(BuiltinConfigData &&) = default; - BuiltinConfigData & operator= (const BuiltinConfigData &) = default; - - // m_config is accessing a global static pointer so there is not need to manage it. - const char * m_config; - std::string m_name; - std::string m_uiName; - bool m_isRecommended; -}; -using BuiltinConfigs = std::vector; + BuiltinConfigData( + const char * name, + const char * uiName, + const char * config, + bool isRecommended) + : m_config(config ? config : "") + , m_name(name ? name : "") + , m_uiName(uiName ? uiName : "") + , m_isRecommended(isRecommended) + { + } + + BuiltinConfigData() = delete; + BuiltinConfigData(const BuiltinConfigData & o) = default; + BuiltinConfigData(BuiltinConfigData &&) = default; + BuiltinConfigData & operator=(const BuiltinConfigData &) = default; + + // m_config is accessing a global static pointer so there is not need to manage it. + const char * m_config; + std::string m_name; + std::string m_uiName; + bool m_isRecommended; + }; + using BuiltinConfigs = std::vector; public: - BuiltinConfigRegistryImpl() = default; - BuiltinConfigRegistryImpl(const BuiltinConfigRegistryImpl &) = delete; + BuiltinConfigRegistryImpl() = default; + BuiltinConfigRegistryImpl(const BuiltinConfigRegistryImpl &) = delete; BuiltinConfigRegistryImpl & operator=(const BuiltinConfigRegistryImpl &) = delete; - ~BuiltinConfigRegistryImpl() = default; + ~BuiltinConfigRegistryImpl() = default; /** * @brief Loads built-in configs into the registry. - * - * Loads the built-in configs from various config header file that were generated from + * + * Loads the built-in configs from various config header file that were generated from * a template header file with cmake. - * - * The init method is light-weight. It does not contain a copy of the config data strings + * + * The init method is light-weight. It does not contain a copy of the config data strings * or parse them into config objects. */ void init() noexcept; /** * @brief Add a built-in config into the registry. - * + * * Adding a built-in config using an existing name will overwrite the current built-in * config associated with that name. - * + * * For backward compatibility, built-in configs can be set as NOT recommended. They will * still be available, but not recommended for the current version of OCIO. - * + * * @param name Name for the built-in config. * @param uiName User-friendly config name. * @param config Config as string * @param isRecommended Is the built-in config recommended or not. */ - void addBuiltin(const char * name, const char * uiName, const char * config, bool isRecommended); + void + addBuiltin(const char * name, const char * uiName, const char * config, bool isRecommended); /// Get the number of built-in configs available. size_t getNumBuiltinConfigs() const noexcept override; - /// Get the name of the config at the specified (zero-based) index. + /// Get the name of the config at the specified (zero-based) index. /// Throws for illegal index. const char * getBuiltinConfigName(size_t configIndex) const override; - // Get a user-friendly name for a built-in config, appropriate for displaying in a user + // Get a user-friendly name for a built-in config, appropriate for displaying in a user // interface. /// Throws for illegal index. const char * getBuiltinConfigUIName(size_t configIndex) const override; @@ -85,7 +89,7 @@ using BuiltinConfigs = std::vector; /// Throws for illegal index. const char * getBuiltinConfig(size_t configIndex) const override; - /// Get the Yaml text of the built-in config with the specified name. + /// Get the Yaml text of the built-in config with the specified name. /// Throws if the name is not found. const char * getBuiltinConfigByName(const char * configName) const override; @@ -95,6 +99,7 @@ using BuiltinConfigs = std::vector; /// Get the default recommended built-in config. const char * getDefaultBuiltinConfigName() const override; + private: BuiltinConfigs m_builtinConfigs; }; diff --git a/src/OpenColorIO/builtinconfigs/CGConfig.cpp b/src/OpenColorIO/builtinconfigs/CGConfig.cpp index 6157497109..7ef690e078 100644 --- a/src/OpenColorIO/builtinconfigs/CGConfig.cpp +++ b/src/OpenColorIO/builtinconfigs/CGConfig.cpp @@ -1,9 +1,9 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. -#include -#include "builtinconfigs/BuiltinConfigRegistry.h" #include "builtinconfigs/CGConfig.h" +#include "builtinconfigs/BuiltinConfigRegistry.h" +#include #include "CG.cpp" @@ -24,15 +24,13 @@ void Register(BuiltinConfigRegistryImpl & registry) noexcept "cg-config-v1.0.0_aces-v1.3_ocio-v2.1", "Academy Color Encoding System - CG Config [COLORSPACES v1.0.0] [ACES v1.3] [OCIO v2.1]", CG_CONFIG_V100_ACES_V13_OCIO_V21, - false - ); + false); registry.addBuiltin( "cg-config-v2.1.0_aces-v1.3_ocio-v2.3", "Academy Color Encoding System - CG Config [COLORSPACES v2.0.0] [ACES v1.3] [OCIO v2.3]", CG_CONFIG_V210_ACES_V13_OCIO_V23, - true - ); + true); } } // namespace CGCONFIG diff --git a/src/OpenColorIO/builtinconfigs/CGConfig.h b/src/OpenColorIO/builtinconfigs/CGConfig.h index ccd79b1c07..4b6960f7a6 100644 --- a/src/OpenColorIO/builtinconfigs/CGConfig.h +++ b/src/OpenColorIO/builtinconfigs/CGConfig.h @@ -1,13 +1,11 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_CGCONFIG_H #define INCLUDED_OCIO_CGCONFIG_H - -#include #include "builtinconfigs/BuiltinConfigRegistry.h" +#include namespace OCIO_NAMESPACE { @@ -16,7 +14,7 @@ class BuiltinConfigRegistryImpl; namespace CGCONFIG { - void Register(BuiltinConfigRegistryImpl & registry) noexcept; +void Register(BuiltinConfigRegistryImpl & registry) noexcept; } // namespace CGCONFIG } // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/builtinconfigs/StudioConfig.cpp b/src/OpenColorIO/builtinconfigs/StudioConfig.cpp index 2b68b7e9ec..5b34a9abcb 100644 --- a/src/OpenColorIO/builtinconfigs/StudioConfig.cpp +++ b/src/OpenColorIO/builtinconfigs/StudioConfig.cpp @@ -1,9 +1,9 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. -#include -#include "builtinconfigs/BuiltinConfigRegistry.h" #include "builtinconfigs/StudioConfig.h" +#include "builtinconfigs/BuiltinConfigRegistry.h" +#include #include "Studio.cpp" @@ -17,22 +17,22 @@ namespace STUDIOCONFIG { void Register(BuiltinConfigRegistryImpl & registry) noexcept { - // If a new built-in config is added, do not forget to update the LATEST_STUDIO_BUILTIN_CONFIG_URI - // variable (in BuiltinConfigRegistry.cpp). + // If a new built-in config is added, do not forget to update the + // LATEST_STUDIO_BUILTIN_CONFIG_URI variable (in BuiltinConfigRegistry.cpp). registry.addBuiltin( "studio-config-v1.0.0_aces-v1.3_ocio-v2.1", - "Academy Color Encoding System - Studio Config [COLORSPACES v1.0.0] [ACES v1.3] [OCIO v2.1]", + "Academy Color Encoding System - Studio Config [COLORSPACES v1.0.0] [ACES v1.3] [OCIO " + "v2.1]", STUDIO_CONFIG_V100_ACES_V13_OCIO_V21, - false - ); + false); registry.addBuiltin( "studio-config-v2.1.0_aces-v1.3_ocio-v2.3", - "Academy Color Encoding System - Studio Config [COLORSPACES v2.0.0] [ACES v1.3] [OCIO v2.3]", + "Academy Color Encoding System - Studio Config [COLORSPACES v2.0.0] [ACES v1.3] [OCIO " + "v2.3]", STUDIO_CONFIG_V210_ACES_V13_OCIO_V23, - true - ); + true); } } // namespace STUDIOCONFIG diff --git a/src/OpenColorIO/builtinconfigs/StudioConfig.h b/src/OpenColorIO/builtinconfigs/StudioConfig.h index 43266c5cd7..0665046e23 100644 --- a/src/OpenColorIO/builtinconfigs/StudioConfig.h +++ b/src/OpenColorIO/builtinconfigs/StudioConfig.h @@ -1,13 +1,11 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_STUDIOCONFIG_H #define INCLUDED_OCIO_STUDIOCONFIG_H - -#include #include "builtinconfigs/BuiltinConfigRegistry.h" +#include namespace OCIO_NAMESPACE { @@ -16,7 +14,7 @@ class BuiltinConfigRegistryImpl; namespace STUDIOCONFIG { - void Register(BuiltinConfigRegistryImpl & registry) noexcept; +void Register(BuiltinConfigRegistryImpl & registry) noexcept; } // namespace STUDIOCONFIG } // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/fileformats/FileFormat3DL.cpp b/src/OpenColorIO/fileformats/FileFormat3DL.cpp old mode 100755 new mode 100644 index 0babf55206..cbd4e50cd2 --- a/src/OpenColorIO/fileformats/FileFormat3DL.cpp +++ b/src/OpenColorIO/fileformats/FileFormat3DL.cpp @@ -8,17 +8,16 @@ #include +#include "BakingUtils.h" #include "BitDepthUtils.h" -#include "fileformats/FileFormatUtils.h" #include "MathUtils.h" +#include "ParseUtils.h" +#include "fileformats/FileFormatUtils.h" #include "ops/lut1d/Lut1DOp.h" #include "ops/lut3d/Lut3DOp.h" -#include "BakingUtils.h" -#include "ParseUtils.h" #include "transforms/FileTransform.h" #include "utils/StringUtils.h" - // Discreet's Flame LUT Format // Use a loose interpretation of the format to allow other 3D LUTs that look // similar, but dont strictly adhere to the real definition. @@ -62,16 +61,15 @@ Mesh 4 12 LUT8 gamma 1.0 -In this example, the 3D LUT has an input bit depth of 4 bits and an output -bit depth of 12 bits. You use the input value to calculate the RGB triplet -to be 17*17*17 (where 17=(2 to the power of 4)+1, and 4 is the input bit +In this example, the 3D LUT has an input bit depth of 4 bits and an output +bit depth of 12 bits. You use the input value to calculate the RGB triplet +to be 17*17*17 (where 17=(2 to the power of 4)+1, and 4 is the input bit depth). The first triplet is the output value at (0,0,0);(0,0,1);...; -(0,0,16) r,g,b coordinates; the second triplet is the output value at -(0,1,0);(0,1,1);...;(0,1,16) r,g,b coordinates; and so on. You use the output +(0,0,16) r,g,b coordinates; the second triplet is the output value at +(0,1,0);(0,1,1);...;(0,1,16) r,g,b coordinates; and so on. You use the output bit depth to set the output bit depth range (12 bits or 0-4095). */ - namespace OCIO_NAMESPACE { //////////////////////////////////////////////////////////////// @@ -81,7 +79,7 @@ namespace class LocalCachedFile : public CachedFile { public: - LocalCachedFile() = default; + LocalCachedFile() = default; ~LocalCachedFile() = default; Lut1DOpDataRcPtr lut1D; @@ -90,38 +88,29 @@ class LocalCachedFile : public CachedFile typedef OCIO_SHARED_PTR LocalCachedFileRcPtr; - - class LocalFileFormat : public FileFormat { public: - - LocalFileFormat() = default; + LocalFileFormat() = default; ~LocalFileFormat() = default; void getFormatInfo(FormatInfoVec & formatInfoVec) const override; - CachedFileRcPtr read(std::istream & istream, - const std::string & fileName, - Interpolation interp) const override; + CachedFileRcPtr read(std::istream & istream, const std::string & fileName, Interpolation interp) + const override; - void bake(const Baker & baker, - const std::string & formatName, - std::ostream & ostream) const override; + void bake(const Baker & baker, const std::string & formatName, std::ostream & ostream) + const override; - void buildFileOps(OpRcPtrVec & ops, - const Config & config, - const ConstContextRcPtr & context, - CachedFileRcPtr untypedCachedFile, - const FileTransform & fileTransform, - TransformDirection dir) const override; + void buildFileOps( + OpRcPtrVec & ops, + const Config & config, + const ConstContextRcPtr & context, + CachedFileRcPtr untypedCachedFile, + const FileTransform & fileTransform, + TransformDirection dir) const override; }; - - - - - // We use the maximum value found in the LUT to infer // the bit depth. While this is fugly. We dont believe // there is a better way, looking at the file, to @@ -129,10 +118,10 @@ class LocalFileFormat : public FileFormat // // Note: We allow for 2x overshoot in the LUTs. // As we dont allow for odd bit depths, this isn't a big deal. -// So sizes from 1/2 max - 2x max are valid +// So sizes from 1/2 max - 2x max are valid // -// FILE EXPECTED MAX CORRECTLY DECODED IF MAX IN THIS RANGE -// 8-bit 255 [0, 511] +// FILE EXPECTED MAX CORRECTLY DECODED IF MAX IN THIS RANGE +// 8-bit 255 [0, 511] // 10-bit 1023 [512, 2047] // 12-bit 4095 [2048, 8191] // 14-bit 16383 [8192, 32767] @@ -143,19 +132,20 @@ int GetLikelyLutBitDepth(int testval) const int MIN_BIT_DEPTH = 8; const int MAX_BIT_DEPTH = 16; - if(testval < 0) return -1; + if (testval < 0) + return -1; // Only test even bit depths - for(int bitDepth = MIN_BIT_DEPTH; - bitDepth <= MAX_BIT_DEPTH; bitDepth+=2) + for (int bitDepth = MIN_BIT_DEPTH; bitDepth <= MAX_BIT_DEPTH; bitDepth += 2) { - int maxcode = static_cast(pow(2.0,bitDepth)); + int maxcode = static_cast(pow(2.0, bitDepth)); int adjustedMax = maxcode * 2 - 1; if (testval <= adjustedMax) { - // Since 14-bit scaling is not used in practice, if the + // Since 14-bit scaling is not used in practice, if the // max is more than 8192, they are likely 16-bit values. - if (bitDepth == 14) bitDepth = 16; + if (bitDepth == 14) + bitDepth = 16; return bitDepth; } @@ -168,23 +158,23 @@ BitDepth GetOCIOBitdepth(int bitdepth) { switch (bitdepth) { - case 8: - return BIT_DEPTH_UINT8; - case 10: - return BIT_DEPTH_UINT10; - case 12: - return BIT_DEPTH_UINT12; - case 16: - return BIT_DEPTH_UINT16; - case 14: - default: - return BIT_DEPTH_UNKNOWN; + case 8: + return BIT_DEPTH_UINT8; + case 10: + return BIT_DEPTH_UINT10; + case 12: + return BIT_DEPTH_UINT12; + case 16: + return BIT_DEPTH_UINT16; + case 14: + default: + return BIT_DEPTH_UNKNOWN; } } int GetMaxValueFromIntegerBitDepth(int bitDepth) { - return static_cast( pow(2.0, bitDepth) ) - 1; + return static_cast(pow(2.0, bitDepth)) - 1; } int GetClampedIntFromNormFloat(float val, float scale) @@ -196,14 +186,14 @@ int GetClampedIntFromNormFloat(float val, float scale) void LocalFileFormat::getFormatInfo(FormatInfoVec & formatInfoVec) const { FormatInfo info; - info.name = "flame"; - info.extension = "3dl"; - info.capabilities = FormatCapabilityFlags(FORMAT_CAPABILITY_READ | FORMAT_CAPABILITY_BAKE); + info.name = "flame"; + info.extension = "3dl"; + info.capabilities = FormatCapabilityFlags(FORMAT_CAPABILITY_READ | FORMAT_CAPABILITY_BAKE); info.bake_capabilities = FORMAT_BAKE_CAPABILITY_3DLUT; formatInfoVec.push_back(info); FormatInfo info2 = info; - info2.name = "lustre"; + info2.name = "lustre"; formatInfoVec.push_back(info2); } @@ -216,9 +206,8 @@ void LocalFileFormat::getFormatInfo(FormatInfoVec & formatInfoVec) const // isIdentity method here. bool IsIdentity(const std::vector & rawshaper, BitDepth outBitDepth) { - unsigned int dim = (unsigned int)rawshaper.size(); - const float stepValue = (float)GetBitDepthMaxValue(outBitDepth) - / ((float)dim - 1.0f); + unsigned int dim = (unsigned int)rawshaper.size(); + const float stepValue = (float)GetBitDepthMaxValue(outBitDepth) / ((float)dim - 1.0f); for (unsigned int i = 0; i < dim; ++i) { @@ -233,9 +222,10 @@ bool IsIdentity(const std::vector & rawshaper, BitDepth outBitDepth) // Try and load the format // Raise an exception if it can't be loaded. -CachedFileRcPtr LocalFileFormat::read(std::istream & istream, - const std::string & /* fileName unused */, - Interpolation interp) const +CachedFileRcPtr LocalFileFormat::read( + std::istream & istream, + const std::string & /* fileName unused */, + Interpolation interp) const { std::vector rawshaper; std::vector raw3d; @@ -252,7 +242,7 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, int lineNumber = 0; - while(istream.good()) + while (istream.good()) { istream.getline(lineBuffer, MAX_LINE_SIZE); ++lineNumber; @@ -260,7 +250,8 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, // Strip and split the line. lineParts = StringUtils::SplitByWhiteSpaces(StringUtils::Trim(lineBuffer)); - if(lineParts.empty()) continue; + if (lineParts.empty()) + continue; if (lineParts.size() > 0) { if (StringUtils::StartsWith(lineParts[0], "#")) @@ -291,7 +282,7 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, // If we've found more than 3 ints, and dont have // a shaper LUT yet, we've got it! - if(tmpData.size()>3) + if (tmpData.size() > 3) { if (rawshaper.empty()) { @@ -312,7 +303,7 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, } } // If we've found 3 ints, add it to our 3D LUT. - else if(tmpData.size() == 3) + else if (tmpData.size() == 3) { raw3d.push_back(tmpData[0]); raw3d.push_back(tmpData[1]); @@ -335,7 +326,7 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, } } - if(raw3d.empty() && rawshaper.empty()) + if (raw3d.empty() && rawshaper.empty()) { std::ostringstream os; os << "Error parsing .3dl file. "; @@ -357,7 +348,7 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, BitDepth out1DBD = BIT_DEPTH_UNKNOWN; // Interpret the shaper LUT - if(!rawshaper.empty()) + if (!rawshaper.empty()) { // Find the maximum shaper LUT value to infer bit-depth. int shapermax = 0; @@ -366,7 +357,7 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, shapermax = std::max(shapermax, i); } - if(shapermaxlut1D = std::make_shared(length); + cachedFile->lut1D = std::make_shared(length); if (Lut1DOpData::IsValidInterpolation(interp)) { cachedFile->lut1D->setInterpolation(interp); @@ -411,7 +402,7 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, cachedFile->lut1D->setFileOutputBitDepth(out1DBD); const float scale = (float)GetBitDepthMaxValue(out1DBD); - Array & lutArray = cachedFile->lut1D->getArray(); + Array & lutArray = cachedFile->lut1D->getArray(); for (unsigned int i = 0, p = 0; i < rawshaper.size(); ++i) { for (int j = 0; j < 3; ++j, ++p) @@ -422,13 +413,11 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, } } - - // Interpret the parsed data. - if(!raw3d.empty()) + if (!raw3d.empty()) { // lut3dmax has been stored while reading values. - if (lut3dmaxlut3D->setFileOutputBitDepth(out3DBD); const float scale = (float)GetBitDepthMaxValue(out3DBD); - Array & lutArray = cachedFile->lut3D->getArray(); + Array & lutArray = cachedFile->lut3D->getArray(); for (size_t i = 0; i < raw3d.size(); ++i) { lutArray[(unsigned long)i] = static_cast(raw3d[i]) / scale; @@ -483,27 +472,27 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, int CubeDimensionLenToLustreBitDepth(int size) { - float logval = logf(static_cast(size-1)) / logf(2.0); + float logval = logf(static_cast(size - 1)) / logf(2.0); return static_cast(logval); } -void LocalFileFormat::bake(const Baker & baker, - const std::string & formatName, - std::ostream & ostream) const +void LocalFileFormat::bake( + const Baker & baker, + const std::string & formatName, + std::ostream & ostream) const { int DEFAULT_CUBE_SIZE = 0; - int SHAPER_BIT_DEPTH = 10; - int CUBE_BIT_DEPTH = 12; - + int SHAPER_BIT_DEPTH = 10; + int CUBE_BIT_DEPTH = 12; // NOTE: This code is very old, Lustre and Flame have long been able // to support much larger cube sizes. Furthermore there is no // need to use the legacy 3dl format since CLF/CTF is supported. - if(formatName == "lustre") + if (formatName == "lustre") { DEFAULT_CUBE_SIZE = 33; } - else if(formatName == "flame") + else if (formatName == "flame") { DEFAULT_CUBE_SIZE = 17; } @@ -518,16 +507,18 @@ void LocalFileFormat::bake(const Baker & baker, ConstConfigRcPtr config = baker.getConfig(); int cubeSize = baker.getCubeSize(); - if(cubeSize==-1) cubeSize = DEFAULT_CUBE_SIZE; + if (cubeSize == -1) + cubeSize = DEFAULT_CUBE_SIZE; cubeSize = std::max(2, cubeSize); // smallest cube is 2x2x2 int shaperSize = baker.getShaperSize(); - if(shaperSize==-1) shaperSize = cubeSize; + if (shaperSize == -1) + shaperSize = cubeSize; std::vector cubeData; - cubeData.resize(cubeSize*cubeSize*cubeSize*3); + cubeData.resize(cubeSize * cubeSize * cubeSize * 3); GenerateIdentityLut3D(&cubeData[0], cubeSize, 3, LUT3DORDER_FAST_BLUE); - PackedImageDesc cubeImg(&cubeData[0], cubeSize*cubeSize*cubeSize, 1, 3); + PackedImageDesc cubeImg(&cubeData[0], cubeSize * cubeSize * cubeSize, 1, 3); ConstCPUProcessorRcPtr inputToTarget = GetInputToTargetProcessor(baker); inputToTarget->apply(cubeImg); @@ -535,7 +526,7 @@ void LocalFileFormat::bake(const Baker & baker, // For for maximum compatibility with other apps, we will // not utilize the shaper or output any metadata. - if(formatName == "lustre") + if (formatName == "lustre") { int meshInputBitDepth = CubeDimensionLenToLustreBitDepth(cubeSize); ostream << "3DMESH\n"; @@ -545,49 +536,48 @@ void LocalFileFormat::bake(const Baker & baker, std::vector shaperData(shaperSize); GenerateIdentityLut1D(&shaperData[0], shaperSize, 1); - float shaperScale = static_cast( - GetMaxValueFromIntegerBitDepth(SHAPER_BIT_DEPTH)); + float shaperScale = static_cast(GetMaxValueFromIntegerBitDepth(SHAPER_BIT_DEPTH)); - for(unsigned int i=0; i( - GetMaxValueFromIntegerBitDepth(CUBE_BIT_DEPTH)); + float cubeScale = static_cast(GetMaxValueFromIntegerBitDepth(CUBE_BIT_DEPTH)); - for(int i=0; i(untypedCachedFile); // This should never happen. - if(!cachedFile || (!cachedFile->lut1D && !cachedFile->lut3D)) + if (!cachedFile || (!cachedFile->lut1D && !cachedFile->lut3D)) { std::ostringstream os; os << "Cannot build .3dl Op. Invalid cache type."; @@ -602,8 +592,8 @@ LocalFileFormat::buildFileOps(OpRcPtrVec & ops, const auto fileInterp = fileTransform.getInterpolation(); bool fileInterpUsed = false; - auto lut1D = HandleLUT1D(cachedFile->lut1D, fileInterp, fileInterpUsed); - auto lut3D = HandleLUT3D(cachedFile->lut3D, fileInterp, fileInterpUsed); + auto lut1D = HandleLUT1D(cachedFile->lut1D, fileInterp, fileInterpUsed); + auto lut3D = HandleLUT3D(cachedFile->lut3D, fileInterp, fileInterpUsed); if (!fileInterpUsed) { @@ -612,29 +602,29 @@ LocalFileFormat::buildFileOps(OpRcPtrVec & ops, switch (newDir) { - case TRANSFORM_DIR_FORWARD: - if (lut1D) - { - CreateLut1DOp(ops, lut1D, newDir); - } - if (lut3D) - { - CreateLut3DOp(ops, lut3D, newDir); - } - break; - case TRANSFORM_DIR_INVERSE: - if (lut3D) - { - CreateLut3DOp(ops, lut3D, newDir); - } - if (lut1D) - { - CreateLut1DOp(ops, lut1D, newDir); - } - break; + case TRANSFORM_DIR_FORWARD: + if (lut1D) + { + CreateLut1DOp(ops, lut1D, newDir); + } + if (lut3D) + { + CreateLut3DOp(ops, lut3D, newDir); + } + break; + case TRANSFORM_DIR_INVERSE: + if (lut3D) + { + CreateLut3DOp(ops, lut3D, newDir); + } + if (lut1D) + { + CreateLut1DOp(ops, lut1D, newDir); + } + break; } } -} +} // namespace FileFormat * CreateFileFormat3DL() { diff --git a/src/OpenColorIO/fileformats/FileFormatCC.cpp b/src/OpenColorIO/fileformats/FileFormatCC.cpp old mode 100755 new mode 100644 index d8791f8196..4ac9abfd1e --- a/src/OpenColorIO/fileformats/FileFormatCC.cpp +++ b/src/OpenColorIO/fileformats/FileFormatCC.cpp @@ -3,13 +3,13 @@ #include +#include "OpBuilders.h" +#include "ParseUtils.h" #include "fileformats/cdl/CDLParser.h" #include "fileformats/cdl/CDLWriter.h" #include "fileformats/xmlutils/XMLReaderUtils.h" #include "fileformats/xmlutils/XMLWriterUtils.h" #include "transforms/FileTransform.h" -#include "OpBuilders.h" -#include "ParseUtils.h" namespace OCIO_NAMESPACE { @@ -19,10 +19,7 @@ namespace class LocalCachedFile : public CachedFile { public: - LocalCachedFile () - { - m_transform = CDLTransformImpl::Create(); - }; + LocalCachedFile() { m_transform = CDLTransformImpl::Create(); }; ~LocalCachedFile() = default; @@ -38,39 +35,38 @@ class LocalCachedFile : public CachedFile typedef OCIO_SHARED_PTR LocalCachedFileRcPtr; - - class LocalFileFormat : public FileFormat { public: - LocalFileFormat() = default; + LocalFileFormat() = default; ~LocalFileFormat() = default; void getFormatInfo(FormatInfoVec & formatInfoVec) const override; - CachedFileRcPtr read(std::istream & istream, - const std::string & fileName, - Interpolation interp) const override; - - void write(const ConstConfigRcPtr & config, - const ConstContextRcPtr & context, - const GroupTransform & group, - const std::string & formatName, - std::ostream & ostream) const override; - - void buildFileOps(OpRcPtrVec & ops, - const Config & config, - const ConstContextRcPtr & context, - CachedFileRcPtr untypedCachedFile, - const FileTransform & fileTransform, - TransformDirection dir) const override; + CachedFileRcPtr read(std::istream & istream, const std::string & fileName, Interpolation interp) + const override; + + void write( + const ConstConfigRcPtr & config, + const ConstContextRcPtr & context, + const GroupTransform & group, + const std::string & formatName, + std::ostream & ostream) const override; + + void buildFileOps( + OpRcPtrVec & ops, + const Config & config, + const ConstContextRcPtr & context, + CachedFileRcPtr untypedCachedFile, + const FileTransform & fileTransform, + TransformDirection dir) const override; }; void LocalFileFormat::getFormatInfo(FormatInfoVec & formatInfoVec) const { FormatInfo info; - info.name = FILEFORMAT_COLOR_CORRECTION; - info.extension = "cc"; + info.name = FILEFORMAT_COLOR_CORRECTION; + info.extension = "cc"; info.capabilities = FormatCapabilityFlags(FORMAT_CAPABILITY_READ | FORMAT_CAPABILITY_WRITE); formatInfoVec.push_back(info); } @@ -78,19 +74,20 @@ void LocalFileFormat::getFormatInfo(FormatInfoVec & formatInfoVec) const // Try and load the format // Raise an exception if it can't be loaded. -CachedFileRcPtr LocalFileFormat::read(std::istream & istream, - const std::string & fileName, - Interpolation /*interp*/) const +CachedFileRcPtr LocalFileFormat::read( + std::istream & istream, + const std::string & fileName, + Interpolation /*interp*/) const { LocalCachedFileRcPtr cachedFile = LocalCachedFileRcPtr(new LocalCachedFile()); - + CDLParser parser(fileName); try { parser.parse(istream); parser.getCDLTransform(cachedFile->m_transform); } - catch(Exception & e) + catch (Exception & e) { std::ostringstream os; os << "Error parsing .cc file. "; @@ -108,11 +105,12 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, return cachedFile; } -void LocalFileFormat::write(const ConstConfigRcPtr & /*config*/, - const ConstContextRcPtr & /*context*/, - const GroupTransform & group, - const std::string & /* formatName */, - std::ostream & ostream) const +void LocalFileFormat::write( + const ConstConfigRcPtr & /*config*/, + const ConstContextRcPtr & /*context*/, + const GroupTransform & group, + const std::string & /* formatName */, + std::ostream & ostream) const { if (group.getNumTransforms() != 1) { @@ -128,13 +126,13 @@ void LocalFileFormat::write(const ConstConfigRcPtr & /*config*/, Write(fmt, cdl); } -void -LocalFileFormat::buildFileOps(OpRcPtrVec & ops, - const Config & config, - const ConstContextRcPtr & /*context*/, - CachedFileRcPtr untypedCachedFile, - const FileTransform& fileTransform, - TransformDirection dir) const +void LocalFileFormat::buildFileOps( + OpRcPtrVec & ops, + const Config & config, + const ConstContextRcPtr & /*context*/, + CachedFileRcPtr untypedCachedFile, + const FileTransform & fileTransform, + TransformDirection dir) const { LocalCachedFileRcPtr cachedFile = DynamicPtrCast(untypedCachedFile); @@ -148,7 +146,7 @@ LocalFileFormat::buildFileOps(OpRcPtrVec & ops, const auto newDir = CombineTransformDirections(dir, fileTransform.getDirection()); - CDLTransformRcPtr cdl = cachedFile->m_transform; + CDLTransformRcPtr cdl = cachedFile->m_transform; const auto fileCDLStyle = fileTransform.getCDLStyle(); if (fileCDLStyle != CDL_TRANSFORM_DEFAULT) { @@ -158,7 +156,7 @@ LocalFileFormat::buildFileOps(OpRcPtrVec & ops, BuildCDLOp(ops, config, *cdl, newDir); } -} +} // namespace FileFormat * CreateFileFormatCC() { diff --git a/src/OpenColorIO/fileformats/FileFormatCCC.cpp b/src/OpenColorIO/fileformats/FileFormatCCC.cpp old mode 100755 new mode 100644 index bad7723efa..e64543c34a --- a/src/OpenColorIO/fileformats/FileFormatCCC.cpp +++ b/src/OpenColorIO/fileformats/FileFormatCCC.cpp @@ -5,15 +5,15 @@ #include +#include "OpBuilders.h" +#include "ParseUtils.h" +#include "fileformats/FormatMetadata.h" #include "fileformats/cdl/CDLParser.h" #include "fileformats/cdl/CDLWriter.h" #include "fileformats/xmlutils/XMLReaderUtils.h" #include "fileformats/xmlutils/XMLWriterUtils.h" -#include "fileformats/FormatMetadata.h" #include "transforms/CDLTransform.h" #include "transforms/FileTransform.h" -#include "OpBuilders.h" -#include "ParseUtils.h" namespace OCIO_NAMESPACE { @@ -23,7 +23,7 @@ namespace class LocalCachedFile : public CachedFile { public: - LocalCachedFile () + LocalCachedFile() : m_metadata() { } @@ -53,34 +53,35 @@ typedef OCIO_SHARED_PTR LocalCachedFileRcPtr; class LocalFileFormat : public FileFormat { public: - LocalFileFormat() = default; + LocalFileFormat() = default; ~LocalFileFormat() = default; void getFormatInfo(FormatInfoVec & formatInfoVec) const override; - CachedFileRcPtr read(std::istream & istream, - const std::string & fileName, - Interpolation interp) const override; - - void write(const ConstConfigRcPtr & config, - const ConstContextRcPtr & context, - const GroupTransform & group, - const std::string & formatName, - std::ostream & ostream) const override; - - void buildFileOps(OpRcPtrVec & ops, - const Config & config, - const ConstContextRcPtr & context, - CachedFileRcPtr untypedCachedFile, - const FileTransform & fileTransform, - TransformDirection dir) const override; + CachedFileRcPtr read(std::istream & istream, const std::string & fileName, Interpolation interp) + const override; + + void write( + const ConstConfigRcPtr & config, + const ConstContextRcPtr & context, + const GroupTransform & group, + const std::string & formatName, + std::ostream & ostream) const override; + + void buildFileOps( + OpRcPtrVec & ops, + const Config & config, + const ConstContextRcPtr & context, + CachedFileRcPtr untypedCachedFile, + const FileTransform & fileTransform, + TransformDirection dir) const override; }; void LocalFileFormat::getFormatInfo(FormatInfoVec & formatInfoVec) const { FormatInfo info; - info.name = FILEFORMAT_COLOR_CORRECTION_COLLECTION; - info.extension = "ccc"; + info.name = FILEFORMAT_COLOR_CORRECTION_COLLECTION; + info.extension = "ccc"; info.capabilities = FormatCapabilityFlags(FORMAT_CAPABILITY_READ | FORMAT_CAPABILITY_WRITE); formatInfoVec.push_back(info); } @@ -88,27 +89,30 @@ void LocalFileFormat::getFormatInfo(FormatInfoVec & formatInfoVec) const // Try and load the format // Raise an exception if it can't be loaded. -CachedFileRcPtr LocalFileFormat::read(std::istream & istream, - const std::string & fileName, - Interpolation /*interp*/) const +CachedFileRcPtr LocalFileFormat::read( + std::istream & istream, + const std::string & fileName, + Interpolation /*interp*/) const { CDLParser parser(fileName); parser.parse(istream); LocalCachedFileRcPtr cachedFile = LocalCachedFileRcPtr(new LocalCachedFile()); - parser.getCDLTransforms(cachedFile->m_transformMap, - cachedFile->m_transformVec, - cachedFile->m_metadata); + parser.getCDLTransforms( + cachedFile->m_transformMap, + cachedFile->m_transformVec, + cachedFile->m_metadata); return cachedFile; } -void LocalFileFormat::write(const ConstConfigRcPtr & /*config*/, - const ConstContextRcPtr & /*context*/, - const GroupTransform & group, - const std::string & formatName, - std::ostream & ostream) const +void LocalFileFormat::write( + const ConstConfigRcPtr & /*config*/, + const ConstContextRcPtr & /*context*/, + const GroupTransform & group, + const std::string & formatName, + std::ostream & ostream) const { const auto numCDL = group.getNumTransforms(); if (!numCDL) @@ -155,12 +159,13 @@ void LocalFileFormat::write(const ConstConfigRcPtr & /*config*/, fmt.writeEndTag(CDL_TAG_COLOR_CORRECTION_COLLECTION); } -void LocalFileFormat::buildFileOps(OpRcPtrVec & ops, - const Config & config, - const ConstContextRcPtr & context, - CachedFileRcPtr untypedCachedFile, - const FileTransform & fileTransform, - TransformDirection dir) const +void LocalFileFormat::buildFileOps( + OpRcPtrVec & ops, + const Config & config, + const ConstContextRcPtr & context, + CachedFileRcPtr untypedCachedFile, + const FileTransform & fileTransform, + TransformDirection dir) const { LocalCachedFileRcPtr cachedFile = DynamicPtrCast(untypedCachedFile); @@ -191,9 +196,9 @@ void LocalFileFormat::buildFileOps(OpRcPtrVec & ops, // But either way, it's what we should throw below. std::string cccid = fileTransform.getCCCId(); - cccid = context->resolveStringVar(cccid.c_str()); + cccid = context->resolveStringVar(cccid.c_str()); - bool success=false; + bool success = false; const auto fileCDLStyle = fileTransform.getCDLStyle(); @@ -216,11 +221,11 @@ void LocalFileFormat::buildFileOps(OpRcPtrVec & ops, if (!success) { // Use 0 for empty string. - int cccindex=0; + int cccindex = 0; if (cccid.empty() || StringToInt(&cccindex, cccid.c_str(), true)) { - int maxindex = ((int)cachedFile->m_transformVec.size())-1; - if (cccindex<0 || cccindex>maxindex) + int maxindex = ((int)cachedFile->m_transformVec.size()) - 1; + if (cccindex < 0 || cccindex > maxindex) { std::ostringstream os; os << "The specified cccindex " << cccindex; @@ -250,7 +255,7 @@ void LocalFileFormat::buildFileOps(OpRcPtrVec & ops, throw ExceptionMissingFile(os.str().c_str()); } } -} +} // namespace FileFormat * CreateFileFormatCCC() { diff --git a/src/OpenColorIO/fileformats/FileFormatCDL.cpp b/src/OpenColorIO/fileformats/FileFormatCDL.cpp old mode 100755 new mode 100644 index 5da6aae953..e8627a064f --- a/src/OpenColorIO/fileformats/FileFormatCDL.cpp +++ b/src/OpenColorIO/fileformats/FileFormatCDL.cpp @@ -30,12 +30,12 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include +#include "OpBuilders.h" +#include "ParseUtils.h" #include "fileformats/cdl/CDLParser.h" #include "fileformats/cdl/CDLWriter.h" #include "fileformats/xmlutils/XMLReaderUtils.h" #include "fileformats/xmlutils/XMLWriterUtils.h" -#include "OpBuilders.h" -#include "ParseUtils.h" #include "transforms/CDLTransform.h" #include "transforms/FileTransform.h" @@ -46,7 +46,7 @@ namespace class LocalCachedFile : public CachedFile { public: - LocalCachedFile () + LocalCachedFile() : m_metadata() { } @@ -76,34 +76,35 @@ typedef OCIO_SHARED_PTR LocalCachedFileRcPtr; class LocalFileFormat : public FileFormat { public: - LocalFileFormat() = default; + LocalFileFormat() = default; ~LocalFileFormat() = default; void getFormatInfo(FormatInfoVec & formatInfoVec) const override; - - CachedFileRcPtr read(std::istream & istream, - const std::string & fileName, - Interpolation interp) const override; - - void write(const ConstConfigRcPtr & config, - const ConstContextRcPtr & context, - const GroupTransform & group, - const std::string & formatName, - std::ostream & ostream) const override; - - void buildFileOps(OpRcPtrVec & ops, - const Config & config, - const ConstContextRcPtr & context, - CachedFileRcPtr untypedCachedFile, - const FileTransform & fileTransform, - TransformDirection dir) const override; + + CachedFileRcPtr read(std::istream & istream, const std::string & fileName, Interpolation interp) + const override; + + void write( + const ConstConfigRcPtr & config, + const ConstContextRcPtr & context, + const GroupTransform & group, + const std::string & formatName, + std::ostream & ostream) const override; + + void buildFileOps( + OpRcPtrVec & ops, + const Config & config, + const ConstContextRcPtr & context, + CachedFileRcPtr untypedCachedFile, + const FileTransform & fileTransform, + TransformDirection dir) const override; }; void LocalFileFormat::getFormatInfo(FormatInfoVec & formatInfoVec) const { FormatInfo info; - info.name = FILEFORMAT_COLOR_DECISION_LIST; - info.extension = "cdl"; + info.name = FILEFORMAT_COLOR_DECISION_LIST; + info.extension = "cdl"; info.capabilities = FormatCapabilityFlags(FORMAT_CAPABILITY_READ | FORMAT_CAPABILITY_WRITE); formatInfoVec.push_back(info); } @@ -111,27 +112,30 @@ void LocalFileFormat::getFormatInfo(FormatInfoVec & formatInfoVec) const // Try and load the format. // Raise an exception if it can't be loaded. -CachedFileRcPtr LocalFileFormat::read(std::istream & istream, - const std::string & fileName, - Interpolation /*interp*/) const +CachedFileRcPtr LocalFileFormat::read( + std::istream & istream, + const std::string & fileName, + Interpolation /*interp*/) const { CDLParser parser(fileName); parser.parse(istream); LocalCachedFileRcPtr cachedFile = LocalCachedFileRcPtr(new LocalCachedFile()); - - parser.getCDLTransforms(cachedFile->m_transformMap, - cachedFile->m_transformVec, - cachedFile->m_metadata); + + parser.getCDLTransforms( + cachedFile->m_transformMap, + cachedFile->m_transformVec, + cachedFile->m_metadata); return cachedFile; } -void LocalFileFormat::write(const ConstConfigRcPtr & /*config*/, - const ConstContextRcPtr & /*context*/, - const GroupTransform & group, - const std::string & formatName, - std::ostream & ostream) const +void LocalFileFormat::write( + const ConstConfigRcPtr & /*config*/, + const ConstContextRcPtr & /*context*/, + const GroupTransform & group, + const std::string & formatName, + std::ostream & ostream) const { const auto numCDL = group.getNumTransforms(); if (!numCDL) @@ -183,13 +187,13 @@ void LocalFileFormat::write(const ConstConfigRcPtr & /*config*/, fmt.writeEndTag(CDL_TAG_COLOR_DECISION_LIST); } -void -LocalFileFormat::buildFileOps(OpRcPtrVec & ops, - const Config & config, - const ConstContextRcPtr & context, - CachedFileRcPtr untypedCachedFile, - const FileTransform & fileTransform, - TransformDirection dir) const +void LocalFileFormat::buildFileOps( + OpRcPtrVec & ops, + const Config & config, + const ConstContextRcPtr & context, + CachedFileRcPtr untypedCachedFile, + const FileTransform & fileTransform, + TransformDirection dir) const { LocalCachedFileRcPtr cachedFile = DynamicPtrCast(untypedCachedFile); @@ -218,11 +222,11 @@ LocalFileFormat::buildFileOps(OpRcPtrVec & ops, // In a future OCIO release, it may be more appropriate to // rename ExceptionMissingFile -> ExceptionMissingCorrection. // But either way, it's what we should throw below. - + std::string cccid = fileTransform.getCCCId(); - cccid = context->resolveStringVar(cccid.c_str()); - - bool success=false; + cccid = context->resolveStringVar(cccid.c_str()); + + bool success = false; const auto fileCDLStyle = fileTransform.getCDLStyle(); @@ -240,17 +244,17 @@ LocalFileFormat::buildFileOps(OpRcPtrVec & ops, success = true; BuildCDLOp(ops, config, *cdl, newDir); } - + // Try to parse the cccid as an integer index // We want to be strict, so fail if leftover chars in the parse. if (!success) { // Use 0 for empty string. - int cccindex=0; + int cccindex = 0; if (cccid.empty() || StringToInt(&cccindex, cccid.c_str(), true)) { - int maxindex = ((int)cachedFile->m_transformVec.size())-1; - if (cccindex<0 || cccindex>maxindex) + int maxindex = ((int)cachedFile->m_transformVec.size()) - 1; + if (cccindex < 0 || cccindex > maxindex) { std::ostringstream os; os << "The specified cccindex " << cccindex; @@ -281,12 +285,11 @@ LocalFileFormat::buildFileOps(OpRcPtrVec & ops, throw ExceptionMissingFile(os.str().c_str()); } } -} +} // namespace FileFormat * CreateFileFormatCDL() { return new LocalFileFormat(); } - } // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/fileformats/FileFormatCSP.cpp b/src/OpenColorIO/fileformats/FileFormatCSP.cpp old mode 100755 new mode 100644 index 418edfa570..84b81f5775 --- a/src/OpenColorIO/fileformats/FileFormatCSP.cpp +++ b/src/OpenColorIO/fileformats/FileFormatCSP.cpp @@ -13,18 +13,17 @@ #include -#include "fileformats/FileFormatUtils.h" +#include "BakingUtils.h" #include "MathUtils.h" +#include "ParseUtils.h" +#include "Platform.h" +#include "fileformats/FileFormatUtils.h" #include "ops/lut1d/Lut1DOp.h" #include "ops/lut3d/Lut3DOp.h" #include "ops/matrix/MatrixOp.h" -#include "BakingUtils.h" -#include "ParseUtils.h" #include "transforms/FileTransform.h" -#include "Platform.h" #include "utils/StringUtils.h" - namespace OCIO_NAMESPACE { namespace @@ -41,148 +40,149 @@ typedef struct rsr_Interpolator1D_Raw_ unsigned int length; } rsr_Interpolator1D_Raw; -rsr_Interpolator1D_Raw * rsr_Interpolator1D_Raw_create( unsigned int prelutLength ); -void rsr_Interpolator1D_Raw_destroy( rsr_Interpolator1D_Raw * prelut ); - +rsr_Interpolator1D_Raw * rsr_Interpolator1D_Raw_create(unsigned int prelutLength); +void rsr_Interpolator1D_Raw_destroy(rsr_Interpolator1D_Raw * prelut); /* An opaque handle to the cineSpace 1D Interpolator object */ typedef struct rsr_Interpolator1D_ rsr_Interpolator1D; -rsr_Interpolator1D * rsr_Interpolator1D_createFromRaw( rsr_Interpolator1D_Raw * data ); -void rsr_Interpolator1D_destroy( rsr_Interpolator1D * rawdata ); -float rsr_Interpolator1D_interpolate( float x, rsr_Interpolator1D * data ); - +rsr_Interpolator1D * rsr_Interpolator1D_createFromRaw(rsr_Interpolator1D_Raw * data); +void rsr_Interpolator1D_destroy(rsr_Interpolator1D * rawdata); +float rsr_Interpolator1D_interpolate(float x, rsr_Interpolator1D * data); /* - * =========== INTERNAL HELPER FUNCTIONS ============ - */ + * =========== INTERNAL HELPER FUNCTIONS ============ + */ struct rsr_Interpolator1D_ { int nSamplePoints; float * stims; /* 5 * (nSamplePoints-1) long, holding a sequence of - * 1.0/delta, a, b, c, d - * such that the curve in interval i is given by - * z = (stims[i] - x)* (1.0/delta) - * y = a + b*z + c*z^2 + d*z^3 - */ + * 1.0/delta, a, b, c, d + * such that the curve in interval i is given by + * z = (stims[i] - x)* (1.0/delta) + * y = a + b*z + c*z^2 + d*z^3 + */ float * parameters; - float minValue; /* = f( stims[0] ) */ - float maxValue; /* = f(stims[nSamplePoints-1] ) */ + float minValue; /* = f( stims[0] ) */ + float maxValue; /* = f(stims[nSamplePoints-1] ) */ }; -static int rsr_internal_I1D_refineSegment( float x, float * data, int low, int high ) +static int rsr_internal_I1D_refineSegment(float x, float * data, int low, int high) { int midPoint; // TODO: Change assert to an exception? - assert( x>= data[low] ); - assert( x<= data[high] ); - assert( (high-low) > 0); - if( high-low==1 ) return low; - - midPoint = (low+high)/2; - if( x= data[low]); + assert(x <= data[high]); + assert((high - low) > 0); + if (high - low == 1) + return low; + + midPoint = (low + high) / 2; + if (x < data[midPoint]) + return rsr_internal_I1D_refineSegment(x, data, low, midPoint); + return rsr_internal_I1D_refineSegment(x, data, midPoint, high); } -static int rsr_internal_I1D_findSegmentContaining( float x, float * data, int n ) +static int rsr_internal_I1D_findSegmentContaining(float x, float * data, int n) { - return rsr_internal_I1D_refineSegment(x, data, 0, n-1); + return rsr_internal_I1D_refineSegment(x, data, 0, n - 1); } /* - * =========== USER FUNCTIONS ============ - */ - + * =========== USER FUNCTIONS ============ + */ -void rsr_Interpolator1D_destroy( rsr_Interpolator1D * data ) +void rsr_Interpolator1D_destroy(rsr_Interpolator1D * data) { - if(data==NULL) return; + if (data == NULL) + return; free(data->stims); free(data->parameters); free(data); } - - -float rsr_Interpolator1D_interpolate( float x, rsr_Interpolator1D * data ) +float rsr_Interpolator1D_interpolate(float x, rsr_Interpolator1D * data) { int segId; float * segdata; float invDelta; - float a,b,c,d,z; + float a, b, c, d, z; - assert(data!=NULL); + assert(data != NULL); /* Is x in range? */ - if( IsNan(x) ) return x; + if (IsNan(x)) + return x; - if( xstims[0] ) return data->minValue; - if (x>data->stims[ data->nSamplePoints -1] ) return data->maxValue; + if (x < data->stims[0]) + return data->minValue; + if (x > data->stims[data->nSamplePoints - 1]) + return data->maxValue; /* Ok so its between the beginning and end .. lets find out where... */ - segId = rsr_internal_I1D_findSegmentContaining( x, data->stims, data->nSamplePoints ); + segId = rsr_internal_I1D_findSegmentContaining(x, data->stims, data->nSamplePoints); - assert(data->parameters !=NULL ); + assert(data->parameters != NULL); segdata = data->parameters + 5 * segId; invDelta = segdata[0]; - a = segdata[1]; - b = segdata[2]; - c = segdata[3]; - d = segdata[4]; - - z = ( x - data->stims[segId] ) * invDelta; + a = segdata[1]; + b = segdata[2]; + c = segdata[3]; + d = segdata[4]; - return a + z * ( b + z * ( c + d * z ) ) ; + z = (x - data->stims[segId]) * invDelta; + return a + z * (b + z * (c + d * z)); } -rsr_Interpolator1D * rsr_Interpolator1D_createFromRaw( rsr_Interpolator1D_Raw * data ) +rsr_Interpolator1D * rsr_Interpolator1D_createFromRaw(rsr_Interpolator1D_Raw * data) { rsr_Interpolator1D * retval = NULL; /* Validate the data */ - assert(data!=NULL); - assert(data->length>=2); - assert(data->stims!=NULL); - assert(data->values!=NULL); + assert(data != NULL); + assert(data->length >= 2); + assert(data->stims != NULL); + assert(data->values != NULL); /* Create the real data. */ - retval = (rsr_Interpolator1D*)malloc( sizeof(rsr_Interpolator1D) ); // OCIO change: explicit cast - if(retval==NULL) + retval = (rsr_Interpolator1D *)malloc(sizeof(rsr_Interpolator1D)); // OCIO change: explicit cast + if (retval == NULL) { return NULL; } - retval->stims = (float*)malloc( sizeof(float) * data->length ); // OCIO change: explicit cast - if(retval->stims==NULL) + retval->stims = (float *)malloc(sizeof(float) * data->length); // OCIO change: explicit cast + if (retval->stims == NULL) { free(retval); return NULL; } - memcpy( retval->stims, data->stims, sizeof(float) * data->length ); + memcpy(retval->stims, data->stims, sizeof(float) * data->length); - retval->parameters = (float*)malloc( 5*sizeof(float) * ( data->length - 1 ) ); // OCIO change: explicit cast - if(retval->parameters==NULL) + retval->parameters + = (float *)malloc(5 * sizeof(float) * (data->length - 1)); // OCIO change: explicit cast + if (retval->parameters == NULL) { free(retval->stims); free(retval); return NULL; } retval->nSamplePoints = data->length; - retval->minValue = data->values[0]; - retval->maxValue = data->values[ data->length -1]; + retval->minValue = data->values[0]; + retval->maxValue = data->values[data->length - 1]; /* Now the fun part .. filling in the coefficients. */ - if(data->length==2) + if (data->length == 2) { - retval->parameters[0] = 1.0f/(data->stims[1]-data->stims[0]); + retval->parameters[0] = 1.0f / (data->stims[1] - data->stims[0]); retval->parameters[1] = data->values[0]; - retval->parameters[2] = ( data->values[1] - data->values[0] ); + retval->parameters[2] = (data->values[1] - data->values[0]); retval->parameters[3] = 0; retval->parameters[4] = 0; } @@ -190,75 +190,77 @@ rsr_Interpolator1D * rsr_Interpolator1D_createFromRaw( rsr_Interpolator1D_Raw * { unsigned int i; float * params = retval->parameters; - for(i=0; i< data->length-1; ++i) + for (i = 0; i < data->length - 1; ++i) { - float f0 = data->values[i+0]; - float f1 = data->values[i+1]; + float f0 = data->values[i + 0]; + float f1 = data->values[i + 1]; - params[0] = 1.0f/(retval->stims[i+1]-retval->stims[i+0]); + params[0] = 1.0f / (retval->stims[i + 1] - retval->stims[i + 0]); - if(i==0) + if (i == 0) { - float delta = data->stims[i+1] - data->stims[i]; - float delta2 = (data->stims[i+2] - data->stims[i+1])/delta; - float f2 = data->values[i+2]; - - float dfdx1 = (f2-f0)/(1+delta2); - params[1] = 1.0f * f0 + 0.0f * f1 + 0.0f * dfdx1; - params[2] = -2.0f * f0 + 2.0f * f1 - 1.0f * dfdx1; - params[3] = 1.0f * f0 - 1.0f * f1 + 1.0f * dfdx1; - params[4] = 0.0; + float delta = data->stims[i + 1] - data->stims[i]; + float delta2 = (data->stims[i + 2] - data->stims[i + 1]) / delta; + float f2 = data->values[i + 2]; + + float dfdx1 = (f2 - f0) / (1 + delta2); + params[1] = 1.0f * f0 + 0.0f * f1 + 0.0f * dfdx1; + params[2] = -2.0f * f0 + 2.0f * f1 - 1.0f * dfdx1; + params[3] = 1.0f * f0 - 1.0f * f1 + 1.0f * dfdx1; + params[4] = 0.0; } - else if (i==data->length-2) + else if (i == data->length - 2) { - float delta = data->stims[i+1] - data->stims[i]; - float delta1 = (data->stims[i]-data->stims[i-1])/delta; - float fn1 = data->values[i-1]; - float dfdx0 = (f1-fn1)/(1+delta1); - params[1] = 1.0f * f0 + 0.0f * f1 + 0.0f * dfdx0; - params[2] = 0.0f * f0 + 0.0f * f1 + 1.0f * dfdx0; - params[3] = -1.0f * f0 + 1.0f * f1 - 1.0f * dfdx0; - params[4] = 0.0; + float delta = data->stims[i + 1] - data->stims[i]; + float delta1 = (data->stims[i] - data->stims[i - 1]) / delta; + float fn1 = data->values[i - 1]; + float dfdx0 = (f1 - fn1) / (1 + delta1); + params[1] = 1.0f * f0 + 0.0f * f1 + 0.0f * dfdx0; + params[2] = 0.0f * f0 + 0.0f * f1 + 1.0f * dfdx0; + params[3] = -1.0f * f0 + 1.0f * f1 - 1.0f * dfdx0; + params[4] = 0.0; } else { - float delta = data->stims[i+1] - data->stims[i]; - float fn1=data->values[i-1]; - float delta1 = (data->stims[i] - data->stims[i-1])/delta; + float delta = data->stims[i + 1] - data->stims[i]; + float fn1 = data->values[i - 1]; + float delta1 = (data->stims[i] - data->stims[i - 1]) / delta; - float f2=data->values[i+2]; - float delta2 = (data->stims[i+2] - data->stims[i+1])/delta; + float f2 = data->values[i + 2]; + float delta2 = (data->stims[i + 2] - data->stims[i + 1]) / delta; - float dfdx0 = (f1-fn1)/(1.0f+delta1); - float dfdx1 = (f2-f0)/(1.0f+delta2); + float dfdx0 = (f1 - fn1) / (1.0f + delta1); + float dfdx1 = (f2 - f0) / (1.0f + delta2); params[1] = 1.0f * f0 + 0.0f * dfdx0 + 0.0f * f1 + 0.0f * dfdx1; params[2] = 0.0f * f0 + 1.0f * dfdx0 + 0.0f * f1 + 0.0f * dfdx1; - params[3] =-3.0f * f0 - 2.0f * dfdx0 + 3.0f * f1 - 1.0f * dfdx1; + params[3] = -3.0f * f0 - 2.0f * dfdx0 + 3.0f * f1 - 1.0f * dfdx1; params[4] = 2.0f * f0 + 1.0f * dfdx0 - 2.0f * f1 + 1.0f * dfdx1; } - params+=5; + params += 5; } } return retval; } -rsr_Interpolator1D_Raw * rsr_Interpolator1D_Raw_create( unsigned int prelutLength) +rsr_Interpolator1D_Raw * rsr_Interpolator1D_Raw_create(unsigned int prelutLength) { unsigned int i; - rsr_Interpolator1D_Raw * prelut = (rsr_Interpolator1D_Raw*)malloc( sizeof(rsr_Interpolator1D_Raw) ); // OCIO change: explicit cast - if(prelut==NULL) return NULL; + rsr_Interpolator1D_Raw * prelut = (rsr_Interpolator1D_Raw *)malloc( + sizeof(rsr_Interpolator1D_Raw)); // OCIO change: explicit cast + if (prelut == NULL) + return NULL; - prelut->stims = (float*)malloc( sizeof(float) * prelutLength ); // OCIO change: explicit cast - if(prelut->stims==NULL) + prelut->stims = (float *)malloc(sizeof(float) * prelutLength); // OCIO change: explicit cast + if (prelut->stims == NULL) { free(prelut); return NULL; } - prelut->values = (float*)malloc( sizeof(float) * prelutLength ); // OCIO change: explicit cast - if(prelut->values == NULL) + prelut->values = (float *)malloc(sizeof(float) * prelutLength); // OCIO change: explicit cast + if (prelut->values == NULL) { free(prelut->stims); free(prelut); @@ -267,31 +269,32 @@ rsr_Interpolator1D_Raw * rsr_Interpolator1D_Raw_create( unsigned int prelutLengt prelut->length = prelutLength; - for( i=0; istims[i] = 0.0; + prelut->stims[i] = 0.0; prelut->values[i] = 0.0; } return prelut; } -void rsr_Interpolator1D_Raw_destroy( rsr_Interpolator1D_Raw * prelut ) +void rsr_Interpolator1D_Raw_destroy(rsr_Interpolator1D_Raw * prelut) { - if(prelut==NULL) return; - free( prelut->stims ); - free( prelut->values ); - free( prelut ); + if (prelut == NULL) + return; + free(prelut->stims); + free(prelut->values); + free(prelut); } -} // End unnamed namespace for Interpolators.c +} // namespace namespace { class CachedFileCSP : public CachedFile { public: - CachedFileCSP () + CachedFileCSP() : metadata("none") { } @@ -299,16 +302,15 @@ class CachedFileCSP : public CachedFile std::string metadata; - double prelut_from_min[3] = { 0.0, 0.0, 0.0 }; - double prelut_from_max[3] = { 1.0, 1.0, 1.0 }; + double prelut_from_min[3] = {0.0, 0.0, 0.0}; + double prelut_from_max[3] = {1.0, 1.0, 1.0}; Lut1DOpDataRcPtr prelut; Lut1DOpDataRcPtr lut1D; Lut3DOpDataRcPtr lut3D; }; typedef OCIO_SHARED_PTR CachedFileCSPRcPtr; -inline bool -startswithU(const std::string & str, const std::string & prefix) +inline bool startswithU(const std::string & str, const std::string & prefix) { return StringUtils::StartsWith(StringUtils::Upper(StringUtils::Trim(str)), prefix); } @@ -316,34 +318,32 @@ startswithU(const std::string & str, const std::string & prefix) class LocalFileFormat : public FileFormat { public: - LocalFileFormat() = default; + LocalFileFormat() = default; ~LocalFileFormat() = default; void getFormatInfo(FormatInfoVec & formatInfoVec) const override; - CachedFileRcPtr read(std::istream & istream, - const std::string & fileName, - Interpolation interp) const override; + CachedFileRcPtr read(std::istream & istream, const std::string & fileName, Interpolation interp) + const override; - void bake(const Baker & baker, - const std::string & formatName, - std::ostream & ostream) const override; + void bake(const Baker & baker, const std::string & formatName, std::ostream & ostream) + const override; - void buildFileOps(OpRcPtrVec & ops, - const Config & config, - const ConstContextRcPtr & context, - CachedFileRcPtr untypedCachedFile, - const FileTransform & fileTransform, - TransformDirection dir) const override; + void buildFileOps( + OpRcPtrVec & ops, + const Config & config, + const ConstContextRcPtr & context, + CachedFileRcPtr untypedCachedFile, + const FileTransform & fileTransform, + TransformDirection dir) const override; }; - // Note: Remove this when we don't need to debug. /* template std::ostream& operator<< (std::ostream& os, const std::vector& v) { - copy(v.begin(), v.end(), std::ostream_iterator(std::cout, " ")); + copy(v.begin(), v.end(), std::ostream_iterator(std::cout, " ")); return os; } */ @@ -351,23 +351,25 @@ std::ostream& operator<< (std::ostream& os, const std::vector& v) void LocalFileFormat::getFormatInfo(FormatInfoVec & formatInfoVec) const { FormatInfo info; - info.name = "cinespace"; - info.extension = "csp"; + info.name = "cinespace"; + info.extension = "csp"; info.capabilities = FormatCapabilityFlags(FORMAT_CAPABILITY_READ | FORMAT_CAPABILITY_BAKE); - info.bake_capabilities = FormatBakeFlags(FORMAT_BAKE_CAPABILITY_3DLUT | FORMAT_BAKE_CAPABILITY_1D_3D_LUT); + info.bake_capabilities + = FormatBakeFlags(FORMAT_BAKE_CAPABILITY_3DLUT | FORMAT_BAKE_CAPABILITY_1D_3D_LUT); formatInfoVec.push_back(info); } -CachedFileRcPtr LocalFileFormat::read(std::istream & istream, - const std::string & fileName, - Interpolation interp) const +CachedFileRcPtr LocalFileFormat::read( + std::istream & istream, + const std::string & fileName, + Interpolation interp) const { Lut1DOpDataRcPtr lut1d_ptr; Lut3DOpDataRcPtr lut3d_ptr; // Try and read the LUT header. std::string line; - bool notEmpty = nextline (istream, line); + bool notEmpty = nextline(istream, line); if (!notEmpty) { @@ -386,7 +388,7 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, } // Next line tells us if we are reading a 1D or 3D LUT. - nextline (istream, line); + nextline(istream, line); if (!startswithU(line, "1D") && !startswithU(line, "3D")) { std::ostringstream os; @@ -399,13 +401,12 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, // Read meta data block. std::string metadata; bool lineUpdateNeeded = false; - nextline (istream, line); - if(startswithU(line, "BEGIN METADATA")) + nextline(istream, line); + if (startswithU(line, "BEGIN METADATA")) { - while (!startswithU(line, "END METADATA") || - !istream) + while (!startswithU(line, "END METADATA") || !istream) { - nextline (istream, line); + nextline(istream, line); if (!startswithU(line, "END METADATA")) metadata += line + "\n"; } @@ -415,18 +416,18 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, // Make 3 vectors of prelut inputs + output values. std::vector prelut_in[3]; std::vector prelut_out[3]; - bool useprelut[3] = { false, false, false }; + bool useprelut[3] = {false, false, false}; // Parse the prelut block. for (int c = 0; c < 3; ++c) { // How many points do we have for this channel. if (lineUpdateNeeded) - nextline (istream, line); + nextline(istream, line); int cpoints = 0; - if(!StringToInt(&cpoints, line.c_str()) || cpoints<0) + if (!StringToInt(&cpoints, line.c_str()) || cpoints < 0) { std::ostringstream os; os << "Prelut does not specify valid dimension size on channel '"; @@ -434,18 +435,18 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, throw Exception(os.str().c_str()); } - if(cpoints>=2) + if (cpoints >= 2) { StringUtils::StringVec inputparts, outputparts; - nextline (istream, line); + nextline(istream, line); inputparts = StringUtils::SplitByWhiteSpaces(StringUtils::Trim(line)); - nextline (istream, line); + nextline(istream, line); outputparts = StringUtils::SplitByWhiteSpaces(StringUtils::Trim(line)); - if(static_cast(inputparts.size()) != cpoints || - static_cast(outputparts.size()) != cpoints) + if (static_cast(inputparts.size()) != cpoints + || static_cast(outputparts.size()) != cpoints) { std::ostringstream os; os << "Prelut does not specify the expected number of data points. "; @@ -455,8 +456,8 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, throw Exception(os.str().c_str()); } - if(!StringVecToFloatVec(prelut_in[c], inputparts) || - !StringVecToFloatVec(prelut_out[c], outputparts)) + if (!StringVecToFloatVec(prelut_in[c], inputparts) + || !StringVecToFloatVec(prelut_out[c], outputparts)) { std::ostringstream os; os << "Prelut data is malformed, cannot convert to float array."; @@ -464,9 +465,12 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, throw Exception(os.str().c_str()); } - useprelut[c] = (!VecsEqualWithRelError(&(prelut_in[c][0]), static_cast(prelut_in[c].size()), - &(prelut_out[c][0]), static_cast(prelut_out[c].size()), - 1e-6f)); + useprelut[c] = (!VecsEqualWithRelError( + &(prelut_in[c][0]), + static_cast(prelut_in[c].size()), + &(prelut_out[c][0]), + static_cast(prelut_out[c].size()), + 1e-6f)); } else { @@ -486,7 +490,7 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, if (csptype == "1D") { // How many 1D LUT points do we have. - nextline (istream, line); + nextline(istream, line); int points1D = std::stoi(line.c_str()); if (points1D <= 0) @@ -506,16 +510,15 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, lut1d_ptr->setFileOutputBitDepth(BIT_DEPTH_F32); Array & lutArray = lut1d_ptr->getArray(); - for(int i = 0; i < points1D; ++i) + for (int i = 0; i < points1D; ++i) { // Scan for the three floats. - nextline (istream, line); + nextline(istream, line); const StringUtils::StringVec lineParts = StringUtils::SplitByWhiteSpaces(line); std::vector floatArray; - if (!StringVecToFloatVec(floatArray, lineParts) - || 3 != floatArray.size()) + if (!StringVecToFloatVec(floatArray, lineParts) || 3 != floatArray.size()) { std::ostringstream os; os << "Malformed 1D csp LUT. Each line of LUT values "; @@ -526,24 +529,21 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, } // Store each channel. - lutArray[i*3 + 0] = floatArray[0]; - lutArray[i*3 + 1] = floatArray[1]; - lutArray[i*3 + 2] = floatArray[2]; - + lutArray[i * 3 + 0] = floatArray[0]; + lutArray[i * 3 + 1] = floatArray[1]; + lutArray[i * 3 + 2] = floatArray[2]; } - } else if (csptype == "3D") { // Read the cube size. - nextline (istream, line); + nextline(istream, line); const StringUtils::StringVec lineParts = StringUtils::SplitByWhiteSpaces(line); std::vector cubeSize; - if (!StringVecToIntVec(cubeSize, lineParts) - || 3 != cubeSize.size()) + if (!StringVecToIntVec(cubeSize, lineParts) || 3 != cubeSize.size()) { std::ostringstream os; os << "Malformed 3D csp in LUT file, couldn't read cube size. '"; @@ -585,21 +585,19 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, int g = 0; int b = 0; - for(int i=0; i floatArray; - if (!StringVecToFloatVec(floatArray, lineParts) - || 3 != floatArray.size()) + if (!StringVecToFloatVec(floatArray, lineParts) || 3 != floatArray.size()) { std::ostringstream os; os << "Malformed 3D csp LUT, couldn't read cube row ("; @@ -623,14 +621,13 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, b += 1; } } - } } - CachedFileCSPRcPtr cachedFile = CachedFileCSPRcPtr (new CachedFileCSP ()); - cachedFile->metadata = metadata; + CachedFileCSPRcPtr cachedFile = CachedFileCSPRcPtr(new CachedFileCSP()); + cachedFile->metadata = metadata; - if(useprelut[0] || useprelut[1] || useprelut[2]) + if (useprelut[0] || useprelut[1] || useprelut[2]) { Lut1DOpDataRcPtr prelut_ptr = std::make_shared(NUM_PRELUT_SAMPLES); prelut_ptr->setFileOutputBitDepth(BIT_DEPTH_F32); @@ -638,36 +635,35 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, for (int c = 0; c < 3; ++c) { size_t prelut_numpts = prelut_in[c].size(); - float from_min = prelut_in[c][0]; - float from_max = prelut_in[c][prelut_numpts-1]; + float from_min = prelut_in[c][0]; + float from_max = prelut_in[c][prelut_numpts - 1]; // Allocate the interpolator. - rsr_Interpolator1D_Raw * cprelut_raw = - rsr_Interpolator1D_Raw_create(static_cast(prelut_numpts)); + rsr_Interpolator1D_Raw * cprelut_raw + = rsr_Interpolator1D_Raw_create(static_cast(prelut_numpts)); // Copy our prelut data into the interpolator. - for(size_t i=0; istims[i] = prelut_in[c][i]; + cprelut_raw->stims[i] = prelut_in[c][i]; cprelut_raw->values[i] = prelut_out[c][i]; } // Create interpolater, to resample to simple 1D LUT. - rsr_Interpolator1D * interpolater = - rsr_Interpolator1D_createFromRaw(cprelut_raw); + rsr_Interpolator1D * interpolater = rsr_Interpolator1D_createFromRaw(cprelut_raw); // Resample into 1D LUT. // TODO: Fancy spline analysis to determine required number of samples. cachedFile->prelut_from_min[c] = from_min; cachedFile->prelut_from_max[c] = from_max; - Array & prelutArray = prelut_ptr->getArray(); + Array & prelutArray = prelut_ptr->getArray(); for (int i = 0; i < NUM_PRELUT_SAMPLES; ++i) { - float interpo = float(i) / float(NUM_PRELUT_SAMPLES-1); - float srcval = lerpf(from_min, from_max, interpo); - float newval = rsr_Interpolator1D_interpolate(srcval, interpolater); - prelutArray[i*3 + c] = newval; + float interpo = float(i) / float(NUM_PRELUT_SAMPLES - 1); + float srcval = lerpf(from_min, from_max, interpo); + float newval = rsr_Interpolator1D_interpolate(srcval, interpolater); + prelutArray[i * 3 + c] = newval; } rsr_Interpolator1D_Raw_destroy(cprelut_raw); @@ -678,7 +674,7 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, cachedFile->prelut = prelut_ptr; } - if(csptype == "1D") + if (csptype == "1D") { cachedFile->lut1D = lut1d_ptr; } @@ -691,24 +687,26 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, return cachedFile; } -void LocalFileFormat::bake(const Baker & baker, - const std::string & /*formatName*/, - std::ostream & ostream) const +void LocalFileFormat::bake( + const Baker & baker, + const std::string & /*formatName*/, + std::ostream & ostream) const { - const int DEFAULT_CUBE_SIZE = 32; + const int DEFAULT_CUBE_SIZE = 32; const int DEFAULT_SHAPER_SIZE = 1024; ConstConfigRcPtr config = baker.getConfig(); // TODO: Add 1D/3D LUT writing switch, using hasChannelCrosstalk. int cubeSize = baker.getCubeSize(); - if(cubeSize==-1) cubeSize = DEFAULT_CUBE_SIZE; + if (cubeSize == -1) + cubeSize = DEFAULT_CUBE_SIZE; cubeSize = std::max(2, cubeSize); // smallest cube is 2x2x2 std::vector cubeData; - cubeData.resize(cubeSize*cubeSize*cubeSize*3); + cubeData.resize(cubeSize * cubeSize * cubeSize * 3); GenerateIdentityLut3D(&cubeData[0], cubeSize, 3, LUT3DORDER_FAST_RED); - PackedImageDesc cubeImg(&cubeData[0], cubeSize*cubeSize*cubeSize, 1, 3); + PackedImageDesc cubeImg(&cubeData[0], cubeSize * cubeSize * cubeSize, 1, 3); std::vector shaperInData; std::vector shaperOutData; @@ -717,13 +715,14 @@ void LocalFileFormat::bake(const Baker & baker, // TODO: Use the optional allocation for the shaper space, // instead of the implied 0-1 uniform allocation. std::string shaperSpace = baker.getShaperSpace(); - if(!shaperSpace.empty()) + if (!shaperSpace.empty()) { int shaperSize = baker.getShaperSize(); - if(shaperSize==-1) shaperSize = DEFAULT_SHAPER_SIZE; + if (shaperSize == -1) + shaperSize = DEFAULT_SHAPER_SIZE; - shaperOutData.resize(shaperSize*3); - shaperInData.resize(shaperSize*3); + shaperOutData.resize(shaperSize * 3); + shaperInData.resize(shaperSize * 3); GenerateIdentityLut1D(&shaperOutData[0], shaperSize, 3); GenerateIdentityLut1D(&shaperInData[0], shaperSize, 3); @@ -747,7 +746,7 @@ void LocalFileFormat::bake(const Baker & baker, // numVars may be '0'. int numVars = inputColorSpace->getAllocationNumVars(); - if(numVars>0) + if (numVars > 0) { std::vector vars(numVars); inputColorSpace->getAllocationVars(&vars[0]); @@ -760,22 +759,24 @@ void LocalFileFormat::bake(const Baker & baker, // What size shaper should we make? int shaperSize = baker.getShaperSize(); - if(shaperSize==-1) shaperSize = DEFAULT_SHAPER_SIZE; + if (shaperSize == -1) + shaperSize = DEFAULT_SHAPER_SIZE; shaperSize = std::max(2, shaperSize); - if(inputColorSpace->getAllocation() == ALLOCATION_UNIFORM) + if (inputColorSpace->getAllocation() == ALLOCATION_UNIFORM) { // This is an awesome optimization. // If we know it's a uniform scaling, only 2 points will suffice! shaperSize = 2; } - shaperOutData.resize(shaperSize*3); - shaperInData.resize(shaperSize*3); + shaperOutData.resize(shaperSize * 3); + shaperInData.resize(shaperSize * 3); GenerateIdentityLut1D(&shaperOutData[0], shaperSize, 3); GenerateIdentityLut1D(&shaperInData[0], shaperSize, 3); // Apply the forward to the allocation to the output shaper y axis, and the cube ConstCPUProcessorRcPtr shaperToInput - = config->getProcessor(allocationTransform, TRANSFORM_DIR_INVERSE)->getOptimizedCPUProcessor(OPTIMIZATION_LOSSLESS); + = config->getProcessor(allocationTransform, TRANSFORM_DIR_INVERSE) + ->getOptimizedCPUProcessor(OPTIMIZATION_LOSSLESS); PackedImageDesc shaperInImg(&shaperInData[0], shaperSize, 1, 3); shaperToInput->apply(shaperInImg); @@ -792,7 +793,7 @@ void LocalFileFormat::bake(const Baker & baker, ostream << "\n"; ostream << "BEGIN METADATA\n"; const auto & metadata = baker.getFormatMetadata(); - const auto nb = metadata.getNumChildrenElements(); + const auto nb = metadata.getNumChildrenElements(); for (int i = 0; i < nb; ++i) { const auto & child = metadata.getChildElement(i); @@ -805,27 +806,29 @@ void LocalFileFormat::bake(const Baker & baker, ostream.setf(std::ios::fixed, std::ios::floatfield); ostream.precision(6); - if(shaperOutData.size() != shaperInData.size()) + if (shaperOutData.size() != shaperInData.size()) { throw Exception("Internal shaper size exception."); } - if(!shaperInData.empty()) + if (!shaperInData.empty()) { - for(int c=0; c<3; ++c) + for (int c = 0; c < 3; ++c) { - ostream << shaperInData.size()/3 << "\n"; - for(unsigned int i = 0; i(untypedCachedFile); // This should never happen. - if(!cachedFile || (!cachedFile->prelut && !cachedFile->lut1D && !cachedFile->lut3D)) + if (!cachedFile || (!cachedFile->prelut && !cachedFile->lut1D && !cachedFile->lut3D)) { std::ostringstream os; os << "Cannot build CSP Op. Invalid cache type."; @@ -865,9 +869,9 @@ LocalFileFormat::buildFileOps(OpRcPtrVec & ops, const auto fileInterp = fileTransform.getInterpolation(); bool fileInterpUsed = false; - auto prelut = HandleLUT1D(cachedFile->prelut, fileInterp, fileInterpUsed); - auto lut1D = HandleLUT1D(cachedFile->lut1D, fileInterp, fileInterpUsed); - auto lut3D = HandleLUT3D(cachedFile->lut3D, fileInterp, fileInterpUsed); + auto prelut = HandleLUT1D(cachedFile->prelut, fileInterp, fileInterpUsed); + auto lut1D = HandleLUT1D(cachedFile->lut1D, fileInterp, fileInterpUsed); + auto lut3D = HandleLUT3D(cachedFile->lut3D, fileInterp, fileInterpUsed); if (!fileInterpUsed) { @@ -876,49 +880,51 @@ LocalFileFormat::buildFileOps(OpRcPtrVec & ops, switch (newDir) { - case TRANSFORM_DIR_FORWARD: - { - if (prelut) + case TRANSFORM_DIR_FORWARD: { - CreateMinMaxOp(ops, - cachedFile->prelut_from_min, - cachedFile->prelut_from_max, - newDir); - CreateLut1DOp(ops, prelut, newDir); - } - if (lut1D) - { - CreateLut1DOp(ops, lut1D, newDir); - } - else if (lut3D) - { - CreateLut3DOp(ops, lut3D, newDir); - } - break; - } - case TRANSFORM_DIR_INVERSE: - { - if (lut1D) - { - CreateLut1DOp(ops, lut1D, newDir); - } - else if (lut3D) - { - CreateLut3DOp(ops, lut3D, newDir); + if (prelut) + { + CreateMinMaxOp( + ops, + cachedFile->prelut_from_min, + cachedFile->prelut_from_max, + newDir); + CreateLut1DOp(ops, prelut, newDir); + } + if (lut1D) + { + CreateLut1DOp(ops, lut1D, newDir); + } + else if (lut3D) + { + CreateLut3DOp(ops, lut3D, newDir); + } + break; } - if (prelut) + case TRANSFORM_DIR_INVERSE: { - CreateLut1DOp(ops, prelut, newDir); - CreateMinMaxOp(ops, - cachedFile->prelut_from_min, - cachedFile->prelut_from_max, - newDir); + if (lut1D) + { + CreateLut1DOp(ops, lut1D, newDir); + } + else if (lut3D) + { + CreateLut3DOp(ops, lut3D, newDir); + } + if (prelut) + { + CreateLut1DOp(ops, prelut, newDir); + CreateMinMaxOp( + ops, + cachedFile->prelut_from_min, + cachedFile->prelut_from_max, + newDir); + } + break; } - break; } - } -} } +} // namespace FileFormat * CreateFileFormatCSP() { diff --git a/src/OpenColorIO/fileformats/FileFormatCTF.cpp b/src/OpenColorIO/fileformats/FileFormatCTF.cpp index c9ada57cda..e4a53cd225 100644 --- a/src/OpenColorIO/fileformats/FileFormatCTF.cpp +++ b/src/OpenColorIO/fileformats/FileFormatCTF.cpp @@ -2,34 +2,33 @@ // Copyright Contributors to the OpenColorIO Project. #include -#include #include +#include #include #include #include +#include "BakingUtils.h" +#include "OpBuilders.h" +#include "Platform.h" +#include "TransformBuilder.h" #include "expat.h" -#include "fileformats/ctf/CTFTransform.h" +#include "fileformats/FileFormatUtils.h" #include "fileformats/ctf/CTFReaderHelper.h" #include "fileformats/ctf/CTFReaderUtils.h" -#include "fileformats/FileFormatUtils.h" +#include "fileformats/ctf/CTFTransform.h" #include "fileformats/xmlutils/XMLReaderHelper.h" #include "fileformats/xmlutils/XMLReaderUtils.h" #include "fileformats/xmlutils/XMLWriterUtils.h" #include "ops/lut1d/Lut1DOp.h" #include "ops/lut3d/Lut3DOp.h" -#include "ops/range/RangeOp.h" -#include "BakingUtils.h" -#include "OpBuilders.h" #include "ops/noop/NoOps.h" -#include "Platform.h" -#include "TransformBuilder.h" +#include "ops/range/RangeOp.h" #include "transforms/FileTransform.h" #include "utils/StringUtils.h" - /* This file format reader supports the Academy/ASC Common LUT Format (CLF) and @@ -102,14 +101,11 @@ namespace class LocalCachedFile : public CachedFile { public: - LocalCachedFile () - { - }; - ~LocalCachedFile() {}; + LocalCachedFile(){}; + ~LocalCachedFile(){}; CTFReaderTransformPtr m_transform; std::string m_filePath; - }; typedef OCIO_SHARED_PTR LocalCachedFileRcPtr; @@ -117,62 +113,59 @@ typedef OCIO_SHARED_PTR LocalCachedFileRcPtr; class LocalFileFormat : public FileFormat { public: - ~LocalFileFormat() {} void getFormatInfo(FormatInfoVec & formatInfoVec) const override; - CachedFileRcPtr read(std::istream & istream, - const std::string & fileName, - Interpolation interp) const override; - - void buildFileOps(OpRcPtrVec & ops, - const Config & config, - const ConstContextRcPtr & context, - CachedFileRcPtr untypedCachedFile, - const FileTransform & fileTransform, - TransformDirection dir) const override; - - void bake(const Baker & baker, - const std::string & formatName, - std::ostream & ostream) const override; - - void write(const ConstConfigRcPtr & config, - const ConstContextRcPtr & context, - const GroupTransform & group, - const std::string & formatName, - std::ostream & /*ostream*/) const override; + CachedFileRcPtr read(std::istream & istream, const std::string & fileName, Interpolation interp) + const override; + + void buildFileOps( + OpRcPtrVec & ops, + const Config & config, + const ConstContextRcPtr & context, + CachedFileRcPtr untypedCachedFile, + const FileTransform & fileTransform, + TransformDirection dir) const override; + + void bake(const Baker & baker, const std::string & formatName, std::ostream & ostream) + const override; + + void write( + const ConstConfigRcPtr & config, + const ConstContextRcPtr & context, + const GroupTransform & group, + const std::string & formatName, + std::ostream & /*ostream*/) const override; }; void LocalFileFormat::getFormatInfo(FormatInfoVec & formatInfoVec) const { FormatInfo info; - info.name = FILEFORMAT_CLF; - info.extension = "clf"; - info.capabilities = FormatCapabilityFlags(FORMAT_CAPABILITY_READ | - FORMAT_CAPABILITY_BAKE | - FORMAT_CAPABILITY_WRITE); - info.bake_capabilities = FormatBakeFlags(FORMAT_BAKE_CAPABILITY_3DLUT | - FORMAT_BAKE_CAPABILITY_1DLUT | - FORMAT_BAKE_CAPABILITY_1D_3D_LUT); + info.name = FILEFORMAT_CLF; + info.extension = "clf"; + info.capabilities = FormatCapabilityFlags( + FORMAT_CAPABILITY_READ | FORMAT_CAPABILITY_BAKE | FORMAT_CAPABILITY_WRITE); + info.bake_capabilities = FormatBakeFlags( + FORMAT_BAKE_CAPABILITY_3DLUT | FORMAT_BAKE_CAPABILITY_1DLUT + | FORMAT_BAKE_CAPABILITY_1D_3D_LUT); formatInfoVec.push_back(info); FormatInfo info2; - info2.name = FILEFORMAT_CTF; - info2.extension = "ctf"; - info2.capabilities = FormatCapabilityFlags(FORMAT_CAPABILITY_READ | - FORMAT_CAPABILITY_BAKE | - FORMAT_CAPABILITY_WRITE); - info.bake_capabilities = FormatBakeFlags(FORMAT_BAKE_CAPABILITY_3DLUT | - FORMAT_BAKE_CAPABILITY_1DLUT | - FORMAT_BAKE_CAPABILITY_1D_3D_LUT); + info2.name = FILEFORMAT_CTF; + info2.extension = "ctf"; + info2.capabilities = FormatCapabilityFlags( + FORMAT_CAPABILITY_READ | FORMAT_CAPABILITY_BAKE | FORMAT_CAPABILITY_WRITE); + info.bake_capabilities = FormatBakeFlags( + FORMAT_BAKE_CAPABILITY_3DLUT | FORMAT_BAKE_CAPABILITY_1DLUT + | FORMAT_BAKE_CAPABILITY_1D_3D_LUT); formatInfoVec.push_back(info2); } class XMLParserHelper { public: - XMLParserHelper() = delete; + XMLParserHelper() = delete; XMLParserHelper(const XMLParserHelper &) = delete; explicit XMLParserHelper(const std::string & fileName) @@ -188,10 +181,7 @@ class XMLParserHelper m_isCLF = StringUtils::Lower(extension) == ".clf"; } - ~XMLParserHelper() - { - XML_ParserFree(m_parser); - } + ~XMLParserHelper() { XML_ParserFree(m_parser); } void Parse(std::istream & istream) { @@ -219,29 +209,25 @@ class XMLParserHelper throwMessage(error); } - const CTFReaderTransformPtr& pT = getTransform(); + const CTFReaderTransformPtr & pT = getTransform(); if (pT.use_count() == 0) { - static const std::string error( - "CTF/CLF parsing error: Invalid transform."); + static const std::string error("CTF/CLF parsing error: Invalid transform."); throwMessage(error); } if (pT->getOps().empty()) { - static const std::string error( - "CTF/CLF parsing error: No color operator in file."); + static const std::string error("CTF/CLF parsing error: No color operator in file."); throwMessage(error); } } void Parse(const std::string & buffer, bool lastLine) { - const int done = lastLine?1:0; + const int done = lastLine ? 1 : 0; - if (XML_STATUS_ERROR == XML_Parse(m_parser, - buffer.c_str(), - (int)buffer.size(), done)) + if (XML_STATUS_ERROR == XML_Parse(m_parser, buffer.c_str(), (int)buffer.size(), done)) { XML_Error eXpatErrorCode = XML_GetErrorCode(m_parser); if (eXpatErrorCode == XML_ERROR_TAG_MISMATCH) @@ -270,16 +256,11 @@ class XMLParserHelper throwMessage(error); } } - } - CTFReaderTransformPtr getTransform() - { - return m_transform; - } + CTFReaderTransformPtr getTransform() { return m_transform; } private: - void AddOpReader(CTFReaderOpElt::Type type, const char * xmlTag) { if (m_elms.size() != 1) @@ -299,7 +280,8 @@ class XMLParserHelper ElementRcPtr pElt = m_elms.back(); auto pT = std::dynamic_pointer_cast(pElt); - CTFReaderOpEltRcPtr pOp = CTFReaderOpElt::GetReader(type, pT->getVersion(), pT->isCLF()); + CTFReaderOpEltRcPtr pOp + = CTFReaderOpElt::GetReader(type, pT->getVersion(), pT->isCLF()); if (!pOp) { @@ -333,11 +315,12 @@ class XMLParserHelper } // Determines if the element name is supported in the current context. - static bool SupportedElement(const char * name, - ElementRcPtr & parent, - const char * tag, - const char * parentName, - bool & recognizedName) + static bool SupportedElement( + const char * name, + ElementRcPtr & parent, + const char * tag, + const char * parentName, + bool & recognizedName) { if (name && *name && tag && *tag) { @@ -345,10 +328,8 @@ class XMLParserHelper { recognizedName |= true; - if (!parentName || !strlen(parentName) || - (parent && - 0 == Platform::Strcasecmp(parent->getName().c_str(), - parentName))) + if (!parentName || !strlen(parentName) + || (parent && 0 == Platform::Strcasecmp(parent->getName().c_str(), parentName))) { return true; } @@ -358,17 +339,18 @@ class XMLParserHelper return false; } - static bool SupportedElement(const char * name, - ElementRcPtr & parent, - const std::vector & tags, - const char * parentName, - bool & recognizedName) + static bool SupportedElement( + const char * name, + ElementRcPtr & parent, + const std::vector & tags, + const char * parentName, + bool & recognizedName) { if (name && *name) { const size_t numTags(tags.size()); size_t i = 0; - for (; igetName().c_str(), parentName))) + if (!parentName || !strlen(parentName) + || (parent && 0 == Platform::Strcasecmp(parent->getName().c_str(), parentName))) { return true; } @@ -391,21 +373,22 @@ class XMLParserHelper return false; } - static bool SupportedElement(const char * name, - ElementRcPtr & parent, - const char * tag, - const std::vector & parentNames, - bool & recognizedName) + static bool SupportedElement( + const char * name, + ElementRcPtr & parent, + const char * tag, + const std::vector & parentNames, + bool & recognizedName) { if (name && *name && tag && *tag && parent) { if (0 == Platform::Strcasecmp(name, tag)) { recognizedName |= true; - + const size_t numParents(parentNames.size()); size_t i = 0; - for (; igetName().c_str(), parentNames[i])) { @@ -419,53 +402,37 @@ class XMLParserHelper } // Start the parsing of one element. - static void StartElementHandler(void * userData, - const XML_Char * name, - const XML_Char ** atts) + static void StartElementHandler(void * userData, const XML_Char * name, const XML_Char ** atts) { - static const std::vector rangeSubElements = { - TAG_MIN_IN_VALUE, - TAG_MAX_IN_VALUE, - TAG_MIN_OUT_VALUE, - TAG_MAX_OUT_VALUE - }; - - static const std::vector sopSubElements = { - TAG_SLOPE, - TAG_OFFSET, - TAG_POWER - }; - - static const std::vector gradingPrimarySubElements = { - TAG_PRIMARY_BRIGHTNESS, - TAG_PRIMARY_CLAMP, - TAG_PRIMARY_CONTRAST, - TAG_PRIMARY_EXPOSURE, - TAG_PRIMARY_GAIN, - TAG_PRIMARY_GAMMA, - TAG_PRIMARY_LIFT, - TAG_PRIMARY_OFFSET, - TAG_PRIMARY_PIVOT, - TAG_PRIMARY_SATURATION - }; - - static const std::vector gradingToneSubElements = { - TAG_TONE_BLACKS, - TAG_TONE_SHADOWS, - TAG_TONE_MIDTONES, - TAG_TONE_HIGHLIGHTS, - TAG_TONE_WHITES, - TAG_TONE_SCONTRAST - }; - - static const std::vector gradingRGBCurveSubElements = { - TAG_RGB_CURVE_BLUE, - TAG_RGB_CURVE_GREEN, - TAG_RGB_CURVE_MASTER, - TAG_RGB_CURVE_RED - }; - - XMLParserHelper * pImpl = (XMLParserHelper*)userData; + static const std::vector rangeSubElements + = {TAG_MIN_IN_VALUE, TAG_MAX_IN_VALUE, TAG_MIN_OUT_VALUE, TAG_MAX_OUT_VALUE}; + + static const std::vector sopSubElements = {TAG_SLOPE, TAG_OFFSET, TAG_POWER}; + + static const std::vector gradingPrimarySubElements + = {TAG_PRIMARY_BRIGHTNESS, + TAG_PRIMARY_CLAMP, + TAG_PRIMARY_CONTRAST, + TAG_PRIMARY_EXPOSURE, + TAG_PRIMARY_GAIN, + TAG_PRIMARY_GAMMA, + TAG_PRIMARY_LIFT, + TAG_PRIMARY_OFFSET, + TAG_PRIMARY_PIVOT, + TAG_PRIMARY_SATURATION}; + + static const std::vector gradingToneSubElements + = {TAG_TONE_BLACKS, + TAG_TONE_SHADOWS, + TAG_TONE_MIDTONES, + TAG_TONE_HIGHLIGHTS, + TAG_TONE_WHITES, + TAG_TONE_SCONTRAST}; + + static const std::vector gradingRGBCurveSubElements + = {TAG_RGB_CURVE_BLUE, TAG_RGB_CURVE_GREEN, TAG_RGB_CURVE_MASTER, TAG_RGB_CURVE_RED}; + + XMLParserHelper * pImpl = (XMLParserHelper *)userData; if (!pImpl || !name || !*name) { @@ -488,12 +455,11 @@ class XMLParserHelper if (pMD) { - pImpl->m_elms.push_back( - std::make_shared( - name, - pMD, - pImpl->m_lineNumber, - pImpl->m_fileName)); + pImpl->m_elms.push_back(std::make_shared( + name, + pMD, + pImpl->m_lineNumber, + pImpl->m_fileName)); pImpl->m_elms.back()->start(atts); return; @@ -506,23 +472,22 @@ class XMLParserHelper if (pImpl->m_transform.get()) { ElementRcPtr pElt = pImpl->m_elms.front(); - auto pT = std::dynamic_pointer_cast(pElt); - - pImpl->m_elms.push_back( - std::make_shared( - name, pT, - pImpl->getXmLineNumber(), - pImpl->getXmlFilename(), - "The Transform already exists")); + auto pT = std::dynamic_pointer_cast(pElt); + + pImpl->m_elms.push_back(std::make_shared( + name, + pT, + pImpl->getXmLineNumber(), + pImpl->getXmlFilename(), + "The Transform already exists")); } else { - CTFReaderTransformEltRcPtr pT - = std::make_shared( - name, - pImpl->getXmLineNumber(), - pImpl->getXmlFilename(), - pImpl->isCLF()); + CTFReaderTransformEltRcPtr pT = std::make_shared( + name, + pImpl->getXmLineNumber(), + pImpl->getXmlFilename(), + pImpl->isCLF()); pImpl->m_elms.push_back(pT); pImpl->m_transform = pT->getTransform(); @@ -557,23 +522,31 @@ class XMLParserHelper { pImpl->AddOpReader(CTFReaderOpElt::CDLType, name); } - else if (SupportedElement(name, pElt, TAG_EXPOSURE_CONTRAST, - TAG_PROCESS_LIST, recognizedName)) + else if (SupportedElement( + name, + pElt, + TAG_EXPOSURE_CONTRAST, + TAG_PROCESS_LIST, + recognizedName)) { pImpl->AddOpReader(CTFReaderOpElt::ExposureContrastType, name); } - else if (SupportedElement(name, pElt, TAG_FIXED_FUNCTION, - TAG_PROCESS_LIST, recognizedName)) + else if (SupportedElement( + name, + pElt, + TAG_FIXED_FUNCTION, + TAG_PROCESS_LIST, + recognizedName)) { pImpl->AddOpReader(CTFReaderOpElt::FixedFunctionType, name); } - else if (SupportedElement(name, pElt, TAG_FUNCTION, - TAG_PROCESS_LIST, recognizedName)) + else if (SupportedElement(name, pElt, TAG_FUNCTION, TAG_PROCESS_LIST, recognizedName)) { pImpl->AddOpReader(CTFReaderOpElt::FunctionType, name); } - else if (SupportedElement(name, pElt, TAG_GAMMA, TAG_PROCESS_LIST, recognizedName) || - SupportedElement(name, pElt, TAG_EXPONENT, TAG_PROCESS_LIST, recognizedName)) + else if ( + SupportedElement(name, pElt, TAG_GAMMA, TAG_PROCESS_LIST, recognizedName) + || SupportedElement(name, pElt, TAG_EXPONENT, TAG_PROCESS_LIST, recognizedName)) { pImpl->AddOpReader(CTFReaderOpElt::GammaType, name); } @@ -581,8 +554,7 @@ class XMLParserHelper { pImpl->AddOpReader(CTFReaderOpElt::GradingPrimaryType, name); } - else if (SupportedElement(name, pElt, TAG_RGB_CURVE, - TAG_PROCESS_LIST, recognizedName)) + else if (SupportedElement(name, pElt, TAG_RGB_CURVE, TAG_PROCESS_LIST, recognizedName)) { pImpl->AddOpReader(CTFReaderOpElt::GradingRGBCurveType, name); } @@ -618,8 +590,7 @@ class XMLParserHelper { pImpl->AddOpReader(CTFReaderOpElt::RangeType, name); } - else if (SupportedElement(name, pElt, TAG_REFERENCE, - TAG_PROCESS_LIST, recognizedName)) + else if (SupportedElement(name, pElt, TAG_REFERENCE, TAG_PROCESS_LIST, recognizedName)) { pImpl->AddOpReader(CTFReaderOpElt::ReferenceType, name); } @@ -633,127 +604,139 @@ class XMLParserHelper auto pContainer = std::dynamic_pointer_cast(pElt); if (!pContainer) { - pImpl->m_elms.push_back( - std::make_shared( - name, - pElt, - pImpl->getXmLineNumber(), - pImpl->getXmlFilename(), - nullptr)); + pImpl->m_elms.push_back(std::make_shared( + name, + pElt, + pImpl->getXmLineNumber(), + pImpl->getXmlFilename(), + nullptr)); } - else if (SupportedElement(name, pElt, TAG_ACES_PARAMS, - TAG_ACES, recognizedName)) + else if (SupportedElement(name, pElt, TAG_ACES_PARAMS, TAG_ACES, recognizedName)) { - pImpl->m_elms.push_back( - std::make_shared( - name, - pContainer, - pImpl->getXmLineNumber(), - pImpl->getXmlFilename())); + pImpl->m_elms.push_back(std::make_shared( + name, + pContainer, + pImpl->getXmLineNumber(), + pImpl->getXmlFilename())); } - else if (SupportedElement(name, pElt, TAG_ARRAY, TAG_LUT1D, recognizedName) || - SupportedElement(name, pElt, TAG_ARRAY, TAG_INVLUT1D, recognizedName) || - SupportedElement(name, pElt, TAG_ARRAY, TAG_LUT3D, recognizedName) || - SupportedElement(name, pElt, TAG_ARRAY, TAG_INVLUT3D, recognizedName) || - SupportedElement(name, pElt, TAG_ARRAY, TAG_MATRIX, recognizedName)) + else if ( + SupportedElement(name, pElt, TAG_ARRAY, TAG_LUT1D, recognizedName) + || SupportedElement(name, pElt, TAG_ARRAY, TAG_INVLUT1D, recognizedName) + || SupportedElement(name, pElt, TAG_ARRAY, TAG_LUT3D, recognizedName) + || SupportedElement(name, pElt, TAG_ARRAY, TAG_INVLUT3D, recognizedName) + || SupportedElement(name, pElt, TAG_ARRAY, TAG_MATRIX, recognizedName)) { auto pA = std::dynamic_pointer_cast(pContainer); if (!pA || pA->isCompleted()) { if (!pA) { - pImpl->m_elms.push_back( - std::make_shared( - name, - (pImpl->m_elms.empty() ? 0 : pImpl->m_elms.back()), - pImpl->getXmLineNumber(), - pImpl->getXmlFilename(), - "Array not allowed in this element")); + pImpl->m_elms.push_back(std::make_shared( + name, + (pImpl->m_elms.empty() ? 0 : pImpl->m_elms.back()), + pImpl->getXmLineNumber(), + pImpl->getXmlFilename(), + "Array not allowed in this element")); } else { - pImpl->m_elms.push_back( - std::make_shared( - name, - (pImpl->m_elms.empty() ? 0 : pImpl->m_elms.back()), - pImpl->getXmLineNumber(), - pImpl->getXmlFilename(), - "Only one Array allowed per op")); + pImpl->m_elms.push_back(std::make_shared( + name, + (pImpl->m_elms.empty() ? 0 : pImpl->m_elms.back()), + pImpl->getXmLineNumber(), + pImpl->getXmlFilename(), + "Only one Array allowed per op")); } } else { - pImpl->m_elms.push_back( - std::make_shared( - name, pContainer, - pImpl->getXmLineNumber(), - pImpl->getXmlFilename())); - } - } - else if (SupportedElement(name, pElt, TAG_DESCRIPTION, "", recognizedName) || - SupportedElement(name, pElt, METADATA_INPUT_DESCRIPTION, TAG_CDL, recognizedName) || - SupportedElement(name, pElt, METADATA_VIEWING_DESCRIPTION, TAG_CDL, recognizedName)) - { - pImpl->m_elms.push_back( - std::make_shared( + pImpl->m_elms.push_back(std::make_shared( name, pContainer, pImpl->getXmLineNumber(), pImpl->getXmlFilename())); + } + } + else if ( + SupportedElement(name, pElt, TAG_DESCRIPTION, "", recognizedName) + || SupportedElement( + name, + pElt, + METADATA_INPUT_DESCRIPTION, + TAG_CDL, + recognizedName) + || SupportedElement( + name, + pElt, + METADATA_VIEWING_DESCRIPTION, + TAG_CDL, + recognizedName)) + { + pImpl->m_elms.push_back(std::make_shared( + name, + pContainer, + pImpl->getXmLineNumber(), + pImpl->getXmlFilename())); } // Dynamic Property is valid under any operator parent. First - // test if the tag is supported to set the recognizedName + // test if the tag is supported to set the recognizedName // accordingly, without testing for parents. Test for the // parent type prior to testing the name. - else if (SupportedElement(name, pElt, TAG_DYNAMIC_PARAMETER, - "", recognizedName) && - std::dynamic_pointer_cast(pContainer)) + else if ( + SupportedElement(name, pElt, TAG_DYNAMIC_PARAMETER, "", recognizedName) + && std::dynamic_pointer_cast(pContainer)) { - pImpl->m_elms.push_back( - std::make_shared( - name, - pContainer, - pImpl->getXmLineNumber(), - pImpl->getXmlFilename())); + pImpl->m_elms.push_back(std::make_shared( + name, + pContainer, + pImpl->getXmLineNumber(), + pImpl->getXmlFilename())); } - else if (SupportedElement(name, pElt, TAG_EC_PARAMS, - TAG_EXPOSURE_CONTRAST, recognizedName)) + else if (SupportedElement( + name, + pElt, + TAG_EC_PARAMS, + TAG_EXPOSURE_CONTRAST, + recognizedName)) { - pImpl->m_elms.push_back( - std::make_shared( - name, - pContainer, - pImpl->getXmLineNumber(), - pImpl->getXmlFilename())); + pImpl->m_elms.push_back(std::make_shared( + name, + pContainer, + pImpl->getXmLineNumber(), + pImpl->getXmlFilename())); } - else if (SupportedElement(name, pElt, TAG_GAMMA_PARAMS, TAG_GAMMA, - recognizedName) || - SupportedElement(name, pElt, TAG_EXPONENT_PARAMS, TAG_EXPONENT, - recognizedName)) + else if ( + SupportedElement(name, pElt, TAG_GAMMA_PARAMS, TAG_GAMMA, recognizedName) + || SupportedElement( + name, + pElt, + TAG_EXPONENT_PARAMS, + TAG_EXPONENT, + recognizedName)) { - CTFReaderGammaElt * pGamma = dynamic_cast(pContainer.get()); - pImpl->m_elms.push_back( - pGamma->createGammaParamsElt( - name, - pContainer, - pImpl->getXmLineNumber(), - pImpl->getXmlFilename())); + CTFReaderGammaElt * pGamma + = dynamic_cast(pContainer.get()); + pImpl->m_elms.push_back(pGamma->createGammaParamsElt( + name, + pContainer, + pImpl->getXmLineNumber(), + pImpl->getXmlFilename())); } - else if (SupportedElement(name, pElt, TAG_INDEX_MAP, TAG_LUT1D, recognizedName) || - SupportedElement(name, pElt, TAG_INDEX_MAP, TAG_LUT3D, recognizedName)) + else if ( + SupportedElement(name, pElt, TAG_INDEX_MAP, TAG_LUT1D, recognizedName) + || SupportedElement(name, pElt, TAG_INDEX_MAP, TAG_LUT3D, recognizedName)) { auto pA = std::dynamic_pointer_cast(pContainer); if (!pA || pA->isCompletedIM()) { if (!pA) { - pImpl->m_elms.push_back( - std::make_shared( - name, - (pImpl->m_elms.empty() ? 0 : pImpl->m_elms.back()), - pImpl->getXmLineNumber(), - pImpl->getXmlFilename(), - "IndexMap not allowed in this element")); + pImpl->m_elms.push_back(std::make_shared( + name, + (pImpl->m_elms.empty() ? 0 : pImpl->m_elms.back()), + pImpl->getXmLineNumber(), + pImpl->getXmlFilename(), + "IndexMap not allowed in this element")); } else { @@ -763,88 +746,84 @@ class XMLParserHelper } else { - pImpl->m_elms.push_back( - std::make_shared( - name, pContainer, - pImpl->getXmLineNumber(), - pImpl->getXmlFilename())); - } - - } - else if (SupportedElement(name, pElt, TAG_INFO, - TAG_PROCESS_LIST, recognizedName)) - { - pImpl->m_elms.push_back( - std::make_shared( + pImpl->m_elms.push_back(std::make_shared( name, pContainer, pImpl->getXmLineNumber(), pImpl->getXmlFilename())); + } } - else if (SupportedElement(name, pElt, METADATA_INPUT_DESCRIPTOR, - TAG_PROCESS_LIST, recognizedName)) + else if (SupportedElement(name, pElt, TAG_INFO, TAG_PROCESS_LIST, recognizedName)) { - pImpl->m_elms.push_back( - std::make_shared( - name, - pContainer, - pImpl->getXmLineNumber(), - pImpl->getXmlFilename())); + pImpl->m_elms.push_back(std::make_shared( + name, + pContainer, + pImpl->getXmLineNumber(), + pImpl->getXmlFilename())); } - else if (SupportedElement(name, pElt, TAG_LOG_PARAMS, - TAG_LOG, recognizedName)) + else if (SupportedElement( + name, + pElt, + METADATA_INPUT_DESCRIPTOR, + TAG_PROCESS_LIST, + recognizedName)) { - auto pLog = std::dynamic_pointer_cast(pContainer); + pImpl->m_elms.push_back(std::make_shared( + name, + pContainer, + pImpl->getXmLineNumber(), + pImpl->getXmlFilename())); + } + else if (SupportedElement(name, pElt, TAG_LOG_PARAMS, TAG_LOG, recognizedName)) + { + auto pLog = std::dynamic_pointer_cast(pContainer); const auto style = pLog->getCTFParams().m_style; - if (!(style == LogUtil::LOG_TO_LIN || style == LogUtil::LIN_TO_LOG || - style == LogUtil::CAMERA_LOG_TO_LIN || - style == LogUtil::CAMERA_LIN_TO_LOG)) + if (!(style == LogUtil::LOG_TO_LIN || style == LogUtil::LIN_TO_LOG + || style == LogUtil::CAMERA_LOG_TO_LIN + || style == LogUtil::CAMERA_LIN_TO_LOG)) { - pImpl->m_elms.push_back( - std::make_shared( - name, - (pImpl->m_elms.empty() ? 0 : pImpl->m_elms.back()), - pImpl->getXmLineNumber(), - pImpl->getXmlFilename(), - "Log Params not allowed in this element")); + pImpl->m_elms.push_back(std::make_shared( + name, + (pImpl->m_elms.empty() ? 0 : pImpl->m_elms.back()), + pImpl->getXmLineNumber(), + pImpl->getXmlFilename(), + "Log Params not allowed in this element")); } else { - pImpl->m_elms.push_back( - pLog->createLogParamsElt( - name, - pContainer, - pImpl->getXmLineNumber(), - pImpl->getXmlFilename())); - } - } - else if (SupportedElement(name, pElt, METADATA_OUTPUT_DESCRIPTOR, - TAG_PROCESS_LIST, recognizedName)) - { - pImpl->m_elms.push_back( - std::make_shared( + pImpl->m_elms.push_back(pLog->createLogParamsElt( name, pContainer, pImpl->getXmLineNumber(), pImpl->getXmlFilename())); + } } - else if (SupportedElement(name, pElt, rangeSubElements, - TAG_RANGE, recognizedName)) + else if (SupportedElement( + name, + pElt, + METADATA_OUTPUT_DESCRIPTOR, + TAG_PROCESS_LIST, + recognizedName)) { - pImpl->m_elms.push_back( - std::make_shared( - name, - pContainer, - pImpl->getXmLineNumber(), - pImpl->getXmlFilename())); + pImpl->m_elms.push_back(std::make_shared( + name, + pContainer, + pImpl->getXmLineNumber(), + pImpl->getXmlFilename())); } - else if (SupportedElement(name, pElt, TAG_SATNODE, - TAG_CDL, recognizedName) || - SupportedElement(name, pElt, TAG_SATNODEALT, - TAG_CDL, recognizedName)) + else if (SupportedElement(name, pElt, rangeSubElements, TAG_RANGE, recognizedName)) { - auto pCDL = - std::dynamic_pointer_cast(pContainer); + pImpl->m_elms.push_back(std::make_shared( + name, + pContainer, + pImpl->getXmLineNumber(), + pImpl->getXmlFilename())); + } + else if ( + SupportedElement(name, pElt, TAG_SATNODE, TAG_CDL, recognizedName) + || SupportedElement(name, pElt, TAG_SATNODEALT, TAG_CDL, recognizedName)) + { + auto pCDL = std::dynamic_pointer_cast(pContainer); auto satNodeElt = std::make_shared( name, @@ -853,21 +832,17 @@ class XMLParserHelper pImpl->getXmlFilename()); pImpl->m_elms.push_back(satNodeElt); } - else if (SupportedElement(name, pElt, TAG_SATURATION, - TAG_SATNODE, recognizedName)) + else if (SupportedElement(name, pElt, TAG_SATURATION, TAG_SATNODE, recognizedName)) { - pImpl->m_elms.push_back( - std::make_shared( - name, - pContainer, - pImpl->getXmLineNumber(), - pImpl->getXmlFilename())); + pImpl->m_elms.push_back(std::make_shared( + name, + pContainer, + pImpl->getXmLineNumber(), + pImpl->getXmlFilename())); } - else if (SupportedElement(name, pElt, TAG_SOPNODE, - TAG_CDL, recognizedName)) + else if (SupportedElement(name, pElt, TAG_SOPNODE, TAG_CDL, recognizedName)) { - auto pCDL = - std::dynamic_pointer_cast(pContainer); + auto pCDL = std::dynamic_pointer_cast(pContainer); auto sopNodeElt = std::make_shared( name, @@ -876,65 +851,78 @@ class XMLParserHelper pImpl->getXmlFilename()); pImpl->m_elms.push_back(sopNodeElt); } - else if (SupportedElement(name, pElt, sopSubElements, - TAG_SOPNODE, recognizedName)) + else if (SupportedElement(name, pElt, sopSubElements, TAG_SOPNODE, recognizedName)) { - pImpl->m_elms.push_back( - std::make_shared( - name, - pContainer, - pImpl->getXmLineNumber(), - pImpl->getXmlFilename())); + pImpl->m_elms.push_back(std::make_shared( + name, + pContainer, + pImpl->getXmLineNumber(), + pImpl->getXmlFilename())); } - else if (SupportedElement(name, pElt, gradingPrimarySubElements, - TAG_PRIMARY, recognizedName)) + else if (SupportedElement( + name, + pElt, + gradingPrimarySubElements, + TAG_PRIMARY, + recognizedName)) { - pImpl->m_elms.push_back( - std::make_shared( - name, - pContainer, - pImpl->getXmLineNumber(), - pImpl->getXmlFilename())); + pImpl->m_elms.push_back(std::make_shared( + name, + pContainer, + pImpl->getXmLineNumber(), + pImpl->getXmlFilename())); } - else if (SupportedElement(name, pElt, gradingRGBCurveSubElements, - TAG_RGB_CURVE, recognizedName)) + else if (SupportedElement( + name, + pElt, + gradingRGBCurveSubElements, + TAG_RGB_CURVE, + recognizedName)) { - pImpl->m_elms.push_back( - std::make_shared( - name, - pContainer, - pImpl->getXmLineNumber(), - pImpl->getXmlFilename())); + pImpl->m_elms.push_back(std::make_shared( + name, + pContainer, + pImpl->getXmLineNumber(), + pImpl->getXmlFilename())); } - else if (SupportedElement(name, pElt, TAG_CURVE_CTRL_PNTS, - gradingRGBCurveSubElements, recognizedName)) + else if (SupportedElement( + name, + pElt, + TAG_CURVE_CTRL_PNTS, + gradingRGBCurveSubElements, + recognizedName)) { - pImpl->m_elms.push_back( - std::make_shared( - name, - pContainer, - pImpl->getXmLineNumber(), - pImpl->getXmlFilename())); + pImpl->m_elms.push_back(std::make_shared( + name, + pContainer, + pImpl->getXmLineNumber(), + pImpl->getXmlFilename())); } - else if (SupportedElement(name, pElt, TAG_CURVE_SLOPES, - gradingRGBCurveSubElements, recognizedName)) + else if (SupportedElement( + name, + pElt, + TAG_CURVE_SLOPES, + gradingRGBCurveSubElements, + recognizedName)) { - pImpl->m_elms.push_back( - std::make_shared( - name, - pContainer, - pImpl->getXmLineNumber(), - pImpl->getXmlFilename())); + pImpl->m_elms.push_back(std::make_shared( + name, + pContainer, + pImpl->getXmLineNumber(), + pImpl->getXmlFilename())); } - else if (SupportedElement(name, pElt, gradingToneSubElements, - TAG_TONE, recognizedName)) + else if (SupportedElement( + name, + pElt, + gradingToneSubElements, + TAG_TONE, + recognizedName)) { - pImpl->m_elms.push_back( - std::make_shared( - name, - pContainer, - pImpl->getXmLineNumber(), - pImpl->getXmlFilename())); + pImpl->m_elms.push_back(std::make_shared( + name, + pContainer, + pImpl->getXmLineNumber(), + pImpl->getXmlFilename())); } else { @@ -943,23 +931,21 @@ class XMLParserHelper std::ostringstream oss; oss << "'" << name << "' not allowed in this element"; - pImpl->m_elms.push_back( - std::make_shared( - name, - (pImpl->m_elms.empty() ? 0 : pImpl->m_elms.back()), - pImpl->getXmLineNumber(), - pImpl->getXmlFilename(), - oss.str().c_str())); + pImpl->m_elms.push_back(std::make_shared( + name, + (pImpl->m_elms.empty() ? 0 : pImpl->m_elms.back()), + pImpl->getXmLineNumber(), + pImpl->getXmlFilename(), + oss.str().c_str())); } else { - pImpl->m_elms.push_back( - std::make_shared( - name, - (pImpl->m_elms.empty() ? 0 : pImpl->m_elms.back()), - pImpl->getXmLineNumber(), - pImpl->getXmlFilename(), - "Unknown element")); + pImpl->m_elms.push_back(std::make_shared( + name, + (pImpl->m_elms.empty() ? 0 : pImpl->m_elms.back()), + pImpl->getXmLineNumber(), + pImpl->getXmlFilename(), + "Unknown element")); } } } @@ -969,10 +955,9 @@ class XMLParserHelper } // End the parsing of one element. - static void EndElementHandler(void * userData, - const XML_Char * name) + static void EndElementHandler(void * userData, const XML_Char * name) { - XMLParserHelper * pImpl = (XMLParserHelper*)userData; + XMLParserHelper * pImpl = (XMLParserHelper *)userData; if (!pImpl || !name || !*name) { throw Exception("CTF/CLF internal parsing error."); @@ -1021,8 +1006,7 @@ class XMLParserHelper auto pParent = pImpl->m_elms.back(); // Is it at the right location in the stack? - if (!pParent || !pParent->isContainer() || - pParent != pPlainElt->getParent()) + if (!pParent || !pParent->isContainer() || pParent != pPlainElt->getParent()) { std::stringstream ss; ss << "CTF/CLF parsing error: Tag '"; @@ -1036,23 +1020,23 @@ class XMLParserHelper } // Handle of strings within an element. - static void CharacterDataHandler(void * userData, - const XML_Char * s, - int len) + static void CharacterDataHandler(void * userData, const XML_Char * s, int len) { - XMLParserHelper * pImpl = (XMLParserHelper*)userData; + XMLParserHelper * pImpl = (XMLParserHelper *)userData; if (!pImpl) { throw Exception("CTF/CLF internal parsing error."); } - if (len == 0) return; - if (len<0 || !s || !*s) + if (len == 0) + return; + if (len < 0 || !s || !*s) { pImpl->throwMessage("CTF/CLF parsing error: attribute illegal. "); } // Parsing a single new line. This is valid. - if (len == 1 && s[0] == '\n') return; + if (len == 1 && s[0] == '\n') + return; auto pElt = pImpl->m_elms.back(); if (!pElt) @@ -1064,8 +1048,7 @@ class XMLParserHelper pImpl->throwMessage(oss.str()); } - auto pDescriptionElt = - std::dynamic_pointer_cast(pElt); + auto pDescriptionElt = std::dynamic_pointer_cast(pElt); if (pDescriptionElt) { pDescriptionElt->setRawData(s, len, pImpl->getXmLineNumber()); @@ -1074,20 +1057,18 @@ class XMLParserHelper { // Strip white spaces. size_t start = 0; - size_t end = len; + size_t end = len; FindSubString(s, len, start, end); - if (end>0) + if (end > 0) { // CTFReaderMetadataElt is a special element: it is used // to process container elements, but it is also used to // process the terminal/plain elements. - auto pMetadataElt = - std::dynamic_pointer_cast(pElt); + auto pMetadataElt = std::dynamic_pointer_cast(pElt); if (pMetadataElt) { - pMetadataElt->setRawData(s + start, end - start, - pImpl->getXmLineNumber()); + pMetadataElt->setRawData(s + start, end - start, pImpl->getXmLineNumber()); } else { @@ -1100,8 +1081,7 @@ class XMLParserHelper pImpl->throwMessage(oss.str()); } - auto pPlainElt = - std::dynamic_pointer_cast(pElt); + auto pPlainElt = std::dynamic_pointer_cast(pElt); if (!pPlainElt) { std::ostringstream oss; @@ -1110,27 +1090,17 @@ class XMLParserHelper oss << "'."; pImpl->throwMessage(oss.str()); } - pPlainElt->setRawData(s + start, end - start, - pImpl->getXmLineNumber()); + pPlainElt->setRawData(s + start, end - start, pImpl->getXmLineNumber()); } } } } - unsigned int getXmLineNumber() const - { - return m_lineNumber; - } + unsigned int getXmLineNumber() const { return m_lineNumber; } - const std::string & getXmlFilename() const - { - return m_fileName; - } + const std::string & getXmlFilename() const { return m_fileName; } - bool isCLF() const - { - return m_isCLF; - } + bool isCLF() const { return m_isCLF; } XML_Parser m_parser; unsigned int m_lineNumber; @@ -1138,7 +1108,6 @@ class XMLParserHelper bool m_isCLF; XmlReaderElementStack m_elms; // Parsing stack CTFReaderTransformPtr m_transform; - }; bool isLoadableCTF(std::istream & istream) @@ -1146,8 +1115,8 @@ bool isLoadableCTF(std::istream & istream) std::streampos curPos = istream.tellg(); const unsigned limit(5 * 1024); // 5 kilobytes. - const char *pattern = "m_transform = parser.getTransform(); - cachedFile->m_filePath = filePath; + cachedFile->m_filePath = filePath; return cachedFile; } // Helper called by LocalFileFormat::buildFileOps -void BuildOp(OpRcPtrVec & ops, - const Config& config, - const ConstContextRcPtr & context, - const ConstOpDataRcPtr & opData, - TransformDirection dir) +void BuildOp( + OpRcPtrVec & ops, + const Config & config, + const ConstContextRcPtr & context, + const ConstOpDataRcPtr & opData, + TransformDirection dir) { if (opData->getType() == OpData::ReferenceType) { @@ -1206,7 +1178,7 @@ void BuildOp(OpRcPtrVec & ops, ConstReferenceOpDataRcPtr ref = DynamicPtrCast(opData); if (ref->getReferenceStyle() == REF_PATH) { - dir = CombineTransformDirections(dir, ref->getDirection()); + dir = CombineTransformDirections(dir, ref->getDirection()); FileTransformRcPtr fileTransform = FileTransform::Create(); fileTransform->setInterpolation(INTERP_DEFAULT); fileTransform->setDirection(TRANSFORM_DIR_FORWARD); @@ -1223,23 +1195,21 @@ void BuildOp(OpRcPtrVec & ops, { CreateOpVecFromOpData(ops, opData, dir); } - } // CLF/CTF is different from other formats because the syntax allows specifying an interpolation // method in the file itself. If a LUT does specify an interpolation, use it. If it does not // (cached LUT interpolation is DEFAULT), then use the FileTransform interpolation if it is valid. template -void HandleLUTInterpolation(ConstOpDataRcPtr & opData, - Interpolation fileInterp) +void HandleLUTInterpolation(ConstOpDataRcPtr & opData, Interpolation fileInterp) { auto lut = OCIO_DYNAMIC_POINTER_CAST(opData); if (Lut::IsValidInterpolation(fileInterp)) { const auto lutInterpolation = lut->getInterpolation(); - if (lutInterpolation == INTERP_DEFAULT && - Lut::GetConcreteInterpolation(lutInterpolation) != - Lut::GetConcreteInterpolation(fileInterp)) + if (lutInterpolation == INTERP_DEFAULT + && Lut::GetConcreteInterpolation(lutInterpolation) + != Lut::GetConcreteInterpolation(fileInterp)) { // The FileTransform interpolation does not match the cached file LUT interpolation, // so clone the LUT. @@ -1263,17 +1233,18 @@ void HandleLUT(ConstOpDataRcPtr & opData, Interpolation fileInterp) } } -void LocalFileFormat::buildFileOps(OpRcPtrVec & ops, - const Config& config, - const ConstContextRcPtr & context, - CachedFileRcPtr untypedCachedFile, - const FileTransform& fileTransform, - TransformDirection dir) const +void LocalFileFormat::buildFileOps( + OpRcPtrVec & ops, + const Config & config, + const ConstContextRcPtr & context, + CachedFileRcPtr untypedCachedFile, + const FileTransform & fileTransform, + TransformDirection dir) const { LocalCachedFileRcPtr cachedFile = DynamicPtrCast(untypedCachedFile); // This should never happen. - if(!cachedFile) + if (!cachedFile) { throw Exception("Cannot build clf ops. Invalid cache type."); } @@ -1295,26 +1266,26 @@ void LocalFileFormat::buildFileOps(OpRcPtrVec & ops, switch (newDir) { - case TRANSFORM_DIR_FORWARD: - { - for (auto opData : opDataVec) + case TRANSFORM_DIR_FORWARD: { - // Note: HandleLUT does nothing if opData is not a LUT. - HandleLUT(opData, fileInterpolation); - BuildOp(ops, config, context, opData, newDir); + for (auto opData : opDataVec) + { + // Note: HandleLUT does nothing if opData is not a LUT. + HandleLUT(opData, fileInterpolation); + BuildOp(ops, config, context, opData, newDir); + } + break; } - break; - } - case TRANSFORM_DIR_INVERSE: - { - for (int idx = (int)opDataVec.size() - 1; idx >= 0; --idx) + case TRANSFORM_DIR_INVERSE: { - auto opData = opDataVec[idx]; - HandleLUT(opData, fileInterpolation); - BuildOp(ops, config, context, opData, newDir); + for (int idx = (int)opDataVec.size() - 1; idx >= 0; --idx) + { + auto opData = opDataVec[idx]; + HandleLUT(opData, fileInterpolation); + BuildOp(ops, config, context, opData, newDir); + } + break; } - break; - } } } @@ -1324,9 +1295,10 @@ void LocalFileFormat::buildFileOps(OpRcPtrVec & ops, // TODO: The CLF format is more powerful than those older formats and there is // no need to be limited to a Lut1D + Lut3D structure -- more ops could be used // when necessary for a more accurate bake. -void LocalFileFormat::bake(const Baker & baker, - const std::string & formatName, - std::ostream & ostream) const +void LocalFileFormat::bake( + const Baker & baker, + const std::string & formatName, + std::ostream & ostream) const { static constexpr int DEFAULT_1D_SIZE = 4096; static constexpr int DEFAULT_3D_SIZE = 64; @@ -1367,8 +1339,8 @@ void LocalFileFormat::bake(const Baker & baker, // Determine required LUT type. // - constexpr int CTF_1D = 1; // 1D LUT version number - constexpr int CTF_3D = 2; // 3D LUT version number + constexpr int CTF_1D = 1; // 1D LUT version number + constexpr int CTF_3D = 2; // 3D LUT version number constexpr int CTF_1D_3D = 3; // 3D LUT with 1D prelut int required_lut = -1; @@ -1406,7 +1378,7 @@ void LocalFileFormat::bake(const Baker & baker, Lut1DOpDataRcPtr shaperLut; float fromInStart = 0.0f; - float fromInEnd = 1.0f; + float fromInEnd = 1.0f; if (required_lut == CTF_1D_3D) { @@ -1415,8 +1387,8 @@ void LocalFileFormat::bake(const Baker & baker, { // Generate the identity shaper values, then apply the transform. // Using a half-domain to accurately handle floating-point, linear-space inputs. - shaperLut = std::make_shared(Lut1DOpData::LUT_INPUT_HALF_CODE, - 65536, true); + shaperLut + = std::make_shared(Lut1DOpData::LUT_INPUT_HALF_CODE, 65536, true); } else { @@ -1428,11 +1400,14 @@ void LocalFileFormat::bake(const Baker & baker, { GenerateLinearScaleLut1D( shaperLut->getArray().getValues().data(), - shaperSizeRequest, 3, fromInStart, fromInEnd); + shaperSizeRequest, + 3, + fromInStart, + fromInEnd); } } const auto shaperSize = shaperLut->getArray().getLength(); - PackedImageDesc shaperImg(shaperLut->getArray().getValues().data(),shaperSize, 1, 3); + PackedImageDesc shaperImg(shaperLut->getArray().getValues().data(), shaperSize, 1, 3); ConstCPUProcessorRcPtr inputToShaper = GetInputToShaperProcessor(baker); inputToShaper->apply(shaperImg); } @@ -1444,9 +1419,9 @@ void LocalFileFormat::bake(const Baker & baker, std::vector cubeData; if (required_lut == CTF_3D || required_lut == CTF_1D_3D) { - cubeData.resize(cubeSize*cubeSize*cubeSize * 3); + cubeData.resize(cubeSize * cubeSize * cubeSize * 3); GenerateIdentityLut3D(&cubeData[0], cubeSize, 3, LUT3DORDER_FAST_BLUE); - PackedImageDesc cubeImg(&cubeData[0], cubeSize*cubeSize*cubeSize, 1, 3); + PackedImageDesc cubeImg(&cubeData[0], cubeSize * cubeSize * cubeSize, 1, 3); ConstCPUProcessorRcPtr cubeProc; if (required_lut == CTF_1D_3D) @@ -1467,7 +1442,7 @@ void LocalFileFormat::bake(const Baker & baker, std::vector onedData; - if(required_lut == CTF_1D) + if (required_lut == CTF_1D) { onedData.resize(onedSize * 3); @@ -1498,7 +1473,7 @@ void LocalFileFormat::bake(const Baker & baker, { CreateRangeOp(ops, fromInStart, fromInEnd, 0, 1, TRANSFORM_DIR_FORWARD); } - Lut1DOpDataRcPtr lut1D = std::make_shared((unsigned long)onedSize); + Lut1DOpDataRcPtr lut1D = std::make_shared((unsigned long)onedSize); lut1D->getArray().getValues() = onedData; CreateLut1DOp(ops, lut1D, TRANSFORM_DIR_FORWARD); } @@ -1514,7 +1489,7 @@ void LocalFileFormat::bake(const Baker & baker, // 3D data. if (required_lut == CTF_3D || required_lut == CTF_1D_3D) { - Lut3DOpDataRcPtr lut3D = std::make_shared((unsigned long)cubeSize); + Lut3DOpDataRcPtr lut3D = std::make_shared((unsigned long)cubeSize); lut3D->getArray().getValues() = cubeData; CreateLut3DOp(ops, lut3D, TRANSFORM_DIR_FORWARD); } @@ -1525,16 +1500,17 @@ void LocalFileFormat::bake(const Baker & baker, { CreateTransform(group, op); } - const auto & metadata = baker.getFormatMetadata(); + const auto & metadata = baker.getFormatMetadata(); group->getFormatMetadata() = metadata; write(config, config->getCurrentContext(), *group, formatName, ostream); } -void LocalFileFormat::write(const ConstConfigRcPtr & config, - const ConstContextRcPtr & context, - const GroupTransform & group, - const std::string & formatName, - std::ostream & ostream) const +void LocalFileFormat::write( + const ConstConfigRcPtr & config, + const ConstContextRcPtr & context, + const GroupTransform & group, + const std::string & formatName, + std::ostream & ostream) const { bool isCLF = false; if (Platform::Strcasecmp(formatName.c_str(), FILEFORMAT_CLF) == 0) @@ -1559,7 +1535,7 @@ void LocalFileFormat::write(const ConstConfigRcPtr & config, ops.optimize(OPTIMIZATION_NONE); const FormatMetadataImpl & metadata = group.getFormatMetadata(); - CTFReaderTransformPtr transform = std::make_shared(ops, metadata); + CTFReaderTransformPtr transform = std::make_shared(ops, metadata); // Write XML Header. ostream << "" << std::endl; @@ -1576,5 +1552,4 @@ FileFormat * CreateFileFormatCLF() return new LocalFileFormat(); } - } // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/fileformats/FileFormatDiscreet1DL.cpp b/src/OpenColorIO/fileformats/FileFormatDiscreet1DL.cpp old mode 100755 new mode 100644 index 6a76d968d4..feb9659d69 --- a/src/OpenColorIO/fileformats/FileFormatDiscreet1DL.cpp +++ b/src/OpenColorIO/fileformats/FileFormatDiscreet1DL.cpp @@ -5,24 +5,23 @@ #include #include #include -#include #include +#include #include #include #include "BitDepthUtils.h" -#include "fileformats/FileFormatUtils.h" #include "MathUtils.h" -#include "ops/lut1d/Lut1DOp.h" -#include "ops/lut3d/Lut3DOp.h" #include "ParseUtils.h" #include "Platform.h" +#include "fileformats/FileFormatUtils.h" +#include "ops/lut1d/Lut1DOp.h" +#include "ops/lut3d/Lut3DOp.h" #include "transforms/FileTransform.h" #include "utils/StringUtils.h" - // This format is a 1D LUT format that was used by the Discreet (now Autodesk) // creative finishing products such as Flame and Smoke. // This format is now deprecated (but still supported) in those products. @@ -35,7 +34,7 @@ namespace void ReplaceTabsAndStripSpaces(char * stringToStrip) { - short source = -1; + short source = -1; short destination = 0; if (*stringToStrip) @@ -57,14 +56,16 @@ void ReplaceTabsAndStripSpaces(char * stringToStrip) source = -1; - // Find First Non Blank - while (stringToStrip[++source] == ' ') {} + // Find First Non Blank + while (stringToStrip[++source] == ' ') + { + } if (destination != source) { - // Copy - while ((stringToStrip[destination++] - = stringToStrip[source++])) { + // Copy + while ((stringToStrip[destination++] = stringToStrip[source++])) + { } } } @@ -90,59 +91,65 @@ class Lut1dUtils // this enumerator is mapped onto the values defined // in IM_BitsPerChannel // - typedef enum { + typedef enum + { IM_LUT_UNKNOWN_BITS_PERCHANNEL = 0, - IM_LUT_8BITS_PERCHANNEL = 8, - IM_LUT_10BITS_PERCHANNEL = 10, - IM_LUT_12BITS_PERCHANNEL = 12, - IM_LUT_16BITS_PERCHANNEL = 16, - IM_LUT_HALFBITS_PERCHANNEL = -16, - IM_LUT_FLOATBITS_PERCHANNEL = -32 + IM_LUT_8BITS_PERCHANNEL = 8, + IM_LUT_10BITS_PERCHANNEL = 10, + IM_LUT_12BITS_PERCHANNEL = 12, + IM_LUT_16BITS_PERCHANNEL = 16, + IM_LUT_HALFBITS_PERCHANNEL = -16, + IM_LUT_FLOATBITS_PERCHANNEL = -32 } IM_LutBitsPerChannel; - static BitDepth GetBitDepth(IM_LutBitsPerChannel discreetBitDepth) { switch (discreetBitDepth) { - case IM_LUT_UNKNOWN_BITS_PERCHANNEL: - return BIT_DEPTH_UNKNOWN; - case IM_LUT_8BITS_PERCHANNEL: - return BIT_DEPTH_UINT8; - case IM_LUT_10BITS_PERCHANNEL: - return BIT_DEPTH_UINT10; - case IM_LUT_12BITS_PERCHANNEL: - return BIT_DEPTH_UINT12; - case IM_LUT_16BITS_PERCHANNEL: - return BIT_DEPTH_UINT16; - case IM_LUT_HALFBITS_PERCHANNEL: - return BIT_DEPTH_F16; - case IM_LUT_FLOATBITS_PERCHANNEL: - return BIT_DEPTH_F32; + case IM_LUT_UNKNOWN_BITS_PERCHANNEL: + return BIT_DEPTH_UNKNOWN; + case IM_LUT_8BITS_PERCHANNEL: + return BIT_DEPTH_UINT8; + case IM_LUT_10BITS_PERCHANNEL: + return BIT_DEPTH_UINT10; + case IM_LUT_12BITS_PERCHANNEL: + return BIT_DEPTH_UINT12; + case IM_LUT_16BITS_PERCHANNEL: + return BIT_DEPTH_UINT16; + case IM_LUT_HALFBITS_PERCHANNEL: + return BIT_DEPTH_F16; + case IM_LUT_FLOATBITS_PERCHANNEL: + return BIT_DEPTH_F32; } return BIT_DEPTH_UNKNOWN; } - // A look-up table descriptor: - class IMLutStruct { + // A look-up table descriptor: + class IMLutStruct + { public: int numtables; // Number of tables. - int length; // Length of each table. + int length; // Length of each table. IM_LutBitsPerChannel srcBitDepth; - IM_LutBitsPerChannel targetBitDepth; // Hint if this is a resizing LUT - unsigned short ** tables; // Points to an array of "numtables" - // pointers to tables of length "length". + IM_LutBitsPerChannel targetBitDepth; // Hint if this is a resizing LUT + unsigned short ** tables; // Points to an array of "numtables" + // pointers to tables of length "length". - IMLutStruct() : numtables(0), tables(0) {} - IMLutStruct(const IMLutStruct &) = delete; - IMLutStruct& operator=(const IMLutStruct &) = delete; + IMLutStruct() + : numtables(0) + , tables(0) + { + } + IMLutStruct(const IMLutStruct &) = delete; + IMLutStruct & operator=(const IMLutStruct &) = delete; ~IMLutStruct(); }; - // Image LUT library return codes: - enum { + // Image LUT library return codes: + enum + { IMLUT_OK = 0, IMLUT_ERR_UNEXPECTED_EOF, IMLUT_ERR_CANNOT_OPEN, @@ -151,17 +158,16 @@ class Lut1dUtils }; // Convert between table size and bit depth - static IM_LutBitsPerChannel IMLutTableSizeToBitDepth(int tableSize, - bool isFloat = false); + static IM_LutBitsPerChannel IMLutTableSizeToBitDepth(int tableSize, bool isFloat = false); // Supply appropriate message string given IMLUT_ERR code. static const char * IMLutErrorStr(int errnum); // Free an image look-up table descriptor. - static void IMLutFree(IMLutStruct **lut); + static void IMLutFree(IMLutStruct ** lut); // Allocate memory for an image look-up table descriptor. - static bool IMLutAlloc(IMLutStruct **plut, int num, int length); + static bool IMLutAlloc(IMLutStruct ** plut, int num, int length); // Attempt to open and read a file as an image look-up table. // If successful, allocate and return a "LUT", a look-up table @@ -170,7 +176,9 @@ class Lut1dUtils static int IMLutGet( std::istream & istream, const std::string & fileName, - IMLutStruct **lut, int & line, std::string & errorLine); + IMLutStruct ** lut, + int & line, + std::string & errorLine); // Determines the bitdepth of a LUT given it's filename Searches for // the first occurrence of the "to" sequence of characters in the @@ -181,30 +189,26 @@ class Lut1dUtils // Get maximum value in the table based on the bit depth static float GetMax(IM_LutBitsPerChannel lutBitDepth); - }; - -Lut1dUtils::IM_LutBitsPerChannel Lut1dUtils::IMLutTableSizeToBitDepth( - int tableSize, - bool isFloat) +Lut1dUtils::IM_LutBitsPerChannel Lut1dUtils::IMLutTableSizeToBitDepth(int tableSize, bool isFloat) { switch (tableSize) { - case (256): - return IM_LUT_8BITS_PERCHANNEL; + case (256): + return IM_LUT_8BITS_PERCHANNEL; - case (1024): - return IM_LUT_10BITS_PERCHANNEL; + case (1024): + return IM_LUT_10BITS_PERCHANNEL; - case (4096): - return IM_LUT_12BITS_PERCHANNEL; + case (4096): + return IM_LUT_12BITS_PERCHANNEL; - case (65536): - return isFloat ? IM_LUT_HALFBITS_PERCHANNEL : IM_LUT_16BITS_PERCHANNEL; + case (65536): + return isFloat ? IM_LUT_HALFBITS_PERCHANNEL : IM_LUT_16BITS_PERCHANNEL; - default: - return IM_LUT_UNKNOWN_BITS_PERCHANNEL; + default: + return IM_LUT_UNKNOWN_BITS_PERCHANNEL; } } @@ -239,9 +243,10 @@ Lut1dUtils::IMLutStruct::~IMLutStruct() } } -void Lut1dUtils::IMLutFree(IMLutStruct **lut) +void Lut1dUtils::IMLutFree(IMLutStruct ** lut) { - if (*lut) { + if (*lut) + { delete *lut; *lut = NULL; } @@ -251,10 +256,10 @@ void Lut1dUtils::IMLutFree(IMLutStruct **lut) // If successful, return TRUE. // NOTE: // *plut must be NULL when this routine is called! -bool Lut1dUtils::IMLutAlloc(IMLutStruct **plut, int num, int length) +bool Lut1dUtils::IMLutAlloc(IMLutStruct ** plut, int num, int length) { int i; - IMLutStruct *lut; + IMLutStruct * lut; if (num < 0 || length < 0) return false; @@ -262,15 +267,15 @@ bool Lut1dUtils::IMLutAlloc(IMLutStruct **plut, int num, int length) lut = new IMLutStruct; if (lut == NULL) return false; - lut->tables = NULL; + lut->tables = NULL; lut->numtables = num; - lut->length = length; + lut->length = length; // On import, we never supported LUTs with 16bit integer input. // (16bit integer input was interpreted as 12bit.) // On export, 16bit input is necessarily float. const bool src16bitDepthIsFloat = true; - lut->srcBitDepth = IMLutTableSizeToBitDepth(length, src16bitDepthIsFloat); + lut->srcBitDepth = IMLutTableSizeToBitDepth(length, src16bitDepthIsFloat); // targetBitDepth will be set appropriately for conversion LUTs in IMLutGet lut->targetBitDepth = IMLutTableSizeToBitDepth(length); @@ -302,11 +307,11 @@ bool Lut1dUtils::IMLutAlloc(IMLutStruct **plut, int num, int length) // Return an error status. static int tableLoad( std::istream & istream, - unsigned short *ptable, // Destination table. - int length, // Length of ptable. - int ptablestart, // Start at ptable[ptablestart]. - int & line, // Last line successfully read. - std::string & errorLine // Line content in case of syntax err + unsigned short * ptable, // Destination table. + int length, // Length of ptable. + int ptablestart, // Start at ptable[ptablestart]. + int & line, // Last line successfully read. + std::string & errorLine // Line content in case of syntax err ) { char InString[200]; @@ -367,7 +372,7 @@ static bool FindNonComment( int Lut1dUtils::IMLutGet( std::istream & istream, const std::string & fileName, - IMLutStruct **plut, + IMLutStruct ** plut, int & line, std::string & errorLine) { @@ -386,7 +391,7 @@ int Lut1dUtils::IMLutGet( if (!FindNonComment(istream, line, InString, 200)) { status = IMLUT_ERR_UNEXPECTED_EOF; - *plut = 0; + *plut = 0; goto load_abort; } @@ -394,18 +399,18 @@ int Lut1dUtils::IMLutGet( { // Old format LUT file: 1 table of 256 entries. numtables = 1; - length = 256; + length = 256; if (!IMLutAlloc(&lut, numtables, length)) { status = IMLUT_ERR_CANNOT_MALLOC; - *plut = 0; + *plut = 0; goto load_abort; } // Load first table value. (lut->tables[0])[0] = (unsigned short)std::stoi(InString); - tablestart = 1; + tablestart = 1; } else { @@ -416,14 +421,12 @@ int Lut1dUtils::IMLutGet( const int nummatched = sscanf(InString, "%*s %d %d %s", &numtables, &length, dstDepthS); #endif std::string subStr(InString, 5); - if (nummatched < 2 || - StringUtils::Lower(subStr) != "lut: " || - (numtables != 1 && numtables != 3 && numtables != 4) || - length <= 0) + if (nummatched < 2 || StringUtils::Lower(subStr) != "lut: " + || (numtables != 1 && numtables != 3 && numtables != 4) || length <= 0) { errorLine = InString; - status = IMLUT_ERR_SYNTAX; - *plut = 0; + status = IMLUT_ERR_SYNTAX; + *plut = 0; goto load_abort; } @@ -433,7 +436,7 @@ int Lut1dUtils::IMLutGet( { // Optional dstDepth was specified. Validate it. int dstDepth = 0; - char floatC = ' '; + char floatC = ' '; #ifdef _WIN32 sscanf(dstDepthS, "%d%c", &dstDepth, &floatC, 1); #else @@ -446,13 +449,12 @@ int Lut1dUtils::IMLutGet( // case we may wrongly interpret a 16f outDepth as 16i. We may want to // investigate this further at some point. - depthScaled = IMLutTableSizeToBitDepth(dstDepth, - floatC == 'f' || floatC == 'F'); + depthScaled = IMLutTableSizeToBitDepth(dstDepth, floatC == 'f' || floatC == 'F'); if (depthScaled == IM_LUT_UNKNOWN_BITS_PERCHANNEL) { errorLine = InString; - status = IMLUT_ERR_SYNTAX; - *plut = 0; + status = IMLUT_ERR_SYNTAX; + *plut = 0; goto load_abort; } } @@ -460,7 +462,7 @@ int Lut1dUtils::IMLutGet( if (!IMLutAlloc(&lut, numtables, length)) { status = IMLUT_ERR_CANNOT_MALLOC; - *plut = 0; + *plut = 0; goto load_abort; } tablestart = 0; @@ -468,12 +470,7 @@ int Lut1dUtils::IMLutGet( for (i = 0; i < numtables; i++) { - status = tableLoad( - istream, - lut->tables[i], - length, - tablestart, - line, errorLine); + status = tableLoad(istream, lut->tables[i], length, tablestart, line, errorLine); if (status != IMLUT_OK) { IMLutFree(&lut); @@ -503,7 +500,7 @@ int Lut1dUtils::IMLutGet( if (FindNonComment(istream, line, InString, 200)) { errorLine = InString; - status = IMLUT_ERR_SYNTAX; + status = IMLUT_ERR_SYNTAX; IMLutFree(&lut); *plut = 0; goto load_abort; @@ -517,7 +514,8 @@ int Lut1dUtils::IMLutGet( // Parses the filename and attempts to determine the bitdepth // of the LUT -Lut1dUtils::IM_LutBitsPerChannel Lut1dUtils::IMLutGetBitDepthFromFileName(const std::string & fileName) +Lut1dUtils::IM_LutBitsPerChannel Lut1dUtils::IMLutGetBitDepthFromFileName( + const std::string & fileName) { if (fileName.empty()) { @@ -528,7 +526,7 @@ Lut1dUtils::IM_LutBitsPerChannel Lut1dUtils::IMLutGetBitDepthFromFileName(const // Get the export depth from the LUT name. Look for a bit depth // after the "to" string. (ex: 12to10log). - const char* tokenStr; + const char * tokenStr; if ((tokenStr = std::strstr(lowerFileName.c_str(), "to"))) { // Skip the "to"; @@ -589,20 +587,20 @@ Lut1dUtils::IM_LutBitsPerChannel Lut1dUtils::IMLutGetBitDepthFromFileName(const // Supply appropriate message string given IMLUT_ERR status code. const char * Lut1dUtils::IMLutErrorStr(int errnum) { - switch (errnum) + switch (errnum) { - case IMLUT_OK: - return ""; - case IMLUT_ERR_UNEXPECTED_EOF: - return "Premature EOF reading LUT file"; - case IMLUT_ERR_CANNOT_OPEN: - return "Cannot open LUT file"; - case IMLUT_ERR_CANNOT_MALLOC: - return "Cannot allocate memory for LUT"; - case IMLUT_ERR_SYNTAX: - return "Syntax error reading LUT file"; - default: - return "Unknown error for LUT"; + case IMLUT_OK: + return ""; + case IMLUT_ERR_UNEXPECTED_EOF: + return "Premature EOF reading LUT file"; + case IMLUT_ERR_CANNOT_OPEN: + return "Cannot open LUT file"; + case IMLUT_ERR_CANNOT_MALLOC: + return "Cannot allocate memory for LUT"; + case IMLUT_ERR_SYNTAX: + return "Syntax error reading LUT file"; + default: + return "Unknown error for LUT"; } } @@ -610,15 +608,15 @@ class LocalCachedFile : public CachedFile { public: LocalCachedFile() = delete; - LocalCachedFile(BitDepth inBitDepth, - BitDepth outBitDepth, - unsigned long dimension, - Interpolation interp) + LocalCachedFile( + BitDepth inBitDepth, + BitDepth outBitDepth, + unsigned long dimension, + Interpolation interp) { - const Lut1DOpData::HalfFlags halfFlags = - (inBitDepth == BIT_DEPTH_F16) - ? Lut1DOpData::LUT_INPUT_HALF_CODE - : Lut1DOpData::LUT_STANDARD; + const Lut1DOpData::HalfFlags halfFlags = (inBitDepth == BIT_DEPTH_F16) + ? Lut1DOpData::LUT_INPUT_HALF_CODE + : Lut1DOpData::LUT_STANDARD; lut1D = std::make_shared(halfFlags, dimension, false); if (Lut1DOpData::IsValidInterpolation(interp)) @@ -637,28 +635,28 @@ typedef OCIO_SHARED_PTR LocalCachedFileRcPtr; class LocalFileFormat : public FileFormat { public: - LocalFileFormat() = default; + LocalFileFormat() = default; ~LocalFileFormat() = default; void getFormatInfo(FormatInfoVec & formatInfoVec) const override; - CachedFileRcPtr read(std::istream & istream, - const std::string & fileName, - Interpolation interp) const override; + CachedFileRcPtr read(std::istream & istream, const std::string & fileName, Interpolation interp) + const override; - void buildFileOps(OpRcPtrVec & ops, - const Config & config, - const ConstContextRcPtr & context, - CachedFileRcPtr untypedCachedFile, - const FileTransform & fileTransform, - TransformDirection dir) const override; + void buildFileOps( + OpRcPtrVec & ops, + const Config & config, + const ConstContextRcPtr & context, + CachedFileRcPtr untypedCachedFile, + const FileTransform & fileTransform, + TransformDirection dir) const override; }; void LocalFileFormat::getFormatInfo(FormatInfoVec & formatInfoVec) const { FormatInfo info; - info.name = "Discreet 1D LUT"; - info.extension = "lut"; + info.name = "Discreet 1D LUT"; + info.extension = "lut"; info.capabilities = FORMAT_CAPABILITY_READ; formatInfoVec.push_back(info); } @@ -666,22 +664,19 @@ void LocalFileFormat::getFormatInfo(FormatInfoVec & formatInfoVec) const // Try and load the format // Raise an exception if it can't be loaded. -CachedFileRcPtr LocalFileFormat::read(std::istream & istream, - const std::string & filePath, - Interpolation interp) const +CachedFileRcPtr LocalFileFormat::read( + std::istream & istream, + const std::string & filePath, + Interpolation interp) const { - Lut1dUtils::IMLutStruct *discreetLut1d = 0x0; + Lut1dUtils::IMLutStruct * discreetLut1d = 0x0; int errline; std::string errorLine; std::string root, extension, fileName; pystring::os::path::splitext(root, extension, filePath); fileName = pystring::os::path::basename(root); - const int status = Lut1dUtils::IMLutGet(istream, - fileName, - &discreetLut1d, - errline, - errorLine); + const int status = Lut1dUtils::IMLutGet(istream, fileName, &discreetLut1d, errline, errorLine); if (status != Lut1dUtils::IMLUT_OK) { std::ostringstream os; @@ -697,22 +692,19 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, throw Exception(os.str().c_str()); } - const BitDepth inputBD = Lut1dUtils::GetBitDepth(discreetLut1d->srcBitDepth); + const BitDepth inputBD = Lut1dUtils::GetBitDepth(discreetLut1d->srcBitDepth); const BitDepth outputBD = Lut1dUtils::GetBitDepth(discreetLut1d->targetBitDepth); - const int lutSize = discreetLut1d->length; + const int lutSize = discreetLut1d->length; - LocalCachedFileRcPtr cachedFile - = LocalCachedFileRcPtr(new LocalCachedFile(inputBD, - outputBD, - (unsigned long)lutSize, - interp)); + LocalCachedFileRcPtr cachedFile = LocalCachedFileRcPtr( + new LocalCachedFile(inputBD, outputBD, (unsigned long)lutSize, interp)); - const float scale = (float)GetBitDepthMaxValue(outputBD); - Array & array = cachedFile->lut1D->getArray(); + const float scale = (float)GetBitDepthMaxValue(outputBD); + Array & array = cachedFile->lut1D->getArray(); const int srcTableLimit = discreetLut1d->numtables - 1; - for (int i = 0, p = 0; i< lutSize; ++i) + for (int i = 0, p = 0; i < lutSize; ++i) { - for (int j = 0; j<3; ++j, ++p ) + for (int j = 0; j < 3; ++j, ++p) { const int srcTable = std::min(j, srcTableLimit); if (discreetLut1d->targetBitDepth == Lut1dUtils::IM_LUT_HALFBITS_PERCHANNEL) @@ -733,29 +725,29 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, return cachedFile; } -void -LocalFileFormat::buildFileOps(OpRcPtrVec & ops, - const Config & /*config*/, - const ConstContextRcPtr & /*context*/, - CachedFileRcPtr untypedCachedFile, - const FileTransform & fileTransform, - TransformDirection dir) const +void LocalFileFormat::buildFileOps( + OpRcPtrVec & ops, + const Config & /*config*/, + const ConstContextRcPtr & /*context*/, + CachedFileRcPtr untypedCachedFile, + const FileTransform & fileTransform, + TransformDirection dir) const { LocalCachedFileRcPtr cachedFile = DynamicPtrCast(untypedCachedFile); // This should never happen. - if(!cachedFile || !cachedFile->lut1D) + if (!cachedFile || !cachedFile->lut1D) { std::ostringstream os; os << "Cannot build .lut Op. Invalid cache type."; throw Exception(os.str().c_str()); } - const auto newDir = CombineTransformDirections(dir, fileTransform.getDirection()); + const auto newDir = CombineTransformDirections(dir, fileTransform.getDirection()); const auto fileInterp = fileTransform.getInterpolation(); bool fileInterpUsed = false; - auto lut1D = HandleLUT1D(cachedFile->lut1D, fileInterp, fileInterpUsed); + auto lut1D = HandleLUT1D(cachedFile->lut1D, fileInterp, fileInterpUsed); if (!fileInterpUsed) { @@ -764,7 +756,7 @@ LocalFileFormat::buildFileOps(OpRcPtrVec & ops, CreateLut1DOp(ops, lut1D, newDir); } -} +} // namespace FileFormat * CreateFileFormatDiscreet1DL() { diff --git a/src/OpenColorIO/fileformats/FileFormatHDL.cpp b/src/OpenColorIO/fileformats/FileFormatHDL.cpp old mode 100755 new mode 100644 index 16e0ffab53..e44f9d4550 --- a/src/OpenColorIO/fileformats/FileFormatHDL.cpp +++ b/src/OpenColorIO/fileformats/FileFormatHDL.cpp @@ -29,17 +29,16 @@ #include -#include "fileformats/FileFormatUtils.h" +#include "BakingUtils.h" #include "MathUtils.h" +#include "ParseUtils.h" +#include "fileformats/FileFormatUtils.h" #include "ops/lut1d/Lut1DOp.h" #include "ops/lut3d/Lut3DOp.h" #include "ops/matrix/MatrixOp.h" -#include "BakingUtils.h" -#include "ParseUtils.h" #include "transforms/FileTransform.h" -#include "utils/StringUtils.h" #include "utils/NumberUtils.h" - +#include "utils/StringUtils.h" namespace OCIO_NAMESPACE { @@ -48,26 +47,26 @@ namespace // HDL parser helpers // HDL headers/LUT's are shoved into these datatypes -typedef std::map StringToStringVecMap; -typedef std::map > StringToFloatVecMap; +typedef std::map StringToStringVecMap; +typedef std::map> StringToFloatVecMap; -void -readHeaders(StringToStringVecMap& headers, - std::istream& istream) +void readHeaders(StringToStringVecMap & headers, std::istream & istream) { std::string line; - while(nextline(istream, line)) + while (nextline(istream, line)) { // Remove trailing/leading whitespace, lower-case and // split into words - StringUtils::StringVec chunks + StringUtils::StringVec chunks = StringUtils::SplitByWhiteSpaces(StringUtils::Lower(StringUtils::Trim(line))); // Skip empty lines - if(chunks.empty()) continue; + if (chunks.empty()) + continue; // Stop looking for headers at the "LUT:" line - if(chunks[0] == "lut:") break; + if (chunks[0] == "lut:") + break; // Use first index as key, and remove it from the value const std::string key = chunks[0]; @@ -81,17 +80,17 @@ readHeaders(StringToStringVecMap& headers, // exception if not found, or if number of chunks in value is // not between min_vals and max_vals (e.g the "length" key // must exist, and must have either 1 or 2 values) -StringUtils::StringVec -findHeaderItem(StringToStringVecMap& headers, - const std::string key, - const unsigned int min_vals, - const unsigned int max_vals) +StringUtils::StringVec findHeaderItem( + StringToStringVecMap & headers, + const std::string key, + const unsigned int min_vals, + const unsigned int max_vals) { StringToStringVecMap::iterator iter; iter = headers.find(key); // Error if key is not found - if(iter == headers.end()) + if (iter == headers.end()) { std::ostringstream os; os << "'" << key << "' line not found"; @@ -99,14 +98,13 @@ findHeaderItem(StringToStringVecMap& headers, } // Error if incorrect number of values is found - if(iter->second.size() < min_vals || - iter->second.size() > max_vals) + if (iter->second.size() < min_vals || iter->second.size() > max_vals) { std::ostringstream os; os << "Incorrect number of chunks (" << iter->second.size() << ")"; os << " after '" << key << "' line, expected "; - if(min_vals == max_vals) + if (min_vals == max_vals) { os << min_vals; } @@ -124,9 +122,7 @@ findHeaderItem(StringToStringVecMap& headers, // Simple wrapper to call findHeaderItem with a fixed number // of values (e.g "version" should have a single value) StringUtils::StringVec -findHeaderItem(StringToStringVecMap& chunks, - const std::string key, - const unsigned int numvals) +findHeaderItem(StringToStringVecMap & chunks, const std::string key, const unsigned int numvals) { return findHeaderItem(chunks, key, numvals, numvals); } @@ -137,9 +133,7 @@ findHeaderItem(StringToStringVecMap& chunks, // were it could incorrectly accept broken data (like // "Pre{0.0\n1.0}blah"), but hopefully none where it misses // data -void -readLuts(std::istream& istream, - StringToFloatVecMap& lutValues) +void readLuts(std::istream & istream, StringToFloatVecMap & lutValues) { // State variables bool inlut = false; @@ -147,26 +141,26 @@ readLuts(std::istream& istream, std::string word; - while(istream >> word) + while (istream >> word) { - if(!inlut) + if (!inlut) { - if(word == "{") + if (word == "{") { // Lone "{" is for a 3D - inlut = true; + inlut = true; lutname = "3d"; } else { // Named LUT, e.g "Pre {" - inlut = true; + inlut = true; lutname = StringUtils::Lower(word); // Ensure next word is "{" std::string nextword; istream >> nextword; - if(nextword != "{") + if (nextword != "{") { std::ostringstream os; os << "Malformed LUT - Unknown word '"; @@ -176,16 +170,17 @@ readLuts(std::istream& istream, } } } - else if(word == "}") + else if (word == "}") { // end of LUT - inlut = false; + inlut = false; lutname = ""; } - else if(inlut) + else if (inlut) { float v{}; - const auto result = NumberUtils::from_chars(word.c_str(), word.c_str() + word.size(), v); + const auto result + = NumberUtils::from_chars(word.c_str(), word.c_str() + word.size(), v); if (result.ec == std::errc()) { @@ -205,21 +200,20 @@ readLuts(std::istream& istream, { std::ostringstream os; os << "Unexpected word, possibly a value outside"; - os <<" a LUT {} block. Word was '" << word << "'"; + os << " a LUT {} block. Word was '" << word << "'"; throw Exception(os.str().c_str()); - } } } -} // end anonymous "HDL parser helpers" namespace +} // namespace namespace { class CachedFileHDL : public CachedFile { public: - CachedFileHDL () + CachedFileHDL() : hdlversion("unknown") , hdlformat("unknown") , hdltype("unknown") @@ -230,7 +224,7 @@ class CachedFileHDL : public CachedFile void setLUT1D(const std::vector & values, Interpolation interp) { auto lutSize = static_cast(values.size()); - lut1D = std::make_shared(lutSize); + lut1D = std::make_shared(lutSize); if (Lut1DOpData::IsValidInterpolation(interp)) { lut1D->setInterpolation(interp); @@ -251,8 +245,8 @@ class CachedFileHDL : public CachedFile std::string hdltype; float from_min = 0.0f; float from_max = 1.0f; - float to_min = 0.0f; - float to_max = 1.0f; + float to_min = 0.0f; + float to_max = 1.0f; float hdlblack = 0.0f; float hdlwhite = 1.0f; @@ -264,51 +258,50 @@ typedef OCIO_SHARED_PTR CachedFileHDLRcPtr; class LocalFileFormat : public FileFormat { public: - LocalFileFormat() = default; + LocalFileFormat() = default; ~LocalFileFormat() = default; void getFormatInfo(FormatInfoVec & formatInfoVec) const override; - CachedFileRcPtr read(std::istream & istream, - const std::string & fileName, - Interpolation interp) const override; + CachedFileRcPtr read(std::istream & istream, const std::string & fileName, Interpolation interp) + const override; - void bake(const Baker & baker, - const std::string & formatName, - std::ostream & ostream) const override; + void bake(const Baker & baker, const std::string & formatName, std::ostream & ostream) + const override; - void buildFileOps(OpRcPtrVec & ops, - const Config & config, - const ConstContextRcPtr & context, - CachedFileRcPtr untypedCachedFile, - const FileTransform & fileTransform, - TransformDirection dir) const override; + void buildFileOps( + OpRcPtrVec & ops, + const Config & config, + const ConstContextRcPtr & context, + CachedFileRcPtr untypedCachedFile, + const FileTransform & fileTransform, + TransformDirection dir) const override; }; void LocalFileFormat::getFormatInfo(FormatInfoVec & formatInfoVec) const { FormatInfo info; - info.name = "houdini"; - info.extension = "lut"; - info.capabilities = FormatCapabilityFlags(FORMAT_CAPABILITY_READ | FORMAT_CAPABILITY_BAKE); - info.bake_capabilities = FormatBakeFlags(FORMAT_BAKE_CAPABILITY_3DLUT | - FORMAT_BAKE_CAPABILITY_1DLUT | - FORMAT_BAKE_CAPABILITY_1D_3D_LUT); + info.name = "houdini"; + info.extension = "lut"; + info.capabilities = FormatCapabilityFlags(FORMAT_CAPABILITY_READ | FORMAT_CAPABILITY_BAKE); + info.bake_capabilities = FormatBakeFlags( + FORMAT_BAKE_CAPABILITY_3DLUT | FORMAT_BAKE_CAPABILITY_1DLUT + | FORMAT_BAKE_CAPABILITY_1D_3D_LUT); formatInfoVec.push_back(info); } -CachedFileRcPtr -LocalFileFormat::read(std::istream & istream, - const std::string & /* fileName unused */, - Interpolation interp) const +CachedFileRcPtr LocalFileFormat::read( + std::istream & istream, + const std::string & /* fileName unused */, + Interpolation interp) const { // this shouldn't happen if (!istream) - throw Exception ("file stream empty when trying to read Houdini LUT"); + throw Exception("file stream empty when trying to read Houdini LUT"); // - CachedFileHDLRcPtr cachedFile = CachedFileHDLRcPtr (new CachedFileHDL ()); + CachedFileHDLRcPtr cachedFile = CachedFileHDLRcPtr(new CachedFileHDL()); Lut3DOpDataRcPtr lut3d_ptr; @@ -324,12 +317,12 @@ LocalFileFormat::read(std::istream & istream, // "Version 3" - format version (currently one version // number per LUT type) - value = findHeaderItem(header_chunks, "version", 1); + value = findHeaderItem(header_chunks, "version", 1); cachedFile->hdlversion = value[0]; // "Format any" - bit depth of image the LUT should be // applied to (this is basically ignored) - value = findHeaderItem(header_chunks, "format", 1); + value = findHeaderItem(header_chunks, "format", 1); cachedFile->hdlformat = value[0]; // "Type 3d" - type of LUT @@ -343,21 +336,20 @@ LocalFileFormat::read(std::istream & istream, { float from_min = 0.0f; float from_max = 1.0f; - value = findHeaderItem(header_chunks, "from", 2); + value = findHeaderItem(header_chunks, "from", 2); - if(!StringToFloat(&from_min, value[0].c_str()) || - !StringToFloat(&from_max, value[1].c_str())) + if (!StringToFloat(&from_min, value[0].c_str()) + || !StringToFloat(&from_max, value[1].c_str())) { std::ostringstream os; os << "Invalid float value(s) on 'From' line, '"; - os << value[0] << "' and '" << value[1] << "'"; + os << value[0] << "' and '" << value[1] << "'"; throw Exception(os.str().c_str()); } cachedFile->from_min = from_min; cachedFile->from_max = from_max; } - // "To 0.0 1.0" - range of values in LUT (e.g "0 255" // to specify values as 8-bit numbers, usually "0 1") { @@ -365,12 +357,11 @@ LocalFileFormat::read(std::istream & istream, value = findHeaderItem(header_chunks, "to", 2); - if(!StringToFloat(&to_min, value[0].c_str()) || - !StringToFloat(&to_max, value[1].c_str())) + if (!StringToFloat(&to_min, value[0].c_str()) || !StringToFloat(&to_max, value[1].c_str())) { std::ostringstream os; os << "Invalid float value(s) on 'To' line, '"; - os << value[0] << "' and '" << value[1] << "'"; + os << value[0] << "' and '" << value[1] << "'"; throw Exception(os.str().c_str()); } cachedFile->to_min = to_min; @@ -385,7 +376,7 @@ LocalFileFormat::read(std::istream & istream, float black; - if(!StringToFloat(&black, value[0].c_str())) + if (!StringToFloat(&black, value[0].c_str())) { std::ostringstream os; os << "Invalid float value on 'Black' line, '"; @@ -400,7 +391,7 @@ LocalFileFormat::read(std::istream & istream, float white; - if(!StringToFloat(&white, value[0].c_str())) + if (!StringToFloat(&white, value[0].c_str())) { std::ostringstream os; os << "Invalid float value on 'White' line, '"; @@ -410,12 +401,11 @@ LocalFileFormat::read(std::istream & istream, cachedFile->hdlwhite = white; } - // Verify type is valid and supported - used to handle // length sensibly, and checking the LUT later { std::string ltype = cachedFile->hdltype; - if(ltype != "3d" && ltype != "3d+1d" && ltype != "c") + if (ltype != "3d" && ltype != "3d+1d" && ltype != "c") { std::ostringstream os; os << "Unsupported Houdini LUT type: '" << ltype << "'"; @@ -423,21 +413,20 @@ LocalFileFormat::read(std::istream & istream, } } - // "Length 2" or "Length 2 5" - either "[cube size]", or "[cube // size] [prelut size]" - int size_3d = -1; + int size_3d = -1; int size_prelut = -1; - int size_1d = -1; + int size_1d = -1; { std::vector lut_sizes; value = findHeaderItem(header_chunks, "length", 1, 2); - for(unsigned int i = 0; i < value.size(); ++i) + for (unsigned int i = 0; i < value.size(); ++i) { int tmpsize = -1; - if(!StringToInt(&tmpsize, value[i].c_str())) + if (!StringToInt(&tmpsize, value[i].c_str())) { std::ostringstream os; os << "Invalid integer on 'Length' line: "; @@ -447,7 +436,7 @@ LocalFileFormat::read(std::istream & istream, lut_sizes.push_back(tmpsize); } - if(cachedFile->hdltype == "3d" || cachedFile->hdltype == "3d+1d") + if (cachedFile->hdltype == "3d" || cachedFile->hdltype == "3d+1d") { // Set cube size size_3d = lut_sizes[0]; @@ -460,12 +449,12 @@ LocalFileFormat::read(std::istream & istream, lut3d_ptr->setFileOutputBitDepth(BIT_DEPTH_F32); } - if(cachedFile->hdltype == "c") + if (cachedFile->hdltype == "c") { size_1d = lut_sizes[0]; } - if(cachedFile->hdltype == "3d+1d") + if (cachedFile->hdltype == "3d+1d") { size_prelut = lut_sizes[1]; } @@ -478,18 +467,18 @@ LocalFileFormat::read(std::istream & istream, // StringToFloatVecMap::iterator lut_iter; - if(cachedFile->hdltype == "3d+1d") + if (cachedFile->hdltype == "3d+1d") { // Read prelut, and bind onto cachedFile lut_iter = lut_data.find("pre"); - if(lut_iter == lut_data.end()) + if (lut_iter == lut_data.end()) { std::ostringstream os; os << "3D+1D LUT should contain Pre{} LUT section"; throw Exception(os.str().c_str()); } - if(size_prelut != static_cast(lut_iter->second.size())) + if (size_prelut != static_cast(lut_iter->second.size())) { std::ostringstream os; os << "Pre{} LUT was " << lut_iter->second.size(); @@ -500,14 +489,13 @@ LocalFileFormat::read(std::istream & istream, cachedFile->setLUT1D(lut_iter->second, interp); } - if(cachedFile->hdltype == "3d" || - cachedFile->hdltype == "3d+1d") + if (cachedFile->hdltype == "3d" || cachedFile->hdltype == "3d+1d") { // Bind 3D LUT to lut3d_ptr, along with some // slightly-elabourate error messages lut_iter = lut_data.find("3d"); - if(lut_iter == lut_data.end()) + if (lut_iter == lut_data.end()) { std::ostringstream os; os << "3D LUT section not found"; @@ -516,16 +504,16 @@ LocalFileFormat::read(std::istream & istream, int size_3d_cubed = size_3d * size_3d * size_3d; - if(size_3d_cubed * 3 != static_cast(lut_iter->second.size())) + if (size_3d_cubed * 3 != static_cast(lut_iter->second.size())) { - int foundsize = static_cast(lut_iter->second.size()); + int foundsize = static_cast(lut_iter->second.size()); int foundlines = foundsize / 3; std::ostringstream os; os << "3D LUT contains incorrect number of values. "; os << "Contained " << foundsize << " values "; os << "(" << foundlines << " lines), "; - os << "expected " << (size_3d_cubed*3) << " values "; + os << "expected " << (size_3d_cubed * 3) << " values "; os << "(" << size_3d_cubed << " lines)"; throw Exception(os.str().c_str()); } @@ -536,18 +524,18 @@ LocalFileFormat::read(std::istream & istream, cachedFile->lut3D = lut3d_ptr; } - if(cachedFile->hdltype == "c") + if (cachedFile->hdltype == "c") { // Bind simple 1D RGB LUT lut_iter = lut_data.find("rgb"); - if(lut_iter == lut_data.end()) + if (lut_iter == lut_data.end()) { std::ostringstream os; os << "3D+1D LUT should contain Pre{} LUT section"; throw Exception(os.str().c_str()); } - if(size_1d != static_cast(lut_iter->second.size())) + if (size_1d != static_cast(lut_iter->second.size())) { std::ostringstream os; os << "RGB{} LUT was " << lut_iter->second.size(); @@ -561,12 +549,13 @@ LocalFileFormat::read(std::istream & istream, return cachedFile; } -void LocalFileFormat::bake(const Baker & baker, - const std::string & formatName, - std::ostream & ostream) const +void LocalFileFormat::bake( + const Baker & baker, + const std::string & formatName, + std::ostream & ostream) const { - if(formatName != "houdini") + if (formatName != "houdini") { std::ostringstream os; os << "Unknown hdl format name, '"; @@ -584,25 +573,28 @@ void LocalFileFormat::bake(const Baker & baker, // that looks more quantised than even "nearest" // interpolation in OCIOFileTransform) const int DEFAULT_CUBE_SIZE = 64; - const int DEFAULT_1D_SIZE = 1024; + const int DEFAULT_1D_SIZE = 1024; // Get configured sizes - int cubeSize = baker.getCubeSize(); + int cubeSize = baker.getCubeSize(); int shaperSize = baker.getShaperSize(); - int onedSize = baker.getCubeSize(); + int onedSize = baker.getCubeSize(); // Check defaults and cube size - if(cubeSize == -1) cubeSize = DEFAULT_CUBE_SIZE; + if (cubeSize == -1) + cubeSize = DEFAULT_CUBE_SIZE; // ..and same for shaper size - if(shaperSize == -1) shaperSize = DEFAULT_SHAPER_SIZE; + if (shaperSize == -1) + shaperSize = DEFAULT_SHAPER_SIZE; // ..and finally, for the 1D LUT size - if(onedSize == -1) onedSize = DEFAULT_1D_SIZE; + if (onedSize == -1) + onedSize = DEFAULT_1D_SIZE; // Version numbers - const int HDL_1D = 1; // 1D LUT version number - const int HDL_3D = 2; // 3D LUT version number + const int HDL_1D = 1; // 1D LUT version number + const int HDL_3D = 2; // 3D LUT version number const int HDL_3D1D = 3; // 3D LUT with 1D prelut // Get spaces from baker @@ -613,9 +605,9 @@ void LocalFileFormat::bake(const Baker & baker, ConstCPUProcessorRcPtr inputToTarget = GetInputToTargetProcessor(baker); - if(inputToTarget->hasChannelCrosstalk()) + if (inputToTarget->hasChannelCrosstalk()) { - if(shaperSpace.empty()) + if (shaperSpace.empty()) { // Has crosstalk, but no prelut, so need 3D LUT required_lut = HDL_3D; @@ -632,28 +624,26 @@ void LocalFileFormat::bake(const Baker & baker, required_lut = HDL_1D; } - if(required_lut == -1) + if (required_lut == -1) { // Unnecessary paranoia - throw Exception( - "Internal logic error, LUT type was not determined"); + throw Exception("Internal logic error, LUT type was not determined"); } // Make prelut std::vector prelutData; float fromInStart = 0.0f; - float fromInEnd = 1.0f; + float fromInEnd = 1.0f; - if(required_lut == HDL_3D1D) + if (required_lut == HDL_3D1D) { GetShaperRange(baker, fromInStart, fromInEnd); // Generate the identity prelut values, then apply the transform. // Prelut is linearly sampled from fromInStart to fromInEnd - prelutData.resize(shaperSize*3); - GenerateLinearScaleLut1D( - prelutData.data(), shaperSize, 3, fromInStart, fromInEnd); + prelutData.resize(shaperSize * 3); + GenerateLinearScaleLut1D(prelutData.data(), shaperSize, 3, fromInStart, fromInEnd); PackedImageDesc prelutImg(&prelutData[0], shaperSize, 1, 3); ConstCPUProcessorRcPtr inputToShaper = GetInputToShaperProcessor(baker); @@ -664,15 +654,15 @@ void LocalFileFormat::bake(const Baker & baker, // Make 3D LUT std::vector cubeData; - if(required_lut == HDL_3D || required_lut == HDL_3D1D) + if (required_lut == HDL_3D || required_lut == HDL_3D1D) { - cubeData.resize(cubeSize*cubeSize*cubeSize*3); + cubeData.resize(cubeSize * cubeSize * cubeSize * 3); GenerateIdentityLut3D(&cubeData[0], cubeSize, 3, LUT3DORDER_FAST_RED); - PackedImageDesc cubeImg(&cubeData[0], cubeSize*cubeSize*cubeSize, 1, 3); + PackedImageDesc cubeImg(&cubeData[0], cubeSize * cubeSize * cubeSize, 1, 3); ConstCPUProcessorRcPtr cubeProc; - if(required_lut == HDL_3D1D) + if (required_lut == HDL_3D1D) { cubeProc = GetShaperToTargetProcessor(baker); } @@ -685,11 +675,10 @@ void LocalFileFormat::bake(const Baker & baker, cubeProc->apply(cubeImg); } - // Make 1D LUT std::vector onedData; - if(required_lut == HDL_1D) + if (required_lut == HDL_1D) { onedData.resize(onedSize * 3); @@ -707,17 +696,16 @@ void LocalFileFormat::bake(const Baker & baker, inputToTarget->apply(onedImg); } - // Write the file contents ostream << "Version\t\t" << required_lut << "\n"; ostream << "Format\t\t" << "any" << "\n"; ostream << "Type\t\t"; - if(required_lut == HDL_1D) + if (required_lut == HDL_1D) ostream << "RGB"; - if(required_lut == HDL_3D) + if (required_lut == HDL_3D) ostream << "3D"; - if(required_lut == HDL_3D1D) + if (required_lut == HDL_3D1D) ostream << "3D+1D"; ostream << "\n"; @@ -726,50 +714,50 @@ void LocalFileFormat::bake(const Baker & baker, ostream << "Black\t\t" << 0.0f << "\n"; ostream << "White\t\t" << 1.0f << "\n"; - if(required_lut == HDL_3D1D) + if (required_lut == HDL_3D1D) ostream << "Length\t\t" << cubeSize << " " << shaperSize << "\n"; - if(required_lut == HDL_3D) + if (required_lut == HDL_3D) ostream << "Length\t\t" << cubeSize << "\n"; - if(required_lut == HDL_1D) + if (required_lut == HDL_1D) ostream << "Length\t\t" << onedSize << "\n"; ostream << "LUT:\n"; // Write prelut - if(required_lut == HDL_3D1D) + if (required_lut == HDL_3D1D) { ostream << "Pre {\n"; - for(int i=0; i < shaperSize; ++i) + for (int i = 0; i < shaperSize; ++i) { // Grab green channel from RGB prelut - ostream << "\t" << prelutData[i*3+1] << "\n"; + ostream << "\t" << prelutData[i * 3 + 1] << "\n"; } ostream << "}\n"; } // Write "3D {" part of output of 3D+1D LUT - if(required_lut == HDL_3D1D) + if (required_lut == HDL_3D1D) { ostream << "3D {\n"; } // Write the slightly-different "{" without line for the 3D-only LUT - if(required_lut == HDL_3D) + if (required_lut == HDL_3D) { ostream << " {\n"; } // Write the cube data after the "{" - if(required_lut == HDL_3D || required_lut == HDL_3D1D) + if (required_lut == HDL_3D || required_lut == HDL_3D1D) { - for(int i=0; i < cubeSize*cubeSize*cubeSize; ++i) + for (int i = 0; i < cubeSize * cubeSize * cubeSize; ++i) { // TODO: Original baker code clamped values to // 1.0, was this necessary/desirable? - ostream << "\t" << cubeData[3*i+0]; - ostream << " " << cubeData[3*i+1]; - ostream << " " << cubeData[3*i+2] << "\n"; + ostream << "\t" << cubeData[3 * i + 0]; + ostream << " " << cubeData[3 * i + 1]; + ostream << " " << cubeData[3 * i + 2] << "\n"; } // Write closing "}" @@ -777,38 +765,38 @@ void LocalFileFormat::bake(const Baker & baker, } // Write out channels for 1D LUT - if(required_lut == HDL_1D) + if (required_lut == HDL_1D) { ostream << "R {\n"; - for(int i=0; i < onedSize; ++i) - ostream << "\t" << onedData[i*3+0] << "\n"; + for (int i = 0; i < onedSize; ++i) + ostream << "\t" << onedData[i * 3 + 0] << "\n"; ostream << "}\n"; ostream << "G {\n"; - for(int i=0; i < onedSize; ++i) - ostream << "\t" << onedData[i*3+1] << "\n"; + for (int i = 0; i < onedSize; ++i) + ostream << "\t" << onedData[i * 3 + 1] << "\n"; ostream << "}\n"; ostream << "B {\n"; - for(int i=0; i < onedSize; ++i) - ostream << "\t" << onedData[i*3+2] << "\n"; + for (int i = 0; i < onedSize; ++i) + ostream << "\t" << onedData[i * 3 + 2] << "\n"; ostream << "}\n"; } } -void -LocalFileFormat::buildFileOps(OpRcPtrVec & ops, - const Config & /*config*/, - const ConstContextRcPtr & /*context*/, - CachedFileRcPtr untypedCachedFile, - const FileTransform & fileTransform, - TransformDirection dir) const +void LocalFileFormat::buildFileOps( + OpRcPtrVec & ops, + const Config & /*config*/, + const ConstContextRcPtr & /*context*/, + CachedFileRcPtr untypedCachedFile, + const FileTransform & fileTransform, + TransformDirection dir) const { CachedFileHDLRcPtr cachedFile = DynamicPtrCast(untypedCachedFile); // This should never happen. - if(!cachedFile || (!cachedFile->lut1D && !cachedFile->lut3D)) + if (!cachedFile || (!cachedFile->lut1D && !cachedFile->lut3D)) { std::ostringstream os; os << "Cannot build Houdini Op. Invalid cache type."; @@ -820,8 +808,8 @@ LocalFileFormat::buildFileOps(OpRcPtrVec & ops, const auto fileInterp = fileTransform.getInterpolation(); bool fileInterpUsed = false; - auto lut1D = HandleLUT1D(cachedFile->lut1D, fileInterp, fileInterpUsed); - auto lut3D = HandleLUT3D(cachedFile->lut3D, fileInterp, fileInterpUsed); + auto lut1D = HandleLUT1D(cachedFile->lut1D, fileInterp, fileInterpUsed); + auto lut3D = HandleLUT3D(cachedFile->lut3D, fileInterp, fileInterpUsed); if (!fileInterpUsed) { @@ -830,55 +818,55 @@ LocalFileFormat::buildFileOps(OpRcPtrVec & ops, switch (newDir) { - case TRANSFORM_DIR_FORWARD: - { - if (cachedFile->hdltype == "c") - { - CreateMinMaxOp(ops, cachedFile->from_min, cachedFile->from_max, newDir); - CreateLut1DOp(ops, lut1D, newDir); - } - else if (cachedFile->hdltype == "3d") - { - CreateLut3DOp(ops, lut3D, newDir); - } - else if (cachedFile->hdltype == "3d+1d") - { - CreateMinMaxOp(ops, cachedFile->from_min, cachedFile->from_max, newDir); - CreateLut1DOp(ops, lut1D, newDir); - CreateLut3DOp(ops, lut3D, newDir); - } - else - { - throw Exception("Unhandled hdltype while creating forward ops"); - } - break; - } - case TRANSFORM_DIR_INVERSE: - { - if (cachedFile->hdltype == "c") - { - CreateLut1DOp(ops, lut1D, newDir); - CreateMinMaxOp(ops, cachedFile->from_min, cachedFile->from_max, newDir); - } - else if (cachedFile->hdltype == "3d") - { - CreateLut3DOp(ops, lut3D, newDir); - } - else if (cachedFile->hdltype == "3d+1d") + case TRANSFORM_DIR_FORWARD: { - CreateLut3DOp(ops, lut3D, newDir); - CreateLut1DOp(ops, lut1D, newDir); - CreateMinMaxOp(ops, cachedFile->from_min, cachedFile->from_max, newDir); + if (cachedFile->hdltype == "c") + { + CreateMinMaxOp(ops, cachedFile->from_min, cachedFile->from_max, newDir); + CreateLut1DOp(ops, lut1D, newDir); + } + else if (cachedFile->hdltype == "3d") + { + CreateLut3DOp(ops, lut3D, newDir); + } + else if (cachedFile->hdltype == "3d+1d") + { + CreateMinMaxOp(ops, cachedFile->from_min, cachedFile->from_max, newDir); + CreateLut1DOp(ops, lut1D, newDir); + CreateLut3DOp(ops, lut3D, newDir); + } + else + { + throw Exception("Unhandled hdltype while creating forward ops"); + } + break; } - else + case TRANSFORM_DIR_INVERSE: { - throw Exception("Unhandled hdltype while creating reverse ops"); + if (cachedFile->hdltype == "c") + { + CreateLut1DOp(ops, lut1D, newDir); + CreateMinMaxOp(ops, cachedFile->from_min, cachedFile->from_max, newDir); + } + else if (cachedFile->hdltype == "3d") + { + CreateLut3DOp(ops, lut3D, newDir); + } + else if (cachedFile->hdltype == "3d+1d") + { + CreateLut3DOp(ops, lut3D, newDir); + CreateLut1DOp(ops, lut1D, newDir); + CreateMinMaxOp(ops, cachedFile->from_min, cachedFile->from_max, newDir); + } + else + { + throw Exception("Unhandled hdltype while creating reverse ops"); + } + break; } - break; - } } } -} +} // namespace FileFormat * CreateFileFormatHDL() { diff --git a/src/OpenColorIO/fileformats/FileFormatICC.cpp b/src/OpenColorIO/fileformats/FileFormatICC.cpp old mode 100755 new mode 100644 index 4768101129..67a99974dd --- a/src/OpenColorIO/fileformats/FileFormatICC.cpp +++ b/src/OpenColorIO/fileformats/FileFormatICC.cpp @@ -1,25 +1,23 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - -#include #include +#include #include #include #include "Logging.h" +#include "Platform.h" #include "fileformats/FileFormatUtils.h" #include "iccProfileReader.h" #include "ops/gamma/GammaOp.h" #include "ops/lut1d/Lut1DOp.h" #include "ops/matrix/MatrixOp.h" #include "ops/range/RangeOp.h" -#include "Platform.h" #include "transforms/FileTransform.h" - /* Support for ICC profiles. ICC color management is the de facto standard in areas such as printing @@ -37,17 +35,17 @@ namespace OCIO_NAMESPACE class LocalCachedFile : public CachedFile { public: - LocalCachedFile() = default; + LocalCachedFile() = default; ~LocalCachedFile() = default; // The profile description. std::string mProfileDescription; // Matrix part - double mMatrix44[16]{ 0.0 }; + double mMatrix44[16]{0.0}; // Gamma - float mGammaRGB[4]{ 1.0f }; + float mGammaRGB[4]{1.0f}; // 1D LUT Lut1DOpDataRcPtr lut; @@ -58,65 +56,60 @@ typedef OCIO_SHARED_PTR LocalCachedFileRcPtr; class LocalFileFormat : public FileFormat { public: - LocalFileFormat() = default; + LocalFileFormat() = default; ~LocalFileFormat() = default; void getFormatInfo(FormatInfoVec & formatInfoVec) const override; // Only reads the information data of the file. - static LocalCachedFileRcPtr ReadInfo(std::istream & istream, - const std::string & fileName, - SampleICC::IccContent & icc); - - CachedFileRcPtr read(std::istream & istream, - const std::string & fileName, - Interpolation interp) const override; - - void buildFileOps(OpRcPtrVec & ops, - const Config & config, - const ConstContextRcPtr & context, - CachedFileRcPtr untypedCachedFile, - const FileTransform & fileTransform, - TransformDirection dir) const override; - - bool isBinary() const override - { - return true; - } + static LocalCachedFileRcPtr + ReadInfo(std::istream & istream, const std::string & fileName, SampleICC::IccContent & icc); + + CachedFileRcPtr read(std::istream & istream, const std::string & fileName, Interpolation interp) + const override; + + void buildFileOps( + OpRcPtrVec & ops, + const Config & config, + const ConstContextRcPtr & context, + CachedFileRcPtr untypedCachedFile, + const FileTransform & fileTransform, + TransformDirection dir) const override; + + bool isBinary() const override { return true; } private: static void ThrowErrorMessage(const std::string & error, const std::string & fileName); - static void ValidateParametricCurve(icUInt16Number type, - icUInt16Number numParams, - const icS15Fixed16Number * params, - const std::string & fileName); - static float ApplyParametricCurve(float v, - icUInt16Number type, - const icS15Fixed16Number * params); + static void ValidateParametricCurve( + icUInt16Number type, + icUInt16Number numParams, + const icS15Fixed16Number * params, + const std::string & fileName); + static float + ApplyParametricCurve(float v, icUInt16Number type, const icS15Fixed16Number * params); }; void LocalFileFormat::getFormatInfo(FormatInfoVec & formatInfoVec) const { FormatInfo info; - info.name = "International Color Consortium profile"; - info.extension = "icc"; + info.name = "International Color Consortium profile"; + info.extension = "icc"; info.capabilities = FORMAT_CAPABILITY_READ; formatInfoVec.push_back(info); // .icm and .pf file extensions are also fine. - info.name = "Image Color Matching profile"; + info.name = "Image Color Matching profile"; info.extension = "icm"; formatInfoVec.push_back(info); - info.name = "ICC profile"; + info.name = "ICC profile"; info.extension = "pf"; formatInfoVec.push_back(info); } -void LocalFileFormat::ThrowErrorMessage(const std::string & error, - const std::string & fileName) +void LocalFileFormat::ThrowErrorMessage(const std::string & error, const std::string & fileName) { std::ostringstream os; os << "Error parsing .icc file ("; @@ -127,13 +120,13 @@ void LocalFileFormat::ThrowErrorMessage(const std::string & error, throw Exception(os.str().c_str()); } -LocalCachedFileRcPtr LocalFileFormat::ReadInfo(std::istream & istream, - const std::string & fileName, - SampleICC::IccContent & icc) +LocalCachedFileRcPtr LocalFileFormat::ReadInfo( + std::istream & istream, + const std::string & fileName, + SampleICC::IccContent & icc) { istream.seekg(0); - if (!istream.good() - || !SampleICC::Read32(istream, &icc.mHeader.size, 1) + if (!istream.good() || !SampleICC::Read32(istream, &icc.mHeader.size, 1) || !SampleICC::Read32(istream, &icc.mHeader.cmmId, 1) || !SampleICC::Read32(istream, &icc.mHeader.version, 1) || !SampleICC::Read32(istream, &icc.mHeader.deviceClass, 1) @@ -156,15 +149,10 @@ LocalCachedFileRcPtr LocalFileFormat::ReadInfo(std::istream & istream, || !SampleICC::Read32(istream, &icc.mHeader.illuminant.Y, 1) || !SampleICC::Read32(istream, &icc.mHeader.illuminant.Z, 1) || !SampleICC::Read32(istream, &icc.mHeader.creator, 1) - || (SampleICC::Read8(istream, - &icc.mHeader.profileID, - sizeof(icc.mHeader.profileID)) - != sizeof(icc.mHeader.profileID)) - || (SampleICC::Read8(istream, - &icc.mHeader.reserved[0], - sizeof(icc.mHeader.reserved)) - != sizeof(icc.mHeader.reserved)) - ) + || (SampleICC::Read8(istream, &icc.mHeader.profileID, sizeof(icc.mHeader.profileID)) + != sizeof(icc.mHeader.profileID)) + || (SampleICC::Read8(istream, &icc.mHeader.reserved[0], sizeof(icc.mHeader.reserved)) + != sizeof(icc.mHeader.reserved))) { ThrowErrorMessage("Error loading header.", fileName); } @@ -183,8 +171,8 @@ LocalCachedFileRcPtr LocalFileFormat::ReadInfo(std::istream & istream, icc.mTags.resize(count); - // Read Tag offset table. - for (i = 0; i(reader); + const SampleICC::IccTextDescriptionTypeReader * desc + = dynamic_cast(reader); if (desc) { cachedFile->mProfileDescription = desc->GetText(); @@ -231,8 +219,8 @@ LocalCachedFileRcPtr LocalFileFormat::ReadInfo(std::istream & istream, { // The profile description implementation is a list of localized unicode strings. But // the OCIO implementation only returns the english string. - const SampleICC::IccMultiLocalizedUnicodeTypeReader * desc = - dynamic_cast(reader); + const SampleICC::IccMultiLocalizedUnicodeTypeReader * desc + = dynamic_cast(reader); if (desc) { cachedFile->mProfileDescription = desc->GetText(); @@ -251,13 +239,13 @@ LocalCachedFileRcPtr LocalFileFormat::ReadInfo(std::istream & istream, // be monotonically non-decreasing (flat segments allowed). // More information can be found in: // https://www.color.org/whitepapers/ICC_White_Paper35-Use_of_the_parametricCurveType.pdf -void LocalFileFormat::ValidateParametricCurve(icUInt16Number type, - icUInt16Number numParams, - const icS15Fixed16Number * params, - const std::string & fileName) +void LocalFileFormat::ValidateParametricCurve( + icUInt16Number type, + icUInt16Number numParams, + const icS15Fixed16Number * params, + const std::string & fileName) { - auto ThrowParaError = [=](const std::string & msg) - { + auto ThrowParaError = [=](const std::string & msg) { std::ostringstream oss; oss << "Error parsing ICC Parametric Curve (with arguments "; for (int i = 0; i < numParams; ++i) @@ -272,8 +260,7 @@ void LocalFileFormat::ValidateParametricCurve(icUInt16Number type, ThrowErrorMessage(oss.str(), fileName); }; - auto LogParaWarning = [=](const std::string & msg) - { + auto LogParaWarning = [=](const std::string & msg) { std::ostringstream oss; oss << "Parsing .icc file ("; oss << fileName; @@ -291,19 +278,18 @@ void LocalFileFormat::ValidateParametricCurve(icUInt16Number type, LogWarning(oss.str()); }; - auto QuantizeF = [](float v, uint8_t bitdepth = 10) -> float - { + auto QuantizeF = [](float v, uint8_t bitdepth = 10) -> float { float maxVal = std::pow(2.f, static_cast(bitdepth)) - 1.f; return std::lround(v * maxVal) / maxVal; }; // Expected number of arguments const std::map NParamsPerType = { - {0 , 1}, - {1 , 3}, - {2 , 4}, - {3 , 5}, - {4 , 7}, + {0, 1}, + {1, 3}, + {2, 4}, + {3, 5}, + {4, 7}, }; if (NParamsPerType.count(type) == 0) @@ -356,11 +342,11 @@ void LocalFileFormat::ValidateParametricCurve(icUInt16Number type, const float d = SampleICC::icFtoD(params[4]); float lin_segment_break = QuantizeF(c * d); - float power_law_break = QuantizeF(std::pow(a * d + b, g)); + float power_law_break = QuantizeF(std::pow(a * d + b, g)); if (lin_segment_break > power_law_break) { - ThrowParaError( "Expecting no negative discontinuity at linear segment boundary."); + ThrowParaError("Expecting no negative discontinuity at linear segment boundary."); } } else if (type == 4) @@ -373,7 +359,7 @@ void LocalFileFormat::ValidateParametricCurve(icUInt16Number type, const float f = SampleICC::icFtoD(params[6]); float lin_segment_break = QuantizeF(c * d + f); - float power_law_break = QuantizeF(std::pow(a * d + b, g) + e); + float power_law_break = QuantizeF(std::pow(a * d + b, g) + e); if (lin_segment_break > power_law_break) { @@ -467,9 +453,10 @@ void LocalFileFormat::ValidateParametricCurve(icUInt16Number type, // Apply Parametric curve to a single float value. // ICC specify these functions shall clip any values outside [0.0, 1.0] range. -float LocalFileFormat::ApplyParametricCurve(float v, - icUInt16Number type, - const icS15Fixed16Number * params) +float LocalFileFormat::ApplyParametricCurve( + float v, + icUInt16Number type, + const icS15Fixed16Number * params) { v = std::min(std::max(0.0f, v), 1.0f); @@ -530,43 +517,43 @@ float LocalFileFormat::ApplyParametricCurve(float v, // Try and load the format // Raise an exception if it can't be loaded. -CachedFileRcPtr LocalFileFormat::read(std::istream & istream, - const std::string & fileName, - Interpolation /*interp*/) const +CachedFileRcPtr LocalFileFormat::read( + std::istream & istream, + const std::string & fileName, + Interpolation /*interp*/) const { SampleICC::IccContent icc; LocalCachedFileRcPtr cachedFile = ReadInfo(istream, fileName, icc); // Matrix part of the Matrix/TRC Model { - const SampleICC::IccXYZArrayTypeReader * red = - dynamic_cast( + const SampleICC::IccXYZArrayTypeReader * red + = dynamic_cast( icc.LoadTag(istream, icSigRedColorantTag)); - const SampleICC::IccXYZArrayTypeReader * green = - dynamic_cast( + const SampleICC::IccXYZArrayTypeReader * green + = dynamic_cast( icc.LoadTag(istream, icSigGreenColorantTag)); - const SampleICC::IccXYZArrayTypeReader * blue = - dynamic_cast( + const SampleICC::IccXYZArrayTypeReader * blue + = dynamic_cast( icc.LoadTag(istream, icSigBlueColorantTag)); if (!red || !green || !blue) { - ThrowErrorMessage("Illegal matrix tag in ICC profile.", - fileName); + ThrowErrorMessage("Illegal matrix tag in ICC profile.", fileName); } - cachedFile->mMatrix44[0] = (double)(*red).GetXYZ().X / 65536.0; - cachedFile->mMatrix44[1] = (double)(*green).GetXYZ().X / 65536.0; - cachedFile->mMatrix44[2] = (double)(*blue).GetXYZ().X / 65536.0; - cachedFile->mMatrix44[3] = 0.0; + cachedFile->mMatrix44[0] = (double)(*red).GetXYZ().X / 65536.0; + cachedFile->mMatrix44[1] = (double)(*green).GetXYZ().X / 65536.0; + cachedFile->mMatrix44[2] = (double)(*blue).GetXYZ().X / 65536.0; + cachedFile->mMatrix44[3] = 0.0; - cachedFile->mMatrix44[4] = (double)(*red).GetXYZ().Y / 65536.0; - cachedFile->mMatrix44[5] = (double)(*green).GetXYZ().Y / 65536.0; - cachedFile->mMatrix44[6] = (double)(*blue).GetXYZ().Y / 65536.0; - cachedFile->mMatrix44[7] = 0.0; + cachedFile->mMatrix44[4] = (double)(*red).GetXYZ().Y / 65536.0; + cachedFile->mMatrix44[5] = (double)(*green).GetXYZ().Y / 65536.0; + cachedFile->mMatrix44[6] = (double)(*blue).GetXYZ().Y / 65536.0; + cachedFile->mMatrix44[7] = 0.0; - cachedFile->mMatrix44[8] = (double)(*red).GetXYZ().Z / 65536.0; - cachedFile->mMatrix44[9] = (double)(*green).GetXYZ().Z / 65536.0; + cachedFile->mMatrix44[8] = (double)(*red).GetXYZ().Z / 65536.0; + cachedFile->mMatrix44[9] = (double)(*green).GetXYZ().Z / 65536.0; cachedFile->mMatrix44[10] = (double)(*blue).GetXYZ().Z / 65536.0; cachedFile->mMatrix44[11] = 0.0; @@ -585,8 +572,7 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, ThrowErrorMessage("Illegal curve tag in ICC profile.", fileName); } - static const std::string strSameType( - "All curves in the ICC profile must be of the same type."); + static const std::string strSameType("All curves in the ICC profile must be of the same type."); if (redTRC->IsParametricCurve()) { if (!greenTRC->IsParametricCurve() || !blueTRC->IsParametricCurve()) @@ -594,12 +580,12 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, ThrowErrorMessage(strSameType, fileName); } - const SampleICC::IccParametricCurveTypeReader * red = - dynamic_cast(redTRC); - const SampleICC::IccParametricCurveTypeReader * green = - dynamic_cast(greenTRC); - const SampleICC::IccParametricCurveTypeReader * blue = - dynamic_cast(blueTRC); + const SampleICC::IccParametricCurveTypeReader * red + = dynamic_cast(redTRC); + const SampleICC::IccParametricCurveTypeReader * green + = dynamic_cast(greenTRC); + const SampleICC::IccParametricCurveTypeReader * blue + = dynamic_cast(blueTRC); if (!red || !green || !blue) { @@ -614,18 +600,25 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, } ValidateParametricCurve( - red->GetFunctionType(), red->GetNumParam(), red->GetParam(), fileName); + red->GetFunctionType(), + red->GetNumParam(), + red->GetParam(), + fileName); ValidateParametricCurve( - green->GetFunctionType(), green->GetNumParam(), green->GetParam(), fileName); + green->GetFunctionType(), + green->GetNumParam(), + green->GetParam(), + fileName); ValidateParametricCurve( - blue->GetFunctionType(), blue->GetNumParam(), blue->GetParam(), fileName); + blue->GetFunctionType(), + blue->GetNumParam(), + blue->GetParam(), + fileName); // Handle type 0 with a GammaOp. if (red->GetFunctionType() == 0) { - if (red->GetNumParam() != 1 - || green->GetNumParam() != 1 - || blue->GetNumParam() != 1) + if (red->GetNumParam() != 1 || green->GetNumParam() != 1 || blue->GetNumParam() != 1) { ThrowErrorMessage( "Expecting 1 param in parametric curve tag (type 0) of ICC profile.", @@ -641,7 +634,7 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, else { const auto lutLength = 1024; - cachedFile->lut = std::make_shared(lutLength); + cachedFile->lut = std::make_shared(lutLength); cachedFile->lut->setFileOutputBitDepth(BIT_DEPTH_F32); auto & lutData = cachedFile->lut->getArray(); @@ -650,9 +643,12 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, { float v = i / (lutLength - 1.f); - lutData[i * 3 + 0] = ApplyParametricCurve(v, red->GetFunctionType(), red->GetParam()); - lutData[i * 3 + 1] = ApplyParametricCurve(v, green->GetFunctionType(), green->GetParam()); - lutData[i * 3 + 2] = ApplyParametricCurve(v, blue->GetFunctionType(), blue->GetParam()); + lutData[i * 3 + 0] + = ApplyParametricCurve(v, red->GetFunctionType(), red->GetParam()); + lutData[i * 3 + 1] + = ApplyParametricCurve(v, green->GetFunctionType(), green->GetParam()); + lutData[i * 3 + 2] + = ApplyParametricCurve(v, blue->GetFunctionType(), blue->GetParam()); } } } @@ -662,12 +658,12 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, { ThrowErrorMessage(strSameType, fileName); } - const SampleICC::IccCurveTypeReader * red = - dynamic_cast(redTRC); - const SampleICC::IccCurveTypeReader * green = - dynamic_cast(greenTRC); - const SampleICC::IccCurveTypeReader * blue = - dynamic_cast(blueTRC); + const SampleICC::IccCurveTypeReader * red + = dynamic_cast(redTRC); + const SampleICC::IccCurveTypeReader * green + = dynamic_cast(greenTRC); + const SampleICC::IccCurveTypeReader * blue + = dynamic_cast(blueTRC); if (!red || !green || !blue) { @@ -675,8 +671,7 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, } const size_t curveSize = red->GetCurve().size(); - if (green->GetCurve().size() != curveSize - || blue->GetCurve().size() != curveSize) + if (green->GetCurve().size() != curveSize || blue->GetCurve().size() != curveSize) { ThrowErrorMessage( "All curves in the ICC profile must be of the same length.", @@ -685,8 +680,7 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, if (0 == curveSize) { - ThrowErrorMessage("Curves with no values in ICC profile.", - fileName); + ThrowErrorMessage("Curves with no values in ICC profile.", fileName); } else if (1 == curveSize) { @@ -696,14 +690,10 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, // an unsigned fixed-point 8.8 number. // (But we want to multiply by 65535 to undo the normalization // applied by SampleICC) - cachedFile->mGammaRGB[0] = - red->GetCurve()[0] * 65535.0f / 256.0f; - cachedFile->mGammaRGB[1] = - green->GetCurve()[0] * 65535.0f / 256.0f; - cachedFile->mGammaRGB[2] = - blue->GetCurve()[0] * 65535.0f / 256.0f; + cachedFile->mGammaRGB[0] = red->GetCurve()[0] * 65535.0f / 256.0f; + cachedFile->mGammaRGB[1] = green->GetCurve()[0] * 65535.0f / 256.0f; + cachedFile->mGammaRGB[2] = blue->GetCurve()[0] * 65535.0f / 256.0f; cachedFile->mGammaRGB[3] = 1.0f; - } else { @@ -714,7 +704,7 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, // The LUT will be inverted to convert output-linear values // into values that may be sent to the display. const auto lutLength = static_cast(curveSize); - cachedFile->lut = std::make_shared(lutLength); + cachedFile->lut = std::make_shared(lutLength); const auto & rc = red->GetCurve(); const auto & gc = green->GetCurve(); @@ -738,16 +728,15 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, return cachedFile; } -void -LocalFileFormat::buildFileOps(OpRcPtrVec & ops, - const Config & /*config*/, - const ConstContextRcPtr & /*context*/, - CachedFileRcPtr untypedCachedFile, - const FileTransform & fileTransform, - TransformDirection dir) const +void LocalFileFormat::buildFileOps( + OpRcPtrVec & ops, + const Config & /*config*/, + const ConstContextRcPtr & /*context*/, + CachedFileRcPtr untypedCachedFile, + const FileTransform & fileTransform, + TransformDirection dir) const { - LocalCachedFileRcPtr cachedFile = - DynamicPtrCast(untypedCachedFile); + LocalCachedFileRcPtr cachedFile = DynamicPtrCast(untypedCachedFile); // This should never happen. if (!cachedFile) @@ -772,12 +761,14 @@ LocalFileFormat::buildFileOps(OpRcPtrVec & ops, // a D50 XYZ to a D65 XYZ. // In most cases, combining this with the matrix in the ICC profile // recovers what would be the actual matrix for a D65 native monitor. + // clang-format off static constexpr double D50_to_D65_m44[] = { 0.955509474537, -0.023074829492, 0.063312392987, 0.0, -0.028327238868, 1.00994465504, 0.021055592145, 0.0, 0.012329273379, -0.020536209966, 1.33072998567, 0.0, 0.0, 0.0, 0.0, 1.0 }; + // clang-format on const auto fileInterp = fileTransform.getInterpolation(); @@ -786,7 +777,7 @@ LocalFileFormat::buildFileOps(OpRcPtrVec & ops, if (cachedFile->lut) { bool fileInterpUsed = false; - lut = HandleLUT1D(cachedFile->lut, fileInterp, fileInterpUsed); + lut = HandleLUT1D(cachedFile->lut, fileInterp, fileInterpUsed); if (!fileInterpUsed) { @@ -804,76 +795,84 @@ LocalFileFormat::buildFileOps(OpRcPtrVec & ops, switch (newDir) { - case TRANSFORM_DIR_INVERSE: - { - // Monitor code value to CIE XYZ. - if (lut) - { - CreateLut1DOp(ops, lut, TRANSFORM_DIR_FORWARD); - } - else + case TRANSFORM_DIR_INVERSE: { - const GammaOpData::Params redParams = { cachedFile->mGammaRGB[0] }; - const GammaOpData::Params greenParams = { cachedFile->mGammaRGB[1] }; - const GammaOpData::Params blueParams = { cachedFile->mGammaRGB[2] }; - const GammaOpData::Params alphaParams = { cachedFile->mGammaRGB[3] }; - auto gamma = std::make_shared(GammaOpData::BASIC_FWD, - redParams, - greenParams, - blueParams, - alphaParams); - - // GammaOp will clamp at 0 so we don't do it in the RangeOp. - CreateRangeOp(ops, - RangeOpData::EmptyValue(), 1, - RangeOpData::EmptyValue(), 1, - TRANSFORM_DIR_FORWARD); - - CreateGammaOp(ops, gamma, TRANSFORM_DIR_FORWARD); - } - - CreateMatrixOp(ops, cachedFile->mMatrix44, TRANSFORM_DIR_FORWARD); - - CreateMatrixOp(ops, D50_to_D65_m44, TRANSFORM_DIR_FORWARD); - break; - } - case TRANSFORM_DIR_FORWARD: - { - // CIE XYZ to monitor code value. - - CreateMatrixOp(ops, D50_to_D65_m44, TRANSFORM_DIR_INVERSE); + // Monitor code value to CIE XYZ. + if (lut) + { + CreateLut1DOp(ops, lut, TRANSFORM_DIR_FORWARD); + } + else + { + const GammaOpData::Params redParams = {cachedFile->mGammaRGB[0]}; + const GammaOpData::Params greenParams = {cachedFile->mGammaRGB[1]}; + const GammaOpData::Params blueParams = {cachedFile->mGammaRGB[2]}; + const GammaOpData::Params alphaParams = {cachedFile->mGammaRGB[3]}; + auto gamma = std::make_shared( + GammaOpData::BASIC_FWD, + redParams, + greenParams, + blueParams, + alphaParams); + + // GammaOp will clamp at 0 so we don't do it in the RangeOp. + CreateRangeOp( + ops, + RangeOpData::EmptyValue(), + 1, + RangeOpData::EmptyValue(), + 1, + TRANSFORM_DIR_FORWARD); + + CreateGammaOp(ops, gamma, TRANSFORM_DIR_FORWARD); + } - // The ICC profile tags form a matrix that converts RGB to CIE XYZ. - // Invert since we are building a PCS -> device transform. - CreateMatrixOp(ops, cachedFile->mMatrix44, TRANSFORM_DIR_INVERSE); + CreateMatrixOp(ops, cachedFile->mMatrix44, TRANSFORM_DIR_FORWARD); - // The LUT / gamma stored in the ICC profile works in - // the gamma->linear direction. - if (lut) - { - CreateLut1DOp(ops, lut, TRANSFORM_DIR_INVERSE); + CreateMatrixOp(ops, D50_to_D65_m44, TRANSFORM_DIR_FORWARD); + break; } - else + case TRANSFORM_DIR_FORWARD: { - const GammaOpData::Params redParams = { cachedFile->mGammaRGB[0] }; - const GammaOpData::Params greenParams = { cachedFile->mGammaRGB[1] }; - const GammaOpData::Params blueParams = { cachedFile->mGammaRGB[2] }; - const GammaOpData::Params alphaParams = { cachedFile->mGammaRGB[3] }; - auto gamma = std::make_shared(GammaOpData::BASIC_REV, - redParams, - greenParams, - blueParams, - alphaParams); + // CIE XYZ to monitor code value. - CreateGammaOp(ops, gamma, TRANSFORM_DIR_FORWARD); + CreateMatrixOp(ops, D50_to_D65_m44, TRANSFORM_DIR_INVERSE); - CreateRangeOp(ops, - RangeOpData::EmptyValue(), 1, - RangeOpData::EmptyValue(), 1, - TRANSFORM_DIR_FORWARD); + // The ICC profile tags form a matrix that converts RGB to CIE XYZ. + // Invert since we are building a PCS -> device transform. + CreateMatrixOp(ops, cachedFile->mMatrix44, TRANSFORM_DIR_INVERSE); + + // The LUT / gamma stored in the ICC profile works in + // the gamma->linear direction. + if (lut) + { + CreateLut1DOp(ops, lut, TRANSFORM_DIR_INVERSE); + } + else + { + const GammaOpData::Params redParams = {cachedFile->mGammaRGB[0]}; + const GammaOpData::Params greenParams = {cachedFile->mGammaRGB[1]}; + const GammaOpData::Params blueParams = {cachedFile->mGammaRGB[2]}; + const GammaOpData::Params alphaParams = {cachedFile->mGammaRGB[3]}; + auto gamma = std::make_shared( + GammaOpData::BASIC_REV, + redParams, + greenParams, + blueParams, + alphaParams); + + CreateGammaOp(ops, gamma, TRANSFORM_DIR_FORWARD); + + CreateRangeOp( + ops, + RangeOpData::EmptyValue(), + 1, + RangeOpData::EmptyValue(), + 1, + TRANSFORM_DIR_FORWARD); + } + break; } - break; - } } } @@ -884,7 +883,8 @@ FileFormat * CreateFileFormatICC() std::string GetProfileDescriptionFromICCProfile(const char * ICCProfileFilepath) { - std::ifstream filestream = Platform::CreateInputFileStream(ICCProfileFilepath, std::ios_base::binary); + std::ifstream filestream + = Platform::CreateInputFileStream(ICCProfileFilepath, std::ios_base::binary); if (!filestream.good()) { std::ostringstream os; diff --git a/src/OpenColorIO/fileformats/FileFormatICC.h b/src/OpenColorIO/fileformats/FileFormatICC.h index 9e120db8f7..38109e75ca 100644 --- a/src/OpenColorIO/fileformats/FileFormatICC.h +++ b/src/OpenColorIO/fileformats/FileFormatICC.h @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_FILE_FORMAT_ICC_H #define INCLUDED_OCIO_FILE_FORMAT_ICC_H @@ -9,7 +8,6 @@ #include - namespace OCIO_NAMESPACE { diff --git a/src/OpenColorIO/fileformats/FileFormatIridasCube.cpp b/src/OpenColorIO/fileformats/FileFormatIridasCube.cpp old mode 100755 new mode 100644 index aa00f7febc..7370e1227c --- a/src/OpenColorIO/fileformats/FileFormatIridasCube.cpp +++ b/src/OpenColorIO/fileformats/FileFormatIridasCube.cpp @@ -8,16 +8,15 @@ #include +#include "BakingUtils.h" +#include "ParseUtils.h" #include "fileformats/FileFormatUtils.h" #include "ops/lut1d/Lut1DOp.h" #include "ops/lut3d/Lut3DOp.h" #include "ops/matrix/MatrixOp.h" -#include "BakingUtils.h" -#include "ParseUtils.h" #include "transforms/FileTransform.h" -#include "utils/StringUtils.h" #include "utils/NumberUtils.h" - +#include "utils/StringUtils.h" /* @@ -66,7 +65,6 @@ DOMAIN_MAX 1.0 1.0 1.0 */ - namespace OCIO_NAMESPACE { namespace @@ -74,54 +72,52 @@ namespace class LocalCachedFile : public CachedFile { public: - LocalCachedFile() = default; + LocalCachedFile() = default; ~LocalCachedFile() = default; Lut1DOpDataRcPtr lut1D; Lut3DOpDataRcPtr lut3D; - float domain_min[3]{ 0.0f, 0.0f, 0.0f }; - float domain_max[3]{ 1.0f, 1.0f, 1.0f }; + float domain_min[3]{0.0f, 0.0f, 0.0f}; + float domain_max[3]{1.0f, 1.0f, 1.0f}; }; typedef OCIO_SHARED_PTR LocalCachedFileRcPtr; - - class LocalFileFormat : public FileFormat { public: - - LocalFileFormat() = default; + LocalFileFormat() = default; ~LocalFileFormat() = default; void getFormatInfo(FormatInfoVec & formatInfoVec) const override; - CachedFileRcPtr read(std::istream & istream, - const std::string & fileName, - Interpolation interp) const override; - - void bake(const Baker & baker, - const std::string & formatName, - std::ostream & ostream) const override; - - void buildFileOps(OpRcPtrVec & ops, - const Config & config, - const ConstContextRcPtr & context, - CachedFileRcPtr untypedCachedFile, - const FileTransform & fileTransform, - TransformDirection dir) const override; - + CachedFileRcPtr read(std::istream & istream, const std::string & fileName, Interpolation interp) + const override; + + void bake(const Baker & baker, const std::string & formatName, std::ostream & ostream) + const override; + + void buildFileOps( + OpRcPtrVec & ops, + const Config & config, + const ConstContextRcPtr & context, + CachedFileRcPtr untypedCachedFile, + const FileTransform & fileTransform, + TransformDirection dir) const override; + private: - static void ThrowErrorMessage(const std::string & error, - const std::string & fileName, - int line, - const std::string & lineContent); + static void ThrowErrorMessage( + const std::string & error, + const std::string & fileName, + int line, + const std::string & lineContent); }; -void LocalFileFormat::ThrowErrorMessage(const std::string & error, - const std::string & fileName, - int line, - const std::string & lineContent) +void LocalFileFormat::ThrowErrorMessage( + const std::string & error, + const std::string & fileName, + int line, + const std::string & lineContent) { std::ostringstream os; os << "Error parsing Iridas .cube file ("; @@ -140,22 +136,22 @@ void LocalFileFormat::ThrowErrorMessage(const std::string & error, void LocalFileFormat::getFormatInfo(FormatInfoVec & formatInfoVec) const { FormatInfo info; - info.name = "iridas_cube"; - info.extension = "cube"; - info.capabilities = FormatCapabilityFlags(FORMAT_CAPABILITY_READ | FORMAT_CAPABILITY_BAKE); + info.name = "iridas_cube"; + info.extension = "cube"; + info.capabilities = FormatCapabilityFlags(FORMAT_CAPABILITY_READ | FORMAT_CAPABILITY_BAKE); info.bake_capabilities = FormatBakeFlags(FORMAT_BAKE_CAPABILITY_3DLUT); formatInfoVec.push_back(info); } -CachedFileRcPtr -LocalFileFormat::read(std::istream & istream, - const std::string & fileName, - Interpolation interp) const +CachedFileRcPtr LocalFileFormat::read( + std::istream & istream, + const std::string & fileName, + Interpolation interp) const { // this shouldn't happen - if(!istream) + if (!istream) { - throw Exception ("File stream empty when trying to read Iridas .cube LUT"); + throw Exception("File stream empty when trying to read Iridas .cube LUT"); } // Parse the file @@ -167,8 +163,8 @@ LocalFileFormat::read(std::istream & istream, bool in1d = false; bool in3d = false; - float domain_min[] = { 0.0f, 0.0f, 0.0f }; - float domain_max[] = { 1.0f, 1.0f, 1.0f }; + float domain_min[] = {0.0f, 0.0f, 0.0f}; + float domain_max[] = {1.0f, 1.0f, 1.0f}; { std::string line; @@ -176,15 +172,17 @@ LocalFileFormat::read(std::istream & istream, char endTok; bool entriesStarted = false; - while(!entriesStarted && nextline(istream, line)) + while (!entriesStarted && nextline(istream, line)) { ++lineNumber; // All lines starting with '#' are comments - if (StringUtils::StartsWith(line,"#")) continue; + if (StringUtils::StartsWith(line, "#")) + continue; line = StringUtils::Lower(StringUtils::Trim(line)); - if (line.empty()) continue; + if (line.empty()) + continue; if (StringUtils::StartsWith(line, "title")) { @@ -198,23 +196,15 @@ LocalFileFormat::read(std::istream & istream, if (sscanf(line.c_str(), "lut_1d_size %d %c", &size1d, &endTok) != 1) #endif { - ThrowErrorMessage( - "Malformed 'LUT_1D_SIZE' tag.", - fileName, - lineNumber, - line); + ThrowErrorMessage("Malformed 'LUT_1D_SIZE' tag.", fileName, lineNumber, line); } - raw.reserve(3*size1d); + raw.reserve(3 * size1d); in1d = true; } else if (StringUtils::StartsWith(line, "lut_2d_size")) { - ThrowErrorMessage( - "Unsupported tag: 'LUT_2D_SIZE'.", - fileName, - lineNumber, - line); + ThrowErrorMessage("Unsupported tag: 'LUT_2D_SIZE'.", fileName, lineNumber, line); } else if (StringUtils::StartsWith(line, "lut_3d_size")) { @@ -224,14 +214,10 @@ LocalFileFormat::read(std::istream & istream, if (sscanf(line.c_str(), "lut_3d_size %d %c", &size3d, &endTok) != 1) #endif { - ThrowErrorMessage( - "Malformed 'LUT_3D_SIZE' tag.", - fileName, - lineNumber, - line); + ThrowErrorMessage("Malformed 'LUT_3D_SIZE' tag.", fileName, lineNumber, line); } - raw.reserve(3*size3d*size3d*size3d); + raw.reserve(3 * size3d * size3d * size3d); in3d = true; } else if (StringUtils::StartsWith(line, "domain_min")) @@ -241,30 +227,44 @@ LocalFileFormat::read(std::istream & istream, char domainMinB[64] = ""; #ifdef _WIN32 - if (sscanf_s(line.c_str(), "domain_min %s %s %s %c", domainMinR, 64, domainMinG, 64, domainMinB, 64, &endTok, 1) != 3) + if (sscanf_s( + line.c_str(), + "domain_min %s %s %s %c", + domainMinR, + 64, + domainMinG, + 64, + domainMinB, + 64, + &endTok, + 1) + != 3) #else - if (sscanf(line.c_str(), "domain_min %s %s %s %c", domainMinR, domainMinG, domainMinB, &endTok) != 3) + if (sscanf( + line.c_str(), + "domain_min %s %s %s %c", + domainMinR, + domainMinG, + domainMinB, + &endTok) + != 3) #endif { - ThrowErrorMessage( - "Malformed 'DOMAIN_MIN' tag.", - fileName, - lineNumber, - line); + ThrowErrorMessage("Malformed 'DOMAIN_MIN' tag.", fileName, lineNumber, line); } else { - const auto fromMinRAnswer = NumberUtils::from_chars(domainMinR, domainMinR + 64, domain_min[0]); - const auto fromMinGAnswer = NumberUtils::from_chars(domainMinG, domainMinG + 64, domain_min[1]); - const auto fromMinBAnswer = NumberUtils::from_chars(domainMinB, domainMinB + 64, domain_min[2]); - - if (fromMinRAnswer.ec != std::errc() || fromMinGAnswer.ec != std::errc() || fromMinBAnswer.ec != std::errc()) + const auto fromMinRAnswer + = NumberUtils::from_chars(domainMinR, domainMinR + 64, domain_min[0]); + const auto fromMinGAnswer + = NumberUtils::from_chars(domainMinG, domainMinG + 64, domain_min[1]); + const auto fromMinBAnswer + = NumberUtils::from_chars(domainMinB, domainMinB + 64, domain_min[2]); + + if (fromMinRAnswer.ec != std::errc() || fromMinGAnswer.ec != std::errc() + || fromMinBAnswer.ec != std::errc()) { - ThrowErrorMessage( - "Invalid 'DOMAIN_MIN' Tag", - fileName, - lineNumber, - line); + ThrowErrorMessage("Invalid 'DOMAIN_MIN' Tag", fileName, lineNumber, line); } } } @@ -275,30 +275,44 @@ LocalFileFormat::read(std::istream & istream, char domainMaxB[64] = ""; #ifdef _WIN32 - if (sscanf_s(line.c_str(), "domain_max %s %s %s %c", domainMaxR, 64, domainMaxG, 64, domainMaxB, 64, &endTok, 1) != 3) + if (sscanf_s( + line.c_str(), + "domain_max %s %s %s %c", + domainMaxR, + 64, + domainMaxG, + 64, + domainMaxB, + 64, + &endTok, + 1) + != 3) #else - if (sscanf(line.c_str(), "domain_max %s %s %s %c", domainMaxR, domainMaxG, domainMaxB, &endTok) != 3) + if (sscanf( + line.c_str(), + "domain_max %s %s %s %c", + domainMaxR, + domainMaxG, + domainMaxB, + &endTok) + != 3) #endif { - ThrowErrorMessage( - "Malformed 'DOMAIN_MAX' tag.", - fileName, - lineNumber, - line); + ThrowErrorMessage("Malformed 'DOMAIN_MAX' tag.", fileName, lineNumber, line); } else { - const auto fromMaxRAnswer = NumberUtils::from_chars(domainMaxR, domainMaxR + 64, domain_max[0]); - const auto fromMaxGAnswer = NumberUtils::from_chars(domainMaxG, domainMaxG + 64, domain_max[1]); - const auto fromMaxBAnswer = NumberUtils::from_chars(domainMaxB, domainMaxB + 64, domain_max[2]); - - if (fromMaxRAnswer.ec != std::errc() || fromMaxGAnswer.ec != std::errc() || fromMaxBAnswer.ec != std::errc()) + const auto fromMaxRAnswer + = NumberUtils::from_chars(domainMaxR, domainMaxR + 64, domain_max[0]); + const auto fromMaxGAnswer + = NumberUtils::from_chars(domainMaxG, domainMaxG + 64, domain_max[1]); + const auto fromMaxBAnswer + = NumberUtils::from_chars(domainMaxB, domainMaxB + 64, domain_max[2]); + + if (fromMaxRAnswer.ec != std::errc() || fromMaxGAnswer.ec != std::errc() + || fromMaxBAnswer.ec != std::errc()) { - ThrowErrorMessage( - "Invalid 'DOMAIN_MAX' Tag", - fileName, - lineNumber, - line); + ThrowErrorMessage("Invalid 'DOMAIN_MAX' Tag", fileName, lineNumber, line); } } } @@ -313,26 +327,25 @@ LocalFileFormat::read(std::istream & istream, line = StringUtils::Trim(line); // All lines starting with '#' are comments - if (StringUtils::StartsWith(line,"#")) continue; + if (StringUtils::StartsWith(line, "#")) + continue; - if (line.empty()) continue; + if (line.empty()) + continue; char valR[64] = ""; char valG[64] = ""; char valB[64] = ""; #ifdef _WIN32 - if (sscanf_s(line.c_str(), "%s %s %s %c", valR, 64, valG, 64, valB, 64, &endTok, 1) != 3) + if (sscanf_s(line.c_str(), "%s %s %s %c", valR, 64, valG, 64, valB, 64, &endTok, 1) + != 3) #else if (sscanf(line.c_str(), "%s %s %s %c", valR, valG, valB, &endTok) != 3) #endif { // It must be a float triple! - ThrowErrorMessage( - "Malformed color triples specified.", - fileName, - lineNumber, - line); + ThrowErrorMessage("Malformed color triples specified.", fileName, lineNumber, line); } else { @@ -344,13 +357,10 @@ LocalFileFormat::read(std::istream & istream, const auto gAnswer = NumberUtils::from_chars(valG, valG + 64, g); const auto bAnswer = NumberUtils::from_chars(valB, valB + 64, b); - if (rAnswer.ec != std::errc() || gAnswer.ec != std::errc() || bAnswer.ec != std::errc()) + if (rAnswer.ec != std::errc() || gAnswer.ec != std::errc() + || bAnswer.ec != std::errc()) { - ThrowErrorMessage( - "Invalid color triples", - fileName, - lineNumber, - line); + ThrowErrorMessage("Invalid color triples", fileName, lineNumber, line); } raw.push_back(r); @@ -367,27 +377,25 @@ LocalFileFormat::read(std::istream & istream, LocalCachedFileRcPtr cachedFile = LocalCachedFileRcPtr(new LocalCachedFile()); - if(in1d) + if (in1d) { - if(size1d != static_cast(raw.size()/3)) + if (size1d != static_cast(raw.size() / 3)) { std::ostringstream os; os << "Incorrect number of lut1d entries. "; os << "Found " << raw.size() / 3; os << ", expected " << size1d << "."; - ThrowErrorMessage( - os.str().c_str(), - fileName, -1, ""); + ThrowErrorMessage(os.str().c_str(), fileName, -1, ""); } // Reformat 1D data - if(size1d>0) + if (size1d > 0) { memcpy(cachedFile->domain_min, domain_min, 3 * sizeof(float)); memcpy(cachedFile->domain_max, domain_max, 3 * sizeof(float)); const auto lutLenght = static_cast(size1d); - cachedFile->lut1D = std::make_shared(lutLenght); + cachedFile->lut1D = std::make_shared(lutLenght); if (Lut1DOpData::IsValidInterpolation(interp)) { cachedFile->lut1D->setInterpolation(interp); @@ -398,29 +406,26 @@ LocalFileFormat::read(std::istream & istream, auto & lutArray = cachedFile->lut1D->getArray(); const auto numVals = lutArray.getNumValues(); - for(unsigned long i = 0; i < numVals; ++i) + for (unsigned long i = 0; i < numVals; ++i) { lutArray[i] = raw[i]; } } } - else if(in3d) + else if (in3d) { - if(size3d*size3d*size3d - != static_cast(raw.size()/3)) + if (size3d * size3d * size3d != static_cast(raw.size() / 3)) { std::ostringstream os; os << "Incorrect number of 3D LUT entries. "; os << "Found " << raw.size() / 3 << ", expected "; os << size3d * size3d * size3d << "."; - ThrowErrorMessage( - os.str().c_str(), - fileName, -1, ""); + ThrowErrorMessage(os.str().c_str(), fileName, -1, ""); } // Reformat 3D data - memcpy(cachedFile->domain_min, domain_min, 3*sizeof(float)); - memcpy(cachedFile->domain_max, domain_max, 3*sizeof(float)); + memcpy(cachedFile->domain_min, domain_min, 3 * sizeof(float)); + memcpy(cachedFile->domain_max, domain_max, 3 * sizeof(float)); cachedFile->lut3D = std::make_shared(size3d); if (Lut3DOpData::IsValidInterpolation(interp)) { @@ -431,22 +436,21 @@ LocalFileFormat::read(std::istream & istream, } else { - ThrowErrorMessage( - "LUT type (1D/3D) unspecified.", - fileName, -1, ""); + ThrowErrorMessage("LUT type (1D/3D) unspecified.", fileName, -1, ""); } return cachedFile; } -void LocalFileFormat::bake(const Baker & baker, - const std::string & formatName, - std::ostream & ostream) const +void LocalFileFormat::bake( + const Baker & baker, + const std::string & formatName, + std::ostream & ostream) const { static const int DEFAULT_CUBE_SIZE = 32; - if(formatName != "iridas_cube") + if (formatName != "iridas_cube") { std::ostringstream os; os << "Unknown cube format name, '"; @@ -457,18 +461,19 @@ void LocalFileFormat::bake(const Baker & baker, ConstConfigRcPtr config = baker.getConfig(); int cubeSize = baker.getCubeSize(); - if(cubeSize==-1) cubeSize = DEFAULT_CUBE_SIZE; + if (cubeSize == -1) + cubeSize = DEFAULT_CUBE_SIZE; cubeSize = std::max(2, cubeSize); // smallest cube is 2x2x2 std::vector cubeData; - cubeData.resize(cubeSize*cubeSize*cubeSize*3); + cubeData.resize(cubeSize * cubeSize * cubeSize * 3); GenerateIdentityLut3D(&cubeData[0], cubeSize, 3, LUT3DORDER_FAST_RED); - PackedImageDesc cubeImg(&cubeData[0], cubeSize*cubeSize*cubeSize, 1, 3); + PackedImageDesc cubeImg(&cubeData[0], cubeSize * cubeSize * cubeSize, 1, 3); ConstCPUProcessorRcPtr inputToTarget = GetInputToTargetProcessor(baker); inputToTarget->apply(cubeImg); const auto & metadata = baker.getFormatMetadata(); - const auto nb = metadata.getNumChildrenElements(); + const auto nb = metadata.getNumChildrenElements(); for (int i = 0; i < nb; ++i) { const auto & child = metadata.getChildElement(i); @@ -484,26 +489,25 @@ void LocalFileFormat::bake(const Baker & baker, // Set to a fixed 6 decimal precision ostream.setf(std::ios::fixed, std::ios::floatfield); ostream.precision(6); - for(int i=0; i(untypedCachedFile); // This should never happen. - if(!cachedFile || (!cachedFile->lut1D && !cachedFile->lut3D)) + if (!cachedFile || (!cachedFile->lut1D && !cachedFile->lut3D)) { std::ostringstream os; os << "Cannot build Iridas .cube Op. Invalid cache type."; @@ -515,48 +519,54 @@ LocalFileFormat::buildFileOps(OpRcPtrVec & ops, const auto fileInterp = fileTransform.getInterpolation(); bool fileInterpUsed = false; - auto lut1D = HandleLUT1D(cachedFile->lut1D, fileInterp, fileInterpUsed); - auto lut3D = HandleLUT3D(cachedFile->lut3D, fileInterp, fileInterpUsed); + auto lut1D = HandleLUT1D(cachedFile->lut1D, fileInterp, fileInterpUsed); + auto lut3D = HandleLUT3D(cachedFile->lut3D, fileInterp, fileInterpUsed); if (!fileInterpUsed) { LogWarningInterpolationNotUsed(fileInterp, fileTransform); } - const double dmin[]{ cachedFile->domain_min[0], cachedFile->domain_min[1], cachedFile->domain_min[2] }; - const double dmax[]{ cachedFile->domain_max[0], cachedFile->domain_max[1], cachedFile->domain_max[2] }; + const double dmin[]{ + cachedFile->domain_min[0], + cachedFile->domain_min[1], + cachedFile->domain_min[2]}; + const double dmax[]{ + cachedFile->domain_max[0], + cachedFile->domain_max[1], + cachedFile->domain_max[2]}; switch (newDir) { - case TRANSFORM_DIR_FORWARD: - { - CreateMinMaxOp(ops, dmin, dmax, newDir); - if(lut1D) + case TRANSFORM_DIR_FORWARD: { - CreateLut1DOp(ops, lut1D, newDir); - } - else if(lut3D) - { - CreateLut3DOp(ops, lut3D, newDir); - } - break; - } - case TRANSFORM_DIR_INVERSE: - { - if(lut3D) - { - CreateLut3DOp(ops, lut3D, newDir); + CreateMinMaxOp(ops, dmin, dmax, newDir); + if (lut1D) + { + CreateLut1DOp(ops, lut1D, newDir); + } + else if (lut3D) + { + CreateLut3DOp(ops, lut3D, newDir); + } + break; } - else if(lut1D) + case TRANSFORM_DIR_INVERSE: { - CreateLut1DOp(ops, lut1D, newDir); + if (lut3D) + { + CreateLut3DOp(ops, lut3D, newDir); + } + else if (lut1D) + { + CreateLut1DOp(ops, lut1D, newDir); + } + CreateMinMaxOp(ops, dmin, dmax, newDir); + break; } - CreateMinMaxOp(ops, dmin, dmax, newDir); - break; } - } -} } +} // namespace FileFormat * CreateFileFormatIridasCube() { diff --git a/src/OpenColorIO/fileformats/FileFormatIridasItx.cpp b/src/OpenColorIO/fileformats/FileFormatIridasItx.cpp old mode 100755 new mode 100644 index be903d5d33..378fcfa01d --- a/src/OpenColorIO/fileformats/FileFormatIridasItx.cpp +++ b/src/OpenColorIO/fileformats/FileFormatIridasItx.cpp @@ -1,22 +1,21 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. +#include #include #include #include -#include #include +#include "BakingUtils.h" +#include "ParseUtils.h" #include "fileformats/FileFormatUtils.h" #include "ops/lut1d/Lut1DOp.h" #include "ops/lut3d/Lut3DOp.h" -#include "BakingUtils.h" -#include "ParseUtils.h" #include "transforms/FileTransform.h" #include "utils/StringUtils.h" - /* Iridas itx format @@ -42,7 +41,6 @@ LUT_3D_SIZE M 1.0 1.0 1.0 */ - namespace OCIO_NAMESPACE { namespace @@ -50,7 +48,7 @@ namespace class LocalCachedFile : public CachedFile { public: - LocalCachedFile() = default; + LocalCachedFile() = default; ~LocalCachedFile() = default; Lut3DOpDataRcPtr lut3D; @@ -58,40 +56,38 @@ class LocalCachedFile : public CachedFile typedef OCIO_SHARED_PTR LocalCachedFileRcPtr; - - class LocalFileFormat : public FileFormat { public: - - LocalFileFormat() = default; + LocalFileFormat() = default; ~LocalFileFormat() = default; void getFormatInfo(FormatInfoVec & formatInfoVec) const override; - CachedFileRcPtr read(std::istream & istream, - const std::string & fileName, - Interpolation interp) const override; + CachedFileRcPtr read(std::istream & istream, const std::string & fileName, Interpolation interp) + const override; - void bake(const Baker & baker, - const std::string & formatName, - std::ostream & ostream) const override; + void bake(const Baker & baker, const std::string & formatName, std::ostream & ostream) + const override; - void buildFileOps(OpRcPtrVec & ops, - const Config & config, - const ConstContextRcPtr & context, - CachedFileRcPtr untypedCachedFile, - const FileTransform & fileTransform, - TransformDirection dir) const override; + void buildFileOps( + OpRcPtrVec & ops, + const Config & config, + const ConstContextRcPtr & context, + CachedFileRcPtr untypedCachedFile, + const FileTransform & fileTransform, + TransformDirection dir) const override; private: - static void ThrowErrorMessage(const std::string & error, + static void ThrowErrorMessage( + const std::string & error, const std::string & fileName, int line, const std::string & lineContent); }; -void LocalFileFormat::ThrowErrorMessage(const std::string & error, +void LocalFileFormat::ThrowErrorMessage( + const std::string & error, const std::string & fileName, int line, const std::string & lineContent) @@ -113,28 +109,29 @@ void LocalFileFormat::ThrowErrorMessage(const std::string & error, void LocalFileFormat::getFormatInfo(FormatInfoVec & formatInfoVec) const { FormatInfo info; - info.name = "iridas_itx"; - info.extension = "itx"; - info.capabilities = FormatCapabilityFlags(FORMAT_CAPABILITY_READ | FORMAT_CAPABILITY_BAKE); + info.name = "iridas_itx"; + info.extension = "itx"; + info.capabilities = FormatCapabilityFlags(FORMAT_CAPABILITY_READ | FORMAT_CAPABILITY_BAKE); info.bake_capabilities = FormatBakeFlags(FORMAT_BAKE_CAPABILITY_3DLUT); formatInfoVec.push_back(info); } -CachedFileRcPtr LocalFileFormat::read(std::istream & istream, - const std::string & fileName, - Interpolation interp) const +CachedFileRcPtr LocalFileFormat::read( + std::istream & istream, + const std::string & fileName, + Interpolation interp) const { // this shouldn't happen - if(!istream) + if (!istream) { - throw Exception ("File stream empty when trying to read Iridas .itx LUT"); + throw Exception("File stream empty when trying to read Iridas .itx LUT"); } // Parse the file std::vector raw; int size3d = 0; - bool in3d = false; + bool in3d = false; { std::string line; @@ -142,40 +139,36 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, std::vector tmpfloats; int lineNumber = 0; - while(nextline(istream, line)) + while (nextline(istream, line)) { ++lineNumber; // All lines starting with '#' are comments - if(StringUtils::StartsWith(line,"#")) continue; + if (StringUtils::StartsWith(line, "#")) + continue; // Strip, lowercase, and split the line parts = StringUtils::SplitByWhiteSpaces(StringUtils::Lower(StringUtils::Trim(line))); - if(parts.empty()) continue; + if (parts.empty()) + continue; - if(StringUtils::Lower(parts[0]) == "lut_3d_size") + if (StringUtils::Lower(parts[0]) == "lut_3d_size") { int size = 0; - if(parts.size() != 2 - || !StringToInt( &size, parts[1].c_str())) + if (parts.size() != 2 || !StringToInt(&size, parts[1].c_str())) { - ThrowErrorMessage( - "Malformed LUT_3D_SIZE tag.", - fileName, - lineNumber, - line); + ThrowErrorMessage("Malformed LUT_3D_SIZE tag.", fileName, lineNumber, line); } size3d = size; - raw.reserve(3*size3d * size3d * size3d); + raw.reserve(3 * size3d * size3d * size3d); in3d = true; } - else if(in3d) + else if (in3d) { // It must be a float triple! - if(!StringVecToFloatVec(tmpfloats, parts) - || tmpfloats.size() != 3) + if (!StringVecToFloatVec(tmpfloats, parts) || tmpfloats.size() != 3) { ThrowErrorMessage( "Malformed color triples specified.", @@ -184,7 +177,7 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, line); } - for(int i=0; i<3; ++i) + for (int i = 0; i < 3; ++i) { raw.push_back(tmpfloats[i]); } @@ -193,21 +186,17 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, } // Interpret the parsed data, validate LUT sizes - LocalCachedFileRcPtr cachedFile - = LocalCachedFileRcPtr(new LocalCachedFile()); + LocalCachedFileRcPtr cachedFile = LocalCachedFileRcPtr(new LocalCachedFile()); - if(in3d) + if (in3d) { - if(size3d * size3d * size3d - != static_cast(raw.size()/3)) + if (size3d * size3d * size3d != static_cast(raw.size() / 3)) { std::ostringstream os; os << "Incorrect number of 3D LUT entries. "; os << "Found " << raw.size() / 3 << ", expected "; os << size3d * size3d * size3d << "."; - ThrowErrorMessage( - os.str().c_str(), - fileName, -1, ""); + ThrowErrorMessage(os.str().c_str(), fileName, -1, ""); } // Reformat 3D data @@ -222,21 +211,20 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, } else { - ThrowErrorMessage( - "No 3D LUT found.", - fileName, -1, ""); + ThrowErrorMessage("No 3D LUT found.", fileName, -1, ""); } return cachedFile; } -void LocalFileFormat::bake(const Baker & baker, - const std::string & formatName, - std::ostream & ostream) const +void LocalFileFormat::bake( + const Baker & baker, + const std::string & formatName, + std::ostream & ostream) const { int DEFAULT_CUBE_SIZE = 64; - if(formatName != "iridas_itx") + if (formatName != "iridas_itx") { std::ostringstream os; os << "Unknown 3dl format name, '"; @@ -247,13 +235,14 @@ void LocalFileFormat::bake(const Baker & baker, ConstConfigRcPtr config = baker.getConfig(); int cubeSize = baker.getCubeSize(); - if(cubeSize==-1) cubeSize = DEFAULT_CUBE_SIZE; + if (cubeSize == -1) + cubeSize = DEFAULT_CUBE_SIZE; cubeSize = std::max(2, cubeSize); // smallest cube is 2x2x2 std::vector cubeData; - cubeData.resize(cubeSize*cubeSize*cubeSize*3); + cubeData.resize(cubeSize * cubeSize * cubeSize * 3); GenerateIdentityLut3D(&cubeData[0], cubeSize, 3, LUT3DORDER_FAST_RED); - PackedImageDesc cubeImg(&cubeData[0], cubeSize*cubeSize*cubeSize, 1, 3); + PackedImageDesc cubeImg(&cubeData[0], cubeSize * cubeSize * cubeSize, 1, 3); // Apply our conversion from the input space to the output space. ConstCPUProcessorRcPtr inputToTarget = GetInputToTargetProcessor(baker); @@ -264,7 +253,7 @@ void LocalFileFormat::bake(const Baker & baker, // not utilize the shaper or output any metadata ostream << "LUT_3D_SIZE " << cubeSize << "\n"; - if(cubeSize < 2) + if (cubeSize < 2) { throw Exception("Internal cube size exception."); } @@ -272,29 +261,28 @@ void LocalFileFormat::bake(const Baker & baker, // Set to a fixed 6 decimal precision ostream.setf(std::ios::fixed, std::ios::floatfield); ostream.precision(6); - for(int i=0; i(untypedCachedFile); // This should never happen. - if(!cachedFile || !cachedFile->lut3D) + if (!cachedFile || !cachedFile->lut3D) { std::ostringstream os; os << "Cannot build Iridas .itx Op. Invalid cache type."; @@ -306,7 +294,7 @@ LocalFileFormat::buildFileOps(OpRcPtrVec & ops, const auto fileInterp = fileTransform.getInterpolation(); bool fileInterpUsed = false; - auto lut3D = HandleLUT3D(cachedFile->lut3D, fileInterp, fileInterpUsed); + auto lut3D = HandleLUT3D(cachedFile->lut3D, fileInterp, fileInterpUsed); if (!fileInterpUsed) { @@ -315,7 +303,7 @@ LocalFileFormat::buildFileOps(OpRcPtrVec & ops, CreateLut3DOp(ops, lut3D, newDir); } -} +} // namespace FileFormat * CreateFileFormatIridasItx() { diff --git a/src/OpenColorIO/fileformats/FileFormatIridasLook.cpp b/src/OpenColorIO/fileformats/FileFormatIridasLook.cpp old mode 100755 new mode 100644 index 0ba209a905..ffef8be335 --- a/src/OpenColorIO/fileformats/FileFormatIridasLook.cpp +++ b/src/OpenColorIO/fileformats/FileFormatIridasLook.cpp @@ -9,16 +9,15 @@ #include +#include "ParseUtils.h" +#include "Platform.h" #include "expat.h" #include "fileformats/FileFormatUtils.h" #include "ops/lut1d/Lut1DOp.h" #include "ops/lut3d/Lut3DOp.h" -#include "ParseUtils.h" -#include "Platform.h" #include "transforms/FileTransform.h" -#include "utils/StringUtils.h" #include "utils/NumberUtils.h" - +#include "utils/StringUtils.h" /* @@ -70,21 +69,21 @@ namespace { // convert hex ascii to int // return true on success, false on failure -bool hexasciitoint(char& ival, char character) +bool hexasciitoint(char & ival, char character) { - if(character>=48 && character<=57) // [0-9] + if (character >= 48 && character <= 57) // [0-9] { - ival = static_cast(character-48); + ival = static_cast(character - 48); return true; } - else if(character>=65 && character<=70) // [A-F] + else if (character >= 65 && character <= 70) // [A-F] { - ival = static_cast(10+character-65); + ival = static_cast(10 + character - 65); return true; } - else if(character>=97 && character<=102) // [a-f] + else if (character >= 97 && character <= 102) // [a-f] { - ival = static_cast(10+character-97); + ival = static_cast(10 + character - 97); return true; } @@ -97,13 +96,13 @@ bool hexasciitoint(char& ival, char character) // as used in the iridas file format // "AD10753F" -> 0.9572857022285461f on ALL architectures -bool hexasciitofloat(float& fval, const char * ascii) +bool hexasciitofloat(float & fval, const char * ascii) { // Convert all ASCII numbers to their numerical representations char asciinums[8]; - for(unsigned int i=0; i<8; ++i) + for (unsigned int i = 0; i < 8; ++i) { - if(!hexasciitoint(asciinums[i], ascii[i])) + if (!hexasciitoint(asciinums[i], ascii[i])) { return false; } @@ -114,17 +113,17 @@ bool hexasciitofloat(float& fval, const char * ascii) #if OCIO_LITTLE_ENDIAN // Since incoming values are little endian, and we're on little endian // preserve the byte order - fvalbytes[0] = (unsigned char) (asciinums[1] | (asciinums[0] << 4)); - fvalbytes[1] = (unsigned char) (asciinums[3] | (asciinums[2] << 4)); - fvalbytes[2] = (unsigned char) (asciinums[5] | (asciinums[4] << 4)); - fvalbytes[3] = (unsigned char) (asciinums[7] | (asciinums[6] << 4)); + fvalbytes[0] = (unsigned char)(asciinums[1] | (asciinums[0] << 4)); + fvalbytes[1] = (unsigned char)(asciinums[3] | (asciinums[2] << 4)); + fvalbytes[2] = (unsigned char)(asciinums[5] | (asciinums[4] << 4)); + fvalbytes[3] = (unsigned char)(asciinums[7] | (asciinums[6] << 4)); #else // Since incoming values are little endian, and we're on big endian // flip the byte order - fvalbytes[3] = (unsigned char) (asciinums[1] | (asciinums[0] << 4)); - fvalbytes[2] = (unsigned char) (asciinums[3] | (asciinums[2] << 4)); - fvalbytes[1] = (unsigned char) (asciinums[5] | (asciinums[4] << 4)); - fvalbytes[0] = (unsigned char) (asciinums[7] | (asciinums[6] << 4)); + fvalbytes[3] = (unsigned char)(asciinums[1] | (asciinums[0] << 4)); + fvalbytes[2] = (unsigned char)(asciinums[3] | (asciinums[2] << 4)); + fvalbytes[1] = (unsigned char)(asciinums[5] | (asciinums[4] << 4)); + fvalbytes[0] = (unsigned char)(asciinums[7] | (asciinums[6] << 4)); #endif return true; } @@ -132,8 +131,8 @@ bool hexasciitofloat(float& fval, const char * ascii) class XMLParserHelper { public: - XMLParserHelper() = delete; - XMLParserHelper(const XMLParserHelper &) = delete; + XMLParserHelper() = delete; + XMLParserHelper(const XMLParserHelper &) = delete; XMLParserHelper & operator=(const XMLParserHelper &) = delete; explicit XMLParserHelper(const std::string & fileName) @@ -152,10 +151,7 @@ class XMLParserHelper XML_SetElementHandler(m_parser, StartElementHandler, EndElementHandler); XML_SetCharacterDataHandler(m_parser, CharacterDataHandler); } - ~XMLParserHelper() - { - XML_ParserFree(m_parser); - } + ~XMLParserHelper() { XML_ParserFree(m_parser); } void Parse(std::istream & istream) { @@ -172,7 +168,7 @@ class XMLParserHelper } void Parse(const std::string & buffer, bool lastLine) { - const int done = lastLine?1:0; + const int done = lastLine ? 1 : 0; if (XML_STATUS_ERROR == XML_Parse(m_parser, buffer.c_str(), (int)buffer.size(), done)) { @@ -202,13 +198,13 @@ class XMLParserHelper throw Exception(os.str().c_str()); } - lutSize = m_lutSize; - int expactedVectorSize = 3 * (lutSize*lutSize*lutSize); + lutSize = m_lutSize; + int expactedVectorSize = 3 * (lutSize * lutSize * lutSize); lut.reserve(expactedVectorSize); const char * ascii = m_lutString.c_str(); - float fval = 0.0f; - for (unsigned int i = 0; im_inLook) { pImpl->Throw(" node can not be inside " - "a node"); + "a node"); } else { @@ -331,10 +324,9 @@ class XMLParserHelper } // End the parsing of one element - static void EndElementHandler(void *userData, - const XML_Char *name) + static void EndElementHandler(void * userData, const XML_Char * name) { - XMLParserHelper * pImpl = (XMLParserHelper*)userData; + XMLParserHelper * pImpl = (XMLParserHelper *)userData; if (!pImpl || !name || !*name) { throw Exception("XML internal parsing error."); @@ -395,32 +387,35 @@ class XMLParserHelper } // Handle of strings within an element - static void CharacterDataHandler(void *userData, - const XML_Char *s, - int len) + static void CharacterDataHandler(void * userData, const XML_Char * s, int len) { - XMLParserHelper * pImpl = (XMLParserHelper*)userData; + XMLParserHelper * pImpl = (XMLParserHelper *)userData; if (!pImpl) { throw Exception("XML internal parsing error."); } - if (len == 0) return; - if (len<0 || !s || !*s) + if (len == 0) + return; + if (len < 0 || !s || !*s) { pImpl->Throw("XML parsing error: attribute illegal"); } // Parsing a single new line. This is valid. - if (len == 1 && s[0] == '\n') return; + if (len == 1 && s[0] == '\n') + return; if (pImpl->m_size) { - std::string size_raw = std::string(s, len); + std::string size_raw = std::string(s, len); std::string size_clean = pystring::strip(size_raw, "'\" "); // strip quotes and space long int size_3d{}; - - const auto result = NumberUtils::from_chars(size_clean.c_str(), size_clean.c_str() + size_clean.size(), size_3d); + + const auto result = NumberUtils::from_chars( + size_clean.c_str(), + size_clean.c_str() + size_clean.size(), + size_3d); if (result.ec != std::errc()) { @@ -446,15 +441,9 @@ class XMLParserHelper } } - unsigned getXmlLineNumber() const - { - return m_lineNumber; - } + unsigned getXmlLineNumber() const { return m_lineNumber; } - const std::string& getXmlFilename() const - { - return m_fileName; - } + const std::string & getXmlFilename() const { return m_fileName; } XML_Parser m_parser; unsigned m_lineNumber; @@ -472,8 +461,8 @@ class XMLParserHelper class LocalCachedFile : public CachedFile { public: - LocalCachedFile () = default; - ~LocalCachedFile() = default; + LocalCachedFile() = default; + ~LocalCachedFile() = default; Lut3DOpDataRcPtr lut3D; }; @@ -483,35 +472,36 @@ typedef OCIO_SHARED_PTR LocalCachedFileRcPtr; class LocalFileFormat : public FileFormat { public: - LocalFileFormat() = default; + LocalFileFormat() = default; ~LocalFileFormat() = default; void getFormatInfo(FormatInfoVec & formatInfoVec) const override; - CachedFileRcPtr read(std::istream & istream, - const std::string & fileName, - Interpolation interp) const override; + CachedFileRcPtr read(std::istream & istream, const std::string & fileName, Interpolation interp) + const override; - void buildFileOps(OpRcPtrVec & ops, - const Config & config, - const ConstContextRcPtr & context, - CachedFileRcPtr untypedCachedFile, - const FileTransform & fileTransform, - TransformDirection dir) const override; + void buildFileOps( + OpRcPtrVec & ops, + const Config & config, + const ConstContextRcPtr & context, + CachedFileRcPtr untypedCachedFile, + const FileTransform & fileTransform, + TransformDirection dir) const override; }; void LocalFileFormat::getFormatInfo(FormatInfoVec & formatInfoVec) const { FormatInfo info; - info.name = "iridas_look"; - info.extension = "look"; + info.name = "iridas_look"; + info.extension = "look"; info.capabilities = FORMAT_CAPABILITY_READ; formatInfoVec.push_back(info); } -CachedFileRcPtr LocalFileFormat::read(std::istream & istream, - const std::string & fileName, - Interpolation interp) const +CachedFileRcPtr LocalFileFormat::read( + std::istream & istream, + const std::string & fileName, + Interpolation interp) const { XMLParserHelper parser(fileName); parser.Parse(istream); @@ -539,19 +529,18 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, return cachedFile; } - -void -LocalFileFormat::buildFileOps(OpRcPtrVec & ops, - const Config& /*config*/, - const ConstContextRcPtr & /*context*/, - CachedFileRcPtr untypedCachedFile, - const FileTransform& fileTransform, - TransformDirection dir) const +void LocalFileFormat::buildFileOps( + OpRcPtrVec & ops, + const Config & /*config*/, + const ConstContextRcPtr & /*context*/, + CachedFileRcPtr untypedCachedFile, + const FileTransform & fileTransform, + TransformDirection dir) const { LocalCachedFileRcPtr cachedFile = DynamicPtrCast(untypedCachedFile); // This should never happen. - if(!cachedFile || !cachedFile->lut3D) + if (!cachedFile || !cachedFile->lut3D) { std::ostringstream os; os << "Cannot build Iridas .look Op. Invalid cache type."; @@ -563,7 +552,7 @@ LocalFileFormat::buildFileOps(OpRcPtrVec & ops, const auto fileInterp = fileTransform.getInterpolation(); bool fileInterpUsed = false; - auto lut3D = HandleLUT3D(cachedFile->lut3D, fileInterp, fileInterpUsed); + auto lut3D = HandleLUT3D(cachedFile->lut3D, fileInterp, fileInterpUsed); if (!fileInterpUsed) { diff --git a/src/OpenColorIO/fileformats/FileFormatPandora.cpp b/src/OpenColorIO/fileformats/FileFormatPandora.cpp old mode 100755 new mode 100644 index 5018de6ac3..3ef800d993 --- a/src/OpenColorIO/fileformats/FileFormatPandora.cpp +++ b/src/OpenColorIO/fileformats/FileFormatPandora.cpp @@ -8,14 +8,13 @@ #include #include "BitDepthUtils.h" +#include "ParseUtils.h" #include "fileformats/FileFormatUtils.h" #include "ops/lut1d/Lut1DOp.h" #include "ops/lut3d/Lut3DOp.h" -#include "ParseUtils.h" #include "transforms/FileTransform.h" #include "utils/StringUtils.h" - namespace OCIO_NAMESPACE { namespace @@ -23,7 +22,7 @@ namespace class LocalCachedFile : public CachedFile { public: - LocalCachedFile () = default; + LocalCachedFile() = default; ~LocalCachedFile() = default; Lut3DOpDataRcPtr lut3D; @@ -31,36 +30,35 @@ class LocalCachedFile : public CachedFile typedef OCIO_SHARED_PTR LocalCachedFileRcPtr; - - class LocalFileFormat : public FileFormat { public: - - LocalFileFormat() = default; + LocalFileFormat() = default; ~LocalFileFormat() = default; void getFormatInfo(FormatInfoVec & formatInfoVec) const override; - CachedFileRcPtr read(std::istream & istream, - const std::string & fileName, - Interpolation interp) const override; + CachedFileRcPtr read(std::istream & istream, const std::string & fileName, Interpolation interp) + const override; - void buildFileOps(OpRcPtrVec & ops, - const Config & config, - const ConstContextRcPtr & context, - CachedFileRcPtr untypedCachedFile, - const FileTransform & fileTransform, - TransformDirection dir) const override; + void buildFileOps( + OpRcPtrVec & ops, + const Config & config, + const ConstContextRcPtr & context, + CachedFileRcPtr untypedCachedFile, + const FileTransform & fileTransform, + TransformDirection dir) const override; private: - static void ThrowErrorMessage(const std::string & error, + static void ThrowErrorMessage( + const std::string & error, const std::string & fileName, int line, const std::string & lineContent); }; -void LocalFileFormat::ThrowErrorMessage(const std::string & error, +void LocalFileFormat::ThrowErrorMessage( + const std::string & error, const std::string & fileName, int line, const std::string & lineContent) @@ -82,27 +80,28 @@ void LocalFileFormat::ThrowErrorMessage(const std::string & error, void LocalFileFormat::getFormatInfo(FormatInfoVec & formatInfoVec) const { FormatInfo info; - info.name = "pandora_mga"; - info.extension = "mga"; + info.name = "pandora_mga"; + info.extension = "mga"; info.capabilities = FORMAT_CAPABILITY_READ; formatInfoVec.push_back(info); FormatInfo info2; - info2.name = "pandora_m3d"; - info2.extension = "m3d"; + info2.name = "pandora_m3d"; + info2.extension = "m3d"; info2.capabilities = FORMAT_CAPABILITY_READ; formatInfoVec.push_back(info2); } -CachedFileRcPtr LocalFileFormat::read(std::istream & istream, - const std::string & fileName, - Interpolation interp) const +CachedFileRcPtr LocalFileFormat::read( + std::istream & istream, + const std::string & fileName, + Interpolation interp) const { // this shouldn't happen - if(!istream) + if (!istream) { - throw Exception ("File stream empty when trying " - "to read Pandora LUT"); + throw Exception("File stream empty when trying " + "to read Pandora LUT"); } // Validate the file type @@ -110,31 +109,32 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, // Parse the file std::string format; - int lutEdgeLen = 0; + int lutEdgeLen = 0; int outputBitDepthMaxValue = 0; std::vector raw3d; { StringUtils::StringVec parts; std::vector tmpints; - bool inLut3d = false; + bool inLut3d = false; int lineNumber = 0; - while(nextline(istream, line)) + while (nextline(istream, line)) { ++lineNumber; // Strip, lowercase, and split the line parts = StringUtils::SplitByWhiteSpaces(StringUtils::Lower(StringUtils::Trim(line))); - if(parts.empty()) continue; + if (parts.empty()) + continue; // Skip all lines starting with '#' - if(StringUtils::StartsWith(parts[0],"#")) continue; + if (StringUtils::StartsWith(parts[0], "#")) + continue; - if(parts[0] == "channel") + if (parts[0] == "channel") { - if(parts.size() != 2 - || StringUtils::Lower(parts[1]) != "3d") + if (parts.size() != 2 || StringUtils::Lower(parts[1]) != "3d") { ThrowErrorMessage( "Only 3D LUTs are currently supported " @@ -144,38 +144,26 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, line); } } - else if(parts[0] == "in") + else if (parts[0] == "in") { int inval = 0; - if(parts.size() != 2 - || !StringToInt( &inval, parts[1].c_str())) + if (parts.size() != 2 || !StringToInt(&inval, parts[1].c_str())) { - ThrowErrorMessage( - "Malformed 'in' tag.", - fileName, - lineNumber, - line); + ThrowErrorMessage("Malformed 'in' tag.", fileName, lineNumber, line); } - raw3d.reserve(inval*3); + raw3d.reserve(inval * 3); lutEdgeLen = Get3DLutEdgeLenFromNumPixels(inval); } - else if(parts[0] == "out") + else if (parts[0] == "out") { - if(parts.size() != 2 - || !StringToInt(&outputBitDepthMaxValue, - parts[1].c_str())) + if (parts.size() != 2 || !StringToInt(&outputBitDepthMaxValue, parts[1].c_str())) { - ThrowErrorMessage( - "Malformed 'out' tag.", - fileName, - lineNumber, - line); + ThrowErrorMessage("Malformed 'out' tag.", fileName, lineNumber, line); } } - else if(parts[0] == "format") + else if (parts[0] == "format") { - if(parts.size() != 2 - || StringUtils::Lower(parts[1]) != "lut") + if (parts.size() != 2 || StringUtils::Lower(parts[1]) != "lut") { ThrowErrorMessage( "Only LUTs are currently supported " @@ -185,12 +173,11 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, line); } } - else if(parts[0] == "values") + else if (parts[0] == "values") { - if(parts.size() != 4 || - StringUtils::Lower(parts[1]) != "red" || - StringUtils::Lower(parts[2]) != "green" || - StringUtils::Lower(parts[3]) != "blue") + if (parts.size() != 4 || StringUtils::Lower(parts[1]) != "red" + || StringUtils::Lower(parts[2]) != "green" + || StringUtils::Lower(parts[3]) != "blue") { ThrowErrorMessage( "Only rgb LUTs are currently supported " @@ -202,15 +189,11 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, inLut3d = true; } - else if(inLut3d) + else if (inLut3d) { - if(!StringVecToIntVec(tmpints, parts) || tmpints.size() != 4) + if (!StringVecToIntVec(tmpints, parts) || tmpints.size() != 4) { - ThrowErrorMessage( - "Expected to find 4 integers.", - fileName, - lineNumber, - line); + ThrowErrorMessage("Expected to find 4 integers.", fileName, lineNumber, line); } raw3d.push_back(tmpints[1]); @@ -221,29 +204,23 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, } // Interpret the parsed data, validate LUT sizes - if(lutEdgeLen*lutEdgeLen*lutEdgeLen != static_cast(raw3d.size()/3)) + if (lutEdgeLen * lutEdgeLen * lutEdgeLen != static_cast(raw3d.size() / 3)) { std::ostringstream os; os << "Incorrect number of 3D LUT entries. "; os << "Found " << raw3d.size() / 3 << ", expected "; - os << lutEdgeLen*lutEdgeLen*lutEdgeLen << "."; - ThrowErrorMessage( - os.str().c_str(), - fileName, -1, ""); + os << lutEdgeLen * lutEdgeLen * lutEdgeLen << "."; + ThrowErrorMessage(os.str().c_str(), fileName, -1, ""); } - if(lutEdgeLen*lutEdgeLen*lutEdgeLen == 0) + if (lutEdgeLen * lutEdgeLen * lutEdgeLen == 0) { - ThrowErrorMessage( - "No 3D LUT entries found.", - fileName, -1, ""); + ThrowErrorMessage("No 3D LUT entries found.", fileName, -1, ""); } - if(outputBitDepthMaxValue <= 0) + if (outputBitDepthMaxValue <= 0) { - ThrowErrorMessage( - "A valid 'out' tag was not found.", - fileName, -1, ""); + ThrowErrorMessage("A valid 'out' tag was not found.", fileName, -1, ""); } LocalCachedFileRcPtr cachedFile = LocalCachedFileRcPtr(new LocalCachedFile()); @@ -271,18 +248,18 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, return cachedFile; } -void -LocalFileFormat::buildFileOps(OpRcPtrVec & ops, - const Config& /*config*/, - const ConstContextRcPtr & /*context*/, - CachedFileRcPtr untypedCachedFile, - const FileTransform& fileTransform, - TransformDirection dir) const +void LocalFileFormat::buildFileOps( + OpRcPtrVec & ops, + const Config & /*config*/, + const ConstContextRcPtr & /*context*/, + CachedFileRcPtr untypedCachedFile, + const FileTransform & fileTransform, + TransformDirection dir) const { LocalCachedFileRcPtr cachedFile = DynamicPtrCast(untypedCachedFile); // This should never happen. - if(!cachedFile || !cachedFile->lut3D) + if (!cachedFile || !cachedFile->lut3D) { std::ostringstream os; os << "Cannot build Pandora LUT. Invalid cache type."; @@ -294,7 +271,7 @@ LocalFileFormat::buildFileOps(OpRcPtrVec & ops, const auto fileInterp = fileTransform.getInterpolation(); bool fileInterpUsed = false; - auto lut3D = HandleLUT3D(cachedFile->lut3D, fileInterp, fileInterpUsed); + auto lut3D = HandleLUT3D(cachedFile->lut3D, fileInterp, fileInterpUsed); if (!fileInterpUsed) { @@ -303,7 +280,7 @@ LocalFileFormat::buildFileOps(OpRcPtrVec & ops, CreateLut3DOp(ops, lut3D, newDir); } -} +} // namespace FileFormat * CreateFileFormatPandora() { @@ -311,4 +288,3 @@ FileFormat * CreateFileFormatPandora() } } // namespace OCIO_NAMESPACE - diff --git a/src/OpenColorIO/fileformats/FileFormatResolveCube.cpp b/src/OpenColorIO/fileformats/FileFormatResolveCube.cpp old mode 100755 new mode 100644 index 9c5e23180e..b2de6517e7 --- a/src/OpenColorIO/fileformats/FileFormatResolveCube.cpp +++ b/src/OpenColorIO/fileformats/FileFormatResolveCube.cpp @@ -8,18 +8,17 @@ #include +#include "BakingUtils.h" +#include "Logging.h" +#include "MathUtils.h" +#include "ParseUtils.h" #include "fileformats/FileFormatUtils.h" #include "ops/lut1d/Lut1DOp.h" #include "ops/lut3d/Lut3DOp.h" #include "ops/matrix/MatrixOp.h" -#include "BakingUtils.h" -#include "ParseUtils.h" -#include "MathUtils.h" -#include "Logging.h" #include "transforms/FileTransform.h" #include "utils/StringUtils.h" - /* Peter Chamberlain @@ -37,7 +36,7 @@ While described as a 3D LUT format the .cube file could contain ... Irrespective of what data a .cube file contains (1D, 3D or both), it is always displayed by Resolve in the 3D LUT section. -Lines beginning with # are considered comments. All comment lines need to be +Lines beginning with # are considered comments. All comment lines need to be placed before the header lines. 3D LUT data (only) @@ -171,7 +170,6 @@ LUT_3D_INPUT_RANGE 0.0 1.0 */ - namespace OCIO_NAMESPACE { namespace @@ -179,7 +177,7 @@ namespace class LocalCachedFile : public CachedFile { public: - LocalCachedFile() = default; + LocalCachedFile() = default; ~LocalCachedFile() = default; Lut1DOpDataRcPtr lut1D; @@ -193,39 +191,38 @@ class LocalCachedFile : public CachedFile typedef OCIO_SHARED_PTR LocalCachedFileRcPtr; - - class LocalFileFormat : public FileFormat { public: - - LocalFileFormat() = default; + LocalFileFormat() = default; ~LocalFileFormat() = default; void getFormatInfo(FormatInfoVec & formatInfoVec) const override; - CachedFileRcPtr read(std::istream & istream, - const std::string & fileName, - Interpolation interp) const override; + CachedFileRcPtr read(std::istream & istream, const std::string & fileName, Interpolation interp) + const override; - void bake(const Baker & baker, - const std::string & formatName, - std::ostream & ostream) const override; + void bake(const Baker & baker, const std::string & formatName, std::ostream & ostream) + const override; + + void buildFileOps( + OpRcPtrVec & ops, + const Config & config, + const ConstContextRcPtr & context, + CachedFileRcPtr untypedCachedFile, + const FileTransform & fileTransform, + TransformDirection dir) const override; - void buildFileOps(OpRcPtrVec & ops, - const Config & config, - const ConstContextRcPtr & context, - CachedFileRcPtr untypedCachedFile, - const FileTransform & fileTransform, - TransformDirection dir) const override; private: - static void ThrowErrorMessage(const std::string & error, + static void ThrowErrorMessage( + const std::string & error, const std::string & fileName, int line, const std::string & lineContent); }; -void LocalFileFormat::ThrowErrorMessage(const std::string & error, +void LocalFileFormat::ThrowErrorMessage( + const std::string & error, const std::string & fileName, int line, const std::string & lineContent) @@ -247,24 +244,25 @@ void LocalFileFormat::ThrowErrorMessage(const std::string & error, void LocalFileFormat::getFormatInfo(FormatInfoVec & formatInfoVec) const { FormatInfo info; - info.name = "resolve_cube"; - info.extension = "cube"; - info.capabilities = FormatCapabilityFlags(FORMAT_CAPABILITY_READ | FORMAT_CAPABILITY_BAKE); - info.bake_capabilities = FormatBakeFlags(FORMAT_BAKE_CAPABILITY_3DLUT | - FORMAT_BAKE_CAPABILITY_1DLUT | - FORMAT_BAKE_CAPABILITY_1D_3D_LUT); + info.name = "resolve_cube"; + info.extension = "cube"; + info.capabilities = FormatCapabilityFlags(FORMAT_CAPABILITY_READ | FORMAT_CAPABILITY_BAKE); + info.bake_capabilities = FormatBakeFlags( + FORMAT_BAKE_CAPABILITY_3DLUT | FORMAT_BAKE_CAPABILITY_1DLUT + | FORMAT_BAKE_CAPABILITY_1D_3D_LUT); formatInfoVec.push_back(info); } -CachedFileRcPtr LocalFileFormat::read(std::istream & istream, - const std::string & fileName, - Interpolation interp) const +CachedFileRcPtr LocalFileFormat::read( + std::istream & istream, + const std::string & fileName, + Interpolation interp) const { // this shouldn't happen - if(!istream) + if (!istream) { - throw Exception ("File stream empty when trying to read Resolve .cube lut"); + throw Exception("File stream empty when trying to read Resolve .cube lut"); } // Parse the file @@ -287,18 +285,18 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, std::string line; StringUtils::StringVec parts; std::vector tmpfloats; - int lineNumber = 0; + int lineNumber = 0; bool headerComplete = false; - int tripletNumber = 0; + int tripletNumber = 0; - while(nextline(istream, line)) + while (nextline(istream, line)) { ++lineNumber; // All lines starting with '#' are comments - if(StringUtils::StartsWith(line,"#")) + if (StringUtils::StartsWith(line, "#")) { - if(headerComplete) + if (headerComplete) { ThrowErrorMessage( "Comments not allowed after header.", @@ -314,59 +312,41 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, // Strip, lowercase, and split the line parts = StringUtils::SplitByWhiteSpaces(StringUtils::Lower(StringUtils::Trim(line))); - if(parts.empty()) continue; + if (parts.empty()) + continue; - if(StringUtils::Lower(parts[0]) == "title") + if (StringUtils::Lower(parts[0]) == "title") { - ThrowErrorMessage( - "Unsupported tag: 'TITLE'.", - fileName, - lineNumber, - line); + ThrowErrorMessage("Unsupported tag: 'TITLE'.", fileName, lineNumber, line); } - else if(StringUtils::Lower(parts[0]) == "lut_1d_size") + else if (StringUtils::Lower(parts[0]) == "lut_1d_size") { - if(parts.size() != 2 - || !StringToInt( &size1d, parts[1].c_str())) + if (parts.size() != 2 || !StringToInt(&size1d, parts[1].c_str())) { - ThrowErrorMessage( - "Malformed LUT_1D_SIZE tag.", - fileName, - lineNumber, - line); + ThrowErrorMessage("Malformed LUT_1D_SIZE tag.", fileName, lineNumber, line); } - raw1d.reserve(3*size1d); + raw1d.reserve(3 * size1d); has1d = true; } - else if(StringUtils::Lower(parts[0]) == "lut_2d_size") + else if (StringUtils::Lower(parts[0]) == "lut_2d_size") { - ThrowErrorMessage( - "Unsupported tag: 'LUT_2D_SIZE'.", - fileName, - lineNumber, - line); + ThrowErrorMessage("Unsupported tag: 'LUT_2D_SIZE'.", fileName, lineNumber, line); } - else if(StringUtils::Lower(parts[0]) == "lut_3d_size") + else if (StringUtils::Lower(parts[0]) == "lut_3d_size") { - if(parts.size() != 2 - || !StringToInt( &size3d, parts[1].c_str())) + if (parts.size() != 2 || !StringToInt(&size3d, parts[1].c_str())) { - ThrowErrorMessage( - "Malformed LUT_3D_SIZE tag.", - fileName, - lineNumber, - line); + ThrowErrorMessage("Malformed LUT_3D_SIZE tag.", fileName, lineNumber, line); } - raw3d.reserve(3*size3d*size3d*size3d); + raw3d.reserve(3 * size3d * size3d * size3d); has3d = true; } - else if(StringUtils::Lower(parts[0]) == "lut_1d_input_range") + else if (StringUtils::Lower(parts[0]) == "lut_1d_input_range") { - if(parts.size() != 3 || - !StringToFloat( &range1d_min, parts[1].c_str()) || - !StringToFloat( &range1d_max, parts[2].c_str())) + if (parts.size() != 3 || !StringToFloat(&range1d_min, parts[1].c_str()) + || !StringToFloat(&range1d_max, parts[2].c_str())) { ThrowErrorMessage( "Malformed LUT_1D_INPUT_RANGE tag.", @@ -375,11 +355,10 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, line); } } - else if(StringUtils::Lower(parts[0]) == "lut_3d_input_range") + else if (StringUtils::Lower(parts[0]) == "lut_3d_input_range") { - if(parts.size() != 3 || - !StringToFloat( &range3d_min, parts[1].c_str()) || - !StringToFloat( &range3d_max, parts[2].c_str())) + if (parts.size() != 3 || !StringToFloat(&range3d_min, parts[1].c_str()) + || !StringToFloat(&range3d_max, parts[2].c_str())) { ThrowErrorMessage( "Malformed LUT_3D_INPUT_RANGE tag.", @@ -393,7 +372,7 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, headerComplete = true; // It must be a float triple! - if(!StringVecToFloatVec(tmpfloats, parts) || tmpfloats.size() != 3) + if (!StringVecToFloatVec(tmpfloats, parts) || tmpfloats.size() != 3) { ThrowErrorMessage( "Malformed color triples specified.", @@ -402,9 +381,9 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, line); } - for(int i=0; i<3; ++i) + for (int i = 0; i < 3; ++i) { - if(has1d && tripletNumber < size1d) + if (has1d && tripletNumber < size1d) { raw1d.push_back(tmpfloats[i]); } @@ -423,21 +402,19 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, LocalCachedFileRcPtr cachedFile = LocalCachedFileRcPtr(new LocalCachedFile()); - if(has1d) + if (has1d) { - if(size1d != static_cast(raw1d.size()/3)) + if (size1d != static_cast(raw1d.size() / 3)) { std::ostringstream os; os << "Incorrect number of lut1d entries. "; os << "Found " << raw1d.size() / 3; os << ", expected " << size1d << "."; - ThrowErrorMessage( - os.str().c_str(), - fileName, -1, ""); + ThrowErrorMessage(os.str().c_str(), fileName, -1, ""); } // Reformat 1D data - if(size1d>0) + if (size1d > 0) { cachedFile->lut1D = std::make_shared(size1d); if (Lut1DOpData::IsValidInterpolation(interp)) @@ -458,18 +435,15 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, } } } - if(has3d) + if (has3d) { - if(size3d*size3d*size3d - != static_cast(raw3d.size()/3)) + if (size3d * size3d * size3d != static_cast(raw3d.size() / 3)) { std::ostringstream os; os << "Incorrect number of lut3d entries. "; os << "Found " << raw3d.size() / 3 << ", expected "; os << size3d * size3d * size3d << "."; - ThrowErrorMessage( - os.str().c_str(), - fileName, -1, ""); + ThrowErrorMessage(os.str().c_str(), fileName, -1, ""); } // Reformat 3D data @@ -484,26 +458,25 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, cachedFile->lut3D->setFileOutputBitDepth(BIT_DEPTH_F32); cachedFile->lut3D->setArrayFromRedFastestOrder(raw3d); } - if(!has1d && !has3d) + if (!has1d && !has3d) { - ThrowErrorMessage( - "Lut type (1D/3D) unspecified.", - fileName, -1, ""); + ThrowErrorMessage("Lut type (1D/3D) unspecified.", fileName, -1, ""); } return cachedFile; } -void LocalFileFormat::bake(const Baker & baker, - const std::string & formatName, - std::ostream & ostream) const +void LocalFileFormat::bake( + const Baker & baker, + const std::string & formatName, + std::ostream & ostream) const { - const int DEFAULT_1D_SIZE = 4096; + const int DEFAULT_1D_SIZE = 4096; const int DEFAULT_SHAPER_SIZE = 4096; - const int DEFAULT_3D_SIZE = 64; + const int DEFAULT_3D_SIZE = 64; - if(formatName != "resolve_cube") + if (formatName != "resolve_cube") { std::ostringstream os; os << "Unknown cube format name, '"; @@ -516,14 +489,17 @@ void LocalFileFormat::bake(const Baker & baker, // int onedSize = baker.getCubeSize(); - if(onedSize==-1) onedSize = DEFAULT_1D_SIZE; + if (onedSize == -1) + onedSize = DEFAULT_1D_SIZE; int cubeSize = baker.getCubeSize(); - if(cubeSize==-1) cubeSize = DEFAULT_3D_SIZE; + if (cubeSize == -1) + cubeSize = DEFAULT_3D_SIZE; cubeSize = std::max(2, cubeSize); // smallest cube is 2x2x2 int shaperSize = baker.getShaperSize(); - if(shaperSize==-1) shaperSize = DEFAULT_SHAPER_SIZE; + if (shaperSize == -1) + shaperSize = DEFAULT_SHAPER_SIZE; // Get spaces from baker const std::string shaperSpace = baker.getShaperSpace(); @@ -532,17 +508,17 @@ void LocalFileFormat::bake(const Baker & baker, // Determine required LUT type // - const int CUBE_1D = 1; // 1D LUT version number - const int CUBE_3D = 2; // 3D LUT version number + const int CUBE_1D = 1; // 1D LUT version number + const int CUBE_3D = 2; // 3D LUT version number const int CUBE_1D_3D = 3; // 3D LUT with 1D prelut int required_lut = -1; ConstCPUProcessorRcPtr inputToTarget = GetInputToTargetProcessor(baker); - if(inputToTarget->hasChannelCrosstalk()) + if (inputToTarget->hasChannelCrosstalk()) { - if(shaperSpace.empty()) + if (shaperSpace.empty()) { // Has crosstalk, but no shaper, so need 3D LUT required_lut = CUBE_3D; @@ -558,11 +534,10 @@ void LocalFileFormat::bake(const Baker & baker, required_lut = CUBE_1D; } - if(required_lut == -1) + if (required_lut == -1) { // Unnecessary paranoia - throw Exception( - "Internal logic error, LUT type was not determined"); + throw Exception("Internal logic error, LUT type was not determined"); } // @@ -572,17 +547,16 @@ void LocalFileFormat::bake(const Baker & baker, std::vector shaperData; float fromInStart = 0.0f; - float fromInEnd = 1.0f; + float fromInEnd = 1.0f; - if(required_lut == CUBE_1D_3D) + if (required_lut == CUBE_1D_3D) { GetShaperRange(baker, fromInStart, fromInEnd); // Generate the identity shaper values, then apply the transform. // Shaper is linearly sampled from fromInStart to fromInEnd - shaperData.resize(shaperSize*3); - GenerateLinearScaleLut1D( - shaperData.data(), shaperSize, 3, fromInStart, fromInEnd); + shaperData.resize(shaperSize * 3); + GenerateLinearScaleLut1D(shaperData.data(), shaperSize, 3, fromInStart, fromInEnd); PackedImageDesc shaperImg(&shaperData[0], shaperSize, 1, 3); ConstCPUProcessorRcPtr inputToShaper = GetInputToShaperProcessor(baker); @@ -594,14 +568,14 @@ void LocalFileFormat::bake(const Baker & baker, // std::vector cubeData; - if(required_lut == CUBE_3D || required_lut == CUBE_1D_3D) + if (required_lut == CUBE_3D || required_lut == CUBE_1D_3D) { - cubeData.resize(cubeSize*cubeSize*cubeSize*3); + cubeData.resize(cubeSize * cubeSize * cubeSize * 3); GenerateIdentityLut3D(&cubeData[0], cubeSize, 3, LUT3DORDER_FAST_RED); - PackedImageDesc cubeImg(&cubeData[0], cubeSize*cubeSize*cubeSize, 1, 3); + PackedImageDesc cubeImg(&cubeData[0], cubeSize * cubeSize * cubeSize, 1, 3); ConstCPUProcessorRcPtr cubeProc; - if(required_lut == CUBE_1D_3D) + if (required_lut == CUBE_1D_3D) { cubeProc = GetShaperToTargetProcessor(baker); } @@ -620,7 +594,7 @@ void LocalFileFormat::bake(const Baker & baker, std::vector onedData; - if(required_lut == CUBE_1D) + if (required_lut == CUBE_1D) { onedData.resize(onedSize * 3); @@ -648,7 +622,7 @@ void LocalFileFormat::bake(const Baker & baker, // Comments const auto & metadata = baker.getFormatMetadata(); - const auto nb = metadata.getNumChildrenElements(); + const auto nb = metadata.getNumChildrenElements(); for (int i = 0; i < nb; ++i) { const auto & child = metadata.getChildElement(i); @@ -664,7 +638,7 @@ void LocalFileFormat::bake(const Baker & baker, // These tags are optional and will default to the 0..1 range, // not writing them explicitly allows for wider compatibility // with parser based on other cube specification (eg. Iridas_Itx) - if(required_lut == CUBE_1D) + if (required_lut == CUBE_1D) { ostream << "LUT_1D_SIZE " << onedSize << "\n"; if (fromInStart != 0.0f || fromInEnd != 1.0f) @@ -672,61 +646,58 @@ void LocalFileFormat::bake(const Baker & baker, ostream << "LUT_1D_INPUT_RANGE " << fromInStart << " " << fromInEnd << "\n"; } } - else if(required_lut == CUBE_1D_3D) + else if (required_lut == CUBE_1D_3D) { ostream << "LUT_1D_SIZE " << shaperSize << "\n"; ostream << "LUT_1D_INPUT_RANGE " << fromInStart << " " << fromInEnd << "\n"; } - if(required_lut == CUBE_3D || required_lut == CUBE_1D_3D) + if (required_lut == CUBE_3D || required_lut == CUBE_1D_3D) { ostream << "LUT_3D_SIZE " << cubeSize << "\n"; - //ostream << "LUT_3D_INPUT_RANGE 0.0 1.0\n"; + // ostream << "LUT_3D_INPUT_RANGE 0.0 1.0\n"; } // Write 1D data - if(required_lut == CUBE_1D) + if (required_lut == CUBE_1D) { - for(int i=0; i(untypedCachedFile); // This should never happen. - if(!cachedFile || (!cachedFile->lut1D && !cachedFile->lut3D)) + if (!cachedFile || (!cachedFile->lut1D && !cachedFile->lut3D)) { std::ostringstream os; os << "Cannot build Resolve .cube Op. Invalid cache type."; @@ -738,8 +709,8 @@ LocalFileFormat::buildFileOps(OpRcPtrVec & ops, const auto fileInterp = fileTransform.getInterpolation(); bool fileInterpUsed = false; - auto lut1D = HandleLUT1D(cachedFile->lut1D, fileInterp, fileInterpUsed); - auto lut3D = HandleLUT3D(cachedFile->lut3D, fileInterp, fileInterpUsed); + auto lut1D = HandleLUT1D(cachedFile->lut1D, fileInterp, fileInterpUsed); + auto lut3D = HandleLUT3D(cachedFile->lut3D, fileInterp, fileInterpUsed); if (!fileInterpUsed) { @@ -748,37 +719,37 @@ LocalFileFormat::buildFileOps(OpRcPtrVec & ops, switch (newDir) { - case TRANSFORM_DIR_FORWARD: - { - if (lut1D) - { - CreateMinMaxOp(ops, cachedFile->range1d_min, cachedFile->range1d_max, newDir); - CreateLut1DOp(ops, lut1D, newDir); - } - if (lut3D) - { - CreateMinMaxOp(ops, cachedFile->range3d_min, cachedFile->range3d_max, newDir); - CreateLut3DOp(ops, lut3D, newDir); - } - break; - } - case TRANSFORM_DIR_INVERSE: - { - if (lut3D) + case TRANSFORM_DIR_FORWARD: { - CreateLut3DOp(ops, lut3D, newDir); - CreateMinMaxOp(ops, cachedFile->range3d_min, cachedFile->range3d_max, newDir); + if (lut1D) + { + CreateMinMaxOp(ops, cachedFile->range1d_min, cachedFile->range1d_max, newDir); + CreateLut1DOp(ops, lut1D, newDir); + } + if (lut3D) + { + CreateMinMaxOp(ops, cachedFile->range3d_min, cachedFile->range3d_max, newDir); + CreateLut3DOp(ops, lut3D, newDir); + } + break; } - if (lut1D) + case TRANSFORM_DIR_INVERSE: { - CreateLut1DOp(ops, lut1D, newDir); - CreateMinMaxOp(ops, cachedFile->range1d_min, cachedFile->range1d_max, newDir); + if (lut3D) + { + CreateLut3DOp(ops, lut3D, newDir); + CreateMinMaxOp(ops, cachedFile->range3d_min, cachedFile->range3d_max, newDir); + } + if (lut1D) + { + CreateLut1DOp(ops, lut1D, newDir); + CreateMinMaxOp(ops, cachedFile->range1d_min, cachedFile->range1d_max, newDir); + } + break; } - break; } - } -} } +} // namespace FileFormat * CreateFileFormatResolveCube() { diff --git a/src/OpenColorIO/fileformats/FileFormatSpi1D.cpp b/src/OpenColorIO/fileformats/FileFormatSpi1D.cpp old mode 100755 new mode 100644 index e2e4822b45..d5284f85e0 --- a/src/OpenColorIO/fileformats/FileFormatSpi1D.cpp +++ b/src/OpenColorIO/fileformats/FileFormatSpi1D.cpp @@ -8,15 +8,15 @@ #include -#include "fileformats/FileFormatUtils.h" -#include "ops/lut1d/Lut1DOp.h" -#include "ops/matrix/MatrixOp.h" #include "BakingUtils.h" #include "ParseUtils.h" #include "Platform.h" +#include "fileformats/FileFormatUtils.h" +#include "ops/lut1d/Lut1DOp.h" +#include "ops/matrix/MatrixOp.h" #include "transforms/FileTransform.h" -#include "utils/StringUtils.h" #include "utils/NumberUtils.h" +#include "utils/StringUtils.h" /* Version 1 @@ -26,7 +26,7 @@ Length 4096 { 0.031525943963232252 0.045645604561056156 - ... + ... } */ @@ -40,7 +40,7 @@ namespace class LocalCachedFile : public CachedFile { public: - LocalCachedFile() = default; + LocalCachedFile() = default; ~LocalCachedFile() = default; Lut1DOpDataRcPtr lut; @@ -53,38 +53,36 @@ typedef OCIO_SHARED_PTR LocalCachedFileRcPtr; class LocalFileFormat : public FileFormat { public: - LocalFileFormat() = default; + LocalFileFormat() = default; ~LocalFileFormat() = default; void getFormatInfo(FormatInfoVec & formatInfoVec) const override; - CachedFileRcPtr read(std::istream & istream, - const std::string & fileName, - Interpolation interp) const override; + CachedFileRcPtr read(std::istream & istream, const std::string & fileName, Interpolation interp) + const override; - void bake(const Baker & baker, - const std::string & formatName, - std::ostream & ostream) const override; + void bake(const Baker & baker, const std::string & formatName, std::ostream & ostream) + const override; - void buildFileOps(OpRcPtrVec & ops, - const Config & config, - const ConstContextRcPtr & context, - CachedFileRcPtr untypedCachedFile, - const FileTransform & fileTransform, - TransformDirection dir) const override; + void buildFileOps( + OpRcPtrVec & ops, + const Config & config, + const ConstContextRcPtr & context, + CachedFileRcPtr untypedCachedFile, + const FileTransform & fileTransform, + TransformDirection dir) const override; private: - static void ThrowErrorMessage(const std::string & error, - int line, - const std::string & lineContent); + static void + ThrowErrorMessage(const std::string & error, int line, const std::string & lineContent); }; void LocalFileFormat::getFormatInfo(FormatInfoVec & formatInfoVec) const { FormatInfo info; - info.name = "spi1d"; - info.extension = "spi1d"; - info.capabilities = FormatCapabilityFlags(FORMAT_CAPABILITY_READ | FORMAT_CAPABILITY_BAKE); + info.name = "spi1d"; + info.extension = "spi1d"; + info.capabilities = FormatCapabilityFlags(FORMAT_CAPABILITY_READ | FORMAT_CAPABILITY_BAKE); info.bake_capabilities = FormatBakeFlags(FORMAT_BAKE_CAPABILITY_1DLUT); formatInfoVec.push_back(info); } @@ -92,15 +90,16 @@ void LocalFileFormat::getFormatInfo(FormatInfoVec & formatInfoVec) const // Try and load the format. // Raise an exception if it can't be loaded. -CachedFileRcPtr LocalFileFormat::read(std::istream & istream, - const std::string & /*fileName*/, - Interpolation interp) const +CachedFileRcPtr LocalFileFormat::read( + std::istream & istream, + const std::string & /*fileName*/, + Interpolation interp) const { // Parse Header Info. - int lut_size = -1; + int lut_size = -1; float from_min = 0.0; float from_max = 1.0; - int version = -1; + int version = -1; int components = -1; const int MAX_LINE_SIZE = 4096; @@ -116,7 +115,7 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, ++currentLine; headerLine = std::string(lineBuffer); - if(StringUtils::StartsWith(headerLine, "Version")) + if (StringUtils::StartsWith(headerLine, "Version")) { // " " in format means any number of spaces (white space, // new line, tab) including 0 of them. @@ -130,7 +129,7 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, ThrowErrorMessage("Only format version 1 supported", currentLine, headerLine); } } - else if(StringUtils::StartsWith(headerLine, "From")) + else if (StringUtils::StartsWith(headerLine, "From")) { char fromMinS[64] = ""; char fromMaxS[64] = ""; @@ -144,8 +143,10 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, } else { - const auto fromMinAnswer = NumberUtils::from_chars(fromMinS, fromMinS + 64, from_min); - const auto fromMaxAnswer = NumberUtils::from_chars(fromMaxS, fromMaxS + 64, from_max); + const auto fromMinAnswer + = NumberUtils::from_chars(fromMinS, fromMinS + 64, from_min); + const auto fromMaxAnswer + = NumberUtils::from_chars(fromMaxS, fromMaxS + 64, from_max); if (fromMinAnswer.ec != std::errc() || fromMaxAnswer.ec != std::errc()) { @@ -153,14 +154,14 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, } } } - else if(StringUtils::StartsWith(headerLine, "Components")) + else if (StringUtils::StartsWith(headerLine, "Components")) { if (sscanf(lineBuffer, "Components %d", &components) != 1) { ThrowErrorMessage("Invalid 'Components' Tag", currentLine, headerLine); } } - else if(StringUtils::StartsWith(headerLine, "Length")) + else if (StringUtils::StartsWith(headerLine, "Length")) { if (sscanf(lineBuffer, "Length %d", &lut_size) != 1) { @@ -168,7 +169,7 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, } } } - while (istream.good() && !StringUtils::StartsWith(headerLine,"{")); + while (istream.good() && !StringUtils::StartsWith(headerLine, "{")); } if (version == -1) @@ -183,7 +184,7 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, { ThrowErrorMessage("Could not find 'Components' Tag", -1, ""); } - if (components < 0 || components>3) + if (components < 0 || components > 3) { ThrowErrorMessage("Components must be [1,2,3]", -1, ""); } @@ -196,12 +197,12 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, lut1d->setFileOutputBitDepth(BIT_DEPTH_F32); Array & lutArray = lut1d->getArray(); - unsigned long i = 0; + unsigned long i = 0; { istream.getline(lineBuffer, MAX_LINE_SIZE); ++currentLine; - int lineCount=0; + int lineCount = 0; std::vector values; @@ -219,12 +220,27 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, char inputLUT[4][64] = {"", "", "", ""}; #ifdef _WIN32 - if (sscanf_s(lineBuffer, "%s %s %s %63s", inputLUT[0], 64, - inputLUT[1], 64, inputLUT[2], 64, inputLUT[3], - 64) != components) + if (sscanf_s( + lineBuffer, + "%s %s %s %63s", + inputLUT[0], + 64, + inputLUT[1], + 64, + inputLUT[2], + 64, + inputLUT[3], + 64) + != components) #else - if (sscanf(lineBuffer, "%s %s %s %63s", inputLUT[0], - inputLUT[1], inputLUT[2], inputLUT[3]) != components) + if (sscanf( + lineBuffer, + "%s %s %s %63s", + inputLUT[0], + inputLUT[1], + inputLUT[2], + inputLUT[3]) + != components) #endif { std::ostringstream os; @@ -243,7 +259,7 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, for (int i = 0; i < components; i++) { - float v = NAN; + float v = NAN; const auto result = NumberUtils::from_chars(inputLUT[i], inputLUT[i] + 64, v); if (result.ec != std::errc()) @@ -252,8 +268,7 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, os << "Malformed LUT line. Could not convert component"; os << i << " to a floating point number."; - ThrowErrorMessage("Malformed LUT line", currentLine, - line); + ThrowErrorMessage("Malformed LUT line", currentLine, line); } values[i] = v; @@ -301,20 +316,21 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, } LocalCachedFileRcPtr cachedFile = LocalCachedFileRcPtr(new LocalCachedFile()); - cachedFile->lut = lut1d; - cachedFile->from_min = from_min; - cachedFile->from_max = from_max; + cachedFile->lut = lut1d; + cachedFile->from_min = from_min; + cachedFile->from_max = from_max; return cachedFile; } -void LocalFileFormat::bake(const Baker & baker, - const std::string & formatName, - std::ostream & ostream) const +void LocalFileFormat::bake( + const Baker & baker, + const std::string & formatName, + std::ostream & ostream) const { const int DEFAULT_1D_SIZE = 4096; - if(formatName != "spi1d") + if (formatName != "spi1d") { std::ostringstream os; os << "Unknown spi format name, '"; @@ -329,12 +345,13 @@ void LocalFileFormat::bake(const Baker & baker, ConstConfigRcPtr config = baker.getConfig(); int onedSize = baker.getCubeSize(); - if(onedSize==-1) onedSize = DEFAULT_1D_SIZE; + if (onedSize == -1) + onedSize = DEFAULT_1D_SIZE; const std::string shaperSpace = baker.getShaperSpace(); float fromInStart = 0.0f; - float fromInEnd = 1.0f; + float fromInEnd = 1.0f; // // Generate 1DLUT @@ -373,28 +390,27 @@ void LocalFileFormat::bake(const Baker & baker, ostream << "{" << "\n"; // Write 1D data - for(int i=0; i(untypedCachedFile); - if(!cachedFile || !cachedFile->lut) // This should never happen. + if (!cachedFile || !cachedFile->lut) // This should never happen. { std::ostringstream os; os << "Cannot build Spi1D Op. Invalid cache type."; @@ -403,17 +419,13 @@ void LocalFileFormat::buildFileOps(OpRcPtrVec & ops, const auto newDir = CombineTransformDirections(dir, fileTransform.getDirection()); - const double min[3] = { cachedFile->from_min, - cachedFile->from_min, - cachedFile->from_min }; + const double min[3] = {cachedFile->from_min, cachedFile->from_min, cachedFile->from_min}; - const double max[3] = { cachedFile->from_max, - cachedFile->from_max, - cachedFile->from_max }; + const double max[3] = {cachedFile->from_max, cachedFile->from_max, cachedFile->from_max}; const auto fileInterp = fileTransform.getInterpolation(); - bool fileInterpUsed = false; + bool fileInterpUsed = false; Lut1DOpDataRcPtr lut = HandleLUT1D(cachedFile->lut, fileInterp, fileInterpUsed); if (!fileInterpUsed) @@ -423,20 +435,21 @@ void LocalFileFormat::buildFileOps(OpRcPtrVec & ops, switch (newDir) { - case TRANSFORM_DIR_FORWARD: - CreateMinMaxOp(ops, min, max, TRANSFORM_DIR_FORWARD); - CreateLut1DOp(ops, lut, TRANSFORM_DIR_FORWARD); - break; - case TRANSFORM_DIR_INVERSE: - CreateLut1DOp(ops, lut, TRANSFORM_DIR_INVERSE); - CreateMinMaxOp(ops, min, max, TRANSFORM_DIR_INVERSE); - break; + case TRANSFORM_DIR_FORWARD: + CreateMinMaxOp(ops, min, max, TRANSFORM_DIR_FORWARD); + CreateLut1DOp(ops, lut, TRANSFORM_DIR_FORWARD); + break; + case TRANSFORM_DIR_INVERSE: + CreateLut1DOp(ops, lut, TRANSFORM_DIR_INVERSE); + CreateMinMaxOp(ops, min, max, TRANSFORM_DIR_INVERSE); + break; } } -void LocalFileFormat::ThrowErrorMessage(const std::string & error, - int line, - const std::string & lineContent) +void LocalFileFormat::ThrowErrorMessage( + const std::string & error, + int line, + const std::string & lineContent) { std::ostringstream os; if (-1 != line) @@ -451,7 +464,7 @@ void LocalFileFormat::ThrowErrorMessage(const std::string & error, throw Exception(os.str().c_str()); } -} +} // namespace FileFormat * CreateFileFormatSpi1D() { diff --git a/src/OpenColorIO/fileformats/FileFormatSpi3D.cpp b/src/OpenColorIO/fileformats/FileFormatSpi3D.cpp old mode 100755 new mode 100644 index c3ef153f43..cabbd4b1c3 --- a/src/OpenColorIO/fileformats/FileFormatSpi3D.cpp +++ b/src/OpenColorIO/fileformats/FileFormatSpi3D.cpp @@ -7,14 +7,13 @@ #include +#include "BakingUtils.h" +#include "Platform.h" #include "fileformats/FileFormatUtils.h" #include "ops/lut3d/Lut3DOp.h" -#include "Platform.h" -#include "BakingUtils.h" #include "transforms/FileTransform.h" -#include "utils/StringUtils.h" #include "utils/NumberUtils.h" - +#include "utils/StringUtils.h" /* SPILUT 1.0 @@ -37,7 +36,7 @@ namespace class LocalCachedFile : public CachedFile { public: - LocalCachedFile() = default; + LocalCachedFile() = default; ~LocalCachedFile() = default; Lut3DOpDataRcPtr lut; @@ -48,47 +47,47 @@ typedef OCIO_SHARED_PTR LocalCachedFileRcPtr; class LocalFileFormat : public FileFormat { public: - LocalFileFormat() = default; + LocalFileFormat() = default; ~LocalFileFormat() = default; void getFormatInfo(FormatInfoVec & formatInfoVec) const override; - CachedFileRcPtr read(std::istream & istream, - const std::string & fileName, - Interpolation interp) const override; + CachedFileRcPtr read(std::istream & istream, const std::string & fileName, Interpolation interp) + const override; - void bake(const Baker & baker, - const std::string & formatName, - std::ostream & ostream) const override; + void bake(const Baker & baker, const std::string & formatName, std::ostream & ostream) + const override; - void buildFileOps(OpRcPtrVec & ops, - const Config & config, - const ConstContextRcPtr & context, - CachedFileRcPtr untypedCachedFile, - const FileTransform & fileTransform, - TransformDirection dir) const override; + void buildFileOps( + OpRcPtrVec & ops, + const Config & config, + const ConstContextRcPtr & context, + CachedFileRcPtr untypedCachedFile, + const FileTransform & fileTransform, + TransformDirection dir) const override; }; void LocalFileFormat::getFormatInfo(FormatInfoVec & formatInfoVec) const { FormatInfo info; - info.name = "spi3d"; - info.extension = "spi3d"; - info.capabilities = FormatCapabilityFlags(FORMAT_CAPABILITY_READ | FORMAT_CAPABILITY_BAKE); + info.name = "spi3d"; + info.extension = "spi3d"; + info.capabilities = FormatCapabilityFlags(FORMAT_CAPABILITY_READ | FORMAT_CAPABILITY_BAKE); info.bake_capabilities = FormatBakeFlags(FORMAT_BAKE_CAPABILITY_3DLUT); formatInfoVec.push_back(info); } -CachedFileRcPtr LocalFileFormat::read(std::istream & istream, - const std::string & fileName, - Interpolation interp) const +CachedFileRcPtr LocalFileFormat::read( + std::istream & istream, + const std::string & fileName, + Interpolation interp) const { const int MAX_LINE_SIZE = 4096; char lineBuffer[MAX_LINE_SIZE]; // Read header information istream.getline(lineBuffer, MAX_LINE_SIZE); - if(!StringUtils::StartsWith(StringUtils::Lower(lineBuffer), "spilut")) + if (!StringUtils::StartsWith(StringUtils::Lower(lineBuffer), "spilut")) { std::ostringstream os; os << "Error parsing .spi3d file ("; @@ -141,36 +140,52 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, float redValue = NAN, greenValue = NAN, blueValue = NAN; int entriesRemaining = rSize * gSize * bSize; - Array & lutArray = lut3d->getArray(); + Array & lutArray = lut3d->getArray(); unsigned long numVal = lutArray.getNumValues(); std::vector indexDefined(numVal, false); while (istream.good() && entriesRemaining > 0) { istream.getline(lineBuffer, MAX_LINE_SIZE); - char redValueS[64] = ""; + char redValueS[64] = ""; char greenValueS[64] = ""; - char blueValueS[64] = ""; + char blueValueS[64] = ""; #ifdef _WIN32 - if (sscanf(lineBuffer, - "%d %d %d %s %s %s", - &rIndex, &gIndex, &bIndex, - redValueS, 64, - greenValueS, 64, - blueValueS, 64) == 6) + if (sscanf( + lineBuffer, + "%d %d %d %s %s %s", + &rIndex, + &gIndex, + &bIndex, + redValueS, + 64, + greenValueS, + 64, + blueValueS, + 64) + == 6) #else - if (sscanf(lineBuffer, "%d %d %d %s %s %s", - &rIndex, &gIndex, &bIndex, - redValueS, greenValueS, blueValueS) == 6) + if (sscanf( + lineBuffer, + "%d %d %d %s %s %s", + &rIndex, + &gIndex, + &bIndex, + redValueS, + greenValueS, + blueValueS) + == 6) #endif { - const auto redValueAnswer = NumberUtils::from_chars(redValueS, redValueS + 64, redValue); - const auto greenValueAnswer = NumberUtils::from_chars(greenValueS, greenValueS + 64, greenValue); - const auto blueValueAnswer = NumberUtils::from_chars(blueValueS, blueValueS + 64, blueValue); - - if (redValueAnswer.ec != std::errc() - || greenValueAnswer.ec != std::errc() + const auto redValueAnswer + = NumberUtils::from_chars(redValueS, redValueS + 64, redValue); + const auto greenValueAnswer + = NumberUtils::from_chars(greenValueS, greenValueS + 64, greenValue); + const auto blueValueAnswer + = NumberUtils::from_chars(blueValueS, blueValueS + 64, blueValue); + + if (redValueAnswer.ec != std::errc() || greenValueAnswer.ec != std::errc() || blueValueAnswer.ec != std::errc()) { std::ostringstream os; @@ -185,21 +200,18 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, } bool invalidIndex = false; - if (rIndex < 0 || rIndex >= rSize - || gIndex < 0 || gIndex >= gSize - || bIndex < 0 || bIndex >= bSize) + if (rIndex < 0 || rIndex >= rSize || gIndex < 0 || gIndex >= gSize || bIndex < 0 + || bIndex >= bSize) { invalidIndex = true; } else { - index = GetLut3DIndex_BlueFast(rIndex, gIndex, bIndex, - rSize, gSize, bSize); + index = GetLut3DIndex_BlueFast(rIndex, gIndex, bIndex, rSize, gSize, bSize); if (index < 0 || index >= (int)numVal) { invalidIndex = true; } - } if (invalidIndex) @@ -215,10 +227,10 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, throw Exception(os.str().c_str()); } - lutArray[index+0] = redValue; - lutArray[index+1] = greenValue; - lutArray[index+2] = blueValue; - if (! indexDefined[index]) + lutArray[index + 0] = redValue; + lutArray[index + 1] = greenValue; + lutArray[index + 2] = blueValue; + if (!indexDefined[index]) { entriesRemaining--; indexDefined[index] = true; @@ -232,7 +244,7 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, os << "Data is invalid. "; os << "A LUT entry is specified multiple times ("; os << rIndex << " " << gIndex << " " << bIndex; - os << ")."; + os << ")."; throw Exception(os.str().c_str()); } } @@ -250,18 +262,19 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, } LocalCachedFileRcPtr cachedFile = LocalCachedFileRcPtr(new LocalCachedFile()); - cachedFile->lut = lut3d; + cachedFile->lut = lut3d; return cachedFile; } -void LocalFileFormat::bake(const Baker & baker, - const std::string & formatName, - std::ostream & ostream) const +void LocalFileFormat::bake( + const Baker & baker, + const std::string & formatName, + std::ostream & ostream) const { static const int DEFAULT_CUBE_SIZE = 32; - if(formatName != "spi3d") + if (formatName != "spi3d") { std::ostringstream os; os << "Unknown spi format name, '"; @@ -272,13 +285,14 @@ void LocalFileFormat::bake(const Baker & baker, ConstConfigRcPtr config = baker.getConfig(); int cubeSize = baker.getCubeSize(); - if(cubeSize==-1) cubeSize = DEFAULT_CUBE_SIZE; + if (cubeSize == -1) + cubeSize = DEFAULT_CUBE_SIZE; cubeSize = std::max(2, cubeSize); // smallest cube is 2x2x2 std::vector cubeData; - cubeData.resize(cubeSize*cubeSize*cubeSize*3); + cubeData.resize(cubeSize * cubeSize * cubeSize * 3); GenerateIdentityLut3D(&cubeData[0], cubeSize, 3, LUT3DORDER_FAST_BLUE); - PackedImageDesc cubeImg(&cubeData[0], cubeSize*cubeSize*cubeSize, 1, 3); + PackedImageDesc cubeImg(&cubeData[0], cubeSize * cubeSize * cubeSize, 1, 3); ConstCPUProcessorRcPtr inputToTarget = GetInputToTargetProcessor(baker); inputToTarget->apply(cubeImg); @@ -289,27 +303,25 @@ void LocalFileFormat::bake(const Baker & baker, // Set to a fixed 6 decimal precision ostream.setf(std::ios::fixed, std::ios::floatfield); ostream.precision(6); - for(int i=0; i(untypedCachedFile); - if(!cachedFile || !cachedFile->lut) // This should never happen. + if (!cachedFile || !cachedFile->lut) // This should never happen. { std::ostringstream os; os << "Cannot build Spi3D Op. Invalid cache type."; @@ -321,7 +333,7 @@ void LocalFileFormat::buildFileOps(OpRcPtrVec & ops, const auto fileInterp = fileTransform.getInterpolation(); bool fileInterpUsed = false; - auto lut = HandleLUT3D(cachedFile->lut, fileInterp, fileInterpUsed); + auto lut = HandleLUT3D(cachedFile->lut, fileInterp, fileInterpUsed); if (!fileInterpUsed) { @@ -330,7 +342,7 @@ void LocalFileFormat::buildFileOps(OpRcPtrVec & ops, CreateLut3DOp(ops, lut, newDir); } -} +} // namespace FileFormat * CreateFileFormatSpi3D() { diff --git a/src/OpenColorIO/fileformats/FileFormatSpiMtx.cpp b/src/OpenColorIO/fileformats/FileFormatSpiMtx.cpp old mode 100755 new mode 100644 index 663a4e9a5d..37c578e5de --- a/src/OpenColorIO/fileformats/FileFormatSpiMtx.cpp +++ b/src/OpenColorIO/fileformats/FileFormatSpiMtx.cpp @@ -7,12 +7,11 @@ #include -#include "ops/matrix/MatrixOp.h" #include "ParseUtils.h" +#include "ops/matrix/MatrixOp.h" #include "transforms/FileTransform.h" #include "utils/StringUtils.h" - namespace OCIO_NAMESPACE { @@ -23,10 +22,10 @@ class LocalCachedFile : public CachedFile public: LocalCachedFile() { - memset(m44, 0, 16*sizeof(double)); - memset(offset4, 0, 4*sizeof(double)); + memset(m44, 0, 16 * sizeof(double)); + memset(offset4, 0, 4 * sizeof(double)); }; - ~LocalCachedFile() {}; + ~LocalCachedFile(){}; double m44[16]; double offset4[4]; @@ -37,35 +36,35 @@ typedef OCIO_SHARED_PTR LocalCachedFileRcPtr; class LocalFileFormat : public FileFormat { public: - - ~LocalFileFormat() {}; + ~LocalFileFormat(){}; void getFormatInfo(FormatInfoVec & formatInfoVec) const override; - CachedFileRcPtr read(std::istream & istream, - const std::string & fileName, - Interpolation interp) const override; + CachedFileRcPtr read(std::istream & istream, const std::string & fileName, Interpolation interp) + const override; - void buildFileOps(OpRcPtrVec & ops, - const Config& config, - const ConstContextRcPtr & context, - CachedFileRcPtr untypedCachedFile, - const FileTransform& fileTransform, - TransformDirection dir) const override; + void buildFileOps( + OpRcPtrVec & ops, + const Config & config, + const ConstContextRcPtr & context, + CachedFileRcPtr untypedCachedFile, + const FileTransform & fileTransform, + TransformDirection dir) const override; }; void LocalFileFormat::getFormatInfo(FormatInfoVec & formatInfoVec) const { FormatInfo info; - info.name = "spimtx"; - info.extension = "spimtx"; + info.name = "spimtx"; + info.extension = "spimtx"; info.capabilities = FORMAT_CAPABILITY_READ; formatInfoVec.push_back(info); } -CachedFileRcPtr LocalFileFormat::read(std::istream & istream, - const std::string & fileName, - Interpolation /*interp*/) const +CachedFileRcPtr LocalFileFormat::read( + std::istream & istream, + const std::string & fileName, + Interpolation /*interp*/) const { // Read the entire file. @@ -83,10 +82,10 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, } // Turn it into parts - const StringUtils::StringVec lineParts + const StringUtils::StringVec lineParts = StringUtils::SplitByWhiteSpaces(StringUtils::Trim(fileStream.str())); - if(lineParts.size() != 12) + if (lineParts.size() != 12) { std::ostringstream os; os << "Error parsing .spimtx file ("; @@ -98,7 +97,7 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, // Turn the parts into floats std::vector floatArray; - if(!StringVecToFloatVec(floatArray, lineParts)) + if (!StringVecToFloatVec(floatArray, lineParts)) { std::ostringstream os; os << "Error parsing .spimtx file ("; @@ -107,22 +106,21 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, throw Exception(os.str().c_str()); } - // Put the bits in the right place LocalCachedFileRcPtr cachedFile = LocalCachedFileRcPtr(new LocalCachedFile()); - cachedFile->m44[0] = floatArray[0]; - cachedFile->m44[1] = floatArray[1]; - cachedFile->m44[2] = floatArray[2]; - cachedFile->m44[3] = 0.0; + cachedFile->m44[0] = floatArray[0]; + cachedFile->m44[1] = floatArray[1]; + cachedFile->m44[2] = floatArray[2]; + cachedFile->m44[3] = 0.0; - cachedFile->m44[4] = floatArray[4]; - cachedFile->m44[5] = floatArray[5]; - cachedFile->m44[6] = floatArray[6]; - cachedFile->m44[7] = 0.0; + cachedFile->m44[4] = floatArray[4]; + cachedFile->m44[5] = floatArray[5]; + cachedFile->m44[6] = floatArray[6]; + cachedFile->m44[7] = 0.0; - cachedFile->m44[8] = floatArray[8]; - cachedFile->m44[9] = floatArray[9]; + cachedFile->m44[8] = floatArray[8]; + cachedFile->m44[9] = floatArray[9]; cachedFile->m44[10] = floatArray[10]; cachedFile->m44[11] = 0.0; @@ -139,16 +137,17 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, return cachedFile; } -void LocalFileFormat::buildFileOps(OpRcPtrVec & ops, - const Config& /*config*/, - const ConstContextRcPtr & /*context*/, - CachedFileRcPtr untypedCachedFile, - const FileTransform& fileTransform, - TransformDirection dir) const +void LocalFileFormat::buildFileOps( + OpRcPtrVec & ops, + const Config & /*config*/, + const ConstContextRcPtr & /*context*/, + CachedFileRcPtr untypedCachedFile, + const FileTransform & fileTransform, + TransformDirection dir) const { LocalCachedFileRcPtr cachedFile = DynamicPtrCast(untypedCachedFile); - if(!cachedFile) // This should never happen. + if (!cachedFile) // This should never happen. { std::ostringstream os; os << "Cannot build SpiMtx Ops. Invalid cache type."; @@ -159,7 +158,7 @@ void LocalFileFormat::buildFileOps(OpRcPtrVec & ops, CreateMatrixOffsetOp(ops, cachedFile->m44, cachedFile->offset4, newDir); } -} +} // namespace FileFormat * CreateFileFormatSpiMtx() { @@ -167,4 +166,3 @@ FileFormat * CreateFileFormatSpiMtx() } } // namespace OCIO_NAMESPACE - diff --git a/src/OpenColorIO/fileformats/FileFormatTruelight.cpp b/src/OpenColorIO/fileformats/FileFormatTruelight.cpp old mode 100755 new mode 100644 index e3ee605026..ecc40495da --- a/src/OpenColorIO/fileformats/FileFormatTruelight.cpp +++ b/src/OpenColorIO/fileformats/FileFormatTruelight.cpp @@ -9,15 +9,14 @@ #include +#include "BakingUtils.h" +#include "ParseUtils.h" #include "fileformats/FileFormatUtils.h" #include "ops/lut1d/Lut1DOp.h" #include "ops/lut3d/Lut3DOp.h" -#include "BakingUtils.h" -#include "ParseUtils.h" #include "transforms/FileTransform.h" #include "utils/StringUtils.h" - // This implements the spec for: // Per http://www.filmlight.ltd.uk/resources/documents/truelight/white-papers_tl.php // FL-TL-TN-0388-TLCubeFormat2.0.pdf @@ -33,7 +32,6 @@ format. For integer formats, the range 0-1 is mapped onto the integer range. Flo values outside the 0-1 range are allowed but may be truncated for integer formats. */ - namespace OCIO_NAMESPACE { namespace @@ -41,7 +39,7 @@ namespace class LocalCachedFile : public CachedFile { public: - LocalCachedFile() = default; + LocalCachedFile() = default; ~LocalCachedFile() = default; Lut1DOpDataRcPtr lut1D; @@ -50,56 +48,54 @@ class LocalCachedFile : public CachedFile typedef OCIO_SHARED_PTR LocalCachedFileRcPtr; - class LocalFileFormat : public FileFormat { public: - - LocalFileFormat() = default; + LocalFileFormat() = default; ~LocalFileFormat() = default; void getFormatInfo(FormatInfoVec & formatInfoVec) const override; - CachedFileRcPtr read(std::istream & istream, - const std::string & fileName, - Interpolation interp) const override; + CachedFileRcPtr read(std::istream & istream, const std::string & fileName, Interpolation interp) + const override; - void bake(const Baker & baker, - const std::string & formatName, - std::ostream & ostream) const override; + void bake(const Baker & baker, const std::string & formatName, std::ostream & ostream) + const override; - void buildFileOps(OpRcPtrVec & ops, - const Config & config, - const ConstContextRcPtr & context, - CachedFileRcPtr untypedCachedFile, - const FileTransform & fileTransform, - TransformDirection dir) const override; + void buildFileOps( + OpRcPtrVec & ops, + const Config & config, + const ConstContextRcPtr & context, + CachedFileRcPtr untypedCachedFile, + const FileTransform & fileTransform, + TransformDirection dir) const override; }; void LocalFileFormat::getFormatInfo(FormatInfoVec & formatInfoVec) const { FormatInfo info; - info.name = "truelight"; - info.extension = "cub"; - info.capabilities = FormatCapabilityFlags(FORMAT_CAPABILITY_READ | FORMAT_CAPABILITY_BAKE); + info.name = "truelight"; + info.extension = "cub"; + info.capabilities = FormatCapabilityFlags(FORMAT_CAPABILITY_READ | FORMAT_CAPABILITY_BAKE); info.bake_capabilities = FormatBakeFlags(FORMAT_BAKE_CAPABILITY_3DLUT); formatInfoVec.push_back(info); } -CachedFileRcPtr LocalFileFormat::read(std::istream & istream, - const std::string & /* fileName unused */, - Interpolation interp) const +CachedFileRcPtr LocalFileFormat::read( + std::istream & istream, + const std::string & /* fileName unused */, + Interpolation interp) const { // this shouldn't happen - if(!istream) + if (!istream) { - throw Exception ("File stream empty when trying to read Truelight .cub LUT"); + throw Exception("File stream empty when trying to read Truelight .cub LUT"); } // Validate the file type std::string line; - if(!nextline(istream, line) || - !StringUtils::StartsWith(StringUtils::Lower(line), "# truelight cube")) + if (!nextline(istream, line) + || !StringUtils::StartsWith(StringUtils::Lower(line), "# truelight cube")) { throw Exception("LUT doesn't seem to be a Truelight .cub LUT."); } @@ -107,8 +103,8 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, // Parse the file std::vector raw1d; std::vector raw3d; - int size3d[] = { 0, 0, 0 }; - int size1d = 0; + int size3d[] = {0, 0, 0}; + int size1d = 0; { StringUtils::StringVec parts; std::vector tmpfloats; @@ -116,30 +112,30 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, bool in1d = false; bool in3d = false; - while(nextline(istream, line)) + while (nextline(istream, line)) { // Strip, lowercase, and split the line parts = StringUtils::SplitByWhiteSpaces(StringUtils::Lower(StringUtils::Trim(line))); - if(parts.empty()) continue; + if (parts.empty()) + continue; // Parse header metadata (which starts with #) - if(StringUtils::StartsWith(parts[0],"#")) + if (StringUtils::StartsWith(parts[0], "#")) { - if(parts.size() < 2) continue; + if (parts.size() < 2) + continue; - if(parts[1] == "width") + if (parts[1] == "width") { - if(parts.size() != 5 || - !StringToInt( &size3d[0], parts[2].c_str()) || - !StringToInt( &size3d[1], parts[3].c_str()) || - !StringToInt( &size3d[2], parts[4].c_str())) + if (parts.size() != 5 || !StringToInt(&size3d[0], parts[2].c_str()) + || !StringToInt(&size3d[1], parts[3].c_str()) + || !StringToInt(&size3d[2], parts[4].c_str())) { throw Exception("Malformed width tag in Truelight .cub LUT."); } - if (size3d[0] != size3d[1] || - size3d[0] != size3d[2]) + if (size3d[0] != size3d[1] || size3d[0] != size3d[2]) { std::ostringstream os; os << "Truelight .cub LUT. "; @@ -149,28 +145,27 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, throw Exception(os.str().c_str()); } - raw3d.reserve(3*size3d[0]*size3d[1]*size3d[2]); + raw3d.reserve(3 * size3d[0] * size3d[1] * size3d[2]); } - else if(parts[1] == "lutlength") + else if (parts[1] == "lutlength") { - if(parts.size() != 3 || - !StringToInt( &size1d, parts[2].c_str())) + if (parts.size() != 3 || !StringToInt(&size1d, parts[2].c_str())) { throw Exception("Malformed lutlength tag in Truelight .cub LUT."); } - raw1d.reserve(3*size1d); + raw1d.reserve(3 * size1d); } - else if(parts[1] == "inputlut") + else if (parts[1] == "inputlut") { in1d = true; in3d = false; } - else if(parts[1] == "cube") + else if (parts[1] == "cube") { in3d = true; in1d = false; } - else if(parts[1] == "end") + else if (parts[1] == "end") { in3d = false; in1d = false; @@ -180,18 +175,17 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, } } - - if(in1d || in3d) + if (in1d || in3d) { - if(StringVecToFloatVec(tmpfloats, parts) && (tmpfloats.size() == 3)) + if (StringVecToFloatVec(tmpfloats, parts) && (tmpfloats.size() == 3)) { - if(in1d) + if (in1d) { raw1d.push_back(tmpfloats[0]); raw1d.push_back(tmpfloats[1]); raw1d.push_back(tmpfloats[2]); } - else if(in3d) + else if (in3d) { raw3d.push_back(tmpfloats[0]); raw3d.push_back(tmpfloats[1]); @@ -204,31 +198,31 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, // Interpret the parsed data, validate LUT sizes - if(size1d != static_cast(raw1d.size()/3)) + if (size1d != static_cast(raw1d.size() / 3)) { std::ostringstream os; os << "Parse error in Truelight .cub LUT. "; os << "Incorrect number of lut1d entries. "; - os << "Found " << raw1d.size()/3 << ", expected " << size1d << "."; + os << "Found " << raw1d.size() / 3 << ", expected " << size1d << "."; throw Exception(os.str().c_str()); } - if(size3d[0]*size3d[1]*size3d[2] != static_cast(raw3d.size()/3)) + if (size3d[0] * size3d[1] * size3d[2] != static_cast(raw3d.size() / 3)) { std::ostringstream os; os << "Parse error in Truelight .cub LUT. "; os << "Incorrect number of 3D LUT entries. "; - os << "Found " << raw3d.size()/3 << ", expected " << size3d[0]*size3d[1]*size3d[2] << "."; + os << "Found " << raw3d.size() / 3 << ", expected " << size3d[0] * size3d[1] * size3d[2] + << "."; throw Exception(os.str().c_str()); } - LocalCachedFileRcPtr cachedFile = LocalCachedFileRcPtr(new LocalCachedFile()); const bool has3D = (size3d[0] * size3d[1] * size3d[2] > 0); // Reformat 1D data - if(size1d>0) + if (size1d > 0) { cachedFile->lut1D = std::make_shared(size1d); if (Lut1DOpData::IsValidInterpolation(interp)) @@ -245,13 +239,13 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, // and does this scaling incorrectly. float descale = 1.0f; - if(has3D) + if (has3D) { - descale = 1.0f / static_cast(size3d[0]-1); + descale = 1.0f / static_cast(size3d[0] - 1); } const auto nv = lutArray.getNumValues(); - for(unsigned long i = 0; i < nv; ++i) + for (unsigned long i = 0; i < nv; ++i) { lutArray[i] = raw1d[i] * descale; } @@ -272,35 +266,35 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, return cachedFile; } - -void -LocalFileFormat::bake(const Baker & baker, - const std::string & /*formatName*/, - std::ostream & ostream) const +void LocalFileFormat::bake( + const Baker & baker, + const std::string & /*formatName*/, + std::ostream & ostream) const { - const int DEFAULT_CUBE_SIZE = 32; + const int DEFAULT_CUBE_SIZE = 32; const int DEFAULT_SHAPER_SIZE = 1024; ConstConfigRcPtr config = baker.getConfig(); int cubeSize = baker.getCubeSize(); - if (cubeSize==-1) cubeSize = DEFAULT_CUBE_SIZE; + if (cubeSize == -1) + cubeSize = DEFAULT_CUBE_SIZE; cubeSize = std::max(2, cubeSize); // smallest cube is 2x2x2 std::vector cubeData; - cubeData.resize(cubeSize*cubeSize*cubeSize*3); + cubeData.resize(cubeSize * cubeSize * cubeSize * 3); GenerateIdentityLut3D(&cubeData[0], cubeSize, 3, LUT3DORDER_FAST_RED); - PackedImageDesc cubeImg(&cubeData[0], cubeSize*cubeSize*cubeSize, 1, 3); + PackedImageDesc cubeImg(&cubeData[0], cubeSize * cubeSize * cubeSize, 1, 3); // Apply processor to LUT data ConstCPUProcessorRcPtr inputToTarget = GetInputToTargetProcessor(baker); inputToTarget->apply(cubeImg); int shaperSize = baker.getShaperSize(); - if (shaperSize==-1) shaperSize = DEFAULT_SHAPER_SIZE; + if (shaperSize == -1) + shaperSize = DEFAULT_SHAPER_SIZE; shaperSize = std::max(2, shaperSize); // smallest shaper is 2x2x2 - // Write the header ostream << "# Truelight Cube v2.0\n"; ostream << "# lutLength " << shaperSize << "\n"; @@ -309,43 +303,43 @@ LocalFileFormat::bake(const Baker & baker, ostream << "# width " << cubeSize << " " << cubeSize << " " << cubeSize << "\n"; ostream << "\n"; - // Write the shaper LUT // (We are just going to use a unity LUT) ostream << "# InputLUT\n"; ostream << std::setprecision(6) << std::fixed; float v = 0.0f; - for (int i=0; i < shaperSize-1; i++) + for (int i = 0; i < shaperSize - 1; i++) { - v = ((float)i / (float)(shaperSize-1)) * (float)(cubeSize-1); + v = ((float)i / (float)(shaperSize - 1)) * (float)(cubeSize - 1); ostream << v << " " << v << " " << v << "\n"; } - v = (float) (cubeSize-1); + v = (float)(cubeSize - 1); ostream << v << " " << v << " " << v << "\n"; // ensure that the last value is spot on ostream << "\n"; // Write the cube ostream << "# Cube\n"; - for (int i=0; i(untypedCachedFile); // This should never happen. - if(!cachedFile || (!cachedFile->lut1D && !cachedFile->lut3D)) + if (!cachedFile || (!cachedFile->lut1D && !cachedFile->lut3D)) { std::ostringstream os; os << "Cannot build Truelight .cub Op. Invalid cache type."; @@ -357,8 +351,8 @@ LocalFileFormat::buildFileOps(OpRcPtrVec & ops, const auto fileInterp = fileTransform.getInterpolation(); bool fileInterpUsed = false; - auto lut1D = HandleLUT1D(cachedFile->lut1D, fileInterp, fileInterpUsed); - auto lut3D = HandleLUT3D(cachedFile->lut3D, fileInterp, fileInterpUsed); + auto lut1D = HandleLUT1D(cachedFile->lut1D, fileInterp, fileInterpUsed); + auto lut3D = HandleLUT3D(cachedFile->lut3D, fileInterp, fileInterpUsed); if (!fileInterpUsed) { @@ -367,31 +361,31 @@ LocalFileFormat::buildFileOps(OpRcPtrVec & ops, switch (newDir) { - case TRANSFORM_DIR_FORWARD: - if (lut1D) - { - CreateLut1DOp(ops, lut1D, newDir); - } + case TRANSFORM_DIR_FORWARD: + if (lut1D) + { + CreateLut1DOp(ops, lut1D, newDir); + } - if (lut3D) - { - CreateLut3DOp(ops, lut3D, newDir); - } - break; - case TRANSFORM_DIR_INVERSE: - if (lut3D) - { - CreateLut3DOp(ops, lut3D, newDir); - } + if (lut3D) + { + CreateLut3DOp(ops, lut3D, newDir); + } + break; + case TRANSFORM_DIR_INVERSE: + if (lut3D) + { + CreateLut3DOp(ops, lut3D, newDir); + } - if (lut1D) - { - CreateLut1DOp(ops, lut1D, newDir); - } - break; + if (lut1D) + { + CreateLut1DOp(ops, lut1D, newDir); + } + break; } } -} +} // namespace FileFormat * CreateFileFormatTruelight() { diff --git a/src/OpenColorIO/fileformats/FileFormatUtils.cpp b/src/OpenColorIO/fileformats/FileFormatUtils.cpp index 1e1906ba9a..947806e2cd 100644 --- a/src/OpenColorIO/fileformats/FileFormatUtils.cpp +++ b/src/OpenColorIO/fileformats/FileFormatUtils.cpp @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #include "fileformats/FileFormatUtils.h" #include "Logging.h" @@ -11,10 +10,9 @@ namespace OCIO_NAMESPACE // Handle the interpolation supplied by the FileTransform. If the interpolation matches what is // in the cached file, return that LUT. Otherwise clone the LUT and set the desired interpolation. // It sets fileInterpUsed to indicate that the fileInterp was legal for the given LUT. -template -OCIO_SHARED_PTR HandleLUT(const OCIO_SHARED_PTR & fileLut, - Interpolation fileInterp, - bool & fileInterpUsed) +template +OCIO_SHARED_PTR +HandleLUT(const OCIO_SHARED_PTR & fileLut, Interpolation fileInterp, bool & fileInterpUsed) { OCIO_SHARED_PTR lut; if (fileLut) @@ -41,16 +39,14 @@ OCIO_SHARED_PTR HandleLUT(const OCIO_SHARED_PTR & fileLut, return lut; } -Lut1DOpDataRcPtr HandleLUT1D(const Lut1DOpDataRcPtr & fileLut1D, - Interpolation fileInterp, - bool & fileInterpUsed) +Lut1DOpDataRcPtr +HandleLUT1D(const Lut1DOpDataRcPtr & fileLut1D, Interpolation fileInterp, bool & fileInterpUsed) { return HandleLUT(fileLut1D, fileInterp, fileInterpUsed); } -Lut3DOpDataRcPtr HandleLUT3D(const Lut3DOpDataRcPtr & fileLut3D, - Interpolation fileInterp, - bool & fileInterpUsed) +Lut3DOpDataRcPtr +HandleLUT3D(const Lut3DOpDataRcPtr & fileLut3D, Interpolation fileInterp, bool & fileInterpUsed) { return HandleLUT(fileLut3D, fileInterp, fileInterpUsed); } @@ -64,4 +60,4 @@ void LogWarningInterpolationNotUsed(Interpolation interp, const FileTransform & oss << std::string(fileTransform.getSrc()) << "'."; LogWarning(oss.str()); } -} // OCIO_NAMESPACE +} // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/fileformats/FileFormatUtils.h b/src/OpenColorIO/fileformats/FileFormatUtils.h index c3808b95dd..aebef14068 100644 --- a/src/OpenColorIO/fileformats/FileFormatUtils.h +++ b/src/OpenColorIO/fileformats/FileFormatUtils.h @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_FILEFORMAT_UTILS_H #define INCLUDED_OCIO_FILEFORMAT_UTILS_H @@ -12,15 +11,13 @@ namespace OCIO_NAMESPACE { -Lut1DOpDataRcPtr HandleLUT1D(const Lut1DOpDataRcPtr & fileLut1D, - Interpolation fileInterp, - bool & fileInterpUsed); +Lut1DOpDataRcPtr +HandleLUT1D(const Lut1DOpDataRcPtr & fileLut1D, Interpolation fileInterp, bool & fileInterpUsed); -Lut3DOpDataRcPtr HandleLUT3D(const Lut3DOpDataRcPtr & fileLut3D, - Interpolation fileInterp, - bool & fileInterpUsed); +Lut3DOpDataRcPtr +HandleLUT3D(const Lut3DOpDataRcPtr & fileLut3D, Interpolation fileInterp, bool & fileInterpUsed); void LogWarningInterpolationNotUsed(Interpolation interp, const FileTransform & fileTransform); -} // OCIO_NAMESPACE +} // namespace OCIO_NAMESPACE #endif // INCLUDED_OCIO_FILEFORMAT_UTILS_H \ No newline at end of file diff --git a/src/OpenColorIO/fileformats/FileFormatVF.cpp b/src/OpenColorIO/fileformats/FileFormatVF.cpp old mode 100755 new mode 100644 index 03ff191d5f..3545d7ff88 --- a/src/OpenColorIO/fileformats/FileFormatVF.cpp +++ b/src/OpenColorIO/fileformats/FileFormatVF.cpp @@ -8,14 +8,13 @@ #include +#include "ParseUtils.h" #include "fileformats/FileFormatUtils.h" #include "ops/lut3d/Lut3DOp.h" #include "ops/matrix/MatrixOp.h" -#include "ParseUtils.h" #include "transforms/FileTransform.h" #include "utils/StringUtils.h" - namespace OCIO_NAMESPACE { namespace @@ -23,45 +22,45 @@ namespace class LocalCachedFile : public CachedFile { public: - LocalCachedFile() = default; + LocalCachedFile() = default; ~LocalCachedFile() = default; Lut3DOpDataRcPtr lut3D; - double m44[16]{ 0 }; + double m44[16]{0}; bool useMatrix = false; }; typedef OCIO_SHARED_PTR LocalCachedFileRcPtr; - - class LocalFileFormat : public FileFormat { public: - LocalFileFormat() = default; + LocalFileFormat() = default; ~LocalFileFormat() = default; void getFormatInfo(FormatInfoVec & formatInfoVec) const override; - CachedFileRcPtr read(std::istream & istream, - const std::string & fileName, - Interpolation interp) const override; + CachedFileRcPtr read(std::istream & istream, const std::string & fileName, Interpolation interp) + const override; - void buildFileOps(OpRcPtrVec & ops, - const Config & config, - const ConstContextRcPtr & context, - CachedFileRcPtr untypedCachedFile, - const FileTransform & fileTransform, - TransformDirection dir) const override; + void buildFileOps( + OpRcPtrVec & ops, + const Config & config, + const ConstContextRcPtr & context, + CachedFileRcPtr untypedCachedFile, + const FileTransform & fileTransform, + TransformDirection dir) const override; private: - static void ThrowErrorMessage(const std::string & error, - const std::string & fileName, - int line, - const std::string & lineContent); + static void ThrowErrorMessage( + const std::string & error, + const std::string & fileName, + int line, + const std::string & lineContent); }; -void LocalFileFormat::ThrowErrorMessage(const std::string & error, +void LocalFileFormat::ThrowErrorMessage( + const std::string & error, const std::string & fileName, int line, const std::string & lineContent) @@ -83,35 +82,34 @@ void LocalFileFormat::ThrowErrorMessage(const std::string & error, void LocalFileFormat::getFormatInfo(FormatInfoVec & formatInfoVec) const { FormatInfo info; - info.name = "nukevf"; - info.extension = "vf"; + info.name = "nukevf"; + info.extension = "vf"; info.capabilities = FORMAT_CAPABILITY_READ; formatInfoVec.push_back(info); } -CachedFileRcPtr LocalFileFormat::read(std::istream & istream, - const std::string & fileName, - Interpolation interp) const +CachedFileRcPtr LocalFileFormat::read( + std::istream & istream, + const std::string & fileName, + Interpolation interp) const { // this shouldn't happen - if(!istream) + if (!istream) { - throw Exception ("File stream empty when trying to read .vf LUT"); + throw Exception("File stream empty when trying to read .vf LUT"); } // Validate the file type std::string line; int lineNumber = 1; - if(!nextline(istream, line) || - !StringUtils::StartsWith(StringUtils::Lower(line), "#inventor")) + if (!nextline(istream, line) || !StringUtils::StartsWith(StringUtils::Lower(line), "#inventor")) { - ThrowErrorMessage("Expecting '#Inventor V2.1 ascii'.", - fileName, lineNumber, line); + ThrowErrorMessage("Expecting '#Inventor V2.1 ascii'.", fileName, lineNumber, line); } // Parse the file std::vector raw3d; - int size3d[] = { 0, 0, 0 }; + int size3d[] = {0, 0, 0}; std::vector global_transform; { @@ -120,75 +118,76 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, bool in3d = false; - while(nextline(istream, line)) + while (nextline(istream, line)) { ++lineNumber; // Strip, lowercase, and split the line parts = StringUtils::SplitByWhiteSpaces(StringUtils::Lower(StringUtils::Trim(line))); - if(parts.empty()) continue; + if (parts.empty()) + continue; - if(StringUtils::StartsWith(parts[0],"#")) continue; + if (StringUtils::StartsWith(parts[0], "#")) + continue; - if(!in3d) + if (!in3d) { - if(parts[0] == "grid_size") + if (parts[0] == "grid_size") { - if(parts.size() != 4 || - !StringToInt( &size3d[0], parts[1].c_str()) || - !StringToInt( &size3d[1], parts[2].c_str()) || - !StringToInt( &size3d[2], parts[3].c_str())) + if (parts.size() != 4 || !StringToInt(&size3d[0], parts[1].c_str()) + || !StringToInt(&size3d[1], parts[2].c_str()) + || !StringToInt(&size3d[2], parts[3].c_str())) { - ThrowErrorMessage( - "Malformed grid_size tag.", - fileName, lineNumber, line); + ThrowErrorMessage("Malformed grid_size tag.", fileName, lineNumber, line); } // TODO: Support nununiformly sized LUTs. - if (size3d[0] != size3d[1] || - size3d[0] != size3d[2]) + if (size3d[0] != size3d[1] || size3d[0] != size3d[2]) { std::ostringstream os; os << "Only equal grid size LUTs are supported. Found "; os << "grid size: " << size3d[0] << " x "; os << size3d[1] << " x " << size3d[2] << "."; - ThrowErrorMessage( - os.str(), - fileName, lineNumber, line); + ThrowErrorMessage(os.str(), fileName, lineNumber, line); } - raw3d.reserve(3*size3d[0]*size3d[1]*size3d[2]); + raw3d.reserve(3 * size3d[0] * size3d[1] * size3d[2]); } - else if(parts[0] == "global_transform") + else if (parts[0] == "global_transform") { - if(parts.size() != 17) + if (parts.size() != 17) { ThrowErrorMessage( "Malformed global_transform tag. " "16 floats expected.", - fileName, lineNumber, line); + fileName, + lineNumber, + line); } parts.erase(parts.begin()); // Drop the 1st entry. (the tag) - if(!StringVecToFloatVec(global_transform, parts) || global_transform.size() != 16) + if (!StringVecToFloatVec(global_transform, parts) + || global_transform.size() != 16) { ThrowErrorMessage( "Malformed global_transform tag. " "Could not convert to float array.", - fileName, lineNumber, line); + fileName, + lineNumber, + line); } } // TODO: element_size (aka scale3) // TODO: world_origin (aka translate3) - else if(parts[0] == "data") + else if (parts[0] == "data") { in3d = true; } } else // (in3d) { - if(StringVecToFloatVec(tmpfloats, parts) && (tmpfloats.size() == 3)) + if (StringVecToFloatVec(tmpfloats, parts) && (tmpfloats.size() == 3)) { raw3d.push_back(tmpfloats[0]); raw3d.push_back(tmpfloats[1]); @@ -199,38 +198,35 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, } // Interpret the parsed data, validate LUT sizes - if(size3d[0]*size3d[1]*size3d[2] != static_cast(raw3d.size()/3)) + if (size3d[0] * size3d[1] * size3d[2] != static_cast(raw3d.size() / 3)) { std::ostringstream os; os << "Incorrect number of 3D LUT entries. "; - os << "Found " << raw3d.size()/3 << ", expected " << size3d[0]*size3d[1]*size3d[2] << "."; - ThrowErrorMessage( - os.str().c_str(), - fileName, -1, ""); + os << "Found " << raw3d.size() / 3 << ", expected " << size3d[0] * size3d[1] * size3d[2] + << "."; + ThrowErrorMessage(os.str().c_str(), fileName, -1, ""); } - if(size3d[0]*size3d[1]*size3d[2] == 0) + if (size3d[0] * size3d[1] * size3d[2] == 0) { - ThrowErrorMessage( - "No 3D LUT entries found.", - fileName, -1, ""); + ThrowErrorMessage("No 3D LUT entries found.", fileName, -1, ""); } LocalCachedFileRcPtr cachedFile = LocalCachedFileRcPtr(new LocalCachedFile()); // Setup the global matrix. // (Nuke pre-scales this by the 3D LUT size, so we must undo that here) - if(global_transform.size() == 16) + if (global_transform.size() == 16) { - for(int i=0; i<4; ++i) + for (int i = 0; i < 4; ++i) { - global_transform[4*i+0] *= static_cast(size3d[0]); - global_transform[4*i+1] *= static_cast(size3d[1]); - global_transform[4*i+2] *= static_cast(size3d[2]); - cachedFile->m44[4*i+0] = global_transform[4*i+0]; - cachedFile->m44[4*i+1] = global_transform[4*i+1]; - cachedFile->m44[4*i+2] = global_transform[4*i+2]; - cachedFile->m44[4*i+3] = global_transform[4*i+3]; + global_transform[4 * i + 0] *= static_cast(size3d[0]); + global_transform[4 * i + 1] *= static_cast(size3d[1]); + global_transform[4 * i + 2] *= static_cast(size3d[2]); + cachedFile->m44[4 * i + 0] = global_transform[4 * i + 0]; + cachedFile->m44[4 * i + 1] = global_transform[4 * i + 1]; + cachedFile->m44[4 * i + 2] = global_transform[4 * i + 2]; + cachedFile->m44[4 * i + 3] = global_transform[4 * i + 3]; } cachedFile->useMatrix = true; @@ -250,18 +246,18 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, return cachedFile; } -void -LocalFileFormat::buildFileOps(OpRcPtrVec & ops, - const Config & /*config*/, - const ConstContextRcPtr & /*context*/, - CachedFileRcPtr untypedCachedFile, - const FileTransform & fileTransform, - TransformDirection dir) const +void LocalFileFormat::buildFileOps( + OpRcPtrVec & ops, + const Config & /*config*/, + const ConstContextRcPtr & /*context*/, + CachedFileRcPtr untypedCachedFile, + const FileTransform & fileTransform, + TransformDirection dir) const { LocalCachedFileRcPtr cachedFile = DynamicPtrCast(untypedCachedFile); // This should never happen. - if(!cachedFile) + if (!cachedFile) { std::ostringstream os; os << "Cannot build .vf Op. Invalid cache type."; @@ -277,7 +273,7 @@ LocalFileFormat::buildFileOps(OpRcPtrVec & ops, if (cachedFile->lut3D) { bool fileInterpUsed = false; - lut3D = HandleLUT3D(cachedFile->lut3D, fileInterp, fileInterpUsed); + lut3D = HandleLUT3D(cachedFile->lut3D, fileInterp, fileInterpUsed); if (!fileInterpUsed) { @@ -287,31 +283,31 @@ LocalFileFormat::buildFileOps(OpRcPtrVec & ops, switch (newDir) { - case TRANSFORM_DIR_FORWARD: - if (cachedFile->useMatrix) - { - CreateMatrixOp(ops, cachedFile->m44, newDir); - } + case TRANSFORM_DIR_FORWARD: + if (cachedFile->useMatrix) + { + CreateMatrixOp(ops, cachedFile->m44, newDir); + } - if (lut3D) - { - CreateLut3DOp(ops, lut3D, newDir); - } - break; - case TRANSFORM_DIR_INVERSE: - if (lut3D) - { - CreateLut3DOp(ops, lut3D, newDir); - } + if (lut3D) + { + CreateLut3DOp(ops, lut3D, newDir); + } + break; + case TRANSFORM_DIR_INVERSE: + if (lut3D) + { + CreateLut3DOp(ops, lut3D, newDir); + } - if (cachedFile->useMatrix) - { - CreateMatrixOp(ops, cachedFile->m44, newDir); - } - break; + if (cachedFile->useMatrix) + { + CreateMatrixOp(ops, cachedFile->m44, newDir); + } + break; } } -} +} // namespace FileFormat * CreateFileFormatVF() { @@ -319,4 +315,3 @@ FileFormat * CreateFileFormatVF() } } // namespace OCIO_NAMESPACE - diff --git a/src/OpenColorIO/fileformats/FormatMetadata.cpp b/src/OpenColorIO/fileformats/FormatMetadata.cpp index 8b5fe1cfad..6dd14a7cc2 100644 --- a/src/OpenColorIO/fileformats/FormatMetadata.cpp +++ b/src/OpenColorIO/fileformats/FormatMetadata.cpp @@ -6,26 +6,26 @@ #include -#include "fileformats/FormatMetadata.h" #include "Op.h" #include "Platform.h" +#include "fileformats/FormatMetadata.h" namespace OCIO_NAMESPACE { // CLF XML elements described in S-2014-006. -const char * METADATA_DESCRIPTION = "Description"; -const char * METADATA_INFO = "Info"; -const char * METADATA_INPUT_DESCRIPTOR = "InputDescriptor"; +const char * METADATA_DESCRIPTION = "Description"; +const char * METADATA_INFO = "Info"; +const char * METADATA_INPUT_DESCRIPTOR = "InputDescriptor"; const char * METADATA_OUTPUT_DESCRIPTOR = "OutputDescriptor"; // NAME and ID are CLF XML attributes described in S-2014-006. const char * METADATA_NAME = "name"; -const char * METADATA_ID = "id"; +const char * METADATA_ID = "id"; -std::ostream & operator<< (std::ostream & os, const FormatMetadata & fd) +std::ostream & operator<<(std::ostream & os, const FormatMetadata & fd) { - const std::string name{ fd.getElementName() }; + const std::string name{fd.getElementName()}; os << "<" << name; const int numAtt = fd.getNumAttributes(); if (numAtt) @@ -36,7 +36,7 @@ std::ostream & operator<< (std::ostream & os, const FormatMetadata & fd) } } os << ">"; - const std::string val{ fd.getElementValue() }; + const std::string val{fd.getElementValue()}; if (!val.empty()) { os << val; @@ -93,10 +93,10 @@ const FormatMetadataImpl::Attributes & FormatMetadataImpl::getAttributes() const void FormatMetadataImpl::addAttribute(const Attribute & attribute) noexcept { - // If this attribute already exists, overwrite the value. - // Otherwise, add the new attribute. This ensures that we do not + // If this attribute already exists, overwrite the value. + // Otherwise, add the new attribute. This ensures that we do not // have the same attribute twice. - Attributes::iterator it = m_attributes.begin(); + Attributes::iterator it = m_attributes.begin(); const Attributes::iterator itEnd = m_attributes.end(); for (; it != itEnd; ++it) @@ -121,7 +121,6 @@ const FormatMetadataImpl::Elements & FormatMetadataImpl::getChildrenElements() c return m_elements; } - namespace { void Combine(std::string & first, const std::string & second) noexcept @@ -135,7 +134,7 @@ void Combine(std::string & first, const std::string & second) noexcept first += second; } } -} +} // namespace void FormatMetadataImpl::combine(const FormatMetadataImpl & rhs) { @@ -159,8 +158,7 @@ void FormatMetadataImpl::combine(const FormatMetadataImpl & rhs) const int attribIndex = findNamedAttribute(attrib.first); if (attribIndex != -1) { - Combine(m_attributes[attribIndex].second, - attrib.second); + Combine(m_attributes[attribIndex].second, attrib.second); } else { @@ -194,10 +192,8 @@ bool FormatMetadataImpl::operator==(const FormatMetadataImpl & rhs) const { if (this != &rhs) { - return m_name == rhs.m_name && - m_value == rhs.m_value && - m_attributes == rhs.m_attributes && - m_elements == rhs.m_elements; + return m_name == rhs.m_name && m_value == rhs.m_value && m_attributes == rhs.m_attributes + && m_elements == rhs.m_elements; } return true; } @@ -258,7 +254,7 @@ const char * FormatMetadataImpl::getElementName() const noexcept void FormatMetadataImpl::setElementName(const char * name) { - std::string nameStr{ name ? name : "" }; + std::string nameStr{name ? name : ""}; validateElementName(nameStr); m_name = nameStr; } @@ -274,7 +270,7 @@ void FormatMetadataImpl::setElementValue(const char * value) { throw Exception("FormatMetadata 'ROOT' can't have a value."); } - m_value = std::string{ value ? value : "" }; + m_value = std::string{value ? value : ""}; } int FormatMetadataImpl::getNumAttributes() const noexcept @@ -327,7 +323,7 @@ const std::string & FormatMetadataImpl::getAttributeValueString(const char * nam } } } - static const std::string emptyString{ "" }; + static const std::string emptyString{""}; return emptyString; } @@ -383,7 +379,7 @@ FormatMetadata & FormatMetadataImpl::operator=(const FormatMetadata & rhs) if (this != &rhs) { const FormatMetadataImpl & metadata = dynamic_cast(rhs); - *this = metadata; + *this = metadata; } return *this; } @@ -411,4 +407,3 @@ void FormatMetadataImpl::setID(const char * id) noexcept } } // namespace OCIO_NAMESPACE - diff --git a/src/OpenColorIO/fileformats/FormatMetadata.h b/src/OpenColorIO/fileformats/FormatMetadata.h index 35c8cb2e01..7f6f04c990 100644 --- a/src/OpenColorIO/fileformats/FormatMetadata.h +++ b/src/OpenColorIO/fileformats/FormatMetadata.h @@ -15,7 +15,6 @@ namespace OCIO_NAMESPACE { - // ROOT is simply a placeholder name for the top-level element, since each // instance needs a name string. (At the file level in CLF/CTF, the actual // name would be ProcessList. At the op level it would be the process node @@ -28,12 +27,12 @@ static constexpr char METADATA_ROOT[] = "ROOT"; // -- a value string (e.g. "updated viewing LUT") // -- a list of attributes (name, value) string pairs (e.g. "version", "1.5") // -- and a list of child sub-elements, which are also FormatMetadataImpl objects. -// +// // Root "ProcessList" metadata for CLF/CTF files may include attributes such as // "name" and "id" and sub - elements such as "Info", "Description", // "InputDescriptor", and "OutputDescriptor". This class is also used to hold // the metadata within individual ops in a CLF/CTF file, which similarly may -// contain items such as name or id attributes and Description elements. +// contain items such as name or id attributes and Description elements. // (It does not hold the actual LUT or parameter values.) class FormatMetadataImpl : public FormatMetadata { @@ -43,8 +42,7 @@ class FormatMetadataImpl : public FormatMetadata typedef std::vector Attributes; FormatMetadataImpl(); - FormatMetadataImpl(const std::string & name, - const std::string & value); + FormatMetadataImpl(const std::string & name, const std::string & value); FormatMetadataImpl(const FormatMetadataImpl & other); FormatMetadataImpl(const FormatMetadata & other); @@ -110,10 +108,10 @@ class FormatMetadataImpl : public FormatMetadata void validateElementName(const std::string & name) const; private: - std::string m_name; // The element name - std::string m_value; // The element value - Attributes m_attributes; // The element's list of attributes - Elements m_elements; // The list of sub-elements + std::string m_name; // The element name + std::string m_value; // The element value + Attributes m_attributes; // The element's list of attributes + Elements m_elements; // The list of sub-elements }; } // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/fileformats/cdl/CDLParser.cpp b/src/OpenColorIO/fileformats/cdl/CDLParser.cpp index 1c02d7670e..4954807683 100644 --- a/src/OpenColorIO/fileformats/cdl/CDLParser.cpp +++ b/src/OpenColorIO/fileformats/cdl/CDLParser.cpp @@ -3,13 +3,13 @@ #include +#include "Platform.h" #include "expat.h" #include "fileformats/cdl/CDLParser.h" #include "fileformats/cdl/CDLReaderHelper.h" #include "fileformats/xmlutils/XMLReaderHelper.h" #include "fileformats/xmlutils/XMLReaderUtils.h" #include "transforms/CDLTransform.h" -#include "Platform.h" namespace OCIO_NAMESPACE { @@ -19,7 +19,7 @@ class CDLParser::Impl public: Impl() = delete; explicit Impl(const std::string & fileName); - Impl(const Impl &) = delete; + Impl(const Impl &) = delete; Impl & operator=(const Impl &) = delete; ~Impl(); @@ -31,30 +31,21 @@ class CDLParser::Impl unsigned int getXmlLocation() const; - const std::string& getXmlFilename() const; + const std::string & getXmlFilename() const; ElementRcPtr getBackElement() const; // Check is the last element on the stack is an instance of the type T. - template - bool isBackElementInstanceOf() const; + template bool isBackElementInstanceOf() const; // Create a dummy element. - DummyEltRcPtr createDummyElement(const std::string& name, - const std::string& msg) const; + DummyEltRcPtr createDummyElement(const std::string & name, const std::string & msg) const; // Create an element of type T. - template - OCIO_SHARED_PTR createElement(const std::string& name) const; + template OCIO_SHARED_PTR createElement(const std::string & name) const; - bool isCC() const - { - return m_isCC; - } - bool isCCC() const - { - return m_isCCC; - } + bool isCC() const { return m_isCC; } + bool isCCC() const { return m_isCCC; } protected: // Parse a line. @@ -65,86 +56,75 @@ class CDLParser::Impl void throwMessage(const std::string & error) const; // Start the parsing of one element in the CDL schema. - static void StartElementHandlerCDL(void *userData, - const XML_Char *name, - const XML_Char **atts); + static void + StartElementHandlerCDL(void * userData, const XML_Char * name, const XML_Char ** atts); // Start the parsing of one element in the CCC schema. - static void StartElementHandlerCCC(void *userData, - const XML_Char *name, - const XML_Char **atts); + static void + StartElementHandlerCCC(void * userData, const XML_Char * name, const XML_Char ** atts); // Start the parsing of one element in the CC schema. - static void StartElementHandlerCC(void *userData, - const XML_Char *name, - const XML_Char **atts); + static void + StartElementHandlerCC(void * userData, const XML_Char * name, const XML_Char ** atts); // Verify if the data for starting a CDL/CCC/CC element is valid. - static bool IsValidStartElement(CDLParser::Impl* pImpl, - const XML_Char *name); + static bool IsValidStartElement(CDLParser::Impl * pImpl, const XML_Char * name); - // Helper methods to handle the start of specific elements. + // Helper methods to handle the start of specific elements. // Handle the start of a ColorDecisionList element. - static bool HandleColorDecisionListStartElement(CDLParser::Impl* pImpl, - const XML_Char *name); + static bool HandleColorDecisionListStartElement(CDLParser::Impl * pImpl, const XML_Char * name); // Handle the start of a ColorDecision element. - static bool HandleColorDecisionStartElement(CDLParser::Impl* pImpl, - const XML_Char *name); + static bool HandleColorDecisionStartElement(CDLParser::Impl * pImpl, const XML_Char * name); // Handle the start of a ColorCorrectionCollection element. static bool HandleColorCorrectionCollectionStartElement( - CDLParser::Impl* pImpl, const XML_Char *name); + CDLParser::Impl * pImpl, + const XML_Char * name); // Handle the start of a ColorCorrection element in the CDL schema. - static bool HandleColorCorrectionCDLStartElement(CDLParser::Impl* pImpl, - const XML_Char *name); + static bool HandleColorCorrectionCDLStartElement( + CDLParser::Impl * pImpl, + const XML_Char * name); // Handle the start of a ColorCorrection element in the CCC schema. - static bool HandleColorCorrectionCCCStartElement(CDLParser::Impl* pImpl, - const XML_Char *name); + static bool HandleColorCorrectionCCCStartElement( + CDLParser::Impl * pImpl, + const XML_Char * name); // Handle the start of a ColorCorrection element in the CC schema. - static bool HandleColorCorrectionCCStartElement(CDLParser::Impl* pImpl, - const XML_Char *name); + static bool HandleColorCorrectionCCStartElement(CDLParser::Impl * pImpl, const XML_Char * name); // Handle the start of a SOPNode element. - static bool HandleSOPNodeStartElement(CDLParser::Impl* pImpl, - const XML_Char *name); + static bool HandleSOPNodeStartElement(CDLParser::Impl * pImpl, const XML_Char * name); // Handle the start of a SatNode element. - static bool HandleSatNodeStartElement(CDLParser::Impl* pImpl, - const XML_Char *name); + static bool HandleSatNodeStartElement(CDLParser::Impl * pImpl, const XML_Char * name); // Handle the start of a terminal/leaf element. // Specific element handled are: // Slope, Offset, Power, and Saturation. - static bool HandleTerminalStartElement(CDLParser::Impl* pImpl, - const XML_Char *name); + static bool HandleTerminalStartElement(CDLParser::Impl * pImpl, const XML_Char * name); // Default handler for the start of an unknown element. - static bool HandleUnknownStartElement(CDLParser::Impl* pImpl, - const XML_Char *name); + static bool HandleUnknownStartElement(CDLParser::Impl * pImpl, const XML_Char * name); // End the parsing of one element. - static void EndElementHandler(void *userData, - const XML_Char *name); + static void EndElementHandler(void * userData, const XML_Char * name); // Handle of strings within an element. - static void CharacterDataHandler(void *userData, - const XML_Char *s, int len); + static void CharacterDataHandler(void * userData, const XML_Char * s, int len); // Check if a description tag matches the required schema. - static bool IsValidDescriptionTag(const std::string& currentId, - const std::string& parentId); + static bool IsValidDescriptionTag(const std::string & currentId, const std::string & parentId); // Reset the parsing. void reset(); // Use the buffer string to detect the input schema and // initialize the related element handlers. - void initializeHandlers(const char* buffer); + void initializeHandlers(const char * buffer); // Validate if the parsed file or buffer was successful. void validateParsing() const; @@ -240,12 +220,9 @@ void CDLParser::Impl::throwMessage(const std::string & error) const void CDLParser::Impl::parse(const std::string & buffer, bool lastLine) { - const int done = lastLine?1:0; + const int done = lastLine ? 1 : 0; - if (XML_STATUS_ERROR == XML_Parse(m_parser, - buffer.c_str(), - (int)buffer.size(), - done)) + if (XML_STATUS_ERROR == XML_Parse(m_parser, buffer.c_str(), (int)buffer.size(), done)) { XML_Error eXpatErrorCode = XML_GetErrorCode(m_parser); if (eXpatErrorCode == XML_ERROR_TAG_MISMATCH) @@ -275,7 +252,6 @@ void CDLParser::Impl::parse(const std::string & buffer, bool lastLine) throwMessage(error); } } - } const CDLParsingInfoRcPtr & CDLParser::Impl::getCDLParsingInfo() const @@ -283,36 +259,30 @@ const CDLParsingInfoRcPtr & CDLParser::Impl::getCDLParsingInfo() const return m_parsingInfo; } -bool FindRootElement(const std::string& header, const std::string& tag) +bool FindRootElement(const std::string & header, const std::string & tag) { // Find root element tag at beginning of the file. const std::string pattern = std::string("<") + tag; return strstr(header.c_str(), pattern.c_str()) != 0x0; } -void CDLParser::Impl::initializeHandlers(const char* buffer) +void CDLParser::Impl::initializeHandlers(const char * buffer) { XML_SetUserData(m_parser, this); XML_SetCharacterDataHandler(m_parser, CharacterDataHandler); if (FindRootElement(buffer, CDL_TAG_COLOR_DECISION_LIST)) { - XML_SetElementHandler(m_parser, - StartElementHandlerCDL, - EndElementHandler); + XML_SetElementHandler(m_parser, StartElementHandlerCDL, EndElementHandler); } else if (FindRootElement(buffer, CDL_TAG_COLOR_CORRECTION_COLLECTION)) { - XML_SetElementHandler(m_parser, - StartElementHandlerCCC, - EndElementHandler); + XML_SetElementHandler(m_parser, StartElementHandlerCCC, EndElementHandler); m_isCCC = true; } else if (FindRootElement(buffer, CDL_TAG_COLOR_CORRECTION)) { - XML_SetElementHandler(m_parser, - StartElementHandlerCC, - EndElementHandler); + XML_SetElementHandler(m_parser, StartElementHandlerCC, EndElementHandler); m_isCC = true; // If parsing a CC, initialize the TransformList explicitly. @@ -334,10 +304,10 @@ void CDLParser::Impl::validateParsing() const throwMessage(error); } - const CDLTransformVec& pTransformList = getCDLParsingInfo()->m_transforms; - for (size_t i = 0; im_transforms; + for (size_t i = 0; i < pTransformList.size(); ++i) { - const CDLTransformRcPtr& pTransform = pTransformList.at(i); + const CDLTransformRcPtr & pTransform = pTransformList.at(i); if (pTransform.use_count() == 0) { static const std::string error("CDL parsing error: " @@ -352,7 +322,7 @@ unsigned int CDLParser::Impl::getXmlLocation() const return m_lineNumber; } -const std::string& CDLParser::Impl::getXmlFilename() const +const std::string & CDLParser::Impl::getXmlFilename() const { static const std::string emptyName("File name not specified"); return m_fileName.empty() ? emptyName : m_fileName; @@ -368,29 +338,27 @@ void CDLParser::Impl::reset() m_elms.clear(); m_lineNumber = 0; - m_fileName = ""; - m_isCC = false; - m_isCCC = false; + m_fileName = ""; + m_isCC = false; + m_isCCC = false; } -DummyEltRcPtr CDLParser::Impl::createDummyElement( - const std::string& name, const std::string& msg) const +DummyEltRcPtr CDLParser::Impl::createDummyElement(const std::string & name, const std::string & msg) + const { - return std::make_shared(name, - getBackElement(), - getXmlLocation(), - getXmlFilename(), - msg.c_str()); + return std::make_shared( + name, + getBackElement(), + getXmlLocation(), + getXmlFilename(), + msg.c_str()); } -template -OCIO_SHARED_PTR CDLParser::Impl::createElement(const std::string& name) const +template +OCIO_SHARED_PTR CDLParser::Impl::createElement(const std::string & name) const { auto pContainer = std::dynamic_pointer_cast(getBackElement()); - return std::make_shared(name, - pContainer, - getXmlLocation(), - getXmlFilename()); + return std::make_shared(name, pContainer, getXmlLocation(), getXmlFilename()); } ElementRcPtr CDLParser::Impl::getBackElement() const @@ -398,88 +366,82 @@ ElementRcPtr CDLParser::Impl::getBackElement() const return m_elms.size() ? m_elms.back() : ElementRcPtr(); } -template -bool CDLParser::Impl::isBackElementInstanceOf() const +template bool CDLParser::Impl::isBackElementInstanceOf() const { - return dynamic_cast(getBackElement().get()) != 0x0; + return dynamic_cast(getBackElement().get()) != 0x0; } -bool CDLParser::Impl::IsValidDescriptionTag(const std::string& currentId, - const std::string& parentId) +bool CDLParser::Impl::IsValidDescriptionTag( + const std::string & currentId, + const std::string & parentId) { - const char* currId = currentId.c_str(); - const char* parId = parentId.c_str(); + const char * currId = currentId.c_str(); + const char * parId = parentId.c_str(); - const bool isDesc = (0 == strcmp(currId, TAG_DESCRIPTION)); - const bool isInputViewingDesc = - (0 == strcmp(currId, METADATA_INPUT_DESCRIPTION)) || - (0 == strcmp(currId, METADATA_VIEWING_DESCRIPTION)); - const bool isSOPSat = (0 == strcmp(parId, TAG_SOPNODE)) || - (0 == strcmp(parId, TAG_SATNODE)) || - (0 == strcmp(parId, TAG_SATNODEALT)); + const bool isDesc = (0 == strcmp(currId, TAG_DESCRIPTION)); + const bool isInputViewingDesc = (0 == strcmp(currId, METADATA_INPUT_DESCRIPTION)) + || (0 == strcmp(currId, METADATA_VIEWING_DESCRIPTION)); + const bool isSOPSat = (0 == strcmp(parId, TAG_SOPNODE)) || (0 == strcmp(parId, TAG_SATNODE)) + || (0 == strcmp(parId, TAG_SATNODEALT)); return isDesc || (isInputViewingDesc && !isSOPSat); } -void CDLParser::Impl::StartElementHandlerCDL(void *userData, - const XML_Char *name, - const XML_Char **atts) +void CDLParser::Impl::StartElementHandlerCDL( + void * userData, + const XML_Char * name, + const XML_Char ** atts) { - CDLParser::Impl* pImpl = (CDLParser::Impl*)userData; + CDLParser::Impl * pImpl = (CDLParser::Impl *)userData; if (IsValidStartElement(pImpl, name)) { - if (HandleColorDecisionListStartElement(pImpl, name) || - HandleColorDecisionStartElement(pImpl, name) || - HandleColorCorrectionCDLStartElement(pImpl, name) || - HandleSOPNodeStartElement(pImpl, name) || - HandleSatNodeStartElement(pImpl, name) || - HandleTerminalStartElement(pImpl, name) || - HandleUnknownStartElement(pImpl, name)) + if (HandleColorDecisionListStartElement(pImpl, name) + || HandleColorDecisionStartElement(pImpl, name) + || HandleColorCorrectionCDLStartElement(pImpl, name) + || HandleSOPNodeStartElement(pImpl, name) || HandleSatNodeStartElement(pImpl, name) + || HandleTerminalStartElement(pImpl, name) || HandleUnknownStartElement(pImpl, name)) { pImpl->m_elms.back()->start(atts); } } } -void CDLParser::Impl::StartElementHandlerCCC(void *userData, - const XML_Char *name, - const XML_Char **atts) +void CDLParser::Impl::StartElementHandlerCCC( + void * userData, + const XML_Char * name, + const XML_Char ** atts) { - CDLParser::Impl* pImpl = (CDLParser::Impl*)userData; + CDLParser::Impl * pImpl = (CDLParser::Impl *)userData; if (IsValidStartElement(pImpl, name)) { - if (HandleColorCorrectionCollectionStartElement(pImpl, name) || - HandleColorCorrectionCCCStartElement(pImpl, name) || - HandleSOPNodeStartElement(pImpl, name) || - HandleSatNodeStartElement(pImpl, name) || - HandleTerminalStartElement(pImpl, name) || - HandleUnknownStartElement(pImpl, name)) + if (HandleColorCorrectionCollectionStartElement(pImpl, name) + || HandleColorCorrectionCCCStartElement(pImpl, name) + || HandleSOPNodeStartElement(pImpl, name) || HandleSatNodeStartElement(pImpl, name) + || HandleTerminalStartElement(pImpl, name) || HandleUnknownStartElement(pImpl, name)) { pImpl->m_elms.back()->start(atts); } } } -void CDLParser::Impl::StartElementHandlerCC(void *userData, - const XML_Char *name, - const XML_Char **atts) +void CDLParser::Impl::StartElementHandlerCC( + void * userData, + const XML_Char * name, + const XML_Char ** atts) { - CDLParser::Impl* pImpl = (CDLParser::Impl*)userData; + CDLParser::Impl * pImpl = (CDLParser::Impl *)userData; if (IsValidStartElement(pImpl, name)) { - if (HandleColorCorrectionCCStartElement(pImpl, name) || - HandleSOPNodeStartElement(pImpl, name) || - HandleSatNodeStartElement(pImpl, name) || - HandleTerminalStartElement(pImpl, name) || - HandleUnknownStartElement(pImpl, name)) + if (HandleColorCorrectionCCStartElement(pImpl, name) + || HandleSOPNodeStartElement(pImpl, name) || HandleSatNodeStartElement(pImpl, name) + || HandleTerminalStartElement(pImpl, name) || HandleUnknownStartElement(pImpl, name)) { pImpl->m_elms.back()->start(atts); } } } -bool CDLParser::Impl::IsValidStartElement(CDLParser::Impl* pImpl, - const XML_Char *name) +bool CDLParser::Impl::IsValidStartElement(CDLParser::Impl * pImpl, const XML_Char * name) { if (!pImpl) { @@ -494,8 +456,9 @@ bool CDLParser::Impl::IsValidStartElement(CDLParser::Impl* pImpl, return true; } -bool CDLParser::Impl::HandleColorDecisionListStartElement(CDLParser::Impl* pImpl, - const XML_Char *name) +bool CDLParser::Impl::HandleColorDecisionListStartElement( + CDLParser::Impl * pImpl, + const XML_Char * name) { // Handle the ColorDecisionList element. if ((0 == strcmp(name, CDL_TAG_COLOR_DECISION_LIST))) @@ -510,14 +473,16 @@ bool CDLParser::Impl::HandleColorDecisionListStartElement(CDLParser::Impl* pImpl // Bind the reader's CDLTransformList to the one in the // ColorDecisionList element. - CDLReaderColorDecisionListElt* pCDLElt = - dynamic_cast(pElt.get()); + CDLReaderColorDecisionListElt * pCDLElt + = dynamic_cast(pElt.get()); pImpl->m_parsingInfo = pCDLElt->getCDLParsingInfo(); } else { - pElt = pImpl->createDummyElement(name, ": The ColorDecisionList " - "already exists"); + pElt = pImpl->createDummyElement( + name, + ": The ColorDecisionList " + "already exists"); } pImpl->m_elms.push_back(pElt); @@ -526,8 +491,9 @@ bool CDLParser::Impl::HandleColorDecisionListStartElement(CDLParser::Impl* pImpl return false; } -bool CDLParser::Impl::HandleColorDecisionStartElement(CDLParser::Impl* pImpl, - const XML_Char *name) +bool CDLParser::Impl::HandleColorDecisionStartElement( + CDLParser::Impl * pImpl, + const XML_Char * name) { // Handle the ColorDecision element, if parsing a CDL. if ((0 == strcmp(name, CDL_TAG_COLOR_DECISION))) @@ -539,8 +505,10 @@ bool CDLParser::Impl::HandleColorDecisionStartElement(CDLParser::Impl* pImpl, } else { - pElt = pImpl->createDummyElement(name, ": ColorDecision must be " - "under a ColorDecisionList"); + pElt = pImpl->createDummyElement( + name, + ": ColorDecision must be " + "under a ColorDecisionList"); } pImpl->m_elms.push_back(pElt); @@ -550,7 +518,8 @@ bool CDLParser::Impl::HandleColorDecisionStartElement(CDLParser::Impl* pImpl, } bool CDLParser::Impl::HandleColorCorrectionCollectionStartElement( - CDLParser::Impl* pImpl, const XML_Char *name) + CDLParser::Impl * pImpl, + const XML_Char * name) { // Handle the ColorCorrectionCollection element. if ((0 == strcmp(name, CDL_TAG_COLOR_CORRECTION_COLLECTION))) @@ -559,19 +528,20 @@ bool CDLParser::Impl::HandleColorCorrectionCollectionStartElement( if (!pImpl->m_parsingInfo || pImpl->m_parsingInfo->m_transforms.empty()) { pElt = std::make_shared( - name, pImpl->getXmlLocation(), pImpl->getXmlFilename()); + name, + pImpl->getXmlLocation(), + pImpl->getXmlFilename()); // Bind the reader's CDLTransformList to the one in the // ColorCorrectionCollection element. - CDLReaderColorCorrectionCollectionElt* pCCCElt = - dynamic_cast(pElt.get()); + CDLReaderColorCorrectionCollectionElt * pCCCElt + = dynamic_cast(pElt.get()); pImpl->m_parsingInfo = pCCCElt->getCDLParsingInfo(); } else { - pElt = pImpl->createDummyElement( - name, - ": The ColorCorrectionCollection already exists"); + pElt + = pImpl->createDummyElement(name, ": The ColorCorrectionCollection already exists"); } pImpl->m_elms.push_back(pElt); @@ -580,7 +550,9 @@ bool CDLParser::Impl::HandleColorCorrectionCollectionStartElement( return false; } -bool CDLParser::Impl::HandleColorCorrectionCDLStartElement(CDLParser::Impl* pImpl, const XML_Char *name) +bool CDLParser::Impl::HandleColorCorrectionCDLStartElement( + CDLParser::Impl * pImpl, + const XML_Char * name) { // Handle the ColorCorrection element if (0 == strcmp(name, CDL_TAG_COLOR_CORRECTION)) @@ -595,12 +567,12 @@ bool CDLParser::Impl::HandleColorCorrectionCDLStartElement(CDLParser::Impl* pImp // Bind the ColorCorrection element's CDLTransformList to the // one in the ColorDecisionList element. - CDLReaderColorCorrectionElt* pCCElt = - dynamic_cast(pElt.get()); - CDLReaderColorDecisionElt* pCDElt = - dynamic_cast(pCCElt->getParent().get()); - CDLReaderColorDecisionListElt* pCDLElt = - dynamic_cast(pCDElt->getParent().get()); + CDLReaderColorCorrectionElt * pCCElt + = dynamic_cast(pElt.get()); + CDLReaderColorDecisionElt * pCDElt + = dynamic_cast(pCCElt->getParent().get()); + CDLReaderColorDecisionListElt * pCDLElt + = dynamic_cast(pCDElt->getParent().get()); pCCElt->setCDLParsingInfo(pCDLElt->getCDLParsingInfo()); } @@ -619,7 +591,9 @@ bool CDLParser::Impl::HandleColorCorrectionCDLStartElement(CDLParser::Impl* pImp return false; } -bool CDLParser::Impl::HandleColorCorrectionCCCStartElement(CDLParser::Impl* pImpl, const XML_Char *name) +bool CDLParser::Impl::HandleColorCorrectionCCCStartElement( + CDLParser::Impl * pImpl, + const XML_Char * name) { if (0 == strcmp(name, CDL_TAG_COLOR_CORRECTION)) { @@ -633,10 +607,10 @@ bool CDLParser::Impl::HandleColorCorrectionCCCStartElement(CDLParser::Impl* pImp // Bind the ColorCorrection element's CDLTransformList to the one // in the ColorCorrectionCollection element. - CDLReaderColorCorrectionElt* pCCElt = - dynamic_cast(pElt.get()); - CDLReaderColorCorrectionCollectionElt* pCCCElt = - dynamic_cast(pCCElt->getParent().get()); + CDLReaderColorCorrectionElt * pCCElt + = dynamic_cast(pElt.get()); + CDLReaderColorCorrectionCollectionElt * pCCCElt + = dynamic_cast(pCCElt->getParent().get()); pCCElt->setCDLParsingInfo(pCCCElt->getCDLParsingInfo()); } @@ -656,7 +630,8 @@ bool CDLParser::Impl::HandleColorCorrectionCCCStartElement(CDLParser::Impl* pImp } bool CDLParser::Impl::HandleColorCorrectionCCStartElement( - CDLParser::Impl* pImpl, const XML_Char *name) + CDLParser::Impl * pImpl, + const XML_Char * name) { // Handle the ColorCorrection element. if (0 == strcmp(name, CDL_TAG_COLOR_CORRECTION)) @@ -664,15 +639,14 @@ bool CDLParser::Impl::HandleColorCorrectionCCStartElement( ElementRcPtr pElt; // If parsing a CC, make sure it is the only CDLTransform. - if (!pImpl->m_parsingInfo || - pImpl->m_parsingInfo->m_transforms.empty()) + if (!pImpl->m_parsingInfo || pImpl->m_parsingInfo->m_transforms.empty()) { pElt = pImpl->createElement(name); // Bind the ColorCorrection element's CDLTransformList to the // one explicitly created by the reader. - CDLReaderColorCorrectionElt* pCCElt = - dynamic_cast(pElt.get()); + CDLReaderColorCorrectionElt * pCCElt + = dynamic_cast(pElt.get()); pCCElt->setCDLParsingInfo(pImpl->getCDLParsingInfo()); } @@ -691,8 +665,7 @@ bool CDLParser::Impl::HandleColorCorrectionCCStartElement( return false; } -bool CDLParser::Impl::HandleSOPNodeStartElement(CDLParser::Impl* pImpl, - const XML_Char *name) +bool CDLParser::Impl::HandleSOPNodeStartElement(CDLParser::Impl * pImpl, const XML_Char * name) { if (0 == strcmp(name, TAG_SOPNODE)) { @@ -703,9 +676,10 @@ bool CDLParser::Impl::HandleSOPNodeStartElement(CDLParser::Impl* pImpl, } else { - pElt = pImpl->createDummyElement(name, - ": SOPNode must be under " - "a ColorCorrection"); + pElt = pImpl->createDummyElement( + name, + ": SOPNode must be under " + "a ColorCorrection"); } pImpl->m_elms.push_back(pElt); @@ -714,11 +688,9 @@ bool CDLParser::Impl::HandleSOPNodeStartElement(CDLParser::Impl* pImpl, return false; } -bool CDLParser::Impl::HandleSatNodeStartElement(CDLParser::Impl* pImpl, - const XML_Char *name) +bool CDLParser::Impl::HandleSatNodeStartElement(CDLParser::Impl * pImpl, const XML_Char * name) { - if (0 == strcmp(name, TAG_SATNODE) || - 0 == strcmp(name, TAG_SATNODEALT)) + if (0 == strcmp(name, TAG_SATNODE) || 0 == strcmp(name, TAG_SATNODEALT)) { ElementRcPtr pElt; if (pImpl->isBackElementInstanceOf()) @@ -727,9 +699,10 @@ bool CDLParser::Impl::HandleSatNodeStartElement(CDLParser::Impl* pImpl, } else { - pElt = pImpl->createDummyElement(name, - ": SatNode must be under " - "a ColorCorrection"); + pElt = pImpl->createDummyElement( + name, + ": SatNode must be under " + "a ColorCorrection"); } pImpl->m_elms.push_back(pElt); @@ -738,14 +711,12 @@ bool CDLParser::Impl::HandleSatNodeStartElement(CDLParser::Impl* pImpl, return false; } -bool CDLParser::Impl::HandleTerminalStartElement(CDLParser::Impl* pImpl, - const XML_Char *name) +bool CDLParser::Impl::HandleTerminalStartElement(CDLParser::Impl * pImpl, const XML_Char * name) { auto pContainer = std::dynamic_pointer_cast(pImpl->getBackElement()); if (!pContainer) { - pImpl->m_elms.push_back(pImpl->createDummyElement(name, - "Internal error")); + pImpl->m_elms.push_back(pImpl->createDummyElement(name, "Internal error")); return true; } else @@ -756,17 +727,16 @@ bool CDLParser::Impl::HandleTerminalStartElement(CDLParser::Impl* pImpl, // at their appropriate parent container. if (IsValidDescriptionTag(name, containerId)) { - auto pDescElt - = pImpl->createElement(name); + auto pDescElt = pImpl->createElement(name); pImpl->m_elms.push_back(pDescElt); return true; } // Handle Slope, Offset and Power elements. - else if (0 == strcmp(name, TAG_SLOPE) || - 0 == strcmp(name, TAG_OFFSET) || - 0 == strcmp(name, TAG_POWER)) + else if ( + 0 == strcmp(name, TAG_SLOPE) || 0 == strcmp(name, TAG_OFFSET) + || 0 == strcmp(name, TAG_POWER)) { ElementRcPtr pElt; if (pImpl->isBackElementInstanceOf()) @@ -795,9 +765,7 @@ bool CDLParser::Impl::HandleTerminalStartElement(CDLParser::Impl* pImpl, } else { - pElt = pImpl->createDummyElement( - name, - ": Saturation tags must be under SatNode"); + pElt = pImpl->createDummyElement(name, ": Saturation tags must be under SatNode"); } pImpl->m_elms.push_back(pElt); @@ -807,17 +775,15 @@ bool CDLParser::Impl::HandleTerminalStartElement(CDLParser::Impl* pImpl, return false; } -bool CDLParser::Impl::HandleUnknownStartElement(CDLParser::Impl* pImpl, - const XML_Char *name) +bool CDLParser::Impl::HandleUnknownStartElement(CDLParser::Impl * pImpl, const XML_Char * name) { - pImpl->m_elms.push_back(pImpl->createDummyElement(name, - ": Unknown element")); + pImpl->m_elms.push_back(pImpl->createDummyElement(name, ": Unknown element")); return true; } -void CDLParser::Impl::EndElementHandler(void *userData, const XML_Char *name) +void CDLParser::Impl::EndElementHandler(void * userData, const XML_Char * name) { - CDLParser::Impl* pImpl = (CDLParser::Impl*)userData; + CDLParser::Impl * pImpl = (CDLParser::Impl *)userData; if (!pImpl) { throw Exception("Internal CDL parsing error."); @@ -865,8 +831,7 @@ void CDLParser::Impl::EndElementHandler(void *userData, const XML_Char *name) ElementRcPtr pParent = pImpl->getBackElement(); // Is it at the right location in the stack? - if ((!pParent || !pParent->isContainer() || - pParent != pPlainElt->getParent())) + if ((!pParent || !pParent->isContainer() || pParent != pPlainElt->getParent())) { std::ostringstream os; os << "Parsing error ("; @@ -879,23 +844,23 @@ void CDLParser::Impl::EndElementHandler(void *userData, const XML_Char *name) pElt->end(); } -void CDLParser::Impl::CharacterDataHandler(void *userData, - const XML_Char *s, - int len) +void CDLParser::Impl::CharacterDataHandler(void * userData, const XML_Char * s, int len) { - CDLParser::Impl* pImpl = (CDLParser::Impl*)userData; + CDLParser::Impl * pImpl = (CDLParser::Impl *)userData; if (!pImpl) { throw Exception("Internal CDL parsing error."); } - if (len == 0) return; - if (len<0 || !s || !*s) + if (len == 0) + return; + if (len < 0 || !s || !*s) { pImpl->throwMessage("Empty attribute data"); } // Parsing a single new line. This is valid. - if (len == 1 && s[0] == '\n') return; + if (len == 1 && s[0] == '\n') + return; ElementRcPtr pElt = pImpl->m_elms.back(); if (!pElt) @@ -917,10 +882,10 @@ void CDLParser::Impl::CharacterDataHandler(void *userData, { // Ignore white-spaces. size_t start = 0; - size_t end = len; + size_t end = len; FindSubString(s, len, start, end); - if (end>0) + if (end > 0) { if (pElt->isContainer()) { @@ -941,15 +906,13 @@ void CDLParser::Impl::CharacterDataHandler(void *userData, pImpl->throwMessage(os.str()); } - pPlainElt->setRawData(s + start, - end - start, - pImpl->getXmlLocation()); + pPlainElt->setRawData(s + start, end - start, pImpl->getXmlLocation()); } } } } -CDLParser::CDLParser(const std::string& xmlFile) +CDLParser::CDLParser(const std::string & xmlFile) : m_impl(new Impl(xmlFile)) { } @@ -965,14 +928,15 @@ void CDLParser::parse(std::istream & istream) const m_impl->parse(istream); } -void CDLParser::getCDLTransforms(CDLTransformMap & transformMap, - CDLTransformVec & transformVec, - FormatMetadataImpl & metadata) const +void CDLParser::getCDLTransforms( + CDLTransformMap & transformMap, + CDLTransformVec & transformVec, + FormatMetadataImpl & metadata) const { - const CDLTransformVec& pTransformList = m_impl->getCDLParsingInfo()->m_transforms; + const CDLTransformVec & pTransformList = m_impl->getCDLParsingInfo()->m_transforms; for (size_t i = 0; i < pTransformList.size(); ++i) { - const CDLTransformImplRcPtr& pTransform = pTransformList.at(i); + const CDLTransformImplRcPtr & pTransform = pTransformList.at(i); transformVec.push_back(pTransform); const std::string & id = pTransform->data().getID(); @@ -996,7 +960,7 @@ void CDLParser::getCDLTransforms(CDLTransformMap & transformMap, void CDLParser::getCDLTransform(CDLTransformImplRcPtr & transform) const { - const CDLTransformVec& pTransformList = m_impl->getCDLParsingInfo()->m_transforms; + const CDLTransformVec & pTransformList = m_impl->getCDLParsingInfo()->m_transforms; if (pTransformList.empty()) { throw Exception("No transform found."); diff --git a/src/OpenColorIO/fileformats/cdl/CDLParser.h b/src/OpenColorIO/fileformats/cdl/CDLParser.h index 0e5471b005..acdae7288e 100644 --- a/src/OpenColorIO/fileformats/cdl/CDLParser.h +++ b/src/OpenColorIO/fileformats/cdl/CDLParser.h @@ -4,8 +4,8 @@ #ifndef INCLUDED_OCIO_FILEFORMATS_CDL_CDLPARSER_H #define INCLUDED_OCIO_FILEFORMATS_CDL_CDLPARSER_H -#include #include +#include #include @@ -19,15 +19,16 @@ class FormatMetadataImpl; class CDLParser { public: - explicit CDLParser(const std::string& xmlFile); + explicit CDLParser(const std::string & xmlFile); virtual ~CDLParser(); void parse(std::istream & istream) const; // Can be called after parse - void getCDLTransforms(CDLTransformMap & transformMap, - CDLTransformVec & transformVec, - FormatMetadataImpl & metadata) const; + void getCDLTransforms( + CDLTransformMap & transformMap, + CDLTransformVec & transformVec, + FormatMetadataImpl & metadata) const; // Can be called after parse void getCDLTransform(CDLTransformImplRcPtr & transform) const; @@ -38,11 +39,11 @@ class CDLParser private: // The hidden implementation's declaration class Impl; - Impl * m_impl; + Impl * m_impl; - CDLParser() = delete; - CDLParser(const CDLParser&) = delete; - CDLParser& operator=(const CDLParser&) = delete; + CDLParser() = delete; + CDLParser(const CDLParser &) = delete; + CDLParser & operator=(const CDLParser &) = delete; }; static constexpr char CDL_TAG_COLOR_DECISION_LIST[] = "ColorDecisionList"; diff --git a/src/OpenColorIO/fileformats/cdl/CDLReaderHelper.cpp b/src/OpenColorIO/fileformats/cdl/CDLReaderHelper.cpp index 38eaab76dd..922129a1c7 100644 --- a/src/OpenColorIO/fileformats/cdl/CDLReaderHelper.cpp +++ b/src/OpenColorIO/fileformats/cdl/CDLReaderHelper.cpp @@ -26,7 +26,7 @@ void CDLReaderColorCorrectionElt::start(const char ** atts) { if (atts[i + 1]) { - // Note: eXpat automatically replaces escaped characters with + // Note: eXpat automatically replaces escaped characters with // their original values. m_transformData->setID(atts[i + 1]); } @@ -46,26 +46,26 @@ void CDLReaderColorCorrectionElt::end() double vec9[9]; const CDLOpData::ChannelParams & slopes = m_transformData->getSlopeParams(); - vec9[0] = slopes[0]; - vec9[1] = slopes[1]; - vec9[2] = slopes[2]; + vec9[0] = slopes[0]; + vec9[1] = slopes[1]; + vec9[2] = slopes[2]; const CDLOpData::ChannelParams & offsets = m_transformData->getOffsetParams(); - vec9[3] = offsets[0]; - vec9[4] = offsets[1]; - vec9[5] = offsets[2]; + vec9[3] = offsets[0]; + vec9[4] = offsets[1]; + vec9[5] = offsets[2]; const CDLOpData::ChannelParams & powers = m_transformData->getPowerParams(); - vec9[6] = powers[0]; - vec9[7] = powers[1]; - vec9[8] = powers[2]; + vec9[6] = powers[0]; + vec9[7] = powers[1]; + vec9[8] = powers[2]; transform->setSOP(vec9); transform->setSat(m_transformData->getSaturation()); auto & formatMetadata = transform->getFormatMetadata(); - auto & metadata = dynamic_cast(formatMetadata); - metadata = m_transformData->getFormatMetadata(); + auto & metadata = dynamic_cast(formatMetadata); + metadata = m_transformData->getFormatMetadata(); transform->validate(); @@ -77,7 +77,9 @@ void CDLReaderColorCorrectionElt::setCDLParsingInfo(const CDLParsingInfoRcPtr & m_parsingInfo = pTransformList; } -void CDLReaderColorCorrectionElt::appendMetadata(const std::string & name, const std::string & value) +void CDLReaderColorCorrectionElt::appendMetadata( + const std::string & name, + const std::string & value) { // Keeps description as metadata with supplied name. FormatMetadataImpl item(name, value); diff --git a/src/OpenColorIO/fileformats/cdl/CDLReaderHelper.h b/src/OpenColorIO/fileformats/cdl/CDLReaderHelper.h index b67e4e2144..bbdd14940d 100644 --- a/src/OpenColorIO/fileformats/cdl/CDLReaderHelper.h +++ b/src/OpenColorIO/fileformats/cdl/CDLReaderHelper.h @@ -4,8 +4,8 @@ #ifndef INCLUDED_OCIO_FILEFORMATS_CDL_CDLREADERHELPER_H #define INCLUDED_OCIO_FILEFORMATS_CDL_CDLREADERHELPER_H -#include "fileformats/xmlutils/XMLReaderHelper.h" #include "Op.h" +#include "fileformats/xmlutils/XMLReaderHelper.h" #include "transforms/CDLTransform.h" namespace OCIO_NAMESPACE @@ -27,9 +27,10 @@ typedef OCIO_SHARED_PTR CDLParsingInfoRcPtr; class CDLReaderColorDecisionListElt : public XmlReaderContainerElt { public: - CDLReaderColorDecisionListElt(const std::string & name, - unsigned int xmlLineNumber, - const std::string & xmlFile) + CDLReaderColorDecisionListElt( + const std::string & name, + unsigned int xmlLineNumber, + const std::string & xmlFile) : XmlReaderContainerElt(name, xmlLineNumber, xmlFile) , m_parsingInfo(std::make_shared()) { @@ -39,66 +40,46 @@ class CDLReaderColorDecisionListElt : public XmlReaderContainerElt void end() override {} - const std::string & getIdentifier() const override - { - return getName(); - } + const std::string & getIdentifier() const override { return getName(); } - const char * getTypeName() const override - { - return getName().c_str(); - } + const char * getTypeName() const override { return getName().c_str(); } - const CDLParsingInfoRcPtr & getCDLParsingInfo() const - { - return m_parsingInfo; - } + const CDLParsingInfoRcPtr & getCDLParsingInfo() const { return m_parsingInfo; } void appendMetadata(const std::string & name, const std::string & value) override { m_parsingInfo->m_metadata.addChildElement(name.c_str(), value.c_str()); } - const FormatMetadataImpl & getMetadata() const - { - return m_parsingInfo->m_metadata; - } + const FormatMetadataImpl & getMetadata() const { return m_parsingInfo->m_metadata; } private: CDLParsingInfoRcPtr m_parsingInfo; - }; class CDLReaderColorDecisionElt : public XmlReaderComplexElt { public: - CDLReaderColorDecisionElt(const std::string & name, - ContainerEltRcPtr pParent, - unsigned int xmlLineNumber, - const std::string & xmlFile) + CDLReaderColorDecisionElt( + const std::string & name, + ContainerEltRcPtr pParent, + unsigned int xmlLineNumber, + const std::string & xmlFile) : XmlReaderComplexElt(name, pParent, xmlLineNumber, xmlFile) , m_metadata() { } - void start(const char ** /*atts*/) override - { - } + void start(const char ** /*atts*/) override {} - virtual void end() override - { - } + virtual void end() override {} void appendMetadata(const std::string & name, const std::string & value) override { m_metadata.addChildElement(name.c_str(), value.c_str()); } - - const FormatMetadataImpl & getMetadata() const - { - return m_metadata; - } + const FormatMetadataImpl & getMetadata() const { return m_metadata; } private: FormatMetadataImpl m_metadata; @@ -107,59 +88,44 @@ class CDLReaderColorDecisionElt : public XmlReaderComplexElt class CDLReaderColorCorrectionCollectionElt : public XmlReaderContainerElt { public: - CDLReaderColorCorrectionCollectionElt(const std::string & name, - unsigned int xmlLineNumber, - const std::string & xmlFile) + CDLReaderColorCorrectionCollectionElt( + const std::string & name, + unsigned int xmlLineNumber, + const std::string & xmlFile) : XmlReaderContainerElt(name, xmlLineNumber, xmlFile) , m_parsingInfo(std::make_shared()) { } - void start(const char ** /*atts*/) override - { - } + void start(const char ** /*atts*/) override {} - void end() override - { - } + void end() override {} - const std::string & getIdentifier() const override - { - return getName(); - } + const std::string & getIdentifier() const override { return getName(); } - const char * getTypeName() const override - { - return getName().c_str(); - } + const char * getTypeName() const override { return getName().c_str(); } - const CDLParsingInfoRcPtr & getCDLParsingInfo() const - { - return m_parsingInfo; - } + const CDLParsingInfoRcPtr & getCDLParsingInfo() const { return m_parsingInfo; } void appendMetadata(const std::string & name, const std::string & value) override { m_parsingInfo->m_metadata.addChildElement(name.c_str(), value.c_str()); } - const FormatMetadataImpl & getMetadata() const - { - return m_parsingInfo->m_metadata; - } + const FormatMetadataImpl & getMetadata() const { return m_parsingInfo->m_metadata; } private: CDLParsingInfoRcPtr m_parsingInfo; - }; class CDLReaderColorCorrectionElt : public XmlReaderComplexElt { public: - CDLReaderColorCorrectionElt(const std::string & name, - ContainerEltRcPtr pParent, - unsigned int xmlLocation, - const std::string & xmlFile); + CDLReaderColorCorrectionElt( + const std::string & name, + ContainerEltRcPtr pParent, + unsigned int xmlLocation, + const std::string & xmlFile); void start(const char ** atts) override; @@ -180,17 +146,18 @@ class CDLReaderColorCorrectionElt : public XmlReaderComplexElt class CDLReaderSOPNodeCCElt : public XmlReaderSOPNodeBaseElt { public: - CDLReaderSOPNodeCCElt(const std::string & name, - ContainerEltRcPtr pParent, - unsigned int xmlLocation, - const std::string & xmlFile) + CDLReaderSOPNodeCCElt( + const std::string & name, + ContainerEltRcPtr pParent, + unsigned int xmlLocation, + const std::string & xmlFile) : XmlReaderSOPNodeBaseElt(name, pParent, xmlLocation, xmlFile) { } const CDLOpDataRcPtr & getCDL() const override { - return static_cast(getParent().get())->getCDL(); + return static_cast(getParent().get())->getCDL(); } }; @@ -198,17 +165,18 @@ class CDLReaderSOPNodeCCElt : public XmlReaderSOPNodeBaseElt class CDLReaderSatNodeCCElt : public XmlReaderSatNodeBaseElt { public: - CDLReaderSatNodeCCElt(const std::string & name, - ContainerEltRcPtr pParent, - unsigned int xmlLineNumber, - const std::string & xmlFile) + CDLReaderSatNodeCCElt( + const std::string & name, + ContainerEltRcPtr pParent, + unsigned int xmlLineNumber, + const std::string & xmlFile) : XmlReaderSatNodeBaseElt(name, pParent, xmlLineNumber, xmlFile) { } const CDLOpDataRcPtr & getCDL() const override { - return static_cast(getParent().get())->getCDL(); + return static_cast(getParent().get())->getCDL(); } }; diff --git a/src/OpenColorIO/fileformats/cdl/CDLWriter.cpp b/src/OpenColorIO/fileformats/cdl/CDLWriter.cpp index 809785ec98..743d288eec 100644 --- a/src/OpenColorIO/fileformats/cdl/CDLWriter.cpp +++ b/src/OpenColorIO/fileformats/cdl/CDLWriter.cpp @@ -3,10 +3,10 @@ #include +#include "ParseUtils.h" #include "fileformats/cdl/CDLWriter.h" #include "fileformats/xmlutils/XMLReaderUtils.h" #include "fileformats/xmlutils/XMLWriterUtils.h" -#include "ParseUtils.h" #include "transforms/CDLTransform.h" #include "transforms/FileTransform.h" @@ -21,12 +21,13 @@ void WriteStrings(XmlFormatter & fmt, const char * tag, const StringUtils::Strin } } -void ExtractCDLMetadata(const FormatMetadata & metadata, - StringUtils::StringVec & mainDesc, - StringUtils::StringVec & inputDesc, - StringUtils::StringVec & viewingDesc, - StringUtils::StringVec & sopDesc, - StringUtils::StringVec & satDesc) +void ExtractCDLMetadata( + const FormatMetadata & metadata, + StringUtils::StringVec & mainDesc, + StringUtils::StringVec & inputDesc, + StringUtils::StringVec & viewingDesc, + StringUtils::StringVec & sopDesc, + StringUtils::StringVec & satDesc) { const int nbElt = metadata.getNumChildrenElements(); for (int i = 0; i < nbElt; ++i) @@ -91,7 +92,7 @@ void Write(XmlFormatter & fmt, const ConstCDLTransformRcPtr & cdl) { XmlScopeIndent scopeIndent(fmt); WriteStrings(fmt, TAG_DESCRIPTION, sopDesc); - double rgb[3]{ 0. }; + double rgb[3]{0.}; cdl->getSlope(rgb); fmt.writeContentTag(TAG_SLOPE, DoubleVecToString(rgb, 3)); cdl->getOffset(rgb); diff --git a/src/OpenColorIO/fileformats/cdl/CDLWriter.h b/src/OpenColorIO/fileformats/cdl/CDLWriter.h index 596af5b446..aa5da8481a 100644 --- a/src/OpenColorIO/fileformats/cdl/CDLWriter.h +++ b/src/OpenColorIO/fileformats/cdl/CDLWriter.h @@ -17,12 +17,13 @@ void Write(XmlFormatter & fmt, const ConstCDLTransformRcPtr & cdl); void WriteStrings(XmlFormatter & fmt, const char * tag, const StringUtils::StringVec & strings); -void ExtractCDLMetadata(const FormatMetadata & metadata, - StringUtils::StringVec & mainDesc, - StringUtils::StringVec & inputDesc, - StringUtils::StringVec & viewingDesc, - StringUtils::StringVec & sopDesc, - StringUtils::StringVec & satDesc); +void ExtractCDLMetadata( + const FormatMetadata & metadata, + StringUtils::StringVec & mainDesc, + StringUtils::StringVec & inputDesc, + StringUtils::StringVec & viewingDesc, + StringUtils::StringVec & sopDesc, + StringUtils::StringVec & satDesc); } // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/fileformats/ctf/CTFReaderHelper.cpp b/src/OpenColorIO/fileformats/ctf/CTFReaderHelper.cpp index 146913f4a3..7e5cc77c8e 100644 --- a/src/OpenColorIO/fileformats/ctf/CTFReaderHelper.cpp +++ b/src/OpenColorIO/fileformats/ctf/CTFReaderHelper.cpp @@ -1,25 +1,25 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. -#include "BitDepthUtils.h" #include "fileformats/ctf/CTFReaderHelper.h" -#include "fileformats/ctf/CTFReaderUtils.h" -#include "fileformats/xmlutils/XMLReaderUtils.h" +#include "BitDepthUtils.h" #include "Logging.h" #include "MathUtils.h" -#include "ops/log/LogUtils.h" #include "ParseUtils.h" #include "Platform.h" +#include "fileformats/ctf/CTFReaderUtils.h" +#include "fileformats/xmlutils/XMLReaderUtils.h" +#include "ops/log/LogUtils.h" #include "utils/StringUtils.h" - namespace OCIO_NAMESPACE { -CTFReaderTransformElt::CTFReaderTransformElt(const std::string & name, - unsigned int xmlLineNumber, - const std::string & xmlFile, - bool isCLF) +CTFReaderTransformElt::CTFReaderTransformElt( + const std::string & name, + unsigned int xmlLineNumber, + const std::string & xmlFile, + bool isCLF) : XmlReaderContainerElt(name, xmlLineNumber, xmlFile) , m_isCLF(isCLF) { @@ -33,32 +33,31 @@ const std::string & CTFReaderTransformElt::getIdentifier() const namespace { -template -void PrintInStream(std::ostringstream & oss, const T &val) +template void PrintInStream(std::ostringstream & oss, const T & val) { oss << val; } template -void PrintInStream(std::ostringstream & oss, const T &val, Rest... r) +void PrintInStream(std::ostringstream & oss, const T & val, Rest... r) { PrintInStream(oss, val); PrintInStream(oss, r...); } template -void ThrowM(const XmlReaderElement& elt, const T &val, Rest... r) +void ThrowM(const XmlReaderElement & elt, const T & val, Rest... r) { std::ostringstream oss; PrintInStream(oss, val, r...); elt.throwMessage(oss.str()); } -} +} // namespace void CTFReaderTransformElt::start(const char ** atts) { - bool isIdFound = false; - bool isVersionFound = false; + bool isIdFound = false; + bool isVersionFound = false; bool isCLFVersionFound = false; CTFVersion requestedVersion(0, 0); CTFVersion requestedCLFVersion(0, 0); @@ -105,7 +104,7 @@ void CTFReaderTransformElt::start(const char ** atts) throwMessage("'Version' can only be there once."); } - const char* pVer = atts[i + 1]; + const char * pVer = atts[i + 1]; if (!pVer || !*pVer) { throwMessage("If the attribute 'version' is present, it must have a value."); @@ -116,7 +115,7 @@ void CTFReaderTransformElt::start(const char ** atts) const std::string verString(pVer); CTFVersion::ReadVersion(verString, requestedVersion); } - catch (Exception& ce) + catch (Exception & ce) { throwMessage(ce.what()); } @@ -134,7 +133,7 @@ void CTFReaderTransformElt::start(const char ** atts) throwMessage("'compCLFversion' and 'Version' cannot be both present."); } - const char* pVer = atts[i + 1]; + const char * pVer = atts[i + 1]; if (!pVer || !*pVer) { throwMessage("Required attribute 'compCLFversion' does not have a value."); @@ -145,7 +144,7 @@ void CTFReaderTransformElt::start(const char ** atts) std::string verString(pVer); CTFVersion::ReadVersion(verString, requestedCLFVersion); } - catch (Exception& ce) + catch (Exception & ce) { throwMessage(ce.what()); } @@ -155,8 +154,7 @@ void CTFReaderTransformElt::start(const char ** atts) const CTFVersion maxCLF(3, 0); if (maxCLF < requestedCLFVersion) { - ThrowM(*this, "Unsupported transform file version '", pVer, - "' supplied."); + ThrowM(*this, "Unsupported transform file version '", pVer, "' supplied."); } // We currently interpret CLF versions <= 2.0 as CTF version 1.7. if (requestedCLFVersion <= CTFVersion(2, 0)) @@ -168,7 +166,7 @@ void CTFReaderTransformElt::start(const char ** atts) requestedVersion = CTF_PROCESS_LIST_VERSION_2_0; } - isVersionFound = true; + isVersionFound = true; isCLFVersionFound = true; // Handle as CLF. m_isCLF = true; @@ -262,10 +260,11 @@ bool CTFReaderTransformElt::isCLF() const ////////////////////////////////////////////////////////// -CTFReaderArrayElt::CTFReaderArrayElt(const std::string & name, - ContainerEltRcPtr pParent, - unsigned int xmlLineNumber, - const std::string & xmlFile) +CTFReaderArrayElt::CTFReaderArrayElt( + const std::string & name, + ContainerEltRcPtr pParent, + unsigned int xmlLineNumber, + const std::string & xmlFile) : XmlReaderPlainElt(name, pParent, xmlLineNumber, xmlFile) , m_array(nullptr) , m_position(0) @@ -288,40 +287,60 @@ void CTFReaderArrayElt::start(const char ** atts) { isDimFound = true; - const char* dimStr = atts[i + 1]; - const size_t len = strlen(dimStr); + const char * dimStr = atts[i + 1]; + const size_t len = strlen(dimStr); CTFArrayMgt::Dimensions dims; try { dims = GetNumbers(dimStr, len); } - catch (Exception& /*ce*/) + catch (Exception & /*ce*/) { - ThrowM(*this, "Illegal '", getTypeName(), "' array dimensions ", - TruncateString(dimStr, len), "."); + ThrowM( + *this, + "Illegal '", + getTypeName(), + "' array dimensions ", + TruncateString(dimStr, len), + "."); } - CTFArrayMgt* pArr = dynamic_cast(getParent().get()); + CTFArrayMgt * pArr = dynamic_cast(getParent().get()); if (!pArr) { - ThrowM(*this, "Parsing issue while parsing array dimensions of '", - getTypeName(), "' (", TruncateString(dimStr, len), ")."); + ThrowM( + *this, + "Parsing issue while parsing array dimensions of '", + getTypeName(), + "' (", + TruncateString(dimStr, len), + ")."); } else { const size_t max = dims.empty() ? 0 : (dims.size() - 1); if (max == 0) { - ThrowM(*this, "Illegal '", getTypeName(), "' array dimensions ", - TruncateString(dimStr, len), "."); + ThrowM( + *this, + "Illegal '", + getTypeName(), + "' array dimensions ", + TruncateString(dimStr, len), + "."); } m_array = pArr->updateDimension(dims); if (!m_array) { - ThrowM(*this, "'", getTypeName(), "' Illegal array dimensions ", - TruncateString(dimStr, len), "."); + ThrowM( + *this, + "'", + getTypeName(), + "' Illegal array dimensions ", + TruncateString(dimStr, len), + "."); } } } @@ -346,15 +365,14 @@ void CTFReaderArrayElt::end() { // A known element (e.g. an array) in a dummy element, // no need to validate it. - if (getParent()->isDummy()) return; + if (getParent()->isDummy()) + return; - CTFArrayMgt* pArr = dynamic_cast(getParent().get()); + CTFArrayMgt * pArr = dynamic_cast(getParent().get()); pArr->endArray(m_position); } -void CTFReaderArrayElt::setRawData(const char * s, - size_t len, - unsigned int/*xmlLine*/) +void CTFReaderArrayElt::setRawData(const char * s, size_t len, unsigned int /*xmlLine*/) { const unsigned long maxValues = m_array->getNumValues(); size_t pos(0); @@ -374,19 +392,24 @@ void CTFReaderArrayElt::setRawData(const char * s, { GetNextNumber(s, len, pos, data); } - catch (Exception& /*ce*/) + catch (Exception & /*ce*/) { - ThrowM(*this, "Illegal values '", TruncateString(s, len), - "' in array of ", getTypeName(), "."); + ThrowM( + *this, + "Illegal values '", + TruncateString(s, len), + "' in array of ", + getTypeName(), + "."); } - if (m_positionsetDoubleValue(m_position++, data); } else { - const CTFReaderOpElt* p = static_cast(getParent().get()); + const CTFReaderOpElt * p = static_cast(getParent().get()); std::ostringstream arg; if (p->getOp()->getType() == OpData::Lut1DType) @@ -400,21 +423,26 @@ void CTFReaderArrayElt::setRawData(const char * s, arg << "x" << m_array->getLength(); arg << "x" << m_array->getNumColorComponents(); } - else // Matrix + else // Matrix { arg << m_array->getLength(); arg << "x" << m_array->getLength(); } - ThrowM(*this, "Expected ", arg.str(), - " Array, found too many values in array of '", getTypeName(), "'."); + ThrowM( + *this, + "Expected ", + arg.str(), + " Array, found too many values in array of '", + getTypeName(), + "'."); } } } const char * CTFReaderArrayElt::getTypeName() const { - return dynamic_cast(getParent().get())->getTypeName(); + return dynamic_cast(getParent().get())->getTypeName(); } ////////////////////////////////////////////////////////// @@ -430,10 +458,11 @@ CTFArrayMgt::~CTFArrayMgt() ////////////////////////////////////////////////////////// -CTFReaderIndexMapElt::CTFReaderIndexMapElt(const std::string & name, - ContainerEltRcPtr pParent, - unsigned int xmlLineNumber, - const std::string & xmlFile) +CTFReaderIndexMapElt::CTFReaderIndexMapElt( + const std::string & name, + ContainerEltRcPtr pParent, + unsigned int xmlLineNumber, + const std::string & xmlFile) : XmlReaderPlainElt(name, pParent, xmlLineNumber, xmlFile) , m_indexMap(nullptr) , m_position(0) @@ -456,39 +485,59 @@ void CTFReaderIndexMapElt::start(const char ** atts) { isDimFound = true; - const char* dimStr = atts[i + 1]; - const size_t len = strlen(dimStr); + const char * dimStr = atts[i + 1]; + const size_t len = strlen(dimStr); CTFIndexMapMgt::DimensionsIM dims; try { dims = GetNumbers(dimStr, len); } - catch (Exception& /*ce*/) + catch (Exception & /*ce*/) { - ThrowM(*this, "Illegal '", getTypeName(), - "' IndexMap dimensions ", TruncateString(dimStr, len), "."); + ThrowM( + *this, + "Illegal '", + getTypeName(), + "' IndexMap dimensions ", + TruncateString(dimStr, len), + "."); } - CTFIndexMapMgt * pArr = dynamic_cast(getParent().get()); + CTFIndexMapMgt * pArr = dynamic_cast(getParent().get()); if (!pArr) { - ThrowM(*this, "Illegal '", getTypeName(), - "' IndexMap dimensions ", TruncateString(dimStr, len), "."); + ThrowM( + *this, + "Illegal '", + getTypeName(), + "' IndexMap dimensions ", + TruncateString(dimStr, len), + "."); } else { if (dims.empty() || dims.size() != 1) { - ThrowM(*this, "Illegal '", getTypeName(), - "' IndexMap dimensions ", TruncateString(dimStr, len), "."); + ThrowM( + *this, + "Illegal '", + getTypeName(), + "' IndexMap dimensions ", + TruncateString(dimStr, len), + "."); } m_indexMap = pArr->updateDimensionIM(dims); if (!m_indexMap) { - ThrowM(*this, "Illegal '", getTypeName(), - "' IndexMap dimensions ", TruncateString(dimStr, len), "."); + ThrowM( + *this, + "Illegal '", + getTypeName(), + "' IndexMap dimensions ", + TruncateString(dimStr, len), + "."); } } } @@ -513,14 +562,15 @@ void CTFReaderIndexMapElt::end() { // A known element (e.g. an IndexMap) in a dummy element, // no need to validate it. - if (getParent()->isDummy()) return; + if (getParent()->isDummy()) + return; - CTFReaderOpElt * pOpElt = dynamic_cast(getParent().get()); + CTFReaderOpElt * pOpElt = dynamic_cast(getParent().get()); if (pOpElt) { if (pOpElt->getTransform()->getCTFVersion() < CTF_PROCESS_LIST_VERSION_2_0) { - CTFIndexMapMgt * pIMM = dynamic_cast(getParent().get()); + CTFIndexMapMgt * pIMM = dynamic_cast(getParent().get()); pIMM->endIndexMap(m_position); } else @@ -536,13 +586,14 @@ void CTFReaderIndexMapElt::end() namespace { // Like FindDelim() but looks for whitespace or an ampersand (for IndexMap). -size_t FindIndexDelim(const char* str, size_t len, size_t pos) +size_t FindIndexDelim(const char * str, size_t len, size_t pos) { - const char *ptr = str + pos; + const char * ptr = str + pos; while (!IsSpace(*ptr) && !(*ptr == '@')) { - ptr++; pos++; + ptr++; + pos++; if (pos >= len) { @@ -554,9 +605,9 @@ size_t FindIndexDelim(const char* str, size_t len, size_t pos) } // Like findNextTokenStart() but also ignores ampersands. -size_t FindNextTokenStart_IndexMap(const char* s, size_t len, size_t pos) +size_t FindNextTokenStart_IndexMap(const char * s, size_t len, size_t pos) { - const char *ptr = s + pos; + const char * ptr = s + pos; if (pos == len) { @@ -565,7 +616,8 @@ size_t FindNextTokenStart_IndexMap(const char* s, size_t len, size_t pos) while (IsNumberDelimiter(*ptr) || (*ptr == '@')) { - ptr++; pos++; + ptr++; + pos++; if (pos >= len) { @@ -576,7 +628,6 @@ size_t FindNextTokenStart_IndexMap(const char* s, size_t len, size_t pos) return pos; } - // Extract the next pair of IndexMap numbers contained in the string. // - str the string to search // - len length of the string @@ -587,7 +638,7 @@ size_t FindNextTokenStart_IndexMap(const char* s, size_t len, size_t pos) // // This parses a pair of values from an IndexMap. // Example: 64.5@0 1e-1@0.1 0.1@-0.2 1 @2 2 @3 940 @ 2 -void GetNextIndexPair(const char *s, size_t len, size_t& pos, float& num1, float& num2) +void GetNextIndexPair(const char * s, size_t len, size_t & pos, float & num1, float & num2) { // s might not be null terminated. // Set pos to how much leading white space there is. @@ -627,11 +678,9 @@ void GetNextIndexPair(const char *s, size_t len, size_t& pos, float& num1, float } } } -} +} // namespace -void CTFReaderIndexMapElt::setRawData(const char * s, - size_t len, - unsigned int /*xmlLine*/) +void CTFReaderIndexMapElt::setRawData(const char * s, size_t len, unsigned int /*xmlLine*/) { size_t maxValues = m_indexMap->getDimension(); size_t pos(0); @@ -646,36 +695,46 @@ void CTFReaderIndexMapElt::setRawData(const char * s, { GetNextIndexPair(s, len, pos, data1, data2); } - catch (Exception& /*ce*/) + catch (Exception & /*ce*/) { - ThrowM(*this, "Illegal values '", TruncateString(s, len), - "' in '", getTypeName(), "' IndexMap."); + ThrowM( + *this, + "Illegal values '", + TruncateString(s, len), + "' in '", + getTypeName(), + "' IndexMap."); } - if (m_positionsetPair(m_position++, data1, data2); } else { - ThrowM(*this, "Expected ", m_indexMap->getDimension(), - " entries, found too many values in '", - getTypeName(), "' IndexMap."); + ThrowM( + *this, + "Expected ", + m_indexMap->getDimension(), + " entries, found too many values in '", + getTypeName(), + "' IndexMap."); } } } const char * CTFReaderIndexMapElt::getTypeName() const { - return dynamic_cast(getParent().get())->getTypeName(); + return dynamic_cast(getParent().get())->getTypeName(); } ////////////////////////////////////////////////////////// -CTFReaderMetadataElt::CTFReaderMetadataElt(const std::string & name, - ContainerEltRcPtr pParent, - unsigned int xmlLineNumber, - const std::string & xmlFile) +CTFReaderMetadataElt::CTFReaderMetadataElt( + const std::string & name, + ContainerEltRcPtr pParent, + unsigned int xmlLineNumber, + const std::string & xmlFile) : XmlReaderComplexElt(name, pParent, xmlLineNumber, xmlFile) , m_metadata(name, "") { @@ -700,7 +759,7 @@ void CTFReaderMetadataElt::start(const char ** atts) void CTFReaderMetadataElt::end() { - CTFReaderMetadataElt* pMetadataElt = dynamic_cast(getParent().get()); + CTFReaderMetadataElt * pMetadataElt = dynamic_cast(getParent().get()); if (pMetadataElt) { pMetadataElt->getMetadata().getChildrenElements().push_back(m_metadata); @@ -714,16 +773,17 @@ const std::string & CTFReaderMetadataElt::getIdentifier() const void CTFReaderMetadataElt::setRawData(const char * str, size_t len, unsigned int) { - std::string newValue{ m_metadata.getElementValue() + std::string(str, len) }; + std::string newValue{m_metadata.getElementValue() + std::string(str, len)}; m_metadata.setElementValue(newValue.c_str()); } ////////////////////////////////////////////////////////// -CTFReaderInfoElt::CTFReaderInfoElt(const std::string & name, - ContainerEltRcPtr pParent, - unsigned int xmlLineNumber, - const std::string & xmlFile) +CTFReaderInfoElt::CTFReaderInfoElt( + const std::string & name, + ContainerEltRcPtr pParent, + unsigned int xmlLineNumber, + const std::string & xmlFile) : CTFReaderMetadataElt(name, pParent, xmlLineNumber, xmlFile) { } @@ -734,8 +794,7 @@ CTFReaderInfoElt::~CTFReaderInfoElt() namespace { -void validateInfoElementVersion(const char * versionAttr, - const char * versionValue) +void validateInfoElementVersion(const char * versionAttr, const char * versionValue) { // There are 3 rules for an element version attribute to be valid : // @@ -746,9 +805,8 @@ void validateInfoElementVersion(const char * versionAttr, // Note: The minor version is not taken into account when validating the // version. The minor version is only for tracking purposes. // Note: is not part of CLF. - // - if (versionAttr && *versionAttr && - 0 == Platform::Strcasecmp(ATTR_VERSION, versionAttr)) + // + if (versionAttr && *versionAttr && 0 == Platform::Strcasecmp(ATTR_VERSION, versionAttr)) { if (!versionValue || !*versionValue) { @@ -777,7 +835,7 @@ void validateInfoElementVersion(const char * versionAttr, } } } -} +} // namespace void CTFReaderInfoElt::start(const char ** atts) { // Validate the version number. The version should be the first attribute. @@ -790,7 +848,8 @@ void CTFReaderInfoElt::start(const char ** atts) void CTFReaderInfoElt::end() { - CTFReaderTransformElt* pTransformElt = dynamic_cast(getParent().get()); + CTFReaderTransformElt * pTransformElt + = dynamic_cast(getParent().get()); if (pTransformElt) { pTransformElt->getTransform()->getInfoMetadata() = getMetadata(); @@ -808,10 +867,11 @@ CTFReaderOpElt::~CTFReaderOpElt() { } -void CTFReaderOpElt::setContext(const std::string & name, - const CTFReaderTransformPtr & pTransform, - unsigned xmlLineNumber, - const std::string & xmlFile) +void CTFReaderOpElt::setContext( + const std::string & name, + const CTFReaderTransformPtr & pTransform, + unsigned xmlLineNumber, + const std::string & xmlFile) { XmlReaderElement::setContext(name, xmlLineNumber, xmlFile); @@ -848,10 +908,10 @@ void CTFReaderOpElt::start(const char ** atts) enum BitDepthFlags { - NO_BIT_DEPTH = 0x00, - INPUT_BIT_DEPTH = 0x01, + NO_BIT_DEPTH = 0x00, + INPUT_BIT_DEPTH = 0x01, OUTPUT_BIT_DEPTH = 0x02, - ALL_BIT_DEPTH = (INPUT_BIT_DEPTH | OUTPUT_BIT_DEPTH) + ALL_BIT_DEPTH = (INPUT_BIT_DEPTH | OUTPUT_BIT_DEPTH) }; unsigned bitDepthFound = NO_BIT_DEPTH; @@ -892,11 +952,11 @@ void CTFReaderOpElt::start(const char ** atts) } // Check mandatory attributes. - if ((bitDepthFound&INPUT_BIT_DEPTH) == NO_BIT_DEPTH) + if ((bitDepthFound & INPUT_BIT_DEPTH) == NO_BIT_DEPTH) { throwMessage("inBitDepth is missing."); } - else if ((bitDepthFound&OUTPUT_BIT_DEPTH) == NO_BIT_DEPTH) + else if ((bitDepthFound & OUTPUT_BIT_DEPTH) == NO_BIT_DEPTH) { throwMessage("outBitDepth is missing."); } @@ -948,10 +1008,9 @@ void CTFReaderOpElt::validateXmlParameters(const char ** atts) const noexcept bool CTFReaderOpElt::isOpParameterValid(const char * att) const noexcept { - return 0 == Platform::Strcasecmp(ATTR_ID, att) || - 0 == Platform::Strcasecmp(ATTR_NAME, att) || - 0 == Platform::Strcasecmp(ATTR_BITDEPTH_IN, att) || - 0 == Platform::Strcasecmp(ATTR_BITDEPTH_OUT, att) || + return 0 == Platform::Strcasecmp(ATTR_ID, att) || 0 == Platform::Strcasecmp(ATTR_NAME, att) + || 0 == Platform::Strcasecmp(ATTR_BITDEPTH_IN, att) + || 0 == Platform::Strcasecmp(ATTR_BITDEPTH_OUT, att) || // Allow bypass attribute in CTF. (0 == Platform::Strcasecmp(ATTR_BYPASS, att) && !m_transform->isCLF()); } @@ -962,7 +1021,6 @@ bool CTFReaderOpElt::isOpParameterValid(const char * att) const noexcept // depending of the selected version. // - // // Versioning of file formats is a topic that needs careful consideration. // Any format will have one day to change some part of its structure in order @@ -994,181 +1052,190 @@ bool CTFReaderOpElt::isOpParameterValid(const char * att) const noexcept // implicit variables used by the macros below. // Add a reader to all versions lower or equal to the specified one. -#define ADD_READER_FOR_VERSIONS_UP_TO(READER, VERS) \ - if(version <= CTF_PROCESS_LIST_VERSION_##VERS) \ - { pOp = std::make_shared(); break; } - +#define ADD_READER_FOR_VERSIONS_UP_TO(READER, VERS) \ + if (version <= CTF_PROCESS_LIST_VERSION_##VERS) \ + { \ + pOp = std::make_shared(); \ + break; \ + } // Add a default reader for all existing versions. -#define ADD_DEFAULT_READER(READER) \ - if(version <= CTF_PROCESS_LIST_VERSION) \ - { pOp = std::make_shared(); break; } +#define ADD_DEFAULT_READER(READER) \ + if (version <= CTF_PROCESS_LIST_VERSION) \ + { \ + pOp = std::make_shared(); \ + break; \ + } // Add a reader to all versions higher or equal to the specified one. -#define ADD_READER_FOR_VERSIONS_STARTING_AT(READER, VERS) \ - if(version >= CTF_PROCESS_LIST_VERSION_##VERS && \ - version <= CTF_PROCESS_LIST_VERSION) \ - { pOp = std::make_shared(); break; } - +#define ADD_READER_FOR_VERSIONS_STARTING_AT(READER, VERS) \ + if (version >= CTF_PROCESS_LIST_VERSION_##VERS && version <= CTF_PROCESS_LIST_VERSION) \ + { \ + pOp = std::make_shared(); \ + break; \ + } // Add a reader for a range of versions. -#define ADD_READER_FOR_VERSIONS_BETWEEN(READER, VERS1, VERS2) \ - if(version >= CTF_PROCESS_LIST_VERSION_##VERS1 && \ - version <= CTF_PROCESS_LIST_VERSION_##VERS2) \ - { pOp = std::make_shared(); break; } +#define ADD_READER_FOR_VERSIONS_BETWEEN(READER, VERS1, VERS2) \ + if (version >= CTF_PROCESS_LIST_VERSION_##VERS1 \ + && version <= CTF_PROCESS_LIST_VERSION_##VERS2) \ + { \ + pOp = std::make_shared(); \ + break; \ + } -CTFReaderOpEltRcPtr CTFReaderOpElt::GetReader(CTFReaderOpElt::Type type, - const CTFVersion & version, bool isCLF) +CTFReaderOpEltRcPtr +CTFReaderOpElt::GetReader(CTFReaderOpElt::Type type, const CTFVersion & version, bool isCLF) { CTFReaderOpEltRcPtr pOp; switch (type) { - case CTFReaderOpElt::ACESType: - { - ADD_READER_FOR_VERSIONS_STARTING_AT(CTFReaderACESElt, 1_5); - break; - } - case CTFReaderOpElt::CDLType: - { - // Note: CLF style name support was not added until version 1.7, but - // no point creating a separate version just for that. - ADD_READER_FOR_VERSIONS_STARTING_AT(CTFReaderCDLElt, 1_3); - break; - } - case CTFReaderOpElt::ExposureContrastType: - { - if (!isCLF) + case CTFReaderOpElt::ACESType: { - ADD_DEFAULT_READER(CTFReaderExposureContrastElt); + ADD_READER_FOR_VERSIONS_STARTING_AT(CTFReaderACESElt, 1_5); + break; } - break; - } - case CTFReaderOpElt::FixedFunctionType: - { - if (!isCLF) + case CTFReaderOpElt::CDLType: { - ADD_READER_FOR_VERSIONS_STARTING_AT(CTFReaderFixedFunctionElt, 2_0); + // Note: CLF style name support was not added until version 1.7, but + // no point creating a separate version just for that. + ADD_READER_FOR_VERSIONS_STARTING_AT(CTFReaderCDLElt, 1_3); + break; } - break; - } - case CTFReaderOpElt::FunctionType: - { - if (!isCLF) + case CTFReaderOpElt::ExposureContrastType: + { + if (!isCLF) + { + ADD_DEFAULT_READER(CTFReaderExposureContrastElt); + } + break; + } + case CTFReaderOpElt::FixedFunctionType: { - ADD_READER_FOR_VERSIONS_STARTING_AT(CTFReaderFunctionElt, 1_6); + if (!isCLF) + { + ADD_READER_FOR_VERSIONS_STARTING_AT(CTFReaderFixedFunctionElt, 2_0); + } + break; } - break; - } - case CTFReaderOpElt::GammaType: - { - if (!isCLF) + case CTFReaderOpElt::FunctionType: { - // If the version is 1.4 or less, then use GammaElt. - // This reader forces the alpha transformation to be the identity. - ADD_READER_FOR_VERSIONS_UP_TO(CTFReaderGammaElt, 1_4); - // CTF 1.5 and onwards handles alpha component. - ADD_READER_FOR_VERSIONS_UP_TO(CTFReaderGammaElt_1_5, 1_8); - // CTF v2 and CLF v3 add styles and changes names. - ADD_READER_FOR_VERSIONS_STARTING_AT(CTFReaderGammaElt_CTF_2_0, 2_0); + if (!isCLF) + { + ADD_READER_FOR_VERSIONS_STARTING_AT(CTFReaderFunctionElt, 1_6); + } + break; } - else + case CTFReaderOpElt::GammaType: { - // Introduced with CLF v3. CLF does not handle alpha component. - ADD_READER_FOR_VERSIONS_STARTING_AT(CTFReaderGammaElt_CLF_3_0, 2_0); + if (!isCLF) + { + // If the version is 1.4 or less, then use GammaElt. + // This reader forces the alpha transformation to be the identity. + ADD_READER_FOR_VERSIONS_UP_TO(CTFReaderGammaElt, 1_4); + // CTF 1.5 and onwards handles alpha component. + ADD_READER_FOR_VERSIONS_UP_TO(CTFReaderGammaElt_1_5, 1_8); + // CTF v2 and CLF v3 add styles and changes names. + ADD_READER_FOR_VERSIONS_STARTING_AT(CTFReaderGammaElt_CTF_2_0, 2_0); + } + else + { + // Introduced with CLF v3. CLF does not handle alpha component. + ADD_READER_FOR_VERSIONS_STARTING_AT(CTFReaderGammaElt_CLF_3_0, 2_0); + } + break; } - break; - } - case CTFReaderOpElt::GradingPrimaryType: - { - if (!isCLF) + case CTFReaderOpElt::GradingPrimaryType: { - ADD_READER_FOR_VERSIONS_STARTING_AT(CTFReaderGradingPrimaryElt, 2_0); + if (!isCLF) + { + ADD_READER_FOR_VERSIONS_STARTING_AT(CTFReaderGradingPrimaryElt, 2_0); + } + break; } - break; - } - case CTFReaderOpElt::GradingRGBCurveType: - { - if (!isCLF) + case CTFReaderOpElt::GradingRGBCurveType: { - ADD_READER_FOR_VERSIONS_STARTING_AT(CTFReaderGradingRGBCurveElt, 2_0); + if (!isCLF) + { + ADD_READER_FOR_VERSIONS_STARTING_AT(CTFReaderGradingRGBCurveElt, 2_0); + } + break; } - break; - } - case CTFReaderOpElt::GradingToneType: - { - if (!isCLF) + case CTFReaderOpElt::GradingToneType: + { + if (!isCLF) + { + ADD_READER_FOR_VERSIONS_STARTING_AT(CTFReaderGradingToneElt, 2_0); + } + break; + } + case CTFReaderOpElt::InvLut1DType: { - ADD_READER_FOR_VERSIONS_STARTING_AT(CTFReaderGradingToneElt, 2_0); + if (!isCLF) + { + ADD_READER_FOR_VERSIONS_STARTING_AT(CTFReaderInvLut1DElt, 1_3); + } + break; } - break; - } - case CTFReaderOpElt::InvLut1DType: - { - if (!isCLF) + case CTFReaderOpElt::InvLut3DType: { - ADD_READER_FOR_VERSIONS_STARTING_AT(CTFReaderInvLut1DElt, 1_3); + if (!isCLF) + { + ADD_READER_FOR_VERSIONS_STARTING_AT(CTFReaderInvLut3DElt, 1_6); + } + break; } - break; - } - case CTFReaderOpElt::InvLut3DType: - { - if (!isCLF) + case CTFReaderOpElt::LogType: { - ADD_READER_FOR_VERSIONS_STARTING_AT(CTFReaderInvLut3DElt, 1_6); + if (!isCLF) + { + ADD_READER_FOR_VERSIONS_BETWEEN(CTFReaderLogElt, 1_3, 1_8); + } + // CLF v3 (CTF v2) adds log support and adds new camera styles. + ADD_READER_FOR_VERSIONS_STARTING_AT(CTFReaderLogElt_2_0, 2_0); + break; } - break; - } - case CTFReaderOpElt::LogType: - { - if (!isCLF) + case CTFReaderOpElt::Lut1DType: { - ADD_READER_FOR_VERSIONS_BETWEEN(CTFReaderLogElt, 1_3, 1_8); + ADD_READER_FOR_VERSIONS_UP_TO(CTFReaderLut1DElt, 1_3); + // Adding hue_adjust attribute. + ADD_READER_FOR_VERSIONS_UP_TO(CTFReaderLut1DElt_1_4, 1_4); + // Adding basic IndexMap element. + ADD_DEFAULT_READER(CTFReaderLut1DElt_1_7); + break; + } + case CTFReaderOpElt::Lut3DType: + { + ADD_READER_FOR_VERSIONS_UP_TO(CTFReaderLut3DElt, 1_6); + // Adding basic IndexMap element. + ADD_DEFAULT_READER(CTFReaderLut3DElt_1_7); + break; + } + case CTFReaderOpElt::MatrixType: + { + // If the version is 1.2 or less, then use MatrixElt. + ADD_READER_FOR_VERSIONS_UP_TO(CTFReaderMatrixElt, 1_2); + // If the version is 1.3 or more, then use MatrixElt_1_3. + ADD_DEFAULT_READER(CTFReaderMatrixElt_1_3); + break; + } + case CTFReaderOpElt::RangeType: + { + ADD_READER_FOR_VERSIONS_UP_TO(CTFReaderRangeElt, 1_6); + // Adding noClamp style. + ADD_DEFAULT_READER(CTFReaderRangeElt_1_7); + break; + } + case CTFReaderOpElt::ReferenceType: + { + ADD_DEFAULT_READER(CTFReaderReferenceElt); + break; + } + case CTFReaderOpElt::NoType: + { + break; } - // CLF v3 (CTF v2) adds log support and adds new camera styles. - ADD_READER_FOR_VERSIONS_STARTING_AT(CTFReaderLogElt_2_0, 2_0); - break; - } - case CTFReaderOpElt::Lut1DType: - { - ADD_READER_FOR_VERSIONS_UP_TO(CTFReaderLut1DElt, 1_3); - // Adding hue_adjust attribute. - ADD_READER_FOR_VERSIONS_UP_TO(CTFReaderLut1DElt_1_4, 1_4); - // Adding basic IndexMap element. - ADD_DEFAULT_READER(CTFReaderLut1DElt_1_7); - break; - } - case CTFReaderOpElt::Lut3DType: - { - ADD_READER_FOR_VERSIONS_UP_TO(CTFReaderLut3DElt, 1_6); - // Adding basic IndexMap element. - ADD_DEFAULT_READER(CTFReaderLut3DElt_1_7); - break; - } - case CTFReaderOpElt::MatrixType: - { - // If the version is 1.2 or less, then use MatrixElt. - ADD_READER_FOR_VERSIONS_UP_TO(CTFReaderMatrixElt, 1_2); - // If the version is 1.3 or more, then use MatrixElt_1_3. - ADD_DEFAULT_READER(CTFReaderMatrixElt_1_3); - break; - } - case CTFReaderOpElt::RangeType: - { - ADD_READER_FOR_VERSIONS_UP_TO(CTFReaderRangeElt, 1_6); - // Adding noClamp style. - ADD_DEFAULT_READER(CTFReaderRangeElt_1_7); - break; - } - case CTFReaderOpElt::ReferenceType: - { - ADD_DEFAULT_READER(CTFReaderReferenceElt); - break; - } - case CTFReaderOpElt::NoType: - { - break; - } } return pOp; @@ -1177,12 +1244,18 @@ CTFReaderOpEltRcPtr CTFReaderOpElt::GetReader(CTFReaderOpElt::Type type, BitDepth CTFReaderOpElt::GetBitDepth(const std::string & strBD) { const std::string str = StringUtils::Lower(strBD); - if (str == "8i") return BIT_DEPTH_UINT8; - else if (str == "10i") return BIT_DEPTH_UINT10; - else if (str == "12i") return BIT_DEPTH_UINT12; - else if (str == "16i") return BIT_DEPTH_UINT16; - else if (str == "16f") return BIT_DEPTH_F16; - else if (str == "32f") return BIT_DEPTH_F32; + if (str == "8i") + return BIT_DEPTH_UINT8; + else if (str == "10i") + return BIT_DEPTH_UINT10; + else if (str == "12i") + return BIT_DEPTH_UINT12; + else if (str == "16i") + return BIT_DEPTH_UINT16; + else if (str == "16f") + return BIT_DEPTH_F16; + else if (str == "32f") + return BIT_DEPTH_F32; return BIT_DEPTH_UNKNOWN; } @@ -1190,7 +1263,8 @@ BitDepth CTFReaderOpElt::GetBitDepth(const std::string & strBD) CTFReaderACESElt::CTFReaderACESElt() : CTFReaderOpElt() - , m_fixedFunction(std::make_shared(FixedFunctionOpData::ACES_RED_MOD_03_FWD)) + , m_fixedFunction( + std::make_shared(FixedFunctionOpData::ACES_RED_MOD_03_FWD)) { } @@ -1198,7 +1272,7 @@ CTFReaderACESElt::~CTFReaderACESElt() { } -void CTFReaderACESElt::start(const char **atts) +void CTFReaderACESElt::start(const char ** atts) { CTFReaderOpElt::start(atts); @@ -1216,7 +1290,7 @@ void CTFReaderACESElt::start(const char **atts) m_fixedFunction->setStyle(FixedFunctionOpData::GetStyle(atts[i + 1])); isStyleFound = true; } - catch (Exception& ce) + catch (Exception & ce) { throwMessage(ce.what()); } @@ -1232,8 +1306,7 @@ void CTFReaderACESElt::start(const char **atts) bool CTFReaderACESElt::isOpParameterValid(const char * att) const noexcept { - return CTFReaderOpElt::isOpParameterValid(att) || - 0 == Platform::Strcasecmp(ATTR_STYLE, att); + return CTFReaderOpElt::isOpParameterValid(att) || 0 == Platform::Strcasecmp(ATTR_STYLE, att); } void CTFReaderACESElt::end() @@ -1261,13 +1334,12 @@ CTFReaderACESParamsElt::~CTFReaderACESParamsElt() { } -void CTFReaderACESParamsElt::start(const char **atts) +void CTFReaderACESParamsElt::start(const char ** atts) { // Attributes we want to extract. double gamma = std::numeric_limits::quiet_NaN(); - CTFReaderACESElt * pFixedFunction - = dynamic_cast(getParent().get()); + CTFReaderACESElt * pFixedFunction = dynamic_cast(getParent().get()); // Try extracting the attributes. unsigned i = 0; @@ -1286,21 +1358,27 @@ void CTFReaderACESParamsElt::start(const char **atts) } const auto style = pFixedFunction->getFixedFunction()->getStyle(); - if (style == FixedFunctionOpData::REC2100_SURROUND_FWD || - style == FixedFunctionOpData::REC2100_SURROUND_INV) + if (style == FixedFunctionOpData::REC2100_SURROUND_FWD + || style == FixedFunctionOpData::REC2100_SURROUND_INV) { if (pFixedFunction->getFixedFunction()->getParams().size()) { - ThrowM(*this, "ACES FixedFunction element with style ", - FixedFunctionOpData::ConvertStyleToString(style, false), - " expects only 1 gamma parameter."); + ThrowM( + *this, + "ACES FixedFunction element with style ", + FixedFunctionOpData::ConvertStyleToString(style, false), + " expects only 1 gamma parameter."); } FixedFunctionOpData::Params params; if (IsNan(gamma)) { - ThrowM(*this, "Missing required parameter ", ATTR_GAMMA, - "for ACES FixedFunction element with style ", - FixedFunctionOpData::ConvertStyleToString(style, false), "."); + ThrowM( + *this, + "Missing required parameter ", + ATTR_GAMMA, + "for ACES FixedFunction element with style ", + FixedFunctionOpData::ConvertStyleToString(style, false), + "."); } params.push_back(gamma); // Assign the parameters to the object. @@ -1308,9 +1386,11 @@ void CTFReaderACESParamsElt::start(const char **atts) } else { - ThrowM(*this, "ACES FixedFunction element with style ", - FixedFunctionOpData::ConvertStyleToString(style, false), - " does not take any parameter."); + ThrowM( + *this, + "ACES FixedFunction element with style ", + FixedFunctionOpData::ConvertStyleToString(style, false), + " does not take any parameter."); } } @@ -1352,8 +1432,7 @@ void CTFReaderCDLElt::start(const char ** atts) bool CTFReaderCDLElt::isOpParameterValid(const char * att) const noexcept { - return CTFReaderOpElt::isOpParameterValid(att) || - 0 == Platform::Strcasecmp(ATTR_STYLE, att); + return CTFReaderOpElt::isOpParameterValid(att) || 0 == Platform::Strcasecmp(ATTR_STYLE, att); } void CTFReaderCDLElt::end() @@ -1376,39 +1455,42 @@ const CDLOpDataRcPtr & CTFReaderCDLElt::getCDL() const ////////////////////////////////////////////////////////// -CTFReaderSatNodeElt::CTFReaderSatNodeElt(const std::string & name, - ContainerEltRcPtr pParent, - unsigned xmlLineNumber, - const std::string & xmlFile) +CTFReaderSatNodeElt::CTFReaderSatNodeElt( + const std::string & name, + ContainerEltRcPtr pParent, + unsigned xmlLineNumber, + const std::string & xmlFile) : XmlReaderSatNodeBaseElt(name, pParent, xmlLineNumber, xmlFile) { } const CDLOpDataRcPtr & CTFReaderSatNodeElt::getCDL() const { - return static_cast(getParent().get())->getCDL(); + return static_cast(getParent().get())->getCDL(); } ////////////////////////////////////////////////////////// -CTFReaderSOPNodeElt::CTFReaderSOPNodeElt(const std::string & name, - ContainerEltRcPtr pParent, - unsigned int xmlLineNumber, - const std::string & xmlFile) +CTFReaderSOPNodeElt::CTFReaderSOPNodeElt( + const std::string & name, + ContainerEltRcPtr pParent, + unsigned int xmlLineNumber, + const std::string & xmlFile) : XmlReaderSOPNodeBaseElt(name, pParent, xmlLineNumber, xmlFile) { } const CDLOpDataRcPtr & CTFReaderSOPNodeElt::getCDL() const { - return static_cast(getParent().get())->getCDL(); + return static_cast(getParent().get())->getCDL(); } ////////////////////////////////////////////////////////// CTFReaderFixedFunctionElt::CTFReaderFixedFunctionElt() : CTFReaderOpElt() - , m_fixedFunction(std::make_shared(FixedFunctionOpData::ACES_RED_MOD_03_FWD)) + , m_fixedFunction( + std::make_shared(FixedFunctionOpData::ACES_RED_MOD_03_FWD)) { } @@ -1416,7 +1498,7 @@ CTFReaderFixedFunctionElt::~CTFReaderFixedFunctionElt() { } -void CTFReaderFixedFunctionElt::start(const char **atts) +void CTFReaderFixedFunctionElt::start(const char ** atts) { CTFReaderOpElt::start(atts); @@ -1434,7 +1516,7 @@ void CTFReaderFixedFunctionElt::start(const char **atts) m_fixedFunction->setStyle(FixedFunctionOpData::GetStyle(atts[i + 1])); isStyleFound = true; } - catch (Exception& ce) + catch (Exception & ce) { throwMessage(ce.what()); } @@ -1442,16 +1524,21 @@ void CTFReaderFixedFunctionElt::start(const char **atts) else if (0 == Platform::Strcasecmp(ATTR_PARAMS, atts[i])) { std::vector data; - const char* paramsStr = atts[i + 1]; - const size_t len = paramsStr ? strlen(paramsStr) : 0; + const char * paramsStr = atts[i + 1]; + const size_t len = paramsStr ? strlen(paramsStr) : 0; try { data = GetNumbers(paramsStr, len); } - catch (Exception& /*ce*/) + catch (Exception & /*ce*/) { - ThrowM(*this, "Illegal '", getTypeName(), "' params ", - TruncateString(paramsStr, len), "."); + ThrowM( + *this, + "Illegal '", + getTypeName(), + "' params ", + TruncateString(paramsStr, len), + "."); } m_fixedFunction->setParams(data); } @@ -1466,9 +1553,8 @@ void CTFReaderFixedFunctionElt::start(const char **atts) bool CTFReaderFixedFunctionElt::isOpParameterValid(const char * att) const noexcept { - return CTFReaderOpElt::isOpParameterValid(att) || - 0 == Platform::Strcasecmp(ATTR_STYLE, att) || - 0 == Platform::Strcasecmp(ATTR_PARAMS, att); + return CTFReaderOpElt::isOpParameterValid(att) || 0 == Platform::Strcasecmp(ATTR_STYLE, att) + || 0 == Platform::Strcasecmp(ATTR_PARAMS, att); } void CTFReaderFixedFunctionElt::end() @@ -1487,7 +1573,8 @@ const OpDataRcPtr CTFReaderFixedFunctionElt::getOp() const CTFReaderFunctionElt::CTFReaderFunctionElt() : CTFReaderOpElt() - , m_fixedFunction(std::make_shared(FixedFunctionOpData::ACES_RED_MOD_03_FWD)) + , m_fixedFunction( + std::make_shared(FixedFunctionOpData::ACES_RED_MOD_03_FWD)) { } @@ -1495,7 +1582,7 @@ CTFReaderFunctionElt::~CTFReaderFunctionElt() { } -void CTFReaderFunctionElt::start(const char **atts) +void CTFReaderFunctionElt::start(const char ** atts) { CTFReaderOpElt::start(atts); @@ -1512,7 +1599,7 @@ void CTFReaderFunctionElt::start(const char **atts) m_fixedFunction->setStyle(FixedFunctionOpData::GetStyle(atts[i + 1])); isStyleFound = true; } - catch (Exception& ce) + catch (Exception & ce) { throwMessage(ce.what()); } @@ -1528,8 +1615,7 @@ void CTFReaderFunctionElt::start(const char **atts) bool CTFReaderFunctionElt::isOpParameterValid(const char * att) const noexcept { - return CTFReaderOpElt::isOpParameterValid(att) || - 0 == Platform::Strcasecmp(ATTR_STYLE, att); + return CTFReaderOpElt::isOpParameterValid(att) || 0 == Platform::Strcasecmp(ATTR_STYLE, att); } void CTFReaderFunctionElt::end() @@ -1546,10 +1632,11 @@ const OpDataRcPtr CTFReaderFunctionElt::getOp() const ////////////////////////////////////////////////////////// -CTFReaderDynamicParamElt::CTFReaderDynamicParamElt(const std::string & name, - ContainerEltRcPtr pParent, - unsigned int xmlLineNumber, - const std::string & xmlFile) +CTFReaderDynamicParamElt::CTFReaderDynamicParamElt( + const std::string & name, + ContainerEltRcPtr pParent, + unsigned int xmlLineNumber, + const std::string & xmlFile) : XmlReaderPlainElt(name, pParent, xmlLineNumber, xmlFile) { } @@ -1570,13 +1657,17 @@ void CTFReaderDynamicParamElt::start(const char ** atts) { if (0 == Platform::Strcasecmp(TAG_DYN_PROP_EXPOSURE, atts[i + 1])) { - CTFReaderExposureContrastElt* pEC = - dynamic_cast(container.get()); + CTFReaderExposureContrastElt * pEC + = dynamic_cast(container.get()); if (!pEC) { - ThrowM(*this, "Dynamic parameter '", atts[i + 1], - "' is not supported in '", - container->getName().c_str(), "'."); + ThrowM( + *this, + "Dynamic parameter '", + atts[i + 1], + "' is not supported in '", + container->getName().c_str(), + "'."); } ExposureContrastOpDataRcPtr pECOp = pEC->getExposureContrast(); @@ -1584,13 +1675,17 @@ void CTFReaderDynamicParamElt::start(const char ** atts) } else if (0 == Platform::Strcasecmp(TAG_DYN_PROP_CONTRAST, atts[i + 1])) { - CTFReaderExposureContrastElt* pEC = - dynamic_cast(container.get()); + CTFReaderExposureContrastElt * pEC + = dynamic_cast(container.get()); if (!pEC) { - ThrowM(*this, "Dynamic parameter '", atts[i + 1], - "' is not supported in '", - container->getName().c_str(), "'."); + ThrowM( + *this, + "Dynamic parameter '", + atts[i + 1], + "' is not supported in '", + container->getName().c_str(), + "'."); } ExposureContrastOpDataRcPtr pECOp = pEC->getExposureContrast(); @@ -1598,13 +1693,17 @@ void CTFReaderDynamicParamElt::start(const char ** atts) } else if (0 == Platform::Strcasecmp(TAG_DYN_PROP_GAMMA, atts[i + 1])) { - CTFReaderExposureContrastElt* pEC = - dynamic_cast(container.get()); + CTFReaderExposureContrastElt * pEC + = dynamic_cast(container.get()); if (!pEC) { - ThrowM(*this, "Dynamic parameter '", atts[i + 1], - "' is not supported in '", - container->getName().c_str(), "'."); + ThrowM( + *this, + "Dynamic parameter '", + atts[i + 1], + "' is not supported in '", + container->getName().c_str(), + "'."); } ExposureContrastOpDataRcPtr pECOp = pEC->getExposureContrast(); @@ -1612,12 +1711,17 @@ void CTFReaderDynamicParamElt::start(const char ** atts) } else if (0 == Platform::Strcasecmp(TAG_DYN_PROP_PRIMARY, atts[i + 1])) { - CTFReaderGradingPrimaryElt* pGP = - dynamic_cast(container.get()); + CTFReaderGradingPrimaryElt * pGP + = dynamic_cast(container.get()); if (!pGP) { - ThrowM(*this, "Dynamic parameter '", atts[i + 1], - "' is not supported in '", container->getName().c_str(), "'."); + ThrowM( + *this, + "Dynamic parameter '", + atts[i + 1], + "' is not supported in '", + container->getName().c_str(), + "'."); } GradingPrimaryOpDataRcPtr pGPOp = pGP->getGradingPrimary(); @@ -1625,12 +1729,17 @@ void CTFReaderDynamicParamElt::start(const char ** atts) } else if (0 == Platform::Strcasecmp(TAG_DYN_PROP_RGBCURVE, atts[i + 1])) { - CTFReaderGradingRGBCurveElt* pGC = - dynamic_cast(container.get()); + CTFReaderGradingRGBCurveElt * pGC + = dynamic_cast(container.get()); if (!pGC) { - ThrowM(*this, "Dynamic parameter '", atts[i + 1], - "' is not supported in '", container->getName().c_str(), "'."); + ThrowM( + *this, + "Dynamic parameter '", + atts[i + 1], + "' is not supported in '", + container->getName().c_str(), + "'."); } GradingRGBCurveOpDataRcPtr pGCOp = pGC->getGradingRGBCurve(); @@ -1638,12 +1747,17 @@ void CTFReaderDynamicParamElt::start(const char ** atts) } else if (0 == Platform::Strcasecmp(TAG_DYN_PROP_TONE, atts[i + 1])) { - CTFReaderGradingToneElt* pGT = - dynamic_cast(container.get()); + CTFReaderGradingToneElt * pGT + = dynamic_cast(container.get()); if (!pGT) { - ThrowM(*this, "Dynamic parameter '", atts[i + 1], - "' is not supported in '", container->getName().c_str(), "'."); + ThrowM( + *this, + "Dynamic parameter '", + atts[i + 1], + "' is not supported in '", + container->getName().c_str(), + "'."); } GradingToneOpDataRcPtr pGTOp = pGT->getGradingTone(); @@ -1657,20 +1771,23 @@ void CTFReaderDynamicParamElt::start(const char ** atts) std::ostringstream dbg; dbg << getXmlFile().c_str() << "(" << getXmlLineNumber() << "): "; dbg << "Dynamic parameter '" << atts[i + 1] << "' on '"; - dbg << getParent()->getName() <<"' is ignored."; + dbg << getParent()->getName() << "' is ignored."; LogWarning(dbg.str().c_str()); } else { - ThrowM(*this, "Dynamic parameter '", atts[i + 1], - "' is not valid in '", - container->getName().c_str(), "'."); + ThrowM( + *this, + "Dynamic parameter '", + atts[i + 1], + "' is not valid in '", + container->getName().c_str(), + "'."); } } i += 2; } - } ////////////////////////////////////////////////////////// @@ -1700,9 +1817,8 @@ void CTFReaderExposureContrastElt::start(const char ** atts) try { style = ExposureContrastOpData::ConvertStringToStyle(atts[i + 1]); - } - catch (Exception& ce) + catch (Exception & ce) { ThrowM(*this, "ExposureContrast element: ", ce.what()); } @@ -1717,13 +1833,11 @@ void CTFReaderExposureContrastElt::start(const char ** atts) { throwMessage("ExposureContrast element: style missing."); } - } bool CTFReaderExposureContrastElt::isOpParameterValid(const char * att) const noexcept { - return CTFReaderOpElt::isOpParameterValid(att) || - 0 == Platform::Strcasecmp(ATTR_STYLE, att); + return CTFReaderOpElt::isOpParameterValid(att) || 0 == Platform::Strcasecmp(ATTR_STYLE, att); } void CTFReaderExposureContrastElt::end() @@ -1739,10 +1853,11 @@ const OpDataRcPtr CTFReaderExposureContrastElt::getOp() const return m_ec; } -CTFReaderECParamsElt::CTFReaderECParamsElt(const std::string & name, - ContainerEltRcPtr pParent, - unsigned int xmlLineNumber, - const std::string & xmlFile) +CTFReaderECParamsElt::CTFReaderECParamsElt( + const std::string & name, + ContainerEltRcPtr pParent, + unsigned int xmlLineNumber, + const std::string & xmlFile) : XmlReaderPlainElt(name, pParent, xmlLineNumber, xmlFile) { } @@ -1754,12 +1869,12 @@ CTFReaderECParamsElt::~CTFReaderECParamsElt() void CTFReaderECParamsElt::start(const char ** atts) { // Attributes we want to extract - double exposure = std::numeric_limits::quiet_NaN(); - double contrast = std::numeric_limits::quiet_NaN(); - double gamma = std::numeric_limits::quiet_NaN(); - double pivot = std::numeric_limits::quiet_NaN(); + double exposure = std::numeric_limits::quiet_NaN(); + double contrast = std::numeric_limits::quiet_NaN(); + double gamma = std::numeric_limits::quiet_NaN(); + double pivot = std::numeric_limits::quiet_NaN(); double logExposureStep = std::numeric_limits::quiet_NaN(); - double logMidGray = std::numeric_limits::quiet_NaN(); + double logMidGray = std::numeric_limits::quiet_NaN(); // Try extracting the attributes. unsigned i = 0; @@ -1798,7 +1913,7 @@ void CTFReaderECParamsElt::start(const char ** atts) } CTFReaderExposureContrastElt * pEC - = dynamic_cast(getParent().get()); + = dynamic_cast(getParent().get()); if (IsNan(exposure)) { @@ -1882,7 +1997,8 @@ void CTFReaderGammaElt::start(const char ** atts) isStyleFound = true; // Set default parameters for all channels. - const GammaOpData::Params params = GammaOpData::getIdentityParameters(m_gamma->getStyle()); + const GammaOpData::Params params + = GammaOpData::getIdentityParameters(m_gamma->getStyle()); m_gamma->setParams(params); } @@ -1896,8 +2012,7 @@ void CTFReaderGammaElt::start(const char ** atts) bool CTFReaderGammaElt::isOpParameterValid(const char * att) const noexcept { - return CTFReaderOpElt::isOpParameterValid(att) || - 0 == Platform::Strcasecmp(ATTR_STYLE, att); + return CTFReaderOpElt::isOpParameterValid(att) || 0 == Platform::Strcasecmp(ATTR_STYLE, att); } void CTFReaderGammaElt::end() @@ -1933,18 +2048,18 @@ bool CTFReaderGammaElt::isValid(const GammaOpData::Style style) const noexcept { switch (style) { - case GammaOpData::BASIC_FWD: - case GammaOpData::BASIC_REV: - case GammaOpData::MONCURVE_FWD: - case GammaOpData::MONCURVE_REV: - return true; - case GammaOpData::BASIC_MIRROR_FWD: - case GammaOpData::BASIC_MIRROR_REV: - case GammaOpData::BASIC_PASS_THRU_FWD: - case GammaOpData::BASIC_PASS_THRU_REV: - case GammaOpData::MONCURVE_MIRROR_FWD: - case GammaOpData::MONCURVE_MIRROR_REV: - return false; + case GammaOpData::BASIC_FWD: + case GammaOpData::BASIC_REV: + case GammaOpData::MONCURVE_FWD: + case GammaOpData::MONCURVE_REV: + return true; + case GammaOpData::BASIC_MIRROR_FWD: + case GammaOpData::BASIC_MIRROR_REV: + case GammaOpData::BASIC_PASS_THRU_FWD: + case GammaOpData::BASIC_PASS_THRU_REV: + case GammaOpData::MONCURVE_MIRROR_FWD: + case GammaOpData::MONCURVE_MIRROR_REV: + return false; } return false; } @@ -1955,8 +2070,8 @@ CTFReaderGammaParamsEltRcPtr CTFReaderGammaElt_1_5::createGammaParamsElt( unsigned int xmlLineNumber, const std::string & xmlFile) const { - CTFReaderGammaParamsEltRcPtr res = - std::make_shared(name, pParent, xmlLineNumber, xmlFile); + CTFReaderGammaParamsEltRcPtr res + = std::make_shared(name, pParent, xmlLineNumber, xmlFile); return res; } @@ -1964,17 +2079,17 @@ bool CTFReaderGammaElt_CTF_2_0::isValid(const GammaOpData::Style style) const no { switch (style) { - case GammaOpData::BASIC_FWD: - case GammaOpData::BASIC_REV: - case GammaOpData::MONCURVE_FWD: - case GammaOpData::MONCURVE_REV: - case GammaOpData::BASIC_MIRROR_FWD: - case GammaOpData::BASIC_MIRROR_REV: - case GammaOpData::BASIC_PASS_THRU_FWD: - case GammaOpData::BASIC_PASS_THRU_REV: - case GammaOpData::MONCURVE_MIRROR_FWD: - case GammaOpData::MONCURVE_MIRROR_REV: - return true; + case GammaOpData::BASIC_FWD: + case GammaOpData::BASIC_REV: + case GammaOpData::MONCURVE_FWD: + case GammaOpData::MONCURVE_REV: + case GammaOpData::BASIC_MIRROR_FWD: + case GammaOpData::BASIC_MIRROR_REV: + case GammaOpData::BASIC_PASS_THRU_FWD: + case GammaOpData::BASIC_PASS_THRU_REV: + case GammaOpData::MONCURVE_MIRROR_FWD: + case GammaOpData::MONCURVE_MIRROR_REV: + return true; } return false; } @@ -1985,17 +2100,18 @@ CTFReaderGammaParamsEltRcPtr CTFReaderGammaElt_CLF_3_0::createGammaParamsElt( unsigned int xmlLineNumber, const std::string & xmlFile) const { - CTFReaderGammaParamsEltRcPtr res = - std::make_shared(name, pParent, xmlLineNumber, xmlFile); + CTFReaderGammaParamsEltRcPtr res + = std::make_shared(name, pParent, xmlLineNumber, xmlFile); return res; } ////////////////////////////////////////////////////////// -CTFReaderGammaParamsElt::CTFReaderGammaParamsElt(const std::string & name, - ContainerEltRcPtr pParent, - unsigned int xmlLineNumber, - const std::string & xmlFile) +CTFReaderGammaParamsElt::CTFReaderGammaParamsElt( + const std::string & name, + ContainerEltRcPtr pParent, + unsigned int xmlLineNumber, + const std::string & xmlFile) : XmlReaderPlainElt(name, pParent, xmlLineNumber, xmlFile) { } @@ -2007,8 +2123,8 @@ CTFReaderGammaParamsElt::~CTFReaderGammaParamsElt() void CTFReaderGammaParamsElt::start(const char ** atts) { // Attributes we want to extract. - int chan = -1; - double gamma = std::numeric_limits::quiet_NaN(); + int chan = -1; + double gamma = std::numeric_limits::quiet_NaN(); double offset = std::numeric_limits::quiet_NaN(); // Try extracting the attributes. @@ -2025,8 +2141,9 @@ void CTFReaderGammaParamsElt::start(const char ** atts) ThrowM(*this, "Invalid channel: ", atts[i + 1], "."); } } - else if (0 == Platform::Strcasecmp(ATTR_GAMMA, atts[i]) || - 0 == Platform::Strcasecmp(ATTR_EXPONENT, atts[i])) + else if ( + 0 == Platform::Strcasecmp(ATTR_GAMMA, atts[i]) + || 0 == Platform::Strcasecmp(ATTR_EXPONENT, atts[i])) { parseScalarAttribute(atts[i], atts[i + 1], gamma); } @@ -2045,80 +2162,87 @@ void CTFReaderGammaParamsElt::start(const char ** atts) // Validate the attributes are appropriate for the gamma style and set // the parameters (numeric validation is done by GammaOp::validate). - CTFReaderGammaElt * pGamma - = dynamic_cast(getParent().get()); + CTFReaderGammaElt * pGamma = dynamic_cast(getParent().get()); GammaOpData::Params params; const GammaOpData::Style style = pGamma->getGamma()->getStyle(); switch (style) { - case GammaOpData::BASIC_FWD: - case GammaOpData::BASIC_REV: - case GammaOpData::BASIC_MIRROR_FWD: - case GammaOpData::BASIC_MIRROR_REV: - case GammaOpData::BASIC_PASS_THRU_FWD: - case GammaOpData::BASIC_PASS_THRU_REV: - { - if (IsNan(gamma)) + case GammaOpData::BASIC_FWD: + case GammaOpData::BASIC_REV: + case GammaOpData::BASIC_MIRROR_FWD: + case GammaOpData::BASIC_MIRROR_REV: + case GammaOpData::BASIC_PASS_THRU_FWD: + case GammaOpData::BASIC_PASS_THRU_REV: { - ThrowM(*this, "Missing required gamma parameter for style: ", - GammaOpData::ConvertStyleToString(style), - "."); - } - params.push_back(gamma); + if (IsNan(gamma)) + { + ThrowM( + *this, + "Missing required gamma parameter for style: ", + GammaOpData::ConvertStyleToString(style), + "."); + } + params.push_back(gamma); - if (!IsNan(offset)) - { - ThrowM(*this, "Illegal offset parameter for style: ", - GammaOpData::ConvertStyleToString(style), - "."); + if (!IsNan(offset)) + { + ThrowM( + *this, + "Illegal offset parameter for style: ", + GammaOpData::ConvertStyleToString(style), + "."); + } + break; } - break; - } - case GammaOpData::MONCURVE_FWD: - case GammaOpData::MONCURVE_REV: - case GammaOpData::MONCURVE_MIRROR_FWD: - case GammaOpData::MONCURVE_MIRROR_REV: - { - if (IsNan(gamma)) + case GammaOpData::MONCURVE_FWD: + case GammaOpData::MONCURVE_REV: + case GammaOpData::MONCURVE_MIRROR_FWD: + case GammaOpData::MONCURVE_MIRROR_REV: { - ThrowM(*this, "Missing required gamma parameter for style: ", - GammaOpData::ConvertStyleToString(style), - "."); - } - params.push_back(gamma); + if (IsNan(gamma)) + { + ThrowM( + *this, + "Missing required gamma parameter for style: ", + GammaOpData::ConvertStyleToString(style), + "."); + } + params.push_back(gamma); - if (IsNan(offset)) - { - ThrowM(*this, "Missing required offset parameter for style: ", - GammaOpData::ConvertStyleToString(style), - "."); + if (IsNan(offset)) + { + ThrowM( + *this, + "Missing required offset parameter for style: ", + GammaOpData::ConvertStyleToString(style), + "."); + } + params.push_back(offset); + break; } - params.push_back(offset); - break; - } } // Assign the parameters to the object. switch (chan) { - case -1: - pGamma->getGamma()->setParams(params); - break; - case 0: - pGamma->getGamma()->setRedParams(params); - break; - case 1: - pGamma->getGamma()->setGreenParams(params); - break; - case 2: - pGamma->getGamma()->setBlueParams(params); - break; - case 3: - pGamma->getGamma()->setAlphaParams(params); - break; + case -1: + pGamma->getGamma()->setParams(params); + break; + case 0: + pGamma->getGamma()->setRedParams(params); + break; + case 1: + pGamma->getGamma()->setGreenParams(params); + break; + case 2: + pGamma->getGamma()->setBlueParams(params); + break; + case 3: + pGamma->getGamma()->setAlphaParams(params); + break; } } @@ -2126,7 +2250,7 @@ void CTFReaderGammaParamsElt::end() { } -void CTFReaderGammaParamsElt::setRawData(const char * , size_t , unsigned int ) +void CTFReaderGammaParamsElt::setRawData(const char *, size_t, unsigned int) { } @@ -2150,10 +2274,11 @@ int CTFReaderGammaParamsElt::getChannelNumber(const char * name) const return chan; } -CTFReaderGammaParamsElt_1_5::CTFReaderGammaParamsElt_1_5(const std::string & name, - ContainerEltRcPtr pParent, - unsigned int xmlLineNumber, - const std::string & xmlFile) +CTFReaderGammaParamsElt_1_5::CTFReaderGammaParamsElt_1_5( + const std::string & name, + ContainerEltRcPtr pParent, + unsigned int xmlLineNumber, + const std::string & xmlFile) : CTFReaderGammaParamsElt(name, pParent, xmlLineNumber, xmlFile) { } @@ -2187,8 +2312,7 @@ CTFReaderGradingPrimaryElt::CTFReaderGradingPrimaryElt() bool CTFReaderGradingPrimaryElt::isOpParameterValid(const char * att) const noexcept { - return CTFReaderOpElt::isOpParameterValid(att) || - 0 == Platform::Strcasecmp(ATTR_STYLE, att); + return CTFReaderOpElt::isOpParameterValid(att) || 0 == Platform::Strcasecmp(ATTR_STYLE, att); } void CTFReaderGradingPrimaryElt::start(const char ** atts) @@ -2244,10 +2368,11 @@ const OpDataRcPtr CTFReaderGradingPrimaryElt::getOp() const ////////////////////////////////////////////////////////// -CTFReaderGradingPrimaryParamElt::CTFReaderGradingPrimaryParamElt(const std::string & name, - ContainerEltRcPtr pParent, - unsigned int xmlLineNumber, - const std::string & xmlFile) +CTFReaderGradingPrimaryParamElt::CTFReaderGradingPrimaryParamElt( + const std::string & name, + ContainerEltRcPtr pParent, + unsigned int xmlLineNumber, + const std::string & xmlFile) : XmlReaderPlainElt(name, pParent, xmlLineNumber, xmlFile) { } @@ -2256,12 +2381,12 @@ CTFReaderGradingPrimaryParamElt::~CTFReaderGradingPrimaryParamElt() { } -void CTFReaderGradingPrimaryParamElt::parseRGBMAttrValues(const char ** atts, - GradingRGBM & rgbm) const +void CTFReaderGradingPrimaryParamElt::parseRGBMAttrValues(const char ** atts, GradingRGBM & rgbm) + const { - bool rgbFound = false; + bool rgbFound = false; bool masterFound = false; - unsigned i = 0; + unsigned i = 0; while (atts[i] && *atts[i]) { const size_t len = strlen(atts[i + 1]); @@ -2273,21 +2398,33 @@ void CTFReaderGradingPrimaryParamElt::parseRGBMAttrValues(const char ** atts, } catch (Exception & ce) { - ThrowM(*this, "Illegal '", getTypeName(), "' values ", - TruncateString(atts[i + 1], len), " [", ce.what(), "]."); + ThrowM( + *this, + "Illegal '", + getTypeName(), + "' values ", + TruncateString(atts[i + 1], len), + " [", + ce.what(), + "]."); } if (0 == Platform::Strcasecmp(ATTR_RGB, atts[i])) { if (data.size() != 3) { - ThrowM(*this, "Illegal number of 'rgb' values for '", getTypeName(), "': '", - TruncateString(atts[i + 1], len), "'."); + ThrowM( + *this, + "Illegal number of 'rgb' values for '", + getTypeName(), + "': '", + TruncateString(atts[i + 1], len), + "'."); } - rgbm.m_red = data[0]; + rgbm.m_red = data[0]; rgbm.m_green = data[1]; - rgbm.m_blue = data[2]; + rgbm.m_blue = data[2]; rgbFound = true; } @@ -2295,12 +2432,17 @@ void CTFReaderGradingPrimaryParamElt::parseRGBMAttrValues(const char ** atts, { if (data.size() != 1) { - ThrowM(*this, "'Master' for '", getTypeName(), "' must be a single value: '", - TruncateString(atts[i + 1], len), "'"); + ThrowM( + *this, + "'Master' for '", + getTypeName(), + "' must be a single value: '", + TruncateString(atts[i + 1], len), + "'"); } rgbm.m_master = data[0]; - masterFound = true; + masterFound = true; } else { @@ -2321,13 +2463,14 @@ void CTFReaderGradingPrimaryParamElt::parseRGBMAttrValues(const char ** atts, } } -void CTFReaderGradingPrimaryParamElt::parseBWAttrValues(const char ** atts, - double & black, - double & white) const +void CTFReaderGradingPrimaryParamElt::parseBWAttrValues( + const char ** atts, + double & black, + double & white) const { bool blackFound = false; bool whiteFound = false; - unsigned i = 0; + unsigned i = 0; while (atts[i] && *atts[i]) { const size_t len = strlen(atts[i + 1]); @@ -2339,30 +2482,47 @@ void CTFReaderGradingPrimaryParamElt::parseBWAttrValues(const char ** atts, } catch (Exception & ce) { - ThrowM(*this, "Illegal '", getTypeName(), "' values ", - TruncateString(atts[i + 1], len), " [", ce.what(), "]."); + ThrowM( + *this, + "Illegal '", + getTypeName(), + "' values ", + TruncateString(atts[i + 1], len), + " [", + ce.what(), + "]."); } if (0 == Platform::Strcasecmp(ATTR_PRIMARY_BLACK, atts[i])) { if (data.size() != 1) { - ThrowM(*this, "'Black' for '", getTypeName(), "' must be a single value: '", - TruncateString(atts[i + 1], len), "'."); + ThrowM( + *this, + "'Black' for '", + getTypeName(), + "' must be a single value: '", + TruncateString(atts[i + 1], len), + "'."); } - black = data[0]; + black = data[0]; blackFound = true; } else if (0 == Platform::Strcasecmp(ATTR_PRIMARY_WHITE, atts[i])) { if (data.size() != 1) { - ThrowM(*this, "'White' for '", getTypeName(), "' must be a single value: '", - TruncateString(atts[i + 1], len), "'."); + ThrowM( + *this, + "'White' for '", + getTypeName(), + "' must be a single value: '", + TruncateString(atts[i + 1], len), + "'."); } - white = data[0]; + white = data[0]; whiteFound = true; } else @@ -2379,15 +2539,16 @@ void CTFReaderGradingPrimaryParamElt::parseBWAttrValues(const char ** atts, } } -void CTFReaderGradingPrimaryParamElt::parsePivotAttrValues(const char ** atts, - double & contrast, - double & black, - double & white) const +void CTFReaderGradingPrimaryParamElt::parsePivotAttrValues( + const char ** atts, + double & contrast, + double & black, + double & white) const { bool contrastFound = false; - bool blackFound = false; - bool whiteFound = false; - unsigned i = 0; + bool blackFound = false; + bool whiteFound = false; + unsigned i = 0; while (atts[i] && *atts[i]) { const size_t len = strlen(atts[i + 1]); @@ -2399,41 +2560,63 @@ void CTFReaderGradingPrimaryParamElt::parsePivotAttrValues(const char ** atts, } catch (Exception & ce) { - ThrowM(*this, "Illegal '", getTypeName(), "' values ", - TruncateString(atts[i + 1], len), " [", ce.what(), "]."); + ThrowM( + *this, + "Illegal '", + getTypeName(), + "' values ", + TruncateString(atts[i + 1], len), + " [", + ce.what(), + "]."); } if (0 == Platform::Strcasecmp(ATTR_PRIMARY_BLACK, atts[i])) { if (data.size() != 1) { - ThrowM(*this, "'Black' for '", getTypeName(), "' must be a single value: '", - TruncateString(atts[i + 1], len), "'."); + ThrowM( + *this, + "'Black' for '", + getTypeName(), + "' must be a single value: '", + TruncateString(atts[i + 1], len), + "'."); } - black = data[0]; + black = data[0]; blackFound = true; } else if (0 == Platform::Strcasecmp(ATTR_PRIMARY_WHITE, atts[i])) { if (data.size() != 1) { - ThrowM(*this, "'White' for '", getTypeName(), "' must be a single value: '", - TruncateString(atts[i + 1], len), "'."); + ThrowM( + *this, + "'White' for '", + getTypeName(), + "' must be a single value: '", + TruncateString(atts[i + 1], len), + "'."); } - white = data[0]; + white = data[0]; whiteFound = true; } else if (0 == Platform::Strcasecmp(ATTR_PRIMARY_CONTRAST, atts[i])) { if (data.size() != 1) { - ThrowM(*this, "'Contrast' for '", getTypeName(), "' must be a single value: '", - TruncateString(atts[i + 1], len), "'."); + ThrowM( + *this, + "'Contrast' for '", + getTypeName(), + "' must be a single value: '", + TruncateString(atts[i + 1], len), + "'."); } - contrast = data[0]; + contrast = data[0]; contrastFound = true; } else @@ -2446,14 +2629,18 @@ void CTFReaderGradingPrimaryParamElt::parsePivotAttrValues(const char ** atts, if (!contrastFound && !whiteFound && !blackFound) { - ThrowM(*this, "Missing 'contrast', 'black' or 'white' attribute for '", - getName().c_str(), "'."); + ThrowM( + *this, + "Missing 'contrast', 'black' or 'white' attribute for '", + getName().c_str(), + "'."); } } -void CTFReaderGradingPrimaryParamElt::parseScalarAttrValue(const char ** atts, - const char * tag, - double & value) const +void CTFReaderGradingPrimaryParamElt::parseScalarAttrValue( + const char ** atts, + const char * tag, + double & value) const { bool found = false; unsigned i = 0; @@ -2468,16 +2655,30 @@ void CTFReaderGradingPrimaryParamElt::parseScalarAttrValue(const char ** atts, } catch (Exception & ce) { - ThrowM(*this, "Illegal '", getTypeName(), "' values ", - TruncateString(atts[i + 1], len), " [", ce.what(), "]."); + ThrowM( + *this, + "Illegal '", + getTypeName(), + "' values ", + TruncateString(atts[i + 1], len), + " [", + ce.what(), + "]."); } if (0 == Platform::Strcasecmp(tag, atts[i])) { if (data.size() != 1) { - ThrowM(*this, "'", tag, "' for '", getTypeName(), "' must be a single value: '", - TruncateString(atts[i + 1], len), "'."); + ThrowM( + *this, + "'", + tag, + "' for '", + getTypeName(), + "' must be a single value: '", + TruncateString(atts[i + 1], len), + "'."); } value = data[0]; @@ -2550,7 +2751,7 @@ void CTFReaderGradingPrimaryParamElt::end() { } -void CTFReaderGradingPrimaryParamElt::setRawData(const char*, size_t, unsigned) +void CTFReaderGradingPrimaryParamElt::setRawData(const char *, size_t, unsigned) { } @@ -2563,9 +2764,8 @@ CTFReaderGradingRGBCurveElt::CTFReaderGradingRGBCurveElt() bool CTFReaderGradingRGBCurveElt::isOpParameterValid(const char * att) const noexcept { - return CTFReaderOpElt::isOpParameterValid(att) || - 0 == Platform::Strcasecmp(ATTR_STYLE, att) || - 0 == Platform::Strcasecmp(ATTR_BYPASS_LIN_TO_LOG, att); + return CTFReaderOpElt::isOpParameterValid(att) || 0 == Platform::Strcasecmp(ATTR_STYLE, att) + || 0 == Platform::Strcasecmp(ATTR_BYPASS_LIN_TO_LOG, att); } void CTFReaderGradingRGBCurveElt::start(const char ** atts) @@ -2635,10 +2835,11 @@ const OpDataRcPtr CTFReaderGradingRGBCurveElt::getOp() const ////////////////////////////////////////////////////////// -CTFReaderGradingCurveElt::CTFReaderGradingCurveElt(const std::string & name, - ContainerEltRcPtr pParent, - unsigned int xmlLineNumber, - const std::string & xmlFile) +CTFReaderGradingCurveElt::CTFReaderGradingCurveElt( + const std::string & name, + ContainerEltRcPtr pParent, + unsigned int xmlLineNumber, + const std::string & xmlFile) : XmlReaderComplexElt(name, pParent, xmlLineNumber, xmlFile) { } @@ -2671,17 +2872,17 @@ RGBCurveType GetRGBCurveType(const std::string & name) err << "Invalid curve name '" << name << "'."; throw Exception(err.str().c_str()); } -} +} // namespace void CTFReaderGradingCurveElt::start(const char ** /* atts */) { try { const RGBCurveType type = GetRGBCurveType(getName()); - auto pRGBCurveElt = dynamic_cast(getParent().get()); - m_curve = pRGBCurveElt->getLoadingRGBCurve()->getCurve(type); + auto pRGBCurveElt = dynamic_cast(getParent().get()); + m_curve = pRGBCurveElt->getLoadingRGBCurve()->getCurve(type); } - catch (Exception& ce) + catch (Exception & ce) { throwMessage(ce.what()); } @@ -2693,10 +2894,11 @@ void CTFReaderGradingCurveElt::end() ////////////////////////////////////////////////////////// -CTFReaderGradingCurvePointsElt::CTFReaderGradingCurvePointsElt(const std::string & name, - ContainerEltRcPtr pParent, - unsigned int xmlLineNumber, - const std::string & xmlFile) +CTFReaderGradingCurvePointsElt::CTFReaderGradingCurvePointsElt( + const std::string & name, + ContainerEltRcPtr pParent, + unsigned int xmlLineNumber, + const std::string & xmlFile) : XmlReaderPlainElt(name, pParent, xmlLineNumber, xmlFile) { } @@ -2716,19 +2918,22 @@ void CTFReaderGradingCurvePointsElt::end() throwMessage("Control points element: odd number of values."); } - auto pCurve = dynamic_cast(getParent().get()); + auto pCurve = dynamic_cast(getParent().get()); const size_t numPts = m_data.size() / 2; - auto curve = pCurve->getCurve(); + auto curve = pCurve->getCurve(); curve->setNumControlPoints(numPts); for (size_t p = 0; p < numPts; ++p) { auto & ctPt = curve->getControlPoint(p); - ctPt.m_x = m_data[2 * p]; - ctPt.m_y = m_data[2 * p + 1]; + ctPt.m_x = m_data[2 * p]; + ctPt.m_y = m_data[2 * p + 1]; } } -void CTFReaderGradingCurvePointsElt::setRawData(const char* s, size_t len, unsigned int /* xmlLine */) +void CTFReaderGradingCurvePointsElt::setRawData( + const char * s, + size_t len, + unsigned int /* xmlLine */) { std::vector data; @@ -2738,18 +2943,26 @@ void CTFReaderGradingCurvePointsElt::setRawData(const char* s, size_t len, unsig } catch (Exception & ce) { - ThrowM(*this, "Illegal '", getTypeName(), "' values ", - TruncateString(s, len), " [", ce.what(), "]"); + ThrowM( + *this, + "Illegal '", + getTypeName(), + "' values ", + TruncateString(s, len), + " [", + ce.what(), + "]"); } m_data.insert(m_data.end(), data.begin(), data.end()); } ////////////////////////////////////////////////////////// -CTFReaderGradingCurveSlopesElt::CTFReaderGradingCurveSlopesElt(const std::string & name, - ContainerEltRcPtr pParent, - unsigned int xmlLineNumber, - const std::string & xmlFile) +CTFReaderGradingCurveSlopesElt::CTFReaderGradingCurveSlopesElt( + const std::string & name, + ContainerEltRcPtr pParent, + unsigned int xmlLineNumber, + const std::string & xmlFile) : XmlReaderPlainElt(name, pParent, xmlLineNumber, xmlFile) { } @@ -2764,9 +2977,9 @@ void CTFReaderGradingCurveSlopesElt::start(const char ** /* atts */) void CTFReaderGradingCurveSlopesElt::end() { - auto pCurve = dynamic_cast(getParent().get()); - const size_t numVals = m_data.size(); - auto curve = pCurve->getCurve(); + auto pCurve = dynamic_cast(getParent().get()); + const size_t numVals = m_data.size(); + auto curve = pCurve->getCurve(); const size_t numCtPnts = curve->getNumControlPoints(); if (numVals != numCtPnts) { @@ -2778,7 +2991,10 @@ void CTFReaderGradingCurveSlopesElt::end() } } -void CTFReaderGradingCurveSlopesElt::setRawData(const char* s, size_t len, unsigned int /* xmlLine */) +void CTFReaderGradingCurveSlopesElt::setRawData( + const char * s, + size_t len, + unsigned int /* xmlLine */) { std::vector data; @@ -2788,8 +3004,15 @@ void CTFReaderGradingCurveSlopesElt::setRawData(const char* s, size_t len, unsig } catch (Exception & ce) { - ThrowM(*this, "Illegal '", getTypeName(), "' values ", - TruncateString(s, len), " [", ce.what(), "]"); + ThrowM( + *this, + "Illegal '", + getTypeName(), + "' values ", + TruncateString(s, len), + " [", + ce.what(), + "]"); } m_data.insert(m_data.end(), data.begin(), data.end()); } @@ -2803,8 +3026,7 @@ CTFReaderGradingToneElt::CTFReaderGradingToneElt() bool CTFReaderGradingToneElt::isOpParameterValid(const char * att) const noexcept { - return CTFReaderOpElt::isOpParameterValid(att) || - 0 == Platform::Strcasecmp(ATTR_STYLE, att); + return CTFReaderOpElt::isOpParameterValid(att) || 0 == Platform::Strcasecmp(ATTR_STYLE, att); } void CTFReaderGradingToneElt::start(const char ** atts) @@ -2860,7 +3082,8 @@ const OpDataRcPtr CTFReaderGradingToneElt::getOp() const ////////////////////////////////////////////////////////// -CTFReaderGradingToneParamElt::CTFReaderGradingToneParamElt(const std::string & name, +CTFReaderGradingToneParamElt::CTFReaderGradingToneParamElt( + const std::string & name, ContainerEltRcPtr pParent, unsigned int xmlLineNumber, const std::string & xmlFile) @@ -2872,15 +3095,17 @@ CTFReaderGradingToneParamElt::~CTFReaderGradingToneParamElt() { } -void CTFReaderGradingToneParamElt::parseRGBMSWAttrValues(const char ** atts, - GradingRGBMSW & rgbm, - bool center, bool pivot) const +void CTFReaderGradingToneParamElt::parseRGBMSWAttrValues( + const char ** atts, + GradingRGBMSW & rgbm, + bool center, + bool pivot) const { - bool rgbFound = false; + bool rgbFound = false; bool masterFound = false; - bool startFound = false; - bool widthFound = false; - unsigned i = 0; + bool startFound = false; + bool widthFound = false; + unsigned i = 0; while (atts[i] && *atts[i]) { const size_t len = strlen(atts[i + 1]); @@ -2892,21 +3117,33 @@ void CTFReaderGradingToneParamElt::parseRGBMSWAttrValues(const char ** atts, } catch (Exception & ce) { - ThrowM(*this, "Illegal '", getTypeName(), "' values ", - TruncateString(atts[i + 1], len), " [", ce.what(), "]."); + ThrowM( + *this, + "Illegal '", + getTypeName(), + "' values ", + TruncateString(atts[i + 1], len), + " [", + ce.what(), + "]."); } if (0 == Platform::Strcasecmp(ATTR_RGB, atts[i])) { if (data.size() != 3) { - ThrowM(*this, "Illegal number of 'rgb' values for '", getTypeName(), "': '", - TruncateString(atts[i + 1], len), "'."); + ThrowM( + *this, + "Illegal number of 'rgb' values for '", + getTypeName(), + "': '", + TruncateString(atts[i + 1], len), + "'."); } - rgbm.m_red = data[0]; + rgbm.m_red = data[0]; rgbm.m_green = data[1]; - rgbm.m_blue = data[2]; + rgbm.m_blue = data[2]; rgbFound = true; } @@ -2914,36 +3151,53 @@ void CTFReaderGradingToneParamElt::parseRGBMSWAttrValues(const char ** atts, { if (data.size() != 1) { - ThrowM(*this, "'Master' for '", getTypeName(), "' must be a single value: '", - TruncateString(atts[i + 1], len), "'"); + ThrowM( + *this, + "'Master' for '", + getTypeName(), + "' must be a single value: '", + TruncateString(atts[i + 1], len), + "'"); } rgbm.m_master = data[0]; - masterFound = true; + masterFound = true; } else if (0 == Platform::Strcasecmp(center ? ATTR_CENTER : ATTR_START, atts[i])) { if (data.size() != 1) { - ThrowM(*this, "'", center ? ATTR_CENTER : ATTR_START, "' for '", getTypeName(), - "' must be a single value: '", - TruncateString(atts[i + 1], len), "'"); + ThrowM( + *this, + "'", + center ? ATTR_CENTER : ATTR_START, + "' for '", + getTypeName(), + "' must be a single value: '", + TruncateString(atts[i + 1], len), + "'"); } rgbm.m_start = data[0]; - startFound = true; + startFound = true; } else if (0 == Platform::Strcasecmp(pivot ? ATTR_PIVOT : ATTR_WIDTH, atts[i])) { if (data.size() != 1) { - ThrowM(*this, "'", pivot ? ATTR_PIVOT : ATTR_WIDTH, "' for '", getTypeName(), - "' must be a single value: '", - TruncateString(atts[i + 1], len), "'"); + ThrowM( + *this, + "'", + pivot ? ATTR_PIVOT : ATTR_WIDTH, + "' for '", + getTypeName(), + "' must be a single value: '", + TruncateString(atts[i + 1], len), + "'"); } rgbm.m_width = data[0]; - widthFound = true; + widthFound = true; } else { @@ -2963,19 +3217,30 @@ void CTFReaderGradingToneParamElt::parseRGBMSWAttrValues(const char ** atts, } if (!startFound) { - ThrowM(*this, "Missing '", center ? ATTR_CENTER : ATTR_START, "' attribute for '", - getName().c_str(), "'."); + ThrowM( + *this, + "Missing '", + center ? ATTR_CENTER : ATTR_START, + "' attribute for '", + getName().c_str(), + "'."); } if (!widthFound) { - ThrowM(*this, "Missing '", pivot ? ATTR_PIVOT : ATTR_WIDTH, "' attribute for '", - getName().c_str(), "'."); + ThrowM( + *this, + "Missing '", + pivot ? ATTR_PIVOT : ATTR_WIDTH, + "' attribute for '", + getName().c_str(), + "'."); } } -void CTFReaderGradingToneParamElt::parseScalarAttrValue(const char ** atts, - const char * tag, - double & value) const +void CTFReaderGradingToneParamElt::parseScalarAttrValue( + const char ** atts, + const char * tag, + double & value) const { bool found = false; unsigned i = 0; @@ -2990,16 +3255,30 @@ void CTFReaderGradingToneParamElt::parseScalarAttrValue(const char ** atts, } catch (Exception & ce) { - ThrowM(*this, "Illegal '", getTypeName(), "' values ", - TruncateString(atts[i + 1], len), " [", ce.what(), "]."); + ThrowM( + *this, + "Illegal '", + getTypeName(), + "' values ", + TruncateString(atts[i + 1], len), + " [", + ce.what(), + "]."); } if (0 == Platform::Strcasecmp(tag, atts[i])) { if (data.size() != 1) { - ThrowM(*this, "'", tag, "' for '", getTypeName(), "' must be a single value: '", - TruncateString(atts[i + 1], len), "'."); + ThrowM( + *this, + "'", + tag, + "' for '", + getTypeName(), + "' must be a single value: '", + TruncateString(atts[i + 1], len), + "'."); } value = data[0]; @@ -3061,7 +3340,7 @@ void CTFReaderGradingToneParamElt::end() { } -void CTFReaderGradingToneParamElt::setRawData(const char*, size_t, unsigned) +void CTFReaderGradingToneParamElt::setRawData(const char *, size_t, unsigned) { } @@ -3081,7 +3360,7 @@ void CTFReaderInvLut1DElt::start(const char ** atts) CTFReaderOpElt::start(atts); // The interpolation attribute is optional in CLF/CTF. The INTERP_DEFAULT - // enum indicates that the value was not specified in the file. When + // enum indicates that the value was not specified in the file. When // writing, this means no interpolation attribute will be added. m_invLut->setInterpolation(INTERP_DEFAULT); @@ -3146,11 +3425,11 @@ void CTFReaderInvLut1DElt::start(const char ** atts) bool CTFReaderInvLut1DElt::isOpParameterValid(const char * att) const noexcept { - return CTFReaderOpElt::isOpParameterValid(att) || - 0 == Platform::Strcasecmp(ATTR_INTERPOLATION, att) || - 0 == Platform::Strcasecmp(ATTR_HALF_DOMAIN, att) || - 0 == Platform::Strcasecmp(ATTR_RAW_HALFS, att) || - 0 == Platform::Strcasecmp(ATTR_HUE_ADJUST, att); + return CTFReaderOpElt::isOpParameterValid(att) + || 0 == Platform::Strcasecmp(ATTR_INTERPOLATION, att) + || 0 == Platform::Strcasecmp(ATTR_HALF_DOMAIN, att) + || 0 == Platform::Strcasecmp(ATTR_RAW_HALFS, att) + || 0 == Platform::Strcasecmp(ATTR_HUE_ADJUST, att); } void CTFReaderInvLut1DElt::end() @@ -3182,7 +3461,7 @@ ArrayBase * CTFReaderInvLut1DElt::updateDimension(const Dimensions & dims) return nullptr; } - const size_t max = (dims.empty() ? 0 : (dims.size() - 1)); + const size_t max = (dims.empty() ? 0 : (dims.size() - 1)); const unsigned int numColorComponents = dims[max]; if (dims[1] != 3 && dims[1] != 1) @@ -3203,10 +3482,9 @@ void CTFReaderInvLut1DElt::endArray(unsigned int position) if (m_invLut->isOutputRawHalfs()) { const size_t maxValues = pArray->getNumValues(); - for (size_t i = 0; igetValues()[i] - = ConvertHalfBitsToFloat((unsigned short)pArray->getValues()[i]); + pArray->getValues()[i] = ConvertHalfBitsToFloat((unsigned short)pArray->getValues()[i]); } } @@ -3232,10 +3510,9 @@ void CTFReaderInvLut1DElt::endArray(unsigned int position) // TODO: Should improve Lut1DOp so that the copy is unnecessary. for (long i = (dimensions - 1); i >= 0; --i) { - for (unsigned long j = 0; jgetValues()[(i*numLuts) + j] - = pArray->getValues()[i]; + pArray->getValues()[(i * numLuts) + j] = pArray->getValues()[i]; } } } @@ -3264,7 +3541,7 @@ void CTFReaderInvLut3DElt::start(const char ** atts) CTFReaderOpElt::start(atts); // The interpolation attribute is optional in CLF/CTF. The INTERP_DEFAULT - // enum indicates that the value was not specified in the file. When + // enum indicates that the value was not specified in the file. When // writing, this means no interpolation attribute will be added. m_invLut->setInterpolation(INTERP_DEFAULT); @@ -3278,7 +3555,7 @@ void CTFReaderInvLut3DElt::start(const char ** atts) Interpolation interp = GetInterpolation3D(atts[i + 1]); m_invLut->setInterpolation(interp); } - catch (const std::exception& e) + catch (const std::exception & e) { throwMessage(e.what()); } @@ -3290,8 +3567,8 @@ void CTFReaderInvLut3DElt::start(const char ** atts) bool CTFReaderInvLut3DElt::isOpParameterValid(const char * att) const noexcept { - return CTFReaderOpElt::isOpParameterValid(att) || - 0 == Platform::Strcasecmp(ATTR_INTERPOLATION, att); + return CTFReaderOpElt::isOpParameterValid(att) + || 0 == Platform::Strcasecmp(ATTR_INTERPOLATION, att); } void CTFReaderInvLut3DElt::end() @@ -3320,7 +3597,7 @@ ArrayBase * CTFReaderInvLut3DElt::updateDimension(const Dimensions & dims) return nullptr; } - const size_t max = (dims.empty() ? 0 : (dims.size() - 1)); + const size_t max = (dims.empty() ? 0 : (dims.size() - 1)); const unsigned int numColorComponents = dims[max]; if (dims[3] != 3 || dims[1] != dims[0] || dims[2] != dims[0]) @@ -3396,8 +3673,7 @@ void CTFReaderLogElt::start(const char ** atts) bool CTFReaderLogElt::isOpParameterValid(const char * att) const noexcept { - return CTFReaderOpElt::isOpParameterValid(att) || - 0 == Platform::Strcasecmp(ATTR_STYLE, att); + return CTFReaderOpElt::isOpParameterValid(att) || 0 == Platform::Strcasecmp(ATTR_STYLE, att); } void CTFReaderLogElt::end() @@ -3414,7 +3690,7 @@ void CTFReaderLogElt::end() // This handles all log styles. LogUtil::ConvertLogParameters(m_ctfParams, base, rParams, gParams, bParams); } - catch (Exception& ce) + catch (Exception & ce) { ThrowM(*this, "Parameters are not valid: '", ce.what(), "'."); } @@ -3430,7 +3706,7 @@ void CTFReaderLogElt::end() { m_log->validate(); } - catch (Exception& ce) + catch (Exception & ce) { ThrowM(*this, "Log is not valid: '", ce.what(), "'."); } @@ -3448,8 +3724,14 @@ void CTFReaderLogElt::setBase(double base) const double curBase = m_log->getBase(); if (curBase != base) { - ThrowM(*this, "Log base has to be the same on all components: ", - "Current base: ", curBase, ", new base: ", base, "."); + ThrowM( + *this, + "Log base has to be the same on all components: ", + "Current base: ", + curBase, + ", new base: ", + base, + "."); } } else @@ -3493,7 +3775,7 @@ void CTFReaderLogElt_2_0::end() // This handles all log styles. LogUtil::ConvertLogParameters(getCTFParams(), base, rParams, gParams, bParams); } - catch (Exception& ce) + catch (Exception & ce) { ThrowM(*this, "Parameters are not valid: '", ce.what(), "'."); } @@ -3507,13 +3789,14 @@ void CTFReaderLogElt_2_0::end() { if (!isBaseSet()) { - if (getCTFParams().m_style == LogUtil::LOG2 + if (getCTFParams().m_style == LogUtil::LOG2 || getCTFParams().m_style == LogUtil::ANTI_LOG2) { setBase(2.0); } - else if (getCTFParams().m_style == LogUtil::LOG10 - || getCTFParams().m_style == LogUtil::ANTI_LOG10) + else if ( + getCTFParams().m_style == LogUtil::LOG10 + || getCTFParams().m_style == LogUtil::ANTI_LOG10) { setBase(10.0); } @@ -3525,7 +3808,7 @@ void CTFReaderLogElt_2_0::end() { getLog()->validate(); } - catch (Exception& ce) + catch (Exception & ce) { ThrowM(*this, "Log is not valid: '", ce.what(), "'."); } @@ -3540,10 +3823,11 @@ CTFReaderLogParamsEltRcPtr CTFReaderLogElt_2_0::createLogParamsElt( return std::make_shared(name, pParent, xmlLineNumber, xmlFile); } -CTFReaderLogParamsElt::CTFReaderLogParamsElt(const std::string & name, - ContainerEltRcPtr pParent, - unsigned int xmlLineNumber, - const std::string & xmlFile) +CTFReaderLogParamsElt::CTFReaderLogParamsElt( + const std::string & name, + ContainerEltRcPtr pParent, + unsigned int xmlLineNumber, + const std::string & xmlFile) : XmlReaderPlainElt(name, pParent, xmlLineNumber, xmlFile) { } @@ -3552,9 +3836,14 @@ CTFReaderLogParamsElt::~CTFReaderLogParamsElt() { } -bool CTFReaderLogParamsElt::parseCineon(const char ** atts, unsigned i, - double & gamma, double & refWhite, - double & refBlack, double & highlight, double & shadow) +bool CTFReaderLogParamsElt::parseCineon( + const char ** atts, + unsigned i, + double & gamma, + double & refWhite, + double & refBlack, + double & highlight, + double & shadow) { if (0 == Platform::Strcasecmp(ATTR_GAMMA, atts[i])) { @@ -3584,9 +3873,14 @@ bool CTFReaderLogParamsElt::parseCineon(const char ** atts, unsigned i, return false; } -void CTFReaderLogParamsElt::setCineon(LogUtil::CTFParams & legacyParams, int chan, - double gamma, double refWhite, - double refBlack, double highlight, double shadow) +void CTFReaderLogParamsElt::setCineon( + LogUtil::CTFParams & legacyParams, + int chan, + double gamma, + double refWhite, + double refBlack, + double highlight, + double shadow) { // Validate the attributes are appropriate for the log style and set // the parameters (numeric validation is done by LogOpData::validate). @@ -3629,26 +3923,26 @@ void CTFReaderLogParamsElt::setCineon(LogUtil::CTFParams & legacyParams, int cha switch (chan) { - case -1: - legacyParams.m_params[LogUtil::CTFParams::red ] = ctfValues; - legacyParams.m_params[LogUtil::CTFParams::green] = ctfValues; - legacyParams.m_params[LogUtil::CTFParams::blue ] = ctfValues; - break; - case 0: - legacyParams.m_params[LogUtil::CTFParams::red ] = ctfValues; - break; - case 1: - legacyParams.m_params[LogUtil::CTFParams::green] = ctfValues; - break; - case 2: - legacyParams.m_params[LogUtil::CTFParams::blue ] = ctfValues; - break; + case -1: + legacyParams.m_params[LogUtil::CTFParams::red] = ctfValues; + legacyParams.m_params[LogUtil::CTFParams::green] = ctfValues; + legacyParams.m_params[LogUtil::CTFParams::blue] = ctfValues; + break; + case 0: + legacyParams.m_params[LogUtil::CTFParams::red] = ctfValues; + break; + case 1: + legacyParams.m_params[LogUtil::CTFParams::green] = ctfValues; + break; + case 2: + legacyParams.m_params[LogUtil::CTFParams::blue] = ctfValues; + break; } } void CTFReaderLogParamsElt::start(const char ** atts) { - CTFReaderLogElt * pLogElt = dynamic_cast(getParent().get()); + CTFReaderLogElt * pLogElt = dynamic_cast(getParent().get()); LogUtil::CTFParams & legacyParams = pLogElt->getCTFParams(); @@ -3712,12 +4006,12 @@ void CTFReaderLogParamsElt::setRawData(const char *, size_t, unsigned int) void CTFReaderLogParamsElt_2_0::start(const char ** atts) { - CTFReaderLogElt * pLogElt = dynamic_cast(getParent().get()); + CTFReaderLogElt * pLogElt = dynamic_cast(getParent().get()); LogUtil::CTFParams & legacyParams = pLogElt->getCTFParams(); - const LogUtil::LogStyle style = legacyParams.m_style; + const LogUtil::LogStyle style = legacyParams.m_style; - const bool cameraStyle = style == LogUtil::CAMERA_LIN_TO_LOG || - style == LogUtil::CAMERA_LOG_TO_LIN; + const bool cameraStyle + = style == LogUtil::CAMERA_LIN_TO_LOG || style == LogUtil::CAMERA_LOG_TO_LIN; bool allowCineon = !cameraStyle && !pLogElt->getTransform()->isCLF(); @@ -3742,7 +4036,7 @@ void CTFReaderLogParamsElt_2_0::start(const char ** atts) double shadow = std::numeric_limits::quiet_NaN(); // Try extracting the attributes. - unsigned i = 0; + unsigned i = 0; bool validType = true; while (atts[i]) { @@ -3834,9 +4128,9 @@ void CTFReaderLogParamsElt_2_0::start(const char ** atts) // New parameters are set directly on the op. LogOpData::Params newParams(4); - newParams[LIN_SIDE_SLOPE ] = IsNan(linSideSlope) ? 1.0 : linSideSlope; + newParams[LIN_SIDE_SLOPE] = IsNan(linSideSlope) ? 1.0 : linSideSlope; newParams[LIN_SIDE_OFFSET] = IsNan(linSideOffset) ? 0.0 : linSideOffset; - newParams[LOG_SIDE_SLOPE ] = IsNan(logSideSlope) ? 1.0 : logSideSlope; + newParams[LOG_SIDE_SLOPE] = IsNan(logSideSlope) ? 1.0 : logSideSlope; newParams[LOG_SIDE_OFFSET] = IsNan(logSideOffset) ? 0.0 : logSideOffset; if (!IsNan(base)) @@ -3850,26 +4144,44 @@ void CTFReaderLogParamsElt_2_0::start(const char ** atts) { if (!cameraStyle) { - ThrowM(*this, "Parameter '", ATTR_LINSIDEBREAK, "' is only allowed for style '", - LogUtil::ConvertStyleToString(LogUtil::CAMERA_LOG_TO_LIN), "' or '", - LogUtil::ConvertStyleToString(LogUtil::CAMERA_LIN_TO_LOG), "'."); + ThrowM( + *this, + "Parameter '", + ATTR_LINSIDEBREAK, + "' is only allowed for style '", + LogUtil::ConvertStyleToString(LogUtil::CAMERA_LOG_TO_LIN), + "' or '", + LogUtil::ConvertStyleToString(LogUtil::CAMERA_LIN_TO_LOG), + "'."); } newParams.push_back(linSideBreak); } else if (cameraStyle) { - ThrowM(*this, "Parameter '", ATTR_LINSIDEBREAK, "' should be defined for style '", - LogUtil::ConvertStyleToString(LogUtil::CAMERA_LOG_TO_LIN), "' or '", - LogUtil::ConvertStyleToString(LogUtil::CAMERA_LIN_TO_LOG), "'. "); + ThrowM( + *this, + "Parameter '", + ATTR_LINSIDEBREAK, + "' should be defined for style '", + LogUtil::ConvertStyleToString(LogUtil::CAMERA_LOG_TO_LIN), + "' or '", + LogUtil::ConvertStyleToString(LogUtil::CAMERA_LIN_TO_LOG), + "'. "); } if (!IsNan(linearSlope)) { if (!cameraStyle) { - ThrowM(*this, "Parameter '", ATTR_LINEARSLOPE, "' is only allowed for style '", - LogUtil::ConvertStyleToString(LogUtil::CAMERA_LOG_TO_LIN), "' or '", - LogUtil::ConvertStyleToString(LogUtil::CAMERA_LIN_TO_LOG), "'. "); + ThrowM( + *this, + "Parameter '", + ATTR_LINEARSLOPE, + "' is only allowed for style '", + LogUtil::ConvertStyleToString(LogUtil::CAMERA_LOG_TO_LIN), + "' or '", + LogUtil::ConvertStyleToString(LogUtil::CAMERA_LIN_TO_LOG), + "'. "); } newParams.push_back(linearSlope); } @@ -3878,20 +4190,20 @@ void CTFReaderLogParamsElt_2_0::start(const char ** atts) switch (chan) { - case -1: - logOp->setRedParams(newParams); - logOp->setGreenParams(newParams); - logOp->setBlueParams(newParams); - break; - case 0: - logOp->setRedParams(newParams); - break; - case 1: - logOp->setGreenParams(newParams); - break; - case 2: - logOp->setBlueParams(newParams); - break; + case -1: + logOp->setRedParams(newParams); + logOp->setGreenParams(newParams); + logOp->setBlueParams(newParams); + break; + case 0: + logOp->setRedParams(newParams); + break; + case 1: + logOp->setGreenParams(newParams); + break; + case 2: + logOp->setBlueParams(newParams); + break; } } @@ -3915,7 +4227,7 @@ void CTFReaderLut1DElt::start(const char ** atts) CTFReaderOpElt::start(atts); // The interpolation attribute is optional in CLF/CTF. The INTERP_DEFAULT - // enum indicates that the value was not specified in the file. When + // enum indicates that the value was not specified in the file. When // writing, this means no interpolation attribute will be added. m_lut->setInterpolation(INTERP_DEFAULT); @@ -3929,7 +4241,7 @@ void CTFReaderLut1DElt::start(const char ** atts) Interpolation interp = GetInterpolation1D(atts[i + 1]); m_lut->setInterpolation(interp); } - catch (const std::exception& e) + catch (const std::exception & e) { throwMessage(e.what()); } @@ -3939,8 +4251,11 @@ void CTFReaderLut1DElt::start(const char ** atts) { if (0 != Platform::Strcasecmp("true", atts[i + 1])) { - ThrowM(*this, "Illegal 'halfDomain' attribute '", atts[i + 1], - "' while parsing Lut1D."); + ThrowM( + *this, + "Illegal 'halfDomain' attribute '", + atts[i + 1], + "' while parsing Lut1D."); } m_lut->setInputHalfDomain(true); @@ -3950,8 +4265,11 @@ void CTFReaderLut1DElt::start(const char ** atts) { if (0 != Platform::Strcasecmp("true", atts[i + 1])) { - ThrowM(*this, "Illegal 'rawHalfs' attribute '", atts[i + 1], - "' while parsing Lut1D."); + ThrowM( + *this, + "Illegal 'rawHalfs' attribute '", + atts[i + 1], + "' while parsing Lut1D."); } m_lut->setOutputRawHalfs(true); @@ -3963,10 +4281,10 @@ void CTFReaderLut1DElt::start(const char ** atts) bool CTFReaderLut1DElt::isOpParameterValid(const char * att) const noexcept { - return CTFReaderOpElt::isOpParameterValid(att) || - 0 == Platform::Strcasecmp(ATTR_INTERPOLATION, att) || - 0 == Platform::Strcasecmp(ATTR_HALF_DOMAIN, att) || - 0 == Platform::Strcasecmp(ATTR_RAW_HALFS, att); + return CTFReaderOpElt::isOpParameterValid(att) + || 0 == Platform::Strcasecmp(ATTR_INTERPOLATION, att) + || 0 == Platform::Strcasecmp(ATTR_HALF_DOMAIN, att) + || 0 == Platform::Strcasecmp(ATTR_RAW_HALFS, att); } void CTFReaderLut1DElt::end() @@ -3995,7 +4313,7 @@ ArrayBase * CTFReaderLut1DElt::updateDimension(const Dimensions & dims) return nullptr; } - const size_t max = (dims.empty() ? 0 : (dims.size() - 1)); + const size_t max = (dims.empty() ? 0 : (dims.size() - 1)); const unsigned numColorComponents = dims[max]; if (dims[1] != 3 && dims[1] != 1) @@ -4016,10 +4334,9 @@ void CTFReaderLut1DElt::endArray(unsigned int position) if (m_lut->isOutputRawHalfs()) { const size_t maxValues = pArray->getNumValues(); - for (size_t i = 0; igetValues()[i] - = ConvertHalfBitsToFloat((unsigned short)pArray->getValues()[i]); + pArray->getValues()[i] = ConvertHalfBitsToFloat((unsigned short)pArray->getValues()[i]); } } @@ -4032,8 +4349,15 @@ void CTFReaderLut1DElt::endArray(unsigned int position) if (numColorComponents != 1 || position != dimensions) { - ThrowM(*this, "Expected ", dimensions, "x", numColorComponents, - " Array values, found ", position, "."); + ThrowM( + *this, + "Expected ", + dimensions, + "x", + numColorComponents, + " Array values, found ", + position, + "."); } // Convert a 1D LUT to a 3by1D LUT @@ -4043,9 +4367,9 @@ void CTFReaderLut1DElt::endArray(unsigned int position) // TODO: Should improve Lut1DOp so that the copy is unnecessary. for (signed i = (dimensions - 1); i >= 0; --i) { - for (unsigned j = 0; jgetValues()[(i*numLuts) + j] = pArray->getValues()[i]; + pArray->getValues()[(i * numLuts) + j] = pArray->getValues()[i]; } } } @@ -4077,8 +4401,13 @@ void CTFReaderLut1DElt::endIndexMap(unsigned int position) { if (m_indexMapping.getDimension() != position) { - ThrowM(*this, "Expected ", m_indexMapping.getDimension(), - " IndexMap values, found ", position, "."); + ThrowM( + *this, + "Expected ", + m_indexMapping.getDimension(), + " IndexMap values, found ", + position, + "."); } m_indexMapping.validate(); @@ -4092,7 +4421,7 @@ void CTFReaderLut1DElt_1_4::start(const char ** atts) CTFReaderOpElt::start(atts); // The interpolation attribute is optional in CLF/CTF. The INTERP_DEFAULT - // enum indicates that the value was not specified in the file. When + // enum indicates that the value was not specified in the file. When // writing, this means no interpolation attribute will be added. m_lut->setInterpolation(INTERP_DEFAULT); @@ -4106,7 +4435,7 @@ void CTFReaderLut1DElt_1_4::start(const char ** atts) Interpolation interp = GetInterpolation1D(atts[i + 1]); m_lut->setInterpolation(interp); } - catch (const std::exception& e) + catch (const std::exception & e) { throwMessage(e.what()); } @@ -4116,8 +4445,11 @@ void CTFReaderLut1DElt_1_4::start(const char ** atts) { if (0 != Platform::Strcasecmp("true", atts[i + 1])) { - ThrowM(*this, "Illegal 'halfDomain' attribute '", atts[i + 1], - "' while parsing Lut1D."); + ThrowM( + *this, + "Illegal 'halfDomain' attribute '", + atts[i + 1], + "' while parsing Lut1D."); } m_lut->setInputHalfDomain(true); @@ -4127,8 +4459,11 @@ void CTFReaderLut1DElt_1_4::start(const char ** atts) { if (0 != Platform::Strcasecmp("true", atts[i + 1])) { - ThrowM(*this, "Illegal 'rawHalfs' attribute '", atts[i + 1], - "' while parsing Lut1D."); + ThrowM( + *this, + "Illegal 'rawHalfs' attribute '", + atts[i + 1], + "' while parsing Lut1D."); } m_lut->setOutputRawHalfs(true); @@ -4139,8 +4474,11 @@ void CTFReaderLut1DElt_1_4::start(const char ** atts) { if (0 != Platform::Strcasecmp("dw3", atts[i + 1])) { - ThrowM(*this, "Illegal 'hueAdjust' attribute '", atts[i + 1], - "' while parsing Lut1D."); + ThrowM( + *this, + "Illegal 'hueAdjust' attribute '", + atts[i + 1], + "' while parsing Lut1D."); } m_lut->setHueAdjust(HUE_DW3); @@ -4148,16 +4486,15 @@ void CTFReaderLut1DElt_1_4::start(const char ** atts) i += 2; } - } bool CTFReaderLut1DElt_1_4::isOpParameterValid(const char * att) const noexcept { - return CTFReaderOpElt::isOpParameterValid(att) || - 0 == Platform::Strcasecmp(ATTR_INTERPOLATION, att) || - 0 == Platform::Strcasecmp(ATTR_HALF_DOMAIN, att) || - 0 == Platform::Strcasecmp(ATTR_RAW_HALFS, att) || - 0 == Platform::Strcasecmp(ATTR_HUE_ADJUST, att); + return CTFReaderOpElt::isOpParameterValid(att) + || 0 == Platform::Strcasecmp(ATTR_INTERPOLATION, att) + || 0 == Platform::Strcasecmp(ATTR_HALF_DOMAIN, att) + || 0 == Platform::Strcasecmp(ATTR_RAW_HALFS, att) + || 0 == Platform::Strcasecmp(ATTR_HUE_ADJUST, att); } ////////////////////////////////////////////////////////// @@ -4214,7 +4551,7 @@ void CTFReaderLut3DElt::start(const char ** atts) CTFReaderOpElt::start(atts); // The interpolation attribute is optional in CLF/CTF. The INTERP_DEFAULT - // enum indicates that the value was not specified in the file. When + // enum indicates that the value was not specified in the file. When // writing, this means no interpolation attribute will be added. m_lut->setInterpolation(INTERP_DEFAULT); @@ -4228,7 +4565,7 @@ void CTFReaderLut3DElt::start(const char ** atts) Interpolation interp = GetInterpolation3D(atts[i + 1]); m_lut->setInterpolation(interp); } - catch (const std::exception& e) + catch (const std::exception & e) { throwMessage(e.what()); } @@ -4240,8 +4577,8 @@ void CTFReaderLut3DElt::start(const char ** atts) bool CTFReaderLut3DElt::isOpParameterValid(const char * att) const noexcept { - return CTFReaderOpElt::isOpParameterValid(att) || - 0 == Platform::Strcasecmp(ATTR_INTERPOLATION, att); + return CTFReaderOpElt::isOpParameterValid(att) + || 0 == Platform::Strcasecmp(ATTR_INTERPOLATION, att); } void CTFReaderLut3DElt::end() @@ -4267,7 +4604,7 @@ ArrayBase * CTFReaderLut3DElt::updateDimension(const Dimensions & dims) return nullptr; } - const size_t max = (dims.empty() ? 0 : (dims.size() - 1)); + const size_t max = (dims.empty() ? 0 : (dims.size() - 1)); const unsigned numColorComponents = dims[max]; if (dims[3] != 3 || dims[1] != dims[0] || dims[2] != dims[0]) @@ -4275,7 +4612,7 @@ ArrayBase * CTFReaderLut3DElt::updateDimension(const Dimensions & dims) return nullptr; } - Array* pArray = &m_lut->getArray(); + Array * pArray = &m_lut->getArray(); pArray->resize(dims[0], numColorComponents); return pArray; @@ -4284,12 +4621,22 @@ ArrayBase * CTFReaderLut3DElt::updateDimension(const Dimensions & dims) void CTFReaderLut3DElt::endArray(unsigned int position) { // NB: A CLF/CTF Lut3D Array stores the elements in blue-fastest order. - Array* pArray = &m_lut->getArray(); + Array * pArray = &m_lut->getArray(); if (pArray->getNumValues() != position) { - ThrowM(*this, "Expected ", pArray->getLength(), "x", pArray->getLength(), - "x", pArray->getLength(), "x", pArray->getNumColorComponents(), - " Array values, found ", position, "."); + ThrowM( + *this, + "Expected ", + pArray->getLength(), + "x", + pArray->getLength(), + "x", + pArray->getLength(), + "x", + pArray->getNumColorComponents(), + " Array values, found ", + position, + "."); } pArray->validate(); @@ -4318,8 +4665,13 @@ void CTFReaderLut3DElt::endIndexMap(unsigned int position) { if (m_indexMapping.getDimension() != position) { - ThrowM(*this, "Expected ", m_indexMapping.getDimension(), - " IndexMap values, found ", position, "."); + ThrowM( + *this, + "Expected ", + m_indexMapping.getDimension(), + " IndexMap values, found ", + position, + "."); } m_indexMapping.validate(); @@ -4402,7 +4754,7 @@ ArrayBase * CTFReaderMatrixElt::updateDimension(const Dimensions & dims) } const unsigned int numColorComponents = dims[2]; - const unsigned int size = dims[0]; + const unsigned int size = dims[0]; if (size != dims[1] || numColorComponents != 3) { @@ -4441,12 +4793,12 @@ void CTFReaderMatrixElt::convert_1_2_to_Latest() if (array.getLength() == 3) { - const double offsets[4] = { 0.0, 0.0, 0.0, 0.0 }; + const double offsets[4] = {0.0, 0.0, 0.0, 0.0}; m_matrix->setRGBAOffsets(offsets); } else if (array.getLength() == 4) { - array = m_matrix->getArray(); + array = m_matrix->getArray(); ArrayDouble::Values oldV = array.getValues(); // Extract offsets. @@ -4458,9 +4810,9 @@ void CTFReaderMatrixElt::convert_1_2_to_Latest() array.resize(3, 3); ArrayDouble::Values & v = array.getValues(); - v[0] = oldV[0]; - v[1] = oldV[1]; - v[2] = oldV[2]; + v[0] = oldV[0]; + v[1] = oldV[1]; + v[2] = oldV[2]; v[3] = oldV[4]; v[4] = oldV[5]; @@ -4494,10 +4846,8 @@ ArrayBase * CTFReaderMatrixElt_1_3::updateDimension(const Dimensions & dims) return nullptr; } - if (!((dims[0] == 3 && dims[1] == 3) || - (dims[0] == 3 && dims[1] == 4) || - (dims[0] == 4 && dims[1] == 4) || - (dims[0] == 4 && dims[1] == 5))) + if (!((dims[0] == 3 && dims[1] == 3) || (dims[0] == 3 && dims[1] == 4) + || (dims[0] == 4 && dims[1] == 4) || (dims[0] == 4 && dims[1] == 5))) { return nullptr; } @@ -4583,9 +4933,9 @@ void CTFReaderMatrixElt_1_3::endArray(unsigned int position) array.setLength(3); ArrayDouble::Values & v = array.getValues(); - v[0] = oldV[0]; - v[1] = oldV[1]; - v[2] = oldV[2]; + v[0] = oldV[0]; + v[1] = oldV[1]; + v[2] = oldV[2]; v[3] = oldV[4]; v[4] = oldV[5]; @@ -4604,7 +4954,7 @@ void CTFReaderMatrixElt_1_3::endArray(unsigned int position) MatrixOpDataRcPtr & pMatrix = getMatrix(); - const double offsets[4] = { 0., 0., 0., 0. }; + const double offsets[4] = {0., 0., 0., 0.}; pMatrix->setRGBAOffsets(offsets); } } @@ -4627,18 +4977,18 @@ void CTFReaderMatrixElt_1_3::endArray(unsigned int position) array.resize(4, 4); ArrayDouble::Values & v = array.getValues(); - v[0] = oldV[0]; - v[1] = oldV[1]; - v[2] = oldV[2]; - v[3] = oldV[3]; + v[0] = oldV[0]; + v[1] = oldV[1]; + v[2] = oldV[2]; + v[3] = oldV[3]; v[4] = oldV[5]; v[5] = oldV[6]; v[6] = oldV[7]; v[7] = oldV[8]; - v[8] = oldV[10]; - v[9] = oldV[11]; + v[8] = oldV[10]; + v[9] = oldV[11]; v[10] = oldV[12]; v[11] = oldV[13]; @@ -4716,8 +5066,7 @@ void CTFReaderRangeElt_1_7::start(const char ** atts) bool CTFReaderRangeElt_1_7::isOpParameterValid(const char * att) const noexcept { - return CTFReaderOpElt::isOpParameterValid(att) || - 0 == Platform::Strcasecmp(ATTR_STYLE, att); + return CTFReaderOpElt::isOpParameterValid(att) || 0 == Platform::Strcasecmp(ATTR_STYLE, att); } void CTFReaderRangeElt_1_7::end() @@ -4744,10 +5093,11 @@ void CTFReaderRangeElt_1_7::end() ////////////////////////////////////////////////////////// -CTFReaderRangeValueElt::CTFReaderRangeValueElt(const std::string & name, - ContainerEltRcPtr pParent, - unsigned int xmlLineNumber, - const std::string & xmlFile) +CTFReaderRangeValueElt::CTFReaderRangeValueElt( + const std::string & name, + ContainerEltRcPtr pParent, + unsigned int xmlLineNumber, + const std::string & xmlFile) : XmlReaderPlainElt(name, pParent, xmlLineNumber, xmlFile) { } @@ -4772,7 +5122,7 @@ void CTFReaderRangeValueElt::end() void CTFReaderRangeValueElt::setRawData(const char * s, size_t len, unsigned int) { - CTFReaderRangeElt * pRange = dynamic_cast(getParent().get()); + CTFReaderRangeElt * pRange = dynamic_cast(getParent().get()); std::vector data; @@ -4782,8 +5132,15 @@ void CTFReaderRangeValueElt::setRawData(const char * s, size_t len, unsigned int } catch (Exception & ce) { - ThrowM(*this, "Illegal '", getTypeName(), "' values ", - TruncateString(s, len), " [", ce.what(), "]"); + ThrowM( + *this, + "Illegal '", + getTypeName(), + "' values ", + TruncateString(s, len), + " [", + ce.what(), + "]"); } if (data.size() != 1) @@ -4821,7 +5178,7 @@ CTFReaderReferenceElt::~CTFReaderReferenceElt() { } -void CTFReaderReferenceElt::start(const char **atts) +void CTFReaderReferenceElt::start(const char ** atts) { CTFReaderOpElt::start(atts); @@ -4894,11 +5251,10 @@ void CTFReaderReferenceElt::start(const char **atts) bool CTFReaderReferenceElt::isOpParameterValid(const char * att) const noexcept { - return CTFReaderOpElt::isOpParameterValid(att) || - 0 == Platform::Strcasecmp(ATTR_PATH, att) || - 0 == Platform::Strcasecmp(ATTR_BASE_PATH, att) || - 0 == Platform::Strcasecmp(ATTR_ALIAS, att) || - 0 == Platform::Strcasecmp(ATTR_IS_INVERTED, att); + return CTFReaderOpElt::isOpParameterValid(att) || 0 == Platform::Strcasecmp(ATTR_PATH, att) + || 0 == Platform::Strcasecmp(ATTR_BASE_PATH, att) + || 0 == Platform::Strcasecmp(ATTR_ALIAS, att) + || 0 == Platform::Strcasecmp(ATTR_IS_INVERTED, att); } void CTFReaderReferenceElt::end() @@ -4914,4 +5270,3 @@ const OpDataRcPtr CTFReaderReferenceElt::getOp() const } } // namespace OCIO_NAMESPACE - diff --git a/src/OpenColorIO/fileformats/ctf/CTFReaderHelper.h b/src/OpenColorIO/fileformats/ctf/CTFReaderHelper.h index dff332595d..270e71667d 100644 --- a/src/OpenColorIO/fileformats/ctf/CTFReaderHelper.h +++ b/src/OpenColorIO/fileformats/ctf/CTFReaderHelper.h @@ -4,10 +4,10 @@ #ifndef INCLUDED_OCIO_FILEFORMATS_CTF_CTFREADERHELPER_H #define INCLUDED_OCIO_FILEFORMATS_CTF_CTFREADERHELPER_H -#include "fileformats/xmlutils/XMLReaderHelper.h" +#include "fileformats/FormatMetadata.h" #include "fileformats/ctf/CTFTransform.h" #include "fileformats/ctf/IndexMapping.h" -#include "fileformats/FormatMetadata.h" +#include "fileformats/xmlutils/XMLReaderHelper.h" #include "ops/OpArray.h" #include "ops/cdl/CDLOpData.h" #include "ops/exposurecontrast/ExposureContrastOpData.h" @@ -31,14 +31,13 @@ namespace OCIO_NAMESPACE class CTFReaderTransformElt : public XmlReaderContainerElt { public: - CTFReaderTransformElt(const std::string & name, - unsigned int xmlLineNumber, - const std::string & xmlFile, - bool isCLF); + CTFReaderTransformElt( + const std::string & name, + unsigned int xmlLineNumber, + const std::string & xmlFile, + bool isCLF); - ~CTFReaderTransformElt() - { - } + ~CTFReaderTransformElt() {} const std::string & getIdentifier() const override; @@ -79,14 +78,15 @@ class CTFReaderMetadataElt : public XmlReaderComplexElt { public: CTFReaderMetadataElt() = delete; - CTFReaderMetadataElt(const std::string & name, - ContainerEltRcPtr pParent, - unsigned int xmlLineNumber, - const std::string & xmlFile); + CTFReaderMetadataElt( + const std::string & name, + ContainerEltRcPtr pParent, + unsigned int xmlLineNumber, + const std::string & xmlFile); virtual ~CTFReaderMetadataElt(); - const std::string& getIdentifier() const override; + const std::string & getIdentifier() const override; void start(const char ** atts) override; @@ -104,10 +104,11 @@ class CTFReaderInfoElt : public CTFReaderMetadataElt { public: CTFReaderInfoElt() = delete; - CTFReaderInfoElt(const std::string & name, - ContainerEltRcPtr pParent, - unsigned int xmlLineNumber, - const std::string & xmlFile); + CTFReaderInfoElt( + const std::string & name, + ContainerEltRcPtr pParent, + unsigned int xmlLineNumber, + const std::string & xmlFile); virtual ~CTFReaderInfoElt(); @@ -120,30 +121,25 @@ class CTFReaderInputDescriptorElt : public XmlReaderPlainElt { public: CTFReaderInputDescriptorElt() = delete; - CTFReaderInputDescriptorElt(const std::string & name, - ContainerEltRcPtr pParent, - unsigned int xmlLineNumber, - const std::string & xmlFile) + CTFReaderInputDescriptorElt( + const std::string & name, + ContainerEltRcPtr pParent, + unsigned int xmlLineNumber, + const std::string & xmlFile) : XmlReaderPlainElt(name, pParent, xmlLineNumber, xmlFile) { } - ~CTFReaderInputDescriptorElt() - { - } + ~CTFReaderInputDescriptorElt() {} - void start(const char ** /* atts */) override - { - } + void start(const char ** /* atts */) override {} - void end() override - { - } + void end() override {} void setRawData(const char * str, size_t len, unsigned int /*xmlLine*/) override { - CTFReaderTransformElt* pTransform - = dynamic_cast(getParent().get()); + CTFReaderTransformElt * pTransform + = dynamic_cast(getParent().get()); std::string s = pTransform->getTransform()->getInputDescriptor(); s += std::string(str, len); @@ -156,30 +152,25 @@ class CTFReaderOutputDescriptorElt : public XmlReaderPlainElt { public: CTFReaderOutputDescriptorElt() = delete; - CTFReaderOutputDescriptorElt(const std::string & name, - ContainerEltRcPtr pParent, - unsigned int xmlLineNumber, - const std::string & xmlFile) + CTFReaderOutputDescriptorElt( + const std::string & name, + ContainerEltRcPtr pParent, + unsigned int xmlLineNumber, + const std::string & xmlFile) : XmlReaderPlainElt(name, pParent, xmlLineNumber, xmlFile) { } - ~CTFReaderOutputDescriptorElt() - { - } + ~CTFReaderOutputDescriptorElt() {} - void start(const char ** /* atts */) override - { - } + void start(const char ** /* atts */) override {} - void end() override - { - } + void end() override {} - void setRawData(const char* str, size_t len, unsigned int /* xmlLine */) override + void setRawData(const char * str, size_t len, unsigned int /* xmlLine */) override { - CTFReaderTransformElt* pTransform - = dynamic_cast(getParent().get()); + CTFReaderTransformElt * pTransform + = dynamic_cast(getParent().get()); std::string s = pTransform->getTransform()->getOutputDescriptor(); s += std::string(str, len); @@ -192,10 +183,11 @@ class CTFReaderArrayElt : public XmlReaderPlainElt { public: CTFReaderArrayElt() = delete; - CTFReaderArrayElt(const std::string & name, - ContainerEltRcPtr pParent, - unsigned int xmlLineNumber, - const std::string & xmlFile); + CTFReaderArrayElt( + const std::string & name, + ContainerEltRcPtr pParent, + unsigned int xmlLineNumber, + const std::string & xmlFile); ~CTFReaderArrayElt(); void start(const char ** atts) override; @@ -224,15 +216,9 @@ class CTFArrayMgt CTFArrayMgt(); virtual ~CTFArrayMgt(); - virtual void setCompleted(bool status) - { - m_completed = status; - } + virtual void setCompleted(bool status) { m_completed = status; } - bool isCompleted() - { - return m_completed; - } + bool isCompleted() { return m_completed; } virtual ArrayBase * updateDimension(const Dimensions & dims) = 0; @@ -248,10 +234,11 @@ class CTFReaderIndexMapElt : public XmlReaderPlainElt { public: CTFReaderIndexMapElt() = delete; - CTFReaderIndexMapElt(const std::string & name, - ContainerEltRcPtr pParent, - unsigned xmlLineNumber, - const std::string & xmlFile); + CTFReaderIndexMapElt( + const std::string & name, + ContainerEltRcPtr pParent, + unsigned xmlLineNumber, + const std::string & xmlFile); ~CTFReaderIndexMapElt(); @@ -278,18 +265,12 @@ class CTFIndexMapMgt typedef std::vector DimensionsIM; public: - CTFIndexMapMgt() = default; + CTFIndexMapMgt() = default; virtual ~CTFIndexMapMgt() = default; - void setCompletedIM(bool status) - { - m_completed = status; - } + void setCompletedIM(bool status) { m_completed = status; } - bool isCompletedIM() - { - return m_completed; - } + bool isCompletedIM() { return m_completed; } virtual IndexMapping * updateDimensionIM(const DimensionsIM & dims) = 0; @@ -337,10 +318,11 @@ class CTFReaderOpElt : public XmlReaderContainerElt ~CTFReaderOpElt(); - void setContext(const std::string & name, - const CTFReaderTransformPtr & pTransform, - unsigned int xmlLineNumber, - const std::string & xmlFile); + void setContext( + const std::string & name, + const CTFReaderTransformPtr & pTransform, + unsigned int xmlLineNumber, + const std::string & xmlFile); const std::string & getIdentifier() const override; @@ -354,10 +336,7 @@ class CTFReaderOpElt : public XmlReaderContainerElt const char * getTypeName() const override; - CTFReaderTransformPtr getTransform() - { - return m_transform; - } + CTFReaderTransformPtr getTransform() { return m_transform; } // Get the right reader using its type and // the xml transform version. @@ -373,8 +352,8 @@ class CTFReaderOpElt : public XmlReaderContainerElt static BitDepth GetBitDepth(const std::string & str); protected: - CTFReaderTransformPtr m_transform; // The parent - BitDepth m_inBitDepth = BIT_DEPTH_UNKNOWN; + CTFReaderTransformPtr m_transform; // The parent + BitDepth m_inBitDepth = BIT_DEPTH_UNKNOWN; BitDepth m_outBitDepth = BIT_DEPTH_UNKNOWN; }; @@ -384,15 +363,12 @@ class CTFReaderACESElt : public CTFReaderOpElt CTFReaderACESElt(); ~CTFReaderACESElt(); - void start(const char **atts) override; + void start(const char ** atts) override; void end() override; const OpDataRcPtr getOp() const override; - const FixedFunctionOpDataRcPtr getFixedFunction() const - { - return m_fixedFunction; - } + const FixedFunctionOpDataRcPtr getFixedFunction() const { return m_fixedFunction; } protected: bool isOpParameterValid(const char * att) const noexcept override; @@ -404,18 +380,21 @@ class CTFReaderACESElt : public CTFReaderOpElt class CTFReaderACESParamsElt : public XmlReaderPlainElt { public: - CTFReaderACESParamsElt(const std::string & name, - ContainerEltRcPtr pParent, - unsigned int xmlLineNumber, - const std::string & xmlFile); + CTFReaderACESParamsElt( + const std::string & name, + ContainerEltRcPtr pParent, + unsigned int xmlLineNumber, + const std::string & xmlFile); ~CTFReaderACESParamsElt(); - void start(const char **atts) override; + void start(const char ** atts) override; void end() override {} - void setRawData(const char * /* str */, size_t /* len */, unsigned int /* xmlLine */) override {} + void setRawData(const char * /* str */, size_t /* len */, unsigned int /* xmlLine */) override + { + } }; class CTFReaderCDLElt : public CTFReaderOpElt @@ -442,24 +421,25 @@ class CTFReaderCDLElt : public CTFReaderOpElt class CTFReaderSatNodeElt : public XmlReaderSatNodeBaseElt { public: - CTFReaderSatNodeElt(const std::string & name, - ContainerEltRcPtr pParent, - unsigned int xmlLineNumber, - const std::string & xmlFile); + CTFReaderSatNodeElt( + const std::string & name, + ContainerEltRcPtr pParent, + unsigned int xmlLineNumber, + const std::string & xmlFile); CTFReaderSatNodeElt() = delete; const CDLOpDataRcPtr & getCDL() const override; - }; class CTFReaderSOPNodeElt : public XmlReaderSOPNodeBaseElt { public: - CTFReaderSOPNodeElt(const std::string & name, - ContainerEltRcPtr pParent, - unsigned int xmlLocation, - const std::string & xmlFile); + CTFReaderSOPNodeElt( + const std::string & name, + ContainerEltRcPtr pParent, + unsigned int xmlLocation, + const std::string & xmlFile); CTFReaderSOPNodeElt() = delete; @@ -472,15 +452,12 @@ class CTFReaderFixedFunctionElt : public CTFReaderOpElt CTFReaderFixedFunctionElt(); ~CTFReaderFixedFunctionElt(); - void start(const char **atts) override; + void start(const char ** atts) override; void end() override; const OpDataRcPtr getOp() const override; - const FixedFunctionOpDataRcPtr getFixedFunction() const - { - return m_fixedFunction; - } + const FixedFunctionOpDataRcPtr getFixedFunction() const { return m_fixedFunction; } protected: bool isOpParameterValid(const char * att) const noexcept override; @@ -495,15 +472,12 @@ class CTFReaderFunctionElt : public CTFReaderOpElt CTFReaderFunctionElt(); ~CTFReaderFunctionElt(); - void start(const char **atts) override; + void start(const char ** atts) override; void end() override; const OpDataRcPtr getOp() const override; - const FixedFunctionOpDataRcPtr getFixedFunction() const - { - return m_fixedFunction; - } + const FixedFunctionOpDataRcPtr getFixedFunction() const { return m_fixedFunction; } protected: bool isOpParameterValid(const char * att) const noexcept override; @@ -546,7 +520,10 @@ class CTFReaderGammaElt : public CTFReaderOpElt class CTFReaderGammaElt_1_5 : public CTFReaderGammaElt { public: - CTFReaderGammaElt_1_5() : CTFReaderGammaElt() {} + CTFReaderGammaElt_1_5() + : CTFReaderGammaElt() + { + } ~CTFReaderGammaElt_1_5() {} CTFReaderGammaParamsEltRcPtr createGammaParamsElt( @@ -559,7 +536,10 @@ class CTFReaderGammaElt_1_5 : public CTFReaderGammaElt class CTFReaderGammaElt_CTF_2_0 : public CTFReaderGammaElt_1_5 { public: - CTFReaderGammaElt_CTF_2_0() : CTFReaderGammaElt_1_5() {} + CTFReaderGammaElt_CTF_2_0() + : CTFReaderGammaElt_1_5() + { + } ~CTFReaderGammaElt_CTF_2_0() {} protected: @@ -570,7 +550,10 @@ class CTFReaderGammaElt_CTF_2_0 : public CTFReaderGammaElt_1_5 class CTFReaderGammaElt_CLF_3_0 : public CTFReaderGammaElt_CTF_2_0 { public: - CTFReaderGammaElt_CLF_3_0() : CTFReaderGammaElt_CTF_2_0() {} + CTFReaderGammaElt_CLF_3_0() + : CTFReaderGammaElt_CTF_2_0() + { + } ~CTFReaderGammaElt_CLF_3_0() {} CTFReaderGammaParamsEltRcPtr createGammaParamsElt( @@ -583,10 +566,11 @@ class CTFReaderGammaElt_CLF_3_0 : public CTFReaderGammaElt_CTF_2_0 class CTFReaderGammaParamsElt : public XmlReaderPlainElt { public: - CTFReaderGammaParamsElt(const std::string & name, - ContainerEltRcPtr pParent, - unsigned int xmlLineNumber, - const std::string & xmlFile); + CTFReaderGammaParamsElt( + const std::string & name, + ContainerEltRcPtr pParent, + unsigned int xmlLineNumber, + const std::string & xmlFile); ~CTFReaderGammaParamsElt(); @@ -602,10 +586,11 @@ class CTFReaderGammaParamsElt : public XmlReaderPlainElt class CTFReaderGammaParamsElt_1_5 : public CTFReaderGammaParamsElt { public: - CTFReaderGammaParamsElt_1_5(const std::string & name, - ContainerEltRcPtr pParent, - unsigned int xmlLineNumber, - const std::string & xmlFile); + CTFReaderGammaParamsElt_1_5( + const std::string & name, + ContainerEltRcPtr pParent, + unsigned int xmlLineNumber, + const std::string & xmlFile); ~CTFReaderGammaParamsElt_1_5(); protected: @@ -623,10 +608,7 @@ class CTFReaderGradingPrimaryElt : public CTFReaderOpElt const OpDataRcPtr getOp() const override; - const GradingPrimaryOpDataRcPtr & getGradingPrimary() const - { - return m_gradingPrimaryOpData; - } + const GradingPrimaryOpDataRcPtr & getGradingPrimary() const { return m_gradingPrimaryOpData; } GradingPrimary & getValue() { return m_gradingPrimary; } const GradingPrimary & getValue() const { return m_gradingPrimary; } @@ -635,39 +617,34 @@ class CTFReaderGradingPrimaryElt : public CTFReaderOpElt bool isOpParameterValid(const char * att) const noexcept override; private: - GradingPrimary m_gradingPrimary{ GRADING_LOG }; + GradingPrimary m_gradingPrimary{GRADING_LOG}; GradingPrimaryOpDataRcPtr m_gradingPrimaryOpData; }; class CTFReaderGradingPrimaryParamElt : public XmlReaderPlainElt { public: - CTFReaderGradingPrimaryParamElt(const std::string & name, - ContainerEltRcPtr pParent, - unsigned int xmlLocation, - const std::string & xmlFile); + CTFReaderGradingPrimaryParamElt( + const std::string & name, + ContainerEltRcPtr pParent, + unsigned int xmlLocation, + const std::string & xmlFile); ~CTFReaderGradingPrimaryParamElt(); void start(const char ** atts); void end(); - void setRawData(const char* str, size_t len, unsigned int xmlLine); + void setRawData(const char * str, size_t len, unsigned int xmlLine); private: void parseRGBMAttrValues(const char ** atts, GradingRGBM & rgbm) const; - void parsePivotAttrValues(const char ** atts, - double & contrast, - double & black, - double & white) const; + void parsePivotAttrValues(const char ** atts, double & contrast, double & black, double & white) + const; - void parseBWAttrValues(const char ** atts, - double & black, - double & white) const; + void parseBWAttrValues(const char ** atts, double & black, double & white) const; - void parseScalarAttrValue(const char ** atts, - const char * tag, - double & value) const; + void parseScalarAttrValue(const char ** atts, const char * tag, double & value) const; }; class CTFReaderGradingRGBCurveElt : public CTFReaderOpElt @@ -681,10 +658,7 @@ class CTFReaderGradingRGBCurveElt : public CTFReaderOpElt const OpDataRcPtr getOp() const override; - const GradingRGBCurveOpDataRcPtr & getGradingRGBCurve() const - { - return m_gradingRGBCurve; - } + const GradingRGBCurveOpDataRcPtr & getGradingRGBCurve() const { return m_gradingRGBCurve; } // For sub-elements. GradingRGBCurveRcPtr & getLoadingRGBCurve() { return m_loadingRGBCurve; } @@ -701,16 +675,18 @@ class CTFReaderGradingRGBCurveElt : public CTFReaderOpElt class CTFReaderGradingCurveElt : public XmlReaderComplexElt { public: - CTFReaderGradingCurveElt(const std::string & name, - ContainerEltRcPtr pParent, - unsigned int xmlLocation, - const std::string & xmlFile); + CTFReaderGradingCurveElt( + const std::string & name, + ContainerEltRcPtr pParent, + unsigned int xmlLocation, + const std::string & xmlFile); ~CTFReaderGradingCurveElt(); void start(const char ** atts); void end(); GradingBSplineCurveRcPtr getCurve() { return m_curve; } + private: GradingBSplineCurveRcPtr m_curve; }; @@ -718,16 +694,17 @@ class CTFReaderGradingCurveElt : public XmlReaderComplexElt class CTFReaderGradingCurvePointsElt : public XmlReaderPlainElt { public: - CTFReaderGradingCurvePointsElt(const std::string & name, - ContainerEltRcPtr pParent, - unsigned int xmlLocation, - const std::string & xmlFile); + CTFReaderGradingCurvePointsElt( + const std::string & name, + ContainerEltRcPtr pParent, + unsigned int xmlLocation, + const std::string & xmlFile); ~CTFReaderGradingCurvePointsElt(); void start(const char ** atts); void end(); - void setRawData(const char* str, size_t len, unsigned int xmlLine); + void setRawData(const char * str, size_t len, unsigned int xmlLine); private: std::vector m_data; @@ -736,16 +713,17 @@ class CTFReaderGradingCurvePointsElt : public XmlReaderPlainElt class CTFReaderGradingCurveSlopesElt : public XmlReaderPlainElt { public: - CTFReaderGradingCurveSlopesElt(const std::string & name, - ContainerEltRcPtr pParent, - unsigned int xmlLocation, - const std::string & xmlFile); + CTFReaderGradingCurveSlopesElt( + const std::string & name, + ContainerEltRcPtr pParent, + unsigned int xmlLocation, + const std::string & xmlFile); ~CTFReaderGradingCurveSlopesElt(); void start(const char ** atts); void end(); - void setRawData(const char* str, size_t len, unsigned int xmlLine); + void setRawData(const char * str, size_t len, unsigned int xmlLine); private: std::vector m_data; @@ -762,10 +740,7 @@ class CTFReaderGradingToneElt : public CTFReaderOpElt const OpDataRcPtr getOp() const override; - const GradingToneOpDataRcPtr & getGradingTone() const - { - return m_gradingTone; - } + const GradingToneOpDataRcPtr & getGradingTone() const { return m_gradingTone; } protected: bool isOpParameterValid(const char * att) const noexcept override; @@ -777,24 +752,23 @@ class CTFReaderGradingToneElt : public CTFReaderOpElt class CTFReaderGradingToneParamElt : public XmlReaderPlainElt { public: - CTFReaderGradingToneParamElt(const std::string & name, - ContainerEltRcPtr pParent, - unsigned int xmlLocation, - const std::string & xmlFile); + CTFReaderGradingToneParamElt( + const std::string & name, + ContainerEltRcPtr pParent, + unsigned int xmlLocation, + const std::string & xmlFile); ~CTFReaderGradingToneParamElt(); void start(const char ** atts); void end(); - void setRawData(const char* str, size_t len, unsigned int xmlLine); + void setRawData(const char * str, size_t len, unsigned int xmlLine); private: - void parseRGBMSWAttrValues(const char ** atts, GradingRGBMSW & rgbm, - bool center, bool pivot) const; + void parseRGBMSWAttrValues(const char ** atts, GradingRGBMSW & rgbm, bool center, bool pivot) + const; - void parseScalarAttrValue(const char ** atts, - const char * tag, - double & value) const; + void parseScalarAttrValue(const char ** atts, const char * tag, double & value) const; }; class CTFReaderInvLut1DElt : public CTFReaderOpElt, public CTFArrayMgt @@ -847,7 +821,6 @@ class CTFReaderInvLut3DElt : public CTFReaderOpElt, public CTFArrayMgt Lut3DOpDataRcPtr m_invLut; }; - class CTFReaderLogParamsElt; typedef OCIO_SHARED_PTR CTFReaderLogParamsEltRcPtr; @@ -872,10 +845,11 @@ class CTFReaderLogElt : public CTFReaderOpElt void setBase(double base); bool isBaseSet() const noexcept { return m_baseSet; } - virtual CTFReaderLogParamsEltRcPtr createLogParamsElt(const std::string & name, - ContainerEltRcPtr pParent, - unsigned int xmlLineNumber, - const std::string & xmlFile) const; + virtual CTFReaderLogParamsEltRcPtr createLogParamsElt( + const std::string & name, + ContainerEltRcPtr pParent, + unsigned int xmlLineNumber, + const std::string & xmlFile) const; protected: bool isOpParameterValid(const char * att) const noexcept override; @@ -889,24 +863,29 @@ class CTFReaderLogElt : public CTFReaderOpElt class CTFReaderLogElt_2_0 : public CTFReaderLogElt { public: - CTFReaderLogElt_2_0() : CTFReaderLogElt() {} + CTFReaderLogElt_2_0() + : CTFReaderLogElt() + { + } ~CTFReaderLogElt_2_0() {} void end() override; - CTFReaderLogParamsEltRcPtr createLogParamsElt(const std::string & name, - ContainerEltRcPtr pParent, - unsigned int xmlLineNumber, - const std::string & xmlFile) const override; + CTFReaderLogParamsEltRcPtr createLogParamsElt( + const std::string & name, + ContainerEltRcPtr pParent, + unsigned int xmlLineNumber, + const std::string & xmlFile) const override; }; class CTFReaderLogParamsElt : public XmlReaderPlainElt { public: - CTFReaderLogParamsElt(const std::string & name, - ContainerEltRcPtr pParent, - unsigned int xmlLineNumber, - const std::string & xmlFile); + CTFReaderLogParamsElt( + const std::string & name, + ContainerEltRcPtr pParent, + unsigned int xmlLineNumber, + const std::string & xmlFile); ~CTFReaderLogParamsElt(); @@ -916,21 +895,36 @@ class CTFReaderLogParamsElt : public XmlReaderPlainElt void setRawData(const char * str, size_t len, unsigned int xmlLine) override; - bool parseCineon(const char ** atts, unsigned i, double & gamma, double & refWhite, - double & refBlack, double & highlight, double & shadow); - - void setCineon(LogUtil::CTFParams & legacyParams, int chan, double gamma, - double refWhite, double refBlack, double highlight, double shadow); + bool parseCineon( + const char ** atts, + unsigned i, + double & gamma, + double & refWhite, + double & refBlack, + double & highlight, + double & shadow); + + void setCineon( + LogUtil::CTFParams & legacyParams, + int chan, + double gamma, + double refWhite, + double refBlack, + double highlight, + double shadow); }; class CTFReaderLogParamsElt_2_0 : public CTFReaderLogParamsElt { public: - CTFReaderLogParamsElt_2_0(const std::string & name, - ContainerEltRcPtr pParent, - unsigned int xmlLineNumber, - const std::string & xmlFile) - : CTFReaderLogParamsElt(name, pParent, xmlLineNumber, xmlFile) {} + CTFReaderLogParamsElt_2_0( + const std::string & name, + ContainerEltRcPtr pParent, + unsigned int xmlLineNumber, + const std::string & xmlFile) + : CTFReaderLogParamsElt(name, pParent, xmlLineNumber, xmlFile) + { + } ~CTFReaderLogParamsElt_2_0() {} void start(const char ** atts) override; @@ -948,10 +942,7 @@ class CTFReaderLut1DElt : public CTFReaderOpElt, public CTFArrayMgt, public CTFI const OpDataRcPtr getOp() const override; - const Lut1DOpDataRcPtr & getLut() const - { - return m_lut; - } + const Lut1DOpDataRcPtr & getLut() const { return m_lut; } ArrayBase * updateDimension(const Dimensions & dims) override; @@ -965,17 +956,20 @@ class CTFReaderLut1DElt : public CTFReaderOpElt, public CTFArrayMgt, public CTFI bool isOpParameterValid(const char * att) const noexcept override; Lut1DOpDataRcPtr m_lut; - IndexMapping m_indexMapping; + IndexMapping m_indexMapping; }; class CTFReaderLut1DElt_1_4 : public CTFReaderLut1DElt { public: - CTFReaderLut1DElt_1_4() : CTFReaderLut1DElt() {} + CTFReaderLut1DElt_1_4() + : CTFReaderLut1DElt() + { + } ~CTFReaderLut1DElt_1_4() {} - void start(const char **atts) override; + void start(const char ** atts) override; protected: bool isOpParameterValid(const char * att) const noexcept override; @@ -984,7 +978,10 @@ class CTFReaderLut1DElt_1_4 : public CTFReaderLut1DElt class CTFReaderLut1DElt_1_7 : public CTFReaderLut1DElt_1_4 { public: - CTFReaderLut1DElt_1_7() : CTFReaderLut1DElt_1_4() {} + CTFReaderLut1DElt_1_7() + : CTFReaderLut1DElt_1_4() + { + } ~CTFReaderLut1DElt_1_7() {} @@ -1004,10 +1001,7 @@ class CTFReaderLut3DElt : public CTFReaderOpElt, public CTFArrayMgt, public CTFI const OpDataRcPtr getOp() const override; - const Lut3DOpDataRcPtr & getLut() const - { - return m_lut; - } + const Lut3DOpDataRcPtr & getLut() const { return m_lut; } ArrayBase * updateDimension(const Dimensions & dims) override; @@ -1021,13 +1015,16 @@ class CTFReaderLut3DElt : public CTFReaderOpElt, public CTFArrayMgt, public CTFI bool isOpParameterValid(const char * att) const noexcept override; Lut3DOpDataRcPtr m_lut; - IndexMapping m_indexMapping; + IndexMapping m_indexMapping; }; class CTFReaderLut3DElt_1_7 : public CTFReaderLut3DElt { public: - CTFReaderLut3DElt_1_7() : CTFReaderLut3DElt() {} + CTFReaderLut3DElt_1_7() + : CTFReaderLut3DElt() + { + } ~CTFReaderLut3DElt_1_7() {} @@ -1046,10 +1043,7 @@ class CTFReaderMatrixElt : public CTFReaderOpElt, public CTFArrayMgt const OpDataRcPtr getOp() const override; // Get the associated Matrix - const MatrixOpDataRcPtr & getMatrix() const - { - return m_matrix; - } + const MatrixOpDataRcPtr & getMatrix() const { return m_matrix; } ArrayBase * updateDimension(const Dimensions & dims) override; @@ -1059,10 +1053,7 @@ class CTFReaderMatrixElt : public CTFReaderOpElt, public CTFArrayMgt // Helper method to convert Matrix data from 1.2 to latest. void convert_1_2_to_Latest(); - MatrixOpDataRcPtr & getMatrix() - { - return m_matrix; - } + MatrixOpDataRcPtr & getMatrix() { return m_matrix; } private: MatrixOpDataRcPtr m_matrix; @@ -1071,7 +1062,10 @@ class CTFReaderMatrixElt : public CTFReaderOpElt, public CTFArrayMgt class CTFReaderMatrixElt_1_3 : public CTFReaderMatrixElt { public: - CTFReaderMatrixElt_1_3() : CTFReaderMatrixElt() {} + CTFReaderMatrixElt_1_3() + : CTFReaderMatrixElt() + { + } ~CTFReaderMatrixElt_1_3() {} @@ -1091,10 +1085,7 @@ class CTFReaderRangeElt : public CTFReaderOpElt const OpDataRcPtr getOp() const override; - const RangeOpDataRcPtr getRange() const - { - return m_range; - } + const RangeOpDataRcPtr getRange() const { return m_range; } protected: RangeOpDataRcPtr m_range; @@ -1121,10 +1112,11 @@ class CTFReaderRangeElt_1_7 : public CTFReaderRangeElt class CTFReaderRangeValueElt : public XmlReaderPlainElt { public: - CTFReaderRangeValueElt(const std::string & name, - ContainerEltRcPtr pParent, - unsigned int xmlLineNumber, - const std::string & xmlFile); + CTFReaderRangeValueElt( + const std::string & name, + ContainerEltRcPtr pParent, + unsigned int xmlLineNumber, + const std::string & xmlFile); ~CTFReaderRangeValueElt(); @@ -1147,10 +1139,7 @@ class CTFReaderReferenceElt : public CTFReaderOpElt const OpDataRcPtr getOp() const override; - const ReferenceOpDataRcPtr getReference() const - { - return m_reference; - } + const ReferenceOpDataRcPtr getReference() const { return m_reference; } protected: bool isOpParameterValid(const char * att) const noexcept override; @@ -1170,10 +1159,7 @@ class CTFReaderExposureContrastElt : public CTFReaderOpElt const OpDataRcPtr getOp() const override; - const ExposureContrastOpDataRcPtr getExposureContrast() const - { - return m_ec; - } + const ExposureContrastOpDataRcPtr getExposureContrast() const { return m_ec; } protected: bool isOpParameterValid(const char * att) const noexcept override; @@ -1185,32 +1171,38 @@ class CTFReaderExposureContrastElt : public CTFReaderOpElt class CTFReaderECParamsElt : public XmlReaderPlainElt { public: - CTFReaderECParamsElt(const std::string & name, - ContainerEltRcPtr pParent, - unsigned int xmlLineNumber, - const std::string & xmlFile); + CTFReaderECParamsElt( + const std::string & name, + ContainerEltRcPtr pParent, + unsigned int xmlLineNumber, + const std::string & xmlFile); ~CTFReaderECParamsElt(); void start(const char ** atts) override; void end() override {} - void setRawData(const char * /* str */, size_t /* len */, unsigned int /* xmlLine */) override {} + void setRawData(const char * /* str */, size_t /* len */, unsigned int /* xmlLine */) override + { + } }; class CTFReaderDynamicParamElt : public XmlReaderPlainElt { public: - CTFReaderDynamicParamElt(const std::string & name, - ContainerEltRcPtr pParent, - unsigned int xmlLineNumber, - const std::string & xmlFile); + CTFReaderDynamicParamElt( + const std::string & name, + ContainerEltRcPtr pParent, + unsigned int xmlLineNumber, + const std::string & xmlFile); ~CTFReaderDynamicParamElt(); void start(const char ** atts) override; void end() override {} - void setRawData(const char * /* str */, size_t /* len */, unsigned int /* xmlLine */) override {} + void setRawData(const char * /* str */, size_t /* len */, unsigned int /* xmlLine */) override + { + } }; } // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/fileformats/ctf/CTFReaderUtils.cpp b/src/OpenColorIO/fileformats/ctf/CTFReaderUtils.cpp index ffd73cbd43..c4b9d39b71 100644 --- a/src/OpenColorIO/fileformats/ctf/CTFReaderUtils.cpp +++ b/src/OpenColorIO/fileformats/ctf/CTFReaderUtils.cpp @@ -5,6 +5,7 @@ #include #include "fileformats/ctf/CTFReaderUtils.h" + #include "Platform.h" namespace OCIO_NAMESPACE @@ -14,9 +15,9 @@ namespace { static constexpr char INTERPOLATION_1D_LINEAR[] = "linear"; -static constexpr char INTERPOLATION_3D_LINEAR[] = "trilinear"; +static constexpr char INTERPOLATION_3D_LINEAR[] = "trilinear"; static constexpr char INTERPOLATION_3D_TETRAHEDRAL[] = "tetrahedral"; -} +} // namespace Interpolation GetInterpolation1D(const char * str) { @@ -39,18 +40,19 @@ const char * GetInterpolation1DName(Interpolation interp) { switch (interp) { - case INTERP_LINEAR: - case INTERP_BEST: - return INTERPOLATION_1D_LINEAR; - - // Note: In CLF v3, some options were removed and the only legal Lut1D value is now "linear". - - case INTERP_CUBIC: - case INTERP_DEFAULT: - case INTERP_NEAREST: - case INTERP_TETRAHEDRAL: - case INTERP_UNKNOWN: - return nullptr; + case INTERP_LINEAR: + case INTERP_BEST: + return INTERPOLATION_1D_LINEAR; + + // Note: In CLF v3, some options were removed and the only legal Lut1D value is now + // "linear". + + case INTERP_CUBIC: + case INTERP_DEFAULT: + case INTERP_NEAREST: + case INTERP_TETRAHEDRAL: + case INTERP_UNKNOWN: + return nullptr; }; return nullptr; @@ -81,17 +83,17 @@ const char * GetInterpolation3DName(Interpolation interp) { switch (interp) { - case INTERP_LINEAR: - return INTERPOLATION_3D_LINEAR; - case INTERP_TETRAHEDRAL: - case INTERP_BEST: - return INTERPOLATION_3D_TETRAHEDRAL; - - case INTERP_DEFAULT: - case INTERP_NEAREST: - case INTERP_CUBIC: - case INTERP_UNKNOWN: - return nullptr; + case INTERP_LINEAR: + return INTERPOLATION_3D_LINEAR; + case INTERP_TETRAHEDRAL: + case INTERP_BEST: + return INTERPOLATION_3D_TETRAHEDRAL; + + case INTERP_DEFAULT: + case INTERP_NEAREST: + case INTERP_CUBIC: + case INTERP_UNKNOWN: + return nullptr; }; return nullptr; @@ -99,49 +101,50 @@ const char * GetInterpolation3DName(Interpolation interp) namespace { -constexpr char GRADING_STYLE_LOG_FWD[] = "log"; -constexpr char GRADING_STYLE_LIN_FWD[] = "linear"; +constexpr char GRADING_STYLE_LOG_FWD[] = "log"; +constexpr char GRADING_STYLE_LIN_FWD[] = "linear"; constexpr char GRADING_STYLE_VIDEO_FWD[] = "video"; -constexpr char GRADING_STYLE_LOG_REV[] = "logRev"; -constexpr char GRADING_STYLE_LIN_REV[] = "linearRev"; +constexpr char GRADING_STYLE_LOG_REV[] = "logRev"; +constexpr char GRADING_STYLE_LIN_REV[] = "linearRev"; constexpr char GRADING_STYLE_VIDEO_REV[] = "videoRev"; -} +} // namespace -void ConvertStringToGradingStyleAndDir(const char * str, - GradingStyle & style, - TransformDirection & dir) +void ConvertStringToGradingStyleAndDir( + const char * str, + GradingStyle & style, + TransformDirection & dir) { if (str && *str) { if (0 == Platform::Strcasecmp(str, GRADING_STYLE_LOG_FWD)) { style = GRADING_LOG; - dir = TRANSFORM_DIR_FORWARD; + dir = TRANSFORM_DIR_FORWARD; } else if (0 == Platform::Strcasecmp(str, GRADING_STYLE_LOG_REV)) { style = GRADING_LOG; - dir = TRANSFORM_DIR_INVERSE; + dir = TRANSFORM_DIR_INVERSE; } else if (0 == Platform::Strcasecmp(str, GRADING_STYLE_LIN_FWD)) { style = GRADING_LIN; - dir = TRANSFORM_DIR_FORWARD; + dir = TRANSFORM_DIR_FORWARD; } else if (0 == Platform::Strcasecmp(str, GRADING_STYLE_LIN_REV)) { style = GRADING_LIN; - dir = TRANSFORM_DIR_INVERSE; + dir = TRANSFORM_DIR_INVERSE; } else if (0 == Platform::Strcasecmp(str, GRADING_STYLE_VIDEO_FWD)) { style = GRADING_VIDEO; - dir = TRANSFORM_DIR_FORWARD; + dir = TRANSFORM_DIR_FORWARD; } else if (0 == Platform::Strcasecmp(str, GRADING_STYLE_VIDEO_REV)) { style = GRADING_VIDEO; - dir = TRANSFORM_DIR_INVERSE; + dir = TRANSFORM_DIR_INVERSE; } else { @@ -161,12 +164,12 @@ const char * ConvertGradingStyleAndDirToString(GradingStyle style, TransformDire const bool fwd = (dir == TRANSFORM_DIR_FORWARD); switch (style) { - case GRADING_LOG: - return fwd ? GRADING_STYLE_LOG_FWD : GRADING_STYLE_LOG_REV; - case GRADING_LIN: - return fwd ? GRADING_STYLE_LIN_FWD : GRADING_STYLE_LIN_REV; - case GRADING_VIDEO: - return fwd ? GRADING_STYLE_VIDEO_FWD : GRADING_STYLE_VIDEO_REV; + case GRADING_LOG: + return fwd ? GRADING_STYLE_LOG_FWD : GRADING_STYLE_LOG_REV; + case GRADING_LIN: + return fwd ? GRADING_STYLE_LIN_FWD : GRADING_STYLE_LIN_REV; + case GRADING_VIDEO: + return fwd ? GRADING_STYLE_VIDEO_FWD : GRADING_STYLE_VIDEO_REV; } std::ostringstream os; os << "Unknown grading style: " << style; diff --git a/src/OpenColorIO/fileformats/ctf/CTFReaderUtils.h b/src/OpenColorIO/fileformats/ctf/CTFReaderUtils.h index 03f2d9c087..ddcfb7ed5d 100644 --- a/src/OpenColorIO/fileformats/ctf/CTFReaderUtils.h +++ b/src/OpenColorIO/fileformats/ctf/CTFReaderUtils.h @@ -13,122 +13,122 @@ Interpolation GetInterpolation1D(const char * str); const char * GetInterpolation1DName(Interpolation interp); Interpolation GetInterpolation3D(const char * str); const char * GetInterpolation3DName(Interpolation interp); -void ConvertStringToGradingStyleAndDir(const char * str, - GradingStyle & style, - TransformDirection & dir); +void ConvertStringToGradingStyleAndDir( + const char * str, + GradingStyle & style, + TransformDirection & dir); const char * ConvertGradingStyleAndDirToString(GradingStyle style, TransformDirection dir); - -static constexpr char TAG_ACES[] = "ACES"; -static constexpr char TAG_ACES_PARAMS[] = "ACESParams"; -static constexpr char TAG_ARRAY[] = "Array"; -static constexpr char TAG_CDL[] = "ASC_CDL"; -static constexpr char TAG_CURVE_CTRL_PNTS[] = "ControlPoints"; -static constexpr char TAG_CURVE_SLOPES[] = "Slopes"; -static constexpr char TAG_DYN_PROP_CONTRAST[] = "CONTRAST"; -static constexpr char TAG_DYN_PROP_EXPOSURE[] = "EXPOSURE"; -static constexpr char TAG_DYN_PROP_GAMMA[] = "GAMMA"; -static constexpr char TAG_DYN_PROP_PRIMARY[] = "PRIMARY"; -static constexpr char TAG_DYN_PROP_RGBCURVE[] = "RGB_CURVE"; -static constexpr char TAG_DYN_PROP_TONE[] = "TONE"; -static constexpr char TAG_DYN_PROP_LOOK[] = "LOOK_SWITCH"; -static constexpr char TAG_DYNAMIC_PARAMETER[] = "DynamicParameter"; -static constexpr char TAG_EXPONENT[] = "Exponent"; -static constexpr char TAG_EXPONENT_PARAMS[] = "ExponentParams"; -static constexpr char TAG_EXPOSURE_CONTRAST[] = "ExposureContrast"; -static constexpr char TAG_EC_PARAMS[] = "ECParams"; -static constexpr char TAG_FIXED_FUNCTION[] = "FixedFunction"; -static constexpr char TAG_FUNCTION[] = "Function"; -static constexpr char TAG_GAMMA[] = "Gamma"; -static constexpr char TAG_GAMMA_PARAMS[] = "GammaParams"; -static constexpr char TAG_INDEX_MAP[] = "IndexMap"; -static constexpr char TAG_INFO[] = "Info"; -static constexpr char TAG_INVLUT1D[] = "InverseLUT1D"; -static constexpr char TAG_INVLUT3D[] = "InverseLUT3D"; -static constexpr char TAG_LOG[] = "Log"; -static constexpr char TAG_LOG_PARAMS[] = "LogParams"; -static constexpr char TAG_LUT1D[] = "LUT1D"; -static constexpr char TAG_LUT3D[] = "LUT3D"; -static constexpr char TAG_MATRIX[] = "Matrix"; -static constexpr char TAG_MAX_IN_VALUE[] = "maxInValue"; -static constexpr char TAG_MAX_OUT_VALUE[] = "maxOutValue"; -static constexpr char TAG_MIN_IN_VALUE[] = "minInValue"; -static constexpr char TAG_MIN_OUT_VALUE[] = "minOutValue"; -static constexpr char TAG_PRIMARY[] = "GradingPrimary"; +static constexpr char TAG_ACES[] = "ACES"; +static constexpr char TAG_ACES_PARAMS[] = "ACESParams"; +static constexpr char TAG_ARRAY[] = "Array"; +static constexpr char TAG_CDL[] = "ASC_CDL"; +static constexpr char TAG_CURVE_CTRL_PNTS[] = "ControlPoints"; +static constexpr char TAG_CURVE_SLOPES[] = "Slopes"; +static constexpr char TAG_DYN_PROP_CONTRAST[] = "CONTRAST"; +static constexpr char TAG_DYN_PROP_EXPOSURE[] = "EXPOSURE"; +static constexpr char TAG_DYN_PROP_GAMMA[] = "GAMMA"; +static constexpr char TAG_DYN_PROP_PRIMARY[] = "PRIMARY"; +static constexpr char TAG_DYN_PROP_RGBCURVE[] = "RGB_CURVE"; +static constexpr char TAG_DYN_PROP_TONE[] = "TONE"; +static constexpr char TAG_DYN_PROP_LOOK[] = "LOOK_SWITCH"; +static constexpr char TAG_DYNAMIC_PARAMETER[] = "DynamicParameter"; +static constexpr char TAG_EXPONENT[] = "Exponent"; +static constexpr char TAG_EXPONENT_PARAMS[] = "ExponentParams"; +static constexpr char TAG_EXPOSURE_CONTRAST[] = "ExposureContrast"; +static constexpr char TAG_EC_PARAMS[] = "ECParams"; +static constexpr char TAG_FIXED_FUNCTION[] = "FixedFunction"; +static constexpr char TAG_FUNCTION[] = "Function"; +static constexpr char TAG_GAMMA[] = "Gamma"; +static constexpr char TAG_GAMMA_PARAMS[] = "GammaParams"; +static constexpr char TAG_INDEX_MAP[] = "IndexMap"; +static constexpr char TAG_INFO[] = "Info"; +static constexpr char TAG_INVLUT1D[] = "InverseLUT1D"; +static constexpr char TAG_INVLUT3D[] = "InverseLUT3D"; +static constexpr char TAG_LOG[] = "Log"; +static constexpr char TAG_LOG_PARAMS[] = "LogParams"; +static constexpr char TAG_LUT1D[] = "LUT1D"; +static constexpr char TAG_LUT3D[] = "LUT3D"; +static constexpr char TAG_MATRIX[] = "Matrix"; +static constexpr char TAG_MAX_IN_VALUE[] = "maxInValue"; +static constexpr char TAG_MAX_OUT_VALUE[] = "maxOutValue"; +static constexpr char TAG_MIN_IN_VALUE[] = "minInValue"; +static constexpr char TAG_MIN_OUT_VALUE[] = "minOutValue"; +static constexpr char TAG_PRIMARY[] = "GradingPrimary"; static constexpr char TAG_PRIMARY_BRIGHTNESS[] = "Brightness"; -static constexpr char TAG_PRIMARY_CLAMP[] = "Clamp"; -static constexpr char TAG_PRIMARY_CONTRAST[] = "Contrast"; -static constexpr char TAG_PRIMARY_EXPOSURE[] = "Exposure"; -static constexpr char TAG_PRIMARY_GAIN[] = "Gain"; -static constexpr char TAG_PRIMARY_GAMMA[] = "Gamma"; -static constexpr char TAG_PRIMARY_LIFT[] = "Lift"; -static constexpr char TAG_PRIMARY_OFFSET[] = "Offset"; -static constexpr char TAG_PRIMARY_PIVOT[] = "Pivot"; +static constexpr char TAG_PRIMARY_CLAMP[] = "Clamp"; +static constexpr char TAG_PRIMARY_CONTRAST[] = "Contrast"; +static constexpr char TAG_PRIMARY_EXPOSURE[] = "Exposure"; +static constexpr char TAG_PRIMARY_GAIN[] = "Gain"; +static constexpr char TAG_PRIMARY_GAMMA[] = "Gamma"; +static constexpr char TAG_PRIMARY_LIFT[] = "Lift"; +static constexpr char TAG_PRIMARY_OFFSET[] = "Offset"; +static constexpr char TAG_PRIMARY_PIVOT[] = "Pivot"; static constexpr char TAG_PRIMARY_SATURATION[] = "Saturation"; -static constexpr char TAG_PROCESS_LIST[] = "ProcessList"; -static constexpr char TAG_RANGE[] = "Range"; -static constexpr char TAG_REFERENCE[] = "Reference"; -static constexpr char TAG_RGB_CURVE[] = "GradingRGBCurve"; -static constexpr char TAG_RGB_CURVE_BLUE[] = "Blue"; -static constexpr char TAG_RGB_CURVE_GREEN[] = "Green"; -static constexpr char TAG_RGB_CURVE_MASTER[] = "Master"; -static constexpr char TAG_RGB_CURVE_RED[] = "Red"; -static constexpr char TAG_TONE[] = "GradingTone"; -static constexpr char TAG_TONE_BLACKS[] = "Blacks"; -static constexpr char TAG_TONE_HIGHLIGHTS[] = "Highlights"; -static constexpr char TAG_TONE_MIDTONES[] = "Midtones"; -static constexpr char TAG_TONE_SCONTRAST[] = "SContrast"; -static constexpr char TAG_TONE_SHADOWS[] = "Shadows"; -static constexpr char TAG_TONE_WHITES[] = "Whites"; +static constexpr char TAG_PROCESS_LIST[] = "ProcessList"; +static constexpr char TAG_RANGE[] = "Range"; +static constexpr char TAG_REFERENCE[] = "Reference"; +static constexpr char TAG_RGB_CURVE[] = "GradingRGBCurve"; +static constexpr char TAG_RGB_CURVE_BLUE[] = "Blue"; +static constexpr char TAG_RGB_CURVE_GREEN[] = "Green"; +static constexpr char TAG_RGB_CURVE_MASTER[] = "Master"; +static constexpr char TAG_RGB_CURVE_RED[] = "Red"; +static constexpr char TAG_TONE[] = "GradingTone"; +static constexpr char TAG_TONE_BLACKS[] = "Blacks"; +static constexpr char TAG_TONE_HIGHLIGHTS[] = "Highlights"; +static constexpr char TAG_TONE_MIDTONES[] = "Midtones"; +static constexpr char TAG_TONE_SCONTRAST[] = "SContrast"; +static constexpr char TAG_TONE_SHADOWS[] = "Shadows"; +static constexpr char TAG_TONE_WHITES[] = "Whites"; -static constexpr char ATTR_ALIAS[] = "alias"; -static constexpr char ATTR_BASE[] = "base"; -static constexpr char ATTR_BASE_PATH[] = "basePath"; -static constexpr char ATTR_BITDEPTH_IN[] = "inBitDepth"; -static constexpr char ATTR_BITDEPTH_OUT[] = "outBitDepth"; -static constexpr char ATTR_BYPASS[] = "bypass"; +static constexpr char ATTR_ALIAS[] = "alias"; +static constexpr char ATTR_BASE[] = "base"; +static constexpr char ATTR_BASE_PATH[] = "basePath"; +static constexpr char ATTR_BITDEPTH_IN[] = "inBitDepth"; +static constexpr char ATTR_BITDEPTH_OUT[] = "outBitDepth"; +static constexpr char ATTR_BYPASS[] = "bypass"; static constexpr char ATTR_BYPASS_LIN_TO_LOG[] = "bypassLinToLog"; -static constexpr char ATTR_CENTER[] = "center"; -static constexpr char ATTR_CHAN[] = "channel"; -static constexpr char ATTR_COMP_CLF_VERSION[] = "compCLFversion"; -static constexpr char ATTR_CONTRAST[] = "contrast"; -static constexpr char ATTR_DIMENSION[] = "dim"; -static constexpr char ATTR_DIRECTION[] = "dir"; -static constexpr char ATTR_EXPONENT[] = "exponent"; -static constexpr char ATTR_EXPOSURE[] = "exposure"; -static constexpr char ATTR_GAMMA[] = "gamma"; -static constexpr char ATTR_HALF_DOMAIN[] = "halfDomain"; -static constexpr char ATTR_HIGHLIGHT[] = "highlight"; -static constexpr char ATTR_HUE_ADJUST[] = "hueAdjust"; -static constexpr char ATTR_INTERPOLATION[] = "interpolation"; -static constexpr char ATTR_INVERSE_OF[] = "inverseOf"; -static constexpr char ATTR_IS_INVERTED[] = "inverted"; -static constexpr char ATTR_LINEARSLOPE[] = "linearSlope"; -static constexpr char ATTR_LINSIDEBREAK[] = "linSideBreak"; -static constexpr char ATTR_LINSIDESLOPE[] = "linSideSlope"; -static constexpr char ATTR_LINSIDEOFFSET[] = "linSideOffset"; -static constexpr char ATTR_LOGEXPOSURESTEP[] = "logExposureStep"; -static constexpr char ATTR_LOGMIDGRAY[] = "logMidGray"; -static constexpr char ATTR_LOGSIDESLOPE[] = "logSideSlope"; -static constexpr char ATTR_LOGSIDEOFFSET[] = "logSideOffset"; -static constexpr char ATTR_MASTER[] = "master"; -static constexpr char ATTR_OFFSET[] = "offset"; -static constexpr char ATTR_PARAM[] = "param"; -static constexpr char ATTR_PARAMS[] = "params"; -static constexpr char ATTR_PATH[] = "path"; -static constexpr char ATTR_PIVOT[] = "pivot"; -static constexpr char ATTR_PRIMARY_BLACK[] = "black"; -static constexpr char ATTR_PRIMARY_CONTRAST[] = "contrast"; -static constexpr char ATTR_PRIMARY_WHITE[] = "white"; -static constexpr char ATTR_RAW_HALFS[] = "rawHalfs"; -static constexpr char ATTR_REFBLACK[] = "refBlack"; -static constexpr char ATTR_REFWHITE[] = "refWhite"; -static constexpr char ATTR_RGB[] = "rgb"; -static constexpr char ATTR_SHADOW[] = "shadow"; -static constexpr char ATTR_START[] = "start"; -static constexpr char ATTR_STYLE[] = "style"; -static constexpr char ATTR_VERSION[] = "version"; -static constexpr char ATTR_WIDTH[] = "width"; +static constexpr char ATTR_CENTER[] = "center"; +static constexpr char ATTR_CHAN[] = "channel"; +static constexpr char ATTR_COMP_CLF_VERSION[] = "compCLFversion"; +static constexpr char ATTR_CONTRAST[] = "contrast"; +static constexpr char ATTR_DIMENSION[] = "dim"; +static constexpr char ATTR_DIRECTION[] = "dir"; +static constexpr char ATTR_EXPONENT[] = "exponent"; +static constexpr char ATTR_EXPOSURE[] = "exposure"; +static constexpr char ATTR_GAMMA[] = "gamma"; +static constexpr char ATTR_HALF_DOMAIN[] = "halfDomain"; +static constexpr char ATTR_HIGHLIGHT[] = "highlight"; +static constexpr char ATTR_HUE_ADJUST[] = "hueAdjust"; +static constexpr char ATTR_INTERPOLATION[] = "interpolation"; +static constexpr char ATTR_INVERSE_OF[] = "inverseOf"; +static constexpr char ATTR_IS_INVERTED[] = "inverted"; +static constexpr char ATTR_LINEARSLOPE[] = "linearSlope"; +static constexpr char ATTR_LINSIDEBREAK[] = "linSideBreak"; +static constexpr char ATTR_LINSIDESLOPE[] = "linSideSlope"; +static constexpr char ATTR_LINSIDEOFFSET[] = "linSideOffset"; +static constexpr char ATTR_LOGEXPOSURESTEP[] = "logExposureStep"; +static constexpr char ATTR_LOGMIDGRAY[] = "logMidGray"; +static constexpr char ATTR_LOGSIDESLOPE[] = "logSideSlope"; +static constexpr char ATTR_LOGSIDEOFFSET[] = "logSideOffset"; +static constexpr char ATTR_MASTER[] = "master"; +static constexpr char ATTR_OFFSET[] = "offset"; +static constexpr char ATTR_PARAM[] = "param"; +static constexpr char ATTR_PARAMS[] = "params"; +static constexpr char ATTR_PATH[] = "path"; +static constexpr char ATTR_PIVOT[] = "pivot"; +static constexpr char ATTR_PRIMARY_BLACK[] = "black"; +static constexpr char ATTR_PRIMARY_CONTRAST[] = "contrast"; +static constexpr char ATTR_PRIMARY_WHITE[] = "white"; +static constexpr char ATTR_RAW_HALFS[] = "rawHalfs"; +static constexpr char ATTR_REFBLACK[] = "refBlack"; +static constexpr char ATTR_REFWHITE[] = "refWhite"; +static constexpr char ATTR_RGB[] = "rgb"; +static constexpr char ATTR_SHADOW[] = "shadow"; +static constexpr char ATTR_START[] = "start"; +static constexpr char ATTR_STYLE[] = "style"; +static constexpr char ATTR_VERSION[] = "version"; +static constexpr char ATTR_WIDTH[] = "width"; } // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/fileformats/ctf/CTFTransform.cpp b/src/OpenColorIO/fileformats/ctf/CTFTransform.cpp index 80dd5812f7..672b7631fc 100644 --- a/src/OpenColorIO/fileformats/ctf/CTFTransform.cpp +++ b/src/OpenColorIO/fileformats/ctf/CTFTransform.cpp @@ -4,10 +4,12 @@ #include #include "BitDepthUtils.h" +#include "HashUtils.h" +#include "ParseUtils.h" +#include "Platform.h" #include "fileformats/ctf/CTFReaderUtils.h" #include "fileformats/ctf/CTFTransform.h" #include "fileformats/xmlutils/XMLReaderUtils.h" -#include "HashUtils.h" #include "ops/cdl/CDLOpData.h" #include "ops/exponent/ExponentOp.h" #include "ops/exposurecontrast/ExposureContrastOpData.h" @@ -24,8 +26,6 @@ #include "ops/matrix/MatrixOpData.h" #include "ops/range/RangeOpData.h" #include "ops/reference/ReferenceOpData.h" -#include "ParseUtils.h" -#include "Platform.h" #include "transforms/CDLTransform.h" namespace OCIO_NAMESPACE @@ -33,21 +33,20 @@ namespace OCIO_NAMESPACE // Note: 17 would allow exactly restoring most doubles but anything higher than 15, // introduces some serialization issues such as: 81.9 -> 81.90000000000001. -// This results in less pretty output and also causes problems for some unit tests. +// This results in less pretty output and also causes problems for some unit tests. static constexpr unsigned DOUBLE_PRECISION = 15; - void CTFVersion::ReadVersion(const std::string & versionString, CTFVersion & versionOut) { - unsigned int numDot = 0; - unsigned int numInt = 0; - bool canBeDot = false; + unsigned int numDot = 0; + unsigned int numInt = 0; + bool canBeDot = false; std::string::const_iterator it = versionString.begin(); while (it != versionString.end()) { if (::isdigit(*it)) { - numInt = numDot + 1; + numInt = numDot + 1; canBeDot = true; ++it; } @@ -62,10 +61,7 @@ void CTFVersion::ReadVersion(const std::string & versionString, CTFVersion & ver break; } } - if (versionString.empty() - || it != versionString.end() - || numInt == 0 - || numInt > 3 + if (versionString.empty() || it != versionString.end() || numInt == 0 || numInt > 3 || numInt == numDot) { std::ostringstream os; @@ -76,22 +72,24 @@ void CTFVersion::ReadVersion(const std::string & versionString, CTFVersion & ver throw Exception(os.str().c_str()); } - versionOut.m_major = 0; - versionOut.m_minor = 0; + versionOut.m_major = 0; + versionOut.m_minor = 0; versionOut.m_revision = 0; - sscanf(versionString.c_str(), "%d.%d.%d", - &versionOut.m_major, - &versionOut.m_minor, - &versionOut.m_revision); + sscanf( + versionString.c_str(), + "%d.%d.%d", + &versionOut.m_major, + &versionOut.m_minor, + &versionOut.m_revision); } CTFVersion & CTFVersion::operator=(const CTFVersion & rhs) { if (this != &rhs) { - m_major = rhs.m_major; - m_minor = rhs.m_minor; + m_major = rhs.m_major; + m_minor = rhs.m_minor; m_revision = rhs.m_revision; } return *this; @@ -99,11 +97,10 @@ CTFVersion & CTFVersion::operator=(const CTFVersion & rhs) bool CTFVersion::operator==(const CTFVersion & rhs) const { - if (this == &rhs) return true; + if (this == &rhs) + return true; - return m_major == rhs.m_major - && m_minor == rhs.m_minor - && m_revision == rhs.m_revision; + return m_major == rhs.m_major && m_minor == rhs.m_minor && m_revision == rhs.m_revision; } bool CTFVersion::operator<=(const CTFVersion & rhs) const @@ -122,7 +119,8 @@ bool CTFVersion::operator>=(const CTFVersion & rhs) const bool CTFVersion::operator<(const CTFVersion & rhs) const { - if (this == &rhs) return false; + if (this == &rhs) + return false; if (m_major < rhs.m_major) { @@ -165,8 +163,7 @@ CTFReaderTransform::CTFReaderTransform() { } -CTFReaderTransform::CTFReaderTransform(const OpRcPtrVec & ops, - const FormatMetadataImpl & metadata) +CTFReaderTransform::CTFReaderTransform(const OpRcPtrVec & ops, const FormatMetadataImpl & metadata) : m_infoMetadata(METADATA_INFO, "") , m_version(CTF_PROCESS_LIST_VERSION) , m_versionCLF(0, 0) @@ -205,9 +202,10 @@ bool CTFReaderTransform::isCLF() const return !(m_versionCLF == CTFVersion(0, 0)); } -void GetElementsValues(const FormatMetadataImpl::Elements & elements, - const std::string & name, - StringUtils::StringVec & values) +void GetElementsValues( + const FormatMetadataImpl::Elements & elements, + const std::string & name, + StringUtils::StringVec & values) { for (auto & element : elements) { @@ -223,129 +221,128 @@ namespace CTFVersion GetOpMinimumVersion(const ConstOpDataRcPtr & op) { - CTFVersion minVersion{ CTF_PROCESS_LIST_VERSION }; + CTFVersion minVersion{CTF_PROCESS_LIST_VERSION}; switch (op->getType()) { - case OpData::CDLType: - { - minVersion = CTF_PROCESS_LIST_VERSION_1_7; - break; - } - case OpData::ExposureContrastType: - { - minVersion = CTF_PROCESS_LIST_VERSION_1_3; + case OpData::CDLType: + { + minVersion = CTF_PROCESS_LIST_VERSION_1_7; + break; + } + case OpData::ExposureContrastType: + { + minVersion = CTF_PROCESS_LIST_VERSION_1_3; - auto ec = OCIO_DYNAMIC_POINTER_CAST(op); - if (ec->getLogExposureStep() != ExposureContrastOpData::LOGEXPOSURESTEP_DEFAULT - || ec->getLogMidGray() != ExposureContrastOpData::LOGMIDGRAY_DEFAULT) + auto ec = OCIO_DYNAMIC_POINTER_CAST(op); + if (ec->getLogExposureStep() != ExposureContrastOpData::LOGEXPOSURESTEP_DEFAULT + || ec->getLogMidGray() != ExposureContrastOpData::LOGMIDGRAY_DEFAULT) + { + minVersion = CTF_PROCESS_LIST_VERSION_2_0; + } + break; + } + case OpData::FixedFunctionType: { minVersion = CTF_PROCESS_LIST_VERSION_2_0; - } - break; - } - case OpData::FixedFunctionType: - { - minVersion = CTF_PROCESS_LIST_VERSION_2_0; - auto ff = OCIO_DYNAMIC_POINTER_CAST(op); - - if (ff->getStyle() == FixedFunctionOpData::ACES_GAMUT_COMP_13_FWD + auto ff = OCIO_DYNAMIC_POINTER_CAST(op); + + if (ff->getStyle() == FixedFunctionOpData::ACES_GAMUT_COMP_13_FWD || ff->getStyle() == FixedFunctionOpData::ACES_GAMUT_COMP_13_INV) + { + minVersion = CTF_PROCESS_LIST_VERSION_2_1; + } + + break; + } + case OpData::GradingPrimaryType: + case OpData::GradingRGBCurveType: + case OpData::GradingToneType: + case OpData::LogType: { - minVersion = CTF_PROCESS_LIST_VERSION_2_1; + minVersion = CTF_PROCESS_LIST_VERSION_2_0; + break; } + case OpData::ExponentType: + { + auto exp = OCIO_DYNAMIC_POINTER_CAST(op); - break; - } - case OpData::GradingPrimaryType: - case OpData::GradingRGBCurveType: - case OpData::GradingToneType: - case OpData::LogType: - { - minVersion = CTF_PROCESS_LIST_VERSION_2_0; - break; - } - case OpData::ExponentType: - { - auto exp = OCIO_DYNAMIC_POINTER_CAST(op); - - minVersion = (exp->m_exp4[3] == 1.) ? CTF_PROCESS_LIST_VERSION_1_3 : - CTF_PROCESS_LIST_VERSION_1_5; + minVersion = (exp->m_exp4[3] == 1.) ? CTF_PROCESS_LIST_VERSION_1_3 + : CTF_PROCESS_LIST_VERSION_1_5; - break; - } - case OpData::GammaType: - { - auto gamma = OCIO_DYNAMIC_POINTER_CAST(op); - const auto style = gamma->getStyle(); - switch (style) - { - case GammaOpData::BASIC_FWD: - case GammaOpData::BASIC_REV: - case GammaOpData::MONCURVE_FWD: - case GammaOpData::MONCURVE_REV: - minVersion = gamma->isAlphaComponentIdentity() ? - CTF_PROCESS_LIST_VERSION_1_3 : - CTF_PROCESS_LIST_VERSION_1_5; break; - case GammaOpData::BASIC_MIRROR_FWD: - case GammaOpData::BASIC_MIRROR_REV: - case GammaOpData::BASIC_PASS_THRU_FWD: - case GammaOpData::BASIC_PASS_THRU_REV: - case GammaOpData::MONCURVE_MIRROR_FWD: - case GammaOpData::MONCURVE_MIRROR_REV: - minVersion = CTF_PROCESS_LIST_VERSION_2_0; + } + case OpData::GammaType: + { + auto gamma = OCIO_DYNAMIC_POINTER_CAST(op); + const auto style = gamma->getStyle(); + switch (style) + { + case GammaOpData::BASIC_FWD: + case GammaOpData::BASIC_REV: + case GammaOpData::MONCURVE_FWD: + case GammaOpData::MONCURVE_REV: + minVersion = gamma->isAlphaComponentIdentity() ? CTF_PROCESS_LIST_VERSION_1_3 + : CTF_PROCESS_LIST_VERSION_1_5; + break; + case GammaOpData::BASIC_MIRROR_FWD: + case GammaOpData::BASIC_MIRROR_REV: + case GammaOpData::BASIC_PASS_THRU_FWD: + case GammaOpData::BASIC_PASS_THRU_REV: + case GammaOpData::MONCURVE_MIRROR_FWD: + case GammaOpData::MONCURVE_MIRROR_REV: + minVersion = CTF_PROCESS_LIST_VERSION_2_0; + break; + } break; } - break; - } - case OpData::Lut1DType: - { - auto lut = OCIO_DYNAMIC_POINTER_CAST(op); - switch (lut->getDirection()) + case OpData::Lut1DType: { - case TRANSFORM_DIR_FORWARD: - minVersion = (lut->getHueAdjust() != HUE_NONE) ? CTF_PROCESS_LIST_VERSION_1_4 : - CTF_PROCESS_LIST_VERSION_1_3; + auto lut = OCIO_DYNAMIC_POINTER_CAST(op); + switch (lut->getDirection()) + { + case TRANSFORM_DIR_FORWARD: + minVersion = (lut->getHueAdjust() != HUE_NONE) ? CTF_PROCESS_LIST_VERSION_1_4 + : CTF_PROCESS_LIST_VERSION_1_3; + break; + case TRANSFORM_DIR_INVERSE: + minVersion = (lut->getHueAdjust() != HUE_NONE || lut->isInputHalfDomain()) + ? CTF_PROCESS_LIST_VERSION_1_6 + : CTF_PROCESS_LIST_VERSION_1_3; + break; + } break; - case TRANSFORM_DIR_INVERSE: - minVersion = (lut->getHueAdjust() != HUE_NONE || lut->isInputHalfDomain()) ? - CTF_PROCESS_LIST_VERSION_1_6 : - CTF_PROCESS_LIST_VERSION_1_3; + } + case OpData::Lut3DType: + { + auto lut = OCIO_DYNAMIC_POINTER_CAST(op); + switch (lut->getDirection()) + { + case TRANSFORM_DIR_FORWARD: + minVersion = CTF_PROCESS_LIST_VERSION_1_3; + break; + case TRANSFORM_DIR_INVERSE: + minVersion = CTF_PROCESS_LIST_VERSION_1_6; + break; + } break; } - break; - } - case OpData::Lut3DType: - { - auto lut = OCIO_DYNAMIC_POINTER_CAST(op); - switch (lut->getDirection()) + case OpData::MatrixType: + case OpData::RangeType: { - case TRANSFORM_DIR_FORWARD: minVersion = CTF_PROCESS_LIST_VERSION_1_3; break; - case TRANSFORM_DIR_INVERSE: - minVersion = CTF_PROCESS_LIST_VERSION_1_6; + } + case OpData::ReferenceType: + { + throw Exception("Reference ops should have been replaced by their content."); + } + case OpData::NoOpType: + { + minVersion = CTF_PROCESS_LIST_VERSION_1_3; break; } - break; - } - case OpData::MatrixType: - case OpData::RangeType: - { - minVersion = CTF_PROCESS_LIST_VERSION_1_3; - break; - } - case OpData::ReferenceType: - { - throw Exception("Reference ops should have been replaced by their content."); - } - case OpData::NoOpType: - { - minVersion = CTF_PROCESS_LIST_VERSION_1_3; - break; - } } return minVersion; @@ -370,7 +367,9 @@ CTFVersion GetMinimumVersion(const ConstCTFReaderTransformPtr & transform) return minimumVersion; } -const char * GetFirstElementValue(const FormatMetadataImpl::Elements & elements, const std::string & name) +const char * GetFirstElementValue( + const FormatMetadataImpl::Elements & elements, + const std::string & name) { for (auto & it : elements) { @@ -382,7 +381,9 @@ const char * GetFirstElementValue(const FormatMetadataImpl::Elements & elements, return ""; } -const char * GetLastElementValue(const FormatMetadataImpl::Elements & elements, const std::string & name) +const char * GetLastElementValue( + const FormatMetadataImpl::Elements & elements, + const std::string & name) { for (auto it = elements.rbegin(); it != elements.rend(); ++it) { @@ -393,7 +394,7 @@ const char * GetLastElementValue(const FormatMetadataImpl::Elements & elements, } return ""; } -} +} // namespace // This method copies the metadata from the argument into the transform object. // Only attributes and elements that are expected parts of the CLF spec are @@ -412,13 +413,15 @@ const char * GetLastElementValue(const FormatMetadataImpl::Elements & elements, void CTFReaderTransform::fromMetadata(const FormatMetadataImpl & metadata) { // Name & id handled as attributes of the root metadata. - m_name = metadata.getAttributeValueString(METADATA_NAME); - m_id = metadata.getAttributeValueString(METADATA_ID); + m_name = metadata.getAttributeValueString(METADATA_NAME); + m_id = metadata.getAttributeValueString(METADATA_ID); m_inverseOfId = metadata.getAttributeValueString(ATTR_INVERSE_OF); // Preserve first InputDescriptor, last OutputDescriptor, and all Descriptions. - m_inDescriptor = GetFirstElementValue(metadata.getChildrenElements(), METADATA_INPUT_DESCRIPTOR); - m_outDescriptor = GetLastElementValue(metadata.getChildrenElements(), METADATA_OUTPUT_DESCRIPTOR); + m_inDescriptor + = GetFirstElementValue(metadata.getChildrenElements(), METADATA_INPUT_DESCRIPTOR); + m_outDescriptor + = GetLastElementValue(metadata.getChildrenElements(), METADATA_OUTPUT_DESCRIPTOR); GetElementsValues(metadata.getChildrenElements(), METADATA_DESCRIPTION, m_descriptions); // Combine all Info elements. @@ -441,14 +444,17 @@ void AddNonEmptyElement(FormatMetadataImpl & metadata, const char * name, const } } -void AddNonEmptyAttribute(FormatMetadataImpl & metadata, const char * name, const std::string & value) +void AddNonEmptyAttribute( + FormatMetadataImpl & metadata, + const char * name, + const std::string & value) { if (!value.empty()) { metadata.addAttribute(name, value.c_str()); } } -} +} // namespace void CTFReaderTransform::toMetadata(FormatMetadataImpl & metadata) const { @@ -464,19 +470,21 @@ void CTFReaderTransform::toMetadata(FormatMetadataImpl & metadata) const metadata.addChildElement(METADATA_DESCRIPTION, desc.c_str()); } const std::string infoValue(m_infoMetadata.getElementValue()); - if (m_infoMetadata.getNumAttributes() || m_infoMetadata.getNumChildrenElements() || - !infoValue.empty()) + if (m_infoMetadata.getNumAttributes() || m_infoMetadata.getNumChildrenElements() + || !infoValue.empty()) { metadata.getChildrenElements().push_back(m_infoMetadata); } } - /////////////////////////////////////////////////////////////////////////////// namespace { -void WriteDescriptions(XmlFormatter & fmt, const char * tag, const StringUtils::StringVec & descriptions) +void WriteDescriptions( + XmlFormatter & fmt, + const char * tag, + const StringUtils::StringVec & descriptions) { for (auto & it : descriptions) { @@ -485,7 +493,9 @@ void WriteDescriptions(XmlFormatter & fmt, const char * tag, const StringUtils:: } template -typename std::enable_if::value, void>::type WriteValue(T value, std::ostream& stream) +typename std::enable_if::value, void>::type WriteValue( + T value, + std::ostream & stream) { if (IsNan(value)) { @@ -495,8 +505,7 @@ typename std::enable_if::value, void>::type WriteValue { stream << "inf"; } - else if (std::is_signed::value && - value == -std::numeric_limits::infinity()) + else if (std::is_signed::value && value == -std::numeric_limits::infinity()) { stream << "-inf"; } @@ -507,33 +516,34 @@ typename std::enable_if::value, void>::type WriteValue } template -typename std::enable_if::value, void>::type WriteValue(T value, std::ostream& stream) +typename std::enable_if::value, void>::type WriteValue( + T value, + std::ostream & stream) { stream << value; } -template -void SetOStream(T, std::ostream & xml) +template void SetOStream(T, std::ostream & xml) { xml.width(11); xml.precision(8); } -template <> -void SetOStream(double, std::ostream & xml) +template <> void SetOStream(double, std::ostream & xml) { xml.width(19); xml.precision(DOUBLE_PRECISION); } -template -void WriteValues(XmlFormatter & formatter, - Iter valuesBegin, - Iter valuesEnd, - unsigned valuesPerLine, - BitDepth bitDepth, - unsigned iterStep, - scaleType scale) +template +void WriteValues( + XmlFormatter & formatter, + Iter valuesBegin, + Iter valuesEnd, + unsigned valuesPerLine, + BitDepth bitDepth, + unsigned iterStep, + scaleType scale) { // Method used to write an array of values of the same type. @@ -549,54 +559,54 @@ void WriteValues(XmlFormatter & formatter, switch (bitDepth) { - case BIT_DEPTH_UINT8: - { - oss.width(3); - break; - } - case BIT_DEPTH_UINT10: - { - oss.width(4); - break; - } + case BIT_DEPTH_UINT8: + { + oss.width(3); + break; + } + case BIT_DEPTH_UINT10: + { + oss.width(4); + break; + } - case BIT_DEPTH_UINT12: - { - oss.width(4); - break; - } + case BIT_DEPTH_UINT12: + { + oss.width(4); + break; + } - case BIT_DEPTH_UINT16: - { - oss.width(5); - break; - } + case BIT_DEPTH_UINT16: + { + oss.width(5); + break; + } - case BIT_DEPTH_F16: - { - oss.width(11); - oss.precision(5); - break; - } + case BIT_DEPTH_F16: + { + oss.width(11); + oss.precision(5); + break; + } - case BIT_DEPTH_F32: - { - SetOStream(*valuesBegin, oss); - break; - } + case BIT_DEPTH_F32: + { + SetOStream(*valuesBegin, oss); + break; + } - case BIT_DEPTH_UINT14: - case BIT_DEPTH_UINT32: - { - throw Exception("Unsupported bitdepth."); - break; - } + case BIT_DEPTH_UINT14: + case BIT_DEPTH_UINT32: + { + throw Exception("Unsupported bitdepth."); + break; + } - case BIT_DEPTH_UNKNOWN: - { - throw Exception("Unknown bitdepth."); - break; - } + case BIT_DEPTH_UNKNOWN: + { + throw Exception("Unknown bitdepth."); + break; + } } const bool floatValues = (bitDepth == BIT_DEPTH_F16) || (bitDepth == BIT_DEPTH_F32); @@ -618,7 +628,7 @@ void WriteValues(XmlFormatter & formatter, if (value.length() > (size_t)oss.width()) { // The imposed precision requires more characters so the code - // recomputes the width to better align the values for the next lines. + // recomputes the width to better align the values for the next lines. oss.width(value.length()); } @@ -643,9 +653,9 @@ void WriteValues(XmlFormatter & formatter, class OpWriter : public XmlElementWriter { public: - OpWriter() = delete; - OpWriter(const OpWriter&) = delete; - OpWriter& operator=(const OpWriter&) = delete; + OpWriter() = delete; + OpWriter(const OpWriter &) = delete; + OpWriter & operator=(const OpWriter &) = delete; explicit OpWriter(XmlFormatter & formatter); virtual ~OpWriter(); @@ -656,13 +666,13 @@ class OpWriter : public XmlElementWriter inline void setOutputBitdepth(BitDepth out) { m_outBitDepth = out; } protected: - virtual ConstOpDataRcPtr getOp() const = 0; + virtual ConstOpDataRcPtr getOp() const = 0; virtual const char * getTagName() const = 0; virtual void getAttributes(XmlFormatter::Attributes & attributes) const; virtual void writeContent() const = 0; virtual void writeFormatMetadata() const; - BitDepth m_inBitDepth = BIT_DEPTH_UNKNOWN; + BitDepth m_inBitDepth = BIT_DEPTH_UNKNOWN; BitDepth m_outBitDepth = BIT_DEPTH_UNKNOWN; }; @@ -680,7 +690,7 @@ void OpWriter::write() const XmlFormatter::Attributes attributes; getAttributes(attributes); - const char* tagName = getTagName(); + const char * tagName = getTagName(); m_formatter.writeStartTag(tagName, attributes); { XmlScopeIndent scopeIndent(m_formatter); @@ -703,19 +713,24 @@ void OpWriter::writeFormatMetadata() const { auto op = getOp(); StringUtils::StringVec desc; - GetElementsValues(op->getFormatMetadata().getChildrenElements(), - TAG_DESCRIPTION, desc); + GetElementsValues(op->getFormatMetadata().getChildrenElements(), TAG_DESCRIPTION, desc); WriteDescriptions(m_formatter, TAG_DESCRIPTION, desc); } const char * BitDepthToCLFString(BitDepth bitDepth) { - if (bitDepth == BIT_DEPTH_UINT8) return "8i"; - else if (bitDepth == BIT_DEPTH_UINT10) return "10i"; - else if (bitDepth == BIT_DEPTH_UINT12) return "12i"; - else if (bitDepth == BIT_DEPTH_UINT16) return "16i"; - else if (bitDepth == BIT_DEPTH_F16) return "16f"; - else if (bitDepth == BIT_DEPTH_F32) return "32f"; + if (bitDepth == BIT_DEPTH_UINT8) + return "8i"; + else if (bitDepth == BIT_DEPTH_UINT10) + return "10i"; + else if (bitDepth == BIT_DEPTH_UINT12) + return "12i"; + else if (bitDepth == BIT_DEPTH_UINT16) + return "16i"; + else if (bitDepth == BIT_DEPTH_F16) + return "16f"; + else if (bitDepth == BIT_DEPTH_F32) + return "32f"; throw Exception("Bitdepth has been validated before calling this."); } @@ -729,12 +744,8 @@ BitDepth GetValidatedFileBitDepth(BitDepth bd, OpData::Type type) { return BIT_DEPTH_F32; } - if ((bd == BIT_DEPTH_UINT8) || - (bd == BIT_DEPTH_UINT10) || - (bd == BIT_DEPTH_UINT12) || - (bd == BIT_DEPTH_UINT16) || - (bd == BIT_DEPTH_F16) || - (bd == BIT_DEPTH_F32)) + if ((bd == BIT_DEPTH_UINT8) || (bd == BIT_DEPTH_UINT10) || (bd == BIT_DEPTH_UINT12) + || (bd == BIT_DEPTH_UINT16) || (bd == BIT_DEPTH_F16) || (bd == BIT_DEPTH_F32)) { return bd; } @@ -748,26 +759,24 @@ BitDepth GetValidatedFileBitDepth(BitDepth bd, OpData::Type type) void OpWriter::getAttributes(XmlFormatter::Attributes & attributes) const { - auto op = getOp(); - const std::string& id = op->getID(); + auto op = getOp(); + const std::string & id = op->getID(); if (!id.empty()) { attributes.push_back(XmlFormatter::Attribute(ATTR_ID, id)); } - const std::string& name = op->getName(); + const std::string & name = op->getName(); if (!name.empty()) { attributes.push_back(XmlFormatter::Attribute(ATTR_NAME, name)); } - const char* inBitDepthName = BitDepthToCLFString(m_inBitDepth); - attributes.push_back(XmlFormatter::Attribute(ATTR_BITDEPTH_IN, - inBitDepthName)); + const char * inBitDepthName = BitDepthToCLFString(m_inBitDepth); + attributes.push_back(XmlFormatter::Attribute(ATTR_BITDEPTH_IN, inBitDepthName)); - const char* outBitDepthName = BitDepthToCLFString(m_outBitDepth); - attributes.push_back(XmlFormatter::Attribute(ATTR_BITDEPTH_OUT, - outBitDepthName)); + const char * outBitDepthName = BitDepthToCLFString(m_outBitDepth); + attributes.push_back(XmlFormatter::Attribute(ATTR_BITDEPTH_OUT, outBitDepthName)); /* TODO: bypass implementation if (op->getBypass()->getValue()) @@ -781,17 +790,16 @@ void OpWriter::getAttributes(XmlFormatter::Attributes & attributes) const class CDLWriter : public OpWriter { public: - CDLWriter() = delete; - CDLWriter(const CDLWriter&) = delete; - CDLWriter& operator=(const CDLWriter&) = delete; - CDLWriter(XmlFormatter & formatter, - ConstCDLOpDataRcPtr cdl); + CDLWriter() = delete; + CDLWriter(const CDLWriter &) = delete; + CDLWriter & operator=(const CDLWriter &) = delete; + CDLWriter(XmlFormatter & formatter, ConstCDLOpDataRcPtr cdl); virtual ~CDLWriter(); protected: ConstOpDataRcPtr getOp() const override; const char * getTagName() const override; - void getAttributes(XmlFormatter::Attributes& attributes) const override; + void getAttributes(XmlFormatter::Attributes & attributes) const override; void writeContent() const override; void writeFormatMetadata() const override; @@ -799,9 +807,7 @@ class CDLWriter : public OpWriter ConstCDLOpDataRcPtr m_cdl; }; - -CDLWriter::CDLWriter(XmlFormatter & formatter, - ConstCDLOpDataRcPtr cdl) +CDLWriter::CDLWriter(XmlFormatter & formatter, ConstCDLOpDataRcPtr cdl) : OpWriter(formatter) , m_cdl(cdl) { @@ -845,8 +851,10 @@ void CDLWriter::writeContent() const XmlScopeIndent scopeIndent(m_formatter); StringUtils::StringVec desc; - GetElementsValues(op->getFormatMetadata().getChildrenElements(), - METADATA_SOP_DESCRIPTION, desc); + GetElementsValues( + op->getFormatMetadata().getChildrenElements(), + METADATA_SOP_DESCRIPTION, + desc); WriteDescriptions(m_formatter, TAG_DESCRIPTION, desc); oss.str(""); @@ -872,8 +880,10 @@ void CDLWriter::writeContent() const XmlScopeIndent scopeIndent(m_formatter); StringUtils::StringVec desc; - GetElementsValues(op->getFormatMetadata().getChildrenElements(), - METADATA_SAT_DESCRIPTION, desc); + GetElementsValues( + op->getFormatMetadata().getChildrenElements(), + METADATA_SAT_DESCRIPTION, + desc); WriteDescriptions(m_formatter, TAG_DESCRIPTION, desc); oss.str(""); @@ -887,16 +897,19 @@ void CDLWriter::writeFormatMetadata() const { auto op = getOp(); StringUtils::StringVec desc; - GetElementsValues(op->getFormatMetadata().getChildrenElements(), - METADATA_DESCRIPTION, desc); + GetElementsValues(op->getFormatMetadata().getChildrenElements(), METADATA_DESCRIPTION, desc); WriteDescriptions(m_formatter, TAG_DESCRIPTION, desc); desc.clear(); - GetElementsValues(op->getFormatMetadata().getChildrenElements(), - METADATA_INPUT_DESCRIPTION, desc); + GetElementsValues( + op->getFormatMetadata().getChildrenElements(), + METADATA_INPUT_DESCRIPTION, + desc); WriteDescriptions(m_formatter, METADATA_INPUT_DESCRIPTION, desc); desc.clear(); - GetElementsValues(op->getFormatMetadata().getChildrenElements(), - METADATA_VIEWING_DESCRIPTION, desc); + GetElementsValues( + op->getFormatMetadata().getChildrenElements(), + METADATA_VIEWING_DESCRIPTION, + desc); WriteDescriptions(m_formatter, METADATA_VIEWING_DESCRIPTION, desc); } @@ -905,26 +918,25 @@ void CDLWriter::writeFormatMetadata() const class ExposureContrastWriter : public OpWriter { public: - ExposureContrastWriter() = delete; - ExposureContrastWriter(const ExposureContrastWriter&) = delete; - ExposureContrastWriter& operator=(const ExposureContrastWriter&) = delete; - ExposureContrastWriter(XmlFormatter & formatter, - ConstExposureContrastOpDataRcPtr ec); + ExposureContrastWriter() = delete; + ExposureContrastWriter(const ExposureContrastWriter &) = delete; + ExposureContrastWriter & operator=(const ExposureContrastWriter &) = delete; + ExposureContrastWriter(XmlFormatter & formatter, ConstExposureContrastOpDataRcPtr ec); virtual ~ExposureContrastWriter(); protected: ConstOpDataRcPtr getOp() const override; const char * getTagName() const override; - void getAttributes(XmlFormatter::Attributes& attributes) const override; + void getAttributes(XmlFormatter::Attributes & attributes) const override; void writeContent() const override; private: ConstExposureContrastOpDataRcPtr m_ec; }; - -ExposureContrastWriter::ExposureContrastWriter(XmlFormatter & formatter, - ConstExposureContrastOpDataRcPtr ec) +ExposureContrastWriter::ExposureContrastWriter( + XmlFormatter & formatter, + ConstExposureContrastOpDataRcPtr ec) : OpWriter(formatter) , m_ec(ec) { @@ -944,7 +956,7 @@ const char * ExposureContrastWriter::getTagName() const return TAG_EXPOSURE_CONTRAST; } -void ExposureContrastWriter::getAttributes(XmlFormatter::Attributes& attributes) const +void ExposureContrastWriter::getAttributes(XmlFormatter::Attributes & attributes) const { OpWriter::getAttributes(attributes); const std::string & style = ExposureContrastOpData::ConvertStyleToString(m_ec->getStyle()); @@ -1021,25 +1033,23 @@ void ExposureContrastWriter::writeContent() const class FixedFunctionWriter : public OpWriter { public: - FixedFunctionWriter() = delete; - FixedFunctionWriter(const FixedFunctionWriter&) = delete; - FixedFunctionWriter& operator=(const FixedFunctionWriter&) = delete; - FixedFunctionWriter(XmlFormatter & formatter, - ConstFixedFunctionOpDataRcPtr ff); + FixedFunctionWriter() = delete; + FixedFunctionWriter(const FixedFunctionWriter &) = delete; + FixedFunctionWriter & operator=(const FixedFunctionWriter &) = delete; + FixedFunctionWriter(XmlFormatter & formatter, ConstFixedFunctionOpDataRcPtr ff); virtual ~FixedFunctionWriter(); protected: ConstOpDataRcPtr getOp() const override; const char * getTagName() const override; - void getAttributes(XmlFormatter::Attributes& attributes) const override; + void getAttributes(XmlFormatter::Attributes & attributes) const override; void writeContent() const override; private: ConstFixedFunctionOpDataRcPtr m_ff; }; -FixedFunctionWriter::FixedFunctionWriter(XmlFormatter & formatter, - ConstFixedFunctionOpDataRcPtr ff) +FixedFunctionWriter::FixedFunctionWriter(XmlFormatter & formatter, ConstFixedFunctionOpDataRcPtr ff) : OpWriter(formatter) , m_ff(ff) { @@ -1059,7 +1069,7 @@ const char * FixedFunctionWriter::getTagName() const return TAG_FIXED_FUNCTION; } -void FixedFunctionWriter::getAttributes(XmlFormatter::Attributes& attributes) const +void FixedFunctionWriter::getAttributes(XmlFormatter::Attributes & attributes) const { OpWriter::getAttributes(attributes); const std::string style = FixedFunctionOpData::ConvertStyleToString(m_ff->getStyle(), false); @@ -1091,17 +1101,16 @@ void FixedFunctionWriter::writeContent() const class GammaWriter : public OpWriter { public: - GammaWriter() = delete; - GammaWriter(const GammaWriter&) = delete; - GammaWriter& operator=(const GammaWriter&) = delete; - GammaWriter(XmlFormatter & formatter, const CTFVersion & version, - ConstGammaOpDataRcPtr gamma); + GammaWriter() = delete; + GammaWriter(const GammaWriter &) = delete; + GammaWriter & operator=(const GammaWriter &) = delete; + GammaWriter(XmlFormatter & formatter, const CTFVersion & version, ConstGammaOpDataRcPtr gamma); virtual ~GammaWriter(); protected: ConstOpDataRcPtr getOp() const override; const char * getTagName() const override; - void getAttributes(XmlFormatter::Attributes& attributes) const override; + void getAttributes(XmlFormatter::Attributes & attributes) const override; void writeContent() const override; private: @@ -1109,9 +1118,10 @@ class GammaWriter : public OpWriter ConstGammaOpDataRcPtr m_gamma; }; - -GammaWriter::GammaWriter(XmlFormatter & formatter, const CTFVersion & version, - ConstGammaOpDataRcPtr gamma) +GammaWriter::GammaWriter( + XmlFormatter & formatter, + const CTFVersion & version, + ConstGammaOpDataRcPtr gamma) : OpWriter(formatter) , m_version(version) , m_gamma(gamma) @@ -1136,7 +1146,7 @@ const char * GammaWriter::getTagName() const return TAG_EXPONENT; } -void GammaWriter::getAttributes(XmlFormatter::Attributes& attributes) const +void GammaWriter::getAttributes(XmlFormatter::Attributes & attributes) const { OpWriter::getAttributes(attributes); const std::string & style = GammaOpData::ConvertStyleToString(m_gamma->getStyle()); @@ -1146,53 +1156,51 @@ void GammaWriter::getAttributes(XmlFormatter::Attributes& attributes) const namespace { // Add the attributes for the GammaParams element. -void AddGammaParams(XmlFormatter::Attributes & attributes, - const GammaOpData::Params & params, - const GammaOpData::Style style, - bool useGamma) +void AddGammaParams( + XmlFormatter::Attributes & attributes, + const GammaOpData::Params & params, + const GammaOpData::Style style, + bool useGamma) { std::stringstream oss; oss.precision(DOUBLE_PRECISION); oss << params[0]; - attributes.push_back(XmlFormatter::Attribute(useGamma ? ATTR_GAMMA : ATTR_EXPONENT, - oss.str())); + attributes.push_back(XmlFormatter::Attribute(useGamma ? ATTR_GAMMA : ATTR_EXPONENT, oss.str())); switch (style) { - case GammaOpData::MONCURVE_FWD: - case GammaOpData::MONCURVE_REV: - case GammaOpData::MONCURVE_MIRROR_FWD: - case GammaOpData::MONCURVE_MIRROR_REV: - { - oss.str(""); - oss << params[1]; - attributes.push_back(XmlFormatter::Attribute(ATTR_OFFSET, oss.str())); - break; - } - case GammaOpData::BASIC_FWD: - case GammaOpData::BASIC_REV: - case GammaOpData::BASIC_MIRROR_FWD: - case GammaOpData::BASIC_MIRROR_REV: - case GammaOpData::BASIC_PASS_THRU_FWD: - case GammaOpData::BASIC_PASS_THRU_REV: - break; + case GammaOpData::MONCURVE_FWD: + case GammaOpData::MONCURVE_REV: + case GammaOpData::MONCURVE_MIRROR_FWD: + case GammaOpData::MONCURVE_MIRROR_REV: + { + oss.str(""); + oss << params[1]; + attributes.push_back(XmlFormatter::Attribute(ATTR_OFFSET, oss.str())); + break; + } + case GammaOpData::BASIC_FWD: + case GammaOpData::BASIC_REV: + case GammaOpData::BASIC_MIRROR_FWD: + case GammaOpData::BASIC_MIRROR_REV: + case GammaOpData::BASIC_PASS_THRU_FWD: + case GammaOpData::BASIC_PASS_THRU_REV: + break; } } -} +} // namespace void GammaWriter::writeContent() const { - const bool useGamma{ m_version < CTF_PROCESS_LIST_VERSION_2_0 }; - const std::string paramsTag{ useGamma ? TAG_GAMMA_PARAMS : TAG_EXPONENT_PARAMS }; + const bool useGamma{m_version < CTF_PROCESS_LIST_VERSION_2_0}; + const std::string paramsTag{useGamma ? TAG_GAMMA_PARAMS : TAG_EXPONENT_PARAMS}; if (m_gamma->isNonChannelDependent()) { // RGB channels equal and A is identity, just write one element. XmlFormatter::Attributes attributes; - AddGammaParams(attributes, - m_gamma->getRedParams(), - m_gamma->getStyle(), useGamma); + AddGammaParams(attributes, m_gamma->getRedParams(), m_gamma->getStyle(), useGamma); m_formatter.writeEmptyTag(paramsTag, attributes); } @@ -1200,31 +1208,22 @@ void GammaWriter::writeContent() const { // Red. XmlFormatter::Attributes attributesR; - attributesR.push_back(XmlFormatter::Attribute(ATTR_CHAN, - "R")); - AddGammaParams(attributesR, - m_gamma->getRedParams(), - m_gamma->getStyle(), useGamma); + attributesR.push_back(XmlFormatter::Attribute(ATTR_CHAN, "R")); + AddGammaParams(attributesR, m_gamma->getRedParams(), m_gamma->getStyle(), useGamma); m_formatter.writeEmptyTag(paramsTag, attributesR); // Green. XmlFormatter::Attributes attributesG; - attributesG.push_back(XmlFormatter::Attribute(ATTR_CHAN, - "G")); - AddGammaParams(attributesG, - m_gamma->getGreenParams(), - m_gamma->getStyle(), useGamma); + attributesG.push_back(XmlFormatter::Attribute(ATTR_CHAN, "G")); + AddGammaParams(attributesG, m_gamma->getGreenParams(), m_gamma->getStyle(), useGamma); m_formatter.writeEmptyTag(paramsTag, attributesG); // Blue. XmlFormatter::Attributes attributesB; - attributesB.push_back(XmlFormatter::Attribute(ATTR_CHAN, - "B")); - AddGammaParams(attributesB, - m_gamma->getBlueParams(), - m_gamma->getStyle(), useGamma); + attributesB.push_back(XmlFormatter::Attribute(ATTR_CHAN, "B")); + AddGammaParams(attributesB, m_gamma->getBlueParams(), m_gamma->getStyle(), useGamma); m_formatter.writeEmptyTag(paramsTag, attributesB); @@ -1232,11 +1231,8 @@ void GammaWriter::writeContent() const { // Alpha XmlFormatter::Attributes attributesA; - attributesA.push_back(XmlFormatter::Attribute(ATTR_CHAN, - "A")); - AddGammaParams(attributesA, - m_gamma->getAlphaParams(), - m_gamma->getStyle(), useGamma); + attributesA.push_back(XmlFormatter::Attribute(ATTR_CHAN, "A")); + AddGammaParams(attributesA, m_gamma->getAlphaParams(), m_gamma->getStyle(), useGamma); m_formatter.writeEmptyTag(paramsTag, attributesA); } @@ -1248,9 +1244,9 @@ void GammaWriter::writeContent() const class GradingPrimaryWriter : public OpWriter { public: - GradingPrimaryWriter() = delete; - GradingPrimaryWriter(const GradingPrimaryWriter&) = delete; - GradingPrimaryWriter& operator=(const GradingPrimaryWriter&) = delete; + GradingPrimaryWriter() = delete; + GradingPrimaryWriter(const GradingPrimaryWriter &) = delete; + GradingPrimaryWriter & operator=(const GradingPrimaryWriter &) = delete; GradingPrimaryWriter(XmlFormatter & formatter, ConstGradingPrimaryOpDataRcPtr primary); virtual ~GradingPrimaryWriter(); @@ -1261,20 +1257,21 @@ class GradingPrimaryWriter : public OpWriter void writeContent() const override; private: - void writeRGBM(const char * tag, - const GradingRGBM & defaultVal, - const GradingRGBM & val) const; + void writeRGBM(const char * tag, const GradingRGBM & defaultVal, const GradingRGBM & val) const; void writeScalarElement(const char * tag, double defaultVal, double val) const; - void addAttribute(XmlFormatter::Attributes & attributes, const char * attr, - double val) const; - void addAttribute(XmlFormatter::Attributes & attributes, const char * attr, - double defaultVal, double val) const; + void addAttribute(XmlFormatter::Attributes & attributes, const char * attr, double val) const; + void addAttribute( + XmlFormatter::Attributes & attributes, + const char * attr, + double defaultVal, + double val) const; ConstGradingPrimaryOpDataRcPtr m_primary; }; -GradingPrimaryWriter::GradingPrimaryWriter(XmlFormatter & formatter, - ConstGradingPrimaryOpDataRcPtr primary) +GradingPrimaryWriter::GradingPrimaryWriter( + XmlFormatter & formatter, + ConstGradingPrimaryOpDataRcPtr primary) : OpWriter(formatter) , m_primary(primary) { @@ -1294,20 +1291,21 @@ const char * GradingPrimaryWriter::getTagName() const return TAG_PRIMARY; } -void GradingPrimaryWriter::getAttributes(XmlFormatter::Attributes& attributes) const +void GradingPrimaryWriter::getAttributes(XmlFormatter::Attributes & attributes) const { OpWriter::getAttributes(attributes); const auto style = m_primary->getStyle(); - const auto dir = m_primary->getDirection(); + const auto dir = m_primary->getDirection(); const auto styleStr = ConvertGradingStyleAndDirToString(style, dir); attributes.push_back(XmlFormatter::Attribute(ATTR_STYLE, styleStr)); } -void GradingPrimaryWriter::writeRGBM(const char * tag, - const GradingRGBM & defaultVal, - const GradingRGBM & val) const +void GradingPrimaryWriter::writeRGBM( + const char * tag, + const GradingRGBM & defaultVal, + const GradingRGBM & val) const { if (val != defaultVal) { @@ -1326,9 +1324,7 @@ void GradingPrimaryWriter::writeRGBM(const char * tag, } } -void GradingPrimaryWriter::writeScalarElement(const char * tag, - double defaultVal, - double val) const +void GradingPrimaryWriter::writeScalarElement(const char * tag, double defaultVal, double val) const { if (val != defaultVal) { @@ -1341,8 +1337,11 @@ void GradingPrimaryWriter::writeScalarElement(const char * tag, } } -void GradingPrimaryWriter::addAttribute(XmlFormatter::Attributes & attributes, const char * attr, - double defaultVal, double val) const +void GradingPrimaryWriter::addAttribute( + XmlFormatter::Attributes & attributes, + const char * attr, + double defaultVal, + double val) const { if (val != defaultVal) { @@ -1350,8 +1349,10 @@ void GradingPrimaryWriter::addAttribute(XmlFormatter::Attributes & attributes, c } } -void GradingPrimaryWriter::addAttribute(XmlFormatter::Attributes & attributes, const char * attr, - double val) const +void GradingPrimaryWriter::addAttribute( + XmlFormatter::Attributes & attributes, + const char * attr, + double val) const { std::stringstream master; master.precision(DOUBLE_PRECISION); @@ -1361,90 +1362,114 @@ void GradingPrimaryWriter::addAttribute(XmlFormatter::Attributes & attributes, c void GradingPrimaryWriter::writeContent() const { - const auto style = m_primary->getStyle(); + const auto style = m_primary->getStyle(); const auto & vals = m_primary->getValue(); switch (style) { - case GRADING_LOG: - { - GradingPrimary defaultVals(style); - writeRGBM(TAG_PRIMARY_BRIGHTNESS, defaultVals.m_brightness, vals.m_brightness); - writeRGBM(TAG_PRIMARY_CONTRAST, defaultVals.m_contrast, vals.m_contrast); - writeRGBM(TAG_PRIMARY_GAMMA, defaultVals.m_gamma, vals.m_gamma); + case GRADING_LOG: + { + GradingPrimary defaultVals(style); + writeRGBM(TAG_PRIMARY_BRIGHTNESS, defaultVals.m_brightness, vals.m_brightness); + writeRGBM(TAG_PRIMARY_CONTRAST, defaultVals.m_contrast, vals.m_contrast); + writeRGBM(TAG_PRIMARY_GAMMA, defaultVals.m_gamma, vals.m_gamma); - writeScalarElement(TAG_PRIMARY_SATURATION, defaultVals.m_saturation, vals.m_saturation); + writeScalarElement(TAG_PRIMARY_SATURATION, defaultVals.m_saturation, vals.m_saturation); - // Pivot. - { - XmlFormatter::Attributes attributes; - if (defaultVals.m_contrast != vals.m_contrast) + // Pivot. { - // Always write pivot contrast when constrast is not default. - addAttribute(attributes, ATTR_PRIMARY_CONTRAST, vals.m_pivot); - } - else - { - addAttribute(attributes, ATTR_PRIMARY_CONTRAST, defaultVals.m_pivot, vals.m_pivot); - } - addAttribute(attributes, ATTR_PRIMARY_BLACK, defaultVals.m_pivotBlack, vals.m_pivotBlack); - addAttribute(attributes, ATTR_PRIMARY_WHITE, defaultVals.m_pivotWhite, vals.m_pivotWhite); - if (!attributes.empty()) - { - m_formatter.writeEmptyTag(TAG_PRIMARY_PIVOT, attributes); + XmlFormatter::Attributes attributes; + if (defaultVals.m_contrast != vals.m_contrast) + { + // Always write pivot contrast when constrast is not default. + addAttribute(attributes, ATTR_PRIMARY_CONTRAST, vals.m_pivot); + } + else + { + addAttribute( + attributes, + ATTR_PRIMARY_CONTRAST, + defaultVals.m_pivot, + vals.m_pivot); + } + addAttribute( + attributes, + ATTR_PRIMARY_BLACK, + defaultVals.m_pivotBlack, + vals.m_pivotBlack); + addAttribute( + attributes, + ATTR_PRIMARY_WHITE, + defaultVals.m_pivotWhite, + vals.m_pivotWhite); + if (!attributes.empty()) + { + m_formatter.writeEmptyTag(TAG_PRIMARY_PIVOT, attributes); + } } + break; } - break; - } - case GRADING_LIN: - { - GradingPrimary defaultVals(style); - writeRGBM(TAG_PRIMARY_OFFSET, defaultVals.m_offset, vals.m_offset); - writeRGBM(TAG_PRIMARY_EXPOSURE, defaultVals.m_exposure, vals.m_exposure); - writeRGBM(TAG_PRIMARY_CONTRAST, defaultVals.m_contrast, vals.m_contrast); + case GRADING_LIN: + { + GradingPrimary defaultVals(style); + writeRGBM(TAG_PRIMARY_OFFSET, defaultVals.m_offset, vals.m_offset); + writeRGBM(TAG_PRIMARY_EXPOSURE, defaultVals.m_exposure, vals.m_exposure); + writeRGBM(TAG_PRIMARY_CONTRAST, defaultVals.m_contrast, vals.m_contrast); - writeScalarElement(TAG_PRIMARY_SATURATION, defaultVals.m_saturation, vals.m_saturation); + writeScalarElement(TAG_PRIMARY_SATURATION, defaultVals.m_saturation, vals.m_saturation); - // Pivot. - { - XmlFormatter::Attributes attributes; - if (defaultVals.m_contrast != vals.m_contrast) - { - // Always write pivot contrast when constrast is not default. - addAttribute(attributes, ATTR_PRIMARY_CONTRAST, vals.m_pivot); - } - else + // Pivot. { - addAttribute(attributes, ATTR_PRIMARY_CONTRAST, defaultVals.m_pivot, vals.m_pivot); - } - if (!attributes.empty()) - { - m_formatter.writeEmptyTag(TAG_PRIMARY_PIVOT, attributes); + XmlFormatter::Attributes attributes; + if (defaultVals.m_contrast != vals.m_contrast) + { + // Always write pivot contrast when constrast is not default. + addAttribute(attributes, ATTR_PRIMARY_CONTRAST, vals.m_pivot); + } + else + { + addAttribute( + attributes, + ATTR_PRIMARY_CONTRAST, + defaultVals.m_pivot, + vals.m_pivot); + } + if (!attributes.empty()) + { + m_formatter.writeEmptyTag(TAG_PRIMARY_PIVOT, attributes); + } } + break; } - break; - } - case GRADING_VIDEO: - { - GradingPrimary defaultVals(style); - writeRGBM(TAG_PRIMARY_LIFT, defaultVals.m_lift, vals.m_lift); - writeRGBM(TAG_PRIMARY_GAMMA, defaultVals.m_gamma, vals.m_gamma); - writeRGBM(TAG_PRIMARY_GAIN, defaultVals.m_gain, vals.m_gain); - writeRGBM(TAG_PRIMARY_OFFSET, defaultVals.m_offset, vals.m_offset); + case GRADING_VIDEO: + { + GradingPrimary defaultVals(style); + writeRGBM(TAG_PRIMARY_LIFT, defaultVals.m_lift, vals.m_lift); + writeRGBM(TAG_PRIMARY_GAMMA, defaultVals.m_gamma, vals.m_gamma); + writeRGBM(TAG_PRIMARY_GAIN, defaultVals.m_gain, vals.m_gain); + writeRGBM(TAG_PRIMARY_OFFSET, defaultVals.m_offset, vals.m_offset); - writeScalarElement(TAG_PRIMARY_SATURATION, defaultVals.m_saturation, vals.m_saturation); + writeScalarElement(TAG_PRIMARY_SATURATION, defaultVals.m_saturation, vals.m_saturation); - // Pivot. - { - XmlFormatter::Attributes attributes; - addAttribute(attributes, ATTR_PRIMARY_BLACK, defaultVals.m_pivotBlack, vals.m_pivotBlack); - addAttribute(attributes, ATTR_PRIMARY_WHITE, defaultVals.m_pivotWhite, vals.m_pivotWhite); - if (!attributes.empty()) + // Pivot. { - m_formatter.writeEmptyTag(TAG_PRIMARY_PIVOT, attributes); + XmlFormatter::Attributes attributes; + addAttribute( + attributes, + ATTR_PRIMARY_BLACK, + defaultVals.m_pivotBlack, + vals.m_pivotBlack); + addAttribute( + attributes, + ATTR_PRIMARY_WHITE, + defaultVals.m_pivotWhite, + vals.m_pivotWhite); + if (!attributes.empty()) + { + m_formatter.writeEmptyTag(TAG_PRIMARY_PIVOT, attributes); + } } + break; } - break; - } } // Clamp. { @@ -1470,9 +1495,9 @@ void GradingPrimaryWriter::writeContent() const class GradingRGBCurveWriter : public OpWriter { public: - GradingRGBCurveWriter() = delete; - GradingRGBCurveWriter(const GradingRGBCurveWriter&) = delete; - GradingRGBCurveWriter& operator=(const GradingRGBCurveWriter&) = delete; + GradingRGBCurveWriter() = delete; + GradingRGBCurveWriter(const GradingRGBCurveWriter &) = delete; + GradingRGBCurveWriter & operator=(const GradingRGBCurveWriter &) = delete; GradingRGBCurveWriter(XmlFormatter & formatter, ConstGradingRGBCurveOpDataRcPtr primary); virtual ~GradingRGBCurveWriter(); @@ -1487,8 +1512,9 @@ class GradingRGBCurveWriter : public OpWriter ConstGradingRGBCurveOpDataRcPtr m_curves; }; -GradingRGBCurveWriter::GradingRGBCurveWriter(XmlFormatter & formatter, - ConstGradingRGBCurveOpDataRcPtr curves) +GradingRGBCurveWriter::GradingRGBCurveWriter( + XmlFormatter & formatter, + ConstGradingRGBCurveOpDataRcPtr curves) : OpWriter(formatter) , m_curves(curves) { @@ -1508,12 +1534,12 @@ const char * GradingRGBCurveWriter::getTagName() const return TAG_RGB_CURVE; } -void GradingRGBCurveWriter::getAttributes(XmlFormatter::Attributes& attributes) const +void GradingRGBCurveWriter::getAttributes(XmlFormatter::Attributes & attributes) const { OpWriter::getAttributes(attributes); const auto style = m_curves->getStyle(); - const auto dir = m_curves->getDirection(); + const auto dir = m_curves->getDirection(); const auto styleStr = ConvertGradingStyleAndDirToString(style, dir); attributes.push_back(XmlFormatter::Attribute(ATTR_STYLE, styleStr)); @@ -1524,8 +1550,9 @@ void GradingRGBCurveWriter::getAttributes(XmlFormatter::Attributes& attributes) } } -void GradingRGBCurveWriter::writeCurve(const char * tag, - const ConstGradingBSplineCurveRcPtr & curve) const +void GradingRGBCurveWriter::writeCurve( + const char * tag, + const ConstGradingBSplineCurveRcPtr & curve) const { m_formatter.writeStartTag(tag, XmlFormatter::Attributes()); { @@ -1574,14 +1601,11 @@ void GradingRGBCurveWriter::writeContent() const { const auto & vals = m_curves->getValue(); - auto & defCurve = m_curves->getStyle() == GRADING_LIN ? GradingRGBCurveImpl::DefaultLin : - GradingRGBCurveImpl::Default; + auto & defCurve = m_curves->getStyle() == GRADING_LIN ? GradingRGBCurveImpl::DefaultLin + : GradingRGBCurveImpl::Default; - static const std::vector curveTags = { - TAG_RGB_CURVE_RED, - TAG_RGB_CURVE_GREEN, - TAG_RGB_CURVE_BLUE, - TAG_RGB_CURVE_MASTER }; + static const std::vector curveTags + = {TAG_RGB_CURVE_RED, TAG_RGB_CURVE_GREEN, TAG_RGB_CURVE_BLUE, TAG_RGB_CURVE_MASTER}; for (int c = 0; c < RGB_NUM_CURVES; ++c) { const auto & curve = vals->getCurve(static_cast(c)); @@ -1603,9 +1627,9 @@ void GradingRGBCurveWriter::writeContent() const class GradingToneWriter : public OpWriter { public: - GradingToneWriter() = delete; - GradingToneWriter(const GradingToneWriter&) = delete; - GradingToneWriter& operator=(const GradingToneWriter&) = delete; + GradingToneWriter() = delete; + GradingToneWriter(const GradingToneWriter &) = delete; + GradingToneWriter & operator=(const GradingToneWriter &) = delete; GradingToneWriter(XmlFormatter & formatter, ConstGradingToneOpDataRcPtr tone); virtual ~GradingToneWriter(); @@ -1616,17 +1640,18 @@ class GradingToneWriter : public OpWriter void writeContent() const override; private: - void writeRGBMSW(const char * tag, - const GradingRGBMSW & defaultVal, - const GradingRGBMSW & val, - bool center, bool pivot) const; + void writeRGBMSW( + const char * tag, + const GradingRGBMSW & defaultVal, + const GradingRGBMSW & val, + bool center, + bool pivot) const; void writeScalarElement(const char * tag, double defaultVal, double val) const; ConstGradingToneOpDataRcPtr m_tone; }; -GradingToneWriter::GradingToneWriter(XmlFormatter & formatter, - ConstGradingToneOpDataRcPtr tone) +GradingToneWriter::GradingToneWriter(XmlFormatter & formatter, ConstGradingToneOpDataRcPtr tone) : OpWriter(formatter) , m_tone(tone) { @@ -1646,21 +1671,23 @@ const char * GradingToneWriter::getTagName() const return TAG_TONE; } -void GradingToneWriter::getAttributes(XmlFormatter::Attributes& attributes) const +void GradingToneWriter::getAttributes(XmlFormatter::Attributes & attributes) const { OpWriter::getAttributes(attributes); const auto style = m_tone->getStyle(); - const auto dir = m_tone->getDirection(); + const auto dir = m_tone->getDirection(); const auto styleStr = ConvertGradingStyleAndDirToString(style, dir); attributes.push_back(XmlFormatter::Attribute(ATTR_STYLE, styleStr)); } -void GradingToneWriter::writeRGBMSW(const char * tag, - const GradingRGBMSW & defaultVal, - const GradingRGBMSW & val, - bool center, bool pivot) const +void GradingToneWriter::writeRGBMSW( + const char * tag, + const GradingRGBMSW & defaultVal, + const GradingRGBMSW & val, + bool center, + bool pivot) const { if (val != defaultVal) { @@ -1677,20 +1704,17 @@ void GradingToneWriter::writeRGBMSW(const char * tag, oss.str(""); oss << val.m_start; - attributes.push_back(XmlFormatter::Attribute(center ? ATTR_CENTER : ATTR_START, - oss.str())); + attributes.push_back(XmlFormatter::Attribute(center ? ATTR_CENTER : ATTR_START, oss.str())); oss.str(""); oss << val.m_width; - attributes.push_back(XmlFormatter::Attribute(pivot ? ATTR_PIVOT : ATTR_WIDTH, - oss.str())); + attributes.push_back(XmlFormatter::Attribute(pivot ? ATTR_PIVOT : ATTR_WIDTH, oss.str())); m_formatter.writeEmptyTag(tag, attributes); } } -void GradingToneWriter::writeScalarElement(const char * tag, - double defaultVal, double val) const +void GradingToneWriter::writeScalarElement(const char * tag, double defaultVal, double val) const { if (val != defaultVal) { @@ -1728,25 +1752,23 @@ void GradingToneWriter::writeContent() const class LogWriter : public OpWriter { public: - LogWriter() = delete; - LogWriter(const LogWriter&) = delete; - LogWriter& operator=(const LogWriter&) = delete; - LogWriter(XmlFormatter & formatter, - ConstLogOpDataRcPtr log); + LogWriter() = delete; + LogWriter(const LogWriter &) = delete; + LogWriter & operator=(const LogWriter &) = delete; + LogWriter(XmlFormatter & formatter, ConstLogOpDataRcPtr log); virtual ~LogWriter(); protected: ConstOpDataRcPtr getOp() const override; const char * getTagName() const override; - void getAttributes(XmlFormatter::Attributes& attributes) const override; + void getAttributes(XmlFormatter::Attributes & attributes) const override; void writeContent() const override; private: ConstLogOpDataRcPtr m_log; }; -LogWriter::LogWriter(XmlFormatter & formatter, - ConstLogOpDataRcPtr log) +LogWriter::LogWriter(XmlFormatter & formatter, ConstLogOpDataRcPtr log) : OpWriter(formatter) , m_log(log) { @@ -1766,7 +1788,7 @@ const char * LogWriter::getTagName() const return TAG_LOG; } -void LogWriter::getAttributes(XmlFormatter::Attributes& attributes) const +void LogWriter::getAttributes(XmlFormatter::Attributes & attributes) const { OpWriter::getAttributes(attributes); @@ -1782,8 +1804,8 @@ void LogWriter::getAttributes(XmlFormatter::Attributes& attributes) const } else if (m_log->isCamera()) { - style = dir == TRANSFORM_DIR_FORWARD ? LogUtil::CAMERA_LIN_TO_LOG_STR : - LogUtil::CAMERA_LOG_TO_LIN_STR; + style = dir == TRANSFORM_DIR_FORWARD ? LogUtil::CAMERA_LIN_TO_LOG_STR + : LogUtil::CAMERA_LOG_TO_LIN_STR; } else { @@ -1793,12 +1815,9 @@ void LogWriter::getAttributes(XmlFormatter::Attributes& attributes) const attributes.push_back(XmlFormatter::Attribute(ATTR_STYLE, style)); } - namespace { -void AddLogParam(XmlFormatter::Attributes & attributes, - const char * attrName, - double attrValue) +void AddLogParam(XmlFormatter::Attributes & attributes, const char * attrName, double attrValue) { std::stringstream stream; stream.precision(DOUBLE_PRECISION); @@ -1806,8 +1825,10 @@ void AddLogParam(XmlFormatter::Attributes & attributes, attributes.push_back(XmlFormatter::Attribute(attrName, stream.str())); } -void AddLogParams(XmlFormatter::Attributes & attributes, - const LogOpData::Params & params, const double base) +void AddLogParams( + XmlFormatter::Attributes & attributes, + const LogOpData::Params & params, + const double base) { // LogOpData::validate ensure that params size is between 4 & 6. AddLogParam(attributes, ATTR_BASE, base); @@ -1824,7 +1845,7 @@ void AddLogParams(XmlFormatter::Attributes & attributes, AddLogParam(attributes, ATTR_LINEARSLOPE, params[LINEAR_SLOPE]); } } -} +} // namespace void LogWriter::writeContent() const { @@ -1868,31 +1889,28 @@ void LogWriter::writeContent() const } } - /////////////////////////////////////////////////////////////////////////////// class Lut1DWriter : public OpWriter { public: - Lut1DWriter() = delete; - Lut1DWriter(const Lut1DWriter&) = delete; - Lut1DWriter& operator=(const Lut1DWriter&) = delete; - Lut1DWriter(XmlFormatter & formatter, - ConstLut1DOpDataRcPtr lut); + Lut1DWriter() = delete; + Lut1DWriter(const Lut1DWriter &) = delete; + Lut1DWriter & operator=(const Lut1DWriter &) = delete; + Lut1DWriter(XmlFormatter & formatter, ConstLut1DOpDataRcPtr lut); virtual ~Lut1DWriter(); protected: ConstOpDataRcPtr getOp() const override; const char * getTagName() const override; - void getAttributes(XmlFormatter::Attributes& attributes) const override; + void getAttributes(XmlFormatter::Attributes & attributes) const override; void writeContent() const override; private: ConstLut1DOpDataRcPtr m_lut; }; -Lut1DWriter::Lut1DWriter(XmlFormatter & formatter, - ConstLut1DOpDataRcPtr lut) +Lut1DWriter::Lut1DWriter(XmlFormatter & formatter, ConstLut1DOpDataRcPtr lut) : OpWriter(formatter) , m_lut(lut) { @@ -1928,7 +1946,7 @@ void Lut1DWriter::getAttributes(XmlFormatter::Attributes & attributes) const // some clients may want to lock down that behavior). INTERP_DEFAULT // means "do not write the attribute". const Interpolation interpolation = m_lut->getInterpolation(); - const char * interpolationName = GetInterpolation1DName(interpolation); + const char * interpolationName = GetInterpolation1DName(interpolation); if (interpolationName && *interpolationName) { attributes.push_back(XmlFormatter::Attribute(ATTR_INTERPOLATION, interpolationName)); @@ -1959,12 +1977,10 @@ void Lut1DWriter::writeContent() const const Array & array = m_lut->getArray(); std::stringstream dimension; - dimension << array.getLength() << " " - << array.getNumColorComponents(); + dimension << array.getLength() << " " << array.getNumColorComponents(); XmlFormatter::Attributes attributes; - attributes.push_back(XmlFormatter::Attribute(ATTR_DIMENSION, - dimension.str())); + attributes.push_back(XmlFormatter::Attribute(ATTR_DIMENSION, dimension.str())); m_formatter.writeStartTag(TAG_ARRAY, attributes); @@ -1979,30 +1995,32 @@ void Lut1DWriter::writeContent() const const size_t maxValues = array.getNumValues(); values.resize(maxValues); - for (size_t i = 0; igetInterpolation(); + Interpolation interpolation = m_lut->getInterpolation(); const char * interpolationName = GetInterpolation3DName(interpolation); // Please see comment in Lut1DWriter. @@ -2081,27 +2097,25 @@ void Lut3DWriter::writeContent() const const Array & array = m_lut->getArray(); std::stringstream dimension; - dimension << array.getLength() << " " - << array.getLength() << " " - << array.getLength() << " " + dimension << array.getLength() << " " << array.getLength() << " " << array.getLength() << " " << array.getNumColorComponents(); XmlFormatter::Attributes attributes; - attributes.push_back(XmlFormatter::Attribute(ATTR_DIMENSION, - dimension.str())); + attributes.push_back(XmlFormatter::Attribute(ATTR_DIMENSION, dimension.str())); m_formatter.writeStartTag(TAG_ARRAY, attributes); // To avoid needing to duplicate the const objects, // we scale the values on-the-fly while writing. const float scale = (float)GetBitDepthMaxValue(m_outBitDepth); - WriteValues(m_formatter, - array.getValues().begin(), - array.getValues().end(), - 3, - m_outBitDepth, - 1, - scale); + WriteValues( + m_formatter, + array.getValues().begin(), + array.getValues().end(), + 3, + m_outBitDepth, + 1, + scale); m_formatter.writeEndTag(TAG_ARRAY); } @@ -2111,11 +2125,13 @@ void Lut3DWriter::writeContent() const class MatrixWriter : public OpWriter { public: - MatrixWriter() = delete; - MatrixWriter(const MatrixWriter&) = delete; - MatrixWriter& operator=(const MatrixWriter&) = delete; - MatrixWriter(XmlFormatter & formatter, const CTFVersion & version, - ConstMatrixOpDataRcPtr matrix); + MatrixWriter() = delete; + MatrixWriter(const MatrixWriter &) = delete; + MatrixWriter & operator=(const MatrixWriter &) = delete; + MatrixWriter( + XmlFormatter & formatter, + const CTFVersion & version, + ConstMatrixOpDataRcPtr matrix); virtual ~MatrixWriter(); protected: @@ -2128,8 +2144,10 @@ class MatrixWriter : public OpWriter ConstMatrixOpDataRcPtr m_matrix; }; -MatrixWriter::MatrixWriter(XmlFormatter & formatter, const CTFVersion & version, - ConstMatrixOpDataRcPtr matrix) +MatrixWriter::MatrixWriter( + XmlFormatter & formatter, + const CTFVersion & version, + ConstMatrixOpDataRcPtr matrix) : OpWriter(formatter) , m_version(version) , m_matrix(matrix) @@ -2158,7 +2176,7 @@ void MatrixWriter::writeContent() const // 3) 3x4x3, matrix only with offsets and no alpha. // 4) 3x3x3, matrix with no alpha and no offsets. - const bool saveDim3{ m_version < CTF_PROCESS_LIST_VERSION_2_0 }; + const bool saveDim3{m_version < CTF_PROCESS_LIST_VERSION_2_0}; auto matrix = m_matrix; if (matrix->getDirection() == TRANSFORM_DIR_INVERSE) @@ -2188,15 +2206,14 @@ void MatrixWriter::writeContent() const } XmlFormatter::Attributes attributes; - attributes.push_back(XmlFormatter::Attribute(ATTR_DIMENSION, - dimensionAttr.str())); + attributes.push_back(XmlFormatter::Attribute(ATTR_DIMENSION, dimensionAttr.str())); m_formatter.writeStartTag(TAG_ARRAY, attributes); - const ArrayDouble::Values & values = matrix->getArray().getValues(); + const ArrayDouble::Values & values = matrix->getArray().getValues(); const MatrixOpData::Offsets & offsets = matrix->getOffsets(); - const double outScale = GetBitDepthMaxValue(m_outBitDepth); + const double outScale = GetBitDepthMaxValue(m_outBitDepth); const double inOutScale = outScale / GetBitDepthMaxValue(m_inBitDepth); if (matrix->hasAlpha()) @@ -2204,19 +2221,22 @@ void MatrixWriter::writeContent() const if (matrix->hasOffsets()) { // Write in 4x5x4 mode. - const double v[20] - { - values[0] * inOutScale, values[1] * inOutScale, values[2] * inOutScale, values[3] * inOutScale, offsets[0] * outScale, - values[4] * inOutScale, values[5] * inOutScale, values[6] * inOutScale, values[7] * inOutScale, offsets[1] * outScale, - values[8] * inOutScale, values[9] * inOutScale, values[10] * inOutScale, values[11] * inOutScale, offsets[2] * outScale, - values[12] * inOutScale, values[13]* inOutScale, values[14] * inOutScale, values[15] * inOutScale, offsets[3] * outScale - }; + const double v[20]{ + values[0] * inOutScale, values[1] * inOutScale, values[2] * inOutScale, + values[3] * inOutScale, offsets[0] * outScale, values[4] * inOutScale, + values[5] * inOutScale, values[6] * inOutScale, values[7] * inOutScale, + offsets[1] * outScale, values[8] * inOutScale, values[9] * inOutScale, + values[10] * inOutScale, values[11] * inOutScale, offsets[2] * outScale, + values[12] * inOutScale, values[13] * inOutScale, values[14] * inOutScale, + values[15] * inOutScale, offsets[3] * outScale}; + // clang-format on WriteValues(m_formatter, v, v + 20, 5, BIT_DEPTH_F32, 1, 1.0); } else { // Write in 4x4x4 compact mode. + // clang-format off const double v[16] { values[0] * inOutScale, values[1] * inOutScale, values[2] * inOutScale, values[3] * inOutScale, @@ -2224,6 +2244,7 @@ void MatrixWriter::writeContent() const values[8] * inOutScale, values[9] * inOutScale, values[10] * inOutScale, values[11] * inOutScale, values[12] * inOutScale, values[13] * inOutScale, values[14] * inOutScale, values[15] * inOutScale }; + // clang-format on WriteValues(m_formatter, v, v + 16, 4, BIT_DEPTH_F32, 1, 1.0); } @@ -2231,24 +2252,28 @@ void MatrixWriter::writeContent() const else if (matrix->hasOffsets()) { // Write in 3x4x3 compact mode. + // clang-format off const double v[12] { values[0] * inOutScale, values[1] * inOutScale, values[2] * inOutScale, offsets[0] * outScale, values[4] * inOutScale, values[5] * inOutScale, values[6] * inOutScale, offsets[1] * outScale, values[8] * inOutScale, values[9] * inOutScale, values[10] * inOutScale, offsets[2] * outScale }; + // clang-format on WriteValues(m_formatter, v, v + 12, 4, BIT_DEPTH_F32, 1, 1.0); } else { // Write in 3x3x3 compact mode. + // clang-format off const double v[9] { values[0] * inOutScale, values[1] * inOutScale, values[2] * inOutScale, values[4] * inOutScale, values[5] * inOutScale, values[6] * inOutScale, values[8] * inOutScale, values[9] * inOutScale, values[10] * inOutScale }; + // clang-format on WriteValues(m_formatter, v, v + 9, 3, BIT_DEPTH_F32, 1, 1.0); } @@ -2261,11 +2286,10 @@ void MatrixWriter::writeContent() const class RangeWriter : public OpWriter { public: - RangeWriter() = delete; - RangeWriter(const RangeWriter&) = delete; - RangeWriter& operator=(const RangeWriter&) = delete; - RangeWriter(XmlFormatter & formatter, - ConstRangeOpDataRcPtr range); + RangeWriter() = delete; + RangeWriter(const RangeWriter &) = delete; + RangeWriter & operator=(const RangeWriter &) = delete; + RangeWriter(XmlFormatter & formatter, ConstRangeOpDataRcPtr range); virtual ~RangeWriter(); protected: @@ -2277,8 +2301,7 @@ class RangeWriter : public OpWriter ConstRangeOpDataRcPtr m_range; }; -RangeWriter::RangeWriter(XmlFormatter & formatter, - ConstRangeOpDataRcPtr range) +RangeWriter::RangeWriter(XmlFormatter & formatter, ConstRangeOpDataRcPtr range) : OpWriter(formatter) , m_range(range) { @@ -2315,7 +2338,7 @@ void RangeWriter::writeContent() const } const double outScale = GetBitDepthMaxValue(m_outBitDepth); - const double inScale = GetBitDepthMaxValue(m_inBitDepth); + const double inScale = GetBitDepthMaxValue(m_inBitDepth); if (!range->minIsEmpty()) { @@ -2342,9 +2365,10 @@ void RangeWriter::writeContent() const /////////////////////////////////////////////////////////////////////////////// -TransformWriter::TransformWriter(XmlFormatter & formatter, - ConstCTFReaderTransformPtr transform, - bool isCLF) +TransformWriter::TransformWriter( + XmlFormatter & formatter, + ConstCTFReaderTransformPtr transform, + bool isCLF) : XmlElementWriter(formatter) , m_transform(transform) , m_isCLF(isCLF) @@ -2361,25 +2385,21 @@ void TransformWriter::write() const XmlFormatter::Attributes attributes; - CTFVersion writeVersion{ CTF_PROCESS_LIST_VERSION_2_0 }; - + CTFVersion writeVersion{CTF_PROCESS_LIST_VERSION_2_0}; + std::ostringstream fversion; if (m_isCLF) { // Save with CLF version 3. fversion << 3; - attributes.push_back(XmlFormatter::Attribute(ATTR_COMP_CLF_VERSION, - fversion.str())); - + attributes.push_back(XmlFormatter::Attribute(ATTR_COMP_CLF_VERSION, fversion.str())); } else { writeVersion = GetMinimumVersion(m_transform); fversion << writeVersion; - attributes.push_back(XmlFormatter::Attribute(ATTR_VERSION, - fversion.str())); - + attributes.push_back(XmlFormatter::Attribute(ATTR_VERSION, fversion.str())); } std::string id = m_transform->getID(); @@ -2395,7 +2415,7 @@ void TransformWriter::write() const } attributes.push_back(XmlFormatter::Attribute(ATTR_ID, id)); - const std::string& name = m_transform->getName(); + const std::string & name = m_transform->getName(); if (!name.empty()) { attributes.push_back(XmlFormatter::Attribute(ATTR_NAME, name)); @@ -2436,21 +2456,20 @@ void TransformWriter::write() const m_formatter.writeEndTag(processListTag); } -void TransformWriter::writeProcessListMetadata(const FormatMetadataImpl& m) const +void TransformWriter::writeProcessListMetadata(const FormatMetadataImpl & m) const { if (m.getChildrenElements().size() == 0) { const std::string infoValue(m.getElementValue()); if (m.getNumAttributes() || !infoValue.empty()) { - m_formatter.writeContentTag(m.getElementName(), m.getAttributes(), - m.getElementValue()); + m_formatter.writeContentTag(m.getElementName(), m.getAttributes(), m.getElementValue()); } } else { m_formatter.writeStartTag(m.getElementName(), m.getAttributes()); - const std::string value{ m.getElementValue() }; + const std::string value{m.getElementValue()}; if (!value.empty()) { m_formatter.writeContent(m.getElementValue()); @@ -2472,7 +2491,8 @@ namespace void ThrowWriteOp(const std::string & type) { std::ostringstream oss; - oss << "Transform uses the '" << type << "' op which cannot be written " + oss << "Transform uses the '" << type + << "' op which cannot be written " "as CLF. Use CTF format or Bake the transform."; throw Exception(oss.str().c_str()); } @@ -2482,28 +2502,28 @@ BitDepth GetInputFileBD(ConstOpDataRcPtr op) const auto type = op->getType(); if (type == OpData::MatrixType) { - auto mat = OCIO_DYNAMIC_POINTER_CAST(op); + auto mat = OCIO_DYNAMIC_POINTER_CAST(op); const auto bd = mat->getFileInputBitDepth(); return GetValidatedFileBitDepth(bd, type); } else if (type == OpData::RangeType) { - auto range = OCIO_DYNAMIC_POINTER_CAST(op); + auto range = OCIO_DYNAMIC_POINTER_CAST(op); const auto bd = range->getFileInputBitDepth(); return GetValidatedFileBitDepth(bd, type); } return BIT_DEPTH_F32; } -} +} // namespace void TransformWriter::writeOps(const CTFVersion & version) const { - BitDepth inBD = BIT_DEPTH_F32; + BitDepth inBD = BIT_DEPTH_F32; BitDepth outBD = BIT_DEPTH_F32; - auto & ops = m_transform->getOps(); - size_t numOps = ops.size(); + auto & ops = m_transform->getOps(); + size_t numOps = ops.size(); size_t numSavedOps = 0; if (numOps) { @@ -2529,231 +2549,234 @@ void TransformWriter::writeOps(const CTFVersion & version) const switch (type) { - case OpData::CDLType: - { - auto cdl = OCIO_DYNAMIC_POINTER_CAST(op); - CDLWriter opWriter(m_formatter, cdl); - opWriter.setInputBitdepth(inBD); - opWriter.setOutputBitdepth(outBD); - opWriter.write(); - break; - } - case OpData::ExponentType: - { - auto exp = OCIO_DYNAMIC_POINTER_CAST(op); - - GammaOpData::Params paramR{ exp->m_exp4[0] }; - GammaOpData::Params paramG{ exp->m_exp4[1] }; - GammaOpData::Params paramB{ exp->m_exp4[2] }; - GammaOpData::Params paramA{ exp->m_exp4[3] }; - - GammaOpDataRcPtr gammaData - = std::make_shared(GammaOpData::BASIC_FWD, - paramR, paramG, paramB, paramA); - gammaData->getFormatMetadata() = exp->getFormatMetadata(); - - if (m_isCLF && !gammaData->isAlphaComponentIdentity()) + case OpData::CDLType: { - ThrowWriteOp("Exponent with alpha"); + auto cdl = OCIO_DYNAMIC_POINTER_CAST(op); + CDLWriter opWriter(m_formatter, cdl); + opWriter.setInputBitdepth(inBD); + opWriter.setOutputBitdepth(outBD); + opWriter.write(); + break; } - - GammaWriter opWriter(m_formatter, version, gammaData); - opWriter.setInputBitdepth(inBD); - opWriter.setOutputBitdepth(outBD); - opWriter.write(); - break; - } - case OpData::ExposureContrastType: - { - if (m_isCLF) + case OpData::ExponentType: { - ThrowWriteOp("ExposureContrast"); - } + auto exp = OCIO_DYNAMIC_POINTER_CAST(op); + + GammaOpData::Params paramR{exp->m_exp4[0]}; + GammaOpData::Params paramG{exp->m_exp4[1]}; + GammaOpData::Params paramB{exp->m_exp4[2]}; + GammaOpData::Params paramA{exp->m_exp4[3]}; + + GammaOpDataRcPtr gammaData = std::make_shared( + GammaOpData::BASIC_FWD, + paramR, + paramG, + paramB, + paramA); + gammaData->getFormatMetadata() = exp->getFormatMetadata(); + + if (m_isCLF && !gammaData->isAlphaComponentIdentity()) + { + ThrowWriteOp("Exponent with alpha"); + } - auto ec = OCIO_DYNAMIC_POINTER_CAST(op); - ExposureContrastWriter opWriter(m_formatter, ec); - opWriter.setInputBitdepth(inBD); - opWriter.setOutputBitdepth(outBD); - opWriter.write(); - break; - } - case OpData::FixedFunctionType: - { - if (m_isCLF) - { - ThrowWriteOp("FixedFunction"); + GammaWriter opWriter(m_formatter, version, gammaData); + opWriter.setInputBitdepth(inBD); + opWriter.setOutputBitdepth(outBD); + opWriter.write(); + break; } - - auto ff = OCIO_DYNAMIC_POINTER_CAST(op); - FixedFunctionWriter opWriter(m_formatter, ff); - opWriter.setInputBitdepth(inBD); - opWriter.setOutputBitdepth(outBD); - opWriter.write(); - break; - } - case OpData::GammaType: - { - auto gamma = OCIO_DYNAMIC_POINTER_CAST(op); - if (m_isCLF) + case OpData::ExposureContrastType: { - if (!gamma->isAlphaComponentIdentity()) + if (m_isCLF) { - ThrowWriteOp("Gamma with alpha component"); + ThrowWriteOp("ExposureContrast"); } + + auto ec = OCIO_DYNAMIC_POINTER_CAST(op); + ExposureContrastWriter opWriter(m_formatter, ec); + opWriter.setInputBitdepth(inBD); + opWriter.setOutputBitdepth(outBD); + opWriter.write(); + break; } + case OpData::FixedFunctionType: + { + if (m_isCLF) + { + ThrowWriteOp("FixedFunction"); + } - GammaWriter opWriter(m_formatter, version, gamma); - opWriter.setInputBitdepth(inBD); - opWriter.setOutputBitdepth(outBD); - opWriter.write(); - break; - } - case OpData::GradingPrimaryType: - { - if (m_isCLF) + auto ff = OCIO_DYNAMIC_POINTER_CAST(op); + FixedFunctionWriter opWriter(m_formatter, ff); + opWriter.setInputBitdepth(inBD); + opWriter.setOutputBitdepth(outBD); + opWriter.write(); + break; + } + case OpData::GammaType: { - ThrowWriteOp("GradingPrimary"); + auto gamma = OCIO_DYNAMIC_POINTER_CAST(op); + if (m_isCLF) + { + if (!gamma->isAlphaComponentIdentity()) + { + ThrowWriteOp("Gamma with alpha component"); + } + } + + GammaWriter opWriter(m_formatter, version, gamma); + opWriter.setInputBitdepth(inBD); + opWriter.setOutputBitdepth(outBD); + opWriter.write(); + break; } + case OpData::GradingPrimaryType: + { + if (m_isCLF) + { + ThrowWriteOp("GradingPrimary"); + } - auto prim = OCIO_DYNAMIC_POINTER_CAST(op); - GradingPrimaryWriter opWriter(m_formatter, prim); - opWriter.setInputBitdepth(inBD); - opWriter.setOutputBitdepth(outBD); - opWriter.write(); - break; - } - case OpData::GradingRGBCurveType: - { - if (m_isCLF) + auto prim = OCIO_DYNAMIC_POINTER_CAST(op); + GradingPrimaryWriter opWriter(m_formatter, prim); + opWriter.setInputBitdepth(inBD); + opWriter.setOutputBitdepth(outBD); + opWriter.write(); + break; + } + case OpData::GradingRGBCurveType: { - ThrowWriteOp("GradingRGBCurve"); + if (m_isCLF) + { + ThrowWriteOp("GradingRGBCurve"); + } + + auto rgb = OCIO_DYNAMIC_POINTER_CAST(op); + GradingRGBCurveWriter opWriter(m_formatter, rgb); + opWriter.setInputBitdepth(inBD); + opWriter.setOutputBitdepth(outBD); + opWriter.write(); + break; } + case OpData::GradingToneType: + { + if (m_isCLF) + { + ThrowWriteOp("GradingTone"); + } - auto rgb = OCIO_DYNAMIC_POINTER_CAST(op); - GradingRGBCurveWriter opWriter(m_formatter, rgb); - opWriter.setInputBitdepth(inBD); - opWriter.setOutputBitdepth(outBD); - opWriter.write(); - break; - } - case OpData::GradingToneType: - { - if (m_isCLF) + auto tone = OCIO_DYNAMIC_POINTER_CAST(op); + GradingToneWriter opWriter(m_formatter, tone); + opWriter.setInputBitdepth(inBD); + opWriter.setOutputBitdepth(outBD); + opWriter.write(); + break; + } + case OpData::LogType: { - ThrowWriteOp("GradingTone"); + auto log = OCIO_DYNAMIC_POINTER_CAST(op); + LogWriter opWriter(m_formatter, log); + opWriter.setInputBitdepth(inBD); + opWriter.setOutputBitdepth(outBD); + opWriter.write(); + break; } - - auto tone = OCIO_DYNAMIC_POINTER_CAST(op); - GradingToneWriter opWriter(m_formatter, tone); - opWriter.setInputBitdepth(inBD); - opWriter.setOutputBitdepth(outBD); - opWriter.write(); - break; - } - case OpData::LogType: - { - auto log = OCIO_DYNAMIC_POINTER_CAST(op); - LogWriter opWriter(m_formatter, log); - opWriter.setInputBitdepth(inBD); - opWriter.setOutputBitdepth(outBD); - opWriter.write(); - break; - } - case OpData::Lut1DType: - { - auto lut = OCIO_DYNAMIC_POINTER_CAST(op); - if (m_isCLF) + case OpData::Lut1DType: { - if (lut->getDirection() != TRANSFORM_DIR_FORWARD) + auto lut = OCIO_DYNAMIC_POINTER_CAST(op); + if (m_isCLF) { - ThrowWriteOp("InverseLUT1D"); + if (lut->getDirection() != TRANSFORM_DIR_FORWARD) + { + ThrowWriteOp("InverseLUT1D"); + } } - } - // Avoid copying LUT, write will take bit-depth into account. - Lut1DWriter opWriter(m_formatter, lut); + // Avoid copying LUT, write will take bit-depth into account. + Lut1DWriter opWriter(m_formatter, lut); - outBD = GetValidatedFileBitDepth(lut->getFileOutputBitDepth(), type); - opWriter.setInputBitdepth(inBD); - opWriter.setOutputBitdepth(outBD); + outBD = GetValidatedFileBitDepth(lut->getFileOutputBitDepth(), type); + opWriter.setInputBitdepth(inBD); + opWriter.setOutputBitdepth(outBD); - opWriter.write(); - break; - } - case OpData::Lut3DType: - { - auto lut = OCIO_DYNAMIC_POINTER_CAST(op); - if (m_isCLF) + opWriter.write(); + break; + } + case OpData::Lut3DType: { - if (lut->getDirection() != TRANSFORM_DIR_FORWARD) + auto lut = OCIO_DYNAMIC_POINTER_CAST(op); + if (m_isCLF) { - ThrowWriteOp("InverseLUT3D"); + if (lut->getDirection() != TRANSFORM_DIR_FORWARD) + { + ThrowWriteOp("InverseLUT3D"); + } } - } - // Avoid copying LUT, write will take bit-depth into account. - Lut3DWriter opWriter(m_formatter, lut); + // Avoid copying LUT, write will take bit-depth into account. + Lut3DWriter opWriter(m_formatter, lut); - outBD = GetValidatedFileBitDepth(lut->getFileOutputBitDepth(), type); - opWriter.setInputBitdepth(inBD); - opWriter.setOutputBitdepth(outBD); + outBD = GetValidatedFileBitDepth(lut->getFileOutputBitDepth(), type); + opWriter.setInputBitdepth(inBD); + opWriter.setOutputBitdepth(outBD); - opWriter.write(); - break; - } - case OpData::MatrixType: - { - auto matSrc = OCIO_DYNAMIC_POINTER_CAST(op); - - if (m_isCLF) + opWriter.write(); + break; + } + case OpData::MatrixType: { - if (matSrc->hasAlpha()) + auto matSrc = OCIO_DYNAMIC_POINTER_CAST(op); + + if (m_isCLF) { - ThrowWriteOp("Matrix with alpha component"); + if (matSrc->hasAlpha()) + { + ThrowWriteOp("Matrix with alpha component"); + } } - } - auto mat = matSrc->clone(); - outBD = GetValidatedFileBitDepth(mat->getFileOutputBitDepth(), type); - // inBD has already been set at previous iteration. - // inBD can be: - // - This op input file bit-depth if previous op - // does not define an output file bit-depth. - // - Previous op output file bit-depth if previous op - // is a LUT, a Matrix or a Range. - - MatrixWriter opWriter(m_formatter, version, mat); - opWriter.setInputBitdepth(inBD); - opWriter.setOutputBitdepth(outBD); - - opWriter.write(); - break; - } - case OpData::RangeType: - { - auto rangeSrc = OCIO_DYNAMIC_POINTER_CAST(op); - auto range = rangeSrc->clone(); + auto mat = matSrc->clone(); + outBD = GetValidatedFileBitDepth(mat->getFileOutputBitDepth(), type); + // inBD has already been set at previous iteration. + // inBD can be: + // - This op input file bit-depth if previous op + // does not define an output file bit-depth. + // - Previous op output file bit-depth if previous op + // is a LUT, a Matrix or a Range. + + MatrixWriter opWriter(m_formatter, version, mat); + opWriter.setInputBitdepth(inBD); + opWriter.setOutputBitdepth(outBD); + + opWriter.write(); + break; + } + case OpData::RangeType: + { + auto rangeSrc = OCIO_DYNAMIC_POINTER_CAST(op); + auto range = rangeSrc->clone(); - outBD = GetValidatedFileBitDepth(range->getFileOutputBitDepth(), type); - // inBD has already been set at previous iteration. + outBD = GetValidatedFileBitDepth(range->getFileOutputBitDepth(), type); + // inBD has already been set at previous iteration. - RangeWriter opWriter(m_formatter, range); - opWriter.setInputBitdepth(inBD); - opWriter.setOutputBitdepth(outBD); + RangeWriter opWriter(m_formatter, range); + opWriter.setInputBitdepth(inBD); + opWriter.setOutputBitdepth(outBD); - opWriter.write(); - break; - } - case OpData::ReferenceType: - { - throw Exception("Reference ops should have been replaced by their content."); - } - case OpData::NoOpType: - { - throw Exception("Noop ops should have been removed."); - } + opWriter.write(); + break; + } + case OpData::ReferenceType: + { + throw Exception("Reference ops should have been replaced by their content."); + } + case OpData::NoOpType: + { + throw Exception("Noop ops should have been removed."); + } } // For next op. - inBD = outBD; + inBD = outBD; outBD = BIT_DEPTH_F32; } } @@ -2768,7 +2791,6 @@ void TransformWriter::writeOps(const CTFVersion & version) const opWriter.write(); } - } } // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/fileformats/ctf/CTFTransform.h b/src/OpenColorIO/fileformats/ctf/CTFTransform.h index bf655a7812..3c580458fd 100644 --- a/src/OpenColorIO/fileformats/ctf/CTFTransform.h +++ b/src/OpenColorIO/fileformats/ctf/CTFTransform.h @@ -1,21 +1,18 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_FILEFORMATS_CTF_CTFTRANSFORM_H #define INCLUDED_OCIO_FILEFORMATS_CTF_CTFTRANSFORM_H - #include #include +#include "Op.h" #include "fileformats/FormatMetadata.h" #include "fileformats/xmlutils/XMLWriterUtils.h" -#include "Op.h" #include "utils/StringUtils.h" - namespace OCIO_NAMESPACE { @@ -23,8 +20,7 @@ class CTFVersion { public: // Will throw if versionString is not formatted like a version. - static void ReadVersion(const std::string & versionString, - CTFVersion & versionOut); + static void ReadVersion(const std::string & versionString, CTFVersion & versionOut); CTFVersion() : m_major(0) @@ -62,8 +58,7 @@ class CTFVersion ~CTFVersion() {} - friend std::ostream & operator<< (std::ostream & stream, - const CTFVersion & rhs) + friend std::ostream & operator<<(std::ostream & stream, const CTFVersion & rhs) { stream << rhs.m_major; if (rhs.m_minor != 0 || rhs.m_revision != 0) @@ -119,7 +114,6 @@ static const CTFVersion CTF_PROCESS_LIST_VERSION_2_1 = CTFVersion(2, 1); // and do not forget to update the following line. static const CTFVersion CTF_PROCESS_LIST_VERSION = CTF_PROCESS_LIST_VERSION_2_1; - // Version 1.0 initial Autodesk version for InfoElt. #define CTF_INFO_ELEMENT_VERSION_1_0 1.0f @@ -131,85 +125,34 @@ static const CTFVersion CTF_PROCESS_LIST_VERSION = CTF_PROCESS_LIST_VERSION_2_1; #define CTF_INFO_ELEMENT_VERSION CTF_INFO_ELEMENT_VERSION_2_0 - class CTFReaderTransform { public: CTFReaderTransform(); CTFReaderTransform(const OpRcPtrVec & ops, const FormatMetadataImpl & metadata); - ~CTFReaderTransform() - { - } + ~CTFReaderTransform() {} - const std::string & getID() const - { - return m_id; - } - void setID(const char * id) - { - m_id = id; - } - const std::string & getName() const - { - return m_name; - } - void setName(const char * name) - { - m_name = name; - } - const std::string & getInverseOfId() const - { - return m_inverseOfId; - } - void setInverseOfId(const char * id) - { - m_inverseOfId = id; - } - FormatMetadataImpl & getInfoMetadata() - { - return m_infoMetadata; - } - const FormatMetadataImpl & getInfoMetadata() const - { - return m_infoMetadata; - } - const ConstOpDataVec & getOps() const - { - return m_ops; - } - ConstOpDataVec & getOps() - { - return m_ops; - } - const StringUtils::StringVec & getDescriptions() const - { - return m_descriptions; - } - StringUtils::StringVec & getDescriptions() - { - return m_descriptions; - } + const std::string & getID() const { return m_id; } + void setID(const char * id) { m_id = id; } + const std::string & getName() const { return m_name; } + void setName(const char * name) { m_name = name; } + const std::string & getInverseOfId() const { return m_inverseOfId; } + void setInverseOfId(const char * id) { m_inverseOfId = id; } + FormatMetadataImpl & getInfoMetadata() { return m_infoMetadata; } + const FormatMetadataImpl & getInfoMetadata() const { return m_infoMetadata; } + const ConstOpDataVec & getOps() const { return m_ops; } + ConstOpDataVec & getOps() { return m_ops; } + const StringUtils::StringVec & getDescriptions() const { return m_descriptions; } + StringUtils::StringVec & getDescriptions() { return m_descriptions; } - const std::string & getInputDescriptor() const - { - return m_inDescriptor; - } + const std::string & getInputDescriptor() const { return m_inDescriptor; } - void setInputDescriptor(const std::string & in) - { - m_inDescriptor = in; - } + void setInputDescriptor(const std::string & in) { m_inDescriptor = in; } - const std::string & getOutputDescriptor() const - { - return m_outDescriptor; - } + const std::string & getOutputDescriptor() const { return m_outDescriptor; } - void setOutputDescriptor(const std::string & out) - { - m_outDescriptor = out; - } + void setOutputDescriptor(const std::string & out) { m_outDescriptor = out; } void setCTFVersion(const CTFVersion & ver); void setCLFVersion(const CTFVersion & ver); @@ -222,14 +165,8 @@ class CTFReaderTransform void toMetadata(FormatMetadataImpl & metadata) const; // Helper methods to keep the output bit-depth of the Op currently parsed. - void setPreviousOutBitDepth(BitDepth out) - { - m_prevOutBD = out; - } - BitDepth getPreviousOutBitDepth() const - { - return m_prevOutBD; - } + void setPreviousOutBitDepth(BitDepth out) { m_prevOutBD = out; } + BitDepth getPreviousOutBitDepth() const { return m_prevOutBD; } private: std::string m_id; @@ -259,13 +196,11 @@ typedef OCIO_SHARED_PTR ConstCTFReaderTransformPtr; class TransformWriter : public XmlElementWriter { public: - TransformWriter() = delete; - TransformWriter(const TransformWriter &) = delete; - TransformWriter& operator=(const TransformWriter &) = delete; + TransformWriter() = delete; + TransformWriter(const TransformWriter &) = delete; + TransformWriter & operator=(const TransformWriter &) = delete; - TransformWriter(XmlFormatter & formatter, - ConstCTFReaderTransformPtr transform, - bool isCLF); + TransformWriter(XmlFormatter & formatter, ConstCTFReaderTransformPtr transform, bool isCLF); virtual ~TransformWriter(); @@ -278,15 +213,15 @@ class TransformWriter : public XmlElementWriter private: ConstCTFReaderTransformPtr m_transform; - bool m_isCLF; + bool m_isCLF; }; - // Helper function to extract the values of FormatMetadata elements with a // given name. Used to get Description values. -void GetElementsValues(const FormatMetadataImpl::Elements & elements, - const std::string & name, - StringUtils::StringVec & values); +void GetElementsValues( + const FormatMetadataImpl::Elements & elements, + const std::string & name, + StringUtils::StringVec & values); } // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/fileformats/ctf/IndexMapping.cpp b/src/OpenColorIO/fileformats/ctf/IndexMapping.cpp index 4b116963d3..fccd154ae7 100644 --- a/src/OpenColorIO/fileformats/ctf/IndexMapping.cpp +++ b/src/OpenColorIO/fileformats/ctf/IndexMapping.cpp @@ -88,17 +88,19 @@ void IndexMapping::validate() const bool IndexMapping::operator==(const IndexMapping & other) const { - if (this == &other) return true; + if (this == &other) + return true; - if (m_dimension != other.m_dimension) return false; + if (m_dimension != other.m_dimension) + return false; for (unsigned i = 0; i < getNumComponents(); i++) { - if (m_indices[i] != other.m_indices[i]) return false; + if (m_indices[i] != other.m_indices[i]) + return false; } return true; } } // namespace OCIO_NAMESPACE - diff --git a/src/OpenColorIO/fileformats/ctf/IndexMapping.h b/src/OpenColorIO/fileformats/ctf/IndexMapping.h index a6baac3843..8a29afeb29 100644 --- a/src/OpenColorIO/fileformats/ctf/IndexMapping.h +++ b/src/OpenColorIO/fileformats/ctf/IndexMapping.h @@ -13,9 +13,9 @@ namespace OCIO_NAMESPACE { // The class represents the index mapping for a LUT -// This class defines a list that is the new mapping of input +// This class defines a list that is the new mapping of input // code values (inValues) to index positions (n) in a LUT. -// +// // TODO: This is an initial implementation to just do the minimal // required for CLF support. We may add more later. // @@ -26,7 +26,7 @@ namespace OCIO_NAMESPACE class IndexMapping { public: - typedef std::pair Data; + typedef std::pair Data; typedef std::vector ComponentData; // Type definition of the three component colors. @@ -55,14 +55,12 @@ class IndexMapping bool operator==(const IndexMapping & other) const; private: - void validateIndex(size_t index) const; - size_t m_dimension; // Dimension - Indices m_indices; // All values + size_t m_dimension; // Dimension + Indices m_indices; // All values }; } // namespace OCIO_NAMESPACE - #endif diff --git a/src/OpenColorIO/fileformats/xmlutils/XMLReaderHelper.cpp b/src/OpenColorIO/fileformats/xmlutils/XMLReaderHelper.cpp index d5b5be5dcf..5894974063 100644 --- a/src/OpenColorIO/fileformats/xmlutils/XMLReaderHelper.cpp +++ b/src/OpenColorIO/fileformats/xmlutils/XMLReaderHelper.cpp @@ -3,17 +3,18 @@ #include -#include "fileformats/xmlutils/XMLReaderHelper.h" -#include "fileformats/xmlutils/XMLReaderUtils.h" #include "Logging.h" #include "ParseUtils.h" #include "Platform.h" +#include "fileformats/xmlutils/XMLReaderHelper.h" +#include "fileformats/xmlutils/XMLReaderUtils.h" namespace OCIO_NAMESPACE { -XmlReaderElement::XmlReaderElement(const std::string & name, - unsigned int xmlLineNumber, - const std::string & xmlFile) +XmlReaderElement::XmlReaderElement( + const std::string & name, + unsigned int xmlLineNumber, + const std::string & xmlFile) : m_name(name) , m_xmlLineNumber(xmlLineNumber) , m_xmlFile(xmlFile) @@ -24,19 +25,20 @@ XmlReaderElement::~XmlReaderElement() { } -const std::string& XmlReaderElement::getXmlFile() const +const std::string & XmlReaderElement::getXmlFile() const { static const std::string emptyName("File name not specified"); return m_xmlFile.empty() ? emptyName : m_xmlFile; } -void XmlReaderElement::setContext(const std::string & name, - unsigned int xmlLineNumber, - const std::string & xmlFile) +void XmlReaderElement::setContext( + const std::string & name, + unsigned int xmlLineNumber, + const std::string & xmlFile) { - m_name = name; + m_name = name; m_xmlLineNumber = xmlLineNumber; - m_xmlFile = xmlFile; + m_xmlFile = xmlFile; } void XmlReaderElement::throwMessage(const std::string & error) const @@ -63,15 +65,13 @@ const std::string & XmlReaderDummyElt::DummyParent::getIdentifier() const return identifier; } -XmlReaderDummyElt::XmlReaderDummyElt(const std::string & name, - ElementRcPtr pParent, - unsigned int xmlLineNumber, - const std::string & xmlFile, - const char * msg) - : XmlReaderPlainElt(name, - std::make_shared(pParent), - xmlLineNumber, - xmlFile) +XmlReaderDummyElt::XmlReaderDummyElt( + const std::string & name, + ElementRcPtr pParent, + unsigned int xmlLineNumber, + const std::string & xmlFile, + const char * msg) + : XmlReaderPlainElt(name, std::make_shared(pParent), xmlLineNumber, xmlFile) { std::ostringstream oss; oss << getXmlFile().c_str() << "(" << getXmlLineNumber() << "): "; @@ -99,7 +99,7 @@ void XmlReaderDescriptionElt::end() { if (m_changed) { - // Note: eXpat automatically replaces escaped characters with + // Note: eXpat automatically replaces escaped characters with // their original values. getParent()->appendMetadata(getIdentifier(), m_description); } @@ -181,10 +181,9 @@ void XmlReaderSOPValueElt::end() { data = GetNumbers(m_contentData.c_str(), m_contentData.size()); } - catch (Exception&) + catch (Exception &) { - const std::string s = TruncateString(m_contentData.c_str(), - m_contentData.size()); + const std::string s = TruncateString(m_contentData.c_str(), m_contentData.size()); std::ostringstream oss; oss << "Illegal values '" << s << "' in " << getTypeName(); throwMessage(oss.str()); @@ -195,8 +194,8 @@ void XmlReaderSOPValueElt::end() throwMessage("SOPNode: 3 values required."); } - XmlReaderSOPNodeBaseElt* pSOPNodeElt = - dynamic_cast(getParent().get()); + XmlReaderSOPNodeBaseElt * pSOPNodeElt + = dynamic_cast(getParent().get()); CDLOpDataRcPtr pCDL = pSOPNodeElt->getCDL(); if (0 == strcmp(getName().c_str(), TAG_SLOPE)) @@ -216,19 +215,18 @@ void XmlReaderSOPValueElt::end() } } -void XmlReaderSOPValueElt::setRawData(const char * str, - size_t len, - unsigned int /* xmlLine */) +void XmlReaderSOPValueElt::setRawData(const char * str, size_t len, unsigned int /* xmlLine */) { m_contentData += std::string(str, len) + " "; } /////////////////////////////////////////////////////////////////////////////// -XmlReaderSaturationElt::XmlReaderSaturationElt(const std::string & name, - ContainerEltRcPtr pParent, - unsigned int xmlLineNumber, - const std::string & xmlFile) +XmlReaderSaturationElt::XmlReaderSaturationElt( + const std::string & name, + ContainerEltRcPtr pParent, + unsigned int xmlLineNumber, + const std::string & xmlFile) : XmlReaderPlainElt(name, pParent, xmlLineNumber, xmlFile) { } @@ -252,10 +250,9 @@ void XmlReaderSaturationElt::end() { data = GetNumbers(m_contentData.c_str(), m_contentData.size()); } - catch (Exception& /* ce */) + catch (Exception & /* ce */) { - const std::string s = TruncateString(m_contentData.c_str(), - m_contentData.size()); + const std::string s = TruncateString(m_contentData.c_str(), m_contentData.size()); std::ostringstream oss; oss << "Illegal values '" << s << "' in " << getTypeName(); throwMessage(oss.str()); @@ -266,8 +263,8 @@ void XmlReaderSaturationElt::end() throwMessage("SatNode: non-single value. "); } - XmlReaderSatNodeBaseElt* pSatNodeElt = - dynamic_cast(getParent().get()); + XmlReaderSatNodeBaseElt * pSatNodeElt + = dynamic_cast(getParent().get()); CDLOpDataRcPtr pCDL = pSatNodeElt->getCDL(); if (0 == strcmp(getName().c_str(), TAG_SATURATION)) @@ -276,7 +273,7 @@ void XmlReaderSaturationElt::end() } } -void XmlReaderSaturationElt::setRawData(const char* str, size_t len, unsigned int) +void XmlReaderSaturationElt::setRawData(const char * str, size_t len, unsigned int) { m_contentData += std::string(str, len) + " "; } diff --git a/src/OpenColorIO/fileformats/xmlutils/XMLReaderHelper.h b/src/OpenColorIO/fileformats/xmlutils/XMLReaderHelper.h index 203d3bcdfc..e6e9fb10cb 100644 --- a/src/OpenColorIO/fileformats/xmlutils/XMLReaderHelper.h +++ b/src/OpenColorIO/fileformats/xmlutils/XMLReaderHelper.h @@ -4,27 +4,26 @@ #ifndef INCLUDED_OCIO_FILEFORMATS_XMLUTILS_XMLREADERHELPER_H #define INCLUDED_OCIO_FILEFORMATS_XMLUTILS_XMLREADERHELPER_H - #include #include +#include "PrivateTypes.h" #include "fileformats/xmlutils/XMLReaderUtils.h" #include "ops/cdl/CDLOpData.h" -#include "PrivateTypes.h" #include "transforms/CDLTransform.h" #include "utils/StringUtils.h" - namespace OCIO_NAMESPACE { // Base class for all elements possible for parsing XML. class XmlReaderElement { public: - XmlReaderElement(const std::string & name, - unsigned int xmlLineNumber, - const std::string & xmlFile); + XmlReaderElement( + const std::string & name, + unsigned int xmlLineNumber, + const std::string & xmlFile); virtual ~XmlReaderElement(); @@ -37,40 +36,30 @@ class XmlReaderElement // Is it a container which means if it can hold other elements. virtual bool isContainer() const = 0; - const std::string & getName() const - { - return m_name; - } + const std::string & getName() const { return m_name; } virtual const std::string & getIdentifier() const = 0; - unsigned int getXmlLineNumber() const - { - return m_xmlLineNumber; - } + unsigned int getXmlLineNumber() const { return m_xmlLineNumber; } const std::string & getXmlFile() const; virtual const char * getTypeName() const = 0; // Set the element context. - void setContext(const std::string & name, - unsigned int xmlLineNumber, - const std::string & xmlFile); + void + setContext(const std::string & name, unsigned int xmlLineNumber, const std::string & xmlFile); // Is it a dummy element? // Only XmlReaderDummyElt will return true. - virtual bool isDummy() const - { - return false; - } + virtual bool isDummy() const { return false; } void throwMessage(const std::string & error) const; void logParameterWarning(const char * param) const; protected: - template + template void parseScalarAttribute(const char * name, const char * attrib, T & value) { const size_t len = strlen(attrib); @@ -102,13 +91,13 @@ class XmlReaderElement } private: - std::string m_name; + std::string m_name; unsigned int m_xmlLineNumber; - std::string m_xmlFile; + std::string m_xmlFile; private: - XmlReaderElement() = delete; - XmlReaderElement(const XmlReaderElement &) = delete; + XmlReaderElement() = delete; + XmlReaderElement(const XmlReaderElement &) = delete; XmlReaderElement & operator=(const XmlReaderElement &) = delete; }; @@ -118,28 +107,23 @@ typedef OCIO_SHARED_PTR ElementRcPtr; class XmlReaderContainerElt : public XmlReaderElement { public: - XmlReaderContainerElt(const std::string & name, - unsigned int xmlLineNumber, - const std::string & xmlFile) + XmlReaderContainerElt( + const std::string & name, + unsigned int xmlLineNumber, + const std::string & xmlFile) : XmlReaderElement(name, xmlLineNumber, xmlFile) { } - virtual ~XmlReaderContainerElt() - { - } + virtual ~XmlReaderContainerElt() {} // Is it a container which means if it can hold other elements. - bool isContainer() const override - { - return true; - } + bool isContainer() const override { return true; } virtual void appendMetadata(const std::string & name, const std::string & value) = 0; private: XmlReaderContainerElt() = delete; - }; typedef OCIO_SHARED_PTR ContainerEltRcPtr; @@ -148,42 +132,27 @@ typedef OCIO_SHARED_PTR ContainerEltRcPtr; class XmlReaderPlainElt : public XmlReaderElement { public: - XmlReaderPlainElt(const std::string & name, - ContainerEltRcPtr pParent, - unsigned int xmlLineNumber, - const std::string & xmlFile) + XmlReaderPlainElt( + const std::string & name, + ContainerEltRcPtr pParent, + unsigned int xmlLineNumber, + const std::string & xmlFile) : XmlReaderElement(name, xmlLineNumber, xmlFile) , m_parent(pParent) { } - ~XmlReaderPlainElt() - { - } + ~XmlReaderPlainElt() {} - virtual void setRawData(const char * str, - size_t len, - unsigned int xmlLine) = 0; + virtual void setRawData(const char * str, size_t len, unsigned int xmlLine) = 0; - bool isContainer() const override - { - return false; - } + bool isContainer() const override { return false; } - const ContainerEltRcPtr & getParent() const - { - return m_parent; - } + const ContainerEltRcPtr & getParent() const { return m_parent; } - const std::string & getIdentifier() const override - { - return getName(); - } + const std::string & getIdentifier() const override { return getName(); } - const char * getTypeName() const override - { - return getName().c_str(); - } + const char * getTypeName() const override { return getName().c_str(); } private: XmlReaderPlainElt() = delete; @@ -202,65 +171,47 @@ class XmlReaderDummyElt : public XmlReaderPlainElt public: DummyParent() = delete; DummyParent(ElementRcPtr & pParent) - : XmlReaderContainerElt(pParent.get() ? pParent->getName() : "", - pParent.get() ? pParent->getXmlLineNumber() : 0, - pParent.get() ? pParent->getXmlFile() : "") - { - } - ~DummyParent() + : XmlReaderContainerElt( + pParent.get() ? pParent->getName() : "", + pParent.get() ? pParent->getXmlLineNumber() : 0, + pParent.get() ? pParent->getXmlFile() : "") { } + ~DummyParent() {} - void appendMetadata(const std::string & /*name*/, const std::string & /*value*/) override - { - } + void appendMetadata(const std::string & /*name*/, const std::string & /*value*/) override {} const std::string & getIdentifier() const override; - void start(const char ** /* atts */) override - { - } + void start(const char ** /* atts */) override {} - void end() override - { - } + void end() override {} - const char * getTypeName() const override - { - return getIdentifier().c_str(); - } + const char * getTypeName() const override { return getIdentifier().c_str(); } }; public: - XmlReaderDummyElt(const std::string & name, - ElementRcPtr pParent, - unsigned int xmlLocation, - const std::string & xmlFile, - const char * msg); + XmlReaderDummyElt( + const std::string & name, + ElementRcPtr pParent, + unsigned int xmlLocation, + const std::string & xmlFile, + const char * msg); - virtual ~XmlReaderDummyElt() - { - } + virtual ~XmlReaderDummyElt() {} const std::string & getIdentifier() const override; - void start(const char ** /* atts */) override - { - } + void start(const char ** /* atts */) override {} - void end() override - { - } + void end() override {} void setRawData(const char * str, size_t len, unsigned int /* xmlLine */) override { m_rawData.push_back(std::string(str, len)); } - bool isDummy() const override - { - return true; - } + bool isDummy() const override { return true; } private: StringUtils::StringVec m_rawData; @@ -273,18 +224,17 @@ class XmlReaderDescriptionElt : public XmlReaderPlainElt { public: XmlReaderDescriptionElt() = delete; - XmlReaderDescriptionElt(const std::string & name, - ContainerEltRcPtr & pParent, - unsigned int xmlLocation, - const std::string & xmlFile) + XmlReaderDescriptionElt( + const std::string & name, + ContainerEltRcPtr & pParent, + unsigned int xmlLocation, + const std::string & xmlFile) : XmlReaderPlainElt(name, pParent, xmlLocation, xmlFile) , m_changed(false) { } - ~XmlReaderDescriptionElt() - { - } + ~XmlReaderDescriptionElt() {} void start(const char ** /* atts */) override { @@ -304,44 +254,31 @@ class XmlReaderDescriptionElt : public XmlReaderPlainElt private: std::string m_description; bool m_changed; - }; // Base class for nested elements. class XmlReaderComplexElt : public XmlReaderContainerElt { public: - XmlReaderComplexElt(const std::string & name, - ContainerEltRcPtr pParent, - unsigned int xmlLineNumber, - const std::string & xmlFile) + XmlReaderComplexElt( + const std::string & name, + ContainerEltRcPtr pParent, + unsigned int xmlLineNumber, + const std::string & xmlFile) : XmlReaderContainerElt(name, xmlLineNumber, xmlFile) , m_parent(pParent) { } - ~XmlReaderComplexElt() - { - } + ~XmlReaderComplexElt() {} - const ContainerEltRcPtr & getParent() const - { - return m_parent; - } + const ContainerEltRcPtr & getParent() const { return m_parent; } - const std::string & getIdentifier() const override - { - return getName(); - } + const std::string & getIdentifier() const override { return getName(); } - const char * getTypeName() const override - { - return getName().c_str(); - } + const char * getTypeName() const override { return getName().c_str(); } - void appendMetadata(const std::string & /*name*/, const std::string & /*value*/) override - { - } + void appendMetadata(const std::string & /*name*/, const std::string & /*value*/) override {} private: XmlReaderComplexElt() = delete; @@ -352,10 +289,11 @@ class XmlReaderComplexElt : public XmlReaderContainerElt class XmlReaderSOPNodeBaseElt : public XmlReaderComplexElt { public: - XmlReaderSOPNodeBaseElt(const std::string & name, - ContainerEltRcPtr pParent, - unsigned int xmlLineNumber, - const std::string & xmlFile) + XmlReaderSOPNodeBaseElt( + const std::string & name, + ContainerEltRcPtr pParent, + unsigned int xmlLineNumber, + const std::string & xmlFile) : XmlReaderComplexElt(name, pParent, xmlLineNumber, xmlFile) , m_isSlopeInit(false) , m_isOffsetInit(false) @@ -411,10 +349,11 @@ class XmlReaderSOPNodeBaseElt : public XmlReaderComplexElt class XmlReaderSOPValueElt : public XmlReaderPlainElt { public: - XmlReaderSOPValueElt(const std::string & name, - ContainerEltRcPtr pParent, - unsigned int xmlLineNumber, - const std::string & xmlFile); + XmlReaderSOPValueElt( + const std::string & name, + ContainerEltRcPtr pParent, + unsigned int xmlLineNumber, + const std::string & xmlFile); ~XmlReaderSOPValueElt(); @@ -434,21 +373,18 @@ class XmlReaderSOPValueElt : public XmlReaderPlainElt class XmlReaderSatNodeBaseElt : public XmlReaderComplexElt { public: - XmlReaderSatNodeBaseElt(const std::string & name, - ContainerEltRcPtr pParent, - unsigned int xmlLineNumber, - const std::string & xmlFile) + XmlReaderSatNodeBaseElt( + const std::string & name, + ContainerEltRcPtr pParent, + unsigned int xmlLineNumber, + const std::string & xmlFile) : XmlReaderComplexElt(name, pParent, xmlLineNumber, xmlFile) { } - void start(const char ** /* atts */) override - { - } + void start(const char ** /* atts */) override {} - void end() override - { - } + void end() override {} virtual const CDLOpDataRcPtr & getCDL() const = 0; @@ -459,7 +395,6 @@ class XmlReaderSatNodeBaseElt : public XmlReaderComplexElt getCDL()->getFormatMetadata().getChildrenElements().push_back(item); } - private: XmlReaderSatNodeBaseElt() = delete; }; @@ -468,10 +403,11 @@ class XmlReaderSatNodeBaseElt : public XmlReaderComplexElt class XmlReaderSaturationElt : public XmlReaderPlainElt { public: - XmlReaderSaturationElt(const std::string & name, - ContainerEltRcPtr pParent, - unsigned int xmlLineNumber, - const std::string & xmlFile); + XmlReaderSaturationElt( + const std::string & name, + ContainerEltRcPtr pParent, + unsigned int xmlLineNumber, + const std::string & xmlFile); ~XmlReaderSaturationElt(); @@ -495,7 +431,7 @@ class XmlReaderElementStack public: XmlReaderElementStack(); - XmlReaderElementStack(const XmlReaderElementStack &) = delete; + XmlReaderElementStack(const XmlReaderElementStack &) = delete; XmlReaderElementStack & operator=(const XmlReaderElementStack &) = delete; virtual ~XmlReaderElementStack(); diff --git a/src/OpenColorIO/fileformats/xmlutils/XMLReaderUtils.cpp b/src/OpenColorIO/fileformats/xmlutils/XMLReaderUtils.cpp index 30dd21c55d..c9895f3242 100644 --- a/src/OpenColorIO/fileformats/xmlutils/XMLReaderUtils.cpp +++ b/src/OpenColorIO/fileformats/xmlutils/XMLReaderUtils.cpp @@ -16,15 +16,13 @@ bool IsNotSpace(char c) // Trim from start. static inline void LTrim(std::string & s) { - s.erase(s.begin(), - std::find_if(s.begin(), s.end(), IsNotSpace)); + s.erase(s.begin(), std::find_if(s.begin(), s.end(), IsNotSpace)); } // Trim from end. static inline void RTrim(std::string & s) { - s.erase(std::find_if(s.rbegin(), s.rend(), IsNotSpace).base(), - s.end()); + s.erase(std::find_if(s.rbegin(), s.rend(), IsNotSpace).base(), s.end()); } // Trim from both ends. @@ -40,8 +38,8 @@ void Trim(std::string & s) // std::string::npos if the string only has whitespaces or is empty. inline size_t FindFirstNonWhiteSpace(const char * str, size_t len) { - const char *ptr = str; - size_t pos = 0; + const char * ptr = str; + size_t pos = 0; for (;;) { @@ -53,7 +51,8 @@ inline size_t FindFirstNonWhiteSpace(const char * str, size_t len) { return len; } - ptr++; pos++; + ptr++; + pos++; } } @@ -63,8 +62,8 @@ inline size_t FindFirstNonWhiteSpace(const char * str, size_t len) // std::string::npos if the string only has whitespaces or is empty. inline size_t FindLastNonWhiteSpace(const char * str, size_t len) { - size_t pos = len - 1; - const char *ptr = str + pos; + size_t pos = len - 1; + const char * ptr = str + pos; for (;;) { @@ -77,20 +76,19 @@ inline size_t FindLastNonWhiteSpace(const char * str, size_t len) return 0; } - ptr--; pos--; + ptr--; + pos--; } } // Get start (first non space character) and // end (just after the last non space character). -void FindSubString(const char * str, size_t length, - size_t & start, - size_t & end) +void FindSubString(const char * str, size_t length, size_t & start, size_t & end) { if (!str || !*str) { start = 0; - end = 0; + end = 0; return; // nothing to Trim. } @@ -100,7 +98,7 @@ void FindSubString(const char * str, size_t length, // str only contains spaces, tabs or newlines. // Return an empty string. start = 0; - end = 0; + end = 0; return; } @@ -109,8 +107,8 @@ void FindSubString(const char * str, size_t length, end = FindLastNonWhiteSpace(str, length); // end-start should give the number of valid characters. - if (!IsSpace(str[end])) ++end; + if (!IsSpace(str[end])) + ++end; } } // namespace OCIO_NAMESPACE - diff --git a/src/OpenColorIO/fileformats/xmlutils/XMLReaderUtils.h b/src/OpenColorIO/fileformats/xmlutils/XMLReaderUtils.h index 9a813a2551..b6a969f613 100644 --- a/src/OpenColorIO/fileformats/xmlutils/XMLReaderUtils.h +++ b/src/OpenColorIO/fileformats/xmlutils/XMLReaderUtils.h @@ -4,39 +4,36 @@ #ifndef INCLUDED_OCIO_FILEFORMATS_XML_XMLREADERUTILS_H #define INCLUDED_OCIO_FILEFORMATS_XML_XMLREADERUTILS_H - -#include -#include #include +#include +#include #include #include #include "MathUtils.h" -#include "utils/StringUtils.h" -#include "utils/NumberUtils.h" #include "Platform.h" - +#include "utils/NumberUtils.h" +#include "utils/StringUtils.h" namespace OCIO_NAMESPACE { // Strings used by CDL and CLF parsers or writers. -static constexpr char ATTR_ID[] = "id"; +static constexpr char ATTR_ID[] = "id"; static constexpr char ATTR_NAME[] = "name"; static constexpr char CDL_TAG_COLOR_CORRECTION[] = "ColorCorrection"; static constexpr char TAG_DESCRIPTION[] = "Description"; -static constexpr char TAG_OFFSET[] = "Offset"; -static constexpr char TAG_POWER[] = "Power"; -static constexpr char TAG_SATNODE[] = "SatNode"; -static constexpr char TAG_SATNODEALT[] = "SATNode"; -static constexpr char TAG_SATURATION[] = "Saturation"; -static constexpr char TAG_SLOPE[] = "Slope"; -static constexpr char TAG_SOPNODE[] = "SOPNode"; - +static constexpr char TAG_OFFSET[] = "Offset"; +static constexpr char TAG_POWER[] = "Power"; +static constexpr char TAG_SATNODE[] = "SatNode"; +static constexpr char TAG_SATNODEALT[] = "SATNode"; +static constexpr char TAG_SATURATION[] = "Saturation"; +static constexpr char TAG_SLOPE[] = "Slope"; +static constexpr char TAG_SOPNODE[] = "SOPNode"; // This method truncates a string (mainly used for display purpose). inline std::string TruncateString(const char * pStr, size_t len, size_t limit) @@ -57,17 +54,14 @@ void Trim(std::string & s); // Find the first valid sub string delimited by spaces. // Avoid any character copy(ies) as the method is intensively used // when reading values of 1D & 3D luts -void FindSubString(const char * str, size_t length, - size_t & start, - size_t & end); +void FindSubString(const char * str, size_t length, size_t & start, size_t & end); // Is c a 'space' character ( '\n', '\t', ' ' ... )? // Note: Do not use the std::isspace which is very slow. inline bool IsSpace(char c) { // Note: \n is unix while \r\n is windows line feed. - return c == ' ' || c == '\n' || c == '\t' || c == '\r' || - c == '\v' || c == '\f'; + return c == ' ' || c == '\n' || c == '\t' || c == '\r' || c == '\v' || c == '\f'; } // Is the character a valid number delimiter? @@ -89,7 +83,8 @@ inline size_t FindNextTokenStart(const char * str, size_t len, size_t pos) while (IsNumberDelimiter(*ptr)) { - ptr++; pos++; + ptr++; + pos++; if (pos >= len) { @@ -113,7 +108,8 @@ inline size_t FindDelim(const char * str, size_t len, size_t pos) while (!IsNumberDelimiter(*ptr)) { - ptr++; pos++; + ptr++; + pos++; if (pos >= len) { @@ -129,16 +125,16 @@ namespace // When using an integer ParseNumber template, it is an error if the string // actually contains a number with a decimal part. -template -bool IsValid(T value, double val) +template bool IsValid(T value, double val) { // Returns true, if T is the type float, double or long double. - if (std::is_floating_point::value) return true; + if (std::is_floating_point::value) + return true; return static_cast(value) == val; } -} +} // namespace // Get first number from a string between startPos & endPos. // EndPos should not be greater than length of the string. @@ -147,8 +143,7 @@ bool IsValid(T value, double val) // accessible (most likely str[endPos]). // Note: For performance reasons, this function does not copy the string // unless an exception needs to be thrown. -template -void ParseNumber(const char * str, size_t startPos, size_t endPos, T & value) +template void ParseNumber(const char * str, size_t startPos, size_t endPos, T & value) { if (endPos == startPos) { @@ -160,11 +155,12 @@ void ParseNumber(const char * str, size_t startPos, size_t endPos, T & value) double val = 0.0f; size_t adjustedStartPos = startPos; - size_t adjustedEndPos = endPos; + size_t adjustedEndPos = endPos; FindSubString(startParse, endPos - startPos, adjustedStartPos, adjustedEndPos); - const auto result = NumberUtils::from_chars(startParse + adjustedStartPos, startParse + adjustedEndPos, val); + const auto result + = NumberUtils::from_chars(startParse + adjustedStartPos, startParse + adjustedEndPos, val); value = (T)val; @@ -173,9 +169,7 @@ void ParseNumber(const char * str, size_t startPos, size_t endPos, T & value) std::string fullStr(str, endPos); std::string parsedStr(startParse, endPos - startPos); std::ostringstream oss; - oss << "ParserNumber: Characters '" - << parsedStr - << "' can not be parsed to numbers in '" + oss << "ParserNumber: Characters '" << parsedStr << "' can not be parsed to numbers in '" << TruncateString(fullStr.c_str(), endPos, 100) << "'."; throw Exception(oss.str().c_str()); } @@ -184,9 +178,7 @@ void ParseNumber(const char * str, size_t startPos, size_t endPos, T & value) std::string fullStr(str, endPos); std::string parsedStr(startParse, endPos - startPos); std::ostringstream oss; - oss << "ParserNumber: Characters '" - << parsedStr - << "' are illegal in '" + oss << "ParserNumber: Characters '" << parsedStr << "' are illegal in '" << TruncateString(fullStr.c_str(), endPos, 100) << "'."; throw Exception(oss.str().c_str()); } @@ -196,8 +188,7 @@ void ParseNumber(const char * str, size_t startPos, size_t endPos, T & value) std::string fullStr(str, endPos); std::string parsedStr(startParse, endPos - startPos); std::ostringstream oss; - oss << "ParserNumber: '" - << parsedStr + oss << "ParserNumber: '" << parsedStr << "' number is followed by unexpected characters in '" << TruncateString(fullStr.c_str(), endPos, 100) << "'."; throw Exception(oss.str().c_str()); @@ -207,8 +198,7 @@ void ParseNumber(const char * str, size_t startPos, size_t endPos, T & value) // Extract the next number contained in the string. // Note that pos gets updated to the position of the next delimiter, or to // std::string::npos if the value returned is the last one in the string. -template -void GetNextNumber(const char * s, size_t len, size_t & pos, T & num) +template void GetNextNumber(const char * s, size_t len, size_t & pos, T & num) { pos = FindNextTokenStart(s, len, pos); @@ -227,8 +217,7 @@ void GetNextNumber(const char * s, size_t len, size_t & pos, T & num) // This method tokenizes a string like "0 1 2" of integers or floats. // returns the numbers extracted from the string. -template -std::vector GetNumbers(const char * str, size_t len) +template std::vector GetNumbers(const char * str, size_t len) { std::vector numbers; diff --git a/src/OpenColorIO/fileformats/xmlutils/XMLWriterUtils.cpp b/src/OpenColorIO/fileformats/xmlutils/XMLWriterUtils.cpp index 30fa0a8266..083c991880 100644 --- a/src/OpenColorIO/fileformats/xmlutils/XMLWriterUtils.cpp +++ b/src/OpenColorIO/fileformats/xmlutils/XMLWriterUtils.cpp @@ -3,21 +3,19 @@ #include -#include "fileformats/xmlutils/XMLWriterUtils.h" #include "ParseUtils.h" +#include "fileformats/xmlutils/XMLWriterUtils.h" namespace OCIO_NAMESPACE { -XmlFormatter::XmlFormatter(std::ostream& stream) - : m_stream(stream) +XmlFormatter::XmlFormatter(std::ostream & stream) + : m_stream(stream) { - } XmlFormatter::~XmlFormatter() { - } void XmlFormatter::incrementIndent() @@ -30,8 +28,7 @@ void XmlFormatter::decrementIndent() --m_indentLevel; } -void XmlFormatter::writeStartTag(const std::string & tagName, - const Attributes & attributes) +void XmlFormatter::writeStartTag(const std::string & tagName, const Attributes & attributes) { writeIndent(); m_stream << "<" << tagName; @@ -58,16 +55,16 @@ void XmlFormatter::writeEndTag(const std::string & tagName) m_stream << "\n"; } -void XmlFormatter::writeContentTag(const std::string & tagName, - const std::string & content) +void XmlFormatter::writeContentTag(const std::string & tagName, const std::string & content) { Attributes atts; writeContentTag(tagName, atts, content); } -void XmlFormatter::writeContentTag(const std::string & tagName, - const Attributes & attributes, - const std::string & content) +void XmlFormatter::writeContentTag( + const std::string & tagName, + const Attributes & attributes, + const std::string & content) { writeIndent(); m_stream << "<" << tagName; @@ -90,14 +87,12 @@ void XmlFormatter::writeContent(const std::string & content) m_stream << "\n"; } -void XmlFormatter::writeEmptyTag(const std::string & tagName, - const Attributes & attributes) +void XmlFormatter::writeEmptyTag(const std::string & tagName, const Attributes & attributes) { writeIndent(); m_stream << "<" << tagName; - for (Attributes::const_iterator it(attributes.begin()); - it != attributes.end(); it++) + for (Attributes::const_iterator it(attributes.begin()); it != attributes.end(); it++) { m_stream << " " << (*it).first << "=\""; writeString((*it).second); @@ -137,7 +132,6 @@ XmlScopeIndent::~XmlScopeIndent() m_formatter.decrementIndent(); } - XmlElementWriter::XmlElementWriter(XmlFormatter & formatter) : m_formatter(formatter) { diff --git a/src/OpenColorIO/fileformats/xmlutils/XMLWriterUtils.h b/src/OpenColorIO/fileformats/xmlutils/XMLWriterUtils.h index c5ea120891..53d5fde0eb 100644 --- a/src/OpenColorIO/fileformats/xmlutils/XMLWriterUtils.h +++ b/src/OpenColorIO/fileformats/xmlutils/XMLWriterUtils.h @@ -16,24 +16,22 @@ namespace OCIO_NAMESPACE class XmlFormatter final { public: - using Attribute = std::pair; using Attributes = std::vector; public: - XmlFormatter() = delete; - XmlFormatter(const XmlFormatter &) = delete; - XmlFormatter& operator=(const XmlFormatter &) = delete; + XmlFormatter() = delete; + XmlFormatter(const XmlFormatter &) = delete; + XmlFormatter & operator=(const XmlFormatter &) = delete; - XmlFormatter(std::ostream& stream); + XmlFormatter(std::ostream & stream); ~XmlFormatter(); void incrementIndent(); void decrementIndent(); // Write a start Element on a standalone line. - void writeStartTag(const std::string & tagName, - const Attributes & attributes); + void writeStartTag(const std::string & tagName, const Attributes & attributes); // Write a start Element on a standalone line. void writeStartTag(const std::string & tagName); @@ -42,13 +40,13 @@ class XmlFormatter final void writeEndTag(const std::string & tagName); // Write \content\ on a standalone line. - void writeContentTag(const std::string & tagName, - const std::string & content); + void writeContentTag(const std::string & tagName, const std::string & content); // Write \content\ on a standalone line. - void writeContentTag(const std::string & tagName, - const Attributes & attributes, - const std::string & content); + void writeContentTag( + const std::string & tagName, + const Attributes & attributes, + const std::string & content); // Write the content using escaped characters if needed. void writeContent(const std::string & content); @@ -56,8 +54,7 @@ class XmlFormatter final // Write an empty Element on a standalone line. // In XML parlance, an empty Element is an Element without content // and without children and which does not have a separate end tag. - void writeEmptyTag(const std::string & tagName, - const Attributes & attributes); + void writeEmptyTag(const std::string & tagName, const Attributes & attributes); std::ostream & getStream(); @@ -73,9 +70,9 @@ class XmlFormatter final class XmlElementWriter { public: - XmlElementWriter() = delete; - XmlElementWriter(XmlElementWriter &) = delete; - XmlElementWriter& operator=(XmlElementWriter &) = delete; + XmlElementWriter() = delete; + XmlElementWriter(XmlElementWriter &) = delete; + XmlElementWriter & operator=(XmlElementWriter &) = delete; explicit XmlElementWriter(XmlFormatter & formatter); virtual ~XmlElementWriter(); @@ -91,8 +88,8 @@ class XmlElementWriter class XmlScopeIndent { public: - XmlScopeIndent() = delete; - XmlScopeIndent(XmlScopeIndent &) = delete; + XmlScopeIndent() = delete; + XmlScopeIndent(XmlScopeIndent &) = delete; XmlScopeIndent & operator=(XmlScopeIndent &) = delete; explicit XmlScopeIndent(XmlFormatter & formatter); diff --git a/src/OpenColorIO/ops/OpArray.h b/src/OpenColorIO/ops/OpArray.h index 4a7b0b72ff..8aed842319 100644 --- a/src/OpenColorIO/ops/OpArray.h +++ b/src/OpenColorIO/ops/OpArray.h @@ -20,11 +20,11 @@ class ArrayBase ArrayBase() {} virtual ~ArrayBase() {} virtual void setDoubleValue(unsigned long index, double value) = 0; - virtual double getDoubleValue(unsigned long index) = 0; - virtual unsigned long getLength() const = 0; - virtual unsigned long getNumColorComponents() const = 0; + virtual double getDoubleValue(unsigned long index) = 0; + virtual unsigned long getLength() const = 0; + virtual unsigned long getNumColorComponents() const = 0; - // Specialized in the child classes to calculate the expected number of + // Specialized in the child classes to calculate the expected number of // array values based on the specified length, the interpretation of // length and number of components. virtual unsigned long getNumValues() const = 0; @@ -32,10 +32,10 @@ class ArrayBase // The CLF spec defines several ops that all contain an array (LUT1D, LUT3D, // and Matrix). The Array class is used as a building block to implement those -// other classes. Since the dimensionality of the underlying array of those +// other classes. Since the dimensionality of the underlying array of those // classes varies, the interpretation of "length" is defined by child classes. // The class represents the array for a 3by1D LUT and a 3D LUT or a matrix. -template class ArrayT : public ArrayBase +template class ArrayT : public ArrayBase { public: typedef std::vector Values; @@ -47,16 +47,14 @@ template class ArrayT : public ArrayBase { } - virtual ~ArrayT() - { - } + virtual ~ArrayT() {} - ArrayT(const ArrayT&) = default; - ArrayT& operator= (const ArrayT&) = default; + ArrayT(const ArrayT &) = default; + ArrayT & operator=(const ArrayT &) = default; virtual void resize(unsigned long length, unsigned long numColorComponents) { - m_length = length; + m_length = length; m_numColorComponents = numColorComponents; m_data.resize(getNumValues()); } @@ -70,20 +68,11 @@ template class ArrayT : public ArrayBase } } - void setDoubleValue(unsigned long index, double value) override - { - m_data[index] = (T)value; - } + void setDoubleValue(unsigned long index, double value) override { m_data[index] = (T)value; } - double getDoubleValue(unsigned long index) override - { - return double(m_data[index]); - } + double getDoubleValue(unsigned long index) override { return double(m_data[index]); } - unsigned long getLength() const override - { - return m_length; - } + unsigned long getLength() const override { return m_length; } void setMaxColorComponents() { @@ -94,10 +83,7 @@ template class ArrayT : public ArrayBase } } - unsigned long getNumColorComponents() const override - { - return m_numColorComponents; - } + unsigned long getNumColorComponents() const override { return m_numColorComponents; } void setNumColorComponents(unsigned long numColorComponents) { @@ -115,9 +101,8 @@ template class ArrayT : public ArrayBase bool sameCoeff = true; for (unsigned long idx = 0; idx < m_length && sameCoeff; ++idx) { - if (IsNan(m_data[idx * 3]) && - IsNan(m_data[idx * 3 + 1]) && - IsNan(m_data[idx * 3 + 2])) + if (IsNan(m_data[idx * 3]) && IsNan(m_data[idx * 3 + 1]) + && IsNan(m_data[idx * 3 + 2])) { continue; } @@ -131,35 +116,20 @@ template class ArrayT : public ArrayBase if (sameCoeff) { - m_numColorComponents = 1; // But keep the three values... + m_numColorComponents = 1; // But keep the three values... } } } - unsigned long getMaxColorComponents() const - { - return 3; - } + unsigned long getMaxColorComponents() const { return 3; } - inline const Values& getValues() const - { - return m_data; - } + inline const Values & getValues() const { return m_data; } - inline Values& getValues() - { - return m_data; - } + inline Values & getValues() { return m_data; } - inline const T& operator[](unsigned long index) const - { - return m_data[index]; - } + inline const T & operator[](unsigned long index) const { return m_data[index]; } - inline T& operator[](unsigned long index) - { - return m_data[index]; - } + inline T & operator[](unsigned long index) { return m_data[index]; } virtual void validate() const { @@ -181,10 +151,10 @@ template class ArrayT : public ArrayBase bool operator==(const ArrayT & a) const { - if (this == &a) return true; - return (m_length == a.m_length) - && (m_numColorComponents == a.m_numColorComponents) - && (m_data == a.m_data); + if (this == &a) + return true; + return (m_length == a.m_length) && (m_numColorComponents == a.m_numColorComponents) + && (m_data == a.m_data); } void scale(T scale) @@ -202,7 +172,7 @@ template class ArrayT : public ArrayBase protected: unsigned long m_length; unsigned long m_numColorComponents; - Values m_data; + Values m_data; }; typedef ArrayT ArrayDouble; diff --git a/src/OpenColorIO/ops/OpTools.cpp b/src/OpenColorIO/ops/OpTools.cpp index 57833a1cea..872406a487 100644 --- a/src/OpenColorIO/ops/OpTools.cpp +++ b/src/OpenColorIO/ops/OpTools.cpp @@ -8,16 +8,13 @@ namespace OCIO_NAMESPACE { -void EvalTransform(const float * in, - float * out, - long numPixels, - OpRcPtrVec & ops) +void EvalTransform(const float * in, float * out, long numPixels, OpRcPtrVec & ops) { std::vector tmp(numPixels * 4); // Render the LUT entries (domain) through the ops. const float * values = in; - for (long idx = 0; idxapply(&tmp[0], &tmp[0], numPixels); } float * result = out; - for (long idx = 0; idx= 2) + if (data.vars.size() >= 2) { - for(int i=0; i<3; ++i) + for (int i = 0; i < 3; ++i) { oldmin[i] = data.vars[0]; oldmax[i] = data.vars[1]; @@ -62,14 +60,14 @@ void CreateAllocationOps(OpRcPtrVec & ops, } case ALLOCATION_LG2: { - double oldmin[4] = { -10.0, -10.0, -10.0, 0.0 }; - double oldmax[4] = { 6.0, 6.0, 6.0, 1.0 }; - double newmin[4] = { 0.0, 0.0, 0.0, 0.0 }; - double newmax[4] = { 1.0, 1.0, 1.0, 1.0 }; + double oldmin[4] = {-10.0, -10.0, -10.0, 0.0}; + double oldmax[4] = {6.0, 6.0, 6.0, 1.0}; + double newmin[4] = {0.0, 0.0, 0.0, 0.0}; + double newmax[4] = {1.0, 1.0, 1.0, 1.0}; - if(data.vars.size() >= 2) + if (data.vars.size() >= 2) { - for(int i=0; i<3; ++i) + for (int i = 0; i < 3; ++i) { oldmin[i] = data.vars[0]; oldmax[i] = data.vars[1]; @@ -79,15 +77,15 @@ void CreateAllocationOps(OpRcPtrVec & ops, // Log Settings. // output = logSlope * log( linSlope * input + linOffset, base ) + logOffset - double base = 2.0; - double logSlope[3] = { 1.0, 1.0, 1.0 }; - double linSlope[3] = { 1.0, 1.0, 1.0 }; - double linOffset[3] = { 0.0, 0.0, 0.0 }; - double logOffset[3] = { 0.0, 0.0, 0.0 }; + double base = 2.0; + double logSlope[3] = {1.0, 1.0, 1.0}; + double linSlope[3] = {1.0, 1.0, 1.0}; + double linOffset[3] = {0.0, 0.0, 0.0}; + double logOffset[3] = {0.0, 0.0, 0.0}; - if(data.vars.size() >= 3) + if (data.vars.size() >= 3) { - for(int i=0; i<3; ++i) + for (int i = 0; i < 3; ++i) { linOffset[i] = data.vars[2]; } @@ -108,7 +106,7 @@ void CreateAllocationOps(OpRcPtrVec & ops, break; } } - + break; } case ALLOCATION_UNKNOWN: diff --git a/src/OpenColorIO/ops/allocation/AllocationOp.h b/src/OpenColorIO/ops/allocation/AllocationOp.h index edc3303d6c..52987a7bf3 100644 --- a/src/OpenColorIO/ops/allocation/AllocationOp.h +++ b/src/OpenColorIO/ops/allocation/AllocationOp.h @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_ALLOCATIONOP_H #define INCLUDED_OCIO_ALLOCATIONOP_H @@ -16,20 +15,17 @@ struct AllocationData Allocation allocation; std::vector vars; - AllocationData(): - allocation(ALLOCATION_UNIFORM) - {}; + AllocationData() + : allocation(ALLOCATION_UNIFORM){}; std::string getCacheID() const; }; -std::ostream& operator<< (std::ostream&, const AllocationData&); +std::ostream & operator<<(std::ostream &, const AllocationData &); void CreateGpuAllocationNoOp(OpRcPtrVec & ops, const AllocationData & allocationData); -void CreateAllocationOps(OpRcPtrVec & ops, - const AllocationData & data, - TransformDirection dir); +void CreateAllocationOps(OpRcPtrVec & ops, const AllocationData & data, TransformDirection dir); } // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/ops/cdl/CDLOp.cpp b/src/OpenColorIO/ops/cdl/CDLOp.cpp index bd0511ea43..86077c4ed6 100644 --- a/src/OpenColorIO/ops/cdl/CDLOp.cpp +++ b/src/OpenColorIO/ops/cdl/CDLOp.cpp @@ -57,9 +57,8 @@ class CDLOp : public Op CDLOpDataRcPtr cdlData() { return DynamicPtrCast(data()); } }; - CDLOp::CDLOp(CDLOpDataRcPtr & cdl) - : Op() + : Op() { data() = cdl; } @@ -93,7 +92,8 @@ bool CDLOp::isSameType(ConstOpRcPtr & op) const bool CDLOp::isInverse(ConstOpRcPtr & op) const { ConstCDLOpRcPtr typedRcPtr = DynamicPtrCast(op); - if(!typedRcPtr) return false; + if (!typedRcPtr) + return false; ConstCDLOpDataRcPtr cdlData2 = typedRcPtr->cdlData(); return cdlData()->isInverse(cdlData2); @@ -108,7 +108,7 @@ bool CDLOp::canCombineWith(ConstOpRcPtr & /*op*/) const void CDLOp::combineWith(OpRcPtrVec & /*ops*/, ConstOpRcPtr & secondOp) const { - if(!canCombineWith(secondOp)) + if (!canCombineWith(secondOp)) { throw Exception("CDLOp: canCombineWith must be checked before calling combineWith."); } @@ -139,37 +139,31 @@ void CDLOp::extractGpuShaderInfo(GpuShaderCreatorRcPtr & shaderCreator) const GetCDLGPUShaderProgram(shaderCreator, data); } -} // Anon namespace - - - +} // namespace /////////////////////////////////////////////////////////////////////////// - - -void CreateCDLOp(OpRcPtrVec & ops, - CDLOpData::Style style, - const double * slope3, - const double * offset3, - const double * power3, - double saturation, - TransformDirection direction) +void CreateCDLOp( + OpRcPtrVec & ops, + CDLOpData::Style style, + const double * slope3, + const double * offset3, + const double * power3, + double saturation, + TransformDirection direction) { - CDLOpDataRcPtr cdlData( - new CDLOpData(style, - CDLOpData::ChannelParams(slope3[0], slope3[1], slope3[2]), - CDLOpData::ChannelParams(offset3[0], offset3[1], offset3[2]), - CDLOpData::ChannelParams(power3[0], power3[1], power3[2]), - saturation) ); + CDLOpDataRcPtr cdlData(new CDLOpData( + style, + CDLOpData::ChannelParams(slope3[0], slope3[1], slope3[2]), + CDLOpData::ChannelParams(offset3[0], offset3[1], offset3[2]), + CDLOpData::ChannelParams(power3[0], power3[1], power3[2]), + saturation)); CreateCDLOp(ops, cdlData, direction); } -void CreateCDLOp(OpRcPtrVec & ops, - CDLOpDataRcPtr & cdlData, - TransformDirection direction) +void CreateCDLOp(OpRcPtrVec & ops, CDLOpDataRcPtr & cdlData, TransformDirection direction) { auto cdl = cdlData; if (direction == TRANSFORM_DIR_INVERSE) @@ -190,66 +184,67 @@ void CreateCDLTransform(GroupTransformRcPtr & group, ConstOpRcPtr & op) throw Exception("CreateCDLTransform: op has to be a CDLOp"); } const auto cdlData = DynamicPtrCast(cdl->data()); - auto cdlTransform = CDLTransform::Create(); - auto & data = dynamic_cast(cdlTransform.get())->data(); + auto cdlTransform = CDLTransform::Create(); + auto & data = dynamic_cast(cdlTransform.get())->data(); data = *cdlData; group->appendTransform(cdlTransform); } -void BuildCDLOp(OpRcPtrVec & ops, - const Config & config, - const CDLTransform & cdlTransform, - TransformDirection dir) +void BuildCDLOp( + OpRcPtrVec & ops, + const Config & config, + const CDLTransform & cdlTransform, + TransformDirection dir) { if (config.getMajorVersion() == 1) { const auto combinedDir = CombineTransformDirections(dir, cdlTransform.getDirection()); - double slope4[] = { 1.0, 1.0, 1.0, 1.0 }; + double slope4[] = {1.0, 1.0, 1.0, 1.0}; cdlTransform.getSlope(slope4); - double offset4[] = { 0.0, 0.0, 0.0, 0.0 }; + double offset4[] = {0.0, 0.0, 0.0, 0.0}; cdlTransform.getOffset(offset4); - double power4[] = { 1.0, 1.0, 1.0, 1.0 }; + double power4[] = {1.0, 1.0, 1.0, 1.0}; cdlTransform.getPower(power4); - double lumaCoef3[] = { 1.0, 1.0, 1.0 }; + double lumaCoef3[] = {1.0, 1.0, 1.0}; cdlTransform.getSatLumaCoefs(lumaCoef3); double sat = cdlTransform.getSat(); switch (combinedDir) { - case TRANSFORM_DIR_FORWARD: - { - // 1) Scale + Offset - CreateScaleOffsetOp(ops, slope4, offset4, TRANSFORM_DIR_FORWARD); - - // 2) Power + Clamp at 0 (NB: This is not in accord with the - // ASC v1.2 spec since it also requires clamping at 1.) - CreateExponentOp(ops, power4, TRANSFORM_DIR_FORWARD); - - // 3) Saturation (NB: Does not clamp at 0 and 1 - // as per ASC v1.2 spec) - CreateSaturationOp(ops, sat, lumaCoef3, TRANSFORM_DIR_FORWARD); - break; - } - case TRANSFORM_DIR_INVERSE: - { - // 3) Saturation (NB: Does not clamp at 0 and 1 - // as per ASC v1.2 spec) - CreateSaturationOp(ops, sat, lumaCoef3, TRANSFORM_DIR_INVERSE); - - // 2) Power + Clamp at 0 (NB: This is not in accord with the - // ASC v1.2 spec since it also requires clamping at 1.) - CreateExponentOp(ops, power4, TRANSFORM_DIR_INVERSE); - - // 1) Scale + Offset - CreateScaleOffsetOp(ops, slope4, offset4, TRANSFORM_DIR_INVERSE); - break; - } + case TRANSFORM_DIR_FORWARD: + { + // 1) Scale + Offset + CreateScaleOffsetOp(ops, slope4, offset4, TRANSFORM_DIR_FORWARD); + + // 2) Power + Clamp at 0 (NB: This is not in accord with the + // ASC v1.2 spec since it also requires clamping at 1.) + CreateExponentOp(ops, power4, TRANSFORM_DIR_FORWARD); + + // 3) Saturation (NB: Does not clamp at 0 and 1 + // as per ASC v1.2 spec) + CreateSaturationOp(ops, sat, lumaCoef3, TRANSFORM_DIR_FORWARD); + break; + } + case TRANSFORM_DIR_INVERSE: + { + // 3) Saturation (NB: Does not clamp at 0 and 1 + // as per ASC v1.2 spec) + CreateSaturationOp(ops, sat, lumaCoef3, TRANSFORM_DIR_INVERSE); + + // 2) Power + Clamp at 0 (NB: This is not in accord with the + // ASC v1.2 spec since it also requires clamping at 1.) + CreateExponentOp(ops, power4, TRANSFORM_DIR_INVERSE); + + // 1) Scale + Offset + CreateScaleOffsetOp(ops, slope4, offset4, TRANSFORM_DIR_INVERSE); + break; + } } } else @@ -265,4 +260,3 @@ void BuildCDLOp(OpRcPtrVec & ops, } } // namespace OCIO_NAMESPACE - diff --git a/src/OpenColorIO/ops/cdl/CDLOp.h b/src/OpenColorIO/ops/cdl/CDLOp.h index 29681c3cee..0df7762eef 100644 --- a/src/OpenColorIO/ops/cdl/CDLOp.h +++ b/src/OpenColorIO/ops/cdl/CDLOp.h @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_CDL_H #define INCLUDED_OCIO_CDL_H @@ -12,24 +11,22 @@ #include "Op.h" #include "ops/cdl/CDLOpData.h" - namespace OCIO_NAMESPACE { // Create a CDL op from its parameters and append it to ops. -void CreateCDLOp(OpRcPtrVec & ops, - const FormatMetadataImpl & info, - CDLOpData::Style style, - const double * slope3, - const double * offset3, - const double * power3, - double saturation, - TransformDirection direction); +void CreateCDLOp( + OpRcPtrVec & ops, + const FormatMetadataImpl & info, + CDLOpData::Style style, + const double * slope3, + const double * offset3, + const double * power3, + double saturation, + TransformDirection direction); // Create a CDL op from the CDL OpData and append it to ops. FormatMetadata is preserved. -void CreateCDLOp(OpRcPtrVec & ops, - CDLOpDataRcPtr & cdlData, - TransformDirection direction); +void CreateCDLOp(OpRcPtrVec & ops, CDLOpDataRcPtr & cdlData, TransformDirection direction); // Create a copy of the CDL transform in the op and append it to the GroupTransform. void CreateCDLTransform(GroupTransformRcPtr & group, ConstOpRcPtr & op); diff --git a/src/OpenColorIO/ops/cdl/CDLOpCPU.cpp b/src/OpenColorIO/ops/cdl/CDLOpCPU.cpp index 982e992f14..06aa0b0427 100644 --- a/src/OpenColorIO/ops/cdl/CDLOpCPU.cpp +++ b/src/OpenColorIO/ops/cdl/CDLOpCPU.cpp @@ -11,7 +11,6 @@ #include "CDLOpCPU.h" #include "SSE.h" - namespace OCIO_NAMESPACE { @@ -24,9 +23,9 @@ inline float Reciprocal(float x) RenderParams::RenderParams() { - setSlope (1.0f, 1.0f, 1.0f); + setSlope(1.0f, 1.0f, 1.0f); setOffset(0.0f, 0.0f, 0.0f); - setPower (1.0f, 1.0f, 1.0f); + setPower(1.0f, 1.0f, 1.0f); setSaturation(1.0f); } @@ -66,7 +65,7 @@ void RenderParams::update(ConstCDLOpDataRcPtr & cdl) cdl->getOffsetParams().getRGB(offset); cdl->getPowerParams().getRGB(power); - const float saturation = (float)cdl->getSaturation(); + const float saturation = (float)cdl->getSaturation(); const CDLOpData::Style style = cdl->getStyle(); m_isReverse = (style == CDLOpData::CDL_V1_2_REV) || (style == CDLOpData::CDL_NO_CLAMP_REV); @@ -76,15 +75,17 @@ void RenderParams::update(ConstCDLOpDataRcPtr & cdl) if (isReverse()) { // Reverse render parameters - setSlope(Reciprocal((float)slope[0]), - Reciprocal((float)slope[1]), - Reciprocal((float)slope[2])); + setSlope( + Reciprocal((float)slope[0]), + Reciprocal((float)slope[1]), + Reciprocal((float)slope[2])); setOffset((float)-offset[0], (float)-offset[1], (float)-offset[2]); - setPower(Reciprocal((float)power[0]), - Reciprocal((float)power[1]), - Reciprocal((float)power[2])); + setPower( + Reciprocal((float)power[0]), + Reciprocal((float)power[1]), + Reciprocal((float)power[2])); setSaturation(Reciprocal(saturation)); } @@ -98,7 +99,6 @@ void RenderParams::update(ConstCDLOpDataRcPtr & cdl) } } - #if OCIO_USE_SSE2 static const __m128 LumaWeights = _mm_setr_ps(0.2126f, 0.7152f, 0.0722f, 0.0); @@ -121,14 +121,12 @@ inline void StorePixel(float * rgbaBuffer, const __m128 pix, const float outAlph // When the template argument is true, the clamp mode is used, // and the values in pix are clamped to the range [0,1]. When // the argument is false, nothing is done. -template -inline void ApplyClamp(__m128& pix) +template inline void ApplyClamp(__m128 & pix) { pix = _mm_min_ps(_mm_max_ps(pix, EZERO), EONE); } -template<> -inline void ApplyClamp(__m128&) +template <> inline void ApplyClamp(__m128 &) { } @@ -139,32 +137,30 @@ inline void ApplyClamp(__m128&) // not clamped before the power operation is applied. When the // base is negative in this mode, pixel values are just passed // through. -template -inline void ApplyPower(__m128& pix, const __m128& power) +template inline void ApplyPower(__m128 & pix, const __m128 & power) { ApplyClamp(pix); pix = ssePower(pix, power); } -template<> -inline void ApplyPower(__m128& pix, const __m128& power) +template <> inline void ApplyPower(__m128 & pix, const __m128 & power) { - __m128 negMask = _mm_cmplt_ps(pix, EZERO); + __m128 negMask = _mm_cmplt_ps(pix, EZERO); __m128 pixPower = ssePower(pix, power); - pix = sseSelect(negMask, pix, pixPower); + pix = sseSelect(negMask, pix, pixPower); } // Apply the saturation component to the the pixel's values -inline void ApplySaturation(__m128& pix, const __m128 saturation) +inline void ApplySaturation(__m128 & pix, const __m128 saturation) { // Compute luma: dot product of pixel values and the luma weights __m128 luma = _mm_mul_ps(pix, LumaWeights); // luma = [ x+y , y+x , z+w , w+z ] - luma = _mm_add_ps(luma, _mm_shuffle_ps(luma, luma, _MM_SHUFFLE(2,3,0,1))); + luma = _mm_add_ps(luma, _mm_shuffle_ps(luma, luma, _MM_SHUFFLE(2, 3, 0, 1))); // luma = [ x+y+z+w , y+x+w+z , z+w+x+y , w+z+y+x ] - luma = _mm_add_ps(luma, _mm_shuffle_ps(luma, luma, _MM_SHUFFLE(1,0,3,2))); + luma = _mm_add_ps(luma, _mm_shuffle_ps(luma, luma, _MM_SHUFFLE(1, 0, 3, 2))); // Apply saturation pix = _mm_add_ps(luma, _mm_mul_ps(saturation, _mm_sub_ps(pix, luma))); @@ -198,9 +194,9 @@ inline void ApplyOffset(float * pix, const float * offset) // Apply the saturation component to the the pixel's values inline void ApplySaturation(float * pix, const float saturation) { - const float srcpix[3] = { pix[0], pix[1], pix[2] }; + const float srcpix[3] = {pix[0], pix[1], pix[2]}; - static const float LumaWeights[3] = { 0.2126f, 0.7152f, 0.0722f }; + static const float LumaWeights[3] = {0.2126f, 0.7152f, 0.0722f}; // Compute luma: dot product of pixel values and the luma weights ApplySlope(pix, LumaWeights); @@ -218,8 +214,7 @@ inline void ApplySaturation(float * pix, const float saturation) // When the template argument is true, the clamp mode is used, // and the values in pix are clamped to the range [0,1]. When // the argument is false, nothing is done. -template -inline void ApplyClamp(float * pix) +template inline void ApplyClamp(float * pix) { // NaNs become 0. pix[0] = Clamp(pix[0], 0.f, 1.f); @@ -227,8 +222,7 @@ inline void ApplyClamp(float * pix) pix[2] = Clamp(pix[2], 0.f, 1.f); } -template<> -inline void ApplyClamp(float *) +template <> inline void ApplyClamp(float *) { } @@ -239,8 +233,7 @@ inline void ApplyClamp(float *) // not clamped before the power operation is applied. When the // base is negative in this mode, pixel values are just passed // through. -template -inline void ApplyPower(float * pix, const float * power) +template inline void ApplyPower(float * pix, const float * power) { ApplyClamp(pix); pix[0] = powf(pix[0], power[0]); @@ -248,13 +241,12 @@ inline void ApplyPower(float * pix, const float * power) pix[2] = powf(pix[2], power[2]); } -template<> -inline void ApplyPower(float * pix, const float * power) +template <> inline void ApplyPower(float * pix, const float * power) { // Note: Set NaNs to 0 to match the SSE path. - pix[0] = IsNan(pix[0]) ? 0.0f : (pix[0]<0.f ? pix[0] : powf(pix[0], power[0])); - pix[1] = IsNan(pix[1]) ? 0.0f : (pix[1]<0.f ? pix[1] : powf(pix[1], power[1])); - pix[2] = IsNan(pix[2]) ? 0.0f : (pix[2]<0.f ? pix[2] : powf(pix[2], power[2])); + pix[0] = IsNan(pix[0]) ? 0.0f : (pix[0] < 0.f ? pix[0] : powf(pix[0], power[0])); + pix[1] = IsNan(pix[1]) ? 0.0f : (pix[1] < 0.f ? pix[1] : powf(pix[1], power[1])); + pix[2] = IsNan(pix[2]) ? 0.0f : (pix[2] < 0.f ? pix[2] : powf(pix[2], power[2])); } class CDLOpCPU; @@ -271,8 +263,7 @@ class CDLOpCPU : public OpCPU RenderParams m_renderParams; }; -template -class CDLRendererFwd : public CDLOpCPU +template class CDLRendererFwd : public CDLOpCPU { public: CDLRendererFwd(ConstCDLOpDataRcPtr & cdl) @@ -284,8 +275,7 @@ class CDLRendererFwd : public CDLOpCPU }; #if OCIO_USE_SSE2 -template -class CDLRendererFwdSSE : public CDLRendererFwd +template class CDLRendererFwdSSE : public CDLRendererFwd { public: CDLRendererFwdSSE(ConstCDLOpDataRcPtr & cdl) @@ -297,8 +287,7 @@ class CDLRendererFwdSSE : public CDLRendererFwd }; #endif -template -class CDLRendererRev : public CDLOpCPU +template class CDLRendererRev : public CDLOpCPU { public: CDLRendererRev(ConstCDLOpDataRcPtr & cdl) @@ -310,8 +299,7 @@ class CDLRendererRev : public CDLOpCPU }; #if OCIO_USE_SSE2 -template -class CDLRendererRevSSE : public CDLRendererRev +template class CDLRendererRevSSE : public CDLRendererRev { public: CDLRendererRevSSE(ConstCDLOpDataRcPtr & cdl) @@ -324,17 +312,18 @@ class CDLRendererRevSSE : public CDLRendererRev #endif CDLOpCPU::CDLOpCPU(ConstCDLOpDataRcPtr & cdl) - : OpCPU() + : OpCPU() { m_renderParams.update(cdl); } #if OCIO_USE_SSE2 -void LoadRenderParams(const RenderParams & renderParams, - __m128 & slope, - __m128 & offset, - __m128 & power, - __m128 & saturation) +void LoadRenderParams( + const RenderParams & renderParams, + __m128 & slope, + __m128 & offset, + __m128 & power, + __m128 & saturation) { slope = _mm_loadu_ps(renderParams.getSlope()); offset = _mm_loadu_ps(renderParams.getOffset()); @@ -344,7 +333,7 @@ void LoadRenderParams(const RenderParams & renderParams, #endif #if OCIO_USE_SSE2 -template +template void CDLRendererFwdSSE::apply(const void * inImg, void * outImg, long numPixels) const { __m128 slope, offset, power, saturation, pix; @@ -353,9 +342,9 @@ void CDLRendererFwdSSE::apply(const void * inImg, void * outImg, long num float inAlpha; const float * in = (const float *)inImg; - float * out = (float *)outImg; + float * out = (float *)outImg; - for(long idx=0; idx::apply(const void * inImg, void * outImg, long num StorePixel(out, pix, inAlpha); - in += 4; + in += 4; out += 4; } } #endif -template +template void CDLRendererFwd::apply(const void * inImg, void * outImg, long numPixels) const { const float * in = (const float *)inImg; - float * out = (float *)outImg; + float * out = (float *)outImg; const float * slope = m_renderParams.getSlope(); - float inSlope[3] = {slope[0], slope[1], slope[2]}; + float inSlope[3] = {slope[0], slope[1], slope[2]}; - for (long idx = 0; idx::apply(const void * inImg, void * outImg, long numPix out[3] = inAlpha; - in += 4; + in += 4; out += 4; } } #if OCIO_USE_SSE2 -template +template void CDLRendererRevSSE::apply(const void * inImg, void * outImg, long numPixels) const { __m128 slopeRev, offsetRev, powerRev, saturationRev, pix; @@ -416,9 +405,9 @@ void CDLRendererRevSSE::apply(const void * inImg, void * outImg, long num float inAlpha = 1.0f; const float * in = (const float *)inImg; - float * out = (float *)outImg; + float * out = (float *)outImg; - for(long idx=0; idx::apply(const void * inImg, void * outImg, long num StorePixel(out, pix, inAlpha); - in += 4; + in += 4; out += 4; } } #endif -template +template void CDLRendererRev::apply(const void * inImg, void * outImg, long numPixels) const { const float * in = (const float *)inImg; - float * out = (float *)outImg; + float * out = (float *)outImg; - for (long idx = 0; idx::apply(const void * inImg, void * outImg, long numPix out[3] = inAlpha; - in += 4; + in += 4; out += 4; } } @@ -475,29 +464,33 @@ ConstOpCPURcPtr GetCDLCPURenderer(ConstCDLOpDataRcPtr & cdl, bool fastPower) #if OCIO_USE_SSE2 == 0 std::ignore = fastPower; #endif - switch(cdl->getStyle()) + switch (cdl->getStyle()) { case CDLOpData::CDL_V1_2_FWD: #if OCIO_USE_SSE2 - if (fastPower) return std::make_shared>(cdl); + if (fastPower) + return std::make_shared>(cdl); else #endif return std::make_shared>(cdl); case CDLOpData::CDL_NO_CLAMP_FWD: #if OCIO_USE_SSE2 - if (fastPower) return std::make_shared>(cdl); + if (fastPower) + return std::make_shared>(cdl); else #endif return std::make_shared>(cdl); case CDLOpData::CDL_V1_2_REV: #if OCIO_USE_SSE2 - if (fastPower) return std::make_shared>(cdl); + if (fastPower) + return std::make_shared>(cdl); else #endif return std::make_shared>(cdl); case CDLOpData::CDL_NO_CLAMP_REV: #if OCIO_USE_SSE2 - if (fastPower) return std::make_shared>(cdl); + if (fastPower) + return std::make_shared>(cdl); else #endif return std::make_shared>(cdl); diff --git a/src/OpenColorIO/ops/cdl/CDLOpCPU.h b/src/OpenColorIO/ops/cdl/CDLOpCPU.h index f0d4ad44e6..9b1cc508f0 100644 --- a/src/OpenColorIO/ops/cdl/CDLOpCPU.h +++ b/src/OpenColorIO/ops/cdl/CDLOpCPU.h @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_CDLOP_CPU_H #define INCLUDED_OCIO_CDLOP_CPU_H @@ -10,7 +9,6 @@ #include "Op.h" #include "ops/cdl/CDLOpData.h" - namespace OCIO_NAMESPACE { @@ -49,11 +47,10 @@ struct RenderParams float m_offset[4]; float m_power[4]; float m_saturation; - bool m_isReverse{ false }; - bool m_isNoClamp{ false }; + bool m_isReverse{false}; + bool m_isNoClamp{false}; }; } // namespace OCIO_NAMESPACE - #endif diff --git a/src/OpenColorIO/ops/cdl/CDLOpData.cpp b/src/OpenColorIO/ops/cdl/CDLOpData.cpp index fa214be887..fd6c37485b 100644 --- a/src/OpenColorIO/ops/cdl/CDLOpData.cpp +++ b/src/OpenColorIO/ops/cdl/CDLOpData.cpp @@ -6,11 +6,10 @@ #include #include "BitDepthUtils.h" +#include "Platform.h" #include "ops/cdl/CDLOpData.h" #include "ops/matrix/MatrixOpData.h" #include "ops/range/RangeOpData.h" -#include "Platform.h" - namespace OCIO_NAMESPACE { @@ -20,32 +19,31 @@ namespace DefaultValues const int FLOAT_DECIMALS = 7; } - static const CDLOpData::ChannelParams kOneParams(1.0); static const CDLOpData::ChannelParams kZeroParams(0.0); // Original CTF styles: -static const char V1_2_FWD_NAME[] = "v1.2_Fwd"; -static const char V1_2_REV_NAME[] = "v1.2_Rev"; +static const char V1_2_FWD_NAME[] = "v1.2_Fwd"; +static const char V1_2_REV_NAME[] = "v1.2_Rev"; static const char NO_CLAMP_FWD_NAME[] = "noClampFwd"; static const char NO_CLAMP_REV_NAME[] = "noClampRev"; // CLF styles (also allowed now in CTF): -static const char V1_2_FWD_CLF_NAME[] = "Fwd"; -static const char V1_2_REV_CLF_NAME[] = "Rev"; +static const char V1_2_FWD_CLF_NAME[] = "Fwd"; +static const char V1_2_REV_CLF_NAME[] = "Rev"; static const char NO_CLAMP_FWD_CLF_NAME[] = "FwdNoClamp"; static const char NO_CLAMP_REV_CLF_NAME[] = "RevNoClamp"; -CDLOpData::Style CDLOpData::GetStyle(const char* name) +CDLOpData::Style CDLOpData::GetStyle(const char * name) { // Get the style enum of the CDL from the name stored // in the "name" variable. -#define RETURN_STYLE_FROM_NAME(CDL_STYLE_NAME, CDL_STYLE) \ -if( 0==Platform::Strcasecmp(name, CDL_STYLE_NAME) ) \ -{ \ -return CDL_STYLE; \ -} +#define RETURN_STYLE_FROM_NAME(CDL_STYLE_NAME, CDL_STYLE) \ + if (0 == Platform::Strcasecmp(name, CDL_STYLE_NAME)) \ + { \ + return CDL_STYLE; \ + } if (name && *name) { @@ -70,16 +68,19 @@ const char * CDLOpData::GetStyleName(CDLOpData::Style style) // in the "style" variable. switch (style) { - case CDL_V1_2_FWD: return V1_2_FWD_CLF_NAME; - case CDL_V1_2_REV: return V1_2_REV_CLF_NAME; - case CDL_NO_CLAMP_FWD: return NO_CLAMP_FWD_CLF_NAME; - case CDL_NO_CLAMP_REV: return NO_CLAMP_REV_CLF_NAME; + case CDL_V1_2_FWD: + return V1_2_FWD_CLF_NAME; + case CDL_V1_2_REV: + return V1_2_REV_CLF_NAME; + case CDL_NO_CLAMP_FWD: + return NO_CLAMP_FWD_CLF_NAME; + case CDL_NO_CLAMP_REV: + return NO_CLAMP_REV_CLF_NAME; } throw Exception("Unknown style for CDL."); } - // Combine the Transform style and direction into the internal OpData style. CDLOpData::Style CDLOpData::ConvertStyle(CDLStyle style, TransformDirection dir) { @@ -87,16 +88,14 @@ CDLOpData::Style CDLOpData::ConvertStyle(CDLStyle style, TransformDirection dir) switch (style) { - case CDL_ASC: - { - return isForward ? CDLOpData::CDL_V1_2_FWD : - CDLOpData::CDL_V1_2_REV; - } - case CDL_NO_CLAMP: - { - return isForward ? CDLOpData::CDL_NO_CLAMP_FWD : - CDLOpData::CDL_NO_CLAMP_REV; - } + case CDL_ASC: + { + return isForward ? CDLOpData::CDL_V1_2_FWD : CDLOpData::CDL_V1_2_REV; + } + case CDL_NO_CLAMP: + { + return isForward ? CDLOpData::CDL_NO_CLAMP_FWD : CDLOpData::CDL_NO_CLAMP_REV; + } } std::stringstream ss("Unknown CDL transform style: "); @@ -110,12 +109,12 @@ CDLStyle CDLOpData::ConvertStyle(CDLOpData::Style style) { switch (style) { - case CDL_V1_2_FWD: - case CDL_V1_2_REV: - return CDL_ASC; - case CDL_NO_CLAMP_FWD: - case CDL_NO_CLAMP_REV: - return CDL_NO_CLAMP; + case CDL_V1_2_FWD: + case CDL_V1_2_REV: + return CDL_ASC; + case CDL_NO_CLAMP_FWD: + case CDL_NO_CLAMP_REV: + return CDL_NO_CLAMP; } std::stringstream ss("Unknown CDL style: "); @@ -125,26 +124,27 @@ CDLStyle CDLOpData::ConvertStyle(CDLOpData::Style style) } CDLOpData::CDLOpData() - : OpData() - , m_style(GetDefaultStyle()) - , m_slopeParams(1.0) - , m_offsetParams(0.0) - , m_powerParams(1.0) - , m_saturation(1.0) -{ -} - -CDLOpData::CDLOpData(const CDLOpData::Style & style, - const ChannelParams & slopeParams, - const ChannelParams & offsetParams, - const ChannelParams & powerParams, - const double saturation) - : OpData() - , m_style(style) - , m_slopeParams(slopeParams) - , m_offsetParams(offsetParams) - , m_powerParams(powerParams) - , m_saturation(saturation) + : OpData() + , m_style(GetDefaultStyle()) + , m_slopeParams(1.0) + , m_offsetParams(0.0) + , m_powerParams(1.0) + , m_saturation(1.0) +{ +} + +CDLOpData::CDLOpData( + const CDLOpData::Style & style, + const ChannelParams & slopeParams, + const ChannelParams & offsetParams, + const ChannelParams & powerParams, + const double saturation) + : OpData() + , m_style(style) + , m_slopeParams(slopeParams) + , m_offsetParams(offsetParams) + , m_powerParams(powerParams) + , m_saturation(saturation) { validate(); } @@ -158,17 +158,16 @@ CDLOpDataRcPtr CDLOpData::clone() const return std::make_shared(*this); } -bool CDLOpData::equals(const OpData& other) const +bool CDLOpData::equals(const OpData & other) const { - if (!OpData::equals(other)) return false; + if (!OpData::equals(other)) + return false; - const CDLOpData* cdl = static_cast(&other); + const CDLOpData * cdl = static_cast(&other); - return m_style == cdl->m_style - && m_slopeParams == cdl->m_slopeParams - && m_offsetParams == cdl->m_offsetParams - && m_powerParams == cdl->m_powerParams - && m_saturation == cdl->m_saturation; + return m_style == cdl->m_style && m_slopeParams == cdl->m_slopeParams + && m_offsetParams == cdl->m_offsetParams && m_powerParams == cdl->m_powerParams + && m_saturation == cdl->m_saturation; } void CDLOpData::setStyle(CDLOpData::Style style) @@ -180,12 +179,12 @@ TransformDirection CDLOpData::getDirection() const noexcept { switch (m_style) { - case CDL_V1_2_FWD: - case CDL_NO_CLAMP_FWD: - return TRANSFORM_DIR_FORWARD; - case CDL_V1_2_REV: - case CDL_NO_CLAMP_REV: - return TRANSFORM_DIR_INVERSE; + case CDL_V1_2_FWD: + case CDL_NO_CLAMP_FWD: + return TRANSFORM_DIR_FORWARD; + case CDL_V1_2_REV: + case CDL_NO_CLAMP_REV: + return TRANSFORM_DIR_INVERSE; } return TRANSFORM_DIR_FORWARD; } @@ -219,9 +218,7 @@ void CDLOpData::setSaturation(const double saturation) } // Validate if a parameter is greater than or equal to threshold value. -void validateGreaterEqual(const char * name, - const double value, - const double threshold) +void validateGreaterEqual(const char * name, const double value, const double threshold) { if (!(value >= threshold)) { @@ -236,9 +233,7 @@ void validateGreaterEqual(const char * name, } // Validate if a parameter is greater than a threshold value. -void validateGreaterThan(const char * name, - const double value, - const double threshold) +void validateGreaterThan(const char * name, const double value, const double threshold) { if (!(value > threshold)) { @@ -252,14 +247,13 @@ void validateGreaterThan(const char * name, } } -typedef void(*parameter_validation_function)(const char *, - const double, - const double); +typedef void (*parameter_validation_function)(const char *, const double, const double); -template -void validateChannelParams(const char * name, - const CDLOpData::ChannelParams& params, - double threshold) +template +void validateChannelParams( + const char * name, + const CDLOpData::ChannelParams & params, + double threshold) { for (unsigned i = 0; i < 3; ++i) { @@ -270,9 +264,10 @@ void validateChannelParams(const char * name, // Validate number of SOP parameters and saturation. // The ASC v1.2 spec 2009-05-04 places the following restrictions: // slope >= 0, power > 0, sat >= 0, (offset unbounded). -void validateParams(const CDLOpData::ChannelParams& slopeParams, - const CDLOpData::ChannelParams& powerParams, - const double saturation) +void validateParams( + const CDLOpData::ChannelParams & slopeParams, + const CDLOpData::ChannelParams & powerParams, + const double saturation) { // slope >= 0 validateChannelParams("slope", slopeParams, 0.0); @@ -286,22 +281,19 @@ void validateParams(const CDLOpData::ChannelParams& slopeParams, bool CDLOpData::isNoOp() const { - return isIdentity() - && !isClamping(); + return isIdentity() && !isClamping(); } bool CDLOpData::isIdentity() const { - return m_slopeParams == kOneParams && - m_offsetParams == kZeroParams && - m_powerParams == kOneParams && - m_saturation == 1.0; + return m_slopeParams == kOneParams && m_offsetParams == kZeroParams + && m_powerParams == kOneParams && m_saturation == 1.0; } OpDataRcPtr CDLOpData::getIdentityReplacement() const { OpDataRcPtr op; - switch(getStyle()) + switch (getStyle()) { // These clamp values -- replace with range. case CDL_V1_2_FWD: @@ -334,16 +326,16 @@ void CDLOpData::getSimplerReplacement(OpDataVec & tmpops) const // combine with other ones. // Slope + offset. - double scale4[4]{ 1.0 }; + double scale4[4]{1.0}; getSlopeParams().getRGB(scale4); - double m44[16]{ 0.0 }; - m44[0] = scale4[0]; - m44[5] = scale4[1]; + double m44[16]{0.0}; + m44[0] = scale4[0]; + m44[5] = scale4[1]; m44[10] = scale4[2]; m44[15] = 1.0; - double offset4[4]{ 0.0 }; + double offset4[4]{0.0}; getOffsetParams().getRGB(offset4); offset4[3] = 0.; @@ -365,7 +357,7 @@ void CDLOpData::getSimplerReplacement(OpDataVec & tmpops) const tmpops.push_back(range); } - static constexpr double lumaCoef3[3]{ 0.2126, 0.7152, 0.0722 }; + static constexpr double lumaCoef3[3]{0.2126, 0.7152, 0.0722}; double matrix[16]; double offsetSat[4]; @@ -431,10 +423,14 @@ bool CDLOpData::isReverse() const const CDLOpData::Style style = getStyle(); switch (style) { - case CDLOpData::CDL_V1_2_FWD: return false; - case CDLOpData::CDL_V1_2_REV: return true; - case CDLOpData::CDL_NO_CLAMP_FWD: return false; - case CDLOpData::CDL_NO_CLAMP_REV: return true; + case CDLOpData::CDL_V1_2_FWD: + return false; + case CDLOpData::CDL_V1_2_REV: + return true; + case CDLOpData::CDL_NO_CLAMP_FWD: + return false; + case CDLOpData::CDL_NO_CLAMP_REV: + return true; } return false; } @@ -444,10 +440,14 @@ bool CDLOpData::isClamping() const const CDLOpData::Style style = getStyle(); switch (style) { - case CDLOpData::CDL_V1_2_FWD: return true; - case CDLOpData::CDL_V1_2_REV: return true; - case CDLOpData::CDL_NO_CLAMP_FWD: return false; - case CDLOpData::CDL_NO_CLAMP_REV: return false; + case CDLOpData::CDL_V1_2_FWD: + return true; + case CDLOpData::CDL_V1_2_REV: + return true; + case CDLOpData::CDL_NO_CLAMP_FWD: + return false; + case CDLOpData::CDL_NO_CLAMP_REV: + return false; } return false; } @@ -471,10 +471,18 @@ void CDLOpData::invert() noexcept { switch (m_style) { - case CDL_V1_2_FWD: setStyle(CDL_V1_2_REV); break; - case CDL_V1_2_REV: setStyle(CDL_V1_2_FWD); break; - case CDL_NO_CLAMP_FWD: setStyle(CDL_NO_CLAMP_REV); break; - case CDL_NO_CLAMP_REV: setStyle(CDL_NO_CLAMP_FWD); break; + case CDL_V1_2_FWD: + setStyle(CDL_V1_2_REV); + break; + case CDL_V1_2_REV: + setStyle(CDL_V1_2_FWD); + break; + case CDL_NO_CLAMP_FWD: + setStyle(CDL_NO_CLAMP_REV); + break; + case CDL_NO_CLAMP_REV: + setStyle(CDL_NO_CLAMP_FWD); + break; } } diff --git a/src/OpenColorIO/ops/cdl/CDLOpData.h b/src/OpenColorIO/ops/cdl/CDLOpData.h index 2e09886800..fe7963fcdc 100644 --- a/src/OpenColorIO/ops/cdl/CDLOpData.h +++ b/src/OpenColorIO/ops/cdl/CDLOpData.h @@ -1,15 +1,13 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_CDLOPDATA_H #define INCLUDED_OCIO_CDLOPDATA_H #include -#include "Op.h" #include "MathUtils.h" - +#include "Op.h" namespace OCIO_NAMESPACE { @@ -21,18 +19,19 @@ typedef OCIO_SHARED_PTR ConstCDLOpDataRcPtr; class CDLOpData : public OpData { public: - // Enumeration of the CDL styles enum Style { - CDL_V1_2_FWD = 0, // Forward (version 1.2) style - CDL_V1_2_REV, // Reverse (version 1.2) style - CDL_NO_CLAMP_FWD, // Forward no clamping style - CDL_NO_CLAMP_REV // Reverse no clamping style + CDL_V1_2_FWD = 0, // Forward (version 1.2) style + CDL_V1_2_REV, // Reverse (version 1.2) style + CDL_NO_CLAMP_FWD, // Forward no clamping style + CDL_NO_CLAMP_REV // Reverse no clamping style }; - static inline Style GetDefaultStyle() { return ConvertStyle(CDL_TRANSFORM_DEFAULT, - TRANSFORM_DIR_FORWARD); } + static inline Style GetDefaultStyle() + { + return ConvertStyle(CDL_TRANSFORM_DEFAULT, TRANSFORM_DIR_FORWARD); + } static Style GetStyle(const char * name); static const char * GetStyleName(Style style); @@ -44,20 +43,11 @@ class CDLOpData : public OpData // (scale, offset and power) for all channels struct ChannelParams { - ChannelParams(double r, double g, double b) - { - setRGB(r, g, b); - } + ChannelParams(double r, double g, double b) { setRGB(r, g, b); } - ChannelParams(double x) - { - setRGB(x, x, x); - } + ChannelParams(double x) { setRGB(x, x, x); } - ChannelParams() - { - setRGB(0.0, 0.0, 0.0); - } + ChannelParams() { setRGB(0.0, 0.0, 0.0); } void setRGB(double r, double g, double b) { @@ -75,7 +65,7 @@ class CDLOpData : public OpData double operator[](unsigned index) const { - if(index>=3) + if (index >= 3) { throw Exception("Index is out of range"); } @@ -84,44 +74,40 @@ class CDLOpData : public OpData double operator[](unsigned index) { - if(index>=3) + if (index >= 3) { throw Exception("Index is out of range"); } return m_data[index]; } - bool operator==(const ChannelParams& other) const + bool operator==(const ChannelParams & other) const { - return - EqualWithAbsError(m_data[0], other.m_data[0], 1e-9) && - EqualWithAbsError(m_data[1], other.m_data[1], 1e-9) && - EqualWithAbsError(m_data[2], other.m_data[2], 1e-9); + return EqualWithAbsError(m_data[0], other.m_data[0], 1e-9) + && EqualWithAbsError(m_data[1], other.m_data[1], 1e-9) + && EqualWithAbsError(m_data[2], other.m_data[2], 1e-9); } - bool operator!=(const ChannelParams& other) const - { - return !(*this == other); - } + bool operator!=(const ChannelParams & other) const { return !(*this == other); } private: double m_data[3]; }; - CDLOpData(); - CDLOpData(const Style & style, - const ChannelParams & slopeParams, - const ChannelParams & offsetParams, - const ChannelParams & powerParams, - double saturation); + CDLOpData( + const Style & style, + const ChannelParams & slopeParams, + const ChannelParams & offsetParams, + const ChannelParams & powerParams, + double saturation); virtual ~CDLOpData(); CDLOpDataRcPtr clone() const; - bool equals(const OpData& other) const override; + bool equals(const OpData & other) const override; Type getType() const override { return CDLType; } @@ -135,13 +121,13 @@ class CDLOpData : public OpData void setDirection(TransformDirection dir) noexcept; const ChannelParams & getSlopeParams() const { return m_slopeParams; } - void setSlopeParams(const ChannelParams& slopeParams); + void setSlopeParams(const ChannelParams & slopeParams); const ChannelParams & getOffsetParams() const { return m_offsetParams; } - void setOffsetParams(const ChannelParams& offsetParams); + void setOffsetParams(const ChannelParams & offsetParams); const ChannelParams & getPowerParams() const { return m_powerParams; } - void setPowerParams(const ChannelParams& powerParams); + void setPowerParams(const ChannelParams & powerParams); double getSaturation() const { return m_saturation; } void setSaturation(const double saturation); @@ -177,11 +163,11 @@ class CDLOpData : public OpData void invert() noexcept; private: - Style m_style; // CDL style - ChannelParams m_slopeParams; // Slope parameters for RGB channels - ChannelParams m_offsetParams; // Offset parameters for RGB channels - ChannelParams m_powerParams; // Power parameters for RGB channels - double m_saturation; // Saturation parameter + Style m_style; // CDL style + ChannelParams m_slopeParams; // Slope parameters for RGB channels + ChannelParams m_offsetParams; // Offset parameters for RGB channels + ChannelParams m_powerParams; // Power parameters for RGB channels + double m_saturation; // Saturation parameter }; bool operator==(const CDLOpData & lhs, const CDLOpData & rhs); diff --git a/src/OpenColorIO/ops/cdl/CDLOpGPU.cpp b/src/OpenColorIO/ops/cdl/CDLOpGPU.cpp index 64fb3c3c91..3a60d0a836 100644 --- a/src/OpenColorIO/ops/cdl/CDLOpGPU.cpp +++ b/src/OpenColorIO/ops/cdl/CDLOpGPU.cpp @@ -1,13 +1,11 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #include #include "ops/cdl/CDLOpCPU.h" #include "ops/cdl/CDLOpGPU.h" - namespace OCIO_NAMESPACE { @@ -35,14 +33,14 @@ void GetCDLGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, ConstCDLOpDat const std::string pixrgb = pix + std::string(".rgb"); // Since alpha is not affected, only need to use the RGB components - ss.declareFloat3("lumaWeights", 0.2126f, 0.7152f, 0.0722f ); - ss.declareFloat3("slope", slope [0], slope [1], slope [2]); - ss.declareFloat3("offset", offset[0], offset[1], offset[2]); - ss.declareFloat3("power", power [0], power [1], power [2]); + ss.declareFloat3("lumaWeights", 0.2126f, 0.7152f, 0.0722f); + ss.declareFloat3("slope", slope[0], slope[1], slope[2]); + ss.declareFloat3("offset", offset[0], offset[1], offset[2]); + ss.declareFloat3("power", power[0], power[1], power[2]); - ss.declareVar("saturation" , saturation); + ss.declareVar("saturation", saturation); - if ( !params.isReverse() ) + if (!params.isReverse()) { // Forward style @@ -53,7 +51,7 @@ void GetCDLGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, ConstCDLOpDat ss.newLine() << pixrgb << " = " << pixrgb << " + offset;"; // Power - if ( !params.isNoClamp() ) + if (!params.isNoClamp()) { ss.newLine() << pixrgb << " = clamp(" << pixrgb << ", 0.0, 1.0);"; ss.newLine() << pixrgb << " = pow(" << pixrgb << ", power);"; @@ -70,7 +68,7 @@ void GetCDLGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, ConstCDLOpDat ss.newLine() << pixrgb << " = luma + saturation * (" << pixrgb << " - luma);"; // Post-saturation clamp - if ( !params.isNoClamp() ) + if (!params.isNoClamp()) { ss.newLine() << pixrgb << " = clamp(" << pixrgb << ", 0.0, 1.0);"; } @@ -80,7 +78,7 @@ void GetCDLGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, ConstCDLOpDat // Reverse style // Pre-saturation clamp - if ( !params.isNoClamp() ) + if (!params.isNoClamp()) { ss.newLine() << pixrgb << " = clamp(" << pixrgb << ", 0.0, 1.0);"; } @@ -90,7 +88,7 @@ void GetCDLGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, ConstCDLOpDat ss.newLine() << pixrgb << " = luma + saturation * (" << pixrgb << " - luma);"; // Power - if ( !params.isNoClamp() ) + if (!params.isNoClamp()) { ss.newLine() << pixrgb << " = clamp(" << pixrgb << ", 0.0, 1.0);"; ss.newLine() << pixrgb << " = pow(" << pixrgb << ", power);"; @@ -109,7 +107,7 @@ void GetCDLGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, ConstCDLOpDat ss.newLine() << pixrgb << " = " << pixrgb << " * slope;"; // Post-slope clamp - if ( !params.isNoClamp() ) + if (!params.isNoClamp()) { ss.newLine() << pixrgb << " = clamp(" << pixrgb << ", 0.0, 1.0);"; } diff --git a/src/OpenColorIO/ops/cdl/CDLOpGPU.h b/src/OpenColorIO/ops/cdl/CDLOpGPU.h index 8868cb2d57..afa341f6a9 100644 --- a/src/OpenColorIO/ops/cdl/CDLOpGPU.h +++ b/src/OpenColorIO/ops/cdl/CDLOpGPU.h @@ -9,7 +9,6 @@ #include "GpuShaderUtils.h" #include "ops/cdl/CDLOpData.h" - namespace OCIO_NAMESPACE { diff --git a/src/OpenColorIO/ops/exponent/ExponentOp.cpp b/src/OpenColorIO/ops/exponent/ExponentOp.cpp index 41b95992c4..e5d61c0e85 100644 --- a/src/OpenColorIO/ops/exponent/ExponentOp.cpp +++ b/src/OpenColorIO/ops/exponent/ExponentOp.cpp @@ -1,17 +1,17 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. +#include #include #include #include -#include #include -#include "HashUtils.h" -#include "ops/exponent/ExponentOp.h" #include "GpuShaderUtils.h" +#include "HashUtils.h" #include "MathUtils.h" +#include "ops/exponent/ExponentOp.h" namespace OCIO_NAMESPACE { @@ -21,7 +21,7 @@ const int FLOAT_DECIMALS = 7; } ExponentOpData::ExponentOpData() - : OpData() + : OpData() { for (unsigned i = 0; i < 4; ++i) { @@ -30,7 +30,7 @@ ExponentOpData::ExponentOpData() } ExponentOpData::ExponentOpData(const ExponentOpData & rhs) - : OpData() + : OpData() { if (this != &rhs) { @@ -39,17 +39,17 @@ ExponentOpData::ExponentOpData(const ExponentOpData & rhs) } ExponentOpData::ExponentOpData(const double * exp4) - : OpData() + : OpData() { - memcpy(m_exp4, exp4, 4*sizeof(double)); + memcpy(m_exp4, exp4, 4 * sizeof(double)); } -ExponentOpData & ExponentOpData::operator = (const ExponentOpData & rhs) +ExponentOpData & ExponentOpData::operator=(const ExponentOpData & rhs) { if (this != &rhs) { OpData::operator=(rhs); - memcpy(m_exp4, rhs.m_exp4, sizeof(double)*4); + memcpy(m_exp4, rhs.m_exp4, sizeof(double) * 4); } return *this; @@ -94,7 +94,11 @@ namespace class ExponentOpCPU : public OpCPU { public: - ExponentOpCPU(ConstExponentOpDataRcPtr exp) : OpCPU(), m_data(exp) {} + ExponentOpCPU(ConstExponentOpDataRcPtr exp) + : OpCPU() + , m_data(exp) + { + } virtual ~ExponentOpCPU() {} void apply(const void * inImg, void * outImg, long numPixels) const override; @@ -106,21 +110,22 @@ class ExponentOpCPU : public OpCPU void ExponentOpCPU::apply(const void * inImg, void * outImg, long numPixels) const { const float * in = (const float *)inImg; - float * out = (float *)outImg; + float * out = (float *)outImg; - const float exp[4] = { float(m_data->m_exp4[0]), - float(m_data->m_exp4[1]), - float(m_data->m_exp4[2]), - float(m_data->m_exp4[3]) }; + const float exp[4] + = {float(m_data->m_exp4[0]), + float(m_data->m_exp4[1]), + float(m_data->m_exp4[2]), + float(m_data->m_exp4[3])}; for (long pixelIndex = 0; pixelIndex < numPixels; ++pixelIndex) { - out[0] = powf( std::max(0.0f, in[0]), exp[0]); - out[1] = powf( std::max(0.0f, in[1]), exp[1]); - out[2] = powf( std::max(0.0f, in[2]), exp[2]); - out[3] = powf( std::max(0.0f, in[3]), exp[3]); + out[0] = powf(std::max(0.0f, in[0]), exp[0]); + out[1] = powf(std::max(0.0f, in[1]), exp[1]); + out[2] = powf(std::max(0.0f, in[2]), exp[2]); + out[3] = powf(std::max(0.0f, in[3]), exp[3]); - in += 4; + in += 4; out += 4; } } @@ -128,7 +133,7 @@ void ExponentOpCPU::apply(const void * inImg, void * outImg, long numPixels) con class ExponentOp : public Op { public: - ExponentOp() = delete; + ExponentOp() = delete; ExponentOp(ExponentOp & exp) = delete; explicit ExponentOp(const double * exp4); @@ -153,9 +158,11 @@ class ExponentOp : public Op void extractGpuShaderInfo(GpuShaderCreatorRcPtr & shaderCreator) const override; protected: - ConstExponentOpDataRcPtr expData() const { return DynamicPtrCast(data()); } + ConstExponentOpDataRcPtr expData() const + { + return DynamicPtrCast(data()); + } ExponentOpDataRcPtr expData() { return DynamicPtrCast(data()); } - }; typedef OCIO_SHARED_PTR ExponentOpRcPtr; @@ -190,7 +197,8 @@ std::string ExponentOp::getInfo() const bool ExponentOp::isSameType(ConstOpRcPtr & op) const { ConstExponentOpRcPtr typedRcPtr = DynamicPtrCast(op); - if (!typedRcPtr) return false; + if (!typedRcPtr) + return false; return true; } @@ -217,10 +225,10 @@ void ExponentOp::combineWith(OpRcPtrVec & ops, ConstOpRcPtr & secondOp) const ConstExponentOpRcPtr typedRcPtr = DynamicPtrCast(secondOp); const double combined[4] - = { expData()->m_exp4[0]*typedRcPtr->expData()->m_exp4[0], - expData()->m_exp4[1]*typedRcPtr->expData()->m_exp4[1], - expData()->m_exp4[2]*typedRcPtr->expData()->m_exp4[2], - expData()->m_exp4[3]*typedRcPtr->expData()->m_exp4[3] }; + = {expData()->m_exp4[0] * typedRcPtr->expData()->m_exp4[0], + expData()->m_exp4[1] * typedRcPtr->expData()->m_exp4[1], + expData()->m_exp4[2] * typedRcPtr->expData()->m_exp4[2], + expData()->m_exp4[3] * typedRcPtr->expData()->m_exp4[3]}; if (!IsVecEqualToOne(combined, 4)) { @@ -267,17 +275,17 @@ void ExponentOp::extractGpuShaderInfo(GpuShaderCreatorRcPtr & shaderCreator) con const std::string pxl(shaderCreator->getPixelName()); - ss.newLine() << ss.float4Decl("res") - << " = " << ss.float4Const(pxl + ".rgb.r", - pxl + ".rgb.g", - pxl + ".rgb.b", - pxl + ".a") << ";"; + ss.newLine() << ss.float4Decl("res") << " = " + << ss.float4Const(pxl + ".rgb.r", pxl + ".rgb.g", pxl + ".rgb.b", pxl + ".a") + << ";"; - ss.newLine() - << "res = pow( " - << "max( res, " << ss.float4Const(0.0f) << " )" - << ", " << ss.float4Const(expData()->m_exp4[0], expData()->m_exp4[1], - expData()->m_exp4[2], expData()->m_exp4[3]) << " );"; + ss.newLine() << "res = pow( " << "max( res, " << ss.float4Const(0.0f) << " )" << ", " + << ss.float4Const( + expData()->m_exp4[0], + expData()->m_exp4[1], + expData()->m_exp4[2], + expData()->m_exp4[3]) + << " );"; ss.newLine() << pxl << ".rgb = " << ss.float3Const("res.x", "res.y", "res.z") << ";"; ss.newLine() << pxl << ".a = res.w;"; @@ -288,47 +296,42 @@ void ExponentOp::extractGpuShaderInfo(GpuShaderCreatorRcPtr & shaderCreator) con shaderCreator->addToFunctionShaderCode(ss.string().c_str()); } -} // Anon namespace - +} // namespace - -void CreateExponentOp(OpRcPtrVec & ops, - const double(&vec4)[4], - TransformDirection direction) +void CreateExponentOp(OpRcPtrVec & ops, const double (&vec4)[4], TransformDirection direction) { ExponentOpDataRcPtr expData = std::make_shared(vec4); CreateExponentOp(ops, expData, direction); } -void CreateExponentOp(OpRcPtrVec & ops, - ExponentOpDataRcPtr & expData, - TransformDirection direction) +void CreateExponentOp(OpRcPtrVec & ops, ExponentOpDataRcPtr & expData, TransformDirection direction) { switch (direction) { - case TRANSFORM_DIR_FORWARD: - { - ops.push_back(std::make_shared(expData)); - break; - } - case TRANSFORM_DIR_INVERSE: - { - double values[4]; - for (int i = 0; i<4; ++i) + case TRANSFORM_DIR_FORWARD: { - if (!IsScalarEqualToZero(expData->m_exp4[i])) - { - values[i] = 1.0 / expData->m_exp4[i]; - } - else + ops.push_back(std::make_shared(expData)); + break; + } + case TRANSFORM_DIR_INVERSE: + { + double values[4]; + for (int i = 0; i < 4; ++i) { - throw Exception("Cannot apply ExponentOp op, Cannot apply 0.0 exponent in the inverse."); + if (!IsScalarEqualToZero(expData->m_exp4[i])) + { + values[i] = 1.0 / expData->m_exp4[i]; + } + else + { + throw Exception( + "Cannot apply ExponentOp op, Cannot apply 0.0 exponent in the inverse."); + } } + ExponentOpDataRcPtr expInv = std::make_shared(values); + ops.push_back(std::make_shared(expInv)); + break; } - ExponentOpDataRcPtr expInv = std::make_shared(values); - ops.push_back(std::make_shared(expInv)); - break; - } } } @@ -341,16 +344,14 @@ void CreateExponentTransform(GroupTransformRcPtr & group, ConstOpRcPtr & op) } auto expTransform = ExponentTransform::Create(); - auto expData = DynamicPtrCast(op->data()); + auto expData = DynamicPtrCast(op->data()); auto & formatMetadata = expTransform->getFormatMetadata(); - auto & metadata = dynamic_cast(formatMetadata); - metadata = expData->getFormatMetadata(); + auto & metadata = dynamic_cast(formatMetadata); + metadata = expData->getFormatMetadata(); expTransform->setValue(expData->m_exp4); group->appendTransform(expTransform); } - } // namespace OCIO_NAMESPACE - diff --git a/src/OpenColorIO/ops/exponent/ExponentOp.h b/src/OpenColorIO/ops/exponent/ExponentOp.h index 2f1267a6f1..b7ba747947 100644 --- a/src/OpenColorIO/ops/exponent/ExponentOp.h +++ b/src/OpenColorIO/ops/exponent/ExponentOp.h @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_EXPONENTOP_H #define INCLUDED_OCIO_EXPONENTOP_H @@ -23,7 +22,7 @@ class ExponentOpData : public OpData explicit ExponentOpData(const double * exp4); virtual ~ExponentOpData() {} - ExponentOpData & operator = (const ExponentOpData & rhs); + ExponentOpData & operator=(const ExponentOpData & rhs); virtual Type getType() const override { return ExponentType; } @@ -41,13 +40,12 @@ class ExponentOpData : public OpData // If the exponent is 1.0, this will return without clamping // Otherwise, will be clamped between [0.0, inf] -void CreateExponentOp(OpRcPtrVec & ops, - const double(&vec4)[4], - TransformDirection direction); +void CreateExponentOp(OpRcPtrVec & ops, const double (&vec4)[4], TransformDirection direction); -void CreateExponentOp(OpRcPtrVec & ops, - ExponentOpDataRcPtr & expData, - TransformDirection direction); +void CreateExponentOp( + OpRcPtrVec & ops, + ExponentOpDataRcPtr & expData, + TransformDirection direction); // Create a copy of the exponent transform in the op and append it to the GroupTransform. void CreateExponentTransform(GroupTransformRcPtr & group, ConstOpRcPtr & op); diff --git a/src/OpenColorIO/ops/exposurecontrast/ExposureContrastOp.cpp b/src/OpenColorIO/ops/exposurecontrast/ExposureContrastOp.cpp index fc5d1cd4e4..8a9b923165 100644 --- a/src/OpenColorIO/ops/exposurecontrast/ExposureContrastOp.cpp +++ b/src/OpenColorIO/ops/exposurecontrast/ExposureContrastOp.cpp @@ -5,9 +5,9 @@ #include +#include "ops/exposurecontrast/ExposureContrastOp.h" #include "ops/exposurecontrast/ExposureContrastOpCPU.h" #include "ops/exposurecontrast/ExposureContrastOpGPU.h" -#include "ops/exposurecontrast/ExposureContrastOp.h" #include "transforms/ExposureContrastTransform.h" namespace OCIO_NAMESPACE @@ -23,7 +23,7 @@ typedef OCIO_SHARED_PTR ConstExposureContrastOpRcPtr; class ExposureContrastOp : public Op { public: - ExposureContrastOp() = delete; + ExposureContrastOp() = delete; ExposureContrastOp(const ExposureContrastOp &) = delete; explicit ExposureContrastOp(ExposureContrastOpDataRcPtr & ec); @@ -44,7 +44,8 @@ class ExposureContrastOp : public Op bool isDynamic() const override; bool hasDynamicProperty(DynamicPropertyType type) const override; DynamicPropertyRcPtr getDynamicProperty(DynamicPropertyType type) const override; - void replaceDynamicProperty(DynamicPropertyType type, DynamicPropertyDoubleImplRcPtr & prop) override; + void replaceDynamicProperty(DynamicPropertyType type, DynamicPropertyDoubleImplRcPtr & prop) + override; void removeDynamicProperties() override; ConstOpCPURcPtr getCPUOp(bool fastLogExpPow) const override; @@ -56,13 +57,9 @@ class ExposureContrastOp : public Op { return DynamicPtrCast(data()); } - ExposureContrastOpDataRcPtr ecData() - { - return DynamicPtrCast(data()); - } + ExposureContrastOpDataRcPtr ecData() { return DynamicPtrCast(data()); } }; - ExposureContrastOp::ExposureContrastOp(ExposureContrastOpDataRcPtr & ec) : Op() { @@ -98,7 +95,8 @@ bool ExposureContrastOp::isSameType(ConstOpRcPtr & op) const bool ExposureContrastOp::isInverse(ConstOpRcPtr & op) const { ConstExposureContrastOpRcPtr typedRcPtr = DynamicPtrCast(op); - if (!typedRcPtr) return false; + if (!typedRcPtr) + return false; ConstExposureContrastOpDataRcPtr ecOpData = typedRcPtr->ecData(); return ecData()->isInverse(ecOpData); @@ -156,8 +154,9 @@ DynamicPropertyRcPtr ExposureContrastOp::getDynamicProperty(DynamicPropertyType return ecData()->getDynamicProperty(type); } -void ExposureContrastOp::replaceDynamicProperty(DynamicPropertyType type, - DynamicPropertyDoubleImplRcPtr & prop) +void ExposureContrastOp::replaceDynamicProperty( + DynamicPropertyType type, + DynamicPropertyDoubleImplRcPtr & prop) { ecData()->replaceDynamicProperty(type, prop); } @@ -167,28 +166,28 @@ void ExposureContrastOp::removeDynamicProperties() ecData()->removeDynamicProperties(); } -} // Anon namespace - +} // namespace /////////////////////////////////////////////////////////////////////////// -void CreateExposureContrastOp(OpRcPtrVec & ops, - ExposureContrastOpDataRcPtr & data, - TransformDirection direction) +void CreateExposureContrastOp( + OpRcPtrVec & ops, + ExposureContrastOpDataRcPtr & data, + TransformDirection direction) { switch (direction) { - case TRANSFORM_DIR_FORWARD: - { - ops.push_back(std::make_shared(data)); - break; - } - case TRANSFORM_DIR_INVERSE: - { - ExposureContrastOpDataRcPtr dataInv = data->inverse(); - ops.push_back(std::make_shared(dataInv)); - break; - } + case TRANSFORM_DIR_FORWARD: + { + ops.push_back(std::make_shared(data)); + break; + } + case TRANSFORM_DIR_INVERSE: + { + ExposureContrastOpDataRcPtr dataInv = data->inverse(); + ops.push_back(std::make_shared(dataInv)); + break; + } } } @@ -201,17 +200,18 @@ void CreateExposureContrastTransform(GroupTransformRcPtr & group, ConstOpRcPtr & { throw Exception("CreateExposureContrastTransform: op has to be a ExposureContrastOp"); } - auto ecData = DynamicPtrCast(op->data()); + auto ecData = DynamicPtrCast(op->data()); auto ecTransform = ExposureContrastTransform::Create(); - auto & data = dynamic_cast(ecTransform.get())->data(); - data = *ecData; + auto & data = dynamic_cast(ecTransform.get())->data(); + data = *ecData; group->appendTransform(ecTransform); } -void BuildExposureContrastOp(OpRcPtrVec & ops, - const ExposureContrastTransform & transform, - TransformDirection dir) +void BuildExposureContrastOp( + OpRcPtrVec & ops, + const ExposureContrastTransform & transform, + TransformDirection dir) { const auto & data = dynamic_cast(transform).data(); data.validate(); @@ -221,4 +221,3 @@ void BuildExposureContrastOp(OpRcPtrVec & ops, } } // namespace OCIO_NAMESPACE - diff --git a/src/OpenColorIO/ops/exposurecontrast/ExposureContrastOp.h b/src/OpenColorIO/ops/exposurecontrast/ExposureContrastOp.h index efd3bb2b64..53a4b3610f 100644 --- a/src/OpenColorIO/ops/exposurecontrast/ExposureContrastOp.h +++ b/src/OpenColorIO/ops/exposurecontrast/ExposureContrastOp.h @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_EXPOSURECONTRAST_H #define INCLUDED_OCIO_EXPOSURECONTRAST_H @@ -13,9 +12,10 @@ namespace OCIO_NAMESPACE { -void CreateExposureContrastOp(OpRcPtrVec & ops, - ExposureContrastOpDataRcPtr & data, - TransformDirection direction); +void CreateExposureContrastOp( + OpRcPtrVec & ops, + ExposureContrastOpDataRcPtr & data, + TransformDirection direction); // Create a copy of the exposure contrast transform in the op and append it to // the GroupTransform. diff --git a/src/OpenColorIO/ops/exposurecontrast/ExposureContrastOpCPU.cpp b/src/OpenColorIO/ops/exposurecontrast/ExposureContrastOpCPU.cpp index d2288344c9..939fbaba1e 100644 --- a/src/OpenColorIO/ops/exposurecontrast/ExposureContrastOpCPU.cpp +++ b/src/OpenColorIO/ops/exposurecontrast/ExposureContrastOpCPU.cpp @@ -8,8 +8,8 @@ #include "BitDepthUtils.h" #include "DynamicProperty.h" -#include "ops/exposurecontrast/ExposureContrastOpCPU.h" #include "SSE.h" +#include "ops/exposurecontrast/ExposureContrastOpCPU.h" namespace OCIO_NAMESPACE { @@ -20,8 +20,8 @@ namespace class ECRendererBase : public OpCPU { public: - ECRendererBase() = delete; - ECRendererBase(const ECRendererBase &) = delete; + ECRendererBase() = delete; + ECRendererBase(const ECRendererBase &) = delete; explicit ECRendererBase(ConstExposureContrastOpDataRcPtr & ec); virtual ~ECRendererBase(); @@ -36,7 +36,7 @@ class ECRendererBase : public OpCPU DynamicPropertyDoubleImplRcPtr m_contrast; DynamicPropertyDoubleImplRcPtr m_gamma; - float m_pivot = 0.0f; + float m_pivot = 0.0f; float m_logExposureStep = 0.088f; }; @@ -46,7 +46,7 @@ ECRendererBase::ECRendererBase(ConstExposureContrastOpDataRcPtr & ec) // Initialized with the instances from the processor and decouple them. m_exposure = ec->getExposureProperty(); m_contrast = ec->getContrastProperty(); - m_gamma = ec->getGammaProperty(); + m_gamma = ec->getGammaProperty(); if (m_exposure->isDynamic()) { m_exposure = m_exposure->createEditableCopy(); @@ -127,7 +127,6 @@ DynamicPropertyRcPtr ECRendererBase::getDynamicProperty(DynamicPropertyType type throw Exception("ExposureContrast property is not dynamic."); } - class ECLinearRenderer : public ECRendererBase { public: @@ -154,17 +153,16 @@ void ECLinearRenderer::apply(const void * inImg, void * outImg, long numPixels) { // TODO: allow negative contrast? // TODO: is it worth adding a code path without dynamic parameters? - const float contrastVal = (float)std::max(EC::MIN_CONTRAST, - m_contrast->getValue() * - m_gamma->getValue()); + const float contrastVal + = (float)std::max(EC::MIN_CONTRAST, m_contrast->getValue() * m_gamma->getValue()); const float exposureVal = powf(2.f, (float)m_exposure->getValue()); const float * in = (float *)inImg; - float * out = (float *)outImg; + float * out = (float *)outImg; if (contrastVal == 1.f) { - for (long idx = 0; idxgetValue() * m_gamma->getValue())); + const float contrastVal + = (float)std::max(EC::MIN_CONTRAST, (m_contrast->getValue() * m_gamma->getValue())); const float invContrastVal = 1.f / contrastVal; const float invExposureVal = 1.f / powf(2.f, (float)m_exposure->getValue()); const float * in = (float *)inImg; - float * out = (float *)outImg; + float * out = (float *)outImg; if (contrastVal == 1.f) { - for (long idx = 0; idxgetPivot()), - (float)EC::VIDEO_OETF_POWER); + m_pivot = powf((float)std::max(EC::MIN_PIVOT, ec->getPivot()), (float)EC::VIDEO_OETF_POWER); } void ECVideoRenderer::apply(const void * inImg, void * outImg, long numPixels) const { // TODO: allow negative contrast? - const float contrastVal = (float)std::max(EC::MIN_CONTRAST, - (m_contrast->getValue() * m_gamma->getValue())); - const float exposureVal = powf(powf(2.f, (float)m_exposure->getValue()), - (float)EC::VIDEO_OETF_POWER); + const float contrastVal + = (float)std::max(EC::MIN_CONTRAST, (m_contrast->getValue() * m_gamma->getValue())); + const float exposureVal + = powf(powf(2.f, (float)m_exposure->getValue()), (float)EC::VIDEO_OETF_POWER); const float * in = (float *)inImg; - float * out = (float *)outImg; + float * out = (float *)outImg; if (contrastVal == 1.f) { - for (long idx = 0; idxgetPivot()), - (float)EC::VIDEO_OETF_POWER); + m_pivot = powf((float)std::max(EC::MIN_PIVOT, ec->getPivot()), (float)EC::VIDEO_OETF_POWER); } void ECVideoRevRenderer::apply(const void * inImg, void * outImg, long numPixels) const { // TODO: allow negative contrast? - const float contrastVal = (float)std::max(EC::MIN_CONTRAST, - (m_contrast->getValue() * m_gamma->getValue())); + const float contrastVal + = (float)std::max(EC::MIN_CONTRAST, (m_contrast->getValue() * m_gamma->getValue())); const float invContrastVal = 1.f / contrastVal; - const float invExposureVal = 1.f / powf(powf(2.f, (float)m_exposure->getValue()), - (float)EC::VIDEO_OETF_POWER); + const float invExposureVal + = 1.f / powf(powf(2.f, (float)m_exposure->getValue()), (float)EC::VIDEO_OETF_POWER); const float pivotOverExposureVal = m_pivot * invExposureVal; - const float invPivotVal = 1.f / m_pivot; + const float invPivotVal = 1.f / m_pivot; const float * in = (float *)inImg; - float * out = (float *)outImg; + float * out = (float *)outImg; if (contrastVal == 1.f) { - for (long idx = 0; idxgetPivot()); - m_pivot = (float)std::max(0., log2(pivot / 0.18) * - ec->getLogExposureStep() + - ec->getLogMidGray()); + m_pivot + = (float)std::max(0., log2(pivot / 0.18) * ec->getLogExposureStep() + ec->getLogMidGray()); m_logExposureStep = (float)ec->getLogExposureStep(); } void ECLogarithmicRenderer::apply(const void * inImg, void * outImg, long numPixels) const { - const float exposureVal = (float)m_exposure->getValue() * - m_logExposureStep; + const float exposureVal = (float)m_exposure->getValue() * m_logExposureStep; const float contrastVal - = (float)std::max(EC::MIN_CONTRAST, - (m_contrast->getValue() * m_gamma->getValue())); + = (float)std::max(EC::MIN_CONTRAST, (m_contrast->getValue() * m_gamma->getValue())); const float offsetVal = (exposureVal - m_pivot) * contrastVal + m_pivot; const float * in = (float *)inImg; - float * out = (float *)outImg; + float * out = (float *)outImg; #if OCIO_USE_SSE2 // Equation is: @@ -591,29 +550,24 @@ void ECLogarithmicRenderer::apply(const void * inImg, void * outImg, long numPix // out = [in * contrast] + [(expos - pivot) * contrast + pivot] __m128 contrast = _mm_set1_ps(contrastVal); - __m128 offset = _mm_set1_ps(offsetVal); + __m128 offset = _mm_set1_ps(offsetVal); - for (long idx = 0; idxgetPivot()); - m_pivot = (float)std::max(0., log2(pivot / 0.18) * - ec->getLogExposureStep() + - ec->getLogMidGray()); + m_pivot + = (float)std::max(0., log2(pivot / 0.18) * ec->getLogExposureStep() + ec->getLogMidGray()); } void ECLogarithmicRevRenderer::apply(const void * inImg, void * outImg, long numPixels) const { - const float exposureVal = (float)m_exposure->getValue() * - m_logExposureStep; + const float exposureVal = (float)m_exposure->getValue() * m_logExposureStep; const float inv_contrastVal - = (float)std::max(EC::MIN_CONTRAST, - 1. / (m_contrast->getValue() * m_gamma->getValue())); - const float negOffsetVal = m_pivot - m_pivot * inv_contrastVal - - exposureVal; + = (float)std::max(EC::MIN_CONTRAST, 1. / (m_contrast->getValue() * m_gamma->getValue())); + const float negOffsetVal = m_pivot - m_pivot * inv_contrastVal - exposureVal; const float * in = (float *)inImg; - float * out = (float *)outImg; + float * out = (float *)outImg; - for (long idx = 0; idxgetStyle()) { - case ExposureContrastOpData::STYLE_LINEAR: - return std::make_shared(ec); - case ExposureContrastOpData::STYLE_LINEAR_REV: - return std::make_shared(ec); - case ExposureContrastOpData::STYLE_VIDEO: - return std::make_shared(ec); - case ExposureContrastOpData::STYLE_VIDEO_REV: - return std::make_shared(ec); - case ExposureContrastOpData::STYLE_LOGARITHMIC: - return std::make_shared(ec); - case ExposureContrastOpData::STYLE_LOGARITHMIC_REV: - return std::make_shared(ec); + case ExposureContrastOpData::STYLE_LINEAR: + return std::make_shared(ec); + case ExposureContrastOpData::STYLE_LINEAR_REV: + return std::make_shared(ec); + case ExposureContrastOpData::STYLE_VIDEO: + return std::make_shared(ec); + case ExposureContrastOpData::STYLE_VIDEO_REV: + return std::make_shared(ec); + case ExposureContrastOpData::STYLE_LOGARITHMIC: + return std::make_shared(ec); + case ExposureContrastOpData::STYLE_LOGARITHMIC_REV: + return std::make_shared(ec); } throw Exception("Unknown exposure contrast style"); diff --git a/src/OpenColorIO/ops/exposurecontrast/ExposureContrastOpCPU.h b/src/OpenColorIO/ops/exposurecontrast/ExposureContrastOpCPU.h index 751feaa8b2..5ac3ddbfc6 100644 --- a/src/OpenColorIO/ops/exposurecontrast/ExposureContrastOpCPU.h +++ b/src/OpenColorIO/ops/exposurecontrast/ExposureContrastOpCPU.h @@ -8,7 +8,6 @@ #include "ops/exposurecontrast/ExposureContrastOpData.h" - namespace OCIO_NAMESPACE { diff --git a/src/OpenColorIO/ops/exposurecontrast/ExposureContrastOpData.cpp b/src/OpenColorIO/ops/exposurecontrast/ExposureContrastOpData.cpp index 4197b7dde4..a8e6718f2f 100644 --- a/src/OpenColorIO/ops/exposurecontrast/ExposureContrastOpData.cpp +++ b/src/OpenColorIO/ops/exposurecontrast/ExposureContrastOpData.cpp @@ -5,8 +5,8 @@ #include -#include "ops/exposurecontrast/ExposureContrastOpData.h" #include "Platform.h" +#include "ops/exposurecontrast/ExposureContrastOpData.h" namespace OCIO_NAMESPACE { @@ -20,7 +20,7 @@ static constexpr char EC_STYLE_VIDEO[] = "video"; static constexpr char EC_STYLE_VIDEO_REV[] = "videoRev"; static constexpr char EC_STYLE_LOGARITHMIC[] = "log"; static constexpr char EC_STYLE_LOGARITHMIC_REV[] = "logRev"; -} +} // namespace namespace DefaultValues { @@ -70,58 +70,59 @@ const char * ExposureContrastOpData::ConvertStyleToString(ExposureContrastOpData { switch (style) { - case STYLE_LINEAR: - { - return EC_STYLE_LINEAR; - } - case STYLE_LINEAR_REV: - { - return EC_STYLE_LINEAR_REV; - } - case STYLE_VIDEO: - { - return EC_STYLE_VIDEO; - } - case STYLE_VIDEO_REV: - { - return EC_STYLE_VIDEO_REV; - } - case STYLE_LOGARITHMIC: - { - return EC_STYLE_LOGARITHMIC; - } - case STYLE_LOGARITHMIC_REV: - { - return EC_STYLE_LOGARITHMIC_REV; - } + case STYLE_LINEAR: + { + return EC_STYLE_LINEAR; + } + case STYLE_LINEAR_REV: + { + return EC_STYLE_LINEAR_REV; + } + case STYLE_VIDEO: + { + return EC_STYLE_VIDEO; + } + case STYLE_VIDEO_REV: + { + return EC_STYLE_VIDEO_REV; + } + case STYLE_LOGARITHMIC: + { + return EC_STYLE_LOGARITHMIC; + } + case STYLE_LOGARITHMIC_REV: + { + return EC_STYLE_LOGARITHMIC_REV; + } } throw Exception("Unknown exposure contrast style."); } // Combine the Transform style and direction into the internal OpData style. -ExposureContrastOpData::Style ExposureContrastOpData::ConvertStyle(ExposureContrastStyle style, - TransformDirection dir) +ExposureContrastOpData::Style ExposureContrastOpData::ConvertStyle( + ExposureContrastStyle style, + TransformDirection dir) { const bool isForward = dir == TRANSFORM_DIR_FORWARD; switch (style) { - case EXPOSURE_CONTRAST_VIDEO: - { - return (isForward) ? ExposureContrastOpData::STYLE_VIDEO : - ExposureContrastOpData::STYLE_VIDEO_REV; - } - case EXPOSURE_CONTRAST_LOGARITHMIC: - { - return (isForward) ? ExposureContrastOpData::STYLE_LOGARITHMIC : - ExposureContrastOpData::STYLE_LOGARITHMIC_REV; - } - case EXPOSURE_CONTRAST_LINEAR: - { - return (isForward) ? ExposureContrastOpData::STYLE_LINEAR : - ExposureContrastOpData::STYLE_LINEAR_REV; - } + case EXPOSURE_CONTRAST_VIDEO: + { + return (isForward) ? ExposureContrastOpData::STYLE_VIDEO + : ExposureContrastOpData::STYLE_VIDEO_REV; + } + case EXPOSURE_CONTRAST_LOGARITHMIC: + { + return (isForward) ? ExposureContrastOpData::STYLE_LOGARITHMIC + : ExposureContrastOpData::STYLE_LOGARITHMIC_REV; + } + case EXPOSURE_CONTRAST_LINEAR: + { + return (isForward) ? ExposureContrastOpData::STYLE_LINEAR + : ExposureContrastOpData::STYLE_LINEAR_REV; + } } std::stringstream ss("Unknown ExposureContrast transform style: "); @@ -135,17 +136,17 @@ ExposureContrastStyle ExposureContrastOpData::ConvertStyle(ExposureContrastOpDat { switch (style) { - case ExposureContrastOpData::STYLE_VIDEO: - case ExposureContrastOpData::STYLE_VIDEO_REV: - return EXPOSURE_CONTRAST_VIDEO; + case ExposureContrastOpData::STYLE_VIDEO: + case ExposureContrastOpData::STYLE_VIDEO_REV: + return EXPOSURE_CONTRAST_VIDEO; - case ExposureContrastOpData::STYLE_LOGARITHMIC: - case ExposureContrastOpData::STYLE_LOGARITHMIC_REV: - return EXPOSURE_CONTRAST_LOGARITHMIC; + case ExposureContrastOpData::STYLE_LOGARITHMIC: + case ExposureContrastOpData::STYLE_LOGARITHMIC_REV: + return EXPOSURE_CONTRAST_LOGARITHMIC; - case ExposureContrastOpData::STYLE_LINEAR: - case ExposureContrastOpData::STYLE_LINEAR_REV: - return EXPOSURE_CONTRAST_LINEAR; + case ExposureContrastOpData::STYLE_LINEAR: + case ExposureContrastOpData::STYLE_LINEAR_REV: + return EXPOSURE_CONTRAST_LINEAR; } std::stringstream ss("Unknown ExposureContrast style: "); @@ -178,7 +179,7 @@ ExposureContrastOpData::~ExposureContrastOpData() ExposureContrastOpDataRcPtr ExposureContrastOpData::clone() const { ExposureContrastOpDataRcPtr res = std::make_shared(getStyle()); - *res = *this; + *res = *this; return res; } @@ -194,17 +195,13 @@ bool ExposureContrastOpData::isNoOp() const bool ExposureContrastOpData::isIdentity() const { - return !isDynamic() && - (m_exposure->getValue() == 0.) && - (m_contrast->getValue() == 1.) && - (m_gamma->getValue() == 1.); + return !isDynamic() && (m_exposure->getValue() == 0.) && (m_contrast->getValue() == 1.) + && (m_gamma->getValue() == 1.); } bool ExposureContrastOpData::isDynamic() const { - return m_exposure->isDynamic() || - m_contrast->isDynamic() || - m_gamma->isDynamic(); + return m_exposure->isDynamic() || m_contrast->isDynamic() || m_gamma->isDynamic(); } bool ExposureContrastOpData::isInverse(ConstExposureContrastOpDataRcPtr & r) const @@ -213,7 +210,7 @@ bool ExposureContrastOpData::isInverse(ConstExposureContrastOpDataRcPtr & r) con { return false; } - + return *r == *inverse(); } @@ -222,12 +219,24 @@ void ExposureContrastOpData::invert() noexcept Style invStyle = STYLE_LINEAR; switch (getStyle()) { - case STYLE_LINEAR: invStyle = STYLE_LINEAR_REV; break; - case STYLE_LINEAR_REV: invStyle = STYLE_LINEAR; break; - case STYLE_VIDEO: invStyle = STYLE_VIDEO_REV; break; - case STYLE_VIDEO_REV: invStyle = STYLE_VIDEO; break; - case STYLE_LOGARITHMIC: invStyle = STYLE_LOGARITHMIC_REV; break; - case STYLE_LOGARITHMIC_REV: invStyle = STYLE_LOGARITHMIC; break; + case STYLE_LINEAR: + invStyle = STYLE_LINEAR_REV; + break; + case STYLE_LINEAR_REV: + invStyle = STYLE_LINEAR; + break; + case STYLE_VIDEO: + invStyle = STYLE_VIDEO_REV; + break; + case STYLE_VIDEO_REV: + invStyle = STYLE_VIDEO; + break; + case STYLE_LOGARITHMIC: + invStyle = STYLE_LOGARITHMIC_REV; + break; + case STYLE_LOGARITHMIC_REV: + invStyle = STYLE_LOGARITHMIC; + break; } setStyle(invStyle); } @@ -280,19 +289,17 @@ std::string ExposureContrastOpData::getCacheID() const bool ExposureContrastOpData::equals(const OpData & other) const { - if (!OpData::equals(other)) return false; + if (!OpData::equals(other)) + return false; const ExposureContrastOpData * ec = static_cast(&other); // NB: Please see note in DynamicProperty.h describing how dynamic // properties are compared for equality. - return getStyle() == ec->getStyle() - && getPivot() == ec->getPivot() - && getLogExposureStep() == ec->getLogExposureStep() - && getLogMidGray() == ec->getLogMidGray() - && m_exposure->equals(*(ec->m_exposure)) - && m_contrast->equals(*(ec->m_contrast)) - && m_gamma->equals(*(ec->m_gamma)); + return getStyle() == ec->getStyle() && getPivot() == ec->getPivot() + && getLogExposureStep() == ec->getLogExposureStep() + && getLogMidGray() == ec->getLogMidGray() && m_exposure->equals(*(ec->m_exposure)) + && m_contrast->equals(*(ec->m_contrast)) && m_gamma->equals(*(ec->m_gamma)); } bool ExposureContrastOpData::hasDynamicProperty(DynamicPropertyType type) const @@ -300,85 +307,45 @@ bool ExposureContrastOpData::hasDynamicProperty(DynamicPropertyType type) const bool res = false; switch (type) { - case DYNAMIC_PROPERTY_EXPOSURE: - res = m_exposure->isDynamic(); - break; - case DYNAMIC_PROPERTY_CONTRAST: - res = m_contrast->isDynamic(); - break; - case DYNAMIC_PROPERTY_GAMMA: - res = m_gamma->isDynamic(); - break; - case DYNAMIC_PROPERTY_GRADING_PRIMARY: - case DYNAMIC_PROPERTY_GRADING_RGBCURVE: - case DYNAMIC_PROPERTY_GRADING_TONE: - default: - break; + case DYNAMIC_PROPERTY_EXPOSURE: + res = m_exposure->isDynamic(); + break; + case DYNAMIC_PROPERTY_CONTRAST: + res = m_contrast->isDynamic(); + break; + case DYNAMIC_PROPERTY_GAMMA: + res = m_gamma->isDynamic(); + break; + case DYNAMIC_PROPERTY_GRADING_PRIMARY: + case DYNAMIC_PROPERTY_GRADING_RGBCURVE: + case DYNAMIC_PROPERTY_GRADING_TONE: + default: + break; } return res; } -DynamicPropertyRcPtr -ExposureContrastOpData::getDynamicProperty(DynamicPropertyType type) const +DynamicPropertyRcPtr ExposureContrastOpData::getDynamicProperty(DynamicPropertyType type) const { switch (type) { - case DYNAMIC_PROPERTY_EXPOSURE: - if (m_exposure->isDynamic()) - { - return m_exposure; - } - break; - case DYNAMIC_PROPERTY_CONTRAST: - if (m_contrast->isDynamic()) - { - return m_contrast; - } - break; - case DYNAMIC_PROPERTY_GAMMA: - if (m_gamma->isDynamic()) - { - return m_gamma; - } - break; - case DYNAMIC_PROPERTY_GRADING_PRIMARY: - case DYNAMIC_PROPERTY_GRADING_RGBCURVE: - case DYNAMIC_PROPERTY_GRADING_TONE: - default: - throw Exception("Dynamic property type not supported by ExposureContrast."); - } - throw Exception("ExposureContrast property is not dynamic."); -} - -void ExposureContrastOpData::replaceDynamicProperty(DynamicPropertyType type, - DynamicPropertyDoubleImplRcPtr & prop) -{ - auto propDouble = OCIO_DYNAMIC_POINTER_CAST(prop); - if (propDouble) - { - - switch (type) - { case DYNAMIC_PROPERTY_EXPOSURE: if (m_exposure->isDynamic()) { - m_exposure = propDouble; - return; + return m_exposure; } break; case DYNAMIC_PROPERTY_CONTRAST: if (m_contrast->isDynamic()) { - m_contrast = propDouble; - return; + return m_contrast; } break; case DYNAMIC_PROPERTY_GAMMA: if (m_gamma->isDynamic()) { - m_gamma = propDouble; - return; + return m_gamma; } break; case DYNAMIC_PROPERTY_GRADING_PRIMARY: @@ -386,6 +353,46 @@ void ExposureContrastOpData::replaceDynamicProperty(DynamicPropertyType type, case DYNAMIC_PROPERTY_GRADING_TONE: default: throw Exception("Dynamic property type not supported by ExposureContrast."); + } + throw Exception("ExposureContrast property is not dynamic."); +} + +void ExposureContrastOpData::replaceDynamicProperty( + DynamicPropertyType type, + DynamicPropertyDoubleImplRcPtr & prop) +{ + auto propDouble = OCIO_DYNAMIC_POINTER_CAST(prop); + if (propDouble) + { + + switch (type) + { + case DYNAMIC_PROPERTY_EXPOSURE: + if (m_exposure->isDynamic()) + { + m_exposure = propDouble; + return; + } + break; + case DYNAMIC_PROPERTY_CONTRAST: + if (m_contrast->isDynamic()) + { + m_contrast = propDouble; + return; + } + break; + case DYNAMIC_PROPERTY_GAMMA: + if (m_gamma->isDynamic()) + { + m_gamma = propDouble; + return; + } + break; + case DYNAMIC_PROPERTY_GRADING_PRIMARY: + case DYNAMIC_PROPERTY_GRADING_RGBCURVE: + case DYNAMIC_PROPERTY_GRADING_TONE: + default: + throw Exception("Dynamic property type not supported by ExposureContrast."); } throw Exception("ExposureContrast property is not dynamic."); } @@ -401,7 +408,8 @@ void ExposureContrastOpData::removeDynamicProperties() ExposureContrastOpData & ExposureContrastOpData::operator=(const ExposureContrastOpData & rhs) { - if (this == &rhs) return *this; + if (this == &rhs) + return *this; OpData::operator=(rhs); @@ -422,9 +430,9 @@ ExposureContrastOpData & ExposureContrastOpData::operator=(const ExposureContras { m_gamma->makeDynamic(); } - m_pivot = rhs.m_pivot; + m_pivot = rhs.m_pivot; m_logExposureStep = rhs.m_logExposureStep; - m_logMidGray = rhs.m_logMidGray; + m_logMidGray = rhs.m_logMidGray; return *this; } @@ -434,15 +442,15 @@ TransformDirection ExposureContrastOpData::getDirection() const noexcept { switch (m_style) { - case ExposureContrastOpData::STYLE_LINEAR: - case ExposureContrastOpData::STYLE_VIDEO: - case ExposureContrastOpData::STYLE_LOGARITHMIC: - return TRANSFORM_DIR_FORWARD; - - case ExposureContrastOpData::STYLE_LINEAR_REV: - case ExposureContrastOpData::STYLE_VIDEO_REV: - case ExposureContrastOpData::STYLE_LOGARITHMIC_REV: - return TRANSFORM_DIR_INVERSE; + case ExposureContrastOpData::STYLE_LINEAR: + case ExposureContrastOpData::STYLE_VIDEO: + case ExposureContrastOpData::STYLE_LOGARITHMIC: + return TRANSFORM_DIR_FORWARD; + + case ExposureContrastOpData::STYLE_LINEAR_REV: + case ExposureContrastOpData::STYLE_VIDEO_REV: + case ExposureContrastOpData::STYLE_LOGARITHMIC_REV: + return TRANSFORM_DIR_INVERSE; } return TRANSFORM_DIR_FORWARD; } diff --git a/src/OpenColorIO/ops/exposurecontrast/ExposureContrastOpData.h b/src/OpenColorIO/ops/exposurecontrast/ExposureContrastOpData.h index 468ce5f141..87a941a04d 100644 --- a/src/OpenColorIO/ops/exposurecontrast/ExposureContrastOpData.h +++ b/src/OpenColorIO/ops/exposurecontrast/ExposureContrastOpData.h @@ -14,10 +14,10 @@ namespace OCIO_NAMESPACE namespace EC { -constexpr double MIN_PIVOT = 0.001; -constexpr double MIN_CONTRAST = 0.001; -constexpr double VIDEO_OETF_POWER = 0.54644808743169393; // 1 / 1.83 -} +constexpr double MIN_PIVOT = 0.001; +constexpr double MIN_CONTRAST = 0.001; +constexpr double VIDEO_OETF_POWER = 0.54644808743169393; // 1 / 1.83 +} // namespace EC class ExposureContrastOpData; typedef OCIO_SHARED_PTR ExposureContrastOpDataRcPtr; @@ -27,23 +27,23 @@ typedef OCIO_SHARED_PTR ConstExposureContrastOpDat // contrast/gamma adjustments in application viewport windows. Typically this // op will be inserted into the view + display transform as part of the viewing // pipeline that converts the working color space into a display color space. -// +// // The op utilizes the DynamicProperties class in order to allow the exposure / // contrast controls to be adjusted by the user in real-time, even after the // Processor has been created and its ops have been finalized. Three dynamic // properties (or parameters) are available: -// +// // Exposure -- The exposure control attempts to simulate an adjustment to // the amount of light hitting the scene. It is in units of photographic // stops. The default is 0, and +1 is twice the amount light, -1 is half // the light. Ideally it is applied in scene-referred linear or log space // (before the viewing transform). -// +// // Contrast & Gamma -- The contrast and gamma controls raise or lower the // contrast relative to the pivot point. Values above the pivot point get // brighter as the control is increased, values below the pivot point get // darker. -// +// // It is useful to be able to apply a contrast/gamma-type control both before // and after a viewing transform. The contrast control is typically applied in // scene-referred linear or log space (before the viewing transform) and allows @@ -53,44 +53,44 @@ typedef OCIO_SHARED_PTR ConstExposureContrastOpDat // transform) with a pivot of 1. This allows the highlights and shadows of the // final image to be carefully inspected. Mathematically, the contrast and // gamma controls are the same, but two controls are provided since applications -// will likely want to make both available to users and hence two properties +// will likely want to make both available to users and hence two properties // are required. -// +// // The most common scenario in visual effects is for the application working // space to be scene-linear. However there are scenarios where applications // would like to offer exposure/contrast controls for images in log or video // color space (without the overhead of converting to scene-linear just to make -// these controls available). Therefore, the op provides algorithms for linear, -// log, and video style use-cases. The math is adjusted so that the user +// these controls available). Therefore, the op provides algorithms for linear, +// log, and video style use-cases. The math is adjusted so that the user // experience remains constant. -// +// // LINEAR STYLE -// +// // OUT = pivot * ( IN * 2^exposure / pivot )^contrast -// +// // VIDEO STYLE -// +// // OUT = pivot^G * ( IN * (2^exposure / pivot)^G )^contrast -// +// // LOG STYLE -// +// // logPivot = log2( pivot / 0.18 ) * logExposureStep + logMidGray // OUT = ( IN + exposure * logExposureStep - logPivot ) * contrast + logPivot -// +// // The pivot, logExposureStep, and logMidGray are settable (non-dynamic) // parameters. -// +// // Consider the following simplistic conversions from scene-linear to video and // logarithmic space: -// +// // VIDEO = LINEAR^G // LOG = log2( LINEAR / 0.18 ) * logExposureStep + logMidGray -// +// // For this scenario, one may show that the exposure and contrast/gamma controls // have exactly the same behavior for all three cases. In practice the video -// and log conversions will be more complicated, but hopefully this provides +// and log conversions will be more complicated, but hopefully this provides // some insight into the design of the equations. -// +// // The G parameter is set to 1/1.83. This value was chosen since that power is // a decent approximation to the ITU-R BT.709 OETF (i.e., camera) curve. Note // that for a scene-linear value of 0.18, the BT.709 curve gives 0.409, the @@ -100,7 +100,7 @@ typedef OCIO_SHARED_PTR ConstExposureContrastOpDat // to give some confidence that it is a reasonable choice.) The value is // currently hard-coded but could be brought forward to the API in the future, // if necessary. -// +// // The logExposureStep parameter is the size of one stop exposure change as // measured in the [0-1] normalized log encoding. This is settable in the API // since there is some variation in typical encodings. For example, Cineon used @@ -109,7 +109,7 @@ typedef OCIO_SHARED_PTR ConstExposureContrastOpDat // 0.057. The default is 0.088 but in practice the exact value is not critical // since users are typically using these controls simply to dynamically explore // their images on-the-fly rather than to bake in precise adjustments. -// +// // The logMidGray parameter is the position of a scene-linear value of 0.18 as // represented in the [0-1] normalized log encoding. This is settable in the // API since there is some variation in typical encodings. For example, ADX10 @@ -123,12 +123,12 @@ class ExposureContrastOpData : public OpData public: enum Style { - STYLE_LINEAR, // E/C to be applied to a linear space image - STYLE_LINEAR_REV, // Inverse of STYLE_LINEAR - STYLE_VIDEO, // E/C to be applied to a video space image - STYLE_VIDEO_REV, // Inverse of STYLE_VIDEO - STYLE_LOGARITHMIC, // E/C to be applied to a log space image - STYLE_LOGARITHMIC_REV // Inverse of STYLE_LOG + STYLE_LINEAR, // E/C to be applied to a linear space image + STYLE_LINEAR_REV, // Inverse of STYLE_LINEAR + STYLE_VIDEO, // E/C to be applied to a video space image + STYLE_VIDEO_REV, // Inverse of STYLE_VIDEO + STYLE_LOGARITHMIC, // E/C to be applied to a log space image + STYLE_LOGARITHMIC_REV // Inverse of STYLE_LOG }; static Style ConvertStringToStyle(const char * str); @@ -193,34 +193,25 @@ class ExposureContrastOpData : public OpData void setLogExposureStep(double step) { m_logExposureStep = step; } double getLogMidGray() const { return m_logMidGray; } - void setLogMidGray(double midGray) { m_logMidGray = midGray; } + void setLogMidGray(double midGray) { m_logMidGray = midGray; } - DynamicPropertyDoubleImplRcPtr getExposureProperty() const - { - return m_exposure; - } - DynamicPropertyDoubleImplRcPtr getContrastProperty() const - { - return m_contrast; - } - DynamicPropertyDoubleImplRcPtr getGammaProperty() const - { - return m_gamma; - } + DynamicPropertyDoubleImplRcPtr getExposureProperty() const { return m_exposure; } + DynamicPropertyDoubleImplRcPtr getContrastProperty() const { return m_contrast; } + DynamicPropertyDoubleImplRcPtr getGammaProperty() const { return m_gamma; } static constexpr double LOGEXPOSURESTEP_DEFAULT = 0.088; - static constexpr double LOGMIDGRAY_DEFAULT = 0.435; + static constexpr double LOGMIDGRAY_DEFAULT = 0.435; private: void invert() noexcept; - Style m_style = STYLE_LINEAR; + Style m_style = STYLE_LINEAR; DynamicPropertyDoubleImplRcPtr m_exposure; DynamicPropertyDoubleImplRcPtr m_contrast; DynamicPropertyDoubleImplRcPtr m_gamma; - double m_pivot = 0.18; + double m_pivot = 0.18; double m_logExposureStep = LOGEXPOSURESTEP_DEFAULT; - double m_logMidGray = LOGMIDGRAY_DEFAULT; + double m_logMidGray = LOGMIDGRAY_DEFAULT; }; bool operator==(const ExposureContrastOpData & lhs, const ExposureContrastOpData & rhs); diff --git a/src/OpenColorIO/ops/exposurecontrast/ExposureContrastOpGPU.cpp b/src/OpenColorIO/ops/exposurecontrast/ExposureContrastOpGPU.cpp index e12ecc88eb..83750cba16 100644 --- a/src/OpenColorIO/ops/exposurecontrast/ExposureContrastOpGPU.cpp +++ b/src/OpenColorIO/ops/exposurecontrast/ExposureContrastOpGPU.cpp @@ -10,7 +10,6 @@ #include "ops/exposurecontrast/ExposureContrastOpGPU.h" #include "utils/StringUtils.h" - namespace OCIO_NAMESPACE { namespace @@ -20,12 +19,13 @@ static constexpr char EC_EXPOSURE[] = "exposureVal"; static constexpr char EC_CONTRAST[] = "contrastVal"; static constexpr char EC_GAMMA[] = "gammaVal"; -void AddUniform(GpuShaderCreatorRcPtr & shaderCreator, - DynamicPropertyDoubleRcPtr prop, - const std::string & name) +void AddUniform( + GpuShaderCreatorRcPtr & shaderCreator, + DynamicPropertyDoubleRcPtr prop, + const std::string & name) { - GpuShaderCreator::DoubleGetter getDouble = std::bind(&DynamicPropertyDouble::getValue, - prop.get()); + GpuShaderCreator::DoubleGetter getDouble + = std::bind(&DynamicPropertyDouble::getValue, prop.get()); shaderCreator->addUniform(name.c_str(), getDouble); // Declare uniform. GpuShaderText stDecl(shaderCreator->getLanguage()); @@ -33,14 +33,15 @@ void AddUniform(GpuShaderCreatorRcPtr & shaderCreator, shaderCreator->addToDeclareShaderCode(stDecl.string().c_str()); } -std::string AddProperty(GpuShaderCreatorRcPtr & shaderCreator, - GpuShaderText & st, - DynamicPropertyDoubleImplRcPtr prop, - const std::string & name) +std::string AddProperty( + GpuShaderCreatorRcPtr & shaderCreator, + GpuShaderText & st, + DynamicPropertyDoubleImplRcPtr prop, + const std::string & name) { std::string finalName; - if(prop->isDynamic() && shaderCreator->getLanguage() != LANGUAGE_OSL_1) + if (prop->isDynamic() && shaderCreator->getLanguage() != LANGUAGE_OSL_1) { // Build the name for the uniform. The same type of property should give the same name, so // that uniform is declared only once, but multiple instances of the shader code can @@ -50,7 +51,7 @@ std::string AddProperty(GpuShaderCreatorRcPtr & shaderCreator, finalName = BuildResourceName(shaderCreator, "exposure_contrast", name); // Property is decoupled and added to shader creator. - auto shaderProp = prop->createEditableCopy(); + auto shaderProp = prop->createEditableCopy(); DynamicPropertyRcPtr newProp = shaderProp; shaderCreator->addDynamicProperty(newProp); auto newPropDouble = DynamicPropertyValue::AsDouble(newProp); @@ -66,8 +67,9 @@ std::string AddProperty(GpuShaderCreatorRcPtr & shaderCreator, if (shaderCreator->getLanguage() == LANGUAGE_OSL_1 && prop->isDynamic()) { - std::string msg("The dynamic properties are not yet supported by the 'Open Shading language"\ - " (OSL)' translation: The '"); + std::string msg( + "The dynamic properties are not yet supported by the 'Open Shading language" + " (OSL)' translation: The '"); msg += name; msg += "' dynamic property is replaced by a local variable."; @@ -78,25 +80,29 @@ std::string AddProperty(GpuShaderCreatorRcPtr & shaderCreator, return finalName; } -void AddProperties(GpuShaderCreatorRcPtr & shaderCreator, - GpuShaderText & st, - ConstExposureContrastOpDataRcPtr & ec, - std::string & exposureName, - std::string & contrastName, - std::string & gammaName) +void AddProperties( + GpuShaderCreatorRcPtr & shaderCreator, + GpuShaderText & st, + ConstExposureContrastOpDataRcPtr & ec, + std::string & exposureName, + std::string & contrastName, + std::string & gammaName) { exposureName = AddProperty(shaderCreator, st, ec->getExposureProperty(), EC_EXPOSURE); contrastName = AddProperty(shaderCreator, st, ec->getContrastProperty(), EC_CONTRAST); - gammaName = AddProperty(shaderCreator, st, ec->getGammaProperty(), EC_GAMMA); + gammaName = AddProperty(shaderCreator, st, ec->getGammaProperty(), EC_GAMMA); } -void AddECLinearShader(GpuShaderCreatorRcPtr & shaderCreator, - GpuShaderText & st, - ConstExposureContrastOpDataRcPtr & ec, - const std::string & exposureName, - const std::string & contrastName, - const std::string & gammaName) +void AddECLinearShader( + GpuShaderCreatorRcPtr & shaderCreator, + GpuShaderText & st, + ConstExposureContrastOpDataRcPtr & ec, + const std::string & exposureName, + const std::string & contrastName, + const std::string & gammaName) { + // clang-format off + const double pivot = std::max(EC::MIN_PIVOT, ec->getPivot()); st.newLine() << st.floatDecl("exposure") << " = pow( 2., " << exposureName << " );"; @@ -122,15 +128,20 @@ void AddECLinearShader(GpuShaderCreatorRcPtr & shaderCreator, st.dedent(); } st.newLine() << "}"; + + // clang-format on } -void AddECLinearRevShader(GpuShaderCreatorRcPtr & shaderCreator, - GpuShaderText & st, - ConstExposureContrastOpDataRcPtr & ec, - const std::string & exposureName, - const std::string & contrastName, - const std::string & gammaName) +void AddECLinearRevShader( + GpuShaderCreatorRcPtr & shaderCreator, + GpuShaderText & st, + ConstExposureContrastOpDataRcPtr & ec, + const std::string & exposureName, + const std::string & contrastName, + const std::string & gammaName) { + // clang-format off + const double pivot = std::max(EC::MIN_PIVOT, ec->getPivot()); st.newLine() << st.floatDecl("exposure") << " = pow( 2., " << exposureName << " );"; @@ -157,15 +168,20 @@ void AddECLinearRevShader(GpuShaderCreatorRcPtr & shaderCreator, st.newLine() << shaderCreator->getPixelName() << ".rgb = " << shaderCreator->getPixelName() << ".rgb / exposure;"; + + // clang-format on } -void AddECVideoShader(GpuShaderCreatorRcPtr & shaderCreator, - GpuShaderText & st, - ConstExposureContrastOpDataRcPtr & ec, - const std::string & exposureName, - const std::string & contrastName, - const std::string & gammaName) +void AddECVideoShader( + GpuShaderCreatorRcPtr & shaderCreator, + GpuShaderText & st, + ConstExposureContrastOpDataRcPtr & ec, + const std::string & exposureName, + const std::string & contrastName, + const std::string & gammaName) { + // clang-format off + double pivot = std::pow(std::max(EC::MIN_PIVOT, ec->getPivot()), EC::VIDEO_OETF_POWER); st.newLine() << st.floatDecl("exposure") << " = pow( pow( 2., " << exposureName << " ), " @@ -191,15 +207,20 @@ void AddECVideoShader(GpuShaderCreatorRcPtr & shaderCreator, st.dedent(); } st.newLine() << "}"; + + // clang-format on } -void AddECVideoRevShader(GpuShaderCreatorRcPtr & shaderCreator, - GpuShaderText & st, - ConstExposureContrastOpDataRcPtr & ec, - const std::string & exposureName, - const std::string & contrastName, - const std::string & gammaName) +void AddECVideoRevShader( + GpuShaderCreatorRcPtr & shaderCreator, + GpuShaderText & st, + ConstExposureContrastOpDataRcPtr & ec, + const std::string & exposureName, + const std::string & contrastName, + const std::string & gammaName) { + // clang-format off + double pivot = std::pow(std::max(EC::MIN_PIVOT, ec->getPivot()), EC::VIDEO_OETF_POWER); st.newLine() << st.floatDecl("exposure") << " = pow( pow( 2., " << exposureName << " ), " @@ -227,15 +248,20 @@ void AddECVideoRevShader(GpuShaderCreatorRcPtr & shaderCreator, st.newLine() << shaderCreator->getPixelName() << ".rgb = " << shaderCreator->getPixelName() << ".rgb / exposure;"; + + // clang-format on } -void AddECLogarithmicShader(GpuShaderCreatorRcPtr & shaderCreator, - GpuShaderText & st, - ConstExposureContrastOpDataRcPtr & ec, - const std::string & exposureName, - const std::string & contrastName, - const std::string & gammaName) +void AddECLogarithmicShader( + GpuShaderCreatorRcPtr & shaderCreator, + GpuShaderText & st, + ConstExposureContrastOpDataRcPtr & ec, + const std::string & exposureName, + const std::string & contrastName, + const std::string & gammaName) { + // clang-format off + double pivot = std::max(EC::MIN_PIVOT, ec->getPivot()); float logPivot = (float)std::max(0., std::log2(pivot / 0.18) * ec->getLogExposureStep() + @@ -250,15 +276,20 @@ void AddECLogarithmicShader(GpuShaderCreatorRcPtr & shaderCreator, st.newLine() << shaderCreator->getPixelName() << ".rgb = " << shaderCreator->getPixelName() << ".rgb * contrast + offset;"; + + // clang-format on } -void AddECLogarithmicRevShader(GpuShaderCreatorRcPtr & shaderCreator, - GpuShaderText & st, - ConstExposureContrastOpDataRcPtr & ec, - const std::string & exposureName, - const std::string & contrastName, - const std::string & gammaName) +void AddECLogarithmicRevShader( + GpuShaderCreatorRcPtr & shaderCreator, + GpuShaderText & st, + ConstExposureContrastOpDataRcPtr & ec, + const std::string & exposureName, + const std::string & contrastName, + const std::string & gammaName) { + // clang-format off + double pivot = std::max(EC::MIN_PIVOT, ec->getPivot()); float logPivot = (float)std::max(0., std::log2(pivot / 0.18) * ec->getLogExposureStep() + @@ -273,13 +304,15 @@ void AddECLogarithmicRevShader(GpuShaderCreatorRcPtr & shaderCreator, st.newLine() << shaderCreator->getPixelName() << ".rgb = " << shaderCreator->getPixelName() << ".rgb / contrast + offset;"; -} - + // clang-format on } -void GetExposureContrastGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, - ConstExposureContrastOpDataRcPtr & ec) +} // namespace + +void GetExposureContrastGPUShaderProgram( + GpuShaderCreatorRcPtr & shaderCreator, + ConstExposureContrastOpDataRcPtr & ec) { std::string exposureName; std::string contrastName; @@ -288,6 +321,8 @@ void GetExposureContrastGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, GpuShaderText st(shaderCreator->getLanguage()); st.indent(); + // clang-format off + st.newLine() << ""; st.newLine() << "// Add ExposureContrast '" << ExposureContrastOpData::ConvertStyleToString(ec->getStyle()) @@ -296,31 +331,30 @@ void GetExposureContrastGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, st.newLine() << "{"; st.indent(); - AddProperties(shaderCreator, st, ec, - exposureName, - contrastName, - gammaName); + // clang-format on + + AddProperties(shaderCreator, st, ec, exposureName, contrastName, gammaName); switch (ec->getStyle()) { - case ExposureContrastOpData::STYLE_LINEAR: - AddECLinearShader(shaderCreator, st, ec, exposureName, contrastName, gammaName); - break; - case ExposureContrastOpData::STYLE_LINEAR_REV: - AddECLinearRevShader(shaderCreator, st, ec, exposureName, contrastName, gammaName); - break; - case ExposureContrastOpData::STYLE_VIDEO: - AddECVideoShader(shaderCreator, st, ec, exposureName, contrastName, gammaName); - break; - case ExposureContrastOpData::STYLE_VIDEO_REV: - AddECVideoRevShader(shaderCreator, st, ec, exposureName, contrastName, gammaName); - break; - case ExposureContrastOpData::STYLE_LOGARITHMIC: - AddECLogarithmicShader(shaderCreator, st, ec, exposureName, contrastName, gammaName); - break; - case ExposureContrastOpData::STYLE_LOGARITHMIC_REV: - AddECLogarithmicRevShader(shaderCreator, st, ec, exposureName, contrastName, gammaName); - break; + case ExposureContrastOpData::STYLE_LINEAR: + AddECLinearShader(shaderCreator, st, ec, exposureName, contrastName, gammaName); + break; + case ExposureContrastOpData::STYLE_LINEAR_REV: + AddECLinearRevShader(shaderCreator, st, ec, exposureName, contrastName, gammaName); + break; + case ExposureContrastOpData::STYLE_VIDEO: + AddECVideoShader(shaderCreator, st, ec, exposureName, contrastName, gammaName); + break; + case ExposureContrastOpData::STYLE_VIDEO_REV: + AddECVideoRevShader(shaderCreator, st, ec, exposureName, contrastName, gammaName); + break; + case ExposureContrastOpData::STYLE_LOGARITHMIC: + AddECLogarithmicShader(shaderCreator, st, ec, exposureName, contrastName, gammaName); + break; + case ExposureContrastOpData::STYLE_LOGARITHMIC_REV: + AddECLogarithmicRevShader(shaderCreator, st, ec, exposureName, contrastName, gammaName); + break; } st.dedent(); diff --git a/src/OpenColorIO/ops/exposurecontrast/ExposureContrastOpGPU.h b/src/OpenColorIO/ops/exposurecontrast/ExposureContrastOpGPU.h index 3fcf39b2d6..0cde649791 100644 --- a/src/OpenColorIO/ops/exposurecontrast/ExposureContrastOpGPU.h +++ b/src/OpenColorIO/ops/exposurecontrast/ExposureContrastOpGPU.h @@ -9,12 +9,12 @@ #include "GpuShaderUtils.h" #include "ops/exposurecontrast/ExposureContrastOpData.h" - namespace OCIO_NAMESPACE { -void GetExposureContrastGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, - ConstExposureContrastOpDataRcPtr & ec); +void GetExposureContrastGPUShaderProgram( + GpuShaderCreatorRcPtr & shaderCreator, + ConstExposureContrastOpDataRcPtr & ec); } // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/ops/fixedfunction/FixedFunctionOp.cpp b/src/OpenColorIO/ops/fixedfunction/FixedFunctionOp.cpp index ac672e1190..bef9dbe4f2 100644 --- a/src/OpenColorIO/ops/fixedfunction/FixedFunctionOp.cpp +++ b/src/OpenColorIO/ops/fixedfunction/FixedFunctionOp.cpp @@ -7,9 +7,9 @@ #include #include "GpuShaderUtils.h" +#include "ops/fixedfunction/FixedFunctionOp.h" #include "ops/fixedfunction/FixedFunctionOpCPU.h" #include "ops/fixedfunction/FixedFunctionOpGPU.h" -#include "ops/fixedfunction/FixedFunctionOp.h" #include "transforms/FixedFunctionTransform.h" namespace OCIO_NAMESPACE @@ -25,7 +25,7 @@ typedef OCIO_SHARED_PTR ConstFixedFunctionOpRcPtr; class FixedFunctionOp : public Op { public: - FixedFunctionOp() = delete; + FixedFunctionOp() = delete; FixedFunctionOp(const FixedFunctionOp &) = delete; explicit FixedFunctionOp(FixedFunctionOpDataRcPtr & func); @@ -48,13 +48,15 @@ class FixedFunctionOp : public Op void extractGpuShaderInfo(GpuShaderCreatorRcPtr & shaderCreator) const override; protected: - ConstFixedFunctionOpDataRcPtr fnData() const { return DynamicPtrCast(data()); } + ConstFixedFunctionOpDataRcPtr fnData() const + { + return DynamicPtrCast(data()); + } FixedFunctionOpDataRcPtr fnData() { return DynamicPtrCast(data()); } }; - FixedFunctionOp::FixedFunctionOp(FixedFunctionOpDataRcPtr & func) - : Op() + : Op() { data() = func; } @@ -88,7 +90,8 @@ bool FixedFunctionOp::isSameType(ConstOpRcPtr & op) const bool FixedFunctionOp::isInverse(ConstOpRcPtr & op) const { ConstFixedFunctionOpRcPtr typedRcPtr = DynamicPtrCast(op); - if (!typedRcPtr) return false; + if (!typedRcPtr) + return false; ConstFixedFunctionOpDataRcPtr fnOpData = typedRcPtr->fnData(); return fnData()->isInverse(fnOpData); @@ -131,25 +134,23 @@ void FixedFunctionOp::extractGpuShaderInfo(GpuShaderCreatorRcPtr & shaderCreator GetFixedFunctionGPUShaderProgram(shaderCreator, fnOpData); } - -} // Anon namespace - - - +} // namespace /////////////////////////////////////////////////////////////////////////// - -void CreateFixedFunctionOp(OpRcPtrVec & ops, FixedFunctionOpData::Style style, - const FixedFunctionOpData::Params & params) +void CreateFixedFunctionOp( + OpRcPtrVec & ops, + FixedFunctionOpData::Style style, + const FixedFunctionOpData::Params & params) { FixedFunctionOpDataRcPtr funcData = std::make_shared(style, params); CreateFixedFunctionOp(ops, funcData, TRANSFORM_DIR_FORWARD); } -void CreateFixedFunctionOp(OpRcPtrVec & ops, - FixedFunctionOpDataRcPtr & funcData, - TransformDirection direction) +void CreateFixedFunctionOp( + OpRcPtrVec & ops, + FixedFunctionOpDataRcPtr & funcData, + TransformDirection direction) { auto func = funcData; if (direction == TRANSFORM_DIR_INVERSE) @@ -169,17 +170,18 @@ void CreateFixedFunctionTransform(GroupTransformRcPtr & group, ConstOpRcPtr & op { throw Exception("CreateFixedFunctionTransform: op has to be a FixedFunctionOp"); } - auto ffData = DynamicPtrCast(op->data()); + auto ffData = DynamicPtrCast(op->data()); auto ffTransform = FixedFunctionTransform::Create(FIXED_FUNCTION_ACES_RED_MOD_03); - auto & data = dynamic_cast(ffTransform.get())->data(); - data = *ffData; + auto & data = dynamic_cast(ffTransform.get())->data(); + data = *ffData; group->appendTransform(ffTransform); } -void BuildFixedFunctionOp(OpRcPtrVec & ops, - const FixedFunctionTransform & transform, - TransformDirection dir) +void BuildFixedFunctionOp( + OpRcPtrVec & ops, + const FixedFunctionTransform & transform, + TransformDirection dir) { const auto & data = dynamic_cast(transform).data(); data.validate(); @@ -188,6 +190,4 @@ void BuildFixedFunctionOp(OpRcPtrVec & ops, CreateFixedFunctionOp(ops, funcData, dir); } - } // namespace OCIO_NAMESPACE - diff --git a/src/OpenColorIO/ops/fixedfunction/FixedFunctionOp.h b/src/OpenColorIO/ops/fixedfunction/FixedFunctionOp.h index 659f926d61..9588a3bd19 100644 --- a/src/OpenColorIO/ops/fixedfunction/FixedFunctionOp.h +++ b/src/OpenColorIO/ops/fixedfunction/FixedFunctionOp.h @@ -1,11 +1,9 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_FIXEDFUNCTION_H #define INCLUDED_OCIO_FIXEDFUNCTION_H - #include #include @@ -13,17 +11,18 @@ #include "Op.h" #include "ops/fixedfunction/FixedFunctionOpData.h" - namespace OCIO_NAMESPACE { -void CreateFixedFunctionOp(OpRcPtrVec & ops, - FixedFunctionOpData::Style style, - const FixedFunctionOpData::Params & data); +void CreateFixedFunctionOp( + OpRcPtrVec & ops, + FixedFunctionOpData::Style style, + const FixedFunctionOpData::Params & data); -void CreateFixedFunctionOp(OpRcPtrVec & ops, - FixedFunctionOpDataRcPtr & funcData, - TransformDirection direction); +void CreateFixedFunctionOp( + OpRcPtrVec & ops, + FixedFunctionOpDataRcPtr & funcData, + TransformDirection direction); // Create a copy of the fixed function transform in the op and append it to // the GroupTransform. diff --git a/src/OpenColorIO/ops/fixedfunction/FixedFunctionOpCPU.cpp b/src/OpenColorIO/ops/fixedfunction/FixedFunctionOpCPU.cpp index a974cb7880..e37f86ce07 100644 --- a/src/OpenColorIO/ops/fixedfunction/FixedFunctionOpCPU.cpp +++ b/src/OpenColorIO/ops/fixedfunction/FixedFunctionOpCPU.cpp @@ -10,7 +10,6 @@ #include "MathUtils.h" #include "ops/fixedfunction/FixedFunctionOpCPU.h" - namespace OCIO_NAMESPACE { @@ -210,47 +209,43 @@ class Renderer_LUV_TO_XYZ : public OpCPU void apply(const void * inImg, void * outImg, long numPixels) const override; }; - /////////////////////////////////////////////////////////////////////////////// - - - // Calculate a saturation measure in a safe manner. -__inline float CalcSatWeight(const float red, const float grn, const float blu, - const float noiseLimit) +__inline float +CalcSatWeight(const float red, const float grn, const float blu, const float noiseLimit) { - const float minVal = std::min( red, std::min( grn, blu ) ); - const float maxVal = std::max( red, std::max( grn, blu ) ); + const float minVal = std::min(red, std::min(grn, blu)); + const float maxVal = std::max(red, std::max(grn, blu)); // The numerator is clamped to prevent problems from negative values, // the denominator is clamped higher to prevent dark noise from being // classified as having high saturation. - const float sat = ( std::max( 1e-10f, maxVal) - std::max( 1e-10f, minVal) ) / - std::max( noiseLimit, maxVal); + const float sat + = (std::max(1e-10f, maxVal) - std::max(1e-10f, minVal)) / std::max(noiseLimit, maxVal); return sat; } Renderer_ACES_RedMod03_Fwd::Renderer_ACES_RedMod03_Fwd(ConstFixedFunctionOpDataRcPtr & /*data*/) - : OpCPU() + : OpCPU() { // Constants that define a scale and offset to be applied to the red channel. - m_1minusScale = 1.f - 0.85f; // (1. - scale) from the original ctl code - m_pivot = 0.03f; // offset will be applied to unnormalized input values + m_1minusScale = 1.f - 0.85f; // (1. - scale) from the original ctl code + m_pivot = 0.03f; // offset will be applied to unnormalized input values - //float width = 120; // width of hue region (in degrees) - // Actually want to multiply by 4 / width (in radians). - // Note: _inv_width = 4 / (width * pi/180) + // float width = 120; // width of hue region (in degrees) + // Actually want to multiply by 4 / width (in radians). + // Note: _inv_width = 4 / (width * pi/180) m_inv_width = 1.9098593171027443f; } -__inline float CalcHueWeight(const float red, const float grn, const float blu, - const float inv_width) +__inline float +CalcHueWeight(const float red, const float grn, const float blu, const float inv_width) { // Convert RGB to Yab (luma/chroma). - const float a = 2.f * red - (grn + blu); + const float a = 2.f * red - (grn + blu); static constexpr float sqrt3 = 1.7320508075688772f; - const float b = sqrt3 * (grn - blu); + const float b = sqrt3 * (grn - blu); const float hue = std::atan2(b, a); @@ -259,34 +254,35 @@ __inline float CalcHueWeight(const float red, const float grn, const float blu, // chosen to maintain this. // Center the hue and re-wrap to +/-pi. - //float _center = 0.0f; // center hue angle (in radians, red = 0.) + // float _center = 0.0f; // center hue angle (in radians, red = 0.) // Note: For this version, center = 0, so this is a no-op. // Leaving the code here in case center needs to be tweaked. - //hue -= _center; - //hue = (hue < -_pi) ? hue + _twopi: hue; - //hue = (hue > _pi) ? hue - _twopi: hue; + // hue -= _center; + // hue = (hue < -_pi) ? hue + _twopi: hue; + // hue = (hue > _pi) ? hue - _twopi: hue; // Determine normalized input coords to B-spline. const float knot_coord = hue * inv_width + 2.f; - const int j = (int) knot_coord; // index + const int j = (int)knot_coord; // index // These are the coefficients for a quadratic B-spline basis function. // (All coefs taken from the ACES ctl code on github.) static constexpr float _M[4][4] = { - { 0.25f, 0.00f, 0.00f, 0.00f}, - {-0.75f, 0.75f, 0.75f, 0.25f}, - { 0.75f, -1.50f, 0.00f, 1.00f}, - {-0.25f, 0.75f, -0.75f, 0.25f} }; + { 0.25f, 0.00f, 0.00f, 0.00f}, + {-0.75f, 0.75f, 0.75f, 0.25f}, + { 0.75f, -1.50f, 0.00f, 1.00f}, + {-0.25f, 0.75f, -0.75f, 0.25f} + }; // Hue is in range of the window, calculate weight. float f_H = 0.f; - if ( j >= 0 && j < 4) + if (j >= 0 && j < 4) { - const float t = knot_coord - j; // fractional component + const float t = knot_coord - j; // fractional component // Calculate quadratic B-spline weighting function. - const float* coefs = _M[j]; - f_H = coefs[3] + t * (coefs[2] + t * (coefs[1] + t * coefs[0])); + const float * coefs = _M[j]; + f_H = coefs[3] + t * (coefs[2] + t * (coefs[1] + t * coefs[0])); } return f_H; @@ -295,9 +291,9 @@ __inline float CalcHueWeight(const float red, const float grn, const float blu, void Renderer_ACES_RedMod03_Fwd::apply(const void * inImg, void * outImg, long numPixels) const { const float * in = (const float *)inImg; - float * out = (float *)outImg; + float * out = (float *)outImg; - for(long idx=0; idx= blu) // red >= grn >= blu { - const float hue_fac = (grn - blu) / std::max( 1e-10f, red - blu); - grn = hue_fac * (newRed - blu) + blu; + const float hue_fac = (grn - blu) / std::max(1e-10f, red - blu); + grn = hue_fac * (newRed - blu) + blu; } - else // red >= blu >= grn + else // red >= blu >= grn { - const float hue_fac = (blu - grn) / std::max( 1e-10f, red - grn); - blu = hue_fac * (newRed - grn) + grn; + const float hue_fac = (blu - grn) / std::max(1e-10f, red - grn); + blu = hue_fac * (newRed - grn) + grn; } red = newRed; @@ -338,22 +334,22 @@ void Renderer_ACES_RedMod03_Fwd::apply(const void * inImg, void * outImg, long n out[2] = blu; out[3] = in[3]; - in += 4; + in += 4; out += 4; } } Renderer_ACES_RedMod03_Inv::Renderer_ACES_RedMod03_Inv(ConstFixedFunctionOpDataRcPtr & data) - : Renderer_ACES_RedMod03_Fwd(data) + : Renderer_ACES_RedMod03_Fwd(data) { } void Renderer_ACES_RedMod03_Inv::apply(const void * inImg, void * outImg, long numPixels) const { const float * in = (const float *)inImg; - float * out = (float *)outImg; + float * out = (float *)outImg; - for(long idx=0; idx 0.f) { - const float minChan = (grn < blu) ? grn: blu; + const float minChan = (grn < blu) ? grn : blu; const float a = f_H * m_1minusScale - 1.f; const float b = red - f_H * (m_pivot + minChan) * m_1minusScale; const float c = f_H * m_pivot * minChan * m_1minusScale; - const float newRed = ( -b - sqrt( b * b - 4.f * a * c)) / ( 2.f * a); + const float newRed = (-b - sqrt(b * b - 4.f * a * c)) / (2.f * a); // Restore hue. if (grn >= blu) // red >= grn >= blu { - const float hue_fac = (grn - blu) / std::max( 1e-10f, red - blu); - grn = hue_fac * (newRed - blu) + blu; + const float hue_fac = (grn - blu) / std::max(1e-10f, red - blu); + grn = hue_fac * (newRed - blu) + blu; } - else // red >= blu >= grn + else // red >= blu >= grn { - const float hue_fac = (blu - grn) / std::max( 1e-10f, red - grn); - blu = hue_fac * (newRed - grn) + grn; + const float hue_fac = (blu - grn) / std::max(1e-10f, red - grn); + blu = hue_fac * (newRed - grn) + grn; } red = newRed; @@ -390,32 +386,32 @@ void Renderer_ACES_RedMod03_Inv::apply(const void * inImg, void * outImg, long n out[2] = blu; out[3] = in[3]; - in += 4; + in += 4; out += 4; } } Renderer_ACES_RedMod10_Fwd::Renderer_ACES_RedMod10_Fwd(ConstFixedFunctionOpDataRcPtr & /*data*/) - : OpCPU() + : OpCPU() { // Constants that define a scale and offset to be applied to the red channel. - m_1minusScale = 1.f - 0.82f; // (1. - scale) from the original ctl code - m_pivot = 0.03f; // offset will be applied to unnormalized input values + m_1minusScale = 1.f - 0.82f; // (1. - scale) from the original ctl code + m_pivot = 0.03f; // offset will be applied to unnormalized input values - //float width = 135; // width of hue region (in degrees) - // Actually want to multiply by 4 / width (in radians). - // Note: _inv_width = 4 / (width * pi/180) + // float width = 135; // width of hue region (in degrees) + // Actually want to multiply by 4 / width (in radians). + // Note: _inv_width = 4 / (width * pi/180) m_inv_width = 1.6976527263135504f; } void Renderer_ACES_RedMod10_Fwd::apply(const void * inImg, void * outImg, long numPixels) const { const float * in = (const float *)inImg; - float * out = (float *)outImg; + float * out = (float *)outImg; - for(long idx=0; idx 0.f) { - const float minChan = (grn < blu) ? grn: blu; + const float minChan = (grn < blu) ? grn : blu; const float a = f_H * m_1minusScale - 1.f; const float b = red - f_H * (m_pivot + minChan) * m_1minusScale; const float c = f_H * m_pivot * minChan * m_1minusScale; // TODO: Replace sqrt with faster approx. (also in RedMod03 above). - red = ( -b - sqrt( b * b - 4.f * a * c)) / ( 2.f * a); + red = (-b - sqrt(b * b - 4.f * a * c)) / (2.f * a); } out[0] = red; @@ -479,44 +475,45 @@ void Renderer_ACES_RedMod10_Inv::apply(const void * inImg, void * outImg, long n out[2] = blu; out[3] = in[3]; - in += 4; + in += 4; out += 4; } } -Renderer_ACES_Glow03_Fwd::Renderer_ACES_Glow03_Fwd(ConstFixedFunctionOpDataRcPtr & /*data*/, - float glowGain, - float glowMid) - : OpCPU() +Renderer_ACES_Glow03_Fwd::Renderer_ACES_Glow03_Fwd( + ConstFixedFunctionOpDataRcPtr & /*data*/, + float glowGain, + float glowMid) + : OpCPU() { m_glowGain = glowGain; - m_glowMid = glowMid; + m_glowMid = glowMid; } __inline float rgbToYC(const float red, const float grn, const float blu) { // Convert RGB to YC (luma + chroma factor). const float YCRadiusWeight = 1.75f; - const float chroma = sqrt( blu*(blu-grn) + grn*(grn-red) + red*(red-blu) ); - const float YC = (blu + grn + red + YCRadiusWeight * chroma) / 3.f; + const float chroma = sqrt(blu * (blu - grn) + grn * (grn - red) + red * (red - blu)); + const float YC = (blu + grn + red + YCRadiusWeight * chroma) / 3.f; return YC; } __inline float SigmoidShaper(const float sat) { - const float x = (sat - 0.4f) * 5.f; + const float x = (sat - 0.4f) * 5.f; const float sign = std::copysignf(1.f, x); - const float t = std::max(0.f, 1.f - 0.5f * sign * x); - const float s = (1.f + sign * (1.f - t * t)) * 0.5f; + const float t = std::max(0.f, 1.f - 0.5f * sign * x); + const float s = (1.f + sign * (1.f - t * t)) * 0.5f; return s; } void Renderer_ACES_Glow03_Fwd::apply(const void * inImg, void * outImg, long numPixels) const { const float * in = (const float *)inImg; - float * out = (float *)outImg; + float * out = (float *)outImg; - for(long idx=0; idxgetParams()[0]; - m_limMagenta = (float) data->getParams()[1]; - m_limYellow = (float) data->getParams()[2]; - m_thrCyan = (float) data->getParams()[3]; - m_thrMagenta = (float) data->getParams()[4]; - m_thrYellow = (float) data->getParams()[5]; - m_power = (float) data->getParams()[6]; + m_limCyan = (float)data->getParams()[0]; + m_limMagenta = (float)data->getParams()[1]; + m_limYellow = (float)data->getParams()[2]; + m_thrCyan = (float)data->getParams()[3]; + m_thrMagenta = (float)data->getParams()[4]; + m_thrYellow = (float)data->getParams()[5]; + m_power = (float)data->getParams()[6]; // Precompute scale factor for y = 1 intersect auto f_scale = [this](float lim, float thr) { - return (lim - thr) / std::pow(std::pow((1.0f - thr) / (lim - thr), -m_power) - 1.0f, 1.0f / m_power); + return (lim - thr) + / std::pow(std::pow((1.0f - thr) / (lim - thr), -m_power) - 1.0f, 1.0f / m_power); }; - m_scaleCyan = f_scale(m_limCyan, m_thrCyan); - m_scaleMagenta = f_scale(m_limMagenta, m_thrMagenta); - m_scaleYellow = f_scale(m_limYellow, m_thrYellow); + m_scaleCyan = f_scale(m_limCyan, m_thrCyan); + m_scaleMagenta = f_scale(m_limMagenta, m_thrMagenta); + m_scaleYellow = f_scale(m_limYellow, m_thrYellow); } void Renderer_ACES_GamutComp13_Fwd::apply(const void * inImg, void * outImg, long numPixels) const { const float * in = (const float *)inImg; - float * out = (float *)outImg; + float * out = (float *)outImg; - for(long idx=0; idxgetStyle(); + const auto fwd = FixedFunctionOpData::REC2100_SURROUND_FWD == data->getStyle(); const float gamma = fwd ? (float)data->getParams()[0] : (float)(1. / data->getParams()[0]); - m_gamma = gamma - 1.f; // compute Y^gamma / Y + m_gamma = gamma - 1.f; // compute Y^gamma / Y } void Renderer_REC2100_Surround::apply(const void * inImg, void * outImg, long numPixels) const { const float * in = (const float *)inImg; - float * out = (float *)outImg; + float * out = (float *)outImg; - for(long idx=0; idxgetStyle()) + switch (func->getStyle()) { case FixedFunctionOpData::ACES_RED_MOD_03_FWD: { diff --git a/src/OpenColorIO/ops/fixedfunction/FixedFunctionOpData.cpp b/src/OpenColorIO/ops/fixedfunction/FixedFunctionOpData.cpp index ce835fd6a8..5b48963661 100644 --- a/src/OpenColorIO/ops/fixedfunction/FixedFunctionOpData.cpp +++ b/src/OpenColorIO/ops/fixedfunction/FixedFunctionOpData.cpp @@ -5,8 +5,8 @@ #include -#include "ops/fixedfunction/FixedFunctionOpData.h" #include "Platform.h" +#include "ops/fixedfunction/FixedFunctionOpData.h" namespace OCIO_NAMESPACE { @@ -16,30 +16,29 @@ namespace DefaultValues const int FLOAT_DECIMALS = 7; } -constexpr char ACES_RED_MOD_03_FWD_STR[] = "RedMod03Fwd"; -constexpr char ACES_RED_MOD_03_REV_STR[] = "RedMod03Rev"; -constexpr char ACES_RED_MOD_10_FWD_STR[] = "RedMod10Fwd"; -constexpr char ACES_RED_MOD_10_REV_STR[] = "RedMod10Rev"; -constexpr char ACES_GLOW_03_FWD_STR[] = "Glow03Fwd"; -constexpr char ACES_GLOW_03_REV_STR[] = "Glow03Rev"; -constexpr char ACES_GLOW_10_FWD_STR[] = "Glow10Fwd"; -constexpr char ACES_GLOW_10_REV_STR[] = "Glow10Rev"; -constexpr char ACES_DARK_TO_DIM_10_STR[] = "DarkToDim10"; -constexpr char ACES_DIM_TO_DARK_10_STR[] = "DimToDark10"; -constexpr char ACES_GAMUT_COMP_13_FWD_STR[]= "GamutComp13Fwd"; -constexpr char ACES_GAMUT_COMP_13_REV_STR[]= "GamutComp13Rev"; -constexpr char SURROUND_STR[] = "Surround"; // Old name for Rec2100SurroundFwd -constexpr char REC_2100_SURROUND_FWD_STR[] = "Rec2100SurroundFwd"; -constexpr char REC_2100_SURROUND_REV_STR[] = "Rec2100SurroundRev"; -constexpr char RGB_TO_HSV_STR[] = "RGB_TO_HSV"; -constexpr char HSV_TO_RGB_STR[] = "HSV_TO_RGB"; -constexpr char XYZ_TO_xyY_STR[] = "XYZ_TO_xyY"; -constexpr char xyY_TO_XYZ_STR[] = "xyY_TO_XYZ"; -constexpr char XYZ_TO_uvY_STR[] = "XYZ_TO_uvY"; -constexpr char uvY_TO_XYZ_STR[] = "uvY_TO_XYZ"; -constexpr char XYZ_TO_LUV_STR[] = "XYZ_TO_LUV"; -constexpr char LUV_TO_XYZ_STR[] = "LUV_TO_XYZ"; - +constexpr char ACES_RED_MOD_03_FWD_STR[] = "RedMod03Fwd"; +constexpr char ACES_RED_MOD_03_REV_STR[] = "RedMod03Rev"; +constexpr char ACES_RED_MOD_10_FWD_STR[] = "RedMod10Fwd"; +constexpr char ACES_RED_MOD_10_REV_STR[] = "RedMod10Rev"; +constexpr char ACES_GLOW_03_FWD_STR[] = "Glow03Fwd"; +constexpr char ACES_GLOW_03_REV_STR[] = "Glow03Rev"; +constexpr char ACES_GLOW_10_FWD_STR[] = "Glow10Fwd"; +constexpr char ACES_GLOW_10_REV_STR[] = "Glow10Rev"; +constexpr char ACES_DARK_TO_DIM_10_STR[] = "DarkToDim10"; +constexpr char ACES_DIM_TO_DARK_10_STR[] = "DimToDark10"; +constexpr char ACES_GAMUT_COMP_13_FWD_STR[] = "GamutComp13Fwd"; +constexpr char ACES_GAMUT_COMP_13_REV_STR[] = "GamutComp13Rev"; +constexpr char SURROUND_STR[] = "Surround"; // Old name for Rec2100SurroundFwd +constexpr char REC_2100_SURROUND_FWD_STR[] = "Rec2100SurroundFwd"; +constexpr char REC_2100_SURROUND_REV_STR[] = "Rec2100SurroundRev"; +constexpr char RGB_TO_HSV_STR[] = "RGB_TO_HSV"; +constexpr char HSV_TO_RGB_STR[] = "HSV_TO_RGB"; +constexpr char XYZ_TO_xyY_STR[] = "XYZ_TO_xyY"; +constexpr char xyY_TO_XYZ_STR[] = "xyY_TO_XYZ"; +constexpr char XYZ_TO_uvY_STR[] = "XYZ_TO_uvY"; +constexpr char uvY_TO_XYZ_STR[] = "uvY_TO_XYZ"; +constexpr char XYZ_TO_LUV_STR[] = "XYZ_TO_LUV"; +constexpr char LUV_TO_XYZ_STR[] = "LUV_TO_XYZ"; // NOTE: Converts the enumeration value to its string representation (i.e. CLF reader). // It could add details for error reporting. @@ -48,24 +47,24 @@ constexpr char LUV_TO_XYZ_STR[] = "LUV_TO_XYZ"; // a more verbose human readable string const char * FixedFunctionOpData::ConvertStyleToString(Style style, bool detailed) { - switch(style) + switch (style) { case ACES_RED_MOD_03_FWD: - return detailed ? "ACES_RedMod03 (Forward)" : ACES_RED_MOD_03_FWD_STR; + return detailed ? "ACES_RedMod03 (Forward)" : ACES_RED_MOD_03_FWD_STR; case ACES_RED_MOD_03_INV: - return detailed ? "ACES_RedMod03 (Inverse)" : ACES_RED_MOD_03_REV_STR; + return detailed ? "ACES_RedMod03 (Inverse)" : ACES_RED_MOD_03_REV_STR; case ACES_RED_MOD_10_FWD: - return detailed ? "ACES_RedMod10 (Forward)" : ACES_RED_MOD_10_FWD_STR; + return detailed ? "ACES_RedMod10 (Forward)" : ACES_RED_MOD_10_FWD_STR; case ACES_RED_MOD_10_INV: - return detailed ? "ACES_RedMod10 (Inverse)" : ACES_RED_MOD_10_REV_STR; + return detailed ? "ACES_RedMod10 (Inverse)" : ACES_RED_MOD_10_REV_STR; case ACES_GLOW_03_FWD: - return detailed ? "ACES_Glow03 (Forward)" : ACES_GLOW_03_FWD_STR; + return detailed ? "ACES_Glow03 (Forward)" : ACES_GLOW_03_FWD_STR; case ACES_GLOW_03_INV: - return detailed ? "ACES_Glow03 (Inverse)" : ACES_GLOW_03_REV_STR; + return detailed ? "ACES_Glow03 (Inverse)" : ACES_GLOW_03_REV_STR; case ACES_GLOW_10_FWD: - return detailed ? "ACES_Glow10 (Forward)" : ACES_GLOW_10_FWD_STR; + return detailed ? "ACES_Glow10 (Forward)" : ACES_GLOW_10_FWD_STR; case ACES_GLOW_10_INV: - return detailed ? "ACES_Glow10 (Inverse)" : ACES_GLOW_10_REV_STR; + return detailed ? "ACES_Glow10 (Inverse)" : ACES_GLOW_10_REV_STR; case ACES_DARK_TO_DIM_10_FWD: return detailed ? "ACES_DarkToDim10 (Forward)" : ACES_DARK_TO_DIM_10_STR; case ACES_DARK_TO_DIM_10_INV: @@ -155,8 +154,9 @@ FixedFunctionOpData::Style FixedFunctionOpData::GetStyle(const char * name) { return ACES_GAMUT_COMP_13_INV; } - else if (0 == Platform::Strcasecmp(name, SURROUND_STR) || - 0 == Platform::Strcasecmp(name, REC_2100_SURROUND_FWD_STR)) + else if ( + 0 == Platform::Strcasecmp(name, SURROUND_STR) + || 0 == Platform::Strcasecmp(name, REC_2100_SURROUND_FWD_STR)) { return REC2100_SURROUND_FWD; } @@ -205,8 +205,9 @@ FixedFunctionOpData::Style FixedFunctionOpData::GetStyle(const char * name) } // Combine the Transform style and direction into the internal OpData style. -FixedFunctionOpData::Style FixedFunctionOpData::ConvertStyle(FixedFunctionStyle style, - TransformDirection dir) +FixedFunctionOpData::Style FixedFunctionOpData::ConvertStyle( + FixedFunctionStyle style, + TransformDirection dir) { const bool isForward = dir == TRANSFORM_DIR_FORWARD; @@ -214,38 +215,38 @@ FixedFunctionOpData::Style FixedFunctionOpData::ConvertStyle(FixedFunctionStyle { case FIXED_FUNCTION_ACES_RED_MOD_03: { - return isForward ? FixedFunctionOpData::ACES_RED_MOD_03_FWD : - FixedFunctionOpData::ACES_RED_MOD_03_INV; + return isForward ? FixedFunctionOpData::ACES_RED_MOD_03_FWD + : FixedFunctionOpData::ACES_RED_MOD_03_INV; } case FIXED_FUNCTION_ACES_RED_MOD_10: { - return isForward ? FixedFunctionOpData::ACES_RED_MOD_10_FWD : - FixedFunctionOpData::ACES_RED_MOD_10_INV; + return isForward ? FixedFunctionOpData::ACES_RED_MOD_10_FWD + : FixedFunctionOpData::ACES_RED_MOD_10_INV; } case FIXED_FUNCTION_ACES_GLOW_03: { - return isForward ? FixedFunctionOpData::ACES_GLOW_03_FWD : - FixedFunctionOpData::ACES_GLOW_03_INV; + return isForward ? FixedFunctionOpData::ACES_GLOW_03_FWD + : FixedFunctionOpData::ACES_GLOW_03_INV; } case FIXED_FUNCTION_ACES_GLOW_10: { - return isForward ? FixedFunctionOpData::ACES_GLOW_10_FWD : - FixedFunctionOpData::ACES_GLOW_10_INV; + return isForward ? FixedFunctionOpData::ACES_GLOW_10_FWD + : FixedFunctionOpData::ACES_GLOW_10_INV; } case FIXED_FUNCTION_ACES_DARK_TO_DIM_10: { - return isForward ? FixedFunctionOpData::ACES_DARK_TO_DIM_10_FWD : - FixedFunctionOpData::ACES_DARK_TO_DIM_10_INV; + return isForward ? FixedFunctionOpData::ACES_DARK_TO_DIM_10_FWD + : FixedFunctionOpData::ACES_DARK_TO_DIM_10_INV; } case FIXED_FUNCTION_ACES_GAMUT_COMP_13: { - return isForward ? FixedFunctionOpData::ACES_GAMUT_COMP_13_FWD : - FixedFunctionOpData::ACES_GAMUT_COMP_13_INV; + return isForward ? FixedFunctionOpData::ACES_GAMUT_COMP_13_FWD + : FixedFunctionOpData::ACES_GAMUT_COMP_13_INV; } case FIXED_FUNCTION_REC2100_SURROUND: { - return isForward ? FixedFunctionOpData::REC2100_SURROUND_FWD : - FixedFunctionOpData::REC2100_SURROUND_INV; + return isForward ? FixedFunctionOpData::REC2100_SURROUND_FWD + : FixedFunctionOpData::REC2100_SURROUND_INV; } case FIXED_FUNCTION_RGB_TO_HSV: { @@ -283,49 +284,49 @@ FixedFunctionStyle FixedFunctionOpData::ConvertStyle(FixedFunctionOpData::Style { switch (style) { - case FixedFunctionOpData::ACES_RED_MOD_03_FWD: - case FixedFunctionOpData::ACES_RED_MOD_03_INV: - return FIXED_FUNCTION_ACES_RED_MOD_03; + case FixedFunctionOpData::ACES_RED_MOD_03_FWD: + case FixedFunctionOpData::ACES_RED_MOD_03_INV: + return FIXED_FUNCTION_ACES_RED_MOD_03; - case FixedFunctionOpData::ACES_RED_MOD_10_FWD: - case FixedFunctionOpData::ACES_RED_MOD_10_INV: - return FIXED_FUNCTION_ACES_RED_MOD_10; + case FixedFunctionOpData::ACES_RED_MOD_10_FWD: + case FixedFunctionOpData::ACES_RED_MOD_10_INV: + return FIXED_FUNCTION_ACES_RED_MOD_10; - case FixedFunctionOpData::ACES_GLOW_03_FWD: - case FixedFunctionOpData::ACES_GLOW_03_INV: - return FIXED_FUNCTION_ACES_GLOW_03; + case FixedFunctionOpData::ACES_GLOW_03_FWD: + case FixedFunctionOpData::ACES_GLOW_03_INV: + return FIXED_FUNCTION_ACES_GLOW_03; - case FixedFunctionOpData::ACES_GLOW_10_FWD: - case FixedFunctionOpData::ACES_GLOW_10_INV: - return FIXED_FUNCTION_ACES_GLOW_10; + case FixedFunctionOpData::ACES_GLOW_10_FWD: + case FixedFunctionOpData::ACES_GLOW_10_INV: + return FIXED_FUNCTION_ACES_GLOW_10; - case FixedFunctionOpData::ACES_DARK_TO_DIM_10_FWD: - case FixedFunctionOpData::ACES_DARK_TO_DIM_10_INV: - return FIXED_FUNCTION_ACES_DARK_TO_DIM_10; + case FixedFunctionOpData::ACES_DARK_TO_DIM_10_FWD: + case FixedFunctionOpData::ACES_DARK_TO_DIM_10_INV: + return FIXED_FUNCTION_ACES_DARK_TO_DIM_10; - case FixedFunctionOpData::ACES_GAMUT_COMP_13_FWD: - case FixedFunctionOpData::ACES_GAMUT_COMP_13_INV: - return FIXED_FUNCTION_ACES_GAMUT_COMP_13; + case FixedFunctionOpData::ACES_GAMUT_COMP_13_FWD: + case FixedFunctionOpData::ACES_GAMUT_COMP_13_INV: + return FIXED_FUNCTION_ACES_GAMUT_COMP_13; - case FixedFunctionOpData::REC2100_SURROUND_FWD: - case FixedFunctionOpData::REC2100_SURROUND_INV: - return FIXED_FUNCTION_REC2100_SURROUND; + case FixedFunctionOpData::REC2100_SURROUND_FWD: + case FixedFunctionOpData::REC2100_SURROUND_INV: + return FIXED_FUNCTION_REC2100_SURROUND; - case FixedFunctionOpData::RGB_TO_HSV: - case FixedFunctionOpData::HSV_TO_RGB: - return FIXED_FUNCTION_RGB_TO_HSV; + case FixedFunctionOpData::RGB_TO_HSV: + case FixedFunctionOpData::HSV_TO_RGB: + return FIXED_FUNCTION_RGB_TO_HSV; - case FixedFunctionOpData::XYZ_TO_xyY: - case FixedFunctionOpData::xyY_TO_XYZ: - return FIXED_FUNCTION_XYZ_TO_xyY; + case FixedFunctionOpData::XYZ_TO_xyY: + case FixedFunctionOpData::xyY_TO_XYZ: + return FIXED_FUNCTION_XYZ_TO_xyY; - case FixedFunctionOpData::XYZ_TO_uvY: - case FixedFunctionOpData::uvY_TO_XYZ: - return FIXED_FUNCTION_XYZ_TO_uvY; + case FixedFunctionOpData::XYZ_TO_uvY: + case FixedFunctionOpData::uvY_TO_XYZ: + return FIXED_FUNCTION_XYZ_TO_uvY; - case FixedFunctionOpData::XYZ_TO_LUV: - case FixedFunctionOpData::LUV_TO_XYZ: - return FIXED_FUNCTION_XYZ_TO_LUV; + case FixedFunctionOpData::XYZ_TO_LUV: + case FixedFunctionOpData::LUV_TO_XYZ: + return FIXED_FUNCTION_XYZ_TO_LUV; } std::stringstream ss("Unknown FixedFunction style: "); @@ -335,16 +336,16 @@ FixedFunctionStyle FixedFunctionOpData::ConvertStyle(FixedFunctionOpData::Style } FixedFunctionOpData::FixedFunctionOpData(Style style) - : OpData() - , m_style(style) + : OpData() + , m_style(style) { validate(); } FixedFunctionOpData::FixedFunctionOpData(Style style, const Params & params) - : OpData() - , m_style(style) - , m_params(params) + : OpData() + , m_style(style) + , m_params(params) { validate(); } @@ -355,21 +356,20 @@ FixedFunctionOpData::~FixedFunctionOpData() FixedFunctionOpDataRcPtr FixedFunctionOpData::clone() const { - auto clone = std::make_shared(getStyle(), getParams()); + auto clone = std::make_shared(getStyle(), getParams()); clone->getFormatMetadata() = getFormatMetadata(); return clone; } void FixedFunctionOpData::validate() const { - if (m_style==ACES_GAMUT_COMP_13_FWD || m_style == ACES_GAMUT_COMP_13_INV) + if (m_style == ACES_GAMUT_COMP_13_FWD || m_style == ACES_GAMUT_COMP_13_INV) { if (m_params.size() != 7) { std::stringstream ss; - ss << "The style '" << ConvertStyleToString(m_style, true) - << "' must have seven parameters but " - << m_params.size() << " found."; + ss << "The style '" << ConvertStyleToString(m_style, true) + << "' must have seven parameters but " << m_params.size() << " found."; throw Exception(ss.str().c_str()); } @@ -381,46 +381,47 @@ void FixedFunctionOpData::validate() const const double thr_yellow = m_params[5]; const double power = m_params[6]; - auto check_bounds = [](const std::string & name, double val, double low, double high) - { + auto check_bounds = [](const std::string & name, double val, double low, double high) { if (val < low || val > high) { std::stringstream ss; - ss << "Parameter " << val << " (" << name << ") is outside valid range [" << low << "," << high << "]"; + ss << "Parameter " << val << " (" << name << ") is outside valid range [" << low + << "," << high << "]"; throw Exception(ss.str().c_str()); } }; - // Clamped to the smallest increment above 1 in half float precision for numerical stability. + // Clamped to the smallest increment above 1 in half float precision for numerical + // stability. static constexpr double lim_low_bound = 1.001; static constexpr double lim_hi_bound = 65504.0; - check_bounds("lim_cyan", lim_cyan, lim_low_bound, lim_hi_bound); + check_bounds("lim_cyan", lim_cyan, lim_low_bound, lim_hi_bound); check_bounds("lim_magenta", lim_magenta, lim_low_bound, lim_hi_bound); - check_bounds("lim_yellow", lim_yellow, lim_low_bound, lim_hi_bound); + check_bounds("lim_yellow", lim_yellow, lim_low_bound, lim_hi_bound); static constexpr double thr_low_bound = 0.0; - // Clamped to the smallest increment below 1 in half float precision for numerical stability. - static constexpr double thr_hi_bound = 0.9995; - check_bounds("thr_cyan", thr_cyan, thr_low_bound, thr_hi_bound); + // Clamped to the smallest increment below 1 in half float precision for numerical + // stability. + static constexpr double thr_hi_bound = 0.9995; + check_bounds("thr_cyan", thr_cyan, thr_low_bound, thr_hi_bound); check_bounds("thr_magenta", thr_magenta, thr_low_bound, thr_hi_bound); - check_bounds("thr_yellow", thr_yellow, thr_low_bound, thr_hi_bound); + check_bounds("thr_yellow", thr_yellow, thr_low_bound, thr_hi_bound); static constexpr double pwr_low_bound = 1.0; static constexpr double pwr_hi_bound = 65504.0; - check_bounds("power", power, pwr_low_bound, pwr_hi_bound); + check_bounds("power", power, pwr_low_bound, pwr_hi_bound); } - else if (m_style==REC2100_SURROUND_FWD || m_style == REC2100_SURROUND_INV) + else if (m_style == REC2100_SURROUND_FWD || m_style == REC2100_SURROUND_INV) { if (m_params.size() != 1) { std::stringstream ss; - ss << "The style '" << ConvertStyleToString(m_style, true) - << "' must have one parameter but " - << m_params.size() << " found."; + ss << "The style '" << ConvertStyleToString(m_style, true) + << "' must have one parameter but " << m_params.size() << " found."; throw Exception(ss.str().c_str()); } - const double p = m_params[0]; + const double p = m_params[0]; const double low_bound = 0.01; const double hi_bound = 100.; @@ -439,12 +440,11 @@ void FixedFunctionOpData::validate() const } else { - if (m_params.size()!=0) + if (m_params.size() != 0) { std::stringstream ss; - ss << "The style '" << ConvertStyleToString(m_style, true) - << "' must have zero parameters but " - << m_params.size() << " found."; + ss << "The style '" << ConvertStyleToString(m_style, true) + << "' must have zero parameters but " << m_params.size() << " found."; throw Exception(ss.str().c_str()); } } @@ -468,7 +468,7 @@ void FixedFunctionOpData::invert() noexcept { // NB: The following assumes the op has already been validated. - switch(getStyle()) + switch (getStyle()) { case ACES_RED_MOD_03_FWD: { @@ -603,31 +603,31 @@ TransformDirection FixedFunctionOpData::getDirection() const noexcept { switch (m_style) { - case FixedFunctionOpData::ACES_RED_MOD_03_FWD: - case FixedFunctionOpData::ACES_RED_MOD_10_FWD: - case FixedFunctionOpData::ACES_GLOW_03_FWD: - case FixedFunctionOpData::ACES_GLOW_10_FWD: - case FixedFunctionOpData::ACES_DARK_TO_DIM_10_FWD: - case FixedFunctionOpData::ACES_GAMUT_COMP_13_FWD: - case FixedFunctionOpData::REC2100_SURROUND_FWD: - case FixedFunctionOpData::RGB_TO_HSV: - case FixedFunctionOpData::XYZ_TO_xyY: - case FixedFunctionOpData::XYZ_TO_uvY: - case FixedFunctionOpData::XYZ_TO_LUV: - return TRANSFORM_DIR_FORWARD; - - case FixedFunctionOpData::ACES_RED_MOD_03_INV: - case FixedFunctionOpData::ACES_RED_MOD_10_INV: - case FixedFunctionOpData::ACES_GLOW_03_INV: - case FixedFunctionOpData::ACES_GLOW_10_INV: - case FixedFunctionOpData::ACES_DARK_TO_DIM_10_INV: - case FixedFunctionOpData::ACES_GAMUT_COMP_13_INV: - case FixedFunctionOpData::REC2100_SURROUND_INV: - case FixedFunctionOpData::HSV_TO_RGB: - case FixedFunctionOpData::xyY_TO_XYZ: - case FixedFunctionOpData::uvY_TO_XYZ: - case FixedFunctionOpData::LUV_TO_XYZ: - return TRANSFORM_DIR_INVERSE; + case FixedFunctionOpData::ACES_RED_MOD_03_FWD: + case FixedFunctionOpData::ACES_RED_MOD_10_FWD: + case FixedFunctionOpData::ACES_GLOW_03_FWD: + case FixedFunctionOpData::ACES_GLOW_10_FWD: + case FixedFunctionOpData::ACES_DARK_TO_DIM_10_FWD: + case FixedFunctionOpData::ACES_GAMUT_COMP_13_FWD: + case FixedFunctionOpData::REC2100_SURROUND_FWD: + case FixedFunctionOpData::RGB_TO_HSV: + case FixedFunctionOpData::XYZ_TO_xyY: + case FixedFunctionOpData::XYZ_TO_uvY: + case FixedFunctionOpData::XYZ_TO_LUV: + return TRANSFORM_DIR_FORWARD; + + case FixedFunctionOpData::ACES_RED_MOD_03_INV: + case FixedFunctionOpData::ACES_RED_MOD_10_INV: + case FixedFunctionOpData::ACES_GLOW_03_INV: + case FixedFunctionOpData::ACES_GLOW_10_INV: + case FixedFunctionOpData::ACES_DARK_TO_DIM_10_INV: + case FixedFunctionOpData::ACES_GAMUT_COMP_13_INV: + case FixedFunctionOpData::REC2100_SURROUND_INV: + case FixedFunctionOpData::HSV_TO_RGB: + case FixedFunctionOpData::xyY_TO_XYZ: + case FixedFunctionOpData::uvY_TO_XYZ: + case FixedFunctionOpData::LUV_TO_XYZ: + return TRANSFORM_DIR_INVERSE; } return TRANSFORM_DIR_FORWARD; } @@ -642,9 +642,10 @@ void FixedFunctionOpData::setDirection(TransformDirection dir) noexcept bool FixedFunctionOpData::equals(const OpData & other) const { - if (!OpData::equals(other)) return false; + if (!OpData::equals(other)) + return false; - const FixedFunctionOpData* fop = static_cast(&other); + const FixedFunctionOpData * fop = static_cast(&other); return getStyle() == fop->getStyle() && getParams() == fop->getParams(); } diff --git a/src/OpenColorIO/ops/fixedfunction/FixedFunctionOpData.h b/src/OpenColorIO/ops/fixedfunction/FixedFunctionOpData.h index a640c66161..534c8b832a 100644 --- a/src/OpenColorIO/ops/fixedfunction/FixedFunctionOpData.h +++ b/src/OpenColorIO/ops/fixedfunction/FixedFunctionOpData.h @@ -1,17 +1,13 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_FIXEDFUNCTIONOPDATA_H #define INCLUDED_OCIO_FIXEDFUNCTIONOPDATA_H - #include #include "Op.h" - - namespace OCIO_NAMESPACE { @@ -19,35 +15,33 @@ class FixedFunctionOpData; typedef OCIO_SHARED_PTR FixedFunctionOpDataRcPtr; typedef OCIO_SHARED_PTR ConstFixedFunctionOpDataRcPtr; - class FixedFunctionOpData : public OpData { public: - enum Style { - ACES_RED_MOD_03_FWD = 0, // Red modifier (ACES 0.3/0.7) - ACES_RED_MOD_03_INV, // Red modifier inverse (ACES 0.3/0.7) - ACES_RED_MOD_10_FWD, // Red modifier (ACES 1.0) - ACES_RED_MOD_10_INV, // Red modifier inverse (ACES v1.0) - ACES_GLOW_03_FWD, // Glow function (ACES 0.3/0.7) - ACES_GLOW_03_INV, // Glow function inverse (ACES 0.3/0.7) - ACES_GLOW_10_FWD, // Glow function (ACES 1.0) - ACES_GLOW_10_INV, // Glow function inverse (ACES 1.0) - ACES_DARK_TO_DIM_10_FWD, // Dark to dim surround correction (ACES 1.0) - ACES_DARK_TO_DIM_10_INV, // Dim to dark surround correction (ACES 1.0) - ACES_GAMUT_COMP_13_FWD, // Parametric Gamut Compression (ACES 1.3) - ACES_GAMUT_COMP_13_INV, // Parametric Gamut Compression inverse (ACES 1.3) - REC2100_SURROUND_FWD, // Rec.2100 surround correction (takes one double for the gamma param) - REC2100_SURROUND_INV, // Rec.2100 surround correction inverse (takes one gamma param) - RGB_TO_HSV, // Classic RGB to HSV function - HSV_TO_RGB, // Classic HSV to RGB function - XYZ_TO_xyY, // CIE XYZ to 1931 xy chromaticity coordinates - xyY_TO_XYZ, // Inverse of above - XYZ_TO_uvY, // CIE XYZ to 1976 u'v' chromaticity coordinates - uvY_TO_XYZ, // Inverse of above - XYZ_TO_LUV, // CIE XYZ to 1976 CIELUV colour space (D65 white) - LUV_TO_XYZ // Inverse of above + ACES_RED_MOD_03_FWD = 0, // Red modifier (ACES 0.3/0.7) + ACES_RED_MOD_03_INV, // Red modifier inverse (ACES 0.3/0.7) + ACES_RED_MOD_10_FWD, // Red modifier (ACES 1.0) + ACES_RED_MOD_10_INV, // Red modifier inverse (ACES v1.0) + ACES_GLOW_03_FWD, // Glow function (ACES 0.3/0.7) + ACES_GLOW_03_INV, // Glow function inverse (ACES 0.3/0.7) + ACES_GLOW_10_FWD, // Glow function (ACES 1.0) + ACES_GLOW_10_INV, // Glow function inverse (ACES 1.0) + ACES_DARK_TO_DIM_10_FWD, // Dark to dim surround correction (ACES 1.0) + ACES_DARK_TO_DIM_10_INV, // Dim to dark surround correction (ACES 1.0) + ACES_GAMUT_COMP_13_FWD, // Parametric Gamut Compression (ACES 1.3) + ACES_GAMUT_COMP_13_INV, // Parametric Gamut Compression inverse (ACES 1.3) + REC2100_SURROUND_FWD, // Rec.2100 surround correction (takes one double for the gamma param) + REC2100_SURROUND_INV, // Rec.2100 surround correction inverse (takes one gamma param) + RGB_TO_HSV, // Classic RGB to HSV function + HSV_TO_RGB, // Classic HSV to RGB function + XYZ_TO_xyY, // CIE XYZ to 1931 xy chromaticity coordinates + xyY_TO_XYZ, // Inverse of above + XYZ_TO_uvY, // CIE XYZ to 1976 u'v' chromaticity coordinates + uvY_TO_XYZ, // Inverse of above + XYZ_TO_LUV, // CIE XYZ to 1976 CIELUV colour space (D65 white) + LUV_TO_XYZ // Inverse of above }; static const char * ConvertStyleToString(Style style, bool detailed); @@ -79,8 +73,8 @@ class FixedFunctionOpData : public OpData std::string getCacheID() const override; - Style getStyle() const noexcept { return m_style; } - void setStyle(Style style) noexcept { m_style = style; } + Style getStyle() const noexcept { return m_style; } + void setStyle(Style style) noexcept { m_style = style; } TransformDirection getDirection() const noexcept; void setDirection(TransformDirection dir) noexcept; diff --git a/src/OpenColorIO/ops/fixedfunction/FixedFunctionOpGPU.cpp b/src/OpenColorIO/ops/fixedfunction/FixedFunctionOpGPU.cpp index 20c1b1b1b4..644bc6111e 100644 --- a/src/OpenColorIO/ops/fixedfunction/FixedFunctionOpGPU.cpp +++ b/src/OpenColorIO/ops/fixedfunction/FixedFunctionOpGPU.cpp @@ -7,12 +7,13 @@ #include "ops/fixedfunction/FixedFunctionOpGPU.h" - namespace OCIO_NAMESPACE { void Add_hue_weight_shader(GpuShaderCreatorRcPtr & shaderCreator, GpuShaderText & ss, float width) { + // clang-format off + float center = 0.f; // If changed, must uncomment code below. // Convert from degrees to radians. @@ -49,10 +50,14 @@ void Add_hue_weight_shader(GpuShaderCreatorRcPtr & shaderCreator, GpuShaderText ss.newLine() << "coefs = " << ss.lerp("coefs", "m2", "float(j == 2)") << ";"; ss.newLine() << "coefs = " << ss.lerp("coefs", "m3", "float(j == 3)") << ";"; ss.newLine() << ss.floatDecl("f_H") << " = dot(coefs, monomials);"; + + // clang-format on } void Add_RedMod_03_Fwd_Shader(GpuShaderCreatorRcPtr & shaderCreator, GpuShaderText & ss) { + // clang-format off + const float _1minusScale = 1.f - 0.85f; // (1. - scale) from the original ctl code const float _pivot = 0.03f; @@ -74,10 +79,14 @@ void Add_RedMod_03_Fwd_Shader(GpuShaderCreatorRcPtr & shaderCreator, GpuShaderTe ss.newLine() << ss.floatDecl("maxval2") << " = max( " << pxl << ".rgb.r, max( " << pxl << ".rgb.g, " << pxl << ".rgb.b));"; ss.newLine() << ss.floatDecl("newChroma") << " = maxval2 - minval;"; ss.newLine() << pxl << ".rgb = minval + delta * newChroma / oldChroma;"; + + // clang-format on } void Add_RedMod_03_Inv_Shader(GpuShaderCreatorRcPtr & shaderCreator, GpuShaderText & ss) { + // clang-format off + const float _1minusScale = 1.f - 0.85f; // (1. - scale) from the original ctl code const float _pivot = 0.03f; @@ -109,10 +118,14 @@ void Add_RedMod_03_Inv_Shader(GpuShaderCreatorRcPtr & shaderCreator, GpuShaderTe ss.dedent(); ss.newLine() << "}"; + + // clang-format on } void Add_RedMod_10_Fwd_Shader(GpuShaderCreatorRcPtr & shaderCreator, GpuShaderText & ss) { + // clang-format off + const float _1minusScale = 1.f - 0.82f; // (1. - scale) from the original ctl code const float _pivot = 0.03f; @@ -127,10 +140,14 @@ void Add_RedMod_10_Fwd_Shader(GpuShaderCreatorRcPtr & shaderCreator, GpuShaderTe ss.newLine() << pxl << ".rgb.r = " << pxl << ".rgb.r + f_H * f_S * (" << _pivot << " - " << pxl << ".rgb.r) * " << _1minusScale << ";"; + + // clang-format on } void Add_RedMod_10_Inv_Shader(GpuShaderCreatorRcPtr & shaderCreator, GpuShaderText & ss) { + // clang-format off + const float _1minusScale = 1.f - 0.82f; // (1. - scale) from the original ctl code const float _pivot = 0.03f; @@ -154,10 +171,18 @@ void Add_RedMod_10_Inv_Shader(GpuShaderCreatorRcPtr & shaderCreator, GpuShaderTe ss.dedent(); ss.newLine() << "}"; + + // clang-format on } -void Add_Glow_03_Fwd_Shader(GpuShaderCreatorRcPtr & shaderCreator, GpuShaderText & ss, float glowGain, float glowMid) +void Add_Glow_03_Fwd_Shader( + GpuShaderCreatorRcPtr & shaderCreator, + GpuShaderText & ss, + float glowGain, + float glowMid) { + // clang-format off + const std::string pxl(shaderCreator->getPixelName()); ss.newLine() << ss.floatDecl("chroma") << " = sqrt( " << pxl << ".rgb.b * (" << pxl << ".rgb.b - " << pxl << ".rgb.g)" @@ -181,10 +206,18 @@ void Add_Glow_03_Fwd_Shader(GpuShaderCreatorRcPtr & shaderCreator, GpuShaderText ss.newLine() << "glowGainOut = " << ss.lerp( "glowGainOut", "0.", "float( YC > GlowMid * 2. )" ) << ";"; ss.newLine() << pxl << ".rgb = " << pxl << ".rgb * glowGainOut + " << pxl << ".rgb;"; + + // clang-format on } -void Add_Glow_03_Inv_Shader(GpuShaderCreatorRcPtr & shaderCreator, GpuShaderText & ss, float glowGain, float glowMid) +void Add_Glow_03_Inv_Shader( + GpuShaderCreatorRcPtr & shaderCreator, + GpuShaderText & ss, + float glowGain, + float glowMid) { + // clang-format off + const std::string pxl(shaderCreator->getPixelName()); ss.newLine() << ss.floatDecl("chroma") << " = sqrt( " << pxl << ".rgb.b * (" << pxl << ".rgb.b - " << pxl << ".rgb.g)" @@ -210,15 +243,20 @@ void Add_Glow_03_Inv_Shader(GpuShaderCreatorRcPtr & shaderCreator, GpuShaderText ss.newLine() << "glowGainOut = " << ss.lerp( "glowGainOut", "0.", "float( YC > GlowMid * 2. )" ) << ";"; ss.newLine() << pxl << ".rgb = " << pxl << ".rgb * glowGainOut + " << pxl << ".rgb;"; + + // clang-format on } -void Add_GamutComp_13_Shader_Compress(GpuShaderText & ss, - const char * dist, - const char * cdist, - float scl, - float thr, - float power) +void Add_GamutComp_13_Shader_Compress( + GpuShaderText & ss, + const char * dist, + const char * cdist, + float scl, + float thr, + float power) { + // clang-format off + // Only compress if greater or equal than threshold. ss.newLine() << "if (" << dist << " >= " << thr << ")"; ss.newLine() << "{"; @@ -231,15 +269,20 @@ void Add_GamutComp_13_Shader_Compress(GpuShaderText & ss, ss.dedent(); ss.newLine() << "}"; // if (dist >= thr) + + // clang-format on } -void Add_GamutComp_13_Shader_UnCompress(GpuShaderText & ss, - const char * dist, - const char * cdist, - float scl, - float thr, - float power) +void Add_GamutComp_13_Shader_UnCompress( + GpuShaderText & ss, + const char * dist, + const char * cdist, + float scl, + float thr, + float power) { + // clang-format off + // Only compress if greater or equal than threshold, avoid singularity. ss.newLine() << "if (" << dist << " >= " << thr << " && " << dist << " < " << thr + scl << " )"; ss.newLine() << "{"; @@ -252,20 +295,25 @@ void Add_GamutComp_13_Shader_UnCompress(GpuShaderText & ss, ss.dedent(); ss.newLine() << "}"; // if (dist >= thr && dist < thr + scl) + + // clang-format on } template -void Add_GamutComp_13_Shader(GpuShaderText & ss, - GpuShaderCreatorRcPtr & sc, - float limCyan, - float limMagenta, - float limYellow, - float thrCyan, - float thrMagenta, - float thrYellow, - float power, - Func f) +void Add_GamutComp_13_Shader( + GpuShaderText & ss, + GpuShaderCreatorRcPtr & sc, + float limCyan, + float limMagenta, + float limYellow, + float thrCyan, + float thrMagenta, + float thrYellow, + float power, + Func f) { + // clang-format off + // Precompute scale factor for y = 1 intersect auto f_scale = [power](float lim, float thr) { return (lim - thr) / std::pow(std::pow((1.0f - thr) / (lim - thr), -power) - 1.0f, 1.0f / power); @@ -297,17 +345,20 @@ void Add_GamutComp_13_Shader(GpuShaderText & ss, ss.dedent(); ss.newLine() << "}"; // if ( ach != 0.0f ) + + // clang-format on } -void Add_GamutComp_13_Fwd_Shader(GpuShaderText & ss, - GpuShaderCreatorRcPtr & sc, - float limCyan, - float limMagenta, - float limYellow, - float thrCyan, - float thrMagenta, - float thrYellow, - float power) +void Add_GamutComp_13_Fwd_Shader( + GpuShaderText & ss, + GpuShaderCreatorRcPtr & sc, + float limCyan, + float limMagenta, + float limYellow, + float thrCyan, + float thrMagenta, + float thrYellow, + float power) { Add_GamutComp_13_Shader( ss, @@ -319,19 +370,19 @@ void Add_GamutComp_13_Fwd_Shader(GpuShaderText & ss, thrMagenta, thrYellow, power, - Add_GamutComp_13_Shader_Compress - ); + Add_GamutComp_13_Shader_Compress); } -void Add_GamutComp_13_Inv_Shader(GpuShaderText & ss, - GpuShaderCreatorRcPtr & sc, - float limCyan, - float limMagenta, - float limYellow, - float thrCyan, - float thrMagenta, - float thrYellow, - float power) +void Add_GamutComp_13_Inv_Shader( + GpuShaderText & ss, + GpuShaderCreatorRcPtr & sc, + float limCyan, + float limMagenta, + float limYellow, + float thrCyan, + float thrMagenta, + float thrYellow, + float power) { Add_GamutComp_13_Shader( ss, @@ -343,12 +394,16 @@ void Add_GamutComp_13_Inv_Shader(GpuShaderText & ss, thrMagenta, thrYellow, power, - Add_GamutComp_13_Shader_UnCompress - ); + Add_GamutComp_13_Shader_UnCompress); } -void Add_Surround_10_Fwd_Shader(GpuShaderCreatorRcPtr & shaderCreator, GpuShaderText & ss, float gamma) +void Add_Surround_10_Fwd_Shader( + GpuShaderCreatorRcPtr & shaderCreator, + GpuShaderText & ss, + float gamma) { + // clang-format off + const std::string pxl(shaderCreator->getPixelName()); // TODO: -- add vector inner product to GPUShaderUtils @@ -360,10 +415,14 @@ void Add_Surround_10_Fwd_Shader(GpuShaderCreatorRcPtr & shaderCreator, GpuShader ss.newLine() << ss.floatDecl("Ypow_over_Y") << " = pow( Y, " << gamma - 1.f << ");"; ss.newLine() << pxl << ".rgb = " << pxl << ".rgb * Ypow_over_Y;"; + + // clang-format on } void Add_Surround_Shader(GpuShaderCreatorRcPtr & shaderCreator, GpuShaderText & ss, float gamma) { + // clang-format off + const std::string pxl(shaderCreator->getPixelName()); // TODO: -- add vector inner product to GPUShaderUtils @@ -375,10 +434,14 @@ void Add_Surround_Shader(GpuShaderCreatorRcPtr & shaderCreator, GpuShaderText & ss.newLine() << ss.floatDecl("Ypow_over_Y") << " = pow( Y, " << (gamma - 1.f) << ");"; ss.newLine() << "" << pxl << ".rgb = " << pxl << ".rgb * Ypow_over_Y;"; + + // clang-format on } void Add_RGB_TO_HSV(GpuShaderCreatorRcPtr & shaderCreator, GpuShaderText & ss) { + // clang-format off + const std::string pxl(shaderCreator->getPixelName()); ss.newLine() << ss.floatDecl("minRGB") << " = min( " << pxl << ".rgb.r, min( " << pxl << ".rgb.g, " << pxl << ".rgb.b ) );"; @@ -404,10 +467,14 @@ void Add_RGB_TO_HSV(GpuShaderCreatorRcPtr & shaderCreator, GpuShaderText & ss) ss.newLine() << "if ( -minRGB > maxRGB ) sat = (maxRGB - minRGB) / -minRGB;"; ss.newLine() << pxl << ".rgb = " << ss.float3Const("hue * 1./6.", "sat", "val") << ";"; + + // clang-format on } void Add_HSV_TO_RGB(GpuShaderCreatorRcPtr & shaderCreator, GpuShaderText & ss) { + // clang-format off + const std::string pxl(shaderCreator->getPixelName()); ss.newLine() << ss.floatDecl("Hue") << " = ( " << pxl << ".rgb.r - floor( " << pxl << ".rgb.r ) ) * 6.0;"; @@ -441,10 +508,14 @@ void Add_HSV_TO_RGB(GpuShaderCreatorRcPtr & shaderCreator, GpuShaderText & ss) ss.newLine() << "RGB = RGB * (rgbMax - rgbMin) + rgbMin;"; ss.newLine() << "" << pxl << ".rgb = RGB;"; + + // clang-format on } void Add_XYZ_TO_xyY(GpuShaderCreatorRcPtr & shaderCreator, GpuShaderText & ss) { + // clang-format off + const std::string pxl(shaderCreator->getPixelName()); ss.newLine() << ss.floatDecl("d") << " = " << pxl << ".rgb.r + " << pxl << ".rgb.g + " << pxl << ".rgb.b;"; @@ -452,10 +523,14 @@ void Add_XYZ_TO_xyY(GpuShaderCreatorRcPtr & shaderCreator, GpuShaderText & ss) ss.newLine() << pxl << ".rgb.b = " << pxl << ".rgb.g;"; ss.newLine() << pxl << ".rgb.r *= d;"; ss.newLine() << pxl << ".rgb.g *= d;"; + + // clang-format on } void Add_xyY_TO_XYZ(GpuShaderCreatorRcPtr & shaderCreator, GpuShaderText & ss) { + // clang-format off + const std::string pxl(shaderCreator->getPixelName()); ss.newLine() << ss.floatDecl("d") << " = (" << pxl << ".rgb.g == 0.) ? 0. : 1. / " << pxl << ".rgb.g;"; @@ -463,10 +538,14 @@ void Add_xyY_TO_XYZ(GpuShaderCreatorRcPtr & shaderCreator, GpuShaderText & ss) ss.newLine() << pxl << ".rgb.b = Y * (1. - " << pxl << ".rgb.r - " << pxl << ".rgb.g) * d;"; ss.newLine() << pxl << ".rgb.r *= Y * d;"; ss.newLine() << pxl << ".rgb.g = Y;"; + + // clang-format on } void Add_XYZ_TO_uvY(GpuShaderCreatorRcPtr & shaderCreator, GpuShaderText & ss) { + // clang-format off + const std::string pxl(shaderCreator->getPixelName()); ss.newLine() << ss.floatDecl("d") << " = " << pxl << ".rgb.r + 15. * " << pxl << ".rgb.g + 3. * " << pxl << ".rgb.b;"; @@ -474,10 +553,14 @@ void Add_XYZ_TO_uvY(GpuShaderCreatorRcPtr & shaderCreator, GpuShaderText & ss) ss.newLine() << pxl << ".rgb.b = " << pxl << ".rgb.g;"; ss.newLine() << pxl << ".rgb.r *= 4. * d;"; ss.newLine() << pxl << ".rgb.g *= 9. * d;"; + + // clang-format on } void Add_uvY_TO_XYZ(GpuShaderCreatorRcPtr & shaderCreator, GpuShaderText & ss) { + // clang-format off + const std::string pxl(shaderCreator->getPixelName()); ss.newLine() << ss.floatDecl("d") << " = (" << pxl << ".rgb.g == 0.) ? 0. : 1. / " << pxl << ".rgb.g;"; @@ -485,10 +568,14 @@ void Add_uvY_TO_XYZ(GpuShaderCreatorRcPtr & shaderCreator, GpuShaderText & ss) ss.newLine() << pxl << ".rgb.b = (3./4.) * Y * (4. - " << pxl << ".rgb.r - 6.6666666666666667 * " << pxl << ".rgb.g) * d;"; ss.newLine() << pxl << ".rgb.r *= (9./4.) * Y * d;"; ss.newLine() << pxl << ".rgb.g = Y;"; + + // clang-format on } void Add_XYZ_TO_LUV(GpuShaderCreatorRcPtr & shaderCreator, GpuShaderText & ss) { + // clang-format off + const std::string pxl(shaderCreator->getPixelName()); ss.newLine() << ss.floatDecl("d") << " = " << pxl << ".rgb.r + 15. * " << pxl << ".rgb.g + 3. * " << pxl << ".rgb.b;"; @@ -503,10 +590,14 @@ void Add_XYZ_TO_LUV(GpuShaderCreatorRcPtr & shaderCreator, GpuShaderText & ss) ss.newLine() << ss.floatDecl("vstar") << " = 13. * Lstar * (v - 0.46831999);"; ss.newLine() << pxl << ".rgb = " << ss.float3Const("Lstar", "ustar", "vstar") << ";"; + + // clang-format on } void Add_LUV_TO_XYZ(GpuShaderCreatorRcPtr & shaderCreator, GpuShaderText & ss) { + // clang-format off + const std::string pxl(shaderCreator->getPixelName()); ss.newLine() << ss.floatDecl("Lstar") << " = " << pxl << ".rgb.r;"; @@ -521,14 +612,19 @@ void Add_LUV_TO_XYZ(GpuShaderCreatorRcPtr & shaderCreator, GpuShaderText & ss) ss.newLine() << pxl << ".rgb.r = 9. * Y * u * dd;"; ss.newLine() << pxl << ".rgb.b = Y * (12. - 3. * u - 20. * v) * dd;"; ss.newLine() << pxl << ".rgb.g = Y;"; + + // clang-format on } -void GetFixedFunctionGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, - ConstFixedFunctionOpDataRcPtr & func) +void GetFixedFunctionGPUShaderProgram( + GpuShaderCreatorRcPtr & shaderCreator, + ConstFixedFunctionOpDataRcPtr & func) { GpuShaderText ss(shaderCreator->getLanguage()); ss.indent(); + // clang-format off + ss.newLine() << ""; ss.newLine() << "// Add FixedFunction '" << FixedFunctionOpData::ConvertStyleToString(func->getStyle(), true) @@ -537,13 +633,15 @@ void GetFixedFunctionGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, ss.newLine() << "{"; ss.indent(); - switch(func->getStyle()) + // clang-format on + + switch (func->getStyle()) { case FixedFunctionOpData::ACES_RED_MOD_03_FWD: { Add_RedMod_03_Fwd_Shader(shaderCreator, ss); break; - } + } case FixedFunctionOpData::ACES_RED_MOD_03_INV: { Add_RedMod_03_Inv_Shader(shaderCreator, ss); @@ -597,14 +695,13 @@ void GetFixedFunctionGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, Add_GamutComp_13_Fwd_Shader( ss, shaderCreator, - (float) func->getParams()[0], - (float) func->getParams()[1], - (float) func->getParams()[2], - (float) func->getParams()[3], - (float) func->getParams()[4], - (float) func->getParams()[5], - (float) func->getParams()[6] - ); + (float)func->getParams()[0], + (float)func->getParams()[1], + (float)func->getParams()[2], + (float)func->getParams()[3], + (float)func->getParams()[4], + (float)func->getParams()[5], + (float)func->getParams()[6]); break; } case FixedFunctionOpData::ACES_GAMUT_COMP_13_INV: @@ -612,19 +709,18 @@ void GetFixedFunctionGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, Add_GamutComp_13_Inv_Shader( ss, shaderCreator, - (float) func->getParams()[0], - (float) func->getParams()[1], - (float) func->getParams()[2], - (float) func->getParams()[3], - (float) func->getParams()[4], - (float) func->getParams()[5], - (float) func->getParams()[6] - ); + (float)func->getParams()[0], + (float)func->getParams()[1], + (float)func->getParams()[2], + (float)func->getParams()[3], + (float)func->getParams()[4], + (float)func->getParams()[5], + (float)func->getParams()[6]); break; } case FixedFunctionOpData::REC2100_SURROUND_FWD: { - Add_Surround_Shader(shaderCreator, ss, (float) func->getParams()[0]); + Add_Surround_Shader(shaderCreator, ss, (float)func->getParams()[0]); break; } case FixedFunctionOpData::REC2100_SURROUND_INV: @@ -680,4 +776,4 @@ void GetFixedFunctionGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, shaderCreator->addToFunctionShaderCode(ss.string().c_str()); } -} // OCIO_NAMESPACE +} // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/ops/fixedfunction/FixedFunctionOpGPU.h b/src/OpenColorIO/ops/fixedfunction/FixedFunctionOpGPU.h index 802c99af54..a7c15df6e1 100644 --- a/src/OpenColorIO/ops/fixedfunction/FixedFunctionOpGPU.h +++ b/src/OpenColorIO/ops/fixedfunction/FixedFunctionOpGPU.h @@ -12,11 +12,10 @@ namespace OCIO_NAMESPACE { -void GetFixedFunctionGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, - ConstFixedFunctionOpDataRcPtr & func); +void GetFixedFunctionGPUShaderProgram( + GpuShaderCreatorRcPtr & shaderCreator, + ConstFixedFunctionOpDataRcPtr & func); } // namespace OCIO_NAMESPACE #endif - - diff --git a/src/OpenColorIO/ops/gamma/GammaOp.cpp b/src/OpenColorIO/ops/gamma/GammaOp.cpp index 9d6afccc7d..d3c1eb6a55 100644 --- a/src/OpenColorIO/ops/gamma/GammaOp.cpp +++ b/src/OpenColorIO/ops/gamma/GammaOp.cpp @@ -51,9 +51,8 @@ class GammaOp : public Op GammaOpDataRcPtr gammaData() { return DynamicPtrCast(data()); } }; - GammaOp::GammaOp(GammaOpDataRcPtr & gamma) - : Op() + : Op() { data() = gamma; } @@ -82,7 +81,8 @@ bool GammaOp::isSameType(ConstOpRcPtr & op) const bool GammaOp::isInverse(ConstOpRcPtr & op) const { ConstGammaOpRcPtr typedRcPtr = DynamicPtrCast(op); - if(!typedRcPtr) return false; + if (!typedRcPtr) + return false; return gammaData()->isInverse(*typedRcPtr->gammaData()); } @@ -95,7 +95,7 @@ bool GammaOp::canCombineWith(ConstOpRcPtr & op) const void GammaOp::combineWith(OpRcPtrVec & ops, ConstOpRcPtr & secondOp) const { - if(!canCombineWith(secondOp)) + if (!canCombineWith(secondOp)) { throw Exception("GammaOp: canCombineWith must be checked before calling combineWith."); } @@ -129,11 +129,9 @@ void GammaOp::extractGpuShaderInfo(GpuShaderCreatorRcPtr & shaderCreator) const GetGammaGPUShaderProgram(shaderCreator, data); } -} // Anon namespace +} // namespace -void CreateGammaOp(OpRcPtrVec & ops, - GammaOpDataRcPtr & gammaData, - TransformDirection direction) +void CreateGammaOp(OpRcPtrVec & ops, GammaOpDataRcPtr & gammaData, TransformDirection direction) { auto gamma = gammaData; if (direction == TRANSFORM_DIR_INVERSE) @@ -157,11 +155,11 @@ void CreateGammaTransform(GroupTransformRcPtr & group, ConstOpRcPtr & op) const auto style = gammaData->getStyle(); - if (style == GammaOpData::MONCURVE_FWD || style == GammaOpData::MONCURVE_MIRROR_FWD || - style == GammaOpData::MONCURVE_REV || style == GammaOpData::MONCURVE_MIRROR_REV) + if (style == GammaOpData::MONCURVE_FWD || style == GammaOpData::MONCURVE_MIRROR_FWD + || style == GammaOpData::MONCURVE_REV || style == GammaOpData::MONCURVE_MIRROR_REV) { auto expTransform = ExponentWithLinearTransform::Create(); - auto & data = dynamic_cast(expTransform.get())->data(); + auto & data = dynamic_cast(expTransform.get())->data(); data = *gammaData; group->appendTransform(expTransform); @@ -169,16 +167,17 @@ void CreateGammaTransform(GroupTransformRcPtr & group, ConstOpRcPtr & op) else { auto expTransform = ExponentTransform::Create(); - auto & data = dynamic_cast(expTransform.get())->data(); + auto & data = dynamic_cast(expTransform.get())->data(); data = *gammaData; group->appendTransform(expTransform); } } -void BuildExponentWithLinearOp(OpRcPtrVec & ops, - const ExponentWithLinearTransform & transform, - TransformDirection dir) +void BuildExponentWithLinearOp( + OpRcPtrVec & ops, + const ExponentWithLinearTransform & transform, + TransformDirection dir) { const auto & data = dynamic_cast(transform).data(); data.validate(); @@ -187,23 +186,22 @@ void BuildExponentWithLinearOp(OpRcPtrVec & ops, CreateGammaOp(ops, gamma, dir); } -void BuildExponentOp(OpRcPtrVec & ops, - const Config & config, - const ExponentTransform & transform, - TransformDirection dir) +void BuildExponentOp( + OpRcPtrVec & ops, + const Config & config, + const ExponentTransform & transform, + TransformDirection dir) { if (config.getMajorVersion() == 1) { // Ignore style, use a simple exponent. TransformDirection combinedDir = CombineTransformDirections(dir, transform.getDirection()); - double vec4[4] = { 1., 1., 1., 1. }; + double vec4[4] = {1., 1., 1., 1.}; transform.getValue(vec4); - ExponentOpDataRcPtr expData = std::make_shared(vec4); + ExponentOpDataRcPtr expData = std::make_shared(vec4); expData->getFormatMetadata() = transform.getFormatMetadata(); - CreateExponentOp(ops, - expData, - combinedDir); + CreateExponentOp(ops, expData, combinedDir); } else { @@ -216,4 +214,3 @@ void BuildExponentOp(OpRcPtrVec & ops, } } // namespace OCIO_NAMESPACE - diff --git a/src/OpenColorIO/ops/gamma/GammaOp.h b/src/OpenColorIO/ops/gamma/GammaOp.h index d38a46e6ac..5dede3dd94 100644 --- a/src/OpenColorIO/ops/gamma/GammaOp.h +++ b/src/OpenColorIO/ops/gamma/GammaOp.h @@ -1,11 +1,9 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_GAMMA_H #define INCLUDED_OCIO_GAMMA_H - #include #include @@ -13,13 +11,10 @@ #include "Op.h" #include "ops/gamma/GammaOpData.h" - namespace OCIO_NAMESPACE { -void CreateGammaOp(OpRcPtrVec & ops, - GammaOpDataRcPtr & gammaData, - TransformDirection direction); +void CreateGammaOp(OpRcPtrVec & ops, GammaOpDataRcPtr & gammaData, TransformDirection direction); // Create a copy of the gamma transform in the op and append it to the GroupTransform. void CreateGammaTransform(GroupTransformRcPtr & group, ConstOpRcPtr & op); diff --git a/src/OpenColorIO/ops/gamma/GammaOpCPU.cpp b/src/OpenColorIO/ops/gamma/GammaOpCPU.cpp index ace0006ca8..59c1a90b0d 100644 --- a/src/OpenColorIO/ops/gamma/GammaOpCPU.cpp +++ b/src/OpenColorIO/ops/gamma/GammaOpCPU.cpp @@ -12,19 +12,17 @@ #include "SSE.h" - namespace OCIO_NAMESPACE { // Note: The parameters are validated when the op is created so that the // math below does not require checks for divide by 0, etc. - // Base class for the Gamma (i.e. basic style) operation renderers. class GammaBasicOpCPU : public OpCPU { public: - GammaBasicOpCPU() = delete; + GammaBasicOpCPU() = delete; GammaBasicOpCPU(const GammaBasicOpCPU &) = delete; explicit GammaBasicOpCPU(ConstGammaOpDataRcPtr & gamma); @@ -56,7 +54,7 @@ class GammaBasicOpCPUSSE : public GammaBasicOpCPU class GammaBasicMirrorOpCPU : public GammaBasicOpCPU { public: - GammaBasicMirrorOpCPU() = delete; + GammaBasicMirrorOpCPU() = delete; GammaBasicMirrorOpCPU(const GammaBasicOpCPU &) = delete; explicit GammaBasicMirrorOpCPU(ConstGammaOpDataRcPtr & gamma); @@ -79,7 +77,7 @@ class GammaBasicMirrorOpCPUSSE : public GammaBasicMirrorOpCPU class GammaBasicPassThruOpCPU : public GammaBasicOpCPU { public: - GammaBasicPassThruOpCPU() = delete; + GammaBasicPassThruOpCPU() = delete; GammaBasicPassThruOpCPU(const GammaBasicOpCPU &) = delete; explicit GammaBasicPassThruOpCPU(ConstGammaOpDataRcPtr & gamma); @@ -102,7 +100,10 @@ class GammaBasicPassThruOpCPUSSE : public GammaBasicPassThruOpCPU class GammaMoncurveOpCPU : public OpCPU { protected: - explicit GammaMoncurveOpCPU(ConstGammaOpDataRcPtr &) : OpCPU() {} + explicit GammaMoncurveOpCPU(ConstGammaOpDataRcPtr &) + : OpCPU() + { + } protected: RendererParams m_red; @@ -144,7 +145,6 @@ class GammaMoncurveOpCPURev : public GammaMoncurveOpCPU protected: void update(ConstGammaOpDataRcPtr & gamma); - }; #if OCIO_USE_SSE2 @@ -214,12 +214,13 @@ ConstOpCPURcPtr GetGammaRenderer(ConstGammaOpDataRcPtr & gamma, bool fastPower) std::ignore = fastPower; #endif - switch(gamma->getStyle()) + switch (gamma->getStyle()) { case GammaOpData::MONCURVE_FWD: { #if OCIO_USE_SSE2 - if (fastPower) return std::make_shared(gamma); + if (fastPower) + return std::make_shared(gamma); else #endif return std::make_shared(gamma); @@ -229,7 +230,8 @@ ConstOpCPURcPtr GetGammaRenderer(ConstGammaOpDataRcPtr & gamma, bool fastPower) case GammaOpData::MONCURVE_REV: { #if OCIO_USE_SSE2 - if (fastPower) return std::make_shared(gamma); + if (fastPower) + return std::make_shared(gamma); else #endif return std::make_shared(gamma); @@ -239,7 +241,8 @@ ConstOpCPURcPtr GetGammaRenderer(ConstGammaOpDataRcPtr & gamma, bool fastPower) case GammaOpData::MONCURVE_MIRROR_FWD: { #if OCIO_USE_SSE2 - if (fastPower) return std::make_shared(gamma); + if (fastPower) + return std::make_shared(gamma); else #endif return std::make_shared(gamma); @@ -249,7 +252,8 @@ ConstOpCPURcPtr GetGammaRenderer(ConstGammaOpDataRcPtr & gamma, bool fastPower) case GammaOpData::MONCURVE_MIRROR_REV: { #if OCIO_USE_SSE2 - if (fastPower) return std::make_shared(gamma); + if (fastPower) + return std::make_shared(gamma); else #endif return std::make_shared(gamma); @@ -260,7 +264,8 @@ ConstOpCPURcPtr GetGammaRenderer(ConstGammaOpDataRcPtr & gamma, bool fastPower) case GammaOpData::BASIC_REV: { #if OCIO_USE_SSE2 - if (fastPower) return std::make_shared(gamma); + if (fastPower) + return std::make_shared(gamma); else #endif return std::make_shared(gamma); @@ -270,7 +275,8 @@ ConstOpCPURcPtr GetGammaRenderer(ConstGammaOpDataRcPtr & gamma, bool fastPower) case GammaOpData::BASIC_MIRROR_REV: { #if OCIO_USE_SSE2 - if (fastPower) return std::make_shared(gamma); + if (fastPower) + return std::make_shared(gamma); else #endif return std::make_shared(gamma); @@ -280,7 +286,8 @@ ConstOpCPURcPtr GetGammaRenderer(ConstGammaOpDataRcPtr & gamma, bool fastPower) case GammaOpData::BASIC_PASS_THRU_REV: { #if OCIO_USE_SSE2 - if (fastPower) return std::make_shared(gamma); + if (fastPower) + return std::make_shared(gamma); else #endif return std::make_shared(gamma); @@ -291,13 +298,12 @@ ConstOpCPURcPtr GetGammaRenderer(ConstGammaOpDataRcPtr & gamma, bool fastPower) throw Exception("Unsupported Gamma style"); } - GammaBasicOpCPU::GammaBasicOpCPU(ConstGammaOpDataRcPtr & gamma) - : OpCPU() - , m_redGamma(0.0f) - , m_grnGamma(0.0f) - , m_bluGamma(0.0f) - , m_alpGamma(0.0f) + : OpCPU() + , m_redGamma(0.0f) + , m_grnGamma(0.0f) + , m_bluGamma(0.0f) + , m_alpGamma(0.0f) { update(gamma); } @@ -305,15 +311,15 @@ GammaBasicOpCPU::GammaBasicOpCPU(ConstGammaOpDataRcPtr & gamma) void GammaBasicOpCPU::update(ConstGammaOpDataRcPtr & gamma) { // The gamma calculations are done in normalized space. - const auto style = gamma->getStyle(); - const bool forward = (style == GammaOpData::BASIC_FWD) || - (style == GammaOpData::BASIC_MIRROR_FWD) || - (style == GammaOpData::BASIC_PASS_THRU_FWD); + const auto style = gamma->getStyle(); + const bool forward = (style == GammaOpData::BASIC_FWD) + || (style == GammaOpData::BASIC_MIRROR_FWD) + || (style == GammaOpData::BASIC_PASS_THRU_FWD); // Calculate the actual power used in the function. - m_redGamma = (float)(forward ? gamma->getRedParams()[0] : 1. / gamma->getRedParams()[0]); + m_redGamma = (float)(forward ? gamma->getRedParams()[0] : 1. / gamma->getRedParams()[0]); m_grnGamma = (float)(forward ? gamma->getGreenParams()[0] : 1. / gamma->getGreenParams()[0]); - m_bluGamma = (float)(forward ? gamma->getBlueParams()[0] : 1. / gamma->getBlueParams()[0]); + m_bluGamma = (float)(forward ? gamma->getBlueParams()[0] : 1. / gamma->getBlueParams()[0]); m_alpGamma = (float)(forward ? gamma->getAlphaParams()[0] : 1. / gamma->getAlphaParams()[0]); } @@ -321,11 +327,11 @@ void GammaBasicOpCPU::update(ConstGammaOpDataRcPtr & gamma) void GammaBasicOpCPUSSE::apply(const void * inImg, void * outImg, long numPixels) const { const float * in = (const float *)inImg; - float * out = (float *)outImg; + float * out = (float *)outImg; const __m128 gamma = _mm_set_ps(m_alpGamma, m_bluGamma, m_grnGamma, m_redGamma); - for(long idx=0; idx 0.f ? std::pow(pixel[0], m_redGamma) : pixel[0]; out[1] = pixel[1] > 0.f ? std::pow(pixel[1], m_grnGamma) : pixel[1]; @@ -467,16 +476,16 @@ void GammaBasicPassThruOpCPU::apply(const void * inImg, void * outImg, long numP } GammaMoncurveOpCPUFwd::GammaMoncurveOpCPUFwd(ConstGammaOpDataRcPtr & gamma) - : GammaMoncurveOpCPU(gamma) + : GammaMoncurveOpCPU(gamma) { update(gamma); } void GammaMoncurveOpCPUFwd::update(ConstGammaOpDataRcPtr & gamma) { - ComputeParamsFwd(gamma->getRedParams(), m_red); + ComputeParamsFwd(gamma->getRedParams(), m_red); ComputeParamsFwd(gamma->getGreenParams(), m_green); - ComputeParamsFwd(gamma->getBlueParams(), m_blue); + ComputeParamsFwd(gamma->getBlueParams(), m_blue); ComputeParamsFwd(gamma->getAlphaParams(), m_alpha); } @@ -484,24 +493,20 @@ void GammaMoncurveOpCPUFwd::update(ConstGammaOpDataRcPtr & gamma) void GammaMoncurveOpCPUFwdSSE::apply(const void * inImg, void * outImg, long numPixels) const { const float * in = (const float *)inImg; - float * out = (float *)outImg; + float * out = (float *)outImg; - const __m128 scale = _mm_set_ps(m_alpha.scale, m_blue.scale, - m_green.scale, m_red.scale); + const __m128 scale = _mm_set_ps(m_alpha.scale, m_blue.scale, m_green.scale, m_red.scale); - const __m128 offset = _mm_set_ps(m_alpha.offset, m_blue.offset, - m_green.offset, m_red.offset); + const __m128 offset = _mm_set_ps(m_alpha.offset, m_blue.offset, m_green.offset, m_red.offset); - const __m128 gamma = _mm_set_ps(m_alpha.gamma, m_blue.gamma, - m_green.gamma, m_red.gamma); + const __m128 gamma = _mm_set_ps(m_alpha.gamma, m_blue.gamma, m_green.gamma, m_red.gamma); - const __m128 breakPnt = _mm_set_ps(m_alpha.breakPnt, m_blue.breakPnt, - m_green.breakPnt, m_red.breakPnt); + const __m128 breakPnt + = _mm_set_ps(m_alpha.breakPnt, m_blue.breakPnt, m_green.breakPnt, m_red.breakPnt); - const __m128 slope = _mm_set_ps(m_alpha.slope, m_blue.slope, - m_green.slope, m_red.slope); + const __m128 slope = _mm_set_ps(m_alpha.slope, m_blue.slope, m_green.slope, m_red.slope); - for(long idx=0; idxgetRedParams(), m_red); + ComputeParamsRev(gamma->getRedParams(), m_red); ComputeParamsRev(gamma->getGreenParams(), m_green); - ComputeParamsRev(gamma->getBlueParams(), m_blue); + ComputeParamsRev(gamma->getBlueParams(), m_blue); ComputeParamsRev(gamma->getAlphaParams(), m_alpha); } @@ -573,24 +576,20 @@ void GammaMoncurveOpCPURev::update(ConstGammaOpDataRcPtr & gamma) void GammaMoncurveOpCPURevSSE::apply(const void * inImg, void * outImg, long numPixels) const { const float * in = (const float *)inImg; - float * out = (float *)outImg; + float * out = (float *)outImg; - const __m128 scale = _mm_set_ps(m_alpha.scale, m_blue.scale, - m_green.scale, m_red.scale); + const __m128 scale = _mm_set_ps(m_alpha.scale, m_blue.scale, m_green.scale, m_red.scale); - const __m128 offset = _mm_set_ps(m_alpha.offset, m_blue.offset, - m_green.offset, m_red.offset); + const __m128 offset = _mm_set_ps(m_alpha.offset, m_blue.offset, m_green.offset, m_red.offset); - const __m128 gamma = _mm_set_ps(m_alpha.gamma, m_blue.gamma, - m_green.gamma, m_red.gamma); + const __m128 gamma = _mm_set_ps(m_alpha.gamma, m_blue.gamma, m_green.gamma, m_red.gamma); - const __m128 breakPnt = _mm_set_ps(m_alpha.breakPnt, m_blue.breakPnt, - m_green.breakPnt, m_red.breakPnt); + const __m128 breakPnt + = _mm_set_ps(m_alpha.breakPnt, m_blue.breakPnt, m_green.breakPnt, m_red.breakPnt); - const __m128 slope = _mm_set_ps(m_alpha.slope, m_blue.slope, - m_green.slope, m_red.slope); + const __m128 slope = _mm_set_ps(m_alpha.slope, m_blue.slope, m_green.slope, m_red.slope); - for(long idx=0; idx #include "Op.h" @@ -19,5 +17,4 @@ ConstOpCPURcPtr GetGammaRenderer(ConstGammaOpDataRcPtr & gamma, bool fastPower); } // namespace OCIO_NAMESPACE - #endif \ No newline at end of file diff --git a/src/OpenColorIO/ops/gamma/GammaOpData.cpp b/src/OpenColorIO/ops/gamma/GammaOpData.cpp index 482a5b79d7..4b9d55e90b 100644 --- a/src/OpenColorIO/ops/gamma/GammaOpData.cpp +++ b/src/OpenColorIO/ops/gamma/GammaOpData.cpp @@ -7,11 +7,11 @@ #include #include "BitDepthUtils.h" +#include "ParseUtils.h" +#include "Platform.h" #include "ops/gamma/GammaOpData.h" #include "ops/matrix/MatrixOp.h" #include "ops/range/RangeOpData.h" -#include "ParseUtils.h" -#include "Platform.h" namespace OCIO_NAMESPACE { @@ -22,7 +22,7 @@ namespace const int FLOAT_DECIMALS = 7; // Declare the values for an identity operation. -const double IdentityScale = 1.; +const double IdentityScale = 1.; const double IdentityOffset = 0.; // Check if params corresponds to a basic identity. @@ -42,7 +42,7 @@ std::string GetParametersString(const GammaOpData::Params & params) std::ostringstream oss; oss.precision(FLOAT_DECIMALS); oss << params[0]; - for(size_t idx=1; idx(0., - RangeOpData::EmptyValue(), // Don't clamp high end. - 0., - RangeOpData::EmptyValue()); + op = std::make_shared( + 0., + RangeOpData::EmptyValue(), // Don't clamp high end. + 0., + RangeOpData::EmptyValue()); break; } @@ -660,8 +657,8 @@ GammaOpData::Style CombineBasicStyles(GammaOpData::Style a, GammaOpData::Style b { // This function assumes that mayCompose was called on the inputs and returned true. // The logic here is only valid for that situation. - if (a == GammaOpData::BASIC_FWD || a == GammaOpData::BASIC_REV || - b == GammaOpData::BASIC_FWD || b == GammaOpData::BASIC_REV) + if (a == GammaOpData::BASIC_FWD || a == GammaOpData::BASIC_REV || b == GammaOpData::BASIC_FWD + || b == GammaOpData::BASIC_REV) { return GammaOpData::BASIC_FWD; } @@ -698,11 +695,11 @@ void RoundAround1(double & val) val = 1.; } } -} +} // namespace GammaOpDataRcPtr GammaOpData::compose(const GammaOpData & B) const { - if ( ! mayCompose(B) ) + if (!mayCompose(B)) { throw Exception("GammaOp can only be combined with some GammaOps"); } @@ -752,10 +749,10 @@ GammaOpDataRcPtr GammaOpData::compose(const GammaOpData & B) const // By convention, we try to keep the gamma parameter > 1. if (rOut < 1.0 && gOut < 1.0 && bOut < 1.0) { - rOut = 1. / rOut; - gOut = 1. / gOut; - bOut = 1. / bOut; - aOut = 1. / aOut; + rOut = 1. / rOut; + gOut = 1. / gOut; + bOut = 1. / bOut; + aOut = 1. / aOut; style = InverseBasicStyle(style); } @@ -764,11 +761,8 @@ GammaOpDataRcPtr GammaOpData::compose(const GammaOpData & B) const GammaOpData::Params paramsB(1, bOut); GammaOpData::Params paramsA(1, aOut); - GammaOpDataRcPtr outOp = std::make_shared(style, - paramsR, - paramsG, - paramsB, - paramsA); + GammaOpDataRcPtr outOp + = std::make_shared(style, paramsR, paramsG, paramsB, paramsA); // TODO: May want to revisit how the metadata is set. outOp->getFormatMetadata() = getFormatMetadata(); @@ -779,15 +773,14 @@ GammaOpDataRcPtr GammaOpData::compose(const GammaOpData & B) const bool GammaOpData::equals(const OpData & other) const { - if(!OpData::equals(other)) return false; + if (!OpData::equals(other)) + return false; - const GammaOpData* gop = static_cast(&other); + const GammaOpData * gop = static_cast(&other); - return m_style == gop->m_style && - m_redParams == gop->m_redParams && - m_greenParams == gop->m_greenParams && - m_blueParams == gop->m_blueParams && - m_alphaParams == gop->m_alphaParams; + return m_style == gop->m_style && m_redParams == gop->m_redParams + && m_greenParams == gop->m_greenParams && m_blueParams == gop->m_blueParams + && m_alphaParams == gop->m_alphaParams; } std::string GammaOpData::getCacheID() const @@ -802,9 +795,9 @@ std::string GammaOpData::getCacheID() const cacheIDStream << GammaOpData::ConvertStyleToString(getStyle()) << " "; - cacheIDStream << "r:" << GetParametersString(getRedParams()) << " "; + cacheIDStream << "r:" << GetParametersString(getRedParams()) << " "; cacheIDStream << "g:" << GetParametersString(getGreenParams()) << " "; - cacheIDStream << "b:" << GetParametersString(getBlueParams()) << " "; + cacheIDStream << "b:" << GetParametersString(getBlueParams()) << " "; cacheIDStream << "a:" << GetParametersString(getAlphaParams()) << " "; return cacheIDStream.str(); @@ -814,19 +807,19 @@ TransformDirection GammaOpData::getDirection() const noexcept { switch (m_style) { - case BASIC_FWD: - case BASIC_MIRROR_FWD: - case BASIC_PASS_THRU_FWD: - case MONCURVE_FWD: - case MONCURVE_MIRROR_FWD: - return TRANSFORM_DIR_FORWARD; - - case BASIC_REV: - case BASIC_MIRROR_REV: - case BASIC_PASS_THRU_REV: - case MONCURVE_REV: - case MONCURVE_MIRROR_REV: - return TRANSFORM_DIR_INVERSE; + case BASIC_FWD: + case BASIC_MIRROR_FWD: + case BASIC_PASS_THRU_FWD: + case MONCURVE_FWD: + case MONCURVE_MIRROR_FWD: + return TRANSFORM_DIR_FORWARD; + + case BASIC_REV: + case BASIC_MIRROR_REV: + case BASIC_PASS_THRU_REV: + case MONCURVE_REV: + case MONCURVE_MIRROR_REV: + return TRANSFORM_DIR_INVERSE; } return TRANSFORM_DIR_FORWARD; @@ -845,16 +838,36 @@ void GammaOpData::invert() noexcept Style invStyle = BASIC_FWD; switch (getStyle()) { - case BASIC_FWD: invStyle = BASIC_REV; break; - case BASIC_REV: invStyle = BASIC_FWD; break; - case BASIC_MIRROR_FWD: invStyle = BASIC_MIRROR_REV; break; - case BASIC_MIRROR_REV: invStyle = BASIC_MIRROR_FWD; break; - case BASIC_PASS_THRU_FWD: invStyle = BASIC_PASS_THRU_REV; break; - case BASIC_PASS_THRU_REV: invStyle = BASIC_PASS_THRU_FWD; break; - case MONCURVE_FWD: invStyle = MONCURVE_REV; break; - case MONCURVE_REV: invStyle = MONCURVE_FWD; break; - case MONCURVE_MIRROR_FWD: invStyle = MONCURVE_MIRROR_REV; break; - case MONCURVE_MIRROR_REV: invStyle = MONCURVE_MIRROR_FWD; break; + case BASIC_FWD: + invStyle = BASIC_REV; + break; + case BASIC_REV: + invStyle = BASIC_FWD; + break; + case BASIC_MIRROR_FWD: + invStyle = BASIC_MIRROR_REV; + break; + case BASIC_MIRROR_REV: + invStyle = BASIC_MIRROR_FWD; + break; + case BASIC_PASS_THRU_FWD: + invStyle = BASIC_PASS_THRU_REV; + break; + case BASIC_PASS_THRU_REV: + invStyle = BASIC_PASS_THRU_FWD; + break; + case MONCURVE_FWD: + invStyle = MONCURVE_REV; + break; + case MONCURVE_REV: + invStyle = MONCURVE_FWD; + break; + case MONCURVE_MIRROR_FWD: + invStyle = MONCURVE_MIRROR_REV; + break; + case MONCURVE_MIRROR_REV: + invStyle = MONCURVE_MIRROR_FWD; + break; } setStyle(invStyle); } diff --git a/src/OpenColorIO/ops/gamma/GammaOpData.h b/src/OpenColorIO/ops/gamma/GammaOpData.h index 086e8f55b9..3737725ef0 100644 --- a/src/OpenColorIO/ops/gamma/GammaOpData.h +++ b/src/OpenColorIO/ops/gamma/GammaOpData.h @@ -1,16 +1,13 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_GAMMAOPDATA_H #define INCLUDED_OCIO_GAMMAOPDATA_H - #include #include "Op.h" - namespace OCIO_NAMESPACE { @@ -18,42 +15,40 @@ class GammaOpData; typedef OCIO_SHARED_PTR GammaOpDataRcPtr; typedef OCIO_SHARED_PTR ConstGammaOpDataRcPtr; - // This class represents the Gamma op. -// +// // A gamma op applies one of a family of parametric power functions. -// +// // These functions are typically used to model the nonlinearity in a // display device or camera. -// +// // A style argument is used to distinguish the specific function. -// +// // The BASIC style is simply a power law. -// +// // The MONCURVE style is a power law with the addition of a linear segment // in the shadows which avoids the fact that the slope of a pure power law // approaches infinity (for powers > 1) at 0. -// -// Here are the parameters to use with the MONCURVE style to implement several +// +// Here are the parameters to use with the MONCURVE style to implement several // commonly used functions: // sRGB -- gamma: 2.4, offset: 0.055 // Rec.709 -- gamma: 1/0.45, offset: 0.099 // L* -- gamma: 3.0, offset: 0.16 -// +// // The suffixes FWD and REV are used to distinguish the forward model from // the reverse (or inverse) model. -// +// // // By convention, the gamma values should be >= 1 whenever possible. -// These are used as is for the forward direction and the reverse/inverse direction -// is used to obtain exponents of less than 1. For the MONCURVE style, this is enforced +// These are used as is for the forward direction and the reverse/inverse direction +// is used to obtain exponents of less than 1. For the MONCURVE style, this is enforced // during validation so that the gamma and offset work together properly. // class GammaOpData : public OpData { public: - enum Style { BASIC_FWD = 0, @@ -80,11 +75,12 @@ class GammaOpData : public OpData GammaOpData(); GammaOpData(const GammaOpData &) = default; - GammaOpData(const Style & style, - const Params & redParams, - const Params & greenParams, - const Params & blueParams, - const Params & alphaParams); + GammaOpData( + const Style & style, + const Params & redParams, + const Params & greenParams, + const Params & blueParams, + const Params & alphaParams); virtual ~GammaOpData(); @@ -94,24 +90,24 @@ class GammaOpData : public OpData Type getType() const override { return GammaType; } - inline const Params & getRedParams() const { return m_redParams; } + inline const Params & getRedParams() const { return m_redParams; } inline const Params & getGreenParams() const { return m_greenParams; } - inline const Params & getBlueParams() const { return m_blueParams; } + inline const Params & getBlueParams() const { return m_blueParams; } inline const Params & getAlphaParams() const { return m_alphaParams; } - inline Params & getRedParams() { return m_redParams; } + inline Params & getRedParams() { return m_redParams; } inline Params & getGreenParams() { return m_greenParams; } - inline Params & getBlueParams() { return m_blueParams; } + inline Params & getBlueParams() { return m_blueParams; } inline Params & getAlphaParams() { return m_alphaParams; } void setStyle(const Style & style) noexcept; - void setRedParams (const Params & parameter); + void setRedParams(const Params & parameter); void setGreenParams(const Params & parameter); - void setBlueParams (const Params & parameter); + void setBlueParams(const Params & parameter); void setAlphaParams(const Params & parameter); - void setParams( const Params & parameter); + void setParams(const Params & parameter); virtual bool isNoOp() const override; virtual bool isIdentity() const override; @@ -141,7 +137,7 @@ class GammaOpData : public OpData virtual void validateParameters() const; - bool equals(const OpData& other) const override; + bool equals(const OpData & other) const override; std::string getCacheID() const override; diff --git a/src/OpenColorIO/ops/gamma/GammaOpGPU.cpp b/src/OpenColorIO/ops/gamma/GammaOpGPU.cpp index 39cf76c818..86e3baa792 100644 --- a/src/OpenColorIO/ops/gamma/GammaOpGPU.cpp +++ b/src/OpenColorIO/ops/gamma/GammaOpGPU.cpp @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #include #include "ops/gamma/GammaOpGPU.h" @@ -14,15 +13,18 @@ namespace { // Create shader for basic gamma style -void AddBasicFwdShader(GpuShaderCreatorRcPtr & shaderCreator, - ConstGammaOpDataRcPtr gamma, - GpuShaderText & ss) +void AddBasicFwdShader( + GpuShaderCreatorRcPtr & shaderCreator, + ConstGammaOpDataRcPtr gamma, + GpuShaderText & ss) { const double redGamma = gamma->getRedParams()[0]; const double grnGamma = gamma->getGreenParams()[0]; const double bluGamma = gamma->getBlueParams()[0]; const double alphaGamma = gamma->getAlphaParams()[0]; + // clang-format off + const std::string pxl(shaderCreator->getPixelName()); ss.declareFloat4( "gamma", redGamma, grnGamma, bluGamma, alphaGamma); @@ -34,17 +36,22 @@ void AddBasicFwdShader(GpuShaderCreatorRcPtr & shaderCreator, ss.newLine() << pxl << ".rgb = " << ss.float3Const("res.x", "res.y", "res.z") << ";"; ss.newLine() << pxl << ".a = res.w;"; + + // clang-format on } -void AddBasicRevShader(GpuShaderCreatorRcPtr & shaderCreator, - ConstGammaOpDataRcPtr gamma, - GpuShaderText & ss) +void AddBasicRevShader( + GpuShaderCreatorRcPtr & shaderCreator, + ConstGammaOpDataRcPtr gamma, + GpuShaderText & ss) { const double redGamma = 1. / gamma->getRedParams()[0]; const double grnGamma = 1. / gamma->getGreenParams()[0]; const double bluGamma = 1. / gamma->getBlueParams()[0]; const double alphaGamma = 1. / gamma->getAlphaParams()[0]; + // clang-format off + const std::string pxl(shaderCreator->getPixelName()); ss.declareFloat4( "gamma", redGamma, grnGamma, bluGamma, alphaGamma); @@ -56,18 +63,23 @@ void AddBasicRevShader(GpuShaderCreatorRcPtr & shaderCreator, ss.newLine() << pxl << ".rgb = " << ss.float3Const("res.x", "res.y", "res.z") << ";"; ss.newLine() << pxl << ".a = res.w;"; + + // clang-format on } // Create shader for basic mirror gamma style -void AddBasicMirrorFwdShader(GpuShaderCreatorRcPtr & shaderCreator, - ConstGammaOpDataRcPtr gamma, - GpuShaderText & ss) +void AddBasicMirrorFwdShader( + GpuShaderCreatorRcPtr & shaderCreator, + ConstGammaOpDataRcPtr gamma, + GpuShaderText & ss) { - const double redGamma = gamma->getRedParams()[0]; - const double grnGamma = gamma->getGreenParams()[0]; - const double bluGamma = gamma->getBlueParams()[0]; + const double redGamma = gamma->getRedParams()[0]; + const double grnGamma = gamma->getGreenParams()[0]; + const double bluGamma = gamma->getBlueParams()[0]; const double alphaGamma = gamma->getAlphaParams()[0]; + // clang-format off + const std::string pxl(shaderCreator->getPixelName()); ss.declareFloat4("gamma", redGamma, grnGamma, bluGamma, alphaGamma); @@ -77,17 +89,22 @@ void AddBasicMirrorFwdShader(GpuShaderCreatorRcPtr & shaderCreator, ss.newLine() << pxl << ".rgb = " << ss.float3Const("res.x", "res.y", "res.z") << ";"; ss.newLine() << pxl << ".a = res.w;"; + + // clang-format on } -void AddBasicMirrorRevShader(GpuShaderCreatorRcPtr & shaderCreator, - ConstGammaOpDataRcPtr gamma, - GpuShaderText & ss) +void AddBasicMirrorRevShader( + GpuShaderCreatorRcPtr & shaderCreator, + ConstGammaOpDataRcPtr gamma, + GpuShaderText & ss) { - const double redGamma = 1. / gamma->getRedParams()[0]; - const double grnGamma = 1. / gamma->getGreenParams()[0]; - const double bluGamma = 1. / gamma->getBlueParams()[0]; + const double redGamma = 1. / gamma->getRedParams()[0]; + const double grnGamma = 1. / gamma->getGreenParams()[0]; + const double bluGamma = 1. / gamma->getBlueParams()[0]; const double alphaGamma = 1. / gamma->getAlphaParams()[0]; + // clang-format off + const std::string pxl(shaderCreator->getPixelName()); ss.declareFloat4("gamma", redGamma, grnGamma, bluGamma, alphaGamma); @@ -97,18 +114,23 @@ void AddBasicMirrorRevShader(GpuShaderCreatorRcPtr & shaderCreator, ss.newLine() << pxl << ".rgb = " << ss.float3Const("res.x", "res.y", "res.z") << ";"; ss.newLine() << pxl << ".a = res.w;"; + + // clang-format on } // Create shader for basic pass thru gamma style -void AddBasicPassThruFwdShader(GpuShaderCreatorRcPtr & shaderCreator, - ConstGammaOpDataRcPtr gamma, - GpuShaderText & ss) +void AddBasicPassThruFwdShader( + GpuShaderCreatorRcPtr & shaderCreator, + ConstGammaOpDataRcPtr gamma, + GpuShaderText & ss) { - const double redGamma = gamma->getRedParams()[0]; - const double grnGamma = gamma->getGreenParams()[0]; - const double bluGamma = gamma->getBlueParams()[0]; + const double redGamma = gamma->getRedParams()[0]; + const double grnGamma = gamma->getGreenParams()[0]; + const double bluGamma = gamma->getBlueParams()[0]; const double alphaGamma = gamma->getAlphaParams()[0]; + // clang-format off + const std::string pxl(shaderCreator->getPixelName()); ss.declareFloat4("gamma", redGamma, grnGamma, bluGamma, alphaGamma); @@ -126,17 +148,22 @@ void AddBasicPassThruFwdShader(GpuShaderCreatorRcPtr & shaderCreator, ss.newLine() << pxl << ".rgb = " << ss.float3Const("res.x", "res.y", "res.z") << ";"; ss.newLine() << pxl << ".a = res.w;"; + + // clang-format on } -void AddBasicPassThruRevShader(GpuShaderCreatorRcPtr & shaderCreator, - ConstGammaOpDataRcPtr gamma, - GpuShaderText & ss) +void AddBasicPassThruRevShader( + GpuShaderCreatorRcPtr & shaderCreator, + ConstGammaOpDataRcPtr gamma, + GpuShaderText & ss) { - const double redGamma = 1. / gamma->getRedParams()[0]; - const double grnGamma = 1. / gamma->getGreenParams()[0]; - const double bluGamma = 1. / gamma->getBlueParams()[0]; + const double redGamma = 1. / gamma->getRedParams()[0]; + const double grnGamma = 1. / gamma->getGreenParams()[0]; + const double bluGamma = 1. / gamma->getBlueParams()[0]; const double alphaGamma = 1. / gamma->getAlphaParams()[0]; + // clang-format off + const std::string pxl(shaderCreator->getPixelName()); ss.declareFloat4("gamma", redGamma, grnGamma, bluGamma, alphaGamma); @@ -154,18 +181,21 @@ void AddBasicPassThruRevShader(GpuShaderCreatorRcPtr & shaderCreator, ss.newLine() << pxl << ".rgb = " << ss.float3Const("res.x", "res.y", "res.z") << ";"; ss.newLine() << pxl << ".a = res.w;"; + + // clang-format on } // Create shader for moncurveFwd style -void AddMoncurveFwdShader(GpuShaderCreatorRcPtr & shaderCreator, - ConstGammaOpDataRcPtr gamma, - GpuShaderText & ss) +void AddMoncurveFwdShader( + GpuShaderCreatorRcPtr & shaderCreator, + ConstGammaOpDataRcPtr gamma, + GpuShaderText & ss) { RendererParams red, green, blue, alpha; - ComputeParamsFwd(gamma->getRedParams(), red); + ComputeParamsFwd(gamma->getRedParams(), red); ComputeParamsFwd(gamma->getGreenParams(), green); - ComputeParamsFwd(gamma->getBlueParams(), blue); + ComputeParamsFwd(gamma->getBlueParams(), blue); ComputeParamsFwd(gamma->getAlphaParams(), alpha); const std::string pxl(shaderCreator->getPixelName()); @@ -173,6 +203,8 @@ void AddMoncurveFwdShader(GpuShaderCreatorRcPtr & shaderCreator, // Even if all components are the same, on OS X, a vec4 needs to be // declared. This code will work in both cases. + // clang-format off + ss.declareFloat4( "breakPnt", red.breakPnt, green.breakPnt, blue.breakPnt, alpha.breakPnt); ss.declareFloat4( "slope" , red.slope, green.slope, blue.slope, alpha.slope); ss.declareFloat4( "scale" , red.scale, green.scale, blue.scale, alpha.scale); @@ -192,18 +224,21 @@ void AddMoncurveFwdShader(GpuShaderCreatorRcPtr & shaderCreator, ss.newLine() << pxl << ".rgb = " << ss.float3Const("res.x", "res.y", "res.z") << ";"; ss.newLine() << pxl << ".a = res.w;"; + + // clang-format on } // Create shader for moncurveRev style -void AddMoncurveRevShader(GpuShaderCreatorRcPtr & shaderCreator, - ConstGammaOpDataRcPtr gamma, - GpuShaderText & ss) +void AddMoncurveRevShader( + GpuShaderCreatorRcPtr & shaderCreator, + ConstGammaOpDataRcPtr gamma, + GpuShaderText & ss) { RendererParams red, green, blue, alpha; - ComputeParamsRev(gamma->getRedParams(), red); + ComputeParamsRev(gamma->getRedParams(), red); ComputeParamsRev(gamma->getGreenParams(), green); - ComputeParamsRev(gamma->getBlueParams(), blue); + ComputeParamsRev(gamma->getBlueParams(), blue); ComputeParamsRev(gamma->getAlphaParams(), alpha); const std::string pxl(shaderCreator->getPixelName()); @@ -211,6 +246,8 @@ void AddMoncurveRevShader(GpuShaderCreatorRcPtr & shaderCreator, // Even if all components are the same, on OS X, a vec4 needs to be // declared. This code will work in both cases. + // clang-format off + ss.declareFloat4( "breakPnt", red.breakPnt, green.breakPnt, blue.breakPnt, alpha.breakPnt); ss.declareFloat4( "slope" , red.slope, green.slope, blue.slope, alpha.slope); ss.declareFloat4( "scale" , red.scale, green.scale, blue.scale, alpha.scale); @@ -229,12 +266,15 @@ void AddMoncurveRevShader(GpuShaderCreatorRcPtr & shaderCreator, ss.newLine() << pxl << ".rgb = " << ss.float3Const("res.x", "res.y", "res.z") << ";"; ss.newLine() << pxl << ".a = res.w;"; + + // clang-format on } // Create shader for moncurveMirrorFwd style -void AddMoncurveMirrorFwdShader(GpuShaderCreatorRcPtr & shaderCreator, - ConstGammaOpDataRcPtr gamma, - GpuShaderText & ss) +void AddMoncurveMirrorFwdShader( + GpuShaderCreatorRcPtr & shaderCreator, + ConstGammaOpDataRcPtr gamma, + GpuShaderText & ss) { RendererParams red, green, blue, alpha; @@ -245,6 +285,8 @@ void AddMoncurveMirrorFwdShader(GpuShaderCreatorRcPtr & shaderCreator, const std::string pxl(shaderCreator->getPixelName()); + // clang-format off + // Even if all components are the same, on OS X, a vec4 needs to be // declared. This code will work in both cases. ss.declareFloat4("breakPnt", red.breakPnt, green.breakPnt, blue.breakPnt, alpha.breakPnt); @@ -271,12 +313,15 @@ void AddMoncurveMirrorFwdShader(GpuShaderCreatorRcPtr & shaderCreator, ss.newLine() << pxl << ".rgb = " << ss.float3Const("res.x", "res.y", "res.z") << ";"; ss.newLine() << pxl << ".a = res.w;"; + + // clang-format on } // Create shader for moncurveMirrorRev style -void AddMoncurveMirrorRevShader(GpuShaderCreatorRcPtr & shaderCreator, - ConstGammaOpDataRcPtr gamma, - GpuShaderText & ss) +void AddMoncurveMirrorRevShader( + GpuShaderCreatorRcPtr & shaderCreator, + ConstGammaOpDataRcPtr gamma, + GpuShaderText & ss) { RendererParams red, green, blue, alpha; @@ -287,6 +332,8 @@ void AddMoncurveMirrorRevShader(GpuShaderCreatorRcPtr & shaderCreator, const std::string pxl(shaderCreator->getPixelName()); + // clang-format off + // Even if all components are the same, on OS X, a vec4 needs to be // declared. This code will work in both cases. ss.declareFloat4("breakPnt", red.breakPnt, green.breakPnt, blue.breakPnt, alpha.breakPnt); @@ -311,16 +358,21 @@ void AddMoncurveMirrorRevShader(GpuShaderCreatorRcPtr & shaderCreator, ss.newLine() << pxl << ".rgb = " << ss.float3Const("res.x", "res.y", "res.z") << ";"; ss.newLine() << pxl << ".a = res.w;"; + + // clang-format on } -} // Anon namespace +} // namespace -void GetGammaGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, - ConstGammaOpDataRcPtr & gammaData) +void GetGammaGPUShaderProgram( + GpuShaderCreatorRcPtr & shaderCreator, + ConstGammaOpDataRcPtr & gammaData) { GpuShaderText ss(shaderCreator->getLanguage()); ss.indent(); + // clang-format off + ss.newLine() << ""; ss.newLine() << "// Add Gamma '" << GammaOpData::ConvertStyleToString(gammaData->getStyle()) @@ -330,58 +382,60 @@ void GetGammaGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, ss.newLine() << "{"; ss.indent(); + // clang-format on + switch (gammaData->getStyle()) { - case GammaOpData::MONCURVE_FWD: - { - AddMoncurveFwdShader(shaderCreator, gammaData, ss); - break; - } - case GammaOpData::MONCURVE_REV: - { - AddMoncurveRevShader(shaderCreator, gammaData, ss); - break; - } - case GammaOpData::MONCURVE_MIRROR_FWD: - { - AddMoncurveMirrorFwdShader(shaderCreator, gammaData, ss); - break; - } - case GammaOpData::MONCURVE_MIRROR_REV: - { - AddMoncurveMirrorRevShader(shaderCreator, gammaData, ss); - break; - } - case GammaOpData::BASIC_FWD: - { - AddBasicFwdShader(shaderCreator, gammaData, ss); - break; - } - case GammaOpData::BASIC_REV: - { - AddBasicRevShader(shaderCreator, gammaData, ss); - break; - } - case GammaOpData::BASIC_MIRROR_FWD: - { - AddBasicMirrorFwdShader(shaderCreator, gammaData, ss); - break; - } - case GammaOpData::BASIC_MIRROR_REV: - { - AddBasicMirrorRevShader(shaderCreator, gammaData, ss); - break; - } - case GammaOpData::BASIC_PASS_THRU_FWD: - { - AddBasicPassThruFwdShader(shaderCreator, gammaData, ss); - break; - } - case GammaOpData::BASIC_PASS_THRU_REV: - { - AddBasicPassThruRevShader(shaderCreator, gammaData, ss); - break; - } + case GammaOpData::MONCURVE_FWD: + { + AddMoncurveFwdShader(shaderCreator, gammaData, ss); + break; + } + case GammaOpData::MONCURVE_REV: + { + AddMoncurveRevShader(shaderCreator, gammaData, ss); + break; + } + case GammaOpData::MONCURVE_MIRROR_FWD: + { + AddMoncurveMirrorFwdShader(shaderCreator, gammaData, ss); + break; + } + case GammaOpData::MONCURVE_MIRROR_REV: + { + AddMoncurveMirrorRevShader(shaderCreator, gammaData, ss); + break; + } + case GammaOpData::BASIC_FWD: + { + AddBasicFwdShader(shaderCreator, gammaData, ss); + break; + } + case GammaOpData::BASIC_REV: + { + AddBasicRevShader(shaderCreator, gammaData, ss); + break; + } + case GammaOpData::BASIC_MIRROR_FWD: + { + AddBasicMirrorFwdShader(shaderCreator, gammaData, ss); + break; + } + case GammaOpData::BASIC_MIRROR_REV: + { + AddBasicMirrorRevShader(shaderCreator, gammaData, ss); + break; + } + case GammaOpData::BASIC_PASS_THRU_FWD: + { + AddBasicPassThruFwdShader(shaderCreator, gammaData, ss); + break; + } + case GammaOpData::BASIC_PASS_THRU_REV: + { + AddBasicPassThruRevShader(shaderCreator, gammaData, ss); + break; + } } ss.dedent(); @@ -391,5 +445,4 @@ void GetGammaGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, shaderCreator->addToFunctionShaderCode(ss.string().c_str()); } - } // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/ops/gamma/GammaOpGPU.h b/src/OpenColorIO/ops/gamma/GammaOpGPU.h index b1f20ec34d..711e3362b4 100644 --- a/src/OpenColorIO/ops/gamma/GammaOpGPU.h +++ b/src/OpenColorIO/ops/gamma/GammaOpGPU.h @@ -1,11 +1,9 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_GAMMAOP_GPU_H #define INCLUDED_OCIO_GAMMAOP_GPU_H - #include #include "GpuShaderUtils.h" @@ -14,11 +12,10 @@ namespace OCIO_NAMESPACE { -void GetGammaGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, - ConstGammaOpDataRcPtr & gammaData); - +void GetGammaGPUShaderProgram( + GpuShaderCreatorRcPtr & shaderCreator, + ConstGammaOpDataRcPtr & gammaData); } // namespace OCIO_NAMESPACE - #endif // INCLUDED_OCIO_GAMMAOP_GPU_H diff --git a/src/OpenColorIO/ops/gamma/GammaOpUtils.cpp b/src/OpenColorIO/ops/gamma/GammaOpUtils.cpp index 8a158fa886..bfe4ebe5fa 100644 --- a/src/OpenColorIO/ops/gamma/GammaOpUtils.cpp +++ b/src/OpenColorIO/ops/gamma/GammaOpUtils.cpp @@ -53,8 +53,8 @@ double monCurveSlopeFwd(const GammaOpData::Params & p) // Slope of the linear segment. const double gamma = std::max(p[0], 1. + EPS); const double offset = std::max(p[1], EPS); - const double a = (gamma - 1.) / offset; - const double b = offset * gamma / (( gamma - 1.) * ( 1. + offset)); + const double a = (gamma - 1.) / offset; + const double b = offset * gamma / ((gamma - 1.) * (1. + offset)); return a * pow(b, gamma); } @@ -82,17 +82,17 @@ double monCurveBreakRev(const GammaOpData::Params & p) { const double gamma = std::max(p[0], 1. + EPS); const double offset = std::max(p[1], EPS); - const double a = offset * gamma; - const double b = (gamma - 1.) * (1. + offset); - return pow( a / b, gamma ); + const double a = offset * gamma; + const double b = (gamma - 1.) * (1. + offset); + return pow(a / b, gamma); } double monCurveSlopeRev(const GammaOpData::Params & p) { const double gamma = std::max(p[0], 1. + EPS); const double offset = std::max(p[1], EPS); - const double a = (gamma - 1.) / offset; - const double b = (1. + offset) / gamma; + const double a = (gamma - 1.) / offset; + const double b = (1. + offset) / gamma; return pow(a, gamma - 1.) * pow(b, gamma); } @@ -102,12 +102,9 @@ double monCurveScaleRev(const GammaOpData::Params & p) return 1. + offset; } +}; // namespace - -}; - -void ComputeParamsFwd(const GammaOpData::Params & gParams, - RendererParams & rParams) +void ComputeParamsFwd(const GammaOpData::Params & gParams, RendererParams & rParams) { rParams.gamma = float(monCurveGammaFwd(gParams)); rParams.offset = float(monCurveOffsetFwd(gParams)); @@ -116,8 +113,7 @@ void ComputeParamsFwd(const GammaOpData::Params & gParams, rParams.scale = float(monCurveScaleFwd(gParams)); } -void ComputeParamsRev(const GammaOpData::Params & gParams, - RendererParams & rParams) +void ComputeParamsRev(const GammaOpData::Params & gParams, RendererParams & rParams) { rParams.gamma = float(monCurveGammaRev(gParams)); rParams.offset = float(monCurveOffsetRev(gParams)); @@ -127,4 +123,3 @@ void ComputeParamsRev(const GammaOpData::Params & gParams, } } // namespace OCIO_NAMESPACE - diff --git a/src/OpenColorIO/ops/gamma/GammaOpUtils.h b/src/OpenColorIO/ops/gamma/GammaOpUtils.h index 4dddc84c98..34ff29f96c 100644 --- a/src/OpenColorIO/ops/gamma/GammaOpUtils.h +++ b/src/OpenColorIO/ops/gamma/GammaOpUtils.h @@ -1,28 +1,26 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_GAMMAOPUTILS_H #define INCLUDED_OCIO_GAMMAOPUTILS_H - #include #include "ops/gamma/GammaOpData.h" - namespace OCIO_NAMESPACE { struct RendererParams { RendererParams() - : gamma(1.0f) - , offset(0.0f) - , breakPnt(0.0f) - , slope(1.0f) - , scale(1.0f) - { } + : gamma(1.0f) + , offset(0.0f) + , breakPnt(0.0f) + , slope(1.0f) + , scale(1.0f) + { + } float gamma; float offset; @@ -31,18 +29,14 @@ struct RendererParams float scale; }; - -// Utility function to compute the rendering coefficients for the forward +// Utility function to compute the rendering coefficients for the forward // monitor curve gamma op. -void ComputeParamsFwd(const GammaOpData::Params & gParams, - RendererParams & rParams); +void ComputeParamsFwd(const GammaOpData::Params & gParams, RendererParams & rParams); -// Utility function to compute the rendering coefficients for the reverse +// Utility function to compute the rendering coefficients for the reverse // monitor curve gamma op. -void ComputeParamsRev(const GammaOpData::Params & gParams, - RendererParams & rParams); +void ComputeParamsRev(const GammaOpData::Params & gParams, RendererParams & rParams); } // namespace OCIO_NAMESPACE - #endif \ No newline at end of file diff --git a/src/OpenColorIO/ops/gradingprimary/GradingPrimary.cpp b/src/OpenColorIO/ops/gradingprimary/GradingPrimary.cpp index 788640b7f7..77d3057fa6 100644 --- a/src/OpenColorIO/ops/gradingprimary/GradingPrimary.cpp +++ b/src/OpenColorIO/ops/gradingprimary/GradingPrimary.cpp @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #include #include @@ -14,8 +13,8 @@ namespace OCIO_NAMESPACE bool operator==(const GradingRGBM & lhs, const GradingRGBM & rhs) { - return lhs.m_red == rhs.m_red && lhs.m_green == rhs.m_green && - lhs.m_blue == rhs.m_blue && lhs.m_master == rhs.m_master; + return lhs.m_red == rhs.m_red && lhs.m_green == rhs.m_green && lhs.m_blue == rhs.m_blue + && lhs.m_master == rhs.m_master; } bool operator!=(const GradingRGBM & lhs, const GradingRGBM & rhs) @@ -25,19 +24,13 @@ bool operator!=(const GradingRGBM & lhs, const GradingRGBM & rhs) bool operator==(const GradingPrimary & lhs, const GradingPrimary & rhs) { - return lhs.m_brightness == rhs.m_brightness && - lhs.m_contrast == rhs.m_contrast && - lhs.m_gamma == rhs.m_gamma && - lhs.m_offset == rhs.m_offset && - lhs.m_exposure == rhs.m_exposure && - lhs.m_lift == rhs.m_lift && - lhs.m_gain == rhs.m_gain && - lhs.m_pivot == rhs.m_pivot && - lhs.m_saturation == rhs.m_saturation && - lhs.m_clampWhite == rhs.m_clampWhite && - lhs.m_clampBlack == rhs.m_clampBlack && - lhs.m_pivotWhite == rhs.m_pivotWhite && - lhs.m_pivotBlack == rhs.m_pivotBlack; + return lhs.m_brightness == rhs.m_brightness && lhs.m_contrast == rhs.m_contrast + && lhs.m_gamma == rhs.m_gamma && lhs.m_offset == rhs.m_offset + && lhs.m_exposure == rhs.m_exposure && lhs.m_lift == rhs.m_lift + && lhs.m_gain == rhs.m_gain && lhs.m_pivot == rhs.m_pivot + && lhs.m_saturation == rhs.m_saturation && lhs.m_clampWhite == rhs.m_clampWhite + && lhs.m_clampBlack == rhs.m_clampBlack && lhs.m_pivotWhite == rhs.m_pivotWhite + && lhs.m_pivotBlack == rhs.m_pivotBlack; } bool operator!=(const GradingPrimary & lhs, const GradingPrimary & rhs) @@ -63,14 +56,11 @@ void GradingPrimary::validate(GradingStyle style) const static constexpr double GradingPrimaryLowerBound = 0.01; static constexpr double GradingPrimaryBoundError = 0.000001; - static constexpr double GradingPrimaryMin = GradingPrimaryLowerBound - - GradingPrimaryBoundError; + static constexpr double GradingPrimaryMin = GradingPrimaryLowerBound - GradingPrimaryBoundError; - if (style != GRADING_LIN && - (m_gamma.m_red < GradingPrimaryMin || - m_gamma.m_green < GradingPrimaryMin || - m_gamma.m_blue < GradingPrimaryMin || - m_gamma.m_master < GradingPrimaryMin)) + if (style != GRADING_LIN + && (m_gamma.m_red < GradingPrimaryMin || m_gamma.m_green < GradingPrimaryMin + || m_gamma.m_blue < GradingPrimaryMin || m_gamma.m_master < GradingPrimaryMin)) { std::ostringstream oss; oss << "GradingPrimary gamma '" << m_gamma << "' are below lower bound (" @@ -78,11 +68,9 @@ void GradingPrimary::validate(GradingStyle style) const throw Exception(oss.str().c_str()); } - if (style == GRADING_LIN && - (m_contrast.m_red < GradingPrimaryMin || - m_contrast.m_green < GradingPrimaryMin || - m_contrast.m_blue < GradingPrimaryMin || - m_contrast.m_master < GradingPrimaryMin)) + if (style == GRADING_LIN + && (m_contrast.m_red < GradingPrimaryMin || m_contrast.m_green < GradingPrimaryMin + || m_contrast.m_blue < GradingPrimaryMin || m_contrast.m_master < GradingPrimaryMin)) { std::ostringstream oss; oss << "GradingPrimary contrast '" << m_contrast << "' are below lower bound (" @@ -101,161 +89,167 @@ void GradingPrimary::validate(GradingStyle style) const } } -void GradingPrimaryPreRender::update(GradingStyle style, - TransformDirection dir, - const GradingPrimary & v) noexcept +void GradingPrimaryPreRender::update( + GradingStyle style, + TransformDirection dir, + const GradingPrimary & v) noexcept { - m_localBypass = v.m_saturation == 1. && - v.m_clampBlack == GradingPrimary::NoClampBlack() && - v.m_clampWhite == GradingPrimary::NoClampWhite(); + m_localBypass = v.m_saturation == 1. && v.m_clampBlack == GradingPrimary::NoClampBlack() + && v.m_clampWhite == GradingPrimary::NoClampWhite(); switch (style) { - case GRADING_LOG: - { - const GradingRGBM & b = v.m_brightness; - const GradingRGBM & c = v.m_contrast; - const GradingRGBM & g = v.m_gamma; - switch (dir) - { - case TRANSFORM_DIR_FORWARD: - { - m_brightness[0] = static_cast((b.m_master + b.m_red) * 6.25 / 1023.); - m_brightness[1] = static_cast((b.m_master + b.m_green) * 6.25 / 1023.); - m_brightness[2] = static_cast((b.m_master + b.m_blue) * 6.25 / 1023.); - m_contrast[0] = static_cast(c.m_master * c.m_red); - m_contrast[1] = static_cast(c.m_master * c.m_green); - m_contrast[2] = static_cast(c.m_master * c.m_blue); - m_gamma[0] = static_cast(1. / (g.m_master * g.m_red)); - m_gamma[1] = static_cast(1. / (g.m_master * g.m_green)); - m_gamma[2] = static_cast(1. / (g.m_master * g.m_blue)); - break; - } - case TRANSFORM_DIR_INVERSE: - { - m_brightness[0] = -static_cast((b.m_master + b.m_red) * 6.25 / 1023.); - m_brightness[1] = -static_cast((b.m_master + b.m_green) * 6.25 / 1023.); - m_brightness[2] = -static_cast((b.m_master + b.m_blue) * 6.25 / 1023.); - const double c0 = c.m_master * c.m_red; - const double c1 = c.m_master * c.m_green; - const double c2 = c.m_master * c.m_blue; - m_contrast[0] = static_cast(1. / (c0 == 0. ? 1. : c0)); - m_contrast[1] = static_cast(1. / (c1 == 0. ? 1. : c1)); - m_contrast[2] = static_cast(1. / (c2 == 0. ? 1. : c2)); - m_gamma[0] = static_cast(g.m_master * g.m_red); - m_gamma[1] = static_cast(g.m_master * g.m_green); - m_gamma[2] = static_cast(g.m_master * g.m_blue); - break; - } - } - m_isPowerIdentity = m_gamma[0] == 1.0f && m_gamma[1] == 1.0f && m_gamma[2] == 1.0f; - m_pivot = 0.5 + v.m_pivot * 0.5; - m_localBypass = m_localBypass && m_isPowerIdentity && - m_brightness[0] == 0.f && m_brightness[1] == 0.f && m_brightness[2] == 0.f && - m_contrast[0] == 1.f && m_contrast[1] == 1.f && m_contrast[2] == 1.f; - break; - } - case GRADING_LIN: - { - const GradingRGBM & o = v.m_offset; - const GradingRGBM & e = v.m_exposure; - const GradingRGBM & c = v.m_contrast; - switch (dir) - { - case TRANSFORM_DIR_FORWARD: + case GRADING_LOG: { - m_offset[0] = static_cast(o.m_master + o.m_red); - m_offset[1] = static_cast(o.m_master + o.m_green); - m_offset[2] = static_cast(o.m_master + o.m_blue); - m_exposure[0] = std::pow(2.0f, static_cast(e.m_master + e.m_red)); - m_exposure[1] = std::pow(2.0f, static_cast(e.m_master + e.m_green)); - m_exposure[2] = std::pow(2.0f, static_cast(e.m_master + e.m_blue)); - m_contrast[0] = static_cast(c.m_master * c.m_red); - m_contrast[1] = static_cast(c.m_master * c.m_green); - m_contrast[2] = static_cast(c.m_master * c.m_blue); + const GradingRGBM & b = v.m_brightness; + const GradingRGBM & c = v.m_contrast; + const GradingRGBM & g = v.m_gamma; + switch (dir) + { + case TRANSFORM_DIR_FORWARD: + { + m_brightness[0] = static_cast((b.m_master + b.m_red) * 6.25 / 1023.); + m_brightness[1] = static_cast((b.m_master + b.m_green) * 6.25 / 1023.); + m_brightness[2] = static_cast((b.m_master + b.m_blue) * 6.25 / 1023.); + m_contrast[0] = static_cast(c.m_master * c.m_red); + m_contrast[1] = static_cast(c.m_master * c.m_green); + m_contrast[2] = static_cast(c.m_master * c.m_blue); + m_gamma[0] = static_cast(1. / (g.m_master * g.m_red)); + m_gamma[1] = static_cast(1. / (g.m_master * g.m_green)); + m_gamma[2] = static_cast(1. / (g.m_master * g.m_blue)); + break; + } + case TRANSFORM_DIR_INVERSE: + { + m_brightness[0] = -static_cast((b.m_master + b.m_red) * 6.25 / 1023.); + m_brightness[1] = -static_cast((b.m_master + b.m_green) * 6.25 / 1023.); + m_brightness[2] = -static_cast((b.m_master + b.m_blue) * 6.25 / 1023.); + const double c0 = c.m_master * c.m_red; + const double c1 = c.m_master * c.m_green; + const double c2 = c.m_master * c.m_blue; + m_contrast[0] = static_cast(1. / (c0 == 0. ? 1. : c0)); + m_contrast[1] = static_cast(1. / (c1 == 0. ? 1. : c1)); + m_contrast[2] = static_cast(1. / (c2 == 0. ? 1. : c2)); + m_gamma[0] = static_cast(g.m_master * g.m_red); + m_gamma[1] = static_cast(g.m_master * g.m_green); + m_gamma[2] = static_cast(g.m_master * g.m_blue); + break; + } + } + m_isPowerIdentity = m_gamma[0] == 1.0f && m_gamma[1] == 1.0f && m_gamma[2] == 1.0f; + m_pivot = 0.5 + v.m_pivot * 0.5; + m_localBypass = m_localBypass && m_isPowerIdentity && m_brightness[0] == 0.f + && m_brightness[1] == 0.f && m_brightness[2] == 0.f + && m_contrast[0] == 1.f && m_contrast[1] == 1.f && m_contrast[2] == 1.f; break; } - case TRANSFORM_DIR_INVERSE: + case GRADING_LIN: { - m_offset[0] = -static_cast(o.m_master + o.m_red); - m_offset[1] = -static_cast(o.m_master + o.m_green); - m_offset[2] = -static_cast(o.m_master + o.m_blue); - m_exposure[0] = 1.f / std::pow(2.f, static_cast(e.m_master + e.m_red)); - m_exposure[1] = 1.f / std::pow(2.f, static_cast(e.m_master + e.m_green)); - m_exposure[2] = 1.f / std::pow(2.f, static_cast(e.m_master + e.m_blue)); - // Validate ensures contrast is above a threshold. - m_contrast[0] = static_cast(1. / (c.m_master * c.m_red)); - m_contrast[1] = static_cast(1. / (c.m_master * c.m_green)); - m_contrast[2] = static_cast(1. / (c.m_master * c.m_blue)); + const GradingRGBM & o = v.m_offset; + const GradingRGBM & e = v.m_exposure; + const GradingRGBM & c = v.m_contrast; + switch (dir) + { + case TRANSFORM_DIR_FORWARD: + { + m_offset[0] = static_cast(o.m_master + o.m_red); + m_offset[1] = static_cast(o.m_master + o.m_green); + m_offset[2] = static_cast(o.m_master + o.m_blue); + m_exposure[0] = std::pow(2.0f, static_cast(e.m_master + e.m_red)); + m_exposure[1] = std::pow(2.0f, static_cast(e.m_master + e.m_green)); + m_exposure[2] = std::pow(2.0f, static_cast(e.m_master + e.m_blue)); + m_contrast[0] = static_cast(c.m_master * c.m_red); + m_contrast[1] = static_cast(c.m_master * c.m_green); + m_contrast[2] = static_cast(c.m_master * c.m_blue); + break; + } + case TRANSFORM_DIR_INVERSE: + { + m_offset[0] = -static_cast(o.m_master + o.m_red); + m_offset[1] = -static_cast(o.m_master + o.m_green); + m_offset[2] = -static_cast(o.m_master + o.m_blue); + m_exposure[0] = 1.f / std::pow(2.f, static_cast(e.m_master + e.m_red)); + m_exposure[1] = 1.f / std::pow(2.f, static_cast(e.m_master + e.m_green)); + m_exposure[2] = 1.f / std::pow(2.f, static_cast(e.m_master + e.m_blue)); + // Validate ensures contrast is above a threshold. + m_contrast[0] = static_cast(1. / (c.m_master * c.m_red)); + m_contrast[1] = static_cast(1. / (c.m_master * c.m_green)); + m_contrast[2] = static_cast(1. / (c.m_master * c.m_blue)); + break; + } + } + m_isPowerIdentity + = m_contrast[0] == 1.0f && m_contrast[1] == 1.0f && m_contrast[2] == 1.0f; + m_pivot = 0.18 * std::pow(2., v.m_pivot); + m_localBypass = m_localBypass && m_isPowerIdentity && m_exposure[0] == 1.f + && m_exposure[1] == 1.f && m_exposure[2] == 1.f && m_offset[0] == 0.f + && m_offset[1] == 0.f && m_offset[2] == 0.f; break; } - } - m_isPowerIdentity = m_contrast[0] == 1.0f && m_contrast[1] == 1.0f && - m_contrast[2] == 1.0f; - m_pivot = 0.18 * std::pow(2., v.m_pivot); - m_localBypass = m_localBypass && m_isPowerIdentity && - m_exposure[0] == 1.f && m_exposure[1] == 1.f && m_exposure[2] == 1.f && - m_offset[0] == 0.f && m_offset[1] == 0.f && m_offset[2] == 0.f; - break; - } - case GRADING_VIDEO: - { - const GradingRGBM & o = v.m_offset; - const GradingRGBM & l = v.m_lift; - double gain0 = v.m_gain.m_master * v.m_gain.m_red; - double gain1 = v.m_gain.m_master * v.m_gain.m_green; - double gain2 = v.m_gain.m_master * v.m_gain.m_blue; - gain0 = gain0 == 0. ? 1. : gain0; - gain1 = gain1 == 0. ? 1. : gain1; - gain2 = gain2 == 0. ? 1. : gain2; - const GradingRGBM & g = v.m_gamma; - switch (dir) - { - case TRANSFORM_DIR_FORWARD: + case GRADING_VIDEO: { - m_offset[0] = static_cast(o.m_master + o.m_red + l.m_master + l.m_red); - m_offset[1] = static_cast(o.m_master + o.m_green + l.m_master + l.m_green); - m_offset[2] = static_cast(o.m_master + o.m_blue + l.m_master + l.m_blue); - const double slopeDen0 = v.m_pivotWhite / gain0 + l.m_master + l.m_red - v.m_pivotBlack; - const double slopeDen1 = v.m_pivotWhite / gain1 + l.m_master + l.m_green - v.m_pivotBlack; - const double slopeDen2 = v.m_pivotWhite / gain2 + l.m_master + l.m_blue - v.m_pivotBlack; - m_slope[0] = static_cast((v.m_pivotWhite - v.m_pivotBlack) / - (slopeDen0 == 0. ? 1. : slopeDen0)); - m_slope[1] = static_cast((v.m_pivotWhite - v.m_pivotBlack) / - (slopeDen1 == 0. ? 1. : slopeDen1)); - m_slope[2] = static_cast((v.m_pivotWhite - v.m_pivotBlack) / - (slopeDen2 == 0. ? 1. : slopeDen2)); - m_gamma[0] = static_cast(1. / (g.m_master * g.m_red)); - m_gamma[1] = static_cast(1. / (g.m_master * g.m_green)); - m_gamma[2] = static_cast(1. / (g.m_master * g.m_blue)); + const GradingRGBM & o = v.m_offset; + const GradingRGBM & l = v.m_lift; + double gain0 = v.m_gain.m_master * v.m_gain.m_red; + double gain1 = v.m_gain.m_master * v.m_gain.m_green; + double gain2 = v.m_gain.m_master * v.m_gain.m_blue; + gain0 = gain0 == 0. ? 1. : gain0; + gain1 = gain1 == 0. ? 1. : gain1; + gain2 = gain2 == 0. ? 1. : gain2; + const GradingRGBM & g = v.m_gamma; + switch (dir) + { + case TRANSFORM_DIR_FORWARD: + { + m_offset[0] = static_cast(o.m_master + o.m_red + l.m_master + l.m_red); + m_offset[1] + = static_cast(o.m_master + o.m_green + l.m_master + l.m_green); + m_offset[2] = static_cast(o.m_master + o.m_blue + l.m_master + l.m_blue); + const double slopeDen0 + = v.m_pivotWhite / gain0 + l.m_master + l.m_red - v.m_pivotBlack; + const double slopeDen1 + = v.m_pivotWhite / gain1 + l.m_master + l.m_green - v.m_pivotBlack; + const double slopeDen2 + = v.m_pivotWhite / gain2 + l.m_master + l.m_blue - v.m_pivotBlack; + m_slope[0] = static_cast( + (v.m_pivotWhite - v.m_pivotBlack) / (slopeDen0 == 0. ? 1. : slopeDen0)); + m_slope[1] = static_cast( + (v.m_pivotWhite - v.m_pivotBlack) / (slopeDen1 == 0. ? 1. : slopeDen1)); + m_slope[2] = static_cast( + (v.m_pivotWhite - v.m_pivotBlack) / (slopeDen2 == 0. ? 1. : slopeDen2)); + m_gamma[0] = static_cast(1. / (g.m_master * g.m_red)); + m_gamma[1] = static_cast(1. / (g.m_master * g.m_green)); + m_gamma[2] = static_cast(1. / (g.m_master * g.m_blue)); + break; + } + case TRANSFORM_DIR_INVERSE: + { + m_offset[0] = -static_cast(o.m_master + o.m_red + l.m_master + l.m_red); + m_offset[1] + = -static_cast(o.m_master + o.m_green + l.m_master + l.m_green); + m_offset[2] + = -static_cast(o.m_master + o.m_blue + l.m_master + l.m_blue); + m_slope[0] = static_cast( + (v.m_pivotWhite / gain0 + (l.m_master + l.m_red - v.m_pivotBlack)) + / (v.m_pivotWhite - v.m_pivotBlack)); + m_slope[1] = static_cast( + (v.m_pivotWhite / gain1 + (l.m_master + l.m_green - v.m_pivotBlack)) + / (v.m_pivotWhite - v.m_pivotBlack)); + m_slope[2] = static_cast( + (v.m_pivotWhite / gain2 + (l.m_master + l.m_blue - v.m_pivotBlack)) + / (v.m_pivotWhite - v.m_pivotBlack)); + m_gamma[0] = static_cast(g.m_master * g.m_red); + m_gamma[1] = static_cast(g.m_master * g.m_green); + m_gamma[2] = static_cast(g.m_master * g.m_blue); + break; + } + } + m_isPowerIdentity = m_gamma[0] == 1.0f && m_gamma[1] == 1.0f && m_gamma[2] == 1.0f; + m_localBypass = m_localBypass && m_isPowerIdentity && m_slope[0] == 1.f + && m_slope[1] == 1.f && m_slope[2] == 1.f && m_offset[0] == 0.f + && m_offset[1] == 0.f && m_offset[2] == 0.f; break; } - case TRANSFORM_DIR_INVERSE: - { - m_offset[0] = -static_cast(o.m_master + o.m_red + l.m_master + l.m_red); - m_offset[1] = -static_cast(o.m_master + o.m_green + l.m_master + l.m_green); - m_offset[2] = -static_cast(o.m_master + o.m_blue + l.m_master + l.m_blue); - m_slope[0] = static_cast((v.m_pivotWhite / gain0 + - (l.m_master + l.m_red - v.m_pivotBlack)) / - (v.m_pivotWhite - v.m_pivotBlack)); - m_slope[1] = static_cast((v.m_pivotWhite / gain1 + - (l.m_master + l.m_green - v.m_pivotBlack)) / - (v.m_pivotWhite - v.m_pivotBlack)); - m_slope[2] = static_cast((v.m_pivotWhite / gain2 + - (l.m_master + l.m_blue - v.m_pivotBlack)) / - (v.m_pivotWhite - v.m_pivotBlack)); - m_gamma[0] = static_cast(g.m_master * g.m_red); - m_gamma[1] = static_cast(g.m_master * g.m_green); - m_gamma[2] = static_cast(g.m_master * g.m_blue); - break; - } - } - m_isPowerIdentity = m_gamma[0] == 1.0f && m_gamma[1] == 1.0f && m_gamma[2] == 1.0f; - m_localBypass = m_localBypass && m_isPowerIdentity && - m_slope[0] == 1.f && m_slope[1] == 1.f && m_slope[2] == 1.f && - m_offset[0] == 0.f && m_offset[1] == 0.f && m_offset[2] == 0.f; - break; - } } } diff --git a/src/OpenColorIO/ops/gradingprimary/GradingPrimary.h b/src/OpenColorIO/ops/gradingprimary/GradingPrimary.h index 405b84d1da..e2d1b5d1bb 100644 --- a/src/OpenColorIO/ops/gradingprimary/GradingPrimary.h +++ b/src/OpenColorIO/ops/gradingprimary/GradingPrimary.h @@ -1,14 +1,11 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_GRADINGPRIMARY_H #define INCLUDED_OCIO_GRADINGPRIMARY_H - #include - namespace OCIO_NAMESPACE { @@ -16,9 +13,9 @@ namespace OCIO_NAMESPACE struct GradingPrimaryPreRender { GradingPrimaryPreRender & operator=(const GradingPrimaryPreRender &) = default; - GradingPrimaryPreRender(const GradingPrimaryPreRender &) = default; + GradingPrimaryPreRender(const GradingPrimaryPreRender &) = default; - GradingPrimaryPreRender() = default; + GradingPrimaryPreRender() = default; ~GradingPrimaryPreRender() = default; void update(GradingStyle style, TransformDirection dir, const GradingPrimary & v) noexcept; @@ -41,25 +38,36 @@ struct GradingPrimaryPreRender const Float3 & getSlope() const { return m_slope; } private: - // Brightness, contrast, gamma // Exposure, contrast, offset // Slope, offset, gamma // Precomputed values are adjusted for the direction. Ex. slope is holding inverse slope // values for the inverse direction. - Float3 m_brightness{ { 0.f, 0.f, 0.f } }; - Float3 m_contrast{ { 0.f, 0.f, 0.f } }; - Float3 m_gamma{ { 0.f, 0.f, 0.f } }; - Float3 m_exposure{ { 0.f, 0.f, 0.f } }; - Float3 m_offset{ { 0.f, 0.f, 0.f } }; - Float3 m_slope{ { 0.f, 0.f, 0.f } }; - - double m_pivot{ 0. }; - - bool m_isPowerIdentity{ false }; - - bool m_localBypass{ false }; + Float3 m_brightness{ + {0.f, 0.f, 0.f} + }; + Float3 m_contrast{ + {0.f, 0.f, 0.f} + }; + Float3 m_gamma{ + {0.f, 0.f, 0.f} + }; + Float3 m_exposure{ + {0.f, 0.f, 0.f} + }; + Float3 m_offset{ + {0.f, 0.f, 0.f} + }; + Float3 m_slope{ + {0.f, 0.f, 0.f} + }; + + double m_pivot{0.}; + + bool m_isPowerIdentity{false}; + + bool m_localBypass{false}; }; } // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/ops/gradingprimary/GradingPrimaryOp.cpp b/src/OpenColorIO/ops/gradingprimary/GradingPrimaryOp.cpp index 5bb2f960bf..24076e93a2 100644 --- a/src/OpenColorIO/ops/gradingprimary/GradingPrimaryOp.cpp +++ b/src/OpenColorIO/ops/gradingprimary/GradingPrimaryOp.cpp @@ -7,9 +7,9 @@ #include #include "GpuShaderUtils.h" +#include "ops/gradingprimary/GradingPrimaryOp.h" #include "ops/gradingprimary/GradingPrimaryOpCPU.h" #include "ops/gradingprimary/GradingPrimaryOpGPU.h" -#include "ops/gradingprimary/GradingPrimaryOp.h" #include "transforms/GradingPrimaryTransform.h" namespace OCIO_NAMESPACE @@ -25,7 +25,7 @@ typedef OCIO_SHARED_PTR ConstGradingPrimaryOpRcPtr; class GradingPrimaryOp : public Op { public: - GradingPrimaryOp() = delete; + GradingPrimaryOp() = delete; GradingPrimaryOp(const GradingPrimaryOp &) = delete; explicit GradingPrimaryOp(GradingPrimaryOpDataRcPtr & prim); @@ -46,8 +46,9 @@ class GradingPrimaryOp : public Op bool isDynamic() const override; bool hasDynamicProperty(DynamicPropertyType type) const override; DynamicPropertyRcPtr getDynamicProperty(DynamicPropertyType type) const override; - void replaceDynamicProperty(DynamicPropertyType type, - DynamicPropertyGradingPrimaryImplRcPtr & prop) override; + void replaceDynamicProperty( + DynamicPropertyType type, + DynamicPropertyGradingPrimaryImplRcPtr & prop) override; void removeDynamicProperties() override; ConstOpCPURcPtr getCPUOp(bool fastLogExpPow) const override; @@ -59,15 +60,11 @@ class GradingPrimaryOp : public Op { return DynamicPtrCast(data()); } - GradingPrimaryOpDataRcPtr primaryData() - { - return DynamicPtrCast(data()); - } + GradingPrimaryOpDataRcPtr primaryData() { return DynamicPtrCast(data()); } }; - GradingPrimaryOp::GradingPrimaryOp(GradingPrimaryOpDataRcPtr & prim) - : Op() + : Op() { data() = prim; } @@ -101,7 +98,8 @@ bool GradingPrimaryOp::isSameType(ConstOpRcPtr & op) const bool GradingPrimaryOp::isInverse(ConstOpRcPtr & op) const { ConstGradingPrimaryOpRcPtr typedRcPtr = DynamicPtrCast(op); - if (!typedRcPtr) return false; + if (!typedRcPtr) + return false; ConstGradingPrimaryOpDataRcPtr primOpData = typedRcPtr->primaryData(); return primaryData()->isInverse(primOpData); @@ -160,8 +158,9 @@ DynamicPropertyRcPtr GradingPrimaryOp::getDynamicProperty(DynamicPropertyType ty return primaryData()->getDynamicProperty(); } -void GradingPrimaryOp::replaceDynamicProperty(DynamicPropertyType type, - DynamicPropertyGradingPrimaryImplRcPtr & prop) +void GradingPrimaryOp::replaceDynamicProperty( + DynamicPropertyType type, + DynamicPropertyGradingPrimaryImplRcPtr & prop) { if (type != DYNAMIC_PROPERTY_GRADING_PRIMARY) { @@ -196,18 +195,14 @@ void GradingPrimaryOp::extractGpuShaderInfo(GpuShaderCreatorRcPtr & shaderCreato GetGradingPrimaryGPUShaderProgram(shaderCreator, data); } - -} // Anon namespace - - - +} // namespace /////////////////////////////////////////////////////////////////////////// - -void CreateGradingPrimaryOp(OpRcPtrVec & ops, - GradingPrimaryOpDataRcPtr & primData, - TransformDirection direction) +void CreateGradingPrimaryOp( + OpRcPtrVec & ops, + GradingPrimaryOpDataRcPtr & primData, + TransformDirection direction) { auto prim = primData; if (direction == TRANSFORM_DIR_INVERSE) @@ -227,19 +222,20 @@ void CreateGradingPrimaryTransform(GroupTransformRcPtr & group, ConstOpRcPtr & o { throw Exception("CreateGradingPrimaryTransform: op has to be a GradingPrimaryOp."); } - auto primData = DynamicPtrCast(op->data()); + auto primData = DynamicPtrCast(op->data()); auto primTransform = GradingPrimaryTransform::Create(primData->getStyle()); - auto & data = dynamic_cast(primTransform.get())->data(); - data = *primData; + auto & data = dynamic_cast(primTransform.get())->data(); + data = *primData; group->appendTransform(primTransform); } -void BuildGradingPrimaryOp(OpRcPtrVec & ops, - const Config & /*config*/, - const ConstContextRcPtr & /*context*/, - const GradingPrimaryTransform & transform, - TransformDirection dir) +void BuildGradingPrimaryOp( + OpRcPtrVec & ops, + const Config & /*config*/, + const ConstContextRcPtr & /*context*/, + const GradingPrimaryTransform & transform, + TransformDirection dir) { const auto & data = dynamic_cast(transform).data(); data.validate(); @@ -248,6 +244,4 @@ void BuildGradingPrimaryOp(OpRcPtrVec & ops, CreateGradingPrimaryOp(ops, primData, dir); } - } // namespace OCIO_NAMESPACE - diff --git a/src/OpenColorIO/ops/gradingprimary/GradingPrimaryOp.h b/src/OpenColorIO/ops/gradingprimary/GradingPrimaryOp.h index fc109559ed..d786129cfa 100644 --- a/src/OpenColorIO/ops/gradingprimary/GradingPrimaryOp.h +++ b/src/OpenColorIO/ops/gradingprimary/GradingPrimaryOp.h @@ -1,11 +1,9 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_GRADINGPRIMARY_OP_H #define INCLUDED_OCIO_GRADINGPRIMARY_OP_H - #include #include @@ -13,13 +11,13 @@ #include "Op.h" #include "ops/gradingprimary/GradingPrimaryOpData.h" - namespace OCIO_NAMESPACE { -void CreateGradingPrimaryOp(OpRcPtrVec & ops, - GradingPrimaryOpDataRcPtr & gpData, - TransformDirection direction); +void CreateGradingPrimaryOp( + OpRcPtrVec & ops, + GradingPrimaryOpDataRcPtr & gpData, + TransformDirection direction); // Create a copy of the primary transform in the op and append it to // the GroupTransform. diff --git a/src/OpenColorIO/ops/gradingprimary/GradingPrimaryOpCPU.cpp b/src/OpenColorIO/ops/gradingprimary/GradingPrimaryOpCPU.cpp index f0e73d648f..59d3e29671 100644 --- a/src/OpenColorIO/ops/gradingprimary/GradingPrimaryOpCPU.cpp +++ b/src/OpenColorIO/ops/gradingprimary/GradingPrimaryOpCPU.cpp @@ -9,8 +9,8 @@ #include "BitDepthUtils.h" #include "MathUtils.h" -#include "ops/gradingprimary/GradingPrimaryOpCPU.h" #include "SSE.h" +#include "ops/gradingprimary/GradingPrimaryOpCPU.h" namespace OCIO_NAMESPACE { @@ -20,7 +20,7 @@ namespace class GradingPrimaryOpCPU : public OpCPU { public: - GradingPrimaryOpCPU() = delete; + GradingPrimaryOpCPU() = delete; GradingPrimaryOpCPU(const GradingPrimaryOpCPU &) = delete; explicit GradingPrimaryOpCPU(ConstGradingPrimaryOpDataRcPtr & gp); @@ -134,22 +134,22 @@ inline void ApplyContrast(__m128 & pix, const __m128 contrast, const __m128 pivo inline void ApplyLinContrast(__m128 & pix, const __m128 contrast, const __m128 pivot) { - pix = _mm_div_ps(pix, pivot); + pix = _mm_div_ps(pix, pivot); __m128 sign_pix = _mm_and_ps(pix, ESIGN_MASK); __m128 abs_pix = _mm_and_ps(pix, EABS_MASK); - pix = _mm_mul_ps(ssePower(abs_pix, contrast), pivot); - pix = _mm_xor_ps(pix, sign_pix); + pix = _mm_mul_ps(ssePower(abs_pix, contrast), pivot); + pix = _mm_xor_ps(pix, sign_pix); } inline void ApplyGamma(__m128 & pix, const __m128 gamma, __m128 blackPivot, __m128 whitePivot) { - pix = _mm_sub_ps(pix, blackPivot); + pix = _mm_sub_ps(pix, blackPivot); __m128 sign_pix = _mm_and_ps(pix, ESIGN_MASK); - __m128 abs_pix = _mm_and_ps(pix, EABS_MASK); - __m128 range = _mm_sub_ps(whitePivot, blackPivot); - pix = _mm_div_ps(abs_pix, range); - pix = ssePower(pix, gamma); - pix = _mm_add_ps(_mm_mul_ps(_mm_xor_ps(pix, sign_pix), range), blackPivot); + __m128 abs_pix = _mm_and_ps(pix, EABS_MASK); + __m128 range = _mm_sub_ps(whitePivot, blackPivot); + pix = _mm_div_ps(abs_pix, range); + pix = ssePower(pix, gamma); + pix = _mm_add_ps(_mm_mul_ps(_mm_xor_ps(pix, sign_pix), range), blackPivot); } static const __m128 LumaWeights = _mm_setr_ps(0.2126f, 0.7152f, 0.0722f, 0.0); @@ -208,12 +208,15 @@ inline void ApplyOffset(float * pix, const float * m_offset) inline void ApplyGamma(float * pix, const float * gamma, float blackPivot, float whitePivot) { - pix[0] = std::pow(std::abs(pix[0] - blackPivot) / (whitePivot - blackPivot), gamma[0]) * - std::copysign(1.f, pix[0] - blackPivot) * (whitePivot - blackPivot) + blackPivot; - pix[1] = std::pow(std::abs(pix[1] - blackPivot) / (whitePivot - blackPivot), gamma[1]) * - std::copysign(1.f, pix[1] - blackPivot) * (whitePivot - blackPivot) + blackPivot; - pix[2] = std::pow(std::abs(pix[2] - blackPivot) / (whitePivot - blackPivot), gamma[2]) * - std::copysign(1.f, pix[2] - blackPivot) * (whitePivot - blackPivot) + blackPivot; + pix[0] = std::pow(std::abs(pix[0] - blackPivot) / (whitePivot - blackPivot), gamma[0]) + * std::copysign(1.f, pix[0] - blackPivot) * (whitePivot - blackPivot) + + blackPivot; + pix[1] = std::pow(std::abs(pix[1] - blackPivot) / (whitePivot - blackPivot), gamma[1]) + * std::copysign(1.f, pix[1] - blackPivot) * (whitePivot - blackPivot) + + blackPivot; + pix[2] = std::pow(std::abs(pix[2] - blackPivot) / (whitePivot - blackPivot), gamma[2]) + * std::copysign(1.f, pix[2] - blackPivot) * (whitePivot - blackPivot) + + blackPivot; } // Apply the saturation component to the the pixel's values. @@ -221,9 +224,9 @@ inline void ApplySaturation(float * pix, const float m_saturation) { if (m_saturation != 1.f) { - const float srcpix[3] = { pix[0], pix[1], pix[2] }; + const float srcpix[3] = {pix[0], pix[1], pix[2]}; - static const float LumaWeights[3] = { 0.2126f, 0.7152f, 0.0722f }; + static const float LumaWeights[3] = {0.2126f, 0.7152f, 0.0722f}; // Compute luma: dot product of pixel values and the luma weights. ApplySlope(pix, LumaWeights); @@ -268,24 +271,24 @@ void GradingPrimaryLogFwdOpCPU::apply(const void * inImg, void * outImg, long nu } const float * in = (float *)inImg; - float * out = (float *)outImg; + float * out = (float *)outImg; - auto & v = m_gp->getValue(); + auto & v = m_gp->getValue(); auto & comp = m_gp->getComputedValue(); const bool isGammaIdentity = comp.isGammaIdentity(); #if OCIO_USE_SSE2 - const __m128 brightness = _mm_set_ps(0.f, comp.getBrightness()[2], - comp.getBrightness()[1], - comp.getBrightness()[0]); - const __m128 contrast = _mm_set_ps(1.f, comp.getContrast()[2], - comp.getContrast()[1], - comp.getContrast()[0]); - const __m128 gamma = _mm_set_ps(1.f, comp.getGamma()[2], - comp.getGamma()[1], - comp.getGamma()[0]); - const __m128 pivot = _mm_set1_ps(static_cast(comp.getPivot())); + const __m128 brightness = _mm_set_ps( + 0.f, + comp.getBrightness()[2], + comp.getBrightness()[1], + comp.getBrightness()[0]); + const __m128 contrast + = _mm_set_ps(1.f, comp.getContrast()[2], comp.getContrast()[1], comp.getContrast()[0]); + const __m128 gamma + = _mm_set_ps(1.f, comp.getGamma()[2], comp.getGamma()[1], comp.getGamma()[0]); + const __m128 pivot = _mm_set1_ps(static_cast(comp.getPivot())); const __m128 saturation = _mm_set1_ps(static_cast(v.m_saturation)); const __m128 blackPivot = _mm_set1_ps(static_cast(v.m_pivotBlack)); const __m128 whitePivot = _mm_set1_ps(static_cast(v.m_pivotWhite)); @@ -299,7 +302,7 @@ void GradingPrimaryLogFwdOpCPU::apply(const void * inImg, void * outImg, long nu for (long idx = 0; idx < numPixels; ++idx) { const float outAlpha = in[3]; - __m128 pixel = _mm_set_ps(in[3], in[2], in[1], in[0]); + __m128 pixel = _mm_set_ps(in[3], in[2], in[1], in[0]); pixel = _mm_add_ps(pixel, brightness); ApplyContrast(pixel, contrast, pivot); @@ -319,7 +322,7 @@ void GradingPrimaryLogFwdOpCPU::apply(const void * inImg, void * outImg, long nu for (long idx = 0; idx < numPixels; ++idx) { const float outAlpha = in[3]; - __m128 pixel = _mm_set_ps(in[3], in[2], in[1], in[0]); + __m128 pixel = _mm_set_ps(in[3], in[2], in[1], in[0]); pixel = _mm_add_ps(pixel, brightness); ApplyContrast(pixel, contrast, pivot); @@ -341,7 +344,7 @@ void GradingPrimaryLogFwdOpCPU::apply(const void * inImg, void * outImg, long nu for (long idx = 0; idx < numPixels; ++idx) { const float outAlpha = in[3]; - __m128 pixel = _mm_set_ps(in[3], in[2], in[1], in[0]); + __m128 pixel = _mm_set_ps(in[3], in[2], in[1], in[0]); pixel = _mm_add_ps(pixel, brightness); ApplyContrast(pixel, contrast, pivot); @@ -360,7 +363,7 @@ void GradingPrimaryLogFwdOpCPU::apply(const void * inImg, void * outImg, long nu for (long idx = 0; idx < numPixels; ++idx) { const float outAlpha = in[3]; - __m128 pixel = _mm_set_ps(in[3], in[2], in[1], in[0]); + __m128 pixel = _mm_set_ps(in[3], in[2], in[1], in[0]); pixel = _mm_add_ps(pixel, brightness); ApplyContrast(pixel, contrast, pivot); @@ -376,15 +379,15 @@ void GradingPrimaryLogFwdOpCPU::apply(const void * inImg, void * outImg, long nu } #else const float * brightness = comp.getBrightness().data(); - const float * contrast = comp.getContrast().data(); - const float * gamma = comp.getGamma().data(); + const float * contrast = comp.getContrast().data(); + const float * gamma = comp.getGamma().data(); const float actualPivot = static_cast(comp.getPivot()); - const float saturation = static_cast(v.m_saturation); - const float pivotBlack = static_cast(v.m_pivotBlack); - const float pivotWhite = static_cast(v.m_pivotWhite); - const float clampBlack = static_cast(v.m_clampBlack); - const float clampWhite = static_cast(v.m_clampWhite); + const float saturation = static_cast(v.m_saturation); + const float pivotBlack = static_cast(v.m_pivotBlack); + const float pivotWhite = static_cast(v.m_pivotWhite); + const float clampBlack = static_cast(v.m_clampBlack); + const float clampWhite = static_cast(v.m_clampWhite); if (!isGammaIdentity) { for (long idx = 0; idx < numPixels; ++idx) @@ -427,7 +430,7 @@ void GradingPrimaryLogFwdOpCPU::apply(const void * inImg, void * outImg, long nu out += 4; } } -#endif // OCIO_USE_SSE2 +#endif // OCIO_USE_SSE2 } GradingPrimaryLogRevOpCPU::GradingPrimaryLogRevOpCPU(ConstGradingPrimaryOpDataRcPtr & gp) @@ -447,28 +450,28 @@ void GradingPrimaryLogRevOpCPU::apply(const void * inImg, void * outImg, long nu } const float * in = (float *)inImg; - float * out = (float *)outImg; + float * out = (float *)outImg; - auto & v = m_gp->getValue(); + auto & v = m_gp->getValue(); auto & comp = m_gp->getComputedValue(); const bool isGammaIdentity = comp.isGammaIdentity(); #if OCIO_USE_SSE2 - const __m128 brightnessInv = _mm_set_ps(0.f, comp.getBrightness()[2], - comp.getBrightness()[1], - comp.getBrightness()[0]); - const __m128 contrastInv = _mm_set_ps(1.f, comp.getContrast()[2], - comp.getContrast()[1], - comp.getContrast()[0]); - const __m128 gammaInv = _mm_set_ps(1.f, comp.getGamma()[2], - comp.getGamma()[1], - comp.getGamma()[0]); + const __m128 brightnessInv = _mm_set_ps( + 0.f, + comp.getBrightness()[2], + comp.getBrightness()[1], + comp.getBrightness()[0]); + const __m128 contrastInv + = _mm_set_ps(1.f, comp.getContrast()[2], comp.getContrast()[1], comp.getContrast()[0]); + const __m128 gammaInv + = _mm_set_ps(1.f, comp.getGamma()[2], comp.getGamma()[1], comp.getGamma()[0]); const __m128 pivotBlack = _mm_set1_ps(static_cast(v.m_pivotBlack)); const __m128 pivotWhite = _mm_set1_ps(static_cast(v.m_pivotWhite)); - const __m128 clampB = _mm_set1_ps(static_cast(v.m_clampBlack)); - const __m128 clampW = _mm_set1_ps(static_cast(v.m_clampWhite)); + const __m128 clampB = _mm_set1_ps(static_cast(v.m_clampBlack)); + const __m128 clampW = _mm_set1_ps(static_cast(v.m_clampWhite)); const __m128 actualPivot = _mm_set1_ps(static_cast(comp.getPivot())); @@ -480,7 +483,7 @@ void GradingPrimaryLogRevOpCPU::apply(const void * inImg, void * outImg, long nu for (long idx = 0; idx < numPixels; ++idx) { const float outAlpha = in[3]; - __m128 pixel = _mm_set_ps(in[3], in[2], in[1], in[0]); + __m128 pixel = _mm_set_ps(in[3], in[2], in[1], in[0]); ApplyClamp(pixel, clampB, clampW); ApplySaturation(pixel, satInv); @@ -500,7 +503,7 @@ void GradingPrimaryLogRevOpCPU::apply(const void * inImg, void * outImg, long nu for (long idx = 0; idx < numPixels; ++idx) { const float outAlpha = in[3]; - __m128 pixel = _mm_set_ps(in[3], in[2], in[1], in[0]); + __m128 pixel = _mm_set_ps(in[3], in[2], in[1], in[0]); ApplyClamp(pixel, clampB, clampW); ApplySaturation(pixel, satInv); @@ -522,7 +525,7 @@ void GradingPrimaryLogRevOpCPU::apply(const void * inImg, void * outImg, long nu for (long idx = 0; idx < numPixels; ++idx) { const float outAlpha = in[3]; - __m128 pixel = _mm_set_ps(in[3], in[2], in[1], in[0]); + __m128 pixel = _mm_set_ps(in[3], in[2], in[1], in[0]); ApplyClamp(pixel, clampB, clampW); ApplyGamma(pixel, gammaInv, pivotBlack, pivotWhite); @@ -541,7 +544,7 @@ void GradingPrimaryLogRevOpCPU::apply(const void * inImg, void * outImg, long nu for (long idx = 0; idx < numPixels; ++idx) { const float outAlpha = in[3]; - __m128 pixel = _mm_set_ps(in[3], in[2], in[1], in[0]); + __m128 pixel = _mm_set_ps(in[3], in[2], in[1], in[0]); ApplyClamp(pixel, clampB, clampW); ApplyContrast(pixel, contrastInv, actualPivot); @@ -558,8 +561,8 @@ void GradingPrimaryLogRevOpCPU::apply(const void * inImg, void * outImg, long nu #else const float * brightnessInv = comp.getBrightness().data(); - const float * contrastInv = comp.getContrast().data(); - const float * gammaInv = comp.getGamma().data(); + const float * contrastInv = comp.getContrast().data(); + const float * gammaInv = comp.getGamma().data(); const float pivotBlack = static_cast(v.m_pivotBlack); const float pivotWhite = static_cast(v.m_pivotWhite); @@ -567,8 +570,8 @@ void GradingPrimaryLogRevOpCPU::apply(const void * inImg, void * outImg, long nu const float clampWhite = static_cast(v.m_clampWhite); const float actualPivot = static_cast(comp.getPivot()); - const float sat = static_cast(v.m_saturation); - const float satInv = 1.f / (sat != 0.f ? sat : 1.f); + const float sat = static_cast(v.m_saturation); + const float satInv = 1.f / (sat != 0.f ? sat : 1.f); if (!isGammaIdentity) { @@ -621,27 +624,24 @@ void GradingPrimaryLinFwdOpCPU::apply(const void * inImg, void * outImg, long nu } const float * in = (float *)inImg; - float * out = (float *)outImg; + float * out = (float *)outImg; - auto & v = m_gp->getValue(); + auto & v = m_gp->getValue(); auto & comp = m_gp->getComputedValue(); const bool isContrastIdentity = comp.isContrastIdentity(); #if OCIO_USE_SSE2 - const __m128 offset = _mm_set_ps(0.f, comp.getOffset()[2], - comp.getOffset()[1], - comp.getOffset()[0]); - const __m128 exposure = _mm_set_ps(1.f, comp.getExposure()[2], - comp.getExposure()[1], - comp.getExposure()[0]); - const __m128 contrast = _mm_set_ps(1.f, comp.getContrast()[2], - comp.getContrast()[1], - comp.getContrast()[0]); - const __m128 pivot = _mm_set1_ps(static_cast(comp.getPivot())); + const __m128 offset + = _mm_set_ps(0.f, comp.getOffset()[2], comp.getOffset()[1], comp.getOffset()[0]); + const __m128 exposure + = _mm_set_ps(1.f, comp.getExposure()[2], comp.getExposure()[1], comp.getExposure()[0]); + const __m128 contrast + = _mm_set_ps(1.f, comp.getContrast()[2], comp.getContrast()[1], comp.getContrast()[0]); + const __m128 pivot = _mm_set1_ps(static_cast(comp.getPivot())); const __m128 saturation = _mm_set1_ps(static_cast(v.m_saturation)); - const __m128 clampB = _mm_set1_ps(static_cast(v.m_clampBlack)); - const __m128 clampW = _mm_set1_ps(static_cast(v.m_clampWhite)); + const __m128 clampB = _mm_set1_ps(static_cast(v.m_clampBlack)); + const __m128 clampW = _mm_set1_ps(static_cast(v.m_clampWhite)); if (v.m_saturation != 1.0) { @@ -650,7 +650,7 @@ void GradingPrimaryLinFwdOpCPU::apply(const void * inImg, void * outImg, long nu for (long idx = 0; idx < numPixels; ++idx) { const float outAlpha = in[3]; - __m128 pixel = _mm_set_ps(in[3], in[2], in[1], in[0]); + __m128 pixel = _mm_set_ps(in[3], in[2], in[1], in[0]); pixel = _mm_add_ps(pixel, offset); pixel = _mm_mul_ps(pixel, exposure); @@ -670,7 +670,7 @@ void GradingPrimaryLinFwdOpCPU::apply(const void * inImg, void * outImg, long nu for (long idx = 0; idx < numPixels; ++idx) { const float outAlpha = in[3]; - __m128 pixel = _mm_set_ps(in[3], in[2], in[1], in[0]); + __m128 pixel = _mm_set_ps(in[3], in[2], in[1], in[0]); pixel = _mm_add_ps(pixel, offset); pixel = _mm_mul_ps(pixel, exposure); @@ -692,7 +692,7 @@ void GradingPrimaryLinFwdOpCPU::apply(const void * inImg, void * outImg, long nu for (long idx = 0; idx < numPixels; ++idx) { const float outAlpha = in[3]; - __m128 pixel = _mm_set_ps(in[3], in[2], in[1], in[0]); + __m128 pixel = _mm_set_ps(in[3], in[2], in[1], in[0]); pixel = _mm_add_ps(pixel, offset); pixel = _mm_mul_ps(pixel, exposure); @@ -711,7 +711,7 @@ void GradingPrimaryLinFwdOpCPU::apply(const void * inImg, void * outImg, long nu for (long idx = 0; idx < numPixels; ++idx) { const float outAlpha = in[3]; - __m128 pixel = _mm_set_ps(in[3], in[2], in[1], in[0]); + __m128 pixel = _mm_set_ps(in[3], in[2], in[1], in[0]); pixel = _mm_add_ps(pixel, offset); pixel = _mm_mul_ps(pixel, exposure); @@ -795,24 +795,21 @@ void GradingPrimaryLinRevOpCPU::apply(const void * inImg, void * outImg, long nu } const float * in = (float *)inImg; - float * out = (float *)outImg; + float * out = (float *)outImg; - auto & v = m_gp->getValue(); + auto & v = m_gp->getValue(); auto & comp = m_gp->getComputedValue(); const bool isContrastIdentity = comp.isContrastIdentity(); #if OCIO_USE_SSE2 - const __m128 offsetInv = _mm_set_ps(0.f, comp.getOffset()[2], - comp.getOffset()[1], - comp.getOffset()[0]); - const __m128 exposureInv = _mm_set_ps(1.f, comp.getExposure()[2], - comp.getExposure()[1], - comp.getExposure()[0]); - const __m128 contrastInv = _mm_set_ps(1.f, comp.getContrast()[2], - comp.getContrast()[1], - comp.getContrast()[0]); - const __m128 pivot = _mm_set1_ps(static_cast(comp.getPivot())); + const __m128 offsetInv + = _mm_set_ps(0.f, comp.getOffset()[2], comp.getOffset()[1], comp.getOffset()[0]); + const __m128 exposureInv + = _mm_set_ps(1.f, comp.getExposure()[2], comp.getExposure()[1], comp.getExposure()[0]); + const __m128 contrastInv + = _mm_set_ps(1.f, comp.getContrast()[2], comp.getContrast()[1], comp.getContrast()[0]); + const __m128 pivot = _mm_set1_ps(static_cast(comp.getPivot())); const __m128 clampB = _mm_set1_ps(static_cast(v.m_clampBlack)); const __m128 clampW = _mm_set1_ps(static_cast(v.m_clampWhite)); @@ -824,7 +821,7 @@ void GradingPrimaryLinRevOpCPU::apply(const void * inImg, void * outImg, long nu for (long idx = 0; idx < numPixels; ++idx) { const float outAlpha = in[3]; - __m128 pixel = _mm_set_ps(in[3], in[2], in[1], in[0]); + __m128 pixel = _mm_set_ps(in[3], in[2], in[1], in[0]); ApplyClamp(pixel, clampB, clampW); ApplySaturation(pixel, satInv); @@ -844,7 +841,7 @@ void GradingPrimaryLinRevOpCPU::apply(const void * inImg, void * outImg, long nu for (long idx = 0; idx < numPixels; ++idx) { const float outAlpha = in[3]; - __m128 pixel = _mm_set_ps(in[3], in[2], in[1], in[0]); + __m128 pixel = _mm_set_ps(in[3], in[2], in[1], in[0]); ApplyClamp(pixel, clampB, clampW); ApplySaturation(pixel, satInv); @@ -866,7 +863,7 @@ void GradingPrimaryLinRevOpCPU::apply(const void * inImg, void * outImg, long nu for (long idx = 0; idx < numPixels; ++idx) { const float outAlpha = in[3]; - __m128 pixel = _mm_set_ps(in[3], in[2], in[1], in[0]); + __m128 pixel = _mm_set_ps(in[3], in[2], in[1], in[0]); ApplyClamp(pixel, clampB, clampW); ApplyLinContrast(pixel, contrastInv, pivot); @@ -885,7 +882,7 @@ void GradingPrimaryLinRevOpCPU::apply(const void * inImg, void * outImg, long nu for (long idx = 0; idx < numPixels; ++idx) { const float outAlpha = in[3]; - __m128 pixel = _mm_set_ps(in[3], in[2], in[1], in[0]); + __m128 pixel = _mm_set_ps(in[3], in[2], in[1], in[0]); ApplyClamp(pixel, clampB, clampW); ApplyLinContrast(pixel, contrastInv, pivot); @@ -906,10 +903,10 @@ void GradingPrimaryLinRevOpCPU::apply(const void * inImg, void * outImg, long nu const float * contrastInv = comp.getContrast().data(); const float actualPivot = static_cast(comp.getPivot()); - const float sat = static_cast(v.m_saturation); - const float satInv = 1.f / (sat != 0.f ? sat : 1.f); - const float clampBlack = static_cast(v.m_clampBlack); - const float clampWhite = static_cast(v.m_clampWhite); + const float sat = static_cast(v.m_saturation); + const float satInv = 1.f / (sat != 0.f ? sat : 1.f); + const float clampBlack = static_cast(v.m_clampBlack); + const float clampWhite = static_cast(v.m_clampWhite); if (!isContrastIdentity) { @@ -963,29 +960,26 @@ void GradingPrimaryVidFwdOpCPU::apply(const void * inImg, void * outImg, long nu } const float * in = (float *)inImg; - float * out = (float *)outImg; + float * out = (float *)outImg; - auto & v = m_gp->getValue(); + auto & v = m_gp->getValue(); auto & comp = m_gp->getComputedValue(); const bool isGammaIdentity = comp.isGammaIdentity(); #if OCIO_USE_SSE2 - const __m128 offset = _mm_set_ps(0.f, comp.getOffset()[2], - comp.getOffset()[1], - comp.getOffset()[0]); - const __m128 slope = _mm_set_ps(1.f, comp.getSlope()[2], - comp.getSlope()[1], - comp.getSlope()[0]); - const __m128 gamma = _mm_set_ps(1.f, comp.getGamma()[2], - comp.getGamma()[1], - comp.getGamma()[0]); + const __m128 offset + = _mm_set_ps(0.f, comp.getOffset()[2], comp.getOffset()[1], comp.getOffset()[0]); + const __m128 slope + = _mm_set_ps(1.f, comp.getSlope()[2], comp.getSlope()[1], comp.getSlope()[0]); + const __m128 gamma + = _mm_set_ps(1.f, comp.getGamma()[2], comp.getGamma()[1], comp.getGamma()[0]); const __m128 saturation = _mm_set1_ps(static_cast(v.m_saturation)); const __m128 pivotBlack = _mm_set1_ps(static_cast(v.m_pivotBlack)); const __m128 pivotWhite = _mm_set1_ps(static_cast(v.m_pivotWhite)); - const __m128 clampB = _mm_set1_ps(static_cast(v.m_clampBlack)); - const __m128 clampW = _mm_set1_ps(static_cast(v.m_clampWhite)); + const __m128 clampB = _mm_set1_ps(static_cast(v.m_clampBlack)); + const __m128 clampW = _mm_set1_ps(static_cast(v.m_clampWhite)); if (v.m_saturation != 1.0) { @@ -994,7 +988,7 @@ void GradingPrimaryVidFwdOpCPU::apply(const void * inImg, void * outImg, long nu for (long idx = 0; idx < numPixels; ++idx) { const float outAlpha = in[3]; - __m128 pixel = _mm_set_ps(in[3], in[2], in[1], in[0]); + __m128 pixel = _mm_set_ps(in[3], in[2], in[1], in[0]); pixel = _mm_add_ps(pixel, offset); ApplyContrast(pixel, slope, pivotBlack); @@ -1014,7 +1008,7 @@ void GradingPrimaryVidFwdOpCPU::apply(const void * inImg, void * outImg, long nu for (long idx = 0; idx < numPixels; ++idx) { const float outAlpha = in[3]; - __m128 pixel = _mm_set_ps(in[3], in[2], in[1], in[0]); + __m128 pixel = _mm_set_ps(in[3], in[2], in[1], in[0]); pixel = _mm_add_ps(pixel, offset); ApplyContrast(pixel, slope, pivotBlack); @@ -1036,7 +1030,7 @@ void GradingPrimaryVidFwdOpCPU::apply(const void * inImg, void * outImg, long nu for (long idx = 0; idx < numPixels; ++idx) { const float outAlpha = in[3]; - __m128 pixel = _mm_set_ps(in[3], in[2], in[1], in[0]); + __m128 pixel = _mm_set_ps(in[3], in[2], in[1], in[0]); pixel = _mm_add_ps(pixel, offset); ApplyContrast(pixel, slope, pivotBlack); @@ -1055,7 +1049,7 @@ void GradingPrimaryVidFwdOpCPU::apply(const void * inImg, void * outImg, long nu for (long idx = 0; idx < numPixels; ++idx) { const float outAlpha = in[3]; - __m128 pixel = _mm_set_ps(in[3], in[2], in[1], in[0]); + __m128 pixel = _mm_set_ps(in[3], in[2], in[1], in[0]); pixel = _mm_add_ps(pixel, offset); ApplyContrast(pixel, slope, pivotBlack); @@ -1143,28 +1137,25 @@ void GradingPrimaryVidRevOpCPU::apply(const void * inImg, void * outImg, long nu } const float * in = (float *)inImg; - float * out = (float *)outImg; + float * out = (float *)outImg; - auto & v = m_gp->getValue(); + auto & v = m_gp->getValue(); auto & comp = m_gp->getComputedValue(); const bool isGammaIdentity = comp.isGammaIdentity(); #if OCIO_USE_SSE2 - const __m128 offsetInv = _mm_set_ps(0.f, comp.getOffset()[2], - comp.getOffset()[1], - comp.getOffset()[0]); - const __m128 slopeInv = _mm_set_ps(1.f, comp.getSlope()[2], - comp.getSlope()[1], - comp.getSlope()[0]); - const __m128 gammaInv = _mm_set_ps(1.f, comp.getGamma()[2], - comp.getGamma()[1], - comp.getGamma()[0]); + const __m128 offsetInv + = _mm_set_ps(0.f, comp.getOffset()[2], comp.getOffset()[1], comp.getOffset()[0]); + const __m128 slopeInv + = _mm_set_ps(1.f, comp.getSlope()[2], comp.getSlope()[1], comp.getSlope()[0]); + const __m128 gammaInv + = _mm_set_ps(1.f, comp.getGamma()[2], comp.getGamma()[1], comp.getGamma()[0]); const __m128 pivotBlack = _mm_set1_ps(static_cast(v.m_pivotBlack)); const __m128 pivotWhite = _mm_set1_ps(static_cast(v.m_pivotWhite)); - const __m128 clampB = _mm_set1_ps(static_cast(v.m_clampBlack)); - const __m128 clampW = _mm_set1_ps(static_cast(v.m_clampWhite)); + const __m128 clampB = _mm_set1_ps(static_cast(v.m_clampBlack)); + const __m128 clampW = _mm_set1_ps(static_cast(v.m_clampWhite)); if (v.m_saturation != 1. && v.m_saturation != 0.) { @@ -1174,7 +1165,7 @@ void GradingPrimaryVidRevOpCPU::apply(const void * inImg, void * outImg, long nu for (long idx = 0; idx < numPixels; ++idx) { const float outAlpha = in[3]; - __m128 pixel = _mm_set_ps(in[3], in[2], in[1], in[0]); + __m128 pixel = _mm_set_ps(in[3], in[2], in[1], in[0]); ApplyClamp(pixel, clampB, clampW); ApplySaturation(pixel, satInv); @@ -1194,7 +1185,7 @@ void GradingPrimaryVidRevOpCPU::apply(const void * inImg, void * outImg, long nu for (long idx = 0; idx < numPixels; ++idx) { const float outAlpha = in[3]; - __m128 pixel = _mm_set_ps(in[3], in[2], in[1], in[0]); + __m128 pixel = _mm_set_ps(in[3], in[2], in[1], in[0]); ApplyClamp(pixel, clampB, clampW); ApplySaturation(pixel, satInv); @@ -1216,7 +1207,7 @@ void GradingPrimaryVidRevOpCPU::apply(const void * inImg, void * outImg, long nu for (long idx = 0; idx < numPixels; ++idx) { const float outAlpha = in[3]; - __m128 pixel = _mm_set_ps(in[3], in[2], in[1], in[0]); + __m128 pixel = _mm_set_ps(in[3], in[2], in[1], in[0]); ApplyClamp(pixel, clampB, clampW); ApplyGamma(pixel, gammaInv, pivotBlack, pivotWhite); @@ -1235,7 +1226,7 @@ void GradingPrimaryVidRevOpCPU::apply(const void * inImg, void * outImg, long nu for (long idx = 0; idx < numPixels; ++idx) { const float outAlpha = in[3]; - __m128 pixel = _mm_set_ps(in[3], in[2], in[1], in[0]); + __m128 pixel = _mm_set_ps(in[3], in[2], in[1], in[0]); ApplyClamp(pixel, clampB, clampW); ApplyContrast(pixel, slopeInv, pivotBlack); @@ -1258,8 +1249,8 @@ void GradingPrimaryVidRevOpCPU::apply(const void * inImg, void * outImg, long nu const float pivotWhite = static_cast(v.m_pivotWhite); const float clampBlack = static_cast(v.m_clampBlack); const float clampWhite = static_cast(v.m_clampWhite); - const float sat = static_cast(v.m_saturation); - const float satInv = 1.f / (sat != 0.f ? sat : 1.f); + const float sat = static_cast(v.m_saturation); + const float satInv = 1.f / (sat != 0.f ? sat : 1.f); if (!isGammaIdentity) { @@ -1293,7 +1284,7 @@ void GradingPrimaryVidRevOpCPU::apply(const void * inImg, void * outImg, long nu out += 4; } } -#endif // OCIO_USE_SSE2 +#endif // OCIO_USE_SSE2 } } // Anonymous namespace @@ -1305,30 +1296,30 @@ ConstOpCPURcPtr GetGradingPrimaryCPURenderer(ConstGradingPrimaryOpDataRcPtr & pr { switch (prim->getStyle()) { - case GRADING_LOG: - return std::make_shared(prim); - break; - case GRADING_LIN: - return std::make_shared(prim); - break; - case GRADING_VIDEO: - return std::make_shared(prim); - break; + case GRADING_LOG: + return std::make_shared(prim); + break; + case GRADING_LIN: + return std::make_shared(prim); + break; + case GRADING_VIDEO: + return std::make_shared(prim); + break; } } else if (prim->getDirection() == TRANSFORM_DIR_INVERSE) { switch (prim->getStyle()) { - case GRADING_LOG: - return std::make_shared(prim); - break; - case GRADING_LIN: - return std::make_shared(prim); - break; - case GRADING_VIDEO: - return std::make_shared(prim); - break; + case GRADING_LOG: + return std::make_shared(prim); + break; + case GRADING_LIN: + return std::make_shared(prim); + break; + case GRADING_VIDEO: + return std::make_shared(prim); + break; } } diff --git a/src/OpenColorIO/ops/gradingprimary/GradingPrimaryOpData.cpp b/src/OpenColorIO/ops/gradingprimary/GradingPrimaryOpData.cpp index d6612195de..1738962465 100644 --- a/src/OpenColorIO/ops/gradingprimary/GradingPrimaryOpData.cpp +++ b/src/OpenColorIO/ops/gradingprimary/GradingPrimaryOpData.cpp @@ -5,9 +5,9 @@ #include +#include "Platform.h" #include "ops/gradingprimary/GradingPrimaryOpData.h" #include "ops/range/RangeOpData.h" -#include "Platform.h" namespace OCIO_NAMESPACE { @@ -20,31 +20,34 @@ const std::streamsize FLOAT_DECIMALS = 7; GradingPrimaryOpData::GradingPrimaryOpData(GradingStyle style) : OpData() , m_style(style) - , m_value(std::make_shared(style, - TRANSFORM_DIR_FORWARD, - GradingPrimary(style), - false)) + , m_value(std::make_shared( + style, + TRANSFORM_DIR_FORWARD, + GradingPrimary(style), + false)) { } GradingPrimaryOpData::GradingPrimaryOpData(const GradingPrimaryOpData & rhs) : OpData(rhs) , m_style(rhs.m_style) - , m_value(std::make_shared(rhs.m_style, - TRANSFORM_DIR_FORWARD, - GradingPrimary(rhs.m_style), - false)) + , m_value(std::make_shared( + rhs.m_style, + TRANSFORM_DIR_FORWARD, + GradingPrimary(rhs.m_style), + false)) { *this = rhs; } GradingPrimaryOpData & GradingPrimaryOpData::operator=(const GradingPrimaryOpData & rhs) { - if (this == &rhs) return *this; + if (this == &rhs) + return *this; OpData::operator=(rhs); - m_style = rhs.m_style; + m_style = rhs.m_style; // Copy dynamic properties. Sharing happens when needed, with CPUop for instance. m_value->setDirection(rhs.m_value->getDirection()); @@ -79,47 +82,48 @@ bool GradingPrimaryOpData::isNoOp() const bool GradingPrimaryOpData::isIdentity() const { - if (isDynamic()) return false; + if (isDynamic()) + return false; - const GradingPrimary defaultValues{ m_style }; + const GradingPrimary defaultValues{m_style}; auto & values = m_value->getValue(); - if (defaultValues.m_saturation == values.m_saturation && - defaultValues.m_clampBlack == values.m_clampBlack && - defaultValues.m_clampWhite == values.m_clampWhite) + if (defaultValues.m_saturation == values.m_saturation + && defaultValues.m_clampBlack == values.m_clampBlack + && defaultValues.m_clampWhite == values.m_clampWhite) { switch (m_style) { - case GRADING_LOG: - if (defaultValues.m_pivotBlack == values.m_pivotBlack && - defaultValues.m_pivotWhite == values.m_pivotWhite && - defaultValues.m_brightness == values.m_brightness && - defaultValues.m_contrast == values.m_contrast && - defaultValues.m_gamma == values.m_gamma) - { - // Pivot value can be ignored if other values are identity. - return true; - } - break; - case GRADING_LIN: - if (defaultValues.m_contrast == values.m_contrast && - defaultValues.m_offset == values.m_offset && - defaultValues.m_exposure == values.m_exposure) - { - // Pivot value can be ignored if other values are identity. - return true; - } - break; - case GRADING_VIDEO: - if (defaultValues.m_gamma == values.m_gamma && - defaultValues.m_offset == values.m_offset && - defaultValues.m_lift == values.m_lift && - defaultValues.m_gain == values.m_gain) - { - // PivotBlack/White value can be ignored if other values are identity. - return true; - } - break; + case GRADING_LOG: + if (defaultValues.m_pivotBlack == values.m_pivotBlack + && defaultValues.m_pivotWhite == values.m_pivotWhite + && defaultValues.m_brightness == values.m_brightness + && defaultValues.m_contrast == values.m_contrast + && defaultValues.m_gamma == values.m_gamma) + { + // Pivot value can be ignored if other values are identity. + return true; + } + break; + case GRADING_LIN: + if (defaultValues.m_contrast == values.m_contrast + && defaultValues.m_offset == values.m_offset + && defaultValues.m_exposure == values.m_exposure) + { + // Pivot value can be ignored if other values are identity. + return true; + } + break; + case GRADING_VIDEO: + if (defaultValues.m_gamma == values.m_gamma + && defaultValues.m_offset == values.m_offset + && defaultValues.m_lift == values.m_lift + && defaultValues.m_gain == values.m_gain) + { + // PivotBlack/White value can be ignored if other values are identity. + return true; + } + break; } } return false; @@ -127,10 +131,10 @@ bool GradingPrimaryOpData::isIdentity() const OpDataRcPtr GradingPrimaryOpData::getIdentityReplacement() const { - auto & values = m_value->getValue(); + auto & values = m_value->getValue(); double clampLow = values.m_clampBlack; - bool lowEmpty = false; - bool highEmpty = false; + bool lowEmpty = false; + bool highEmpty = false; if (clampLow == GradingPrimary::NoClampBlack()) { clampLow = RangeOpData::EmptyValue(); @@ -147,10 +151,7 @@ OpDataRcPtr GradingPrimaryOpData::getIdentityReplacement() const { return std::make_shared(); } - return std::make_shared(clampLow, - clampHigh, - clampLow, - clampHigh); + return std::make_shared(clampLow, clampHigh, clampLow, clampHigh); } bool GradingPrimaryOpData::hasChannelCrosstalk() const @@ -178,7 +179,7 @@ bool GradingPrimaryOpData::isInverse(ConstGradingPrimaryOpDataRcPtr & r) const GradingPrimaryOpDataRcPtr GradingPrimaryOpData::inverse() const { - auto res = clone(); + auto res = clone(); const auto newDir = GetInverseTransformDirection(getDirection()); res->m_value->setDirection(newDir); return res; @@ -236,7 +237,8 @@ DynamicPropertyRcPtr GradingPrimaryOpData::getDynamicProperty() const noexcept return m_value; } -void GradingPrimaryOpData::replaceDynamicProperty(DynamicPropertyGradingPrimaryImplRcPtr prop) noexcept +void GradingPrimaryOpData::replaceDynamicProperty( + DynamicPropertyGradingPrimaryImplRcPtr prop) noexcept { m_value = prop; } @@ -248,13 +250,13 @@ void GradingPrimaryOpData::removeDynamicProperty() noexcept bool GradingPrimaryOpData::equals(const OpData & other) const { - if (!OpData::equals(other)) return false; + if (!OpData::equals(other)) + return false; - const GradingPrimaryOpData* rop = static_cast(&other); + const GradingPrimaryOpData * rop = static_cast(&other); - if (m_style != rop->m_style || - m_value->getDirection() != rop->getDirection() || - !m_value->equals( *(rop->m_value) )) + if (m_style != rop->m_style || m_value->getDirection() != rop->getDirection() + || !m_value->equals(*(rop->m_value))) { return false; } diff --git a/src/OpenColorIO/ops/gradingprimary/GradingPrimaryOpData.h b/src/OpenColorIO/ops/gradingprimary/GradingPrimaryOpData.h index 5706569aab..1ef91750ab 100644 --- a/src/OpenColorIO/ops/gradingprimary/GradingPrimaryOpData.h +++ b/src/OpenColorIO/ops/gradingprimary/GradingPrimaryOpData.h @@ -1,16 +1,13 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_GRADINGPRIMARY_OPDATA_H #define INCLUDED_OCIO_GRADINGPRIMARY_OPDATA_H - #include #include "Op.h" - namespace OCIO_NAMESPACE { @@ -18,11 +15,9 @@ class GradingPrimaryOpData; typedef OCIO_SHARED_PTR GradingPrimaryOpDataRcPtr; typedef OCIO_SHARED_PTR ConstGradingPrimaryOpDataRcPtr; - class GradingPrimaryOpData : public OpData { public: - explicit GradingPrimaryOpData(GradingStyle style); GradingPrimaryOpData() = delete; GradingPrimaryOpData(const GradingPrimaryOpData & rhs); @@ -68,7 +63,7 @@ class GradingPrimaryOpData : public OpData bool equals(const OpData & other) const override; private: - GradingStyle m_style; + GradingStyle m_style; DynamicPropertyGradingPrimaryImplRcPtr m_value; }; diff --git a/src/OpenColorIO/ops/gradingprimary/GradingPrimaryOpGPU.cpp b/src/OpenColorIO/ops/gradingprimary/GradingPrimaryOpGPU.cpp index 8e83ba45ed..672545d59f 100644 --- a/src/OpenColorIO/ops/gradingprimary/GradingPrimaryOpGPU.cpp +++ b/src/OpenColorIO/ops/gradingprimary/GradingPrimaryOpGPU.cpp @@ -1,13 +1,11 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #include #include "Logging.h" #include "ops/gradingprimary/GradingPrimaryOpGPU.h" - namespace OCIO_NAMESPACE { namespace @@ -15,26 +13,27 @@ namespace struct GPProperties { - std::string brightness{ "brightness" }; - std::string contrast{ "contrast" }; - std::string gamma{ "gamma" }; - std::string exposure{ "exposure" }; - std::string offset{ "offset" }; - std::string slope{ "slope" }; - - std::string pivot{ "pivot" }; - std::string pivotBlack{ "pivotBlack" }; - std::string pivotWhite{ "pivotWhite" }; - std::string clampBlack{ "clampBlack" }; - std::string clampWhite{ "clampWhite" }; - std::string saturation{ "saturation" }; - - std::string localBypass{ "localBypass" }; + std::string brightness{"brightness"}; + std::string contrast{"contrast"}; + std::string gamma{"gamma"}; + std::string exposure{"exposure"}; + std::string offset{"offset"}; + std::string slope{"slope"}; + + std::string pivot{"pivot"}; + std::string pivotBlack{"pivotBlack"}; + std::string pivotWhite{"pivotWhite"}; + std::string clampBlack{"clampBlack"}; + std::string clampWhite{"clampWhite"}; + std::string saturation{"saturation"}; + + std::string localBypass{"localBypass"}; }; -void AddUniform(GpuShaderCreatorRcPtr & shaderCreator, - const GpuShaderCreator::DoubleGetter & getter, - const std::string & name) +void AddUniform( + GpuShaderCreatorRcPtr & shaderCreator, + const GpuShaderCreator::DoubleGetter & getter, + const std::string & name) { // Add the uniform if it does not already exist. if (shaderCreator->addUniform(name.c_str(), getter)) @@ -46,9 +45,10 @@ void AddUniform(GpuShaderCreatorRcPtr & shaderCreator, } } -void AddBoolUniform(GpuShaderCreatorRcPtr & shaderCreator, - const GpuShaderCreator::BoolGetter & getBool, - const std::string & name) +void AddBoolUniform( + GpuShaderCreatorRcPtr & shaderCreator, + const GpuShaderCreator::BoolGetter & getBool, + const std::string & name) { // Add the uniform if it does not already exist. if (shaderCreator->addUniform(name.c_str(), getBool)) @@ -60,9 +60,10 @@ void AddBoolUniform(GpuShaderCreatorRcPtr & shaderCreator, } } -void AddUniform(GpuShaderCreatorRcPtr & shaderCreator, - const GpuShaderCreator::Float3Getter & getter, - const std::string & name) +void AddUniform( + GpuShaderCreatorRcPtr & shaderCreator, + const GpuShaderCreator::Float3Getter & getter, + const std::string & name) { // Add the uniform if it does not already exist. if (shaderCreator->addUniform(name.c_str(), getter)) @@ -76,11 +77,12 @@ void AddUniform(GpuShaderCreatorRcPtr & shaderCreator, static constexpr char opPrefix[] = "grading_primary"; -void AddGPLogProperties(GpuShaderCreatorRcPtr & shaderCreator, - GpuShaderText & st, - ConstGradingPrimaryOpDataRcPtr & gpData, - GPProperties & propNames, - bool dyn) +void AddGPLogProperties( + GpuShaderCreatorRcPtr & shaderCreator, + GpuShaderText & st, + ConstGradingPrimaryOpDataRcPtr & gpData, + GPProperties & propNames, + bool dyn) { auto prop = gpData->getDynamicPropertyInternal(); if (dyn) @@ -89,10 +91,10 @@ void AddGPLogProperties(GpuShaderCreatorRcPtr & shaderCreator, // properties are unique. propNames.brightness = BuildResourceName(shaderCreator, opPrefix, propNames.brightness); - propNames.contrast = BuildResourceName(shaderCreator, opPrefix, propNames.contrast); - propNames.gamma = BuildResourceName(shaderCreator, opPrefix, propNames.gamma); + propNames.contrast = BuildResourceName(shaderCreator, opPrefix, propNames.contrast); + propNames.gamma = BuildResourceName(shaderCreator, opPrefix, propNames.gamma); - propNames.pivot = BuildResourceName(shaderCreator, opPrefix, propNames.pivot); + propNames.pivot = BuildResourceName(shaderCreator, opPrefix, propNames.pivot); propNames.pivotBlack = BuildResourceName(shaderCreator, opPrefix, propNames.pivotBlack); propNames.pivotWhite = BuildResourceName(shaderCreator, opPrefix, propNames.pivotWhite); propNames.clampBlack = BuildResourceName(shaderCreator, opPrefix, propNames.clampBlack); @@ -103,7 +105,7 @@ void AddGPLogProperties(GpuShaderCreatorRcPtr & shaderCreator, // Property is decoupled and added to shader creator. DynamicPropertyGradingPrimaryImplRcPtr shaderProp = prop->createEditableCopy(); - DynamicPropertyRcPtr newProp = shaderProp; + DynamicPropertyRcPtr newProp = shaderProp; shaderCreator->addDynamicProperty(newProp); DynamicPropertyGradingPrimaryImpl * primaryProp = shaderProp.get(); @@ -132,13 +134,14 @@ void AddGPLogProperties(GpuShaderCreatorRcPtr & shaderCreator, AddUniform(shaderCreator, getCWVal, propNames.clampWhite); const auto getSVal = std::bind(&GradingPrimary::m_saturation, &value); AddUniform(shaderCreator, getSVal, propNames.saturation); - const auto getLBP = std::bind(&DynamicPropertyGradingPrimaryImpl::getLocalBypass, shaderProp.get()); + const auto getLBP + = std::bind(&DynamicPropertyGradingPrimaryImpl::getLocalBypass, shaderProp.get()); AddBoolUniform(shaderCreator, getLBP, propNames.localBypass); } else { const auto & value = prop->getValue(); - const auto & comp = prop->getComputedValue(); + const auto & comp = prop->getComputedValue(); st.declareFloat3(propNames.brightness, comp.getBrightness()); st.declareFloat3(propNames.contrast, comp.getContrast()); @@ -153,10 +156,13 @@ void AddGPLogProperties(GpuShaderCreatorRcPtr & shaderCreator, } } -void AddGPLogForwardShader(GpuShaderCreatorRcPtr & shaderCreator, - GpuShaderText & st, - const GPProperties & props) +void AddGPLogForwardShader( + GpuShaderCreatorRcPtr & shaderCreator, + GpuShaderText & st, + const GPProperties & props) { + // clang-format off + const std::string pxl(shaderCreator->getPixelName()); st.newLine() << pxl << ".rgb += " << props.brightness << ";"; @@ -186,12 +192,17 @@ void AddGPLogForwardShader(GpuShaderCreatorRcPtr & shaderCreator, st.newLine() << pxl << ".rgb = clamp( " << pxl << ".rgb, " << props.clampBlack << ", " << props.clampWhite << " );"; + + // clang-format on } -void AddGPLogInverseShader(GpuShaderCreatorRcPtr & shaderCreator, - GpuShaderText & st, - const GPProperties & props) +void AddGPLogInverseShader( + GpuShaderCreatorRcPtr & shaderCreator, + GpuShaderText & st, + const GPProperties & props) { + // clang-format off + const std::string pxl(shaderCreator->getPixelName()); st.newLine() << pxl << ".rgb = clamp( " << pxl << ".rgb, " << props.clampBlack << ", " @@ -225,13 +236,16 @@ void AddGPLogInverseShader(GpuShaderCreatorRcPtr & shaderCreator, << " + " << props.pivot << ";"; st.newLine() << pxl << ".rgb += " << props.brightness << ";"; + + // clang-format on } -void AddGPLinProperties(GpuShaderCreatorRcPtr & shaderCreator, - GpuShaderText & st, - ConstGradingPrimaryOpDataRcPtr & gpData, - GPProperties & propNames, - bool dyn) +void AddGPLinProperties( + GpuShaderCreatorRcPtr & shaderCreator, + GpuShaderText & st, + ConstGradingPrimaryOpDataRcPtr & gpData, + GPProperties & propNames, + bool dyn) { auto prop = gpData->getDynamicPropertyInternal(); if (dyn) @@ -239,11 +253,11 @@ void AddGPLinProperties(GpuShaderCreatorRcPtr & shaderCreator, // Build names. No need to add an index to the name to avoid collisions as the dynamic // properties are unique. - propNames.offset = BuildResourceName(shaderCreator, opPrefix, propNames.offset); + propNames.offset = BuildResourceName(shaderCreator, opPrefix, propNames.offset); propNames.exposure = BuildResourceName(shaderCreator, opPrefix, propNames.exposure); propNames.contrast = BuildResourceName(shaderCreator, opPrefix, propNames.contrast); - propNames.pivot = BuildResourceName(shaderCreator, opPrefix, propNames.pivot); + propNames.pivot = BuildResourceName(shaderCreator, opPrefix, propNames.pivot); propNames.clampBlack = BuildResourceName(shaderCreator, opPrefix, propNames.clampBlack); propNames.clampWhite = BuildResourceName(shaderCreator, opPrefix, propNames.clampWhite); propNames.saturation = BuildResourceName(shaderCreator, opPrefix, propNames.saturation); @@ -252,7 +266,7 @@ void AddGPLinProperties(GpuShaderCreatorRcPtr & shaderCreator, // Property is decoupled and added to shader creator. DynamicPropertyGradingPrimaryImplRcPtr shaderProp = prop->createEditableCopy(); - DynamicPropertyRcPtr newProp = shaderProp; + DynamicPropertyRcPtr newProp = shaderProp; shaderCreator->addDynamicProperty(newProp); DynamicPropertyGradingPrimaryImpl * primaryProp = shaderProp.get(); @@ -276,13 +290,14 @@ void AddGPLinProperties(GpuShaderCreatorRcPtr & shaderCreator, AddUniform(shaderCreator, getCWVal, propNames.clampWhite); const auto getSVal = std::bind(&GradingPrimary::m_saturation, &value); AddUniform(shaderCreator, getSVal, propNames.saturation); - const auto getLBP = std::bind(&DynamicPropertyGradingPrimaryImpl::getLocalBypass, shaderProp.get()); + const auto getLBP + = std::bind(&DynamicPropertyGradingPrimaryImpl::getLocalBypass, shaderProp.get()); AddBoolUniform(shaderCreator, getLBP, propNames.localBypass); } else { const auto & value = prop->getValue(); - const auto & comp = prop->getComputedValue(); + const auto & comp = prop->getComputedValue(); st.declareFloat3(propNames.offset, comp.getOffset()); st.declareFloat3(propNames.exposure, comp.getExposure()); @@ -295,10 +310,13 @@ void AddGPLinProperties(GpuShaderCreatorRcPtr & shaderCreator, } } -void AddGPLinForwardShader(GpuShaderCreatorRcPtr & shaderCreator, - GpuShaderText & st, - const GPProperties & props) +void AddGPLinForwardShader( + GpuShaderCreatorRcPtr & shaderCreator, + GpuShaderText & st, + const GPProperties & props) { + // clang-format off + const std::string pxl(shaderCreator->getPixelName()); st.newLine() << pxl << ".rgb += " << props.offset << ";"; @@ -323,12 +341,17 @@ void AddGPLinForwardShader(GpuShaderCreatorRcPtr & shaderCreator, st.newLine() << pxl << ".rgb = clamp( " << pxl << ".rgb, " << props.clampBlack << ", " << props.clampWhite << " );"; + + // clang-format on } -void AddGPLinInverseShader(GpuShaderCreatorRcPtr & shaderCreator, - GpuShaderText & st, - const GPProperties & props) +void AddGPLinInverseShader( + GpuShaderCreatorRcPtr & shaderCreator, + GpuShaderText & st, + const GPProperties & props) { + // clang-format off + const std::string pxl(shaderCreator->getPixelName()); st.newLine() << pxl << ".rgb = clamp( " << pxl << ".rgb, " << props.clampBlack << ", " @@ -358,13 +381,16 @@ void AddGPLinInverseShader(GpuShaderCreatorRcPtr & shaderCreator, st.newLine() << pxl << ".rgb *= " << props.exposure << ";"; st.newLine() << pxl << ".rgb += " << props.offset << ";"; + + // clang-format on } -void AddGPVideoProperties(GpuShaderCreatorRcPtr & shaderCreator, - GpuShaderText & st, - ConstGradingPrimaryOpDataRcPtr & gpData, - GPProperties & propNames, - bool dyn) +void AddGPVideoProperties( + GpuShaderCreatorRcPtr & shaderCreator, + GpuShaderText & st, + ConstGradingPrimaryOpDataRcPtr & gpData, + GPProperties & propNames, + bool dyn) { auto prop = gpData->getDynamicPropertyInternal(); if (dyn) @@ -372,9 +398,9 @@ void AddGPVideoProperties(GpuShaderCreatorRcPtr & shaderCreator, // Build names. No need to add an index to the name to avoid collisions as the dynamic // properties are unique. - propNames.gamma = BuildResourceName(shaderCreator, opPrefix, propNames.gamma); + propNames.gamma = BuildResourceName(shaderCreator, opPrefix, propNames.gamma); propNames.offset = BuildResourceName(shaderCreator, opPrefix, propNames.offset); - propNames.slope = BuildResourceName(shaderCreator, opPrefix, propNames.slope); + propNames.slope = BuildResourceName(shaderCreator, opPrefix, propNames.slope); propNames.pivotBlack = BuildResourceName(shaderCreator, opPrefix, propNames.pivotBlack); propNames.pivotWhite = BuildResourceName(shaderCreator, opPrefix, propNames.pivotWhite); @@ -386,7 +412,7 @@ void AddGPVideoProperties(GpuShaderCreatorRcPtr & shaderCreator, // Property is decoupled and added to shader creator. DynamicPropertyGradingPrimaryImplRcPtr shaderProp = prop->createEditableCopy(); - DynamicPropertyRcPtr newProp = shaderProp; + DynamicPropertyRcPtr newProp = shaderProp; shaderCreator->addDynamicProperty(newProp); DynamicPropertyGradingPrimaryImpl * primaryProp = shaderProp.get(); @@ -415,13 +441,14 @@ void AddGPVideoProperties(GpuShaderCreatorRcPtr & shaderCreator, AddUniform(shaderCreator, getCWVal, propNames.clampWhite); const auto getSVal = std::bind(&GradingPrimary::m_saturation, &value); AddUniform(shaderCreator, getSVal, propNames.saturation); - const auto getLBP = std::bind(&DynamicPropertyGradingPrimaryImpl::getLocalBypass, shaderProp.get()); + const auto getLBP + = std::bind(&DynamicPropertyGradingPrimaryImpl::getLocalBypass, shaderProp.get()); AddBoolUniform(shaderCreator, getLBP, propNames.localBypass); } else { const auto & value = prop->getValue(); - const auto & comp = prop->getComputedValue(); + const auto & comp = prop->getComputedValue(); st.declareFloat3(propNames.gamma, comp.getGamma()); st.declareFloat3(propNames.offset, comp.getOffset()); @@ -435,10 +462,13 @@ void AddGPVideoProperties(GpuShaderCreatorRcPtr & shaderCreator, } } -void AddGPVideoForwardShader(GpuShaderCreatorRcPtr & shaderCreator, - GpuShaderText & st, - const GPProperties & props) +void AddGPVideoForwardShader( + GpuShaderCreatorRcPtr & shaderCreator, + GpuShaderText & st, + const GPProperties & props) { + // clang-format off + const std::string pxl(shaderCreator->getPixelName()); st.newLine() << pxl << ".rgb += " << props.offset << ";"; @@ -465,12 +495,17 @@ void AddGPVideoForwardShader(GpuShaderCreatorRcPtr & shaderCreator, st.newLine() << pxl << ".rgb = clamp( " << pxl << ".rgb, " << props.clampBlack << ", " << props.clampWhite << " );"; + + // clang-format on } -void AddGPVideoInverseShader(GpuShaderCreatorRcPtr & shaderCreator, - GpuShaderText & st, - const GPProperties & props) +void AddGPVideoInverseShader( + GpuShaderCreatorRcPtr & shaderCreator, + GpuShaderText & st, + const GPProperties & props) { + // clang-format off + const std::string pxl(shaderCreator->getPixelName()); st.newLine() << pxl << ".rgb = clamp( " << pxl << ".rgb, " << props.clampBlack << ", " @@ -502,13 +537,16 @@ void AddGPVideoInverseShader(GpuShaderCreatorRcPtr & shaderCreator, st.newLine() << pxl << ".rgb = ( " << pxl << ".rgb - " << props.pivotBlack << " ) * "<< props.slope <<" + " << props.pivotBlack << ";"; st.newLine() << pxl << ".rgb += " << props.offset << " );"; + + // clang-format on } -} +} // namespace -void GetGradingPrimaryGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, - ConstGradingPrimaryOpDataRcPtr & gpData) +void GetGradingPrimaryGPUShaderProgram( + GpuShaderCreatorRcPtr & shaderCreator, + ConstGradingPrimaryOpDataRcPtr & gpData) { - const bool dyn = gpData->isDynamic() && shaderCreator->getLanguage() != LANGUAGE_OSL_1; + const bool dyn = gpData->isDynamic() && shaderCreator->getLanguage() != LANGUAGE_OSL_1; if (!dyn) { auto propGP = gpData->getDynamicPropertyInternal(); @@ -520,7 +558,7 @@ void GetGradingPrimaryGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, if (gpData->isDynamic() && shaderCreator->getLanguage() == LANGUAGE_OSL_1) { - std::string msg("The dynamic properties are not yet supported by the 'Open Shading language"\ + std::string msg("The dynamic properties are not yet supported by the 'Open Shading language" " (OSL)' translation: The '"); msg += opPrefix; msg += "' dynamic property is replaced by a local variable."; @@ -528,12 +566,14 @@ void GetGradingPrimaryGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, LogWarning(msg); } - const GradingStyle style = gpData->getStyle(); + const GradingStyle style = gpData->getStyle(); const TransformDirection dir = gpData->getDirection(); GpuShaderText st(shaderCreator->getLanguage()); st.indent(); + // clang-format off + st.newLine() << ""; st.newLine() << "// Add GradingPrimary '" << GradingStyleToString(style) << "' " @@ -542,92 +582,94 @@ void GetGradingPrimaryGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, st.newLine() << "{"; st.indent(); + // clang-format on + // Properties holds shader variables names and is initialized with undecorated names suitable // for local variables. GPProperties properties; switch (style) { - case GRADING_LOG: - { - AddGPLogProperties(shaderCreator, st, gpData, properties, dyn); - if (dyn) - { - st.newLine() << "if (!" << properties.localBypass << ")"; - st.newLine() << "{"; - st.indent(); - } - - switch (dir) + case GRADING_LOG: { - case TRANSFORM_DIR_FORWARD: - AddGPLogForwardShader(shaderCreator, st, properties); + AddGPLogProperties(shaderCreator, st, gpData, properties, dyn); + if (dyn) + { + st.newLine() << "if (!" << properties.localBypass << ")"; + st.newLine() << "{"; + st.indent(); + } + + switch (dir) + { + case TRANSFORM_DIR_FORWARD: + AddGPLogForwardShader(shaderCreator, st, properties); + break; + case TRANSFORM_DIR_INVERSE: + AddGPLogInverseShader(shaderCreator, st, properties); + break; + } + + if (dyn) + { + st.dedent(); + st.newLine() << "}"; + } break; - case TRANSFORM_DIR_INVERSE: - AddGPLogInverseShader(shaderCreator, st, properties); - break; - } - - if (dyn) - { - st.dedent(); - st.newLine() << "}"; - } - break; - } - case GRADING_LIN: - { - AddGPLinProperties(shaderCreator, st, gpData, properties, dyn); - if (dyn) - { - st.newLine() << "if (!" << properties.localBypass << ")"; - st.newLine() << "{"; - st.indent(); } - - switch (dir) + case GRADING_LIN: { - case TRANSFORM_DIR_FORWARD: - AddGPLinForwardShader(shaderCreator, st, properties); - break; - case TRANSFORM_DIR_INVERSE: - AddGPLinInverseShader(shaderCreator, st, properties); + AddGPLinProperties(shaderCreator, st, gpData, properties, dyn); + if (dyn) + { + st.newLine() << "if (!" << properties.localBypass << ")"; + st.newLine() << "{"; + st.indent(); + } + + switch (dir) + { + case TRANSFORM_DIR_FORWARD: + AddGPLinForwardShader(shaderCreator, st, properties); + break; + case TRANSFORM_DIR_INVERSE: + AddGPLinInverseShader(shaderCreator, st, properties); + break; + } + + if (dyn) + { + st.dedent(); + st.newLine() << "}"; + } break; } - - if (dyn) + case GRADING_VIDEO: { - st.dedent(); - st.newLine() << "}"; - } - break; - } - case GRADING_VIDEO: - { - AddGPVideoProperties(shaderCreator, st, gpData, properties, dyn); - if (dyn) - { - st.newLine() << "if (!" << properties.localBypass << ")"; - st.newLine() << "{"; - st.indent(); - } - - switch (dir) - { - case TRANSFORM_DIR_FORWARD: - AddGPVideoForwardShader(shaderCreator, st, properties); - break; - case TRANSFORM_DIR_INVERSE: - AddGPVideoInverseShader(shaderCreator, st, properties); + AddGPVideoProperties(shaderCreator, st, gpData, properties, dyn); + if (dyn) + { + st.newLine() << "if (!" << properties.localBypass << ")"; + st.newLine() << "{"; + st.indent(); + } + + switch (dir) + { + case TRANSFORM_DIR_FORWARD: + AddGPVideoForwardShader(shaderCreator, st, properties); + break; + case TRANSFORM_DIR_INVERSE: + AddGPVideoInverseShader(shaderCreator, st, properties); + break; + } + + if (dyn) + { + st.dedent(); + st.newLine() << "}"; + } break; } - - if (dyn) - { - st.dedent(); - st.newLine() << "}"; - } - break; - } } st.dedent(); st.newLine() << "}"; @@ -636,4 +678,4 @@ void GetGradingPrimaryGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, shaderCreator->addToFunctionShaderCode(st.string().c_str()); } -} // OCIO_NAMESPACE +} // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/ops/gradingprimary/GradingPrimaryOpGPU.h b/src/OpenColorIO/ops/gradingprimary/GradingPrimaryOpGPU.h index 47447fc2ad..fb821e2cc6 100644 --- a/src/OpenColorIO/ops/gradingprimary/GradingPrimaryOpGPU.h +++ b/src/OpenColorIO/ops/gradingprimary/GradingPrimaryOpGPU.h @@ -12,11 +12,10 @@ namespace OCIO_NAMESPACE { -void GetGradingPrimaryGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, - ConstGradingPrimaryOpDataRcPtr & gpData); +void GetGradingPrimaryGPUShaderProgram( + GpuShaderCreatorRcPtr & shaderCreator, + ConstGradingPrimaryOpDataRcPtr & gpData); } // namespace OCIO_NAMESPACE #endif - - diff --git a/src/OpenColorIO/ops/gradingrgbcurve/GradingBSplineCurve.cpp b/src/OpenColorIO/ops/gradingrgbcurve/GradingBSplineCurve.cpp index 72c656725a..0142ef8c4d 100644 --- a/src/OpenColorIO/ops/gradingrgbcurve/GradingBSplineCurve.cpp +++ b/src/OpenColorIO/ops/gradingrgbcurve/GradingBSplineCurve.cpp @@ -15,15 +15,16 @@ namespace OCIO_NAMESPACE GradingBSplineCurveRcPtr GradingBSplineCurve::Create(size_t size) { - auto newSpline = std::make_shared(size); + auto newSpline = std::make_shared(size); GradingBSplineCurveRcPtr res = newSpline; return res; } -GradingBSplineCurveRcPtr GradingBSplineCurve::Create(std::initializer_list values) +GradingBSplineCurveRcPtr GradingBSplineCurve::Create( + std::initializer_list values) { auto newSpline = std::make_shared(values.size()); - size_t i = 0; + size_t i = 0; for (const auto & c : values) { newSpline->getControlPoint(i++) = c; @@ -34,20 +35,23 @@ GradingBSplineCurveRcPtr GradingBSplineCurve::Create(std::initializer_list & controlPoints) - : m_controlPoints(controlPoints), m_slopesArray(controlPoints.size(), 0.f) +GradingBSplineCurveImpl::GradingBSplineCurveImpl( + const std::vector & controlPoints) + : m_controlPoints(controlPoints) + , m_slopesArray(controlPoints.size(), 0.f) { } GradingBSplineCurveRcPtr GradingBSplineCurveImpl::createEditableCopy() const { - auto copy = std::make_shared(0); + auto copy = std::make_shared(0); copy->m_controlPoints = m_controlPoints; - copy->m_slopesArray = m_slopesArray; + copy->m_slopesArray = m_slopesArray; GradingBSplineCurveRcPtr res; res = copy; return res; @@ -70,7 +74,7 @@ void GradingBSplineCurveImpl::validateIndex(size_t index) const if (index >= numPoints) { std::ostringstream oss; - oss << "There are '"<< numPoints << "' control points. '" << index << "' is invalid."; + oss << "There are '" << numPoints << "' control points. '" << index << "' is invalid."; throw Exception(oss.str().c_str()); } } @@ -210,33 +214,34 @@ void EstimateSlopes(const std::vector & ctrlPnts, std::vect slopes.push_back(0.f); for (size_t k = 1; k < numCtrlPnts - 1; ++k) { - const float s = (secantLen[k] * secantSlope[k] + secantLen[k - 1] * secantSlope[k - 1]) / - (secantLen[k] + secantLen[k - 1]); + const float s = (secantLen[k] * secantSlope[k] + secantLen[k - 1] * secantSlope[k - 1]) + / (secantLen[k] + secantLen[k - 1]); slopes.push_back(s); } - slopes.push_back(std::max(0.01f, 0.5f * (3.f * secantSlope[numCtrlPnts - 2] - - slopes[numCtrlPnts - 2]))); + slopes.push_back( + std::max(0.01f, 0.5f * (3.f * secantSlope[numCtrlPnts - 2] - slopes[numCtrlPnts - 2]))); slopes[0] = std::max(0.01f, 0.5f * (3.f * secantSlope[0] - slopes[1])); } -void FitSpline(const std::vector & ctrlPnts, - const std::vector & slopes, - std::vector & knots, - std::vector & coefsA, - std::vector & coefsB, - std::vector & coefsC) +void FitSpline( + const std::vector & ctrlPnts, + const std::vector & slopes, + std::vector & knots, + std::vector & coefsA, + std::vector & coefsB, + std::vector & coefsC) { const size_t numCtrlPnts = ctrlPnts.size(); knots.push_back(ctrlPnts[0].m_x); for (size_t i = 0; i < numCtrlPnts - 1; ++i) { - const float xi = ctrlPnts[i].m_x; - const float xi_pl1 = ctrlPnts[i + 1].m_x; - const float yi = ctrlPnts[i].m_y; - const float yi_pl1 = ctrlPnts[i + 1].m_y; - const float del_x = xi_pl1 - xi; - const float del_y = yi_pl1 - yi; + const float xi = ctrlPnts[i].m_x; + const float xi_pl1 = ctrlPnts[i + 1].m_x; + const float yi = ctrlPnts[i].m_y; + const float yi_pl1 = ctrlPnts[i + 1].m_y; + const float del_x = xi_pl1 - xi; + const float del_y = yi_pl1 - yi; const float secantSlope = del_y / del_x; if (std::fabs((slopes[i] + slopes[i + 1]) - 2.f * secantSlope) < 1e-6f) { @@ -246,7 +251,7 @@ void FitSpline(const std::vector & ctrlPnts, } else { - float ksi = 0.f; + float ksi = 0.f; const float aa = slopes[i] - secantSlope; const float bb = slopes[i + 1] - secantSlope; if (aa * bb >= 0.f) @@ -264,8 +269,8 @@ void FitSpline(const std::vector & ctrlPnts, ksi = xi + bb * del_x / (slopes[i + 1] - slopes[i]); } } - const float s_bar = (2.f * secantSlope - slopes[i + 1]) + - (slopes[i + 1] - slopes[i]) * (ksi - xi) / del_x; + const float s_bar = (2.f * secantSlope - slopes[i + 1]) + + (slopes[i + 1] - slopes[i]) * (ksi - xi) / del_x; const float eta = (s_bar - slopes[i]) / (ksi - xi); coefsC.push_back(yi); coefsB.push_back(slopes[i]); @@ -279,9 +284,10 @@ void FitSpline(const std::vector & ctrlPnts, } } -bool AdjustSlopes(const std::vector & ctrlPnts, - std::vector & slopes, - std::vector & knots) +bool AdjustSlopes( + const std::vector & ctrlPnts, + std::vector & slopes, + std::vector & knots) { bool adjustment_done = false; size_t i = 0, j = 0; @@ -290,27 +296,28 @@ bool AdjustSlopes(const std::vector & ctrlPnts, { if (ctrlPnts[i].m_x != knots[j]) { - const float ksi = knots[j]; - const float xi = ctrlPnts[i].m_x; + const float ksi = knots[j]; + const float xi = ctrlPnts[i].m_x; const float xi_pl1 = ctrlPnts[i + 1].m_x; - const float yi = ctrlPnts[i].m_y; + const float yi = ctrlPnts[i].m_y; const float yi_pl1 = ctrlPnts[i + 1].m_y; - const float s_bar = (2.f * (yi_pl1 - yi) - (ksi - xi) * slopes[i] - - (xi_pl1 - ksi) * slopes[i + 1]) / (xi_pl1 - xi); + const float s_bar + = (2.f * (yi_pl1 - yi) - (ksi - xi) * slopes[i] - (xi_pl1 - ksi) * slopes[i + 1]) + / (xi_pl1 - xi); if (s_bar < 0.f) { adjustment_done = true; - float secant = (yi_pl1 - yi) / (xi_pl1 - xi); - const float blend_slope = ((ksi - xi) * slopes[i] + (xi_pl1 - ksi) * slopes[i + 1]) / - (xi_pl1 - xi); + float secant = (yi_pl1 - yi) / (xi_pl1 - xi); + const float blend_slope + = ((ksi - xi) * slopes[i] + (xi_pl1 - ksi) * slopes[i + 1]) / (xi_pl1 - xi); float aim_slope = 0.01f * 0.5f * (slopes[i] + slopes[i + 1]); if (aim_slope > secant) { aim_slope = secant; } const float adjust = (2.f * secant - aim_slope) / blend_slope; - slopes[i] = slopes[i] * adjust; - slopes[i + 1] = slopes[i + 1] * adjust; + slopes[i] = slopes[i] * adjust; + slopes[i + 1] = slopes[i + 1] * adjust; } i++; } @@ -319,7 +326,7 @@ bool AdjustSlopes(const std::vector & ctrlPnts, return adjustment_done; } -} // namespace +} // namespace void GradingBSplineCurveImpl::computeKnotsAndCoefs(KnotsCoefs & knotsCoefs, int curveIdx) const { @@ -327,9 +334,9 @@ void GradingBSplineCurveImpl::computeKnotsAndCoefs(KnotsCoefs & knotsCoefs, int if (m_controlPoints.size() < 2 || isIdentity()) { // Identity curve: offset is -1 and count is 0. - knotsCoefs.m_knotsOffsetsArray[curveIdx * 2] = -1; + knotsCoefs.m_knotsOffsetsArray[curveIdx * 2] = -1; knotsCoefs.m_knotsOffsetsArray[curveIdx * 2 + 1] = 0; - knotsCoefs.m_coefsOffsetsArray[curveIdx * 2] = -1; + knotsCoefs.m_coefsOffsetsArray[curveIdx * 2] = -1; knotsCoefs.m_coefsOffsetsArray[curveIdx * 2 + 1] = 0; } else @@ -340,7 +347,7 @@ void GradingBSplineCurveImpl::computeKnotsAndCoefs(KnotsCoefs & knotsCoefs, int std::vector coefsC; std::vector slopes; - if ( !slopesAreDefault() && (m_slopesArray.size() == m_controlPoints.size()) ) + if (!slopesAreDefault() && (m_slopesArray.size() == m_controlPoints.size())) { // If the user-supplied slopes are non-zero, use those. slopes = m_slopesArray; @@ -358,7 +365,9 @@ void GradingBSplineCurveImpl::computeKnotsAndCoefs(KnotsCoefs & knotsCoefs, int if (adjustment_done) { knots.clear(); - coefsA.clear(); coefsB.clear(); coefsC.clear(); + coefsA.clear(); + coefsB.clear(); + coefsC.clear(); FitSpline(m_controlPoints, slopes, knots, coefsA, coefsB, coefsC); } @@ -367,15 +376,15 @@ void GradingBSplineCurveImpl::computeKnotsAndCoefs(KnotsCoefs & knotsCoefs, int const int numCoefs = static_cast(knotsCoefs.m_coefsArray.size()); const int newCoefs = static_cast(coefsA.size() * 3); - if (numKnots + newKnots > KnotsCoefs::MAX_NUM_KNOTS || - numCoefs + newCoefs > KnotsCoefs::MAX_NUM_COEFS) + if (numKnots + newKnots > KnotsCoefs::MAX_NUM_KNOTS + || numCoefs + newCoefs > KnotsCoefs::MAX_NUM_COEFS) { throw Exception("RGB curve: maximum number of control points reached."); } - knotsCoefs.m_knotsOffsetsArray[curveIdx * 2] = numKnots; + knotsCoefs.m_knotsOffsetsArray[curveIdx * 2] = numKnots; knotsCoefs.m_knotsOffsetsArray[curveIdx * 2 + 1] = newKnots; - knotsCoefs.m_coefsOffsetsArray[curveIdx * 2] = numCoefs; + knotsCoefs.m_coefsOffsetsArray[curveIdx * 2] = numCoefs; knotsCoefs.m_coefsOffsetsArray[curveIdx * 2 + 1] = newCoefs; knotsCoefs.m_knotsArray.insert(knotsCoefs.m_knotsArray.end(), knots.begin(), knots.end()); @@ -385,13 +394,15 @@ void GradingBSplineCurveImpl::computeKnotsAndCoefs(KnotsCoefs & knotsCoefs, int } } -void GradingBSplineCurveImpl::AddShaderEval(GpuShaderText & st, - const std::string & knotsOffsets, - const std::string & coefsOffsets, - const std::string & knots, - const std::string & coefs, bool isInv) +void GradingBSplineCurveImpl::AddShaderEval( + GpuShaderText & st, + const std::string & knotsOffsets, + const std::string & coefsOffsets, + const std::string & knots, + const std::string & coefs, + bool isInv) { - if (!isInv) // Forward + if (!isInv) // Forward { st.newLine() << "int knotsOffs = " << knotsOffsets << "[curveIdx * 2];"; st.newLine() << "int knotsCnt = " << knotsOffsets << "[curveIdx * 2 + 1];"; @@ -443,7 +454,7 @@ void GradingBSplineCurveImpl::AddShaderEval(GpuShaderText & st, st.newLine() << "float t = x - kn;"; st.newLine() << "return ( A * t + B ) * t + C;"; } - else // Inverse + else // Inverse { st.newLine() << "int knotsOffs = " << knotsOffsets << "[curveIdx * 2];"; st.newLine() << "int knotsCnt = " << knotsOffsets << "[curveIdx * 2 + 1];"; @@ -516,11 +527,11 @@ float GradingBSplineCurveImpl::KnotsCoefs::evalCurve(int c, float x) const return x; } const int coefsOffs = m_coefsOffsetsArray[2 * c]; - const int knotsCnt = m_knotsOffsetsArray[2 * c + 1]; + const int knotsCnt = m_knotsOffsetsArray[2 * c + 1]; const int knotsOffs = m_knotsOffsetsArray[2 * c]; const float knStart = m_knotsArray[knotsOffs]; - const float knEnd = m_knotsArray[knotsOffs + knotsCnt - 1]; + const float knEnd = m_knotsArray[knotsOffs + knotsCnt - 1]; if (x <= knStart) { @@ -530,13 +541,13 @@ float GradingBSplineCurveImpl::KnotsCoefs::evalCurve(int c, float x) const } else if (x >= knEnd) { - const float A = m_coefsArray[coefsOffs + coefsSets - 1]; - const float B = m_coefsArray[coefsOffs + coefsSets * 2 - 1]; - const float C = m_coefsArray[coefsOffs + coefsSets * 3 - 1]; - const float kn = m_knotsArray[knotsOffs + knotsCnt - 2]; - const float t = knEnd - kn; + const float A = m_coefsArray[coefsOffs + coefsSets - 1]; + const float B = m_coefsArray[coefsOffs + coefsSets * 2 - 1]; + const float C = m_coefsArray[coefsOffs + coefsSets * 3 - 1]; + const float kn = m_knotsArray[knotsOffs + knotsCnt - 2]; + const float t = knEnd - kn; const float slope = 2.f * A * t + B; - const float offs = (A * t + B) * t + C; + const float offs = (A * t + B) * t + C; return (x - knEnd) * slope + offs; } else @@ -551,7 +562,7 @@ float GradingBSplineCurveImpl::KnotsCoefs::evalCurve(int c, float x) const const float B = m_coefsArray[coefsOffs + coefsSets + i]; const float C = m_coefsArray[coefsOffs + coefsSets * 2 + i]; const float kn = m_knotsArray[knotsOffs + i]; - const float t = x - kn; + const float t = x - kn; return (A * t + B) * t + C; } } @@ -564,11 +575,11 @@ float GradingBSplineCurveImpl::KnotsCoefs::evalCurveRev(int c, float y) const return y; } const int coefsOffs = m_coefsOffsetsArray[2 * c]; - const int knotsCnt = m_knotsOffsetsArray[2 * c + 1]; + const int knotsCnt = m_knotsOffsetsArray[2 * c + 1]; const int knotsOffs = m_knotsOffsetsArray[2 * c]; - const float knStart = m_knotsArray[knotsOffs]; - const float knEnd = m_knotsArray[knotsOffs + knotsCnt - 1]; + const float knStart = m_knotsArray[knotsOffs]; + const float knEnd = m_knotsArray[knotsOffs + knotsCnt - 1]; const float knStartY = m_coefsArray[coefsOffs + coefsSets * 2]; float knEndY; { @@ -576,8 +587,8 @@ float GradingBSplineCurveImpl::KnotsCoefs::evalCurveRev(int c, float y) const const float B = m_coefsArray[coefsOffs + coefsSets * 2 - 1]; const float C = m_coefsArray[coefsOffs + coefsSets * 3 - 1]; const float kn = m_knotsArray[knotsOffs + knotsCnt - 2]; - const float t = knEnd - kn; - knEndY = (A * t + B) * t + C; + const float t = knEnd - kn; + knEndY = (A * t + B) * t + C; } if (y <= knStartY) @@ -588,13 +599,13 @@ float GradingBSplineCurveImpl::KnotsCoefs::evalCurveRev(int c, float y) const } else if (y >= knEndY) { - const float A = m_coefsArray[coefsOffs + coefsSets - 1]; - const float B = m_coefsArray[coefsOffs + coefsSets * 2 - 1]; - const float C = m_coefsArray[coefsOffs + coefsSets * 3 - 1]; - const float kn = m_knotsArray[knotsOffs + knotsCnt - 2]; - const float t = knEnd - kn; + const float A = m_coefsArray[coefsOffs + coefsSets - 1]; + const float B = m_coefsArray[coefsOffs + coefsSets * 2 - 1]; + const float C = m_coefsArray[coefsOffs + coefsSets * 3 - 1]; + const float kn = m_knotsArray[knotsOffs + knotsCnt - 2]; + const float t = knEnd - kn; const float slope = 2.f * A * t + B; - const float offs = (A * t + B) * t + C; + const float offs = (A * t + B) * t + C; return std::fabs(slope) < 1e-5f ? knEnd : (y - offs) / slope + knEnd; } else @@ -605,11 +616,11 @@ float GradingBSplineCurveImpl::KnotsCoefs::evalCurveRev(int c, float y) const if (y < m_coefsArray[coefsOffs + coefsSets * 2 + i + 1]) break; } - const float A = m_coefsArray[coefsOffs + i]; - const float B = m_coefsArray[coefsOffs + coefsSets + i]; - const float C = m_coefsArray[coefsOffs + coefsSets * 2 + i]; - const float kn = m_knotsArray[knotsOffs + i]; - const float C0 = C - y; + const float A = m_coefsArray[coefsOffs + i]; + const float B = m_coefsArray[coefsOffs + coefsSets + i]; + const float C = m_coefsArray[coefsOffs + coefsSets * 2 + i]; + const float kn = m_knotsArray[knotsOffs + i]; + const float C0 = C - y; const float discrim = sqrt(B * B - 4.f * A * C0); return kn + (-2.f * C0) / (discrim + B); } @@ -648,4 +659,3 @@ bool operator!=(const GradingBSplineCurve & lhs, const GradingBSplineCurve & rhs } } // namespace OCIO_NAMESPACE - diff --git a/src/OpenColorIO/ops/gradingrgbcurve/GradingBSplineCurve.h b/src/OpenColorIO/ops/gradingrgbcurve/GradingBSplineCurve.h index 9944564051..18ea87a65d 100644 --- a/src/OpenColorIO/ops/gradingrgbcurve/GradingBSplineCurve.h +++ b/src/OpenColorIO/ops/gradingrgbcurve/GradingBSplineCurve.h @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_GRADINGBSPLINECURVE_H #define INCLUDED_OCIO_GRADINGBSPLINECURVE_H @@ -76,7 +75,7 @@ class GradingBSplineCurveImpl : public GradingBSplineCurve // The max number of control points must be kept to a minimum, otherwise we may reach the // max number of allowed uniforms (1024), resulting in linking errors. // - // On older hardware, even if it links, the responsiveness may become extremely slow if + // On older hardware, even if it links, the responsiveness may become extremely slow if // the number is too large. It's not clear how to estimate what that limit is but // 200 knots & 600 coefs is too many. // @@ -87,7 +86,7 @@ class GradingBSplineCurveImpl : public GradingBSplineCurve // -1. The number of knots is chosen dynamically based on what is needed to fit the // control points but the number of knots may be, at most, the number of control // points * 2 - 1. - // + // // There are 4 RGB curves (R, G, B, M) each represented by one RGBCurve. We want to keep // the total for two curves well below the 200 knot, 600 coef limit. // (TODO: 6 Hue curves (H/H, H/S, H/L, L/S, L/L, S/S)). @@ -103,8 +102,8 @@ class GradingBSplineCurveImpl : public GradingBSplineCurve static constexpr int MAX_NUM_COEFS = 180; // Pre-processing arrays of length MAX_NUM_KNOTS and MAX_NUM_COEFS. - std::vector m_coefsArray; // Contains packed coefs of ALL curves. - std::vector m_knotsArray; // Contains packed knots of ALL curves. + std::vector m_coefsArray; // Contains packed coefs of ALL curves. + std::vector m_knotsArray; // Contains packed knots of ALL curves. float evalCurve(int curveIdx, float x) const; float evalCurveRev(int curveIdx, float x) const; @@ -114,14 +113,19 @@ class GradingBSplineCurveImpl : public GradingBSplineCurve // each curve using a given curve order. void computeKnotsAndCoefs(KnotsCoefs & knotsCoefs, int curveIdx) const; - static void AddShaderEval(GpuShaderText & st, - const std::string & knotsOffsets, const std::string & coefsOffsets, - const std::string & knots, const std::string & coefs, bool isInv); + static void AddShaderEval( + GpuShaderText & st, + const std::string & knotsOffsets, + const std::string & coefsOffsets, + const std::string & knots, + const std::string & coefs, + bool isInv); + private: void validateIndex(size_t index) const; std::vector m_controlPoints; - std::vector m_slopesArray; // Optional slope values for the control points. + std::vector m_slopesArray; // Optional slope values for the control points. }; bool IsGradingCurveIdentity(const ConstGradingBSplineCurveRcPtr & curve); diff --git a/src/OpenColorIO/ops/gradingrgbcurve/GradingRGBCurve.cpp b/src/OpenColorIO/ops/gradingrgbcurve/GradingRGBCurve.cpp index 196988a8e7..1d5d8a1903 100644 --- a/src/OpenColorIO/ops/gradingrgbcurve/GradingRGBCurve.cpp +++ b/src/OpenColorIO/ops/gradingrgbcurve/GradingRGBCurve.cpp @@ -12,26 +12,36 @@ namespace OCIO_NAMESPACE { namespace { -static const std::vector DefaultCtrl{ { 0.f, 0.f },{ 0.5f, 0.5f },{ 1.0f, 1.0f } }; -static const std::vector DefaultCtrlLin{ { -7.0f, -7.0f },{ 0.f, 0.f },{ 7.0f, 7.0f } }; -} +static const std::vector DefaultCtrl{ + { 0.f, 0.f}, + {0.5f, 0.5f}, + {1.0f, 1.0f} +}; +static const std::vector DefaultCtrlLin{ + {-7.0f, -7.0f}, + { 0.f, 0.f}, + { 7.0f, 7.0f} +}; +} // namespace const GradingBSplineCurveImpl GradingRGBCurveImpl::Default(DefaultCtrl); const GradingBSplineCurveImpl GradingRGBCurveImpl::DefaultLin(DefaultCtrlLin); GradingRGBCurveImpl::GradingRGBCurveImpl(GradingStyle style) { - m_curves[RGB_RED] = (style == GRADING_LIN ? GradingRGBCurveImpl::DefaultLin.createEditableCopy() : - GradingRGBCurveImpl::Default.createEditableCopy()); + m_curves[RGB_RED] + = (style == GRADING_LIN ? GradingRGBCurveImpl::DefaultLin.createEditableCopy() + : GradingRGBCurveImpl::Default.createEditableCopy()); m_curves[RGB_GREEN] = m_curves[RGB_RED]->createEditableCopy(); m_curves[RGB_BLUE] = m_curves[RGB_RED]->createEditableCopy(); m_curves[RGB_MASTER] = m_curves[RGB_RED]->createEditableCopy(); } -GradingRGBCurveImpl::GradingRGBCurveImpl(const ConstGradingBSplineCurveRcPtr & red, - const ConstGradingBSplineCurveRcPtr & green, - const ConstGradingBSplineCurveRcPtr & blue, - const ConstGradingBSplineCurveRcPtr & master) +GradingRGBCurveImpl::GradingRGBCurveImpl( + const ConstGradingBSplineCurveRcPtr & red, + const ConstGradingBSplineCurveRcPtr & green, + const ConstGradingBSplineCurveRcPtr & blue, + const ConstGradingBSplineCurveRcPtr & master) { if (!red || !green || !blue || !master) { @@ -57,10 +67,11 @@ GradingRGBCurveImpl::GradingRGBCurveImpl(const ConstGradingRGBCurveRcPtr & rhs) GradingRGBCurveRcPtr GradingRGBCurveImpl::createEditableCopy() const { - auto newCurve = std::make_shared(m_curves[RGB_RED], - m_curves[RGB_GREEN], - m_curves[RGB_BLUE], - m_curves[RGB_MASTER]); + auto newCurve = std::make_shared( + m_curves[RGB_RED], + m_curves[RGB_GREEN], + m_curves[RGB_BLUE], + m_curves[RGB_MASTER]); GradingRGBCurveRcPtr res = newCurve; return res; } @@ -72,22 +83,22 @@ const char * CurveType(int c) const RGBCurveType curve = static_cast(c); switch (curve) { - case RGB_RED: - return "red"; - case RGB_GREEN: - return "green"; - case RGB_BLUE: - return "blue"; - case RGB_MASTER: - return "master"; - - case RGB_NUM_CURVES: - default: - break; + case RGB_RED: + return "red"; + case RGB_GREEN: + return "green"; + case RGB_BLUE: + return "blue"; + case RGB_MASTER: + return "master"; + + case RGB_NUM_CURVES: + default: + break; } return "invalid"; } -} +} // namespace void GradingRGBCurveImpl::validate() const { @@ -139,34 +150,35 @@ GradingBSplineCurveRcPtr GradingRGBCurveImpl::getCurve(RGBCurveType c) GradingRGBCurveRcPtr GradingRGBCurve::Create(GradingStyle style) { - auto newCurve = std::make_shared(style); + auto newCurve = std::make_shared(style); GradingRGBCurveRcPtr res = newCurve; return res; } GradingRGBCurveRcPtr GradingRGBCurve::Create(const ConstGradingRGBCurveRcPtr & rhs) { - auto newCurve = std::make_shared(rhs); + auto newCurve = std::make_shared(rhs); GradingRGBCurveRcPtr res = newCurve; return res; } -GradingRGBCurveRcPtr GradingRGBCurve::Create(const ConstGradingBSplineCurveRcPtr & red, - const ConstGradingBSplineCurveRcPtr & green, - const ConstGradingBSplineCurveRcPtr & blue, - const ConstGradingBSplineCurveRcPtr & master) +GradingRGBCurveRcPtr GradingRGBCurve::Create( + const ConstGradingBSplineCurveRcPtr & red, + const ConstGradingBSplineCurveRcPtr & green, + const ConstGradingBSplineCurveRcPtr & blue, + const ConstGradingBSplineCurveRcPtr & master) { - auto newCurve = std::make_shared(red, green, blue, master); + auto newCurve = std::make_shared(red, green, blue, master); GradingRGBCurveRcPtr res = newCurve; return res; } bool operator==(const GradingRGBCurve & lhs, const GradingRGBCurve & rhs) { - if (*(lhs.getCurve(RGB_RED)) == *(rhs.getCurve(RGB_RED)) && - *(lhs.getCurve(RGB_GREEN)) == *(rhs.getCurve(RGB_GREEN)) && - *(lhs.getCurve(RGB_BLUE)) == *(rhs.getCurve(RGB_BLUE)) && - *(lhs.getCurve(RGB_MASTER)) == *(rhs.getCurve(RGB_MASTER))) + if (*(lhs.getCurve(RGB_RED)) == *(rhs.getCurve(RGB_RED)) + && *(lhs.getCurve(RGB_GREEN)) == *(rhs.getCurve(RGB_GREEN)) + && *(lhs.getCurve(RGB_BLUE)) == *(rhs.getCurve(RGB_BLUE)) + && *(lhs.getCurve(RGB_MASTER)) == *(rhs.getCurve(RGB_MASTER))) { return true; } @@ -178,6 +190,4 @@ bool operator!=(const GradingRGBCurve & lhs, const GradingRGBCurve & rhs) return !(lhs == rhs); } - } // namespace OCIO_NAMESPACE - diff --git a/src/OpenColorIO/ops/gradingrgbcurve/GradingRGBCurve.h b/src/OpenColorIO/ops/gradingrgbcurve/GradingRGBCurve.h index 3a7c76dfee..dd99145067 100644 --- a/src/OpenColorIO/ops/gradingrgbcurve/GradingRGBCurve.h +++ b/src/OpenColorIO/ops/gradingrgbcurve/GradingRGBCurve.h @@ -1,11 +1,9 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_GRADINGRGBCURVE_H #define INCLUDED_OCIO_GRADINGRGBCURVE_H - #include #include "ops/gradingrgbcurve/GradingBSplineCurve.h" @@ -20,10 +18,11 @@ class GradingRGBCurveImpl : public GradingRGBCurve { public: GradingRGBCurveImpl(GradingStyle style); - GradingRGBCurveImpl(const ConstGradingBSplineCurveRcPtr & red, - const ConstGradingBSplineCurveRcPtr & green, - const ConstGradingBSplineCurveRcPtr & blue, - const ConstGradingBSplineCurveRcPtr & master); + GradingRGBCurveImpl( + const ConstGradingBSplineCurveRcPtr & red, + const ConstGradingBSplineCurveRcPtr & green, + const ConstGradingBSplineCurveRcPtr & blue, + const ConstGradingBSplineCurveRcPtr & master); GradingRGBCurveImpl(const ConstGradingRGBCurveRcPtr & rhs); GradingRGBCurveRcPtr createEditableCopy() const override; @@ -43,6 +42,6 @@ class GradingRGBCurveImpl : public GradingRGBCurve typedef OCIO_SHARED_PTR ConstGradingRGBCurveImplRcPtr; typedef OCIO_SHARED_PTR GradingRGBCurveImplRcPtr; -} +} // namespace OCIO_NAMESPACE -#endif //INCLUDED_OCIO_GRADINGRGBCURVE_H +#endif // INCLUDED_OCIO_GRADINGRGBCURVE_H diff --git a/src/OpenColorIO/ops/gradingrgbcurve/GradingRGBCurveOp.cpp b/src/OpenColorIO/ops/gradingrgbcurve/GradingRGBCurveOp.cpp index 598ae28e67..e18a7252a7 100644 --- a/src/OpenColorIO/ops/gradingrgbcurve/GradingRGBCurveOp.cpp +++ b/src/OpenColorIO/ops/gradingrgbcurve/GradingRGBCurveOp.cpp @@ -7,9 +7,9 @@ #include #include "GpuShaderUtils.h" +#include "ops/gradingrgbcurve/GradingRGBCurveOp.h" #include "ops/gradingrgbcurve/GradingRGBCurveOpCPU.h" #include "ops/gradingrgbcurve/GradingRGBCurveOpGPU.h" -#include "ops/gradingrgbcurve/GradingRGBCurveOp.h" #include "transforms/GradingRGBCurveTransform.h" namespace OCIO_NAMESPACE @@ -25,7 +25,7 @@ typedef OCIO_SHARED_PTR ConstGradingRGBCurveOpRcPtr; class GradingRGBCurveOp : public Op { public: - GradingRGBCurveOp() = delete; + GradingRGBCurveOp() = delete; GradingRGBCurveOp(const GradingRGBCurveOp &) = delete; explicit GradingRGBCurveOp(GradingRGBCurveOpDataRcPtr & prim); @@ -46,8 +46,9 @@ class GradingRGBCurveOp : public Op bool isDynamic() const override; bool hasDynamicProperty(DynamicPropertyType type) const override; DynamicPropertyRcPtr getDynamicProperty(DynamicPropertyType type) const override; - void replaceDynamicProperty(DynamicPropertyType type, - DynamicPropertyGradingRGBCurveImplRcPtr & prop) override; + void replaceDynamicProperty( + DynamicPropertyType type, + DynamicPropertyGradingRGBCurveImplRcPtr & prop) override; void removeDynamicProperties() override; ConstOpCPURcPtr getCPUOp(bool fastLogExpPow) const override; @@ -65,9 +66,8 @@ class GradingRGBCurveOp : public Op } }; - GradingRGBCurveOp::GradingRGBCurveOp(GradingRGBCurveOpDataRcPtr & prim) - : Op() + : Op() { data() = prim; } @@ -101,7 +101,8 @@ bool GradingRGBCurveOp::isSameType(ConstOpRcPtr & op) const bool GradingRGBCurveOp::isInverse(ConstOpRcPtr & op) const { ConstGradingRGBCurveOpRcPtr typedRcPtr = DynamicPtrCast(op); - if (!typedRcPtr) return false; + if (!typedRcPtr) + return false; ConstGradingRGBCurveOpDataRcPtr primOpData = typedRcPtr->rgbCurveData(); return rgbCurveData()->isInverse(primOpData); @@ -159,8 +160,9 @@ DynamicPropertyRcPtr GradingRGBCurveOp::getDynamicProperty(DynamicPropertyType t return rgbCurveData()->getDynamicProperty(); } -void GradingRGBCurveOp::replaceDynamicProperty(DynamicPropertyType type, - DynamicPropertyGradingRGBCurveImplRcPtr & prop) +void GradingRGBCurveOp::replaceDynamicProperty( + DynamicPropertyType type, + DynamicPropertyGradingRGBCurveImplRcPtr & prop) { if (type != DYNAMIC_PROPERTY_GRADING_RGBCURVE) { @@ -196,18 +198,14 @@ void GradingRGBCurveOp::extractGpuShaderInfo(GpuShaderCreatorRcPtr & shaderCreat GetGradingRGBCurveGPUShaderProgram(shaderCreator, data); } - -} // Anon namespace - - - +} // namespace /////////////////////////////////////////////////////////////////////////// - -void CreateGradingRGBCurveOp(OpRcPtrVec & ops, - GradingRGBCurveOpDataRcPtr & curveData, - TransformDirection direction) +void CreateGradingRGBCurveOp( + OpRcPtrVec & ops, + GradingRGBCurveOpDataRcPtr & curveData, + TransformDirection direction) { auto curve = curveData; if (direction == TRANSFORM_DIR_INVERSE) @@ -227,19 +225,20 @@ void CreateGradingRGBCurveTransform(GroupTransformRcPtr & group, ConstOpRcPtr & { throw Exception("CreateGradingRGBCurveTransform: op has to be a GradingRGBCurveOp."); } - auto gcData = DynamicPtrCast(op->data()); + auto gcData = DynamicPtrCast(op->data()); auto gcTransform = GradingRGBCurveTransform::Create(gcData->getStyle()); - auto & data = dynamic_cast(gcTransform.get())->data(); - data = *gcData; + auto & data = dynamic_cast(gcTransform.get())->data(); + data = *gcData; group->appendTransform(gcTransform); } -void BuildGradingRGBCurveOp(OpRcPtrVec & ops, - const Config & /*config*/, - const ConstContextRcPtr & /*context*/, - const GradingRGBCurveTransform & transform, - TransformDirection dir) +void BuildGradingRGBCurveOp( + OpRcPtrVec & ops, + const Config & /*config*/, + const ConstContextRcPtr & /*context*/, + const GradingRGBCurveTransform & transform, + TransformDirection dir) { const auto & data = dynamic_cast(transform).data(); data.validate(); @@ -248,6 +247,4 @@ void BuildGradingRGBCurveOp(OpRcPtrVec & ops, CreateGradingRGBCurveOp(ops, curveData, dir); } - } // namespace OCIO_NAMESPACE - diff --git a/src/OpenColorIO/ops/gradingrgbcurve/GradingRGBCurveOp.h b/src/OpenColorIO/ops/gradingrgbcurve/GradingRGBCurveOp.h index 21e5c310a4..a5737db661 100644 --- a/src/OpenColorIO/ops/gradingrgbcurve/GradingRGBCurveOp.h +++ b/src/OpenColorIO/ops/gradingrgbcurve/GradingRGBCurveOp.h @@ -1,11 +1,9 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_GRADINGRGBCURVE_OP_H #define INCLUDED_OCIO_GRADINGRGBCURVE_OP_H - #include #include @@ -13,13 +11,13 @@ #include "Op.h" #include "ops/gradingrgbcurve/GradingRGBCurveOpData.h" - namespace OCIO_NAMESPACE { -void CreateGradingRGBCurveOp(OpRcPtrVec & ops, - GradingRGBCurveOpDataRcPtr & gpData, - TransformDirection direction); +void CreateGradingRGBCurveOp( + OpRcPtrVec & ops, + GradingRGBCurveOpDataRcPtr & gpData, + TransformDirection direction); // Create a copy of the rgb curve transform in the op and append it to // the GroupTransform. diff --git a/src/OpenColorIO/ops/gradingrgbcurve/GradingRGBCurveOpCPU.cpp b/src/OpenColorIO/ops/gradingrgbcurve/GradingRGBCurveOpCPU.cpp index bf8c73a4b9..0bb35bc4d8 100644 --- a/src/OpenColorIO/ops/gradingrgbcurve/GradingRGBCurveOpCPU.cpp +++ b/src/OpenColorIO/ops/gradingrgbcurve/GradingRGBCurveOpCPU.cpp @@ -9,8 +9,8 @@ #include "BitDepthUtils.h" #include "MathUtils.h" -#include "ops/gradingrgbcurve/GradingRGBCurveOpCPU.h" #include "SSE.h" +#include "ops/gradingrgbcurve/GradingRGBCurveOpCPU.h" namespace OCIO_NAMESPACE { @@ -20,7 +20,7 @@ namespace class GradingRGBCurveOpCPU : public OpCPU { public: - GradingRGBCurveOpCPU() = delete; + GradingRGBCurveOpCPU() = delete; GradingRGBCurveOpCPU(const GradingRGBCurveOpCPU &) = delete; explicit GradingRGBCurveOpCPU(ConstGradingRGBCurveOpDataRcPtr & grgbc); @@ -30,8 +30,8 @@ class GradingRGBCurveOpCPU : public OpCPU DynamicPropertyRcPtr getDynamicProperty(DynamicPropertyType type) const override; protected: - void eval(const GradingBSplineCurveImpl::KnotsCoefs & knotsCoefs, - float * out, const float * in) const + void eval(const GradingBSplineCurveImpl::KnotsCoefs & knotsCoefs, float * out, const float * in) + const { out[0] = knotsCoefs.evalCurve(static_cast(RGB_RED), in[0]); out[1] = knotsCoefs.evalCurve(static_cast(RGB_GREEN), in[1]); @@ -41,8 +41,10 @@ class GradingRGBCurveOpCPU : public OpCPU out[1] = knotsCoefs.evalCurve(static_cast(RGB_MASTER), out[1]); out[2] = knotsCoefs.evalCurve(static_cast(RGB_MASTER), out[2]); } - void evalRev(const GradingBSplineCurveImpl::KnotsCoefs & knotsCoefs, - float * out, const float * in) const + void evalRev( + const GradingBSplineCurveImpl::KnotsCoefs & knotsCoefs, + float * out, + const float * in) const { out[0] = knotsCoefs.evalCurveRev(static_cast(RGB_MASTER), in[0]); out[1] = knotsCoefs.evalCurveRev(static_cast(RGB_MASTER), in[1]); @@ -101,7 +103,7 @@ class GradingRGBCurveFwdOpCPU : public GradingRGBCurveOpCPU { public: GradingRGBCurveFwdOpCPU(const GradingRGBCurveOpCPU &) = delete; - GradingRGBCurveFwdOpCPU() = delete; + GradingRGBCurveFwdOpCPU() = delete; explicit GradingRGBCurveFwdOpCPU(ConstGradingRGBCurveOpDataRcPtr & grgbc); void apply(const void * inImg, void * outImg, long numPixels) const override; @@ -110,7 +112,6 @@ class GradingRGBCurveFwdOpCPU : public GradingRGBCurveOpCPU GradingRGBCurveFwdOpCPU::GradingRGBCurveFwdOpCPU(ConstGradingRGBCurveOpDataRcPtr & grgbc) : GradingRGBCurveOpCPU(grgbc) { - } static constexpr auto PixelSize = 4 * sizeof(float); @@ -127,7 +128,7 @@ void GradingRGBCurveFwdOpCPU::apply(const void * inImg, void * outImg, long numP } const float * in = (float *)inImg; - float * out = (float *)outImg; + float * out = (float *)outImg; for (long idx = 0; idx < numPixels; ++idx) { @@ -143,100 +144,104 @@ void GradingRGBCurveFwdOpCPU::apply(const void * inImg, void * outImg, long numP class GradingRGBCurveLinearFwdOpCPU : public GradingRGBCurveOpCPU { public: - GradingRGBCurveLinearFwdOpCPU() = delete; + GradingRGBCurveLinearFwdOpCPU() = delete; GradingRGBCurveLinearFwdOpCPU(const GradingRGBCurveOpCPU &) = delete; explicit GradingRGBCurveLinearFwdOpCPU(ConstGradingRGBCurveOpDataRcPtr & grgbc); void apply(const void * inImg, void * outImg, long numPixels) const override; }; -GradingRGBCurveLinearFwdOpCPU::GradingRGBCurveLinearFwdOpCPU(ConstGradingRGBCurveOpDataRcPtr & grgbc) +GradingRGBCurveLinearFwdOpCPU::GradingRGBCurveLinearFwdOpCPU( + ConstGradingRGBCurveOpDataRcPtr & grgbc) : GradingRGBCurveOpCPU(grgbc) { - } namespace LogLinConstants { - static constexpr float xbrk = 0.0041318374739483946f; - static constexpr float shift = -0.000157849851665374f; - static constexpr float m = 1.f / (0.18f + shift); - static constexpr float gain = 363.034608563f; - static constexpr float offs = -7.f; - static constexpr float ybrk = -5.5f; +static constexpr float xbrk = 0.0041318374739483946f; +static constexpr float shift = -0.000157849851665374f; +static constexpr float m = 1.f / (0.18f + shift); +static constexpr float gain = 363.034608563f; +static constexpr float offs = -7.f; +static constexpr float ybrk = -5.5f; #if OCIO_USE_SSE2 - const __m128 mxbrk = _mm_set1_ps(xbrk); - const __m128 mshift = _mm_set1_ps(shift); - const __m128 mm = _mm_set1_ps(m); - const __m128 mgain = _mm_set1_ps(gain); - const __m128 moffs = _mm_set1_ps(offs); - const __m128 mybrk = _mm_set1_ps(ybrk); - const __m128 mgainInv = _mm_set1_ps(1.f / gain); - const __m128 mshift018 = _mm_set1_ps(shift + 0.18f); - const __m128 mpower = _mm_set1_ps(2.0f); +const __m128 mxbrk = _mm_set1_ps(xbrk); +const __m128 mshift = _mm_set1_ps(shift); +const __m128 mm = _mm_set1_ps(m); +const __m128 mgain = _mm_set1_ps(gain); +const __m128 moffs = _mm_set1_ps(offs); +const __m128 mybrk = _mm_set1_ps(ybrk); +const __m128 mgainInv = _mm_set1_ps(1.f / gain); +const __m128 mshift018 = _mm_set1_ps(shift + 0.18f); +const __m128 mpower = _mm_set1_ps(2.0f); #else - static constexpr float base2 = 1.4426950408889634f; // 1/log(2) +static constexpr float base2 = 1.4426950408889634f; // 1/log(2) #endif -} +} // namespace LogLinConstants inline void LinLog(const float * in, float * out) { #if OCIO_USE_SSE2 - __m128 pix = _mm_loadu_ps(in); - __m128 flag = _mm_cmpgt_ps(pix, LogLinConstants::mxbrk); + __m128 pix = _mm_loadu_ps(in); + __m128 flag = _mm_cmpgt_ps(pix, LogLinConstants::mxbrk); - __m128 pixLin = _mm_mul_ps(pix, LogLinConstants::mgain); - pixLin = _mm_add_ps(pixLin, LogLinConstants::moffs); + __m128 pixLin = _mm_mul_ps(pix, LogLinConstants::mgain); + pixLin = _mm_add_ps(pixLin, LogLinConstants::moffs); - pix = _mm_add_ps(pix, LogLinConstants::mshift); - pix = _mm_mul_ps(pix, LogLinConstants::mm); - pix = sseLog2(pix); + pix = _mm_add_ps(pix, LogLinConstants::mshift); + pix = _mm_mul_ps(pix, LogLinConstants::mm); + pix = sseLog2(pix); - pix = _mm_or_ps(_mm_and_ps(flag, pix), - _mm_andnot_ps(flag, pixLin)); + pix = _mm_or_ps(_mm_and_ps(flag, pix), _mm_andnot_ps(flag, pixLin)); - _mm_storeu_ps(out, pix); + _mm_storeu_ps(out, pix); #else - out[0] = (in[0] < LogLinConstants::xbrk) ? - in[0] * LogLinConstants::gain + LogLinConstants::offs : - LogLinConstants::base2 * std::log((in[0] + LogLinConstants::shift) * LogLinConstants::m); - out[1] = (in[1] < LogLinConstants::xbrk) ? - in[1] * LogLinConstants::gain + LogLinConstants::offs : - LogLinConstants::base2 * std::log((in[1] + LogLinConstants::shift) * LogLinConstants::m); - out[2] = (in[2] < LogLinConstants::xbrk) ? - in[2] * LogLinConstants::gain + LogLinConstants::offs : - LogLinConstants::base2 * std::log((in[2] + LogLinConstants::shift) * LogLinConstants::m); - out[3] = in[3]; + out[0] = (in[0] < LogLinConstants::xbrk) + ? in[0] * LogLinConstants::gain + LogLinConstants::offs + : LogLinConstants::base2 + * std::log((in[0] + LogLinConstants::shift) * LogLinConstants::m); + out[1] = (in[1] < LogLinConstants::xbrk) + ? in[1] * LogLinConstants::gain + LogLinConstants::offs + : LogLinConstants::base2 + * std::log((in[1] + LogLinConstants::shift) * LogLinConstants::m); + out[2] = (in[2] < LogLinConstants::xbrk) + ? in[2] * LogLinConstants::gain + LogLinConstants::offs + : LogLinConstants::base2 + * std::log((in[2] + LogLinConstants::shift) * LogLinConstants::m); + out[3] = in[3]; #endif } inline void LogLin(float * out) { #if OCIO_USE_SSE2 - __m128 pix = _mm_loadu_ps(out); - __m128 flag = _mm_cmpgt_ps(pix, LogLinConstants::mybrk); + __m128 pix = _mm_loadu_ps(out); + __m128 flag = _mm_cmpgt_ps(pix, LogLinConstants::mybrk); - __m128 pixLin = _mm_sub_ps(pix, LogLinConstants::moffs); - pixLin = _mm_mul_ps(pixLin, LogLinConstants::mgainInv); + __m128 pixLin = _mm_sub_ps(pix, LogLinConstants::moffs); + pixLin = _mm_mul_ps(pixLin, LogLinConstants::mgainInv); - pix = ssePower(LogLinConstants::mpower, pix); - pix = _mm_mul_ps(pix, LogLinConstants::mshift018); - pix = _mm_sub_ps(pix, LogLinConstants::mshift); + pix = ssePower(LogLinConstants::mpower, pix); + pix = _mm_mul_ps(pix, LogLinConstants::mshift018); + pix = _mm_sub_ps(pix, LogLinConstants::mshift); - pix = _mm_or_ps(_mm_and_ps(flag, pix), - _mm_andnot_ps(flag, pixLin)); + pix = _mm_or_ps(_mm_and_ps(flag, pix), _mm_andnot_ps(flag, pixLin)); - _mm_storeu_ps(out, pix); + _mm_storeu_ps(out, pix); #else - out[0] = (out[0] < LogLinConstants::ybrk) ? - (out[0] - LogLinConstants::offs) / LogLinConstants::gain : - std::pow(2.0f, out[0]) * (0.18f + LogLinConstants::shift) - LogLinConstants::shift; - out[1] = (out[1] < LogLinConstants::ybrk) ? - (out[1] - LogLinConstants::offs) / LogLinConstants::gain : - std::pow(2.0f, out[1]) * (0.18f + LogLinConstants::shift) - LogLinConstants::shift; - out[2] = (out[2] < LogLinConstants::ybrk) ? - (out[2] - LogLinConstants::offs) / LogLinConstants::gain : - std::pow(2.0f, out[2]) * (0.18f + LogLinConstants::shift) - LogLinConstants::shift; + out[0] + = (out[0] < LogLinConstants::ybrk) + ? (out[0] - LogLinConstants::offs) / LogLinConstants::gain + : std::pow(2.0f, out[0]) * (0.18f + LogLinConstants::shift) - LogLinConstants::shift; + out[1] + = (out[1] < LogLinConstants::ybrk) + ? (out[1] - LogLinConstants::offs) / LogLinConstants::gain + : std::pow(2.0f, out[1]) * (0.18f + LogLinConstants::shift) - LogLinConstants::shift; + out[2] + = (out[2] < LogLinConstants::ybrk) + ? (out[2] - LogLinConstants::offs) / LogLinConstants::gain + : std::pow(2.0f, out[2]) * (0.18f + LogLinConstants::shift) - LogLinConstants::shift; #endif } @@ -252,7 +257,7 @@ void GradingRGBCurveLinearFwdOpCPU::apply(const void * inImg, void * outImg, lon } const float * in = (float *)inImg; - float * out = (float *)outImg; + float * out = (float *)outImg; for (long idx = 0; idx < numPixels; ++idx) { @@ -274,7 +279,7 @@ class GradingRGBCurveRevOpCPU : public GradingRGBCurveOpCPU { public: GradingRGBCurveRevOpCPU(const GradingRGBCurveOpCPU &) = delete; - GradingRGBCurveRevOpCPU() = delete; + GradingRGBCurveRevOpCPU() = delete; explicit GradingRGBCurveRevOpCPU(ConstGradingRGBCurveOpDataRcPtr & grgbc); void apply(const void * inImg, void * outImg, long numPixels) const override; @@ -297,7 +302,7 @@ void GradingRGBCurveRevOpCPU::apply(const void * inImg, void * outImg, long numP } const float * in = (float *)inImg; - float * out = (float *)outImg; + float * out = (float *)outImg; for (long idx = 0; idx < numPixels; ++idx) { @@ -314,13 +319,14 @@ class GradingRGBCurveLinearRevOpCPU : public GradingRGBCurveRevOpCPU { public: GradingRGBCurveLinearRevOpCPU(const GradingRGBCurveOpCPU &) = delete; - GradingRGBCurveLinearRevOpCPU() = delete; + GradingRGBCurveLinearRevOpCPU() = delete; explicit GradingRGBCurveLinearRevOpCPU(ConstGradingRGBCurveOpDataRcPtr & grgbc); void apply(const void * inImg, void * outImg, long numPixels) const override; }; -GradingRGBCurveLinearRevOpCPU::GradingRGBCurveLinearRevOpCPU(ConstGradingRGBCurveOpDataRcPtr & grgbc) +GradingRGBCurveLinearRevOpCPU::GradingRGBCurveLinearRevOpCPU( + ConstGradingRGBCurveOpDataRcPtr & grgbc) : GradingRGBCurveRevOpCPU(grgbc) { } @@ -337,7 +343,7 @@ void GradingRGBCurveLinearRevOpCPU::apply(const void * inImg, void * outImg, lon } const float * in = (float *)inImg; - float * out = (float *)outImg; + float * out = (float *)outImg; for (long idx = 0; idx < numPixels; ++idx) { @@ -365,30 +371,30 @@ ConstOpCPURcPtr GetGradingRGBCurveCPURenderer(ConstGradingRGBCurveOpDataRcPtr & switch (prim->getDirection()) { - case TRANSFORM_DIR_FORWARD: - { - if (linToLog) + case TRANSFORM_DIR_FORWARD: { - return std::make_shared(prim); + if (linToLog) + { + return std::make_shared(prim); + } + else + { + return std::make_shared(prim); + } + break; } - else + case TRANSFORM_DIR_INVERSE: { - return std::make_shared(prim); + if (linToLog) + { + return std::make_shared(prim); + } + else + { + return std::make_shared(prim); + } + break; } - break; - } - case TRANSFORM_DIR_INVERSE: - { - if (linToLog) - { - return std::make_shared(prim); - } - else - { - return std::make_shared(prim); - } - break; - } } throw Exception("Illegal GradingRGBCurve direction."); diff --git a/src/OpenColorIO/ops/gradingrgbcurve/GradingRGBCurveOpData.cpp b/src/OpenColorIO/ops/gradingrgbcurve/GradingRGBCurveOpData.cpp index d838811bad..a93173b0ad 100644 --- a/src/OpenColorIO/ops/gradingrgbcurve/GradingRGBCurveOpData.cpp +++ b/src/OpenColorIO/ops/gradingrgbcurve/GradingRGBCurveOpData.cpp @@ -5,10 +5,10 @@ #include +#include "Platform.h" #include "ops/gradingrgbcurve/GradingRGBCurve.h" #include "ops/gradingrgbcurve/GradingRGBCurveOpData.h" #include "ops/range/RangeOpData.h" -#include "Platform.h" namespace OCIO_NAMESPACE { @@ -18,22 +18,27 @@ namespace DefaultValues const std::streamsize FLOAT_DECIMALS = 7; ConstGradingBSplineCurveRcPtr Curve(GradingStyle style) { - return style == GRADING_LIN ? GradingRGBCurveImpl::DefaultLin.createEditableCopy() : - GradingRGBCurveImpl::Default.createEditableCopy(); -} + return style == GRADING_LIN ? GradingRGBCurveImpl::DefaultLin.createEditableCopy() + : GradingRGBCurveImpl::Default.createEditableCopy(); } +} // namespace DefaultValues GradingRGBCurveOpData::GradingRGBCurveOpData(GradingStyle style) - : GradingRGBCurveOpData(style, DefaultValues::Curve(style), DefaultValues::Curve(style), - DefaultValues::Curve(style), DefaultValues::Curve(style)) + : GradingRGBCurveOpData( + style, + DefaultValues::Curve(style), + DefaultValues::Curve(style), + DefaultValues::Curve(style), + DefaultValues::Curve(style)) { } -GradingRGBCurveOpData::GradingRGBCurveOpData(GradingStyle style, - ConstGradingBSplineCurveRcPtr red, - ConstGradingBSplineCurveRcPtr green, - ConstGradingBSplineCurveRcPtr blue, - ConstGradingBSplineCurveRcPtr master) +GradingRGBCurveOpData::GradingRGBCurveOpData( + GradingStyle style, + ConstGradingBSplineCurveRcPtr red, + ConstGradingBSplineCurveRcPtr green, + ConstGradingBSplineCurveRcPtr blue, + ConstGradingBSplineCurveRcPtr master) : OpData() , m_style(style) { @@ -53,7 +58,8 @@ GradingRGBCurveOpData::GradingRGBCurveOpData(const GradingRGBCurveOpData & rhs) GradingRGBCurveOpData & GradingRGBCurveOpData::operator=(const GradingRGBCurveOpData & rhs) { - if (this == &rhs) return *this; + if (this == &rhs) + return *this; OpData::operator=(rhs); @@ -93,7 +99,8 @@ bool GradingRGBCurveOpData::isNoOp() const bool GradingRGBCurveOpData::isIdentity() const { - if (isDynamic()) return false; + if (isDynamic()) + return false; return m_value->getValue()->isIdentity(); } @@ -105,9 +112,8 @@ bool GradingRGBCurveOpData::isInverse(ConstGradingRGBCurveOpDataRcPtr & r) const return false; } - if (m_style == r->m_style && - (m_style != GRADING_LIN || m_bypassLinToLog == r->m_bypassLinToLog) && - m_value->equals(*r->m_value)) + if (m_style == r->m_style && (m_style != GRADING_LIN || m_bypassLinToLog == r->m_bypassLinToLog) + && m_value->equals(*r->m_value)) { if (CombineTransformDirections(getDirection(), r->getDirection()) == TRANSFORM_DIR_INVERSE) { @@ -119,7 +125,7 @@ bool GradingRGBCurveOpData::isInverse(ConstGradingRGBCurveOpDataRcPtr & r) const GradingRGBCurveOpDataRcPtr GradingRGBCurveOpData::inverse() const { - auto res = clone(); + auto res = clone(); res->m_direction = GetInverseTransformDirection(m_direction); return res; } @@ -168,7 +174,7 @@ float GradingRGBCurveOpData::getSlope(RGBCurveType c, size_t index) const void GradingRGBCurveOpData::setSlope(RGBCurveType c, size_t index, float slope) { - GradingRGBCurveRcPtr rgbcurve( m_value->getValue()->createEditableCopy() ); + GradingRGBCurveRcPtr rgbcurve(m_value->getValue()->createEditableCopy()); GradingBSplineCurveRcPtr curve = rgbcurve->getCurve(c); curve->setSlope(index, slope); m_value->setValue(rgbcurve); @@ -200,7 +206,8 @@ DynamicPropertyRcPtr GradingRGBCurveOpData::getDynamicProperty() const noexcept return m_value; } -void GradingRGBCurveOpData::replaceDynamicProperty(DynamicPropertyGradingRGBCurveImplRcPtr prop) noexcept +void GradingRGBCurveOpData::replaceDynamicProperty( + DynamicPropertyGradingRGBCurveImplRcPtr prop) noexcept { m_value = prop; } @@ -212,14 +219,13 @@ void GradingRGBCurveOpData::removeDynamicProperty() noexcept bool GradingRGBCurveOpData::equals(const OpData & other) const { - if (!OpData::equals(other)) return false; + if (!OpData::equals(other)) + return false; - const GradingRGBCurveOpData* rop = static_cast(&other); + const GradingRGBCurveOpData * rop = static_cast(&other); - if (m_direction != rop->m_direction || - m_style != rop->m_style || - m_bypassLinToLog != rop->m_bypassLinToLog || - !m_value->equals( *(rop->m_value) )) + if (m_direction != rop->m_direction || m_style != rop->m_style + || m_bypassLinToLog != rop->m_bypassLinToLog || !m_value->equals(*(rop->m_value))) { return false; } diff --git a/src/OpenColorIO/ops/gradingrgbcurve/GradingRGBCurveOpData.h b/src/OpenColorIO/ops/gradingrgbcurve/GradingRGBCurveOpData.h index b391cdecca..edc2ccf97f 100644 --- a/src/OpenColorIO/ops/gradingrgbcurve/GradingRGBCurveOpData.h +++ b/src/OpenColorIO/ops/gradingrgbcurve/GradingRGBCurveOpData.h @@ -1,16 +1,13 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_GRADINGRGBCURVE_OPDATA_H #define INCLUDED_OCIO_GRADINGRGBCURVE_OPDATA_H - #include #include "Op.h" - namespace OCIO_NAMESPACE { @@ -18,17 +15,16 @@ class GradingRGBCurveOpData; typedef OCIO_SHARED_PTR GradingRGBCurveOpDataRcPtr; typedef OCIO_SHARED_PTR ConstGradingRGBCurveOpDataRcPtr; - class GradingRGBCurveOpData : public OpData { public: - explicit GradingRGBCurveOpData(GradingStyle style); - GradingRGBCurveOpData(GradingStyle style, - ConstGradingBSplineCurveRcPtr red, - ConstGradingBSplineCurveRcPtr green, - ConstGradingBSplineCurveRcPtr blue, - ConstGradingBSplineCurveRcPtr master); + GradingRGBCurveOpData( + GradingStyle style, + ConstGradingBSplineCurveRcPtr red, + ConstGradingBSplineCurveRcPtr green, + ConstGradingBSplineCurveRcPtr blue, + ConstGradingBSplineCurveRcPtr master); GradingRGBCurveOpData() = delete; GradingRGBCurveOpData(const GradingRGBCurveOpData & rhs); GradingRGBCurveOpData & operator=(const GradingRGBCurveOpData & rhs); @@ -79,10 +75,10 @@ class GradingRGBCurveOpData : public OpData bool equals(const OpData & other) const override; private: - GradingStyle m_style; + GradingStyle m_style; DynamicPropertyGradingRGBCurveImplRcPtr m_value; - bool m_bypassLinToLog{ false }; - TransformDirection m_direction{ TRANSFORM_DIR_FORWARD }; + bool m_bypassLinToLog{false}; + TransformDirection m_direction{TRANSFORM_DIR_FORWARD}; }; bool operator==(const GradingRGBCurveOpData & lhs, const GradingRGBCurveOpData & rhs); diff --git a/src/OpenColorIO/ops/gradingrgbcurve/GradingRGBCurveOpGPU.cpp b/src/OpenColorIO/ops/gradingrgbcurve/GradingRGBCurveOpGPU.cpp index 3ce01247cf..23db8d761a 100644 --- a/src/OpenColorIO/ops/gradingrgbcurve/GradingRGBCurveOpGPU.cpp +++ b/src/OpenColorIO/ops/gradingrgbcurve/GradingRGBCurveOpGPU.cpp @@ -1,14 +1,12 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #include #include "Logging.h" #include "ops/gradingrgbcurve/GradingRGBCurveOpGPU.h" #include "utils/StringUtils.h" - namespace OCIO_NAMESPACE { @@ -71,19 +69,20 @@ namespace { struct GCProperties { - std::string m_knotsOffsets{ "knotsOffsets" }; - std::string m_knots{ "knots" }; - std::string m_coefsOffsets{ "coefsOffsets" }; - std::string m_coefs{ "coefs" }; - std::string m_localBypass{ "localBypass" }; - std::string m_eval{ "evalBSplineCurve" }; + std::string m_knotsOffsets{"knotsOffsets"}; + std::string m_knots{"knots"}; + std::string m_coefsOffsets{"coefsOffsets"}; + std::string m_coefs{"coefs"}; + std::string m_localBypass{"localBypass"}; + std::string m_eval{"evalBSplineCurve"}; }; -void AddUniform(GpuShaderCreatorRcPtr & shaderCreator, - const GpuShaderCreator::SizeGetter & getSize, - const GpuShaderCreator::VectorFloatGetter & getVector, - unsigned int maxSize, - const std::string & name) +void AddUniform( + GpuShaderCreatorRcPtr & shaderCreator, + const GpuShaderCreator::SizeGetter & getSize, + const GpuShaderCreator::VectorFloatGetter & getVector, + unsigned int maxSize, + const std::string & name) { // Add the uniform if it does not already exist. if (shaderCreator->addUniform(name.c_str(), getSize, getVector)) @@ -95,10 +94,11 @@ void AddUniform(GpuShaderCreatorRcPtr & shaderCreator, } } -void AddUniform(GpuShaderCreatorRcPtr & shaderCreator, - const GpuShaderCreator::SizeGetter & getSize, - const GpuShaderCreator::VectorIntGetter & getVector, - const std::string & name) +void AddUniform( + GpuShaderCreatorRcPtr & shaderCreator, + const GpuShaderCreator::SizeGetter & getSize, + const GpuShaderCreator::VectorIntGetter & getVector, + const std::string & name) { // Add the uniform if it does not already exist. if (shaderCreator->addUniform(name.c_str(), getSize, getVector)) @@ -111,9 +111,10 @@ void AddUniform(GpuShaderCreatorRcPtr & shaderCreator, } } -void AddUniform(GpuShaderCreatorRcPtr & shaderCreator, - const GpuShaderCreator::BoolGetter & getBool, - const std::string & name) +void AddUniform( + GpuShaderCreatorRcPtr & shaderCreator, + const GpuShaderCreator::BoolGetter & getBool, + const std::string & name) { // Add the uniform if it does not already exist. if (shaderCreator->addUniform(name.c_str(), getBool)) @@ -125,10 +126,13 @@ void AddUniform(GpuShaderCreatorRcPtr & shaderCreator, } } -std::string BuildResourceNameIndexed(GpuShaderCreatorRcPtr & shaderCreator, const std::string & prefix, - const std::string & base, unsigned int index) +std::string BuildResourceNameIndexed( + GpuShaderCreatorRcPtr & shaderCreator, + const std::string & prefix, + const std::string & base, + unsigned int index) { - std::string name{ BuildResourceName(shaderCreator, prefix, base) }; + std::string name{BuildResourceName(shaderCreator, prefix, base)}; name += "_"; name += std::to_string(index); // Note: Remove potentially problematic double underscores from GLSL resource names. @@ -136,21 +140,21 @@ std::string BuildResourceNameIndexed(GpuShaderCreatorRcPtr & shaderCreator, cons return name; } -static const std::string opPrefix{ "grading_rgbcurve" }; +static const std::string opPrefix{"grading_rgbcurve"}; void SetGCProperties(GpuShaderCreatorRcPtr & shaderCreator, bool dynamic, GCProperties & propNames) { if (dynamic) { // If there are several dynamic ops, they will use the same names for uniforms. - propNames.m_knotsOffsets = BuildResourceName(shaderCreator, opPrefix, - propNames.m_knotsOffsets); + propNames.m_knotsOffsets + = BuildResourceName(shaderCreator, opPrefix, propNames.m_knotsOffsets); propNames.m_knots = BuildResourceName(shaderCreator, opPrefix, propNames.m_knots); - propNames.m_coefsOffsets = BuildResourceName(shaderCreator, opPrefix, - propNames.m_coefsOffsets); + propNames.m_coefsOffsets + = BuildResourceName(shaderCreator, opPrefix, propNames.m_coefsOffsets); propNames.m_coefs = BuildResourceName(shaderCreator, opPrefix, propNames.m_coefs); - propNames.m_localBypass = BuildResourceName(shaderCreator, opPrefix, - propNames.m_localBypass); + propNames.m_localBypass + = BuildResourceName(shaderCreator, opPrefix, propNames.m_localBypass); propNames.m_eval = BuildResourceName(shaderCreator, opPrefix, propNames.m_eval); } else @@ -158,23 +162,24 @@ void SetGCProperties(GpuShaderCreatorRcPtr & shaderCreator, bool dynamic, GCProp // Non-dynamic ops need an helper function for each op. const auto resIndex = shaderCreator->getNextResourceIndex(); - propNames.m_knotsOffsets = BuildResourceNameIndexed(shaderCreator, opPrefix, - propNames.m_knotsOffsets, resIndex); - propNames.m_knots = BuildResourceNameIndexed(shaderCreator, opPrefix, - propNames.m_knots, resIndex); - propNames.m_coefsOffsets = BuildResourceNameIndexed(shaderCreator, opPrefix, - propNames.m_coefsOffsets, resIndex); - propNames.m_coefs = BuildResourceNameIndexed(shaderCreator, opPrefix, - propNames.m_coefs, resIndex); - propNames.m_eval = BuildResourceNameIndexed(shaderCreator, opPrefix, - propNames.m_eval, resIndex); + propNames.m_knotsOffsets + = BuildResourceNameIndexed(shaderCreator, opPrefix, propNames.m_knotsOffsets, resIndex); + propNames.m_knots + = BuildResourceNameIndexed(shaderCreator, opPrefix, propNames.m_knots, resIndex); + propNames.m_coefsOffsets + = BuildResourceNameIndexed(shaderCreator, opPrefix, propNames.m_coefsOffsets, resIndex); + propNames.m_coefs + = BuildResourceNameIndexed(shaderCreator, opPrefix, propNames.m_coefs, resIndex); + propNames.m_eval + = BuildResourceNameIndexed(shaderCreator, opPrefix, propNames.m_eval, resIndex); } } // Only called once for dynamic ops. -void AddGCPropertiesUniforms(GpuShaderCreatorRcPtr & shaderCreator, - DynamicPropertyGradingRGBCurveImplRcPtr & shaderProp, - const GCProperties & propNames) +void AddGCPropertiesUniforms( + GpuShaderCreatorRcPtr & shaderCreator, + DynamicPropertyGradingRGBCurveImplRcPtr & shaderProp, + const GCProperties & propNames) { // Use the shader dynamic property to bind the uniforms. auto curveProp = shaderProp.get(); @@ -183,32 +188,43 @@ void AddGCPropertiesUniforms(GpuShaderCreatorRcPtr & shaderCreator, // are unique. auto getNK = std::bind(&DynamicPropertyGradingRGBCurveImpl::getNumKnots, curveProp); - auto getKO = std::bind(&DynamicPropertyGradingRGBCurveImpl::getKnotsOffsetsArray, - curveProp); - auto getK = std::bind(&DynamicPropertyGradingRGBCurveImpl::getKnotsArray, curveProp); + auto getKO = std::bind(&DynamicPropertyGradingRGBCurveImpl::getKnotsOffsetsArray, curveProp); + auto getK = std::bind(&DynamicPropertyGradingRGBCurveImpl::getKnotsArray, curveProp); auto getNC = std::bind(&DynamicPropertyGradingRGBCurveImpl::getNumCoefs, curveProp); - auto getCO = std::bind(&DynamicPropertyGradingRGBCurveImpl::getCoefsOffsetsArray, - curveProp); - auto getC = std::bind(&DynamicPropertyGradingRGBCurveImpl::getCoefsArray, curveProp); + auto getCO = std::bind(&DynamicPropertyGradingRGBCurveImpl::getCoefsOffsetsArray, curveProp); + auto getC = std::bind(&DynamicPropertyGradingRGBCurveImpl::getCoefsArray, curveProp); auto getLB = std::bind(&DynamicPropertyGradingRGBCurveImpl::getLocalBypass, curveProp); // Uniforms are added if they are not already there (added by another op). - AddUniform(shaderCreator, DynamicPropertyGradingRGBCurveImpl::GetNumOffsetValues, - getKO, propNames.m_knotsOffsets); - AddUniform(shaderCreator, getNK, getK, - DynamicPropertyGradingRGBCurveImpl::GetMaxKnots(), - propNames.m_knots); - AddUniform(shaderCreator, DynamicPropertyGradingRGBCurveImpl::GetNumOffsetValues, - getCO, propNames.m_coefsOffsets); - AddUniform(shaderCreator, getNC, getC, - DynamicPropertyGradingRGBCurveImpl::GetMaxCoefs(), - propNames.m_coefs); + AddUniform( + shaderCreator, + DynamicPropertyGradingRGBCurveImpl::GetNumOffsetValues, + getKO, + propNames.m_knotsOffsets); + AddUniform( + shaderCreator, + getNK, + getK, + DynamicPropertyGradingRGBCurveImpl::GetMaxKnots(), + propNames.m_knots); + AddUniform( + shaderCreator, + DynamicPropertyGradingRGBCurveImpl::GetNumOffsetValues, + getCO, + propNames.m_coefsOffsets); + AddUniform( + shaderCreator, + getNC, + getC, + DynamicPropertyGradingRGBCurveImpl::GetMaxCoefs(), + propNames.m_coefs); AddUniform(shaderCreator, getLB, propNames.m_localBypass); } -void AddCurveEvalMethodTextToShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, - ConstGradingRGBCurveOpDataRcPtr & gcData, - const GCProperties & props, - bool dyn) +void AddCurveEvalMethodTextToShaderProgram( + GpuShaderCreatorRcPtr & shaderCreator, + ConstGradingRGBCurveOpDataRcPtr & gcData, + const GCProperties & props, + bool dyn) { GpuShaderText st(shaderCreator->getLanguage()); @@ -227,7 +243,8 @@ void AddCurveEvalMethodTextToShaderProgram(GpuShaderCreatorRcPtr & shaderCreator } st.newLine() << ""; - if (shaderCreator->getLanguage() == LANGUAGE_OSL_1 || shaderCreator->getLanguage() == GPU_LANGUAGE_MSL_2_0) + if (shaderCreator->getLanguage() == LANGUAGE_OSL_1 + || shaderCreator->getLanguage() == GPU_LANGUAGE_MSL_2_0) { st.newLine() << st.floatKeyword() << " " << props.m_eval << "(int curveIdx, float x)"; } @@ -239,8 +256,13 @@ void AddCurveEvalMethodTextToShaderProgram(GpuShaderCreatorRcPtr & shaderCreator st.indent(); const bool isInv = gcData->getDirection() == TRANSFORM_DIR_INVERSE; - GradingBSplineCurveImpl::AddShaderEval(st, props.m_knotsOffsets, props.m_coefsOffsets, - props.m_knots, props.m_coefs, isInv); + GradingBSplineCurveImpl::AddShaderEval( + st, + props.m_knotsOffsets, + props.m_coefsOffsets, + props.m_knots, + props.m_coefs, + isInv); st.dedent(); st.newLine() << "}"; @@ -248,12 +270,12 @@ void AddCurveEvalMethodTextToShaderProgram(GpuShaderCreatorRcPtr & shaderCreator shaderCreator->addToHelperShaderCode(st.string().c_str()); } - -void AddGCForwardShader(GpuShaderCreatorRcPtr & shaderCreator, - GpuShaderText & st, - const GCProperties & props, - bool dyn, - bool doLinToLog) +void AddGCForwardShader( + GpuShaderCreatorRcPtr & shaderCreator, + GpuShaderText & st, + const GCProperties & props, + bool dyn, + bool doLinToLog) { if (dyn) { @@ -297,11 +319,12 @@ void AddGCForwardShader(GpuShaderCreatorRcPtr & shaderCreator, } } -void AddGCInverseShader(GpuShaderCreatorRcPtr & shaderCreator, - GpuShaderText & st, - const GCProperties & props, - bool dyn, - bool doLinToLog) +void AddGCInverseShader( + GpuShaderCreatorRcPtr & shaderCreator, + GpuShaderText & st, + const GCProperties & props, + bool dyn, + bool doLinToLog) { if (dyn) { @@ -344,12 +367,13 @@ void AddGCInverseShader(GpuShaderCreatorRcPtr & shaderCreator, } } -} +} // namespace -void GetGradingRGBCurveGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, - ConstGradingRGBCurveOpDataRcPtr & gcData) +void GetGradingRGBCurveGPUShaderProgram( + GpuShaderCreatorRcPtr & shaderCreator, + ConstGradingRGBCurveOpDataRcPtr & gcData) { - const bool dyn = gcData->isDynamic() && shaderCreator->getLanguage() != LANGUAGE_OSL_1; + const bool dyn = gcData->isDynamic() && shaderCreator->getLanguage() != LANGUAGE_OSL_1; if (!dyn) { auto propGC = gcData->getDynamicPropertyInternal(); @@ -361,7 +385,7 @@ void GetGradingRGBCurveGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, if (gcData->isDynamic() && shaderCreator->getLanguage() == LANGUAGE_OSL_1) { - std::string msg("The dynamic properties are not yet supported by the 'Open Shading language"\ + std::string msg("The dynamic properties are not yet supported by the 'Open Shading language" " (OSL)' translation: The '"); msg += opPrefix; msg += "' dynamic property is replaced by a local variable."; @@ -369,15 +393,14 @@ void GetGradingRGBCurveGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, LogWarning(msg); } - const GradingStyle style = gcData->getStyle(); + const GradingStyle style = gcData->getStyle(); const TransformDirection dir = gcData->getDirection(); GpuShaderText st(shaderCreator->getLanguage()); st.indent(); st.newLine() << ""; - st.newLine() << "// Add GradingRGBCurve '" - << GradingStyleToString(style) << "' " + st.newLine() << "// Add GradingRGBCurve '" << GradingStyleToString(style) << "' " << TransformDirectionToString(dir) << " processing"; st.newLine() << ""; st.newLine() << "{"; @@ -392,7 +415,7 @@ void GetGradingRGBCurveGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, auto prop = gcData->getDynamicPropertyInternal(); // Property is decoupled. - auto shaderProp = prop->createEditableCopy(); + auto shaderProp = prop->createEditableCopy(); DynamicPropertyRcPtr newProp = shaderProp; shaderCreator->addDynamicProperty(newProp); @@ -411,12 +434,12 @@ void GetGradingRGBCurveGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, const bool doLinToLog = (style == GRADING_LIN) && !gcData->getBypassLinToLog(); switch (dir) { - case TRANSFORM_DIR_FORWARD: - AddGCForwardShader(shaderCreator, st, properties, dyn, doLinToLog); - break; - case TRANSFORM_DIR_INVERSE: - AddGCInverseShader(shaderCreator, st, properties, dyn, doLinToLog); - break; + case TRANSFORM_DIR_FORWARD: + AddGCForwardShader(shaderCreator, st, properties, dyn, doLinToLog); + break; + case TRANSFORM_DIR_INVERSE: + AddGCInverseShader(shaderCreator, st, properties, dyn, doLinToLog); + break; } st.dedent(); @@ -426,4 +449,4 @@ void GetGradingRGBCurveGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, shaderCreator->addToFunctionShaderCode(st.string().c_str()); } -} // OCIO_NAMESPACE +} // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/ops/gradingrgbcurve/GradingRGBCurveOpGPU.h b/src/OpenColorIO/ops/gradingrgbcurve/GradingRGBCurveOpGPU.h index 4c9d0cb1f4..7c39ca7faa 100644 --- a/src/OpenColorIO/ops/gradingrgbcurve/GradingRGBCurveOpGPU.h +++ b/src/OpenColorIO/ops/gradingrgbcurve/GradingRGBCurveOpGPU.h @@ -12,11 +12,10 @@ namespace OCIO_NAMESPACE { -void GetGradingRGBCurveGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, - ConstGradingRGBCurveOpDataRcPtr & gpData); +void GetGradingRGBCurveGPUShaderProgram( + GpuShaderCreatorRcPtr & shaderCreator, + ConstGradingRGBCurveOpDataRcPtr & gpData); } // namespace OCIO_NAMESPACE #endif - - diff --git a/src/OpenColorIO/ops/gradingtone/GradingTone.cpp b/src/OpenColorIO/ops/gradingtone/GradingTone.cpp index 932b0a6d14..465e9b6895 100644 --- a/src/OpenColorIO/ops/gradingtone/GradingTone.cpp +++ b/src/OpenColorIO/ops/gradingtone/GradingTone.cpp @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #include #include @@ -14,9 +13,9 @@ namespace OCIO_NAMESPACE bool operator==(const GradingRGBMSW & lhs, const GradingRGBMSW & rhs) { - return lhs.m_red == rhs.m_red && lhs.m_green == rhs.m_green && - lhs.m_blue == rhs.m_blue && lhs.m_master == rhs.m_master && - lhs.m_start == rhs.m_start && lhs.m_width == rhs.m_width; + return lhs.m_red == rhs.m_red && lhs.m_green == rhs.m_green && lhs.m_blue == rhs.m_blue + && lhs.m_master == rhs.m_master && lhs.m_start == rhs.m_start + && lhs.m_width == rhs.m_width; } bool operator!=(const GradingRGBMSW & lhs, const GradingRGBMSW & rhs) @@ -26,12 +25,9 @@ bool operator!=(const GradingRGBMSW & lhs, const GradingRGBMSW & rhs) bool operator==(const GradingTone & lhs, const GradingTone & rhs) { - return lhs.m_blacks == rhs.m_blacks && - lhs.m_whites == rhs.m_whites && - lhs.m_highlights == rhs.m_highlights && - lhs.m_midtones == rhs.m_midtones && - lhs.m_shadows == rhs.m_shadows && - lhs.m_scontrast == rhs.m_scontrast; + return lhs.m_blacks == rhs.m_blacks && lhs.m_whites == rhs.m_whites + && lhs.m_highlights == rhs.m_highlights && lhs.m_midtones == rhs.m_midtones + && lhs.m_shadows == rhs.m_shadows && lhs.m_scontrast == rhs.m_scontrast; } bool operator!=(const GradingTone & lhs, const GradingTone & rhs) @@ -41,7 +37,7 @@ bool operator!=(const GradingTone & lhs, const GradingTone & rhs) void GradingTone::validate() const { - // Client app is expected to limit these to these stated bounds. + // Client app is expected to limit these to these stated bounds. // // Blacks, mids, whites: [0.1, 1.9] // Shadows, highlights: [0.2, 1.8] @@ -54,7 +50,7 @@ void GradingTone::validate() const static constexpr double MinWSC = 0.01; static constexpr double MaxSC = 1.99; // The bounds are widened here slightly to avoid failures due to precision issues. - static constexpr double Error = 0.000001; + static constexpr double Error = 0.000001; static constexpr double MinBMWTol = MinBMW - Error; static constexpr double MaxBMWTol = MaxBMW + Error; static constexpr double MinSHTol = MinSH - Error; @@ -65,10 +61,8 @@ void GradingTone::validate() const { const auto & bd = m_blacks; - if (bd.m_red < MinBMWTol || - bd.m_green < MinBMWTol || - bd.m_blue < MinBMWTol || - bd.m_master < MinBMWTol) + if (bd.m_red < MinBMWTol || bd.m_green < MinBMWTol || bd.m_blue < MinBMWTol + || bd.m_master < MinBMWTol) { std::ostringstream oss; oss << "GradingTone blacks '" << bd << "' are below lower bound (" << MinBMW << ")."; @@ -81,10 +75,8 @@ void GradingTone::validate() const << MinWSC << ")."; throw Exception(oss.str().c_str()); } - if (bd.m_red > MaxBMWTol || - bd.m_green > MaxBMWTol || - bd.m_blue > MaxBMWTol || - bd.m_master > MaxBMWTol) + if (bd.m_red > MaxBMWTol || bd.m_green > MaxBMWTol || bd.m_blue > MaxBMWTol + || bd.m_master > MaxBMWTol) { std::ostringstream oss; oss << "GradingTone blacks '" << bd << "' are above upper bound (" << MaxBMW << ")."; @@ -94,14 +86,12 @@ void GradingTone::validate() const { const auto & midtones = m_midtones; - if (midtones.m_red < MinBMWTol || - midtones.m_green < MinBMWTol || - midtones.m_blue < MinBMWTol || - midtones.m_master < MinBMWTol) + if (midtones.m_red < MinBMWTol || midtones.m_green < MinBMWTol + || midtones.m_blue < MinBMWTol || midtones.m_master < MinBMWTol) { std::ostringstream oss; - oss << "GradingTone midtones '" << midtones << "' are below lower bound (" - << MinBMW << ")."; + oss << "GradingTone midtones '" << midtones << "' are below lower bound (" << MinBMW + << ")."; throw Exception(oss.str().c_str()); } if (midtones.m_width < MinWSCTol) @@ -111,28 +101,23 @@ void GradingTone::validate() const << MinWSC << ")."; throw Exception(oss.str().c_str()); } - if (midtones.m_red > MaxBMWTol || - midtones.m_green > MaxBMWTol || - midtones.m_blue > MaxBMWTol || - midtones.m_master > MaxBMWTol) + if (midtones.m_red > MaxBMWTol || midtones.m_green > MaxBMWTol + || midtones.m_blue > MaxBMWTol || midtones.m_master > MaxBMWTol) { std::ostringstream oss; - oss << "GradingTone midtones '" << midtones << "' are above upper bound (" - << MaxBMW << ")."; + oss << "GradingTone midtones '" << midtones << "' are above upper bound (" << MaxBMW + << ")."; throw Exception(oss.str().c_str()); } } { const auto & dw = m_whites; - if (dw.m_red < MinBMWTol || - dw.m_green < MinBMWTol || - dw.m_blue < MinBMWTol || - dw.m_master < MinBMWTol) + if (dw.m_red < MinBMWTol || dw.m_green < MinBMWTol || dw.m_blue < MinBMWTol + || dw.m_master < MinBMWTol) { std::ostringstream oss; - oss << "GradingTone whites '" << dw << "' are below lower bound (" - << MinBMW << ")."; + oss << "GradingTone whites '" << dw << "' are below lower bound (" << MinBMW << ")."; throw Exception(oss.str().c_str()); } if (dw.m_width < MinWSCTol) @@ -142,28 +127,23 @@ void GradingTone::validate() const << MinWSC << ")."; throw Exception(oss.str().c_str()); } - if (dw.m_red > MaxBMWTol || - dw.m_green > MaxBMWTol || - dw.m_blue > MaxBMWTol || - dw.m_master > MaxBMWTol) + if (dw.m_red > MaxBMWTol || dw.m_green > MaxBMWTol || dw.m_blue > MaxBMWTol + || dw.m_master > MaxBMWTol) { std::ostringstream oss; - oss << "GradingTone white '" << dw << "' are above upper bound (" - << MaxBMW << ")."; + oss << "GradingTone white '" << dw << "' are above upper bound (" << MaxBMW << ")."; throw Exception(oss.str().c_str()); } } { const auto & shadows = m_shadows; - if (shadows.m_red < MinSHTol || - shadows.m_green < MinSHTol || - shadows.m_blue < MinSHTol || - shadows.m_master < MinSHTol) + if (shadows.m_red < MinSHTol || shadows.m_green < MinSHTol || shadows.m_blue < MinSHTol + || shadows.m_master < MinSHTol) { std::ostringstream oss; - oss << "GradingTone shadows '" << shadows << "' are below lower bound (" - << MinSH << ")."; + oss << "GradingTone shadows '" << shadows << "' are below lower bound (" << MinSH + << ")."; throw Exception(oss.str().c_str()); } // Check that pivot is not overlapping start. @@ -174,28 +154,23 @@ void GradingTone::validate() const << shadows.m_width << "' + " << MinWSC << ")."; throw Exception(oss.str().c_str()); } - if (shadows.m_red > MaxSHTol || - shadows.m_green > MaxSHTol || - shadows.m_blue > MaxSHTol || - shadows.m_master > MaxSHTol) + if (shadows.m_red > MaxSHTol || shadows.m_green > MaxSHTol || shadows.m_blue > MaxSHTol + || shadows.m_master > MaxSHTol) { std::ostringstream oss; - oss << "GradingTone shadows '" << shadows << "' are above upper bound (" - << MaxSH << ")."; + oss << "GradingTone shadows '" << shadows << "' are above upper bound (" << MaxSH + << ")."; throw Exception(oss.str().c_str()); } } { const auto & hl = m_highlights; - if (hl.m_red < MinSHTol || - hl.m_green < MinSHTol || - hl.m_blue < MinSHTol || - hl.m_master < MinSHTol) + if (hl.m_red < MinSHTol || hl.m_green < MinSHTol || hl.m_blue < MinSHTol + || hl.m_master < MinSHTol) { std::ostringstream oss; - oss << "GradingTone highlights '" << hl << "' are below lower bound (" - << MinSH << ")."; + oss << "GradingTone highlights '" << hl << "' are below lower bound (" << MinSH << ")."; throw Exception(oss.str().c_str()); } // Check that pivot is not overlapping start. @@ -206,14 +181,11 @@ void GradingTone::validate() const << hl.m_width << "' - " << MinWSC << ")."; throw Exception(oss.str().c_str()); } - if (hl.m_red > MaxSHTol || - hl.m_green > MaxSHTol || - hl.m_blue > MaxSHTol || - hl.m_master > MaxSHTol) + if (hl.m_red > MaxSHTol || hl.m_green > MaxSHTol || hl.m_blue > MaxSHTol + || hl.m_master > MaxSHTol) { std::ostringstream oss; - oss << "GradingTone highlights '" << hl << "' are above upper bound (" - << MaxSH << ")."; + oss << "GradingTone highlights '" << hl << "' are above upper bound (" << MaxSH << ")."; throw Exception(oss.str().c_str()); } } @@ -221,15 +193,15 @@ void GradingTone::validate() const if (m_scontrast < MinWSCTol) { std::ostringstream oss; - oss << "GradingTone s-contrast '" << m_scontrast << "' is below lower bound (" - << MinWSC << ")."; + oss << "GradingTone s-contrast '" << m_scontrast << "' is below lower bound (" << MinWSC + << ")."; throw Exception(oss.str().c_str()); } if (m_scontrast > MaxSCTol) { std::ostringstream oss; - oss << "GradingTone s-contrast '" << m_scontrast << "' is above upper bound (" - << MaxSC << ")."; + oss << "GradingTone s-contrast '" << m_scontrast << "' is above upper bound (" << MaxSC + << ")."; throw Exception(oss.str().c_str()); } } @@ -262,13 +234,13 @@ bool IsIdentity(const GradingRGBMSW & val) { return val.m_red == 1. && val.m_green == 1. && val.m_blue == 1. && val.m_master == 1.; } -} +} // namespace bool IsIdentity(const GradingTone & value) { - return IsIdentity(value.m_blacks) && IsIdentity(value.m_shadows) && - IsIdentity(value.m_midtones) && IsIdentity(value.m_highlights) && - IsIdentity(value.m_whites) && value.m_scontrast == 1.; + return IsIdentity(value.m_blacks) && IsIdentity(value.m_shadows) && IsIdentity(value.m_midtones) + && IsIdentity(value.m_highlights) && IsIdentity(value.m_whites) + && value.m_scontrast == 1.; } GradingTonePreRender::GradingTonePreRender(GradingStyle style) @@ -276,31 +248,35 @@ GradingTonePreRender::GradingTonePreRender(GradingStyle style) setStyle(style); } -void GradingTonePreRender::FromStyle(GradingStyle style, float & top, float & topSC, - float & bottom, float & pivot) +void GradingTonePreRender::FromStyle( + GradingStyle style, + float & top, + float & topSC, + float & bottom, + float & pivot) { switch (style) { - case GRADING_LOG: - top = 1.f; // Might like to move these for ACES, but cannot for ARRI K1S1. - topSC = 1.f; - bottom = 0.f; - pivot = 0.4f; - break; - case GRADING_LIN: - top = 7.5; - topSC = 6.5; - bottom = -5.5f; // place at breakpoint of lin-to-log. - pivot = 0.f; - break; - case GRADING_VIDEO: - top = 1.f; - topSC = 1.f; - bottom = 0.f; - pivot = 0.4f; // aces 0.18 --> 0.39. - break; - default: - break; + case GRADING_LOG: + top = 1.f; // Might like to move these for ACES, but cannot for ARRI K1S1. + topSC = 1.f; + bottom = 0.f; + pivot = 0.4f; + break; + case GRADING_LIN: + top = 7.5; + topSC = 6.5; + bottom = -5.5f; // place at breakpoint of lin-to-log. + pivot = 0.f; + break; + case GRADING_VIDEO: + top = 1.f; + topSC = 1.f; + bottom = 0.f; + pivot = 0.4f; // aces 0.18 --> 0.39. + break; + default: + break; } } @@ -308,55 +284,71 @@ void GradingTonePreRender::setStyle(GradingStyle style) { if (m_style != style) { - m_style = style; - FromStyle(style, m_top, m_topSC, m_bottom, m_pivot); -} + m_style = style; + FromStyle(style, m_top, m_topSC, m_bottom, m_pivot); + } } namespace { -double FauxCubicFwdEval(double t, double x0, double x2, double y0, double y2, - double m0, double m2, double x1) +double FauxCubicFwdEval( + double t, + double x0, + double x2, + double y0, + double y2, + double m0, + double m2, + double x1) { - const double y1 = (0.5 / ((x2 - x1) + (x1 - x0))) * - ((2.*y0 + m0*(x1 - x0)) * (x2 - x1) + (2.*y2 - m2 * (x2 - x1)) * (x1 - x0)); + const double y1 + = (0.5 / ((x2 - x1) + (x1 - x0))) + * ((2. * y0 + m0 * (x1 - x0)) * (x2 - x1) + (2. * y2 - m2 * (x2 - x1)) * (x1 - x0)); const double tL = (t - x0) / (x1 - x0); const double tR = (t - x1) / (x2 - x1); - const double fL = y0 * (1. - tL*tL) + y1 * tL*tL + m0 * (1. - tL) * tL * (x1 - x0); - const double fR = y1 * (1. - tR) * (1. - tR) + y2 * (2. - tR)*tR + - m2 * (tR - 1.) * tR * (x2 - x1); + const double fL = y0 * (1. - tL * tL) + y1 * tL * tL + m0 * (1. - tL) * tL * (x1 - x0); + const double fR + = y1 * (1. - tR) * (1. - tR) + y2 * (2. - tR) * tR + m2 * (tR - 1.) * tR * (x2 - x1); double res = (t < x1) ? fL : fR; - res = (t < x0) ? y0 + (t - x0) * m0 : res; - res = (t > x2) ? y2 + (t - x2) * m2 : res; + res = (t < x0) ? y0 + (t - x0) * m0 : res; + res = (t > x2) ? y2 + (t - x2) * m2 : res; return res; } -double FauxCubicRevEval(double t, double x0, double x2, double y0, double y2, - double m0, double m2, double x1) +double FauxCubicRevEval( + double t, + double x0, + double x2, + double y0, + double y2, + double m0, + double m2, + double x1) { - const double y1 = (0.5 / ((x2 - x1) + (x1 - x0))) * - ((2.*y0 + m0*(x1 - x0)) * (x2 - x1) + (2.*y2 - m2 * (x2 - x1)) * (x1 - x0)); + const double y1 + = (0.5 / ((x2 - x1) + (x1 - x0))) + * ((2. * y0 + m0 * (x1 - x0)) * (x2 - x1) + (2. * y2 - m2 * (x2 - x1)) * (x1 - x0)); - const double cL = y0 - t; - const double bL = m0 * (x1 - x0); - const double aL = y1 - y0 - m0 * (x1 - x0); + const double cL = y0 - t; + const double bL = m0 * (x1 - x0); + const double aL = y1 - y0 - m0 * (x1 - x0); const double discrimL = sqrt(bL * bL - 4. * aL * cL); - const double tmpL = (2. * cL) / (-discrimL - bL); - const double outL = tmpL * (x1 - x0) + x0; + const double tmpL = (2. * cL) / (-discrimL - bL); + const double outL = tmpL * (x1 - x0) + x0; - const double cR = y1 - t; - const double bR = 2.*y2 - 2.*y1 - m2 * (x2 - x1); - const double aR = y1 - y2 + m2 * (x2 - x1); + const double cR = y1 - t; + const double bR = 2. * y2 - 2. * y1 - m2 * (x2 - x1); + const double aR = y1 - y2 + m2 * (x2 - x1); const double discrimR = sqrt(bR * bR - 4. * aR * cR); - const double tmpR = (2. * cR) / (-discrimR - bR); - const double outR = tmpR * (x2 - x1) + x1; + const double tmpR = (2. * cR) / (-discrimR - bR); + const double outR = tmpR * (x2 - x1) + x1; double res = (t < y1) ? outL : outR; - res = (t < y0) ? x0 + (t - y0) / m0 : res; - res = (t > y2) ? x2 + (t - y2) / m2 : res; + res = (t < y0) ? x0 + (t - y0) / m0 : res; + res = (t > y2) ? x2 + (t - y2) / m2 : res; return res; } @@ -368,7 +360,7 @@ double HighlightFwdEval(double t, double start, double pivot, double val) const double y2 = x2; const double m0 = 1.; const double x1 = x0 + (x2 - x0) * 0.5; - val = 2. - val; + val = 2. - val; if (val <= 1.) { const double m2 = (val < 0.01) ? 0.01 : val; @@ -400,11 +392,12 @@ double ShadowFwdEval(double t, double start, double pivot, double val) return FauxCubicRevEval(t, x0, x2, y0, y2, m0, m2, x1); } } -} +} // namespace void GradingTonePreRender::update(const GradingTone & v) { m_localBypass = IsIdentity(v); - if (m_localBypass) return; + if (m_localBypass) + return; { const double master = v.m_highlights.m_master; @@ -416,10 +409,10 @@ void GradingTonePreRender::update(const GradingTone & v) m_highlightsStart = (start > pivot - 0.01) ? pivot - 0.01 : start; m_highlightsWidth = pivot; - const double new_start = HighlightFwdEval(startw, m_highlightsStart, m_highlightsWidth, - master); - const double new_end = HighlightFwdEval(startw + widthw, m_highlightsStart, - m_highlightsWidth, master); + const double new_start + = HighlightFwdEval(startw, m_highlightsStart, m_highlightsWidth, master); + const double new_end + = HighlightFwdEval(startw + widthw, m_highlightsStart, m_highlightsWidth, master); m_whitesStart = new_start; m_whitesWidth = new_end - new_start; } @@ -434,13 +427,12 @@ void GradingTonePreRender::update(const GradingTone & v) m_shadowsWidth = pivot; const double new_start = ShadowFwdEval(startb, m_shadowsWidth, m_shadowsStart, master); - const double new_end = ShadowFwdEval(startb - widthb, m_shadowsWidth, m_shadowsStart, - master); + const double new_end + = ShadowFwdEval(startb - widthb, m_shadowsWidth, m_shadowsStart, master); m_blacksStart = new_start; m_blacksWidth = new_start - new_end; } - mids_precompute(v, m_top, m_bottom); highlightShadow_precompute(v); whiteBlack_precompute(v); @@ -451,7 +443,7 @@ void GradingTonePreRender::mids_precompute(const GradingTone & v, float top, flo { static constexpr float halo = 0.4f; - for (const auto channel : { R, G, B, M }) + for (const auto channel : {R, G, B, M}) { auto & x0 = m_midX[channel][0]; auto & x1 = m_midX[channel][1]; @@ -483,8 +475,8 @@ void GradingTonePreRender::mids_precompute(const GradingTone & v, float top, flo const float width = Clamp(static_cast(v.m_midtones.m_width), 0.01f, max_width); const float min_cent = x0 + width * 0.51f; const float max_cent = x5 - width * 0.51f; - const float center = Clamp(static_cast(v.m_midtones.m_start), min_cent, - max_cent); + const float center + = Clamp(static_cast(v.m_midtones.m_start), min_cent, max_cent); x1 = center - width * 0.5f; x4 = x1 + width; @@ -507,19 +499,21 @@ void GradingTonePreRender::mids_precompute(const GradingTone & v, float top, flo if (center <= (x5 + x0) * 0.5f) { - const float area = (x1 - x0) * (m1 - m0) * 0.5f + - (x2 - x1) * ((m1 - m0) + (m2 - m1) * 0.5f) + - (center - x2) * (m2 - m0) * 0.5f; - m4 = (-0.5f * (x5 - x4) * m5 + (x4 - x3) * (0.5f * m3 - m5) + - (x3 - center) * (m3 - m5) * 0.5f + area) / (-0.5f * (x5 - x3)); + const float area = (x1 - x0) * (m1 - m0) * 0.5f + + (x2 - x1) * ((m1 - m0) + (m2 - m1) * 0.5f) + + (center - x2) * (m2 - m0) * 0.5f; + m4 = (-0.5f * (x5 - x4) * m5 + (x4 - x3) * (0.5f * m3 - m5) + + (x3 - center) * (m3 - m5) * 0.5f + area) + / (-0.5f * (x5 - x3)); } else { - const float area = (x5 - x4) * (m4 - m5) * 0.5f + - (x4 - x3) * ((m4 - m5) + (m3 - m4) * 0.5f) + - (x3 - center) * (m3 - m5) * 0.5f; - m1 = (-0.5f * (x1 - x0) * m0 + (x2 - x1) * (0.5f * m2 - m0) + - (center - x2) * (m2 - m0) * 0.5f + area) / (-0.5f * (x2 - x0)); + const float area = (x5 - x4) * (m4 - m5) * 0.5f + + (x4 - x3) * ((m4 - m5) + (m3 - m4) * 0.5f) + + (x3 - center) * (m3 - m5) * 0.5f; + m1 = (-0.5f * (x1 - x0) * m0 + (x2 - x1) * (0.5f * m2 - m0) + + (center - x2) * (m2 - m0) * 0.5f + area) + / (-0.5f * (x2 - x0)); } y1 = y0 + (m0 + m1) * (x1 - x0) * 0.5f; @@ -533,9 +527,9 @@ void GradingTonePreRender::mids_precompute(const GradingTone & v, float top, flo void GradingTonePreRender::highlightShadow_precompute(const GradingTone & v) { - for (const auto isShadow : { false, true }) + for (const auto isShadow : {false, true}) { - for (const auto channel : { R, G, B, M }) + for (const auto channel : {R, G, B, M}) { auto & x0 = m_hsX[isShadow ? 1 : 0][channel][0]; auto & x1 = m_hsX[isShadow ? 1 : 0][channel][1]; @@ -546,38 +540,40 @@ void GradingTonePreRender::highlightShadow_precompute(const GradingTone & v) auto & m0 = m_hsM[isShadow ? 1 : 0][channel][0]; auto & m2 = m_hsM[isShadow ? 1 : 0][channel][1]; - float val = isShadow ? GetChannelValue(v.m_shadows, channel) : - GetChannelValue(v.m_highlights, channel); + float val = isShadow ? GetChannelValue(v.m_shadows, channel) + : GetChannelValue(v.m_highlights, channel); if (!isShadow) { val = 2.f - val; } if (val != 1.f) { - const float start = static_cast(isShadow ? m_shadowsStart : - m_highlightsStart); - const float pivot = static_cast(isShadow ? m_shadowsWidth : - m_highlightsWidth); - + const float start + = static_cast(isShadow ? m_shadowsStart : m_highlightsStart); + const float pivot + = static_cast(isShadow ? m_shadowsWidth : m_highlightsWidth); + x0 = isShadow ? pivot : start; x2 = isShadow ? start : pivot; y0 = x0; y2 = x2; x1 = x0 + (x2 - x0) * 0.5f; - + if (val < 1.f) { m0 = isShadow ? std::max(0.01f, val) : 1.f; m2 = isShadow ? 1.f : std::max(0.01f, val); - y1 = (0.5f / (x2 - x0)) * ((2.f * y0 + m0 * (x1 - x0)) * (x2 - x1) + - (2.f * y2 - m2 * (x2 - x1)) * (x1 - x0)); + y1 = (0.5f / (x2 - x0)) + * ((2.f * y0 + m0 * (x1 - x0)) * (x2 - x1) + + (2.f * y2 - m2 * (x2 - x1)) * (x1 - x0)); } else if (val > 1.f) { m0 = isShadow ? std::max(0.01f, 2.f - val) : 1.f; m2 = isShadow ? 1.f : std::max(0.01f, 2.f - val); - y1 = (0.5f / ((x2 - x1) + (x1 - x0))) * ((2.f*y0 + m0 * (x1 - x0)) * (x2 - x1) + - (2.f*y2 - m2 * (x2 - x1)) * (x1 - x0)); + y1 = (0.5f / ((x2 - x1) + (x1 - x0))) + * ((2.f * y0 + m0 * (x1 - x0)) * (x2 - x1) + + (2.f * y2 - m2 * (x2 - x1)) * (x1 - x0)); } } } @@ -586,25 +582,23 @@ void GradingTonePreRender::highlightShadow_precompute(const GradingTone & v) void GradingTonePreRender::whiteBlack_precompute(const GradingTone & v) { - for (const auto isBlack : { false, true }) + for (const auto isBlack : {false, true}) { - for (const auto channel : { R, G, B, M }) + for (const auto channel : {R, G, B, M}) { - auto & x0 = m_wbX[isBlack ? 1 : 0][channel][0]; - auto & x1 = m_wbX[isBlack ? 1 : 0][channel][1]; - auto & y0 = m_wbY[isBlack ? 1 : 0][channel][0]; - auto & y1 = m_wbY[isBlack ? 1 : 0][channel][1]; - auto & m0 = m_wbM[isBlack ? 1 : 0][channel][0]; - auto & m1 = m_wbM[isBlack ? 1 : 0][channel][1]; + auto & x0 = m_wbX[isBlack ? 1 : 0][channel][0]; + auto & x1 = m_wbX[isBlack ? 1 : 0][channel][1]; + auto & y0 = m_wbY[isBlack ? 1 : 0][channel][0]; + auto & y1 = m_wbY[isBlack ? 1 : 0][channel][1]; + auto & m0 = m_wbM[isBlack ? 1 : 0][channel][0]; + auto & m1 = m_wbM[isBlack ? 1 : 0][channel][1]; auto & gain = m_wbGain[isBlack ? 1 : 0][channel]; - const float start = static_cast(isBlack ? m_blacksStart : - m_whitesStart); - const float width = static_cast(isBlack ? m_blacksWidth : - m_whitesWidth); + const float start = static_cast(isBlack ? m_blacksStart : m_whitesStart); + const float width = static_cast(isBlack ? m_blacksWidth : m_whitesWidth); - float val = isBlack ? GetChannelValue(v.m_blacks, channel) : - GetChannelValue(v.m_whites, channel); + float val = isBlack ? GetChannelValue(v.m_blacks, channel) + : GetChannelValue(v.m_whites, channel); x0 = (!isBlack) ? start : start - width; x1 = (!isBlack) ? x0 + width : start; @@ -619,7 +613,7 @@ void GradingTonePreRender::whiteBlack_precompute(const GradingTone & v) { m0 = 1.f; m1 = std::max(0.01f, val); - y0 = x0; // for !isBlack + y0 = x0; // for !isBlack y1 = y0 + (m0 + m1) * (x1 - x0) * 0.5f; } else @@ -627,10 +621,9 @@ void GradingTonePreRender::whiteBlack_precompute(const GradingTone & v) m0 = 2.f - val; m0 = std::max(0.01f, m0); m1 = 1.f; - y1 = x1; // for isBlack + y1 = x1; // for isBlack y0 = y1 - (m0 + m1) * (x1 - x0) * 0.5f; } - } else if (mtest > 1.f) { @@ -641,15 +634,15 @@ void GradingTonePreRender::whiteBlack_precompute(const GradingTone & v) m0 = 1.f; m1 = 2.f - val; m1 = std::max(0.01f, m1); - y0 = x0; // for !isBlack - // y1 won't be used. + y0 = x0; // for !isBlack + // y1 won't be used. } else { m0 = val; m0 = std::max(0.01f, m0); m1 = 1.f; - y1 = x1; // for isBlack + y1 = x1; // for isBlack y0 = y1 - (m0 + m1) * (x1 - x0) * 0.5f; } gain = (m0 + m1) * 0.5f; @@ -658,15 +651,18 @@ void GradingTonePreRender::whiteBlack_precompute(const GradingTone & v) } } -void GradingTonePreRender::scontrast_precompute(const GradingTone & v, float topSC, float bottom, - float pivot) +void GradingTonePreRender::scontrast_precompute( + const GradingTone & v, + float topSC, + float bottom, + float pivot) { float contrast = static_cast(v.m_scontrast); if (contrast != 1.f) { // Limit the range of values to prevent reversals. - contrast = (contrast > 1.f) ? 1.f / (1.8125f - 0.8125f * std::min(contrast, 1.99f)) : - 0.28125f + 0.71875f * std::max(contrast, 0.01f); + contrast = (contrast > 1.f) ? 1.f / (1.8125f - 0.8125f * std::min(contrast, 1.99f)) + : 0.28125f + 0.71875f * std::max(contrast, 0.01f); // Top end { @@ -681,17 +677,17 @@ void GradingTonePreRender::scontrast_precompute(const GradingTone & v, float top auto & m0 = m_scM[0][0]; auto & m3 = m_scM[0][1]; - x3 = topSC; - y3 = topSC; - y0 = pivot + (y3 - pivot) * 0.25f; - m0 = contrast; - x0 = pivot + (y0 - pivot) / m0; + x3 = topSC; + y3 = topSC; + y0 = pivot + (y3 - pivot) * 0.25f; + m0 = contrast; + x0 = pivot + (y0 - pivot) / m0; const float min_width = (x3 - x0) * 0.3f; - m3 = 1.f / m0; + m3 = 1.f / m0; // NB: Due to the if (contrast != 1.) clause above, m0 != m3. - const float center = (y3 - y0 - m3*x3 + m0*x0) / (m0 - m3); - x1 = x0; - x2 = 2.f * center - x1; + const float center = (y3 - y0 - m3 * x3 + m0 * x0) / (m0 - m3); + x1 = x0; + x2 = 2.f * center - x1; if (x2 > x3) { x2 = x3; @@ -699,9 +695,9 @@ void GradingTonePreRender::scontrast_precompute(const GradingTone & v, float top } else if ((x2 - x1) < min_width) { - x2 = x1 + min_width; + x2 = x1 + min_width; const float new_center = (x2 + x1) * 0.5f; - m3 = (y3 - y0 + m0*x0 - new_center * m0) / (x3 - new_center); + m3 = (y3 - y0 + m0 * x0 - new_center * m0) / (x3 - new_center); } y1 = y0; y2 = y1 + (m0 + m3) * (x2 - x1) * 0.5f; @@ -720,16 +716,16 @@ void GradingTonePreRender::scontrast_precompute(const GradingTone & v, float top auto & m0 = m_scM[1][0]; auto & m3 = m_scM[1][1]; - x0 = bottom; - y0 = bottom; - y3 = pivot - (pivot - y0) * 0.25f; - m3 = contrast; - x3 = pivot - (pivot - y3) / m3; + x0 = bottom; + y0 = bottom; + y3 = pivot - (pivot - y0) * 0.25f; + m3 = contrast; + x3 = pivot - (pivot - y3) / m3; const float min_width = (x3 - x0) * 0.3f; - m0 = 1.f / m3; - const float center = (y3 - y0 - m3*x3 + m0*x0) / (m0 - m3); - x2 = x3; - x1 = 2.f * center - x2; + m0 = 1.f / m3; + const float center = (y3 - y0 - m3 * x3 + m0 * x0) / (m0 - m3); + x2 = x3; + x1 = 2.f * center - x2; if (x1 < x0) { x1 = x0; @@ -737,15 +733,14 @@ void GradingTonePreRender::scontrast_precompute(const GradingTone & v, float top } else if ((x2 - x1) < min_width) { - x1 = x2 - min_width; + x1 = x2 - min_width; const float new_center = (x2 + x1) * 0.5f; - m0 = (y3 - y0 - m3*x3 + new_center * m3) / (new_center - x0); + m0 = (y3 - y0 - m3 * x3 + new_center * m3) / (new_center - x0); } y2 = y3; y1 = y2 - (m0 + m3) * (x2 - x1) * 0.5f; } - } // end if contrast != 1. + } // end if contrast != 1. } } // namespace OCIO_NAMESPACE - diff --git a/src/OpenColorIO/ops/gradingtone/GradingTone.h b/src/OpenColorIO/ops/gradingtone/GradingTone.h index b14f71869b..2f6444b3ec 100644 --- a/src/OpenColorIO/ops/gradingtone/GradingTone.h +++ b/src/OpenColorIO/ops/gradingtone/GradingTone.h @@ -1,14 +1,11 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_GRADINGTONE_H #define INCLUDED_OCIO_GRADINGTONE_H - #include - namespace OCIO_NAMESPACE { @@ -29,20 +26,20 @@ bool IsIdentity(const GradingTone & value); struct GradingTonePreRender { GradingTonePreRender & operator=(const GradingTonePreRender &) = default; - GradingTonePreRender(const GradingTonePreRender &) = default; + GradingTonePreRender(const GradingTonePreRender &) = default; explicit GradingTonePreRender(GradingStyle style); ~GradingTonePreRender() = default; // These values are used by CPU & GPU. - double m_shadowsStart{ 0. }; // Pre computed shadow start - double m_shadowsWidth{ 0. }; // Pre computed shadow width - double m_highlightsStart{ 0. }; // Pre computed highlight start - double m_highlightsWidth{ 0. }; // Pre computed highlight width - double m_blacksStart{ 0. }; // Pre computed blacks start - double m_blacksWidth{ 0. }; // Pre computed blacks width - double m_whitesStart{ 0. }; // Pre computed whites start - double m_whitesWidth{ 0. }; // Pre computed whites width + double m_shadowsStart{0.}; // Pre computed shadow start + double m_shadowsWidth{0.}; // Pre computed shadow width + double m_highlightsStart{0.}; // Pre computed highlight start + double m_highlightsWidth{0.}; // Pre computed highlight width + double m_blacksStart{0.}; // Pre computed blacks start + double m_blacksWidth{0.}; // Pre computed blacks width + double m_whitesStart{0.}; // Pre computed whites start + double m_whitesWidth{0.}; // Pre computed whites width void setStyle(GradingStyle style); void update(const GradingTone & v); @@ -66,19 +63,19 @@ struct GradingTonePreRender float m_scM[2][2]{{0.f}}; // m0 & m3 // These values are changing with the style. - float m_top{ 1.f }; - float m_topSC{ 1.f }; - float m_bottom{ 0.f }; - float m_pivot{ 0.4f }; + float m_top{1.f}; + float m_topSC{1.f}; + float m_bottom{0.f}; + float m_pivot{0.4f}; - static void FromStyle(GradingStyle style, float & top, float & topSC, - float & bottom, float & pivot); + static void + FromStyle(GradingStyle style, float & top, float & topSC, float & bottom, float & pivot); // Do not apply the op if all params are identity. - bool m_localBypass{ false }; + bool m_localBypass{false}; private: - GradingStyle m_style{ GRADING_LOG }; + GradingStyle m_style{GRADING_LOG}; void mids_precompute(const GradingTone & v, float top, float bottom); void highlightShadow_precompute(const GradingTone & v); diff --git a/src/OpenColorIO/ops/gradingtone/GradingToneOp.cpp b/src/OpenColorIO/ops/gradingtone/GradingToneOp.cpp index 5968210e71..c620391f94 100644 --- a/src/OpenColorIO/ops/gradingtone/GradingToneOp.cpp +++ b/src/OpenColorIO/ops/gradingtone/GradingToneOp.cpp @@ -7,9 +7,9 @@ #include #include "GpuShaderUtils.h" +#include "ops/gradingtone/GradingToneOp.h" #include "ops/gradingtone/GradingToneOpCPU.h" #include "ops/gradingtone/GradingToneOpGPU.h" -#include "ops/gradingtone/GradingToneOp.h" #include "transforms/GradingToneTransform.h" namespace OCIO_NAMESPACE @@ -25,7 +25,7 @@ typedef OCIO_SHARED_PTR ConstGradingToneOpRcPtr; class GradingToneOp : public Op { public: - GradingToneOp() = delete; + GradingToneOp() = delete; GradingToneOp(const GradingToneOp &) = delete; explicit GradingToneOp(GradingToneOpDataRcPtr & tone); @@ -46,8 +46,9 @@ class GradingToneOp : public Op bool isDynamic() const override; bool hasDynamicProperty(DynamicPropertyType type) const override; DynamicPropertyRcPtr getDynamicProperty(DynamicPropertyType type) const override; - void replaceDynamicProperty(DynamicPropertyType type, - DynamicPropertyGradingToneImplRcPtr & prop) override; + void replaceDynamicProperty( + DynamicPropertyType type, + DynamicPropertyGradingToneImplRcPtr & prop) override; void removeDynamicProperties() override; ConstOpCPURcPtr getCPUOp(bool fastLogExpPow) const override; @@ -59,15 +60,11 @@ class GradingToneOp : public Op { return DynamicPtrCast(data()); } - GradingToneOpDataRcPtr toneData() - { - return DynamicPtrCast(data()); - } + GradingToneOpDataRcPtr toneData() { return DynamicPtrCast(data()); } }; - GradingToneOp::GradingToneOp(GradingToneOpDataRcPtr & tone) - : Op() + : Op() { data() = tone; } @@ -101,7 +98,8 @@ bool GradingToneOp::isSameType(ConstOpRcPtr & op) const bool GradingToneOp::isInverse(ConstOpRcPtr & op) const { ConstGradingToneOpRcPtr typedRcPtr = DynamicPtrCast(op); - if (!typedRcPtr) return false; + if (!typedRcPtr) + return false; ConstGradingToneOpDataRcPtr toneOpData = typedRcPtr->toneData(); return toneData()->isInverse(toneOpData); @@ -159,8 +157,9 @@ DynamicPropertyRcPtr GradingToneOp::getDynamicProperty(DynamicPropertyType type) return toneData()->getDynamicProperty(); } -void GradingToneOp::replaceDynamicProperty(DynamicPropertyType type, - DynamicPropertyGradingToneImplRcPtr & prop) +void GradingToneOp::replaceDynamicProperty( + DynamicPropertyType type, + DynamicPropertyGradingToneImplRcPtr & prop) { if (type != DYNAMIC_PROPERTY_GRADING_TONE) { @@ -190,18 +189,14 @@ void GradingToneOp::extractGpuShaderInfo(GpuShaderCreatorRcPtr & shaderCreator) GetGradingToneGPUShaderProgram(shaderCreator, data); } - -} // Anon namespace - - - +} // namespace /////////////////////////////////////////////////////////////////////////// - -void CreateGradingToneOp(OpRcPtrVec & ops, - GradingToneOpDataRcPtr & toneData, - TransformDirection direction) +void CreateGradingToneOp( + OpRcPtrVec & ops, + GradingToneOpDataRcPtr & toneData, + TransformDirection direction) { auto tone = toneData; if (direction == TRANSFORM_DIR_INVERSE) @@ -221,19 +216,20 @@ void CreateGradingToneTransform(GroupTransformRcPtr & group, ConstOpRcPtr & op) { throw Exception("CreateGradingToneTransform: op has to be a GradingToneOp."); } - auto gtData = DynamicPtrCast(op->data()); + auto gtData = DynamicPtrCast(op->data()); auto gtTransform = GradingToneTransform::Create(gtData->getStyle()); - auto & data = dynamic_cast(gtTransform.get())->data(); - data = *gtData; + auto & data = dynamic_cast(gtTransform.get())->data(); + data = *gtData; group->appendTransform(gtTransform); } -void BuildGradingToneOp(OpRcPtrVec & ops, - const Config & /*config*/, - const ConstContextRcPtr & /*context*/, - const GradingToneTransform & transform, - TransformDirection dir) +void BuildGradingToneOp( + OpRcPtrVec & ops, + const Config & /*config*/, + const ConstContextRcPtr & /*context*/, + const GradingToneTransform & transform, + TransformDirection dir) { const auto & data = dynamic_cast(transform).data(); data.validate(); @@ -242,6 +238,4 @@ void BuildGradingToneOp(OpRcPtrVec & ops, CreateGradingToneOp(ops, toneData, dir); } - } // namespace OCIO_NAMESPACE - diff --git a/src/OpenColorIO/ops/gradingtone/GradingToneOp.h b/src/OpenColorIO/ops/gradingtone/GradingToneOp.h index 9ee78f2395..00610aa4c5 100644 --- a/src/OpenColorIO/ops/gradingtone/GradingToneOp.h +++ b/src/OpenColorIO/ops/gradingtone/GradingToneOp.h @@ -1,11 +1,9 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_GRADINGTONE_OP_H #define INCLUDED_OCIO_GRADINGTONE_OP_H - #include #include @@ -13,13 +11,13 @@ #include "Op.h" #include "ops/gradingtone/GradingToneOpData.h" - namespace OCIO_NAMESPACE { -void CreateGradingToneOp(OpRcPtrVec & ops, - GradingToneOpDataRcPtr & gtData, - TransformDirection direction); +void CreateGradingToneOp( + OpRcPtrVec & ops, + GradingToneOpDataRcPtr & gtData, + TransformDirection direction); // Create a copy of the tone transform in the op and append it to // the GroupTransform. diff --git a/src/OpenColorIO/ops/gradingtone/GradingToneOpCPU.cpp b/src/OpenColorIO/ops/gradingtone/GradingToneOpCPU.cpp index 83949d8767..5a5af86c0e 100644 --- a/src/OpenColorIO/ops/gradingtone/GradingToneOpCPU.cpp +++ b/src/OpenColorIO/ops/gradingtone/GradingToneOpCPU.cpp @@ -9,8 +9,8 @@ #include "BitDepthUtils.h" #include "MathUtils.h" -#include "ops/gradingtone/GradingToneOpCPU.h" #include "SSE.h" +#include "ops/gradingtone/GradingToneOpCPU.h" namespace OCIO_NAMESPACE { @@ -20,7 +20,7 @@ namespace class GradingToneOpCPU : public OpCPU { public: - GradingToneOpCPU() = delete; + GradingToneOpCPU() = delete; GradingToneOpCPU(const GradingToneOpCPU &) = delete; explicit GradingToneOpCPU(ConstGradingToneOpDataRcPtr & gt); @@ -37,7 +37,7 @@ class GradingToneOpCPU : public OpCPU GradingToneOpCPU::GradingToneOpCPU(ConstGradingToneOpDataRcPtr & gt) : OpCPU() { - m_gt = gt->getDynamicPropertyInternal(); + m_gt = gt->getDynamicPropertyInternal(); m_style = gt->getStyle(); if (m_gt->isDynamic()) { @@ -84,10 +84,23 @@ class GradingToneFwdOpCPU : public GradingToneOpCPU void apply(const void * inImg, void * outImg, long numPixels) const override; protected: - - void mids(const GradingTone & v, const GradingTonePreRender & vpr, RGBMChannel channel, float * out) const; - void highlightShadow(const GradingTone & v, const GradingTonePreRender & vpr, RGBMChannel channel, bool isShadow, float * out) const; - void whiteBlack(const GradingTone & v, const GradingTonePreRender & vpr, RGBMChannel channel, bool isBlack, float * out) const; + void mids( + const GradingTone & v, + const GradingTonePreRender & vpr, + RGBMChannel channel, + float * out) const; + void highlightShadow( + const GradingTone & v, + const GradingTonePreRender & vpr, + RGBMChannel channel, + bool isShadow, + float * out) const; + void whiteBlack( + const GradingTone & v, + const GradingTonePreRender & vpr, + RGBMChannel channel, + bool isBlack, + float * out) const; void scontrast(const GradingTone & v, const GradingTonePreRender & vpr, float * out) const; }; @@ -107,10 +120,23 @@ class GradingToneRevOpCPU : public GradingToneOpCPU void apply(const void * inImg, void * outImg, long numPixels) const override; protected: - - void mids(const GradingTone & v, const GradingTonePreRender & vpr, RGBMChannel channel, float * out) const; - void highlightShadow(const GradingTone & v, const GradingTonePreRender & vpr, RGBMChannel channel, bool isShadow, float * out) const; - void whiteBlack(const GradingTone & v, const GradingTonePreRender & vpr, RGBMChannel channel, bool isBlack, float * out) const; + void mids( + const GradingTone & v, + const GradingTonePreRender & vpr, + RGBMChannel channel, + float * out) const; + void highlightShadow( + const GradingTone & v, + const GradingTonePreRender & vpr, + RGBMChannel channel, + bool isShadow, + float * out) const; + void whiteBlack( + const GradingTone & v, + const GradingTonePreRender & vpr, + RGBMChannel channel, + bool isBlack, + float * out) const; void scontrast(const GradingTone & v, const GradingTonePreRender & vpr, float * out) const; }; @@ -182,7 +208,7 @@ struct float3 float3 operator+(const float3 & f3, float p) { - return float3{ f3[0] + p, f3[1] + p, f3[2] + p }; + return float3{f3[0] + p, f3[1] + p, f3[2] + p}; } float3 operator+(float p, const float3 & f3) @@ -192,22 +218,22 @@ float3 operator+(float p, const float3 & f3) float3 operator+(const float3 & f3a, const float3 & f3b) { - return float3{ f3a[0] + f3b[0], f3a[1] + f3b[1], f3a[2] + f3b[2] }; + return float3{f3a[0] + f3b[0], f3a[1] + f3b[1], f3a[2] + f3b[2]}; } float3 operator-(const float3 & f3, float m) { - return float3{ f3[0] - m, f3[1] - m, f3[2] - m }; + return float3{f3[0] - m, f3[1] - m, f3[2] - m}; } float3 operator-(float m, const float3 & f3) { - return float3{ m - f3[0], m - f3[1], m - f3[2] }; + return float3{m - f3[0], m - f3[1], m - f3[2]}; } float3 operator*(const float3 & f3, float m) { - return float3{ f3[0] * m, f3[1] * m, f3[2] * m }; + return float3{f3[0] * m, f3[1] * m, f3[2] * m}; } float3 operator*(float m, const float3 & f3) @@ -217,34 +243,42 @@ float3 operator*(float m, const float3 & f3) float3 operator*(const float3 & f3a, const float3 & f3b) { - return float3{ f3a[0] * f3b[0], - f3a[1] * f3b[1], - f3a[2] * f3b[2] }; + return float3{f3a[0] * f3b[0], f3a[1] * f3b[1], f3a[2] * f3b[2]}; } float3 operator/(const float3 & f3, float d) { - return float3{ f3[0] / d, f3[1] / d, f3[2] / d }; + return float3{f3[0] / d, f3[1] / d, f3[2] / d}; } float3 operator/(const float3 & f3a, const float3 & f3b) { - return float3{ f3a[0] / f3b[0], f3a[1] / f3b[1], f3a[2] / f3b[2] }; + return float3{f3a[0] / f3b[0], f3a[1] / f3b[1], f3a[2] / f3b[2]}; } -void setOnLimit(float3 & res, const float3 & val, float limit, const float3 & below, const float3 & above) +void setOnLimit( + float3 & res, + const float3 & val, + float limit, + const float3 & below, + const float3 & above) { res.setOnLimit(val, limit, below, above); } -void setOnLimit(float & res, const float & val, float limit, const float & below, const float & above) +void setOnLimit( + float & res, + const float & val, + float limit, + const float & below, + const float & above) { res = val < limit ? below : above; } float3 Sqrt(const float3 & val) { - return float3{ sqrtf(val[0]), sqrtf(val[1]), sqrtf(val[2]) }; + return float3{sqrtf(val[0]), sqrtf(val[1]), sqrtf(val[2])}; } float Sqrt(const float & val) @@ -266,8 +300,11 @@ void Set(RGBMChannel channel, float * out, const float & val) /////////////////////////////////////////////////////////////////////////////// -void GradingToneFwdOpCPU::mids(const GradingTone & v, const GradingTonePreRender & vpr, - RGBMChannel channel, float * out) const +void GradingToneFwdOpCPU::mids( + const GradingTone & v, + const GradingTonePreRender & vpr, + RGBMChannel channel, + float * out) const { float mid_adj = Clamp(GetChannelValue(v.m_midtones, channel), 0.01f, 1.99f); @@ -294,41 +331,46 @@ void GradingToneFwdOpCPU::mids(const GradingTone & v, const GradingTonePreRender if (channel != M) { - float t = out[channel]; - float tL = (t - x0) / (x1 - x0); - float tM = (t - x1) / (x2 - x1); - float tR = (t - x2) / (x3 - x2); + float t = out[channel]; + float tL = (t - x0) / (x1 - x0); + float tM = (t - x1) / (x2 - x1); + float tR = (t - x2) / (x3 - x2); float tR2 = (t - x3) / (x4 - x3); float tR3 = (t - x4) / (x5 - x4); - float fL = tL * (x1 - x0) * ( tL * 0.5f * (m1 - m0) + m0 ) + y0; - float fM = tM * (x2 - x1) * ( tM * 0.5f * (m2 - m1) + m1 ) + y1; - float fR = tR * (x3 - x2) * ( tR * 0.5f * (m3 - m2) + m2 ) + y2; - float fR2 = tR2 * (x4 - x3) * ( tR2 * 0.5f * (m4 - m3) + m3 ) + y3; - float fR3 = tR3 * (x5 - x4) * ( tR3 * 0.5f * (m5 - m4) + m4 ) + y4; + float fL = tL * (x1 - x0) * (tL * 0.5f * (m1 - m0) + m0) + y0; + float fM = tM * (x2 - x1) * (tM * 0.5f * (m2 - m1) + m1) + y1; + float fR = tR * (x3 - x2) * (tR * 0.5f * (m3 - m2) + m2) + y2; + float fR2 = tR2 * (x4 - x3) * (tR2 * 0.5f * (m4 - m3) + m3) + y3; + float fR3 = tR3 * (x5 - x4) * (tR3 * 0.5f * (m5 - m4) + m4) + y4; float res = (t < x1) ? fL : fM; - if (t > x2) res = fR; - if (t > x3) res = fR2; - if (t > x4) res = fR3; - if (t < x0) res = y0 + (t - x0) * m0; - if (t > x5) res = y5 + (t - x5) * m5; + if (t > x2) + res = fR; + if (t > x3) + res = fR2; + if (t > x4) + res = fR3; + if (t < x0) + res = y0 + (t - x0) * m0; + if (t > x5) + res = y5 + (t - x5) * m5; out[channel] = res; } else { - float3 t{ out }; + float3 t{out}; float3 tL = (t - x0) / (x1 - x0); float3 tM = (t - x1) / (x2 - x1); float3 tR = (t - x2) / (x3 - x2); float3 tR2 = (t - x3) / (x4 - x3); float3 tR3 = (t - x4) / (x5 - x4); - float3 fL = tL * (x1 - x0) * ( tL * 0.5f * (m1 - m0) + m0 ) + y0; - float3 fM = tM * (x2 - x1) * ( tM * 0.5f * (m2 - m1) + m1 ) + y1; - float3 fR = tR * (x3 - x2) * ( tR * 0.5f * (m3 - m2) + m2 ) + y2; - float3 fR2 = tR2 * (x4 - x3) * ( tR2 * 0.5f * (m4 - m3) + m3 ) + y3; - float3 fR3 = tR3 * (x5 - x4) * ( tR3 * 0.5f * (m5 - m4) + m4 ) + y4; + float3 fL = tL * (x1 - x0) * (tL * 0.5f * (m1 - m0) + m0) + y0; + float3 fM = tM * (x2 - x1) * (tM * 0.5f * (m2 - m1) + m1) + y1; + float3 fR = tR * (x3 - x2) * (tR * 0.5f * (m3 - m2) + m2) + y2; + float3 fR2 = tR2 * (x4 - x3) * (tR2 * 0.5f * (m4 - m3) + m3) + y3; + float3 fR3 = tR3 * (x5 - x4) * (tR3 * 0.5f * (m5 - m4) + m4) + y4; float3 fR4 = (t - x0) * m0 + y0; float3 fR5 = (t - x5) * m5 + y5; @@ -348,8 +390,11 @@ void GradingToneFwdOpCPU::mids(const GradingTone & v, const GradingTonePreRender } } -void GradingToneRevOpCPU::mids(const GradingTone & v, const GradingTonePreRender & vpr, - RGBMChannel channel, float * out) const +void GradingToneRevOpCPU::mids( + const GradingTone & v, + const GradingTonePreRender & vpr, + RGBMChannel channel, + float * out) const { float mid_adj = Clamp(GetChannelValue(v.m_midtones, channel), 0.01f, 1.99f); @@ -376,7 +421,7 @@ void GradingToneRevOpCPU::mids(const GradingTone & v, const GradingTonePreRender if (channel != M) { - float t = out[channel]; + float t = out[channel]; float res = 0.f; if (t >= y5) { @@ -384,48 +429,48 @@ void GradingToneRevOpCPU::mids(const GradingTone & v, const GradingTonePreRender } else if (t >= y4) { - const float c = y4 - t; - const float b = m4 * (x5 - x4); - const float a = 0.5f * (m5 - m4) * (x5 - x4); - const float discrim = sqrt( b * b - 4.f * a * c); - const float tmp = (2.f * c) / (-discrim - b); - res = tmp * (x5 - x4) + x4; + const float c = y4 - t; + const float b = m4 * (x5 - x4); + const float a = 0.5f * (m5 - m4) * (x5 - x4); + const float discrim = sqrt(b * b - 4.f * a * c); + const float tmp = (2.f * c) / (-discrim - b); + res = tmp * (x5 - x4) + x4; } else if (t >= y3) { - const float c = y3 - t; - const float b = m3 * (x4 - x3); - const float a = 0.5f * (m4 - m3) * (x4 - x3); - const float discrim = sqrt( b * b - 4.f * a * c); - const float tmp = (2.f * c) / (-discrim - b); - res = tmp * (x4 - x3) + x3; + const float c = y3 - t; + const float b = m3 * (x4 - x3); + const float a = 0.5f * (m4 - m3) * (x4 - x3); + const float discrim = sqrt(b * b - 4.f * a * c); + const float tmp = (2.f * c) / (-discrim - b); + res = tmp * (x4 - x3) + x3; } else if (t >= y2) { - const float c = y2 - t; - const float b = m2 * (x3 - x2); - const float a = 0.5f * (m3 - m2) * (x3 - x2); - const float discrim = sqrt( b * b - 4.f * a * c); - const float tmp = (2.f * c) / (-discrim - b); - res = tmp * (x3 - x2) + x2; + const float c = y2 - t; + const float b = m2 * (x3 - x2); + const float a = 0.5f * (m3 - m2) * (x3 - x2); + const float discrim = sqrt(b * b - 4.f * a * c); + const float tmp = (2.f * c) / (-discrim - b); + res = tmp * (x3 - x2) + x2; } else if (t >= y1) { - const float c = y1 - t; - const float b = m1 * (x2 - x1); - const float a = 0.5f * (m2 - m1) * (x2 - x1); - const float discrim = sqrt( b * b - 4.f * a * c); - const float tmp = (2.f * c) / (-discrim - b); - res = tmp * (x2 - x1) + x1; + const float c = y1 - t; + const float b = m1 * (x2 - x1); + const float a = 0.5f * (m2 - m1) * (x2 - x1); + const float discrim = sqrt(b * b - 4.f * a * c); + const float tmp = (2.f * c) / (-discrim - b); + res = tmp * (x2 - x1) + x1; } else if (t >= y0) { - const float c = y0 - t; - const float b = m0 * (x1 - x0); - const float a = 0.5f * (m1 - m0) * (x1 - x0); - const float discrim = sqrt( b * b - 4.f * a * c); - const float tmp = (2.f * c) / (-discrim - b); - res = tmp * (x1 - x0) + x0; + const float c = y0 - t; + const float b = m0 * (x1 - x0); + const float a = 0.5f * (m1 - m0) * (x1 - x0); + const float discrim = sqrt(b * b - 4.f * a * c); + const float tmp = (2.f * c) / (-discrim - b); + res = tmp * (x1 - x0) + x0; } else { @@ -435,49 +480,49 @@ void GradingToneRevOpCPU::mids(const GradingTone & v, const GradingTonePreRender } else { - float3 t{ out }; + float3 t{out}; float3 outL0, outL, outM, outR, outR2, outR3, outR4; outR4 = x5 + (t - y5) / m5; { - float3 c = y4 - t; - const float b = m4 * (x5 - x4); - const float a = 0.5f * (m5 - m4) * (x5 - x4); - float3 discrim = Sqrt( b * b - 4.f * a * c); - float3 tmp = (2.f * c) / (-b - discrim); - outR3 = tmp * (x5 - x4) + x4; + float3 c = y4 - t; + const float b = m4 * (x5 - x4); + const float a = 0.5f * (m5 - m4) * (x5 - x4); + float3 discrim = Sqrt(b * b - 4.f * a * c); + float3 tmp = (2.f * c) / (-b - discrim); + outR3 = tmp * (x5 - x4) + x4; } { - float3 c = y3 - t; - const float b = m3 * (x4 - x3); - const float a = 0.5f * (m4 - m3) * (x4 - x3); - float3 discrim = Sqrt( b * b - 4.f * a * c); - float3 tmp = (2.f * c) / (-b - discrim); - outR2 = tmp * (x4 - x3) + x3; + float3 c = y3 - t; + const float b = m3 * (x4 - x3); + const float a = 0.5f * (m4 - m3) * (x4 - x3); + float3 discrim = Sqrt(b * b - 4.f * a * c); + float3 tmp = (2.f * c) / (-b - discrim); + outR2 = tmp * (x4 - x3) + x3; } { - float3 c = y2 - t; - const float b = m2 * (x3 - x2); - const float a = 0.5f * (m3 - m2) * (x3 - x2); - float3 discrim = Sqrt( b * b - 4.f * a * c); - float3 tmp = (2.f * c) / (-b - discrim); - outR = tmp * (x3 - x2) + x2; + float3 c = y2 - t; + const float b = m2 * (x3 - x2); + const float a = 0.5f * (m3 - m2) * (x3 - x2); + float3 discrim = Sqrt(b * b - 4.f * a * c); + float3 tmp = (2.f * c) / (-b - discrim); + outR = tmp * (x3 - x2) + x2; } { - float3 c = y1 - t; - const float b = m1 * (x2 - x1); - const float a = 0.5f * (m2 - m1) * (x2 - x1); - float3 discrim = Sqrt( b * b - 4.f * a * c); - float3 tmp = (2.f * c) / (-b - discrim); - outM = tmp * (x2 - x1) + x1; + float3 c = y1 - t; + const float b = m1 * (x2 - x1); + const float a = 0.5f * (m2 - m1) * (x2 - x1); + float3 discrim = Sqrt(b * b - 4.f * a * c); + float3 tmp = (2.f * c) / (-b - discrim); + outM = tmp * (x2 - x1) + x1; } { - float3 c = y0 - t; - const float b = m0 * (x1 - x0); - const float a = 0.5f * (m1 - m0) * (x1 - x0); - float3 discrim = Sqrt( b * b - 4.f * a * c); - float3 tmp = (2.f * c) / (-b - discrim); - outL = tmp * (x1 - x0) + x0; + float3 c = y0 - t; + const float b = m0 * (x1 - x0); + const float a = 0.5f * (m1 - m0) * (x1 - x0); + float3 discrim = Sqrt(b * b - 4.f * a * c); + float3 tmp = (2.f * c) / (-b - discrim); + outL = tmp * (x1 - x0) + x0; } outL0 = x0 + (t - y0) / m0; @@ -496,16 +541,26 @@ void GradingToneRevOpCPU::mids(const GradingTone & v, const GradingTonePreRender } } -template -void ComputeHSFwd(RGBMChannel channel, float * out, float x0, float x1, float x2, - float y0, float y1, float y2, float m0, float m2, type & t) +template +void ComputeHSFwd( + RGBMChannel channel, + float * out, + float x0, + float x1, + float x2, + float y0, + float y1, + float y2, + float m0, + float m2, + type & t) { - type res{ t }, tL, tR, fL, fR; + type res{t}, tL, tR, fL, fR; tL = (t - x0) / (x1 - x0); tR = (t - x1) / (x2 - x1); - fL = y0 * (1.f - tL*tL) + y1 * tL*tL + m0 * (1.f - tL) * tL * (x1 - x0); - fR = y1 * (1.f - tR)*(1.f - tR) + y2 * (2.f - tR)*tR + m2 * (tR - 1.f)*tR * (x2 - x1); + fL = y0 * (1.f - tL * tL) + y1 * tL * tL + m0 * (1.f - tL) * tL * (x1 - x0); + fR = y1 * (1.f - tR) * (1.f - tR) + y2 * (2.f - tR) * tR + m2 * (tR - 1.f) * tR * (x2 - x1); setOnLimit(res, t, x1, fL, fR); type r0 = (t - x0) * m0 + y0; @@ -516,22 +571,32 @@ void ComputeHSFwd(RGBMChannel channel, float * out, float x0, float x1, float x2 Set(channel, out, res); } -template -void ComputeHSRev(RGBMChannel channel, float * out, float x0, float x1, float x2, - float y0, float y1, float y2, float m0, float m2, type & t) +template +void ComputeHSRev( + RGBMChannel channel, + float * out, + float x0, + float x1, + float x2, + float y0, + float y1, + float y2, + float m0, + float m2, + type & t) { - type res{ t }, cL, cR, discrimL, discrimR, outL, outR; + type res{t}, cL, cR, discrimL, discrimR, outL, outR; float bL = m0 * (x1 - x0); float aL = y1 - y0 - m0 * (x1 - x0); - cL = y0 - t; + cL = y0 - t; discrimL = Sqrt(bL * bL - 4.f * aL * cL); - outL = (-2.f * cL) / (discrimL + bL) * (x1 - x0) + x0; - float bR = 2.f*y2 - 2.f*y1 - m2 * (x2 - x1); + outL = (-2.f * cL) / (discrimL + bL) * (x1 - x0) + x0; + float bR = 2.f * y2 - 2.f * y1 - m2 * (x2 - x1); float aR = y1 - y2 + m2 * (x2 - x1); - cR = y1 - t; + cR = y1 - t; discrimR = Sqrt(bR * bR - 4.f * aR * cR); - outR = (-2.f * cR) / (discrimR + bR) * (x2 - x1) + x1; + outR = (-2.f * cR) / (discrimR + bR) * (x2 - x1) + x1; setOnLimit(res, t, y1, outL, outR); type r0 = (t - y0) / m0 + x0; @@ -542,18 +607,22 @@ void ComputeHSRev(RGBMChannel channel, float * out, float x0, float x1, float x2 Set(channel, out, res); } -void GradingToneFwdOpCPU::highlightShadow(const GradingTone & v, const GradingTonePreRender & vpr, - RGBMChannel channel, - bool isShadow, float * out) const +void GradingToneFwdOpCPU::highlightShadow( + const GradingTone & v, + const GradingTonePreRender & vpr, + RGBMChannel channel, + bool isShadow, + float * out) const { // The effect of val is symmetric around 1 (<1 uses Fwd algorithm, >1 uses Rev algorithm). - float val = isShadow ? GetChannelValue(v.m_shadows, channel) : - GetChannelValue(v.m_highlights, channel); + float val = isShadow ? GetChannelValue(v.m_shadows, channel) + : GetChannelValue(v.m_highlights, channel); if (!isShadow) { val = 2.f - val; } - if (val == 1.) return; + if (val == 1.) + return; const auto & x0 = vpr.m_hsX[isShadow ? 1 : 0][channel][0]; const auto & x1 = vpr.m_hsX[isShadow ? 1 : 0][channel][1]; @@ -569,11 +638,11 @@ void GradingToneFwdOpCPU::highlightShadow(const GradingTone & v, const GradingTo if (channel != M) { float t = out[channel]; - ComputeHSFwd(channel, out, x0, x1, x2, y0, y1, y2, m0, m2, t); // Fwd + ComputeHSFwd(channel, out, x0, x1, x2, y0, y1, y2, m0, m2, t); // Fwd } else { - float3 t{ out }; + float3 t{out}; ComputeHSFwd(channel, out, x0, x1, x2, y0, y1, y2, m0, m2, t); } } @@ -582,27 +651,31 @@ void GradingToneFwdOpCPU::highlightShadow(const GradingTone & v, const GradingTo if (channel != M) { float t = out[channel]; - ComputeHSRev(channel, out, x0, x1, x2, y0, y1, y2, m0, m2, t); // Rev + ComputeHSRev(channel, out, x0, x1, x2, y0, y1, y2, m0, m2, t); // Rev } else { - float3 t{ out }; + float3 t{out}; ComputeHSRev(channel, out, x0, x1, x2, y0, y1, y2, m0, m2, t); } } } -void GradingToneRevOpCPU::highlightShadow(const GradingTone & v, const GradingTonePreRender & vpr, - RGBMChannel channel, - bool isShadow, float * out) const +void GradingToneRevOpCPU::highlightShadow( + const GradingTone & v, + const GradingTonePreRender & vpr, + RGBMChannel channel, + bool isShadow, + float * out) const { - float val = isShadow ? GetChannelValue(v.m_shadows, channel) : - GetChannelValue(v.m_highlights, channel); + float val = isShadow ? GetChannelValue(v.m_shadows, channel) + : GetChannelValue(v.m_highlights, channel); if (!isShadow) { val = 2.f - val; } - if (val == 1.) return; + if (val == 1.) + return; const auto & x0 = vpr.m_hsX[isShadow ? 1 : 0][channel][0]; const auto & x1 = vpr.m_hsX[isShadow ? 1 : 0][channel][1]; @@ -618,11 +691,11 @@ void GradingToneRevOpCPU::highlightShadow(const GradingTone & v, const GradingTo if (channel != M) { float t = out[channel]; - ComputeHSRev(channel, out, x0, x1, x2, y0, y1, y2, m0, m2, t); // Rev + ComputeHSRev(channel, out, x0, x1, x2, y0, y1, y2, m0, m2, t); // Rev } else { - float3 t{ out }; + float3 t{out}; ComputeHSRev(channel, out, x0, x1, x2, y0, y1, y2, m0, m2, t); } } @@ -631,19 +704,30 @@ void GradingToneRevOpCPU::highlightShadow(const GradingTone & v, const GradingTo if (channel != M) { float t = out[channel]; - ComputeHSFwd(channel, out, x0, x1, x2, y0, y1, y2, m0, m2, t); // Fwd + ComputeHSFwd(channel, out, x0, x1, x2, y0, y1, y2, m0, m2, t); // Fwd } else { - float3 t{ out }; + float3 t{out}; ComputeHSFwd(channel, out, x0, x1, x2, y0, y1, y2, m0, m2, t); } } } -template -void ComputeWBFwd(RGBMChannel channel, bool isBlack, float * out, float val, float x0, float x1, - float y0, float y1, float m0, float m1, float gain, type & t) +template +void ComputeWBFwd( + RGBMChannel channel, + bool isBlack, + float * out, + float val, + float x0, + float x1, + float y0, + float y1, + float m0, + float m1, + float gain, + type & t) { const float mtest = (!isBlack) ? val : 2.f - val; @@ -652,8 +736,8 @@ void ComputeWBFwd(RGBMChannel channel, bool isBlack, float * out, float val, flo // Slope is decreasing case. type tlocal = (t - x0) / (x1 - x0); - type res = tlocal * (x1 - x0) * (tlocal * 0.5f * (m1 - m0) + m0) + y0; - type res0 = y0 + (t - x0) * m0; + type res = tlocal * (x1 - x0) * (tlocal * 0.5f * (m1 - m0) + m0) + y0; + type res0 = y0 + (t - x0) * m0; setOnLimit(res, t, x0, res0, res); type res1 = y1 + (t - x1) * m1; setOnLimit(res, t, x1, res, res1); @@ -669,11 +753,11 @@ void ComputeWBFwd(RGBMChannel channel, bool isBlack, float * out, float val, flo const float a = 0.5f * (m1 - m0) * (x1 - x0); const float b = m0 * (x1 - x0); - type c = y0 - t; + type c = y0 - t; type discrim = Sqrt(b * b - 4.f * a * c); - type tmp = (-2.f * c) / (discrim + b); - type res = tmp * (x1 - x0) + x0; - type res0 = x0 + (t - y0) / m0; + type tmp = (-2.f * c) / (discrim + b); + type res = tmp * (x1 - x0) + x0; + type res0 = x0 + (t - y0) / m0; setOnLimit(res, t, y0, res0, res); if (!isBlack) @@ -682,13 +766,13 @@ void ComputeWBFwd(RGBMChannel channel, bool isBlack, float * out, float val, flo // Quadratic extrapolation for better HDR control. // TODO: These values are not per pixel and could be pre-calculated. const float new_y1 = (x1 - x0) / gain + x0; - const float xd = x0 + (x1 - x0) * 0.99f; - float md = m0 + (xd - x0) * (m1 - m0) / (x1 - x0); - md = 1.f / md; - const float aa = 0.5f * (1.f / m1 - md) / (x1 - xd); - const float bb = 1.f / m1 - 2.f * aa * x1; - const float cc = new_y1 - bb * x1 - aa * x1 * x1; - t = (t - x0) / gain + x0; + const float xd = x0 + (x1 - x0) * 0.99f; + float md = m0 + (xd - x0) * (m1 - m0) / (x1 - x0); + md = 1.f / md; + const float aa = 0.5f * (1.f / m1 - md) / (x1 - xd); + const float bb = 1.f / m1 - 2.f * aa * x1; + const float cc = new_y1 - bb * x1 - aa * x1 * x1; + t = (t - x0) / gain + x0; type res1 = (aa * t + bb) * t + cc; setOnLimit(res, t, x1, res, res1); @@ -704,9 +788,20 @@ void ComputeWBFwd(RGBMChannel channel, bool isBlack, float * out, float val, flo } } -template -void ComputeWBRev(RGBMChannel channel, bool isBlack, float * out, float val, float x0, float x1, - float y0, float y1, float m0, float m1, float gain, type & t) +template +void ComputeWBRev( + RGBMChannel channel, + bool isBlack, + float * out, + float val, + float x0, + float x1, + float y0, + float y1, + float m0, + float m1, + float gain, + type & t) { const float mtest = (!isBlack) ? val : 2.f - val; @@ -718,11 +813,11 @@ void ComputeWBRev(RGBMChannel channel, bool isBlack, float * out, float val, flo const float a = 0.5f * (m1 - m0) * (x1 - x0); const float b = m0 * (x1 - x0); - type c = y0 - t; + type c = y0 - t; type discrim = Sqrt(b * b - 4.f * a * c); - type tmp = (-2.f * c) / (discrim + b); - type res = tmp * (x1 - x0) + x0; - type res0 = x0 + (t - y0) / m0; + type tmp = (-2.f * c) / (discrim + b); + type res = tmp * (x1 - x0) + x0; + type res0 = x0 + (t - y0) / m0; setOnLimit(res, t, y0, res0, res); type res1 = x1 + (t - y1) / m1; @@ -737,8 +832,8 @@ void ComputeWBRev(RGBMChannel channel, bool isBlack, float * out, float val, flo t = (!isBlack) ? (t - x0) * gain + x0 : (t - x1) * gain + x1; type tlocal = (t - x0) / (x1 - x0); - type res = tlocal * (x1 - x0) * (tlocal * 0.5f * (m1 - m0) + m0) + y0; - type res0 = y0 + (t - x0) * m0; + type res = tlocal * (x1 - x0) * (tlocal * 0.5f * (m1 - m0) + m0) + y0; + type res0 = y0 + (t - x0) * m0; setOnLimit(res, t, x0, res0, res); if (!isBlack) @@ -747,17 +842,17 @@ void ComputeWBRev(RGBMChannel channel, bool isBlack, float * out, float val, flo // Quadratic extrapolation for better HDR control. // TODO: These values are not per pixel and could be pre-calculated. const float new_y1 = (x1 - x0) / gain + x0; - const float xd = x0 + (x1 - x0) * 0.99f; - float md = m0 + (xd - x0) * (m1 - m0) / (x1 - x0); - md = 1.f / md; - const float aa = 0.5f * (1.f / m1 - md) / (x1 - xd); - const float bb = 1.f / m1 - 2.f * aa * x1; - const float cc = new_y1 - bb * x1 - aa * x1 * x1; - t = (t - x0) / gain + x0; - - type c = cc - t; - type discrim = Sqrt(bb * bb - 4.f * aa * c); - type res1 = (-2.f * c) / (discrim + bb); + const float xd = x0 + (x1 - x0) * 0.99f; + float md = m0 + (xd - x0) * (m1 - m0) / (x1 - x0); + md = 1.f / md; + const float aa = 0.5f * (1.f / m1 - md) / (x1 - xd); + const float bb = 1.f / m1 - 2.f * aa * x1; + const float cc = new_y1 - bb * x1 - aa * x1 * x1; + t = (t - x0) / gain + x0; + + type c = cc - t; + type discrim = Sqrt(bb * bb - 4.f * aa * c); + type res1 = (-2.f * c) / (discrim + bb); const float brk = (aa * x1 + bb) * x1 + cc; setOnLimit(res, t, brk, res, res1); } @@ -772,20 +867,24 @@ void ComputeWBRev(RGBMChannel channel, bool isBlack, float * out, float val, flo } } -void GradingToneFwdOpCPU::whiteBlack(const GradingTone & v, const GradingTonePreRender & vpr, - RGBMChannel channel, bool isBlack, float * out) const +void GradingToneFwdOpCPU::whiteBlack( + const GradingTone & v, + const GradingTonePreRender & vpr, + RGBMChannel channel, + bool isBlack, + float * out) const { - float val = isBlack ? GetChannelValue(v.m_blacks, channel) : - GetChannelValue(v.m_whites, channel); - - const auto & x0 = vpr.m_wbX[isBlack ? 1 : 0][channel][0]; - const auto & x1 = vpr.m_wbX[isBlack ? 1 : 0][channel][1]; - const auto & y0 = vpr.m_wbY[isBlack ? 1 : 0][channel][0]; - const auto & y1 = vpr.m_wbY[isBlack ? 1 : 0][channel][1]; - const auto & m0 = vpr.m_wbM[isBlack ? 1 : 0][channel][0]; - const auto & m1 = vpr.m_wbM[isBlack ? 1 : 0][channel][1]; + float val + = isBlack ? GetChannelValue(v.m_blacks, channel) : GetChannelValue(v.m_whites, channel); + + const auto & x0 = vpr.m_wbX[isBlack ? 1 : 0][channel][0]; + const auto & x1 = vpr.m_wbX[isBlack ? 1 : 0][channel][1]; + const auto & y0 = vpr.m_wbY[isBlack ? 1 : 0][channel][0]; + const auto & y1 = vpr.m_wbY[isBlack ? 1 : 0][channel][1]; + const auto & m0 = vpr.m_wbM[isBlack ? 1 : 0][channel][0]; + const auto & m1 = vpr.m_wbM[isBlack ? 1 : 0][channel][1]; const auto & gain = vpr.m_wbGain[isBlack ? 1 : 0][channel]; - + if (channel != M) { float t = out[channel]; @@ -793,25 +892,29 @@ void GradingToneFwdOpCPU::whiteBlack(const GradingTone & v, const GradingTonePre } else { - float3 t{ out }; + float3 t{out}; ComputeWBFwd(channel, isBlack, out, val, x0, x1, y0, y1, m0, m1, gain, t); } } -void GradingToneRevOpCPU::whiteBlack(const GradingTone & v, const GradingTonePreRender & vpr, - RGBMChannel channel, bool isBlack, float * out) const +void GradingToneRevOpCPU::whiteBlack( + const GradingTone & v, + const GradingTonePreRender & vpr, + RGBMChannel channel, + bool isBlack, + float * out) const { - float val = isBlack ? GetChannelValue(v.m_blacks, channel) : - GetChannelValue(v.m_whites, channel); - - const auto & x0 = vpr.m_wbX[isBlack ? 1 : 0][channel][0]; - const auto & x1 = vpr.m_wbX[isBlack ? 1 : 0][channel][1]; - const auto & y0 = vpr.m_wbY[isBlack ? 1 : 0][channel][0]; - const auto & y1 = vpr.m_wbY[isBlack ? 1 : 0][channel][1]; - const auto & m0 = vpr.m_wbM[isBlack ? 1 : 0][channel][0]; - const auto & m1 = vpr.m_wbM[isBlack ? 1 : 0][channel][1]; + float val + = isBlack ? GetChannelValue(v.m_blacks, channel) : GetChannelValue(v.m_whites, channel); + + const auto & x0 = vpr.m_wbX[isBlack ? 1 : 0][channel][0]; + const auto & x1 = vpr.m_wbX[isBlack ? 1 : 0][channel][1]; + const auto & y0 = vpr.m_wbY[isBlack ? 1 : 0][channel][0]; + const auto & y1 = vpr.m_wbY[isBlack ? 1 : 0][channel][1]; + const auto & m0 = vpr.m_wbM[isBlack ? 1 : 0][channel][0]; + const auto & m1 = vpr.m_wbM[isBlack ? 1 : 0][channel][1]; const auto & gain = vpr.m_wbGain[isBlack ? 1 : 0][channel]; - + if (channel != M) { float t = out[channel]; @@ -819,22 +922,25 @@ void GradingToneRevOpCPU::whiteBlack(const GradingTone & v, const GradingTonePre } else { - float3 t{ out }; + float3 t{out}; ComputeWBRev(channel, isBlack, out, val, x0, x1, y0, y1, m0, m1, gain, t); } } -void GradingToneFwdOpCPU::scontrast(const GradingTone & v, const GradingTonePreRender & vpr, float * out) const +void GradingToneFwdOpCPU::scontrast( + const GradingTone & v, + const GradingTonePreRender & vpr, + float * out) const { float contrast = static_cast(v.m_scontrast); if (contrast != 1.) { // Limit the range of values to prevent reversals. - contrast = (contrast > 1.f) ? 1.f / (1.8125f - 0.8125f * std::min(contrast, 1.99f)) : - 0.28125f + 0.71875f * std::max(contrast, 0.01f); + contrast = (contrast > 1.f) ? 1.f / (1.8125f - 0.8125f * std::min(contrast, 1.99f)) + : 0.28125f + 0.71875f * std::max(contrast, 0.01f); - float3 t{ out }; - float3 outColor{ (t - vpr.m_pivot) * contrast + vpr.m_pivot }; + float3 t{out}; + float3 outColor{(t - vpr.m_pivot) * contrast + vpr.m_pivot}; // Top end { @@ -846,7 +952,7 @@ void GradingToneFwdOpCPU::scontrast(const GradingTone & v, const GradingTonePreR const auto & m3 = vpr.m_scM[0][1]; float3 tR = (t - x1) / (x2 - x1); - float3 res = tR * (x2 - x1) * ( tR * 0.5f * (m3 - m0) + m0 ) + y1; + float3 res = tR * (x2 - x1) * (tR * 0.5f * (m3 - m0) + m0) + y1; setOnLimit(outColor, t, x1, outColor, res); @@ -862,7 +968,7 @@ void GradingToneFwdOpCPU::scontrast(const GradingTone & v, const GradingTonePreR const auto & m0 = vpr.m_scM[1][0]; const auto & m3 = vpr.m_scM[1][1]; - float3 tR = (t - x1) / (x2 - x1); + float3 tR = (t - x1) / (x2 - x1); float3 res = tR * (x2 - x1) * (tR * 0.5f * (m3 - m0) + m0) + y1; setOnLimit(outColor, t, x2, res, outColor); @@ -874,20 +980,23 @@ void GradingToneFwdOpCPU::scontrast(const GradingTone & v, const GradingTonePreR out[0] = outColor[0]; out[1] = outColor[1]; out[2] = outColor[2]; - } // end if contrast != 1. + } // end if contrast != 1. } -void GradingToneRevOpCPU::scontrast(const GradingTone & v, const GradingTonePreRender & vpr, float * out) const +void GradingToneRevOpCPU::scontrast( + const GradingTone & v, + const GradingTonePreRender & vpr, + float * out) const { float contrast = static_cast(v.m_scontrast); if (contrast != 1.) { // Limit the range of values to prevent reversals. - contrast = (contrast > 1.f) ? 1.f / (1.8125f - 0.8125f * std::min(contrast, 1.99f)) : - 0.28125f + 0.71875f * std::max(contrast, 0.01f); + contrast = (contrast > 1.f) ? 1.f / (1.8125f - 0.8125f * std::min(contrast, 1.99f)) + : 0.28125f + 0.71875f * std::max(contrast, 0.01f); - float3 t{ out }; - float3 outColor{ (t - vpr.m_pivot) / contrast + vpr.m_pivot }; + float3 t{out}; + float3 outColor{(t - vpr.m_pivot) / contrast + vpr.m_pivot}; // Top end { @@ -898,11 +1007,11 @@ void GradingToneRevOpCPU::scontrast(const GradingTone & v, const GradingTonePreR const auto & m0 = vpr.m_scM[0][0]; const auto & m3 = vpr.m_scM[0][1]; - float b = m0 * (x2 - x1); - float a = (m3 - m0) * 0.5f * (x2 - x1); - float3 c = y1 - t; + float b = m0 * (x2 - x1); + float a = (m3 - m0) * 0.5f * (x2 - x1); + float3 c = y1 - t; float3 discrim = Sqrt(b * b - 4.f * a * c); - float3 res = (x2 - x1) * (-2.f * c) / (discrim + b) + x1; + float3 res = (x2 - x1) * (-2.f * c) / (discrim + b) + x1; setOnLimit(outColor, t, y1, outColor, res); setOnLimit(outColor, t, y2, outColor, x2 + (t - y2) / m3); @@ -917,11 +1026,11 @@ void GradingToneRevOpCPU::scontrast(const GradingTone & v, const GradingTonePreR const auto & m0 = vpr.m_scM[1][0]; const auto & m3 = vpr.m_scM[1][1]; - float b = m0 * (x2 - x1); - float a = (m3 - m0) * 0.5f * (x2 - x1); - float3 c = y1 - t; + float b = m0 * (x2 - x1); + float a = (m3 - m0) * 0.5f * (x2 - x1); + float3 c = y1 - t; float3 discrim = Sqrt(b * b - 4.f * a * c); - float3 res = (x2 - x1) * (-2.f * c) / (discrim + b) + x1; + float3 res = (x2 - x1) * (-2.f * c) / (discrim + b) + x1; setOnLimit(outColor, t, y2, res, outColor); setOnLimit(outColor, t, y1, x1 + (t - y1) / m0, outColor); @@ -930,7 +1039,7 @@ void GradingToneRevOpCPU::scontrast(const GradingTone & v, const GradingTonePreR out[0] = outColor[0]; out[1] = outColor[1]; out[2] = outColor[2]; - } // end if contrast != 1. + } // end if contrast != 1. } /////////////////////////////////////////////////////////////////////////////// @@ -959,9 +1068,9 @@ void GradingToneFwdOpCPU::apply(const void * inImg, void * outImg, long numPixel } const float * in = (float *)inImg; - float * out = (float *)outImg; + float * out = (float *)outImg; - auto & v = m_gt->getValue(); + auto & v = m_gt->getValue(); auto & vpr = m_gt->getComputedValue(); for (long idx = 0; idx < numPixels; ++idx) @@ -1016,9 +1125,9 @@ void GradingToneRevOpCPU::apply(const void * inImg, void * outImg, long numPixel } const float * in = (float *)inImg; - float * out = (float *)outImg; + float * out = (float *)outImg; - auto & v = m_gt->getValue(); + auto & v = m_gt->getValue(); auto & vpr = m_gt->getComputedValue(); for (long idx = 0; idx < numPixels; ++idx) @@ -1062,85 +1171,89 @@ void GradingToneRevOpCPU::apply(const void * inImg, void * outImg, long numPixel namespace LogLinConstants { - static constexpr float xbrk = 0.0041318374739483946f; - static constexpr float shift = -0.000157849851665374f; - static constexpr float m = 1.f / (0.18f + shift); - static constexpr float gain = 363.034608563f; - static constexpr float offs = -7.f; - static constexpr float ybrk = -5.5f; +static constexpr float xbrk = 0.0041318374739483946f; +static constexpr float shift = -0.000157849851665374f; +static constexpr float m = 1.f / (0.18f + shift); +static constexpr float gain = 363.034608563f; +static constexpr float offs = -7.f; +static constexpr float ybrk = -5.5f; #if OCIO_USE_SSE2 - const __m128 mxbrk = _mm_set1_ps(xbrk); - const __m128 mshift = _mm_set1_ps(shift); - const __m128 mm = _mm_set1_ps(m); - const __m128 mgain = _mm_set1_ps(gain); - const __m128 moffs = _mm_set1_ps(offs); - const __m128 mybrk = _mm_set1_ps(ybrk); - const __m128 mgainInv = _mm_set1_ps(1.f / gain); - const __m128 mshift018 = _mm_set1_ps(shift + 0.18f); - const __m128 mpower = _mm_set1_ps(2.0f); +const __m128 mxbrk = _mm_set1_ps(xbrk); +const __m128 mshift = _mm_set1_ps(shift); +const __m128 mm = _mm_set1_ps(m); +const __m128 mgain = _mm_set1_ps(gain); +const __m128 moffs = _mm_set1_ps(offs); +const __m128 mybrk = _mm_set1_ps(ybrk); +const __m128 mgainInv = _mm_set1_ps(1.f / gain); +const __m128 mshift018 = _mm_set1_ps(shift + 0.18f); +const __m128 mpower = _mm_set1_ps(2.0f); #else - static constexpr float base2 = 1.4426950408889634f; // 1/log(2) +static constexpr float base2 = 1.4426950408889634f; // 1/log(2) #endif -} +} // namespace LogLinConstants inline void LinLog(const float * in, float * out) { #if OCIO_USE_SSE2 - __m128 pix = _mm_loadu_ps(in); - __m128 flag = _mm_cmpgt_ps(pix, LogLinConstants::mxbrk); + __m128 pix = _mm_loadu_ps(in); + __m128 flag = _mm_cmpgt_ps(pix, LogLinConstants::mxbrk); - __m128 pixLin = _mm_mul_ps(pix, LogLinConstants::mgain); - pixLin = _mm_add_ps(pixLin, LogLinConstants::moffs); + __m128 pixLin = _mm_mul_ps(pix, LogLinConstants::mgain); + pixLin = _mm_add_ps(pixLin, LogLinConstants::moffs); - pix = _mm_add_ps(pix, LogLinConstants::mshift); - pix = _mm_mul_ps(pix, LogLinConstants::mm); - pix = sseLog2(pix); + pix = _mm_add_ps(pix, LogLinConstants::mshift); + pix = _mm_mul_ps(pix, LogLinConstants::mm); + pix = sseLog2(pix); - pix = _mm_or_ps(_mm_and_ps(flag, pix), - _mm_andnot_ps(flag, pixLin)); + pix = _mm_or_ps(_mm_and_ps(flag, pix), _mm_andnot_ps(flag, pixLin)); - _mm_storeu_ps(out, pix); + _mm_storeu_ps(out, pix); #else - out[0] = (in[0] < LogLinConstants::xbrk) ? - in[0] * LogLinConstants::gain + LogLinConstants::offs : - LogLinConstants::base2 * std::log((in[0] + LogLinConstants::shift) * LogLinConstants::m); - out[1] = (in[1] < LogLinConstants::xbrk) ? - in[1] * LogLinConstants::gain + LogLinConstants::offs : - LogLinConstants::base2 * std::log((in[1] + LogLinConstants::shift) * LogLinConstants::m); - out[2] = (in[2] < LogLinConstants::xbrk) ? - in[2] * LogLinConstants::gain + LogLinConstants::offs : - LogLinConstants::base2 * std::log((in[2] + LogLinConstants::shift) * LogLinConstants::m); - out[3] = in[3]; + out[0] = (in[0] < LogLinConstants::xbrk) + ? in[0] * LogLinConstants::gain + LogLinConstants::offs + : LogLinConstants::base2 + * std::log((in[0] + LogLinConstants::shift) * LogLinConstants::m); + out[1] = (in[1] < LogLinConstants::xbrk) + ? in[1] * LogLinConstants::gain + LogLinConstants::offs + : LogLinConstants::base2 + * std::log((in[1] + LogLinConstants::shift) * LogLinConstants::m); + out[2] = (in[2] < LogLinConstants::xbrk) + ? in[2] * LogLinConstants::gain + LogLinConstants::offs + : LogLinConstants::base2 + * std::log((in[2] + LogLinConstants::shift) * LogLinConstants::m); + out[3] = in[3]; #endif } inline void LogLin(float * out) { #if OCIO_USE_SSE2 - __m128 pix = _mm_loadu_ps(out); - __m128 flag = _mm_cmpgt_ps(pix, LogLinConstants::mybrk); + __m128 pix = _mm_loadu_ps(out); + __m128 flag = _mm_cmpgt_ps(pix, LogLinConstants::mybrk); - __m128 pixLin = _mm_sub_ps(pix, LogLinConstants::moffs); - pixLin = _mm_mul_ps(pixLin, LogLinConstants::mgainInv); + __m128 pixLin = _mm_sub_ps(pix, LogLinConstants::moffs); + pixLin = _mm_mul_ps(pixLin, LogLinConstants::mgainInv); - pix = ssePower(LogLinConstants::mpower, pix); - pix = _mm_mul_ps(pix, LogLinConstants::mshift018); - pix = _mm_sub_ps(pix, LogLinConstants::mshift); + pix = ssePower(LogLinConstants::mpower, pix); + pix = _mm_mul_ps(pix, LogLinConstants::mshift018); + pix = _mm_sub_ps(pix, LogLinConstants::mshift); - pix = _mm_or_ps(_mm_and_ps(flag, pix), - _mm_andnot_ps(flag, pixLin)); + pix = _mm_or_ps(_mm_and_ps(flag, pix), _mm_andnot_ps(flag, pixLin)); - _mm_storeu_ps(out, pix); + _mm_storeu_ps(out, pix); #else - out[0] = (out[0] < LogLinConstants::ybrk) ? - (out[0] - LogLinConstants::offs) / LogLinConstants::gain : - std::pow(2.0f, out[0]) * (0.18f + LogLinConstants::shift) - LogLinConstants::shift; - out[1] = (out[1] < LogLinConstants::ybrk) ? - (out[1] - LogLinConstants::offs) / LogLinConstants::gain : - std::pow(2.0f, out[1]) * (0.18f + LogLinConstants::shift) - LogLinConstants::shift; - out[2] = (out[2] < LogLinConstants::ybrk) ? - (out[2] - LogLinConstants::offs) / LogLinConstants::gain : - std::pow(2.0f, out[2]) * (0.18f + LogLinConstants::shift) - LogLinConstants::shift; + out[0] + = (out[0] < LogLinConstants::ybrk) + ? (out[0] - LogLinConstants::offs) / LogLinConstants::gain + : std::pow(2.0f, out[0]) * (0.18f + LogLinConstants::shift) - LogLinConstants::shift; + out[1] + = (out[1] < LogLinConstants::ybrk) + ? (out[1] - LogLinConstants::offs) / LogLinConstants::gain + : std::pow(2.0f, out[1]) * (0.18f + LogLinConstants::shift) - LogLinConstants::shift; + out[2] + = (out[2] < LogLinConstants::ybrk) + ? (out[2] - LogLinConstants::offs) / LogLinConstants::gain + : std::pow(2.0f, out[2]) * (0.18f + LogLinConstants::shift) - LogLinConstants::shift; #endif } @@ -1156,9 +1269,9 @@ void GradingToneLinearFwdOpCPU::apply(const void * inImg, void * outImg, long nu } const float * in = (float *)inImg; - float * out = (float *)outImg; + float * out = (float *)outImg; - auto & v = m_gt->getValue(); + auto & v = m_gt->getValue(); auto & vpr = m_gt->getComputedValue(); for (long idx = 0; idx < numPixels; ++idx) @@ -1213,9 +1326,9 @@ void GradingToneLinearRevOpCPU::apply(const void * inImg, void * outImg, long nu } const float * in = (float *)inImg; - float * out = (float *)outImg; + float * out = (float *)outImg; - auto & v = m_gt->getValue(); + auto & v = m_gt->getValue(); auto & vpr = m_gt->getComputedValue(); for (long idx = 0; idx < numPixels; ++idx) @@ -1258,7 +1371,7 @@ void GradingToneLinearRevOpCPU::apply(const void * inImg, void * outImg, long nu } } -} // Anonymous namspace +} // namespace /////////////////////////////////////////////////////////////////////////////// @@ -1266,19 +1379,19 @@ ConstOpCPURcPtr GetGradingToneCPURenderer(ConstGradingToneOpDataRcPtr & tone) { switch (tone->getDirection()) { - case TRANSFORM_DIR_FORWARD: - if (tone->getStyle() == GRADING_LIN) - { - return std::make_shared(tone); - } - return std::make_shared(tone); + case TRANSFORM_DIR_FORWARD: + if (tone->getStyle() == GRADING_LIN) + { + return std::make_shared(tone); + } + return std::make_shared(tone); - case TRANSFORM_DIR_INVERSE: - if (tone->getStyle() == GRADING_LIN) - { - return std::make_shared(tone); - } - return std::make_shared(tone); + case TRANSFORM_DIR_INVERSE: + if (tone->getStyle() == GRADING_LIN) + { + return std::make_shared(tone); + } + return std::make_shared(tone); } throw Exception("Illegal GradingTone direction."); diff --git a/src/OpenColorIO/ops/gradingtone/GradingToneOpData.cpp b/src/OpenColorIO/ops/gradingtone/GradingToneOpData.cpp index 67e184cd39..4f010c70fd 100644 --- a/src/OpenColorIO/ops/gradingtone/GradingToneOpData.cpp +++ b/src/OpenColorIO/ops/gradingtone/GradingToneOpData.cpp @@ -6,9 +6,9 @@ #include #include "MathUtils.h" +#include "Platform.h" #include "ops/gradingtone/GradingTone.h" #include "ops/gradingtone/GradingToneOpData.h" -#include "Platform.h" namespace OCIO_NAMESPACE { @@ -28,14 +28,18 @@ GradingToneOpData::GradingToneOpData(GradingStyle style) GradingToneOpData::GradingToneOpData(const GradingToneOpData & other) : OpData(other) , m_style(other.m_style) - , m_value(std::make_shared(GradingTone(other.m_style), other.m_style, false)) + , m_value(std::make_shared( + GradingTone(other.m_style), + other.m_style, + false)) { *this = other; } GradingToneOpData & GradingToneOpData::operator=(const GradingToneOpData & rhs) { - if (this == &rhs) return *this; + if (this == &rhs) + return *this; OpData::operator=(rhs); @@ -74,7 +78,8 @@ bool GradingToneOpData::isNoOp() const bool GradingToneOpData::isIdentity() const { - if (isDynamic()) return false; + if (isDynamic()) + return false; auto & value = m_value->getValue(); @@ -100,7 +105,7 @@ bool GradingToneOpData::isInverse(ConstGradingToneOpDataRcPtr & r) const GradingToneOpDataRcPtr GradingToneOpData::inverse() const { - auto res = clone(); + auto res = clone(); res->m_direction = GetInverseTransformDirection(m_direction); return res; } @@ -169,13 +174,13 @@ void GradingToneOpData::removeDynamicProperty() noexcept bool GradingToneOpData::equals(const OpData & other) const { - if (!OpData::equals(other)) return false; + if (!OpData::equals(other)) + return false; - const GradingToneOpData* rop = static_cast(&other); + const GradingToneOpData * rop = static_cast(&other); - if (m_direction != rop->m_direction || - m_style != rop->m_style || - !m_value->equals( *(rop->m_value) )) + if (m_direction != rop->m_direction || m_style != rop->m_style + || !m_value->equals(*(rop->m_value))) { return false; } @@ -188,5 +193,4 @@ bool operator==(const GradingToneOpData & lhs, const GradingToneOpData & rhs) return lhs.equals(rhs); } - } // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/ops/gradingtone/GradingToneOpData.h b/src/OpenColorIO/ops/gradingtone/GradingToneOpData.h index a5503a24d7..bd17a717fb 100644 --- a/src/OpenColorIO/ops/gradingtone/GradingToneOpData.h +++ b/src/OpenColorIO/ops/gradingtone/GradingToneOpData.h @@ -1,16 +1,13 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_GRADINGTONE_OPDATA_H #define INCLUDED_OCIO_GRADINGTONE_OPDATA_H - #include #include "Op.h" - namespace OCIO_NAMESPACE { @@ -18,15 +15,12 @@ class GradingToneOpData; typedef OCIO_SHARED_PTR GradingToneOpDataRcPtr; typedef OCIO_SHARED_PTR ConstGradingToneOpDataRcPtr; - class GradingToneOpData : public OpData { public: - - static void ConvertStringToStyleAndDir(const char * str, GradingStyle & style, - TransformDirection & dir); - static const char * ConvertStyleAndDirToString(GradingStyle style, - TransformDirection dir); + static void + ConvertStringToStyleAndDir(const char * str, GradingStyle & style, TransformDirection & dir); + static const char * ConvertStyleAndDirToString(GradingStyle style, TransformDirection dir); explicit GradingToneOpData(GradingStyle style); GradingToneOpData() = delete; @@ -72,9 +66,9 @@ class GradingToneOpData : public OpData bool equals(const OpData & other) const override; private: - GradingStyle m_style; + GradingStyle m_style; DynamicPropertyGradingToneImplRcPtr m_value; - TransformDirection m_direction{ TRANSFORM_DIR_FORWARD }; + TransformDirection m_direction{TRANSFORM_DIR_FORWARD}; }; bool operator==(const GradingToneOpData & lhs, const GradingToneOpData & rhs); diff --git a/src/OpenColorIO/ops/gradingtone/GradingToneOpGPU.cpp b/src/OpenColorIO/ops/gradingtone/GradingToneOpGPU.cpp index 3c64b5046e..d30418450b 100644 --- a/src/OpenColorIO/ops/gradingtone/GradingToneOpGPU.cpp +++ b/src/OpenColorIO/ops/gradingtone/GradingToneOpGPU.cpp @@ -1,14 +1,12 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #include #include "Logging.h" #include "ops/gradingtone/GradingToneOpGPU.h" #include "utils/StringUtils.h" - namespace OCIO_NAMESPACE { namespace @@ -16,49 +14,50 @@ namespace struct GTProperties { - std::string blacksR{ "blacksR" }; - std::string blacksG{ "blacksG" }; - std::string blacksB{ "blacksB" }; - std::string blacksM{ "blacksM" }; - std::string blacksS{ "blacksStart" }; - std::string blacksW{ "blacksWidth" }; - - std::string shadowsR{ "shadowsR" }; - std::string shadowsG{ "shadowsG" }; - std::string shadowsB{ "shadowsB" }; - std::string shadowsM{ "shadowsM" }; - std::string shadowsS{ "shadowsStart" }; - std::string shadowsW{ "shadowsWidth" }; - - std::string midtonesR{ "midtonesR" }; - std::string midtonesG{ "midtonesG" }; - std::string midtonesB{ "midtonesB" }; - std::string midtonesM{ "midtonesM" }; - std::string midtonesS{ "midtonesStart" }; - std::string midtonesW{ "midtonesWidth" }; - - std::string highlightsR{ "highlightsR" }; - std::string highlightsG{ "highlightsG" }; - std::string highlightsB{ "highlightsB" }; - std::string highlightsM{ "highlightsM" }; - std::string highlightsS{ "highlightsStart" }; - std::string highlightsW{ "highlightsWidth" }; - - std::string whitesR{ "whitesR" }; - std::string whitesG{ "whitesG" }; - std::string whitesB{ "whitesB" }; - std::string whitesM{ "whitesM" }; - std::string whitesS{ "whitesStart" }; - std::string whitesW{ "whitesWidth" }; - - std::string sContrast{ "sContrast" }; - - std::string localBypass{ "localBypass" }; + std::string blacksR{"blacksR"}; + std::string blacksG{"blacksG"}; + std::string blacksB{"blacksB"}; + std::string blacksM{"blacksM"}; + std::string blacksS{"blacksStart"}; + std::string blacksW{"blacksWidth"}; + + std::string shadowsR{"shadowsR"}; + std::string shadowsG{"shadowsG"}; + std::string shadowsB{"shadowsB"}; + std::string shadowsM{"shadowsM"}; + std::string shadowsS{"shadowsStart"}; + std::string shadowsW{"shadowsWidth"}; + + std::string midtonesR{"midtonesR"}; + std::string midtonesG{"midtonesG"}; + std::string midtonesB{"midtonesB"}; + std::string midtonesM{"midtonesM"}; + std::string midtonesS{"midtonesStart"}; + std::string midtonesW{"midtonesWidth"}; + + std::string highlightsR{"highlightsR"}; + std::string highlightsG{"highlightsG"}; + std::string highlightsB{"highlightsB"}; + std::string highlightsM{"highlightsM"}; + std::string highlightsS{"highlightsStart"}; + std::string highlightsW{"highlightsWidth"}; + + std::string whitesR{"whitesR"}; + std::string whitesG{"whitesG"}; + std::string whitesB{"whitesB"}; + std::string whitesM{"whitesM"}; + std::string whitesS{"whitesStart"}; + std::string whitesW{"whitesWidth"}; + + std::string sContrast{"sContrast"}; + + std::string localBypass{"localBypass"}; }; -void AddUniform(GpuShaderCreatorRcPtr & shaderCreator, - const GpuShaderCreator::DoubleGetter & getter, - const std::string & name) +void AddUniform( + GpuShaderCreatorRcPtr & shaderCreator, + const GpuShaderCreator::DoubleGetter & getter, + const std::string & name) { // Add the uniform if it does not already exist. if (shaderCreator->addUniform(name.c_str(), getter)) @@ -70,9 +69,10 @@ void AddUniform(GpuShaderCreatorRcPtr & shaderCreator, } } -void AddBoolUniform(GpuShaderCreatorRcPtr & shaderCreator, - const GpuShaderCreator::BoolGetter & getBool, - const std::string & name) +void AddBoolUniform( + GpuShaderCreatorRcPtr & shaderCreator, + const GpuShaderCreator::BoolGetter & getBool, + const std::string & name) { // Add the uniform if it does not already exist. if (shaderCreator->addUniform(name.c_str(), getBool)) @@ -84,13 +84,14 @@ void AddBoolUniform(GpuShaderCreatorRcPtr & shaderCreator, } } -const std::string opPrefix{ "grading_tone" }; +const std::string opPrefix{"grading_tone"}; -void AddGTProperties(GpuShaderCreatorRcPtr & shaderCreator, - GpuShaderText & st, - ConstGradingToneOpDataRcPtr & gtData, - GTProperties & propNames, - bool dyn) +void AddGTProperties( + GpuShaderCreatorRcPtr & shaderCreator, + GpuShaderText & st, + ConstGradingToneOpDataRcPtr & gtData, + GTProperties & propNames, + bool dyn) { auto prop = gtData->getDynamicPropertyInternal(); if (dyn) @@ -139,18 +140,18 @@ void AddGTProperties(GpuShaderCreatorRcPtr & shaderCreator, // Property is decoupled and added to shader creator. DynamicPropertyGradingToneImplRcPtr shaderProp = prop->createEditableCopy(); - DynamicPropertyRcPtr newProp = shaderProp; + DynamicPropertyRcPtr newProp = shaderProp; shaderCreator->addDynamicProperty(newProp); // Use the shader dynamic property to bind the uniforms. - const auto & value = shaderProp->getValue(); - using CompVal = GradingTonePreRender; + const auto & value = shaderProp->getValue(); + using CompVal = GradingTonePreRender; const auto & compVal = shaderProp->getComputedValue(); // Add uniforms if they are not already there. - auto getBDR = std::bind(&GradingRGBMSW::m_red, &value.m_blacks); - auto getBDG = std::bind(&GradingRGBMSW::m_green, &value.m_blacks); - auto getBDB = std::bind(&GradingRGBMSW::m_blue, &value.m_blacks); + auto getBDR = std::bind(&GradingRGBMSW::m_red, &value.m_blacks); + auto getBDG = std::bind(&GradingRGBMSW::m_green, &value.m_blacks); + auto getBDB = std::bind(&GradingRGBMSW::m_blue, &value.m_blacks); auto getBDM = std::bind(&GradingRGBMSW::m_master, &value.m_blacks); auto getBDS = std::bind(&CompVal::m_blacksStart, &compVal); auto getBDW = std::bind(&CompVal::m_blacksWidth, &compVal); @@ -161,9 +162,9 @@ void AddGTProperties(GpuShaderCreatorRcPtr & shaderCreator, AddUniform(shaderCreator, getBDS, propNames.blacksS); AddUniform(shaderCreator, getBDW, propNames.blacksW); - auto getSR = std::bind(&GradingRGBMSW::m_red, &value.m_shadows); - auto getSG = std::bind(&GradingRGBMSW::m_green, &value.m_shadows); - auto getSB = std::bind(&GradingRGBMSW::m_blue, &value.m_shadows); + auto getSR = std::bind(&GradingRGBMSW::m_red, &value.m_shadows); + auto getSG = std::bind(&GradingRGBMSW::m_green, &value.m_shadows); + auto getSB = std::bind(&GradingRGBMSW::m_blue, &value.m_shadows); auto getSM = std::bind(&GradingRGBMSW::m_master, &value.m_shadows); auto getSS = std::bind(&CompVal::m_shadowsStart, &compVal); auto getSW = std::bind(&CompVal::m_shadowsWidth, &compVal); @@ -174,12 +175,12 @@ void AddGTProperties(GpuShaderCreatorRcPtr & shaderCreator, AddUniform(shaderCreator, getSS, propNames.shadowsS); AddUniform(shaderCreator, getSW, propNames.shadowsW); - auto getMR = std::bind(&GradingRGBMSW::m_red, &value.m_midtones); - auto getMG = std::bind(&GradingRGBMSW::m_green, &value.m_midtones); - auto getMB = std::bind(&GradingRGBMSW::m_blue, &value.m_midtones); + auto getMR = std::bind(&GradingRGBMSW::m_red, &value.m_midtones); + auto getMG = std::bind(&GradingRGBMSW::m_green, &value.m_midtones); + auto getMB = std::bind(&GradingRGBMSW::m_blue, &value.m_midtones); auto getMM = std::bind(&GradingRGBMSW::m_master, &value.m_midtones); - auto getMS = std::bind(&GradingRGBMSW::m_start, &value.m_midtones); - auto getMW = std::bind(&GradingRGBMSW::m_width, &value.m_midtones); + auto getMS = std::bind(&GradingRGBMSW::m_start, &value.m_midtones); + auto getMW = std::bind(&GradingRGBMSW::m_width, &value.m_midtones); AddUniform(shaderCreator, getMR, propNames.midtonesR); AddUniform(shaderCreator, getMG, propNames.midtonesG); AddUniform(shaderCreator, getMB, propNames.midtonesB); @@ -187,9 +188,9 @@ void AddGTProperties(GpuShaderCreatorRcPtr & shaderCreator, AddUniform(shaderCreator, getMS, propNames.midtonesS); AddUniform(shaderCreator, getMW, propNames.midtonesW); - auto getHR = std::bind(&GradingRGBMSW::m_red, &value.m_highlights); - auto getHG = std::bind(&GradingRGBMSW::m_green, &value.m_highlights); - auto getHB = std::bind(&GradingRGBMSW::m_blue, &value.m_highlights); + auto getHR = std::bind(&GradingRGBMSW::m_red, &value.m_highlights); + auto getHG = std::bind(&GradingRGBMSW::m_green, &value.m_highlights); + auto getHB = std::bind(&GradingRGBMSW::m_blue, &value.m_highlights); auto getHM = std::bind(&GradingRGBMSW::m_master, &value.m_highlights); auto getHS = std::bind(&CompVal::m_highlightsStart, &compVal); auto getHW = std::bind(&CompVal::m_highlightsWidth, &compVal); @@ -200,9 +201,9 @@ void AddGTProperties(GpuShaderCreatorRcPtr & shaderCreator, AddUniform(shaderCreator, getHS, propNames.highlightsS); AddUniform(shaderCreator, getHW, propNames.highlightsW); - auto getWDR = std::bind(&GradingRGBMSW::m_red, &value.m_whites); - auto getWDG = std::bind(&GradingRGBMSW::m_green, &value.m_whites); - auto getWDB = std::bind(&GradingRGBMSW::m_blue, &value.m_whites); + auto getWDR = std::bind(&GradingRGBMSW::m_red, &value.m_whites); + auto getWDG = std::bind(&GradingRGBMSW::m_green, &value.m_whites); + auto getWDB = std::bind(&GradingRGBMSW::m_blue, &value.m_whites); auto getWDM = std::bind(&GradingRGBMSW::m_master, &value.m_whites); auto getWDS = std::bind(&CompVal::m_whitesStart, &compVal); auto getWDW = std::bind(&CompVal::m_whitesWidth, &compVal); @@ -221,7 +222,7 @@ void AddGTProperties(GpuShaderCreatorRcPtr & shaderCreator, } else { - const auto & value = prop->getValue(); + const auto & value = prop->getValue(); const auto & compVal = prop->getComputedValue(); st.declareVarConst(propNames.blacksR, static_cast(value.m_blacks.m_red)); @@ -268,8 +269,12 @@ static constexpr unsigned G = 1; static constexpr unsigned B = 2; static constexpr unsigned M = 3; -void Add_MidsPre_Shader(unsigned channel, std::string & channelSuffix, GpuShaderText & st, - const GTProperties & props, GradingStyle style) +void Add_MidsPre_Shader( + unsigned channel, + std::string & channelSuffix, + GpuShaderText & st, + const GTProperties & props, + GradingStyle style) { // TODO: Everything in here should move to C++ (doesn't vary per pixel). @@ -277,31 +282,33 @@ void Add_MidsPre_Shader(unsigned channel, std::string & channelSuffix, GpuShader if (channel == R) { channelSuffix = "rgb.r"; - channelValue = props.midtonesR; + channelValue = props.midtonesR; } else if (channel == G) { channelSuffix = "rgb.g"; - channelValue = props.midtonesG; + channelValue = props.midtonesG; } else if (channel == B) { channelSuffix = "rgb.b"; - channelValue = props.midtonesB; + channelValue = props.midtonesB; } else { channelSuffix = "rgb"; - channelValue = props.midtonesM; + channelValue = props.midtonesM; } - st.newLine() << "{"; // establish scope so local variable names won't conflict + st.newLine() << "{"; // establish scope so local variable names won't conflict st.indent(); - float top{ 0.f }, topSC{ 0.f }, bottom{ 0.f }, pivot{ 0.f }; + float top{0.f}, topSC{0.f}, bottom{0.f}, pivot{0.f}; GradingTonePreRender::FromStyle(style, top, topSC, bottom, pivot); - std::string topPoint{ std::to_string(top) }, bottomPoint{ std::to_string(bottom) }; + std::string topPoint{std::to_string(top)}, bottomPoint{std::to_string(bottom)}; + + // clang-format off st.newLine() << st.floatKeywordConst() << " halo = 0.4;"; st.newLine() << st.floatDecl("mid_adj") << " = clamp(" << channelValue << ", 0.01, 1.99);"; @@ -366,19 +373,24 @@ void Add_MidsPre_Shader(unsigned channel, std::string & channelSuffix, GpuShader st.newLine() << st.floatDecl("y3") << " = y2 + (m2 + m3) * (x3 - x2) * 0.5;"; st.newLine() << st.floatDecl("y4") << " = y3 + (m3 + m4) * (x4 - x3) * 0.5;"; st.newLine() << st.floatDecl("y5") << " = y4 + (m4 + m5) * (x5 - x4) * 0.5;"; + + // clang-format on } -void Add_MidsFwd_Shader(GpuShaderCreatorRcPtr & shaderCreator, - GpuShaderText & st, - unsigned channel, - const GTProperties & props, - GradingStyle style) +void Add_MidsFwd_Shader( + GpuShaderCreatorRcPtr & shaderCreator, + GpuShaderText & st, + unsigned channel, + const GTProperties & props, + GradingStyle style) { std::string channelSuffix; Add_MidsPre_Shader(channel, channelSuffix, st, props, style); const std::string pix(shaderCreator->getPixelName()); + // clang-format off + if (channel != M) { st.newLine() << st.floatDecl("t") << " = " << pix << "." << channelSuffix << ";"; @@ -444,19 +456,24 @@ void Add_MidsFwd_Shader(GpuShaderCreatorRcPtr & shaderCreator, st.dedent(); st.newLine() << "}"; // local scope + + // clang-format on } -void Add_MidsRev_Shader(GpuShaderCreatorRcPtr & shaderCreator, - GpuShaderText & st, - unsigned channel, - const GTProperties & props, - GradingStyle style) +void Add_MidsRev_Shader( + GpuShaderCreatorRcPtr & shaderCreator, + GpuShaderText & st, + unsigned channel, + const GTProperties & props, + GradingStyle style) { std::string channelSuffix; Add_MidsPre_Shader(channel, channelSuffix, st, props, style); const std::string pix(shaderCreator->getPixelName()); + // clang-format off + if (channel != M) { st.newLine() << st.floatKeyword() << " t = " << pix << "." << channelSuffix << ";"; @@ -622,13 +639,16 @@ void Add_MidsRev_Shader(GpuShaderCreatorRcPtr & shaderCreator, st.dedent(); st.newLine() << "}"; // local scope + + // clang-format on } -void Add_HighlightShadowPre_Shader(GpuShaderText & st, - unsigned channel, - std::string & channelSuffix, - const GTProperties & props, - bool isShadow) +void Add_HighlightShadowPre_Shader( + GpuShaderText & st, + unsigned channel, + std::string & channelSuffix, + const GTProperties & props, + bool isShadow) { // TODO: Everything in here should move to C++ (doesn't vary per pixel). @@ -639,24 +659,26 @@ void Add_HighlightShadowPre_Shader(GpuShaderText & st, if (channel == R) { channelSuffix = "rgb.r"; - channelValue = isShadow ? props.shadowsR : props.highlightsR; + channelValue = isShadow ? props.shadowsR : props.highlightsR; } else if (channel == G) { channelSuffix = "rgb.g"; - channelValue = isShadow ? props.shadowsG : props.highlightsG; + channelValue = isShadow ? props.shadowsG : props.highlightsG; } else if (channel == B) { channelSuffix = "rgb.b"; - channelValue = isShadow ? props.shadowsB : props.highlightsB; + channelValue = isShadow ? props.shadowsB : props.highlightsB; } else { channelSuffix = "rgb"; - channelValue = isShadow ? props.shadowsM : props.highlightsM; + channelValue = isShadow ? props.shadowsM : props.highlightsM; } + // clang-format off + st.newLine() << "{"; // establish scope so local variable names won't conflict st.indent(); if (isShadow) @@ -680,15 +702,20 @@ void Add_HighlightShadowPre_Shader(GpuShaderText & st, { st.newLine() << "val = 2. - val;"; } + + // clang-format on } -void Add_FauxCubicFwdEval_Shader(GpuShaderCreatorRcPtr & shaderCreator, - GpuShaderText & st, - unsigned channel, - std::string & channelSuffix) +void Add_FauxCubicFwdEval_Shader( + GpuShaderCreatorRcPtr & shaderCreator, + GpuShaderText & st, + unsigned channel, + std::string & channelSuffix) { const std::string pix(shaderCreator->getPixelName()); + // clang-format off + st.newLine() << st.floatKeyword() << " y1 = ( 0.5 / (x2 - x0) ) * " "( (2.*y0 + m0 * (x1 - x0)) * (x2 - x1) + (2.*y2 - m2 * (x2 - x1)) * (x1 - x0) );"; @@ -732,15 +759,20 @@ void Add_FauxCubicFwdEval_Shader(GpuShaderCreatorRcPtr & shaderCreator, st.newLine() << "res.b = (t.b > x2) ? y2 + (t.b - x2) * m2 : res.b;"; } st.newLine() << pix << "." << channelSuffix << " = res;"; + + // clang-format on } -void Add_FauxCubicRevEval_Shader(GpuShaderCreatorRcPtr & shaderCreator, - GpuShaderText & st, - unsigned channel, - std::string & channelSuffix) +void Add_FauxCubicRevEval_Shader( + GpuShaderCreatorRcPtr & shaderCreator, + GpuShaderText & st, + unsigned channel, + std::string & channelSuffix) { const std::string pix(shaderCreator->getPixelName()); + // clang-format off + st.newLine() << st.floatKeyword() << " y1 = ( 0.5 / (x2 - x0) ) * " "( (2.*y0 + m0 * (x1 - x0)) * (x2 - x1) + (2.*y2 - m2 * (x2 - x1)) * (x1 - x0) );"; @@ -790,17 +822,22 @@ void Add_FauxCubicRevEval_Shader(GpuShaderCreatorRcPtr & shaderCreator, st.newLine() << "res.b = (t.b > y2) ? x2 + (t.b - y2) / m2 : res.b;"; } st.newLine() << pix << "." << channelSuffix << " = res;"; + + // clang-format on } -void Add_HighlightShadowFwd_Shader(GpuShaderCreatorRcPtr & shaderCreator, - GpuShaderText & st, - unsigned channel, - bool isShadow, - const GTProperties & props) +void Add_HighlightShadowFwd_Shader( + GpuShaderCreatorRcPtr & shaderCreator, + GpuShaderText & st, + unsigned channel, + bool isShadow, + const GTProperties & props) { std::string channelSuffix; Add_HighlightShadowPre_Shader(st, channel, channelSuffix, props, isShadow); + // clang-format off + st.newLine() << "if (val < 1.)"; st.newLine() << "{"; st.indent(); @@ -837,17 +874,22 @@ void Add_HighlightShadowFwd_Shader(GpuShaderCreatorRcPtr & shaderCreator, st.dedent(); st.newLine() << "}"; // establish scope + + // clang-format on } -void Add_HighlightShadowRev_Shader(GpuShaderCreatorRcPtr & shaderCreator, - GpuShaderText & st, - unsigned channel, - bool isShadow, - const GTProperties & props) +void Add_HighlightShadowRev_Shader( + GpuShaderCreatorRcPtr & shaderCreator, + GpuShaderText & st, + unsigned channel, + bool isShadow, + const GTProperties & props) { std::string channelSuffix; Add_HighlightShadowPre_Shader(st, channel, channelSuffix, props, isShadow); + // clang-format off + st.newLine() << "if (val < 1.)"; st.newLine() << "{"; st.indent(); @@ -883,14 +925,17 @@ void Add_HighlightShadowRev_Shader(GpuShaderCreatorRcPtr & shaderCreator, st.dedent(); st.newLine() << "}"; // establish scope + + // clang-format on } -void Add_WhiteBlackPre_Shader(GpuShaderCreatorRcPtr & shaderCreator, - GpuShaderText & st, - unsigned channel, - std::string & channelSuffix, - bool isBlack, - const GTProperties & props) +void Add_WhiteBlackPre_Shader( + GpuShaderCreatorRcPtr & shaderCreator, + GpuShaderText & st, + unsigned channel, + std::string & channelSuffix, + bool isBlack, + const GTProperties & props) { const std::string pix(shaderCreator->getPixelName()); @@ -900,24 +945,26 @@ void Add_WhiteBlackPre_Shader(GpuShaderCreatorRcPtr & shaderCreator, if (channel == R) { channelSuffix = "rgb.r"; - channelValue = isBlack ? props.blacksR : props.whitesR; + channelValue = isBlack ? props.blacksR : props.whitesR; } else if (channel == G) { channelSuffix = "rgb.g"; - channelValue = isBlack ? props.blacksG : props.whitesG; + channelValue = isBlack ? props.blacksG : props.whitesG; } - else if(channel == B) + else if (channel == B) { channelSuffix = "rgb.b"; - channelValue = isBlack ? props.blacksB : props.whitesB; + channelValue = isBlack ? props.blacksB : props.whitesB; } else { channelSuffix = "rgb"; - channelValue = isBlack ? props.blacksM : props.whitesM; + channelValue = isBlack ? props.blacksM : props.whitesM; } + // clang-format off + st.newLine() << "{"; // establish scope so local variable names won't conflict st.indent(); if (!isBlack) @@ -948,10 +995,14 @@ void Add_WhiteBlackPre_Shader(GpuShaderCreatorRcPtr & shaderCreator, { st.newLine() << st.colorDecl("t") << " = " << pix << ".rgb;"; } + + // clang-format on } void Add_WBFwd_Shader(unsigned channel, bool linearExtrap, GpuShaderText & st) { + // clang-format off + if (channel != M) { st.newLine() << st.floatKeyword() << " tlocal = (t - x0) / (x1 - x0);"; @@ -979,10 +1030,14 @@ void Add_WBFwd_Shader(unsigned channel, bool linearExtrap, GpuShaderText & st) st.newLine() << "res.b = (t.b > x1) ? y1 + (t.b - x1) * m1 : res.b;"; } } + + // clang-format on } void Add_WBRev_Shader(unsigned channel, bool linearExtrap, GpuShaderText & st) { + // clang-format off + st.newLine() << st.floatKeyword() << " a = 0.5 * (m1 - m0) * (x1 - x0);"; st.newLine() << st.floatKeyword() << " b = m0 * (x1 - x0);"; if (channel != M) @@ -1017,10 +1072,14 @@ void Add_WBRev_Shader(unsigned channel, bool linearExtrap, GpuShaderText & st) st.newLine() << "res.b = (t.b > y1) ? x1 + (t.b - y1) / m1 : res.b;"; } } + + // clang-format on } void Add_WBExtrapPre_Shader(GpuShaderText & st) { + // clang-format off + st.newLine() << "res = (res - x0) / gain + x0;"; // Quadratic extrapolation for better HDR control. st.newLine() << st.floatKeyword() << " new_y1 = (x1 - x0) / gain + x0;"; @@ -1031,13 +1090,16 @@ void Add_WBExtrapPre_Shader(GpuShaderText & st) st.newLine() << st.floatKeyword() << " bb = 1. / m1 - 2. * aa * x1;"; st.newLine() << st.floatKeyword() << " cc = new_y1 - bb * x1 - aa * x1 * x1;"; st.newLine() << "t = (t - x0) / gain + x0;"; + + // clang-format on } -void Add_WhiteBlackFwd_Shader(GpuShaderCreatorRcPtr & shaderCreator, - GpuShaderText & st, - unsigned channel, - bool isBlack, - const GTProperties & props) +void Add_WhiteBlackFwd_Shader( + GpuShaderCreatorRcPtr & shaderCreator, + GpuShaderText & st, + unsigned channel, + bool isBlack, + const GTProperties & props) { const std::string pix(shaderCreator->getPixelName()); @@ -1046,6 +1108,8 @@ void Add_WhiteBlackFwd_Shader(GpuShaderCreatorRcPtr & shaderCreator, // Slope is decreasing case. + // clang-format off + st.newLine() << "if (mtest < 1.)"; st.newLine() << "{"; st.indent(); @@ -1129,17 +1193,22 @@ void Add_WhiteBlackFwd_Shader(GpuShaderCreatorRcPtr & shaderCreator, st.dedent(); st.newLine() << "}"; // establish scope so local variable names won't conflict + + // clang-format on } -void Add_WhiteBlackRev_Shader(GpuShaderCreatorRcPtr & shaderCreator, - GpuShaderText & st, - unsigned channel, - bool isBlack, - const GTProperties & props) +void Add_WhiteBlackRev_Shader( + GpuShaderCreatorRcPtr & shaderCreator, + GpuShaderText & st, + unsigned channel, + bool isBlack, + const GTProperties & props) { std::string channelSuffix; Add_WhiteBlackPre_Shader(shaderCreator, st, channel, channelSuffix, isBlack, props); + // clang-format off + // Slope is decreasing case. st.newLine() << "if (mtest < 1.)"; @@ -1235,18 +1304,23 @@ void Add_WhiteBlackRev_Shader(GpuShaderCreatorRcPtr & shaderCreator, st.dedent(); st.newLine() << "}"; // establish scope so local variable names won't conflict + + // clang-format on } -void Add_SContrastTopPre_Shader(GpuShaderCreatorRcPtr & shaderCreator, - GpuShaderText & st, - const GTProperties & props, - GradingStyle style) +void Add_SContrastTopPre_Shader( + GpuShaderCreatorRcPtr & shaderCreator, + GpuShaderText & st, + const GTProperties & props, + GradingStyle style) { const std::string pix(shaderCreator->getPixelName()); - float top{ 0.f }, topSC{ 0.f }, bottom{ 0.f }, pivot{ 0.f }; + float top{0.f}, topSC{0.f}, bottom{0.f}, pivot{0.f}; GradingTonePreRender::FromStyle(style, top, topSC, bottom, pivot); - const std::string topPoint{ std::to_string(topSC) }; + const std::string topPoint{std::to_string(topSC)}; + + // clang-format off st.newLine() << st.floatKeyword() << " contrast = " << props.sContrast << ";"; st.newLine() << "if (contrast != 1.)"; @@ -1291,13 +1365,17 @@ void Add_SContrastTopPre_Shader(GpuShaderCreatorRcPtr & shaderCreator, st.newLine() << st.floatKeyword() << " y2 = y1 + (m0 + m3) * (x2 - x1) * 0.5;"; // TODO: the above should not be in the GLSL (is not per-pixel) + + // clang-format on } void Add_SContrastBottomPre_Shader(GpuShaderText & st, GradingStyle style) { - float top{ 0.f }, topSC{ 0.f }, bottom{ 0.f }, pivot{ 0.f }; + float top{0.f}, topSC{0.f}, bottom{0.f}, pivot{0.f}; GradingTonePreRender::FromStyle(style, top, topSC, bottom, pivot); - const std::string bottomPoint{ std::to_string(bottom) }; + const std::string bottomPoint{std::to_string(bottom)}; + + // clang-format off // Bottom end st.newLine() << "{"; // establish scope so local variable names won't conflict @@ -1327,17 +1405,22 @@ void Add_SContrastBottomPre_Shader(GpuShaderText & st, GradingStyle style) st.newLine() << st.floatKeyword() << " y1 = y2 - (m0 + m3) * (x2 - x1) * 0.5;"; // TODO: the above should not be in the GLSL (is not per-pixel) + + // clang-format on } -void Add_SContrastFwd_Shader(GpuShaderCreatorRcPtr & shaderCreator, - GpuShaderText & st, - const GTProperties & props, - GradingStyle style) +void Add_SContrastFwd_Shader( + GpuShaderCreatorRcPtr & shaderCreator, + GpuShaderText & st, + const GTProperties & props, + GradingStyle style) { Add_SContrastTopPre_Shader(shaderCreator, st, props, style); const std::string pix(shaderCreator->getPixelName()); + // clang-format off + st.newLine() << pix << ".rgb = (t - pivot) * contrast + pivot;"; st.newLine() << st.float3Decl("tR") << " = (t - x1) / (x2 - x1);"; @@ -1368,15 +1451,20 @@ void Add_SContrastFwd_Shader(GpuShaderCreatorRcPtr & shaderCreator, st.dedent(); st.newLine() << "}"; // end if contrast != 1. + + // clang-format on } -void Add_SContrastRev_Shader(GpuShaderCreatorRcPtr & shaderCreator, - GpuShaderText & st, - const GTProperties & props, - GradingStyle style) +void Add_SContrastRev_Shader( + GpuShaderCreatorRcPtr & shaderCreator, + GpuShaderText & st, + const GTProperties & props, + GradingStyle style) { Add_SContrastTopPre_Shader(shaderCreator, st, props, style); + // clang-format off + const std::string pix(shaderCreator->getPixelName()); st.newLine() << pix << ".rgb = (t - pivot) / contrast + pivot;"; @@ -1415,12 +1503,15 @@ void Add_SContrastRev_Shader(GpuShaderCreatorRcPtr & shaderCreator, st.dedent(); st.newLine() << "}"; // end if contrast != 1. + + // clang-format on } -void AddGTForwardShader(GpuShaderCreatorRcPtr & shaderCreator, - GpuShaderText & st, - const GTProperties & props, - GradingStyle style) +void AddGTForwardShader( + GpuShaderCreatorRcPtr & shaderCreator, + GpuShaderText & st, + const GTProperties & props, + GradingStyle style) { if (style == GRADING_LIN) { @@ -1456,7 +1547,6 @@ void AddGTForwardShader(GpuShaderCreatorRcPtr & shaderCreator, Add_SContrastFwd_Shader(shaderCreator, st, props, style); - if (style == GRADING_LIN) { AddLogToLinShader(shaderCreator, st); @@ -1470,10 +1560,11 @@ void AddGTForwardShader(GpuShaderCreatorRcPtr & shaderCreator, st.newLine() << pix << " = min( " << pix << ", 65504. );"; } -void AddGTInverseShader(GpuShaderCreatorRcPtr & shaderCreator, - GpuShaderText & st, - const GTProperties & props, - GradingStyle style) +void AddGTInverseShader( + GpuShaderCreatorRcPtr & shaderCreator, + GpuShaderText & st, + const GTProperties & props, + GradingStyle style) { if (style == GRADING_LIN) @@ -1523,12 +1614,13 @@ void AddGTInverseShader(GpuShaderCreatorRcPtr & shaderCreator, st.newLine() << pix << " = min( " << pix << ", 65504. );"; } -} +} // namespace -void GetGradingToneGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, - ConstGradingToneOpDataRcPtr & gtData) +void GetGradingToneGPUShaderProgram( + GpuShaderCreatorRcPtr & shaderCreator, + ConstGradingToneOpDataRcPtr & gtData) { - const bool dyn = gtData->isDynamic() && shaderCreator->getLanguage() != LANGUAGE_OSL_1; + const bool dyn = gtData->isDynamic() && shaderCreator->getLanguage() != LANGUAGE_OSL_1; if (!dyn) { auto propGT = gtData->getDynamicPropertyInternal(); @@ -1540,7 +1632,7 @@ void GetGradingToneGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, if (gtData->isDynamic() && shaderCreator->getLanguage() == LANGUAGE_OSL_1) { - std::string msg("The dynamic properties are not yet supported by the 'Open Shading language"\ + std::string msg("The dynamic properties are not yet supported by the 'Open Shading language" " (OSL)' translation: The '"); msg += opPrefix; msg += "' dynamic property is replaced by a local variable."; @@ -1548,12 +1640,14 @@ void GetGradingToneGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, LogWarning(msg); } - const GradingStyle style = gtData->getStyle(); + const GradingStyle style = gtData->getStyle(); const TransformDirection dir = gtData->getDirection(); GpuShaderText st(shaderCreator->getLanguage()); st.indent(); + // clang-format off + st.newLine() << ""; st.newLine() << "// Add GradingTone '" << GradingStyleToString(style) << "' " @@ -1562,6 +1656,8 @@ void GetGradingToneGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, st.newLine() << "{"; st.indent(); + // clang-format on + // Properties hold shader variables names and are initialized with undecorated names suitable // for local variables. GTProperties properties; @@ -1576,12 +1672,12 @@ void GetGradingToneGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, switch (dir) { - case TRANSFORM_DIR_FORWARD: - AddGTForwardShader(shaderCreator, st, properties, style); - break; - case TRANSFORM_DIR_INVERSE: - AddGTInverseShader(shaderCreator, st, properties, style); - break; + case TRANSFORM_DIR_FORWARD: + AddGTForwardShader(shaderCreator, st, properties, style); + break; + case TRANSFORM_DIR_INVERSE: + AddGTInverseShader(shaderCreator, st, properties, style); + break; } if (dyn) @@ -1597,4 +1693,4 @@ void GetGradingToneGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, shaderCreator->addToFunctionShaderCode(st.string().c_str()); } -} // OCIO_NAMESPACE +} // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/ops/gradingtone/GradingToneOpGPU.h b/src/OpenColorIO/ops/gradingtone/GradingToneOpGPU.h index 920714bd9f..6f647df2de 100644 --- a/src/OpenColorIO/ops/gradingtone/GradingToneOpGPU.h +++ b/src/OpenColorIO/ops/gradingtone/GradingToneOpGPU.h @@ -12,11 +12,10 @@ namespace OCIO_NAMESPACE { -void GetGradingToneGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, - ConstGradingToneOpDataRcPtr & gtData); +void GetGradingToneGPUShaderProgram( + GpuShaderCreatorRcPtr & shaderCreator, + ConstGradingToneOpDataRcPtr & gtData); } // namespace OCIO_NAMESPACE #endif - - diff --git a/src/OpenColorIO/ops/log/LogOp.cpp b/src/OpenColorIO/ops/log/LogOp.cpp index 8eeff9b3b2..aa80153552 100644 --- a/src/OpenColorIO/ops/log/LogOp.cpp +++ b/src/OpenColorIO/ops/log/LogOp.cpp @@ -1,20 +1,20 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. +#include #include #include #include -#include #include -#include "HashUtils.h" #include "GpuShaderUtils.h" +#include "HashUtils.h" #include "MathUtils.h" +#include "ops/log/LogOp.h" #include "ops/log/LogOpCPU.h" #include "ops/log/LogOpData.h" #include "ops/log/LogOpGPU.h" -#include "ops/log/LogOp.h" #include "transforms/LogAffineTransform.h" #include "transforms/LogCameraTransform.h" #include "transforms/LogTransform.h" @@ -23,10 +23,10 @@ namespace OCIO_NAMESPACE { namespace { -class LogOp: public Op +class LogOp : public Op { public: - LogOp() = delete; + LogOp() = delete; LogOp(const LogOp &) = delete; explicit LogOp(LogOpDataRcPtr & log); @@ -70,7 +70,8 @@ OpRcPtr LogOp::clone() const } LogOp::~LogOp() -{ } +{ +} std::string LogOp::getInfo() const { @@ -80,14 +81,16 @@ std::string LogOp::getInfo() const bool LogOp::isSameType(ConstOpRcPtr & op) const { ConstLogOpRcPtr typedRcPtr = DynamicPtrCast(op); - if (!typedRcPtr) return false; + if (!typedRcPtr) + return false; return true; } bool LogOp::isInverse(ConstOpRcPtr & op) const { ConstLogOpRcPtr typedRcPtr = DynamicPtrCast(op); - if (!typedRcPtr) return false; + if (!typedRcPtr) + return false; ConstLogOpDataRcPtr logOpData = typedRcPtr->logData(); return logData()->isInverse(logOpData); @@ -116,20 +119,21 @@ void LogOp::extractGpuShaderInfo(GpuShaderCreatorRcPtr & shaderCreator) const GetLogGPUShaderProgram(shaderCreator, data); } -} // Anon namespace +} // namespace /////////////////////////////////////////////////////////////////////////// -void CreateLogOp(OpRcPtrVec & ops, - double base, - const double(&logSlope)[3], - const double(&logOffset)[3], - const double(&linSlope)[3], - const double(&linOffset)[3], - TransformDirection direction) -{ - auto opData = std::make_shared(base, logSlope, logOffset, - linSlope, linOffset, direction); +void CreateLogOp( + OpRcPtrVec & ops, + double base, + const double (&logSlope)[3], + const double (&logOffset)[3], + const double (&linSlope)[3], + const double (&linOffset)[3], + TransformDirection direction) +{ + auto opData + = std::make_shared(base, logSlope, logOffset, linSlope, linOffset, direction); ops.push_back(std::make_shared(opData)); } @@ -139,9 +143,7 @@ void CreateLogOp(OpRcPtrVec & ops, double base, TransformDirection direction) ops.push_back(std::make_shared(opData)); } -void CreateLogOp(OpRcPtrVec & ops, - LogOpDataRcPtr & logData, - TransformDirection direction) +void CreateLogOp(OpRcPtrVec & ops, LogOpDataRcPtr & logData, TransformDirection direction) { auto log = logData; if (direction == TRANSFORM_DIR_INVERSE) @@ -152,7 +154,6 @@ void CreateLogOp(OpRcPtrVec & ops, ops.push_back(std::make_shared(log)); } - /////////////////////////////////////////////////////////////////////////// void CreateLogTransform(GroupTransformRcPtr & group, ConstOpRcPtr & op) @@ -165,31 +166,29 @@ void CreateLogTransform(GroupTransformRcPtr & group, ConstOpRcPtr & op) auto logData = DynamicPtrCast(op->data()); if (logData->isCamera()) { - double linSB[]{ 0.1, 0.1, 0.1 }; + double linSB[]{0.1, 0.1, 0.1}; auto logTransform = LogCameraTransform::Create(linSB); - auto & data = dynamic_cast(logTransform.get())->data(); - data = *logData; + auto & data = dynamic_cast(logTransform.get())->data(); + data = *logData; group->appendTransform(logTransform); } else if (logData->isSimpleLog()) { auto logTransform = LogTransform::Create(); - auto & data = dynamic_cast(logTransform.get())->data(); - data = *logData; + auto & data = dynamic_cast(logTransform.get())->data(); + data = *logData; group->appendTransform(logTransform); } else { auto logTransform = LogAffineTransform::Create(); - auto & data = dynamic_cast(logTransform.get())->data(); - data = *logData; + auto & data = dynamic_cast(logTransform.get())->data(); + data = *logData; group->appendTransform(logTransform); } } -void BuildLogOp(OpRcPtrVec & ops, - const LogAffineTransform & transform, - TransformDirection dir) +void BuildLogOp(OpRcPtrVec & ops, const LogAffineTransform & transform, TransformDirection dir) { const auto & data = dynamic_cast(transform).data(); data.validate(); @@ -198,9 +197,7 @@ void BuildLogOp(OpRcPtrVec & ops, CreateLogOp(ops, log, dir); } -void BuildLogOp(OpRcPtrVec & ops, - const LogCameraTransform & transform, - TransformDirection dir) +void BuildLogOp(OpRcPtrVec & ops, const LogCameraTransform & transform, TransformDirection dir) { const auto & data = dynamic_cast(transform).data(); data.validate(); @@ -209,9 +206,7 @@ void BuildLogOp(OpRcPtrVec & ops, CreateLogOp(ops, log, dir); } -void BuildLogOp(OpRcPtrVec & ops, - const LogTransform & transform, - TransformDirection dir) +void BuildLogOp(OpRcPtrVec & ops, const LogTransform & transform, TransformDirection dir) { const auto & data = dynamic_cast(transform).data(); data.validate(); @@ -221,4 +216,3 @@ void BuildLogOp(OpRcPtrVec & ops, } } // namespace OCIO_NAMESPACE - diff --git a/src/OpenColorIO/ops/log/LogOp.h b/src/OpenColorIO/ops/log/LogOp.h index 9f65419753..ce71a2571b 100644 --- a/src/OpenColorIO/ops/log/LogOp.h +++ b/src/OpenColorIO/ops/log/LogOp.h @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_LOGOPS_H #define INCLUDED_OCIO_LOGOPS_H @@ -19,19 +18,18 @@ namespace OCIO_NAMESPACE // In the forward direction this is lin->log. // All input vectors are size 3 (excluding base). -void CreateLogOp(OpRcPtrVec & ops, - double base, - const double(&logSlope)[3], - const double(&logOffset)[3], - const double(&linSlope)[3], - const double(&linOffset)[3], - TransformDirection direction); +void CreateLogOp( + OpRcPtrVec & ops, + double base, + const double (&logSlope)[3], + const double (&logOffset)[3], + const double (&linSlope)[3], + const double (&linOffset)[3], + TransformDirection direction); void CreateLogOp(OpRcPtrVec & ops, double base, TransformDirection direction); -void CreateLogOp(OpRcPtrVec & ops, - LogOpDataRcPtr & logData, - TransformDirection direction); +void CreateLogOp(OpRcPtrVec & ops, LogOpDataRcPtr & logData, TransformDirection direction); // Create a copy of the log transform in the op and append it to the GroupTransform. void CreateLogTransform(GroupTransformRcPtr & group, ConstOpRcPtr & op); diff --git a/src/OpenColorIO/ops/log/LogOpCPU.cpp b/src/OpenColorIO/ops/log/LogOpCPU.cpp index bed3c9d5a1..98328860cd 100644 --- a/src/OpenColorIO/ops/log/LogOpCPU.cpp +++ b/src/OpenColorIO/ops/log/LogOpCPU.cpp @@ -2,8 +2,8 @@ // Copyright Contributors to the OpenColorIO Project. #include -#include #include +#include #if OCIO_USE_SSE2 == 0 #include #endif @@ -12,18 +12,18 @@ #include "BitDepthUtils.h" #include "MathUtils.h" -#include "ops/log/LogOpCPU.h" -#include "ops/log/LogUtils.h" -#include "ops/OpTools.h" #include "Platform.h" #include "SSE.h" +#include "ops/OpTools.h" +#include "ops/log/LogOpCPU.h" +#include "ops/log/LogUtils.h" namespace OCIO_NAMESPACE { class LogOpCPU : public OpCPU { public: - LogOpCPU() = delete; + LogOpCPU() = delete; LogOpCPU(const LogOpCPU &) = delete; explicit LogOpCPU(ConstLogOpDataRcPtr & log); @@ -218,8 +218,8 @@ class AntiLogRendererSSE : public AntiLogRenderer }; #endif -static constexpr float LOG2_10 = ((float) 3.3219280948873623478703194294894); -static constexpr float LOG10_2 = ((float) 0.3010299956639811952137388947245); +static constexpr float LOG2_10 = ((float)3.3219280948873623478703194294894); +static constexpr float LOG10_2 = ((float)0.3010299956639811952137388947245); ConstOpCPURcPtr GetLogRenderer(ConstLogOpDataRcPtr & log, bool fastExp) { @@ -232,40 +232,44 @@ ConstOpCPURcPtr GetLogRenderer(ConstLogOpDataRcPtr & log, bool fastExp) { switch (dir) { - case TRANSFORM_DIR_FORWARD: + case TRANSFORM_DIR_FORWARD: #if OCIO_USE_SSE2 - if (fastExp) return std::make_shared(log, 1.0f); - else + if (fastExp) + return std::make_shared(log, 1.0f); + else #endif - return std::make_shared(log, 1.0f); - break; - case TRANSFORM_DIR_INVERSE: + return std::make_shared(log, 1.0f); + break; + case TRANSFORM_DIR_INVERSE: #if OCIO_USE_SSE2 - if (fastExp) return std::make_shared(log, 1.0f); - else + if (fastExp) + return std::make_shared(log, 1.0f); + else #endif - return std::make_shared(log, 1.0f); - break; + return std::make_shared(log, 1.0f); + break; } } else if (log->isLog10()) { switch (dir) { - case TRANSFORM_DIR_FORWARD: + case TRANSFORM_DIR_FORWARD: #if OCIO_USE_SSE2 - if (fastExp) return std::make_shared(log, LOG10_2); - else + if (fastExp) + return std::make_shared(log, LOG10_2); + else #endif - return std::make_shared(log, LOG10_2); - break; - case TRANSFORM_DIR_INVERSE: + return std::make_shared(log, LOG10_2); + break; + case TRANSFORM_DIR_INVERSE: #if OCIO_USE_SSE2 - if (fastExp) return std::make_shared(log, LOG2_10); - else + if (fastExp) + return std::make_shared(log, LOG2_10); + else #endif - return std::make_shared(log, LOG2_10); - break; + return std::make_shared(log, LOG2_10); + break; } } else @@ -274,40 +278,44 @@ ConstOpCPURcPtr GetLogRenderer(ConstLogOpDataRcPtr & log, bool fastExp) { switch (dir) { - case TRANSFORM_DIR_FORWARD: + case TRANSFORM_DIR_FORWARD: #if OCIO_USE_SSE2 - if (fastExp) return std::make_shared(log); - else + if (fastExp) + return std::make_shared(log); + else #endif - return std::make_shared(log); - break; - case TRANSFORM_DIR_INVERSE: + return std::make_shared(log); + break; + case TRANSFORM_DIR_INVERSE: #if OCIO_USE_SSE2 - if (fastExp) return std::make_shared(log); - else + if (fastExp) + return std::make_shared(log); + else #endif - return std::make_shared(log); - break; + return std::make_shared(log); + break; } } else { switch (dir) { - case TRANSFORM_DIR_FORWARD: + case TRANSFORM_DIR_FORWARD: #if OCIO_USE_SSE2 - if (fastExp) return std::make_shared(log); - else + if (fastExp) + return std::make_shared(log); + else #endif - return std::make_shared(log); - break; - case TRANSFORM_DIR_INVERSE: + return std::make_shared(log); + break; + case TRANSFORM_DIR_INVERSE: #if OCIO_USE_SSE2 - if (fastExp) return std::make_shared(log); - else + if (fastExp) + return std::make_shared(log); + else #endif - return std::make_shared(log); - break; + return std::make_shared(log); + break; } } } @@ -323,7 +331,6 @@ void LogOpCPU::updateData(ConstLogOpDataRcPtr & /* log */) { } - L2LBaseRenderer::L2LBaseRenderer(ConstLogOpDataRcPtr & log) : LogOpCPU(log) { @@ -333,7 +340,7 @@ void L2LBaseRenderer::updateData(ConstLogOpDataRcPtr & log) { LogOpCPU::updateData(log); - m_base = (float)log->getBase(); + m_base = (float)log->getBase(); m_paramsR = log->getRedParams(); m_paramsG = log->getGreenParams(); m_paramsB = log->getBlueParams(); @@ -393,9 +400,9 @@ void LogRenderer::apply(const void * inImg, void * outImg, long numPixels) const static constexpr float minValue = std::numeric_limits::min(); const float * in = (const float *)inImg; - float * out = (float *)outImg; + float * out = (float *)outImg; - for (long idx = 0; idx::min(); const float * in = (const float *)inImg; - float * out = (float *)outImg; + float * out = (float *)outImg; const __m128 mm_minValue = _mm_set1_ps(minValue); const __m128 mm_logScale = _mm_set1_ps(m_logScale); __m128 mm_pixel; - for (long idx = 0; idx::min(); const float * in = (const float *)inImg; - float * out = (float *)outImg; + float * out = (float *)outImg; - for (long idx = 0; idx::min(); const float * in = (const float *)inImg; - float * out = (float *)outImg; + float * out = (float *)outImg; const __m128 mm_minValue = _mm_set1_ps(minValue); - const __m128 mm_m = _mm_set_ps(0.0f, m_m[2], m_m[1], m_m[0]); - const __m128 mm_b = _mm_set_ps(0.0f, m_b[2], m_b[1], m_b[0]); + const __m128 mm_m = _mm_set_ps(0.0f, m_m[2], m_m[1], m_m[0]); + const __m128 mm_b = _mm_set_ps(0.0f, m_b[2], m_b[1], m_b[0]); const __m128 mm_klog = _mm_set_ps(0.0f, m_klog[2], m_klog[1], m_klog[0]); - const __m128 mm_kb = _mm_set_ps(0.0f, m_kb[2], m_kb[1], m_kb[0]); + const __m128 mm_kb = _mm_set_ps(0.0f, m_kb[2], m_kb[1], m_kb[0]); __m128 mm_pixel; - for (long idx = 0; idx::min(); const float * in = (const float *)inImg; - float * out = (float *)outImg; + float * out = (float *)outImg; - for (long idx = 0; idx::min(); const float * in = (const float *)inImg; - float * out = (float *)outImg; + float * out = (float *)outImg; const __m128 mm_minValue = _mm_set1_ps(minValue); - const __m128 mm_m = _mm_set_ps(0.0f, m_m[2], m_m[1], m_m[0]); - const __m128 mm_b = _mm_set_ps(0.0f, m_b[2], m_b[1], m_b[0]); + const __m128 mm_m = _mm_set_ps(0.0f, m_m[2], m_m[1], m_m[0]); + const __m128 mm_b = _mm_set_ps(0.0f, m_b[2], m_b[1], m_b[0]); const __m128 mm_klog = _mm_set_ps(0.0f, m_klog[2], m_klog[1], m_klog[0]); - const __m128 mm_kb = _mm_set_ps(0.0f, m_kb[2], m_kb[1], m_kb[0]); + const __m128 mm_kb = _mm_set_ps(0.0f, m_kb[2], m_kb[1], m_kb[0]); const __m128 mm_lins = _mm_set_ps(0.0f, m_linearSlope[2], m_linearSlope[1], m_linearSlope[0]); - const __m128 mm_lino = _mm_set_ps(0.0f, m_linearOffset[2], m_linearOffset[1], m_linearOffset[0]); + const __m128 mm_lino + = _mm_set_ps(0.0f, m_linearOffset[2], m_linearOffset[1], m_linearOffset[0]); const __m128 breakPnt = _mm_set_ps(0.f, m_linb[2], m_linb[1], m_linb[0]); __m128 mm_pixel; __m128 mm_pixel_lin; - for (long idx = 0; idx= m_redParams.size()) { @@ -169,10 +174,11 @@ bool LogOpData::getValue(LogAffineParameter val, double(&values)[3]) const noexc return true; } -void LogOpData::setParameters(const double(&logSlope)[3], - const double(&logOffset)[3], - const double(&linSlope)[3], - const double(&linOffset)[3]) +void LogOpData::setParameters( + const double (&logSlope)[3], + const double (&logOffset)[3], + const double (&linSlope)[3], + const double (&linOffset)[3]) { m_redParams.resize(4); m_greenParams.resize(4); @@ -184,10 +190,11 @@ void LogOpData::setParameters(const double(&logSlope)[3], setValue(LIN_SIDE_OFFSET, linOffset); } -void LogOpData::getParameters(double(&logSlope)[3], - double(&logOffset)[3], - double(&linSlope)[3], - double(&linOffset)[3]) const +void LogOpData::getParameters( + double (&logSlope)[3], + double (&logOffset)[3], + double (&linSlope)[3], + double (&linOffset)[3]) const { getValue(LOG_SIDE_SLOPE, logSlope); getValue(LOG_SIDE_OFFSET, logOffset); @@ -205,8 +212,7 @@ void LogOpData::validate() const ValidateParams(m_greenParams, m_direction); ValidateParams(m_blueParams, m_direction); - if (m_redParams.size() != m_greenParams.size() || - m_redParams.size() != m_blueParams.size()) + if (m_redParams.size() != m_greenParams.size() || m_redParams.size() != m_blueParams.size()) { throw Exception("Log: Red, green & blue parameters must have the same size."); } @@ -244,44 +250,46 @@ OpDataRcPtr LogOpData::getIdentityReplacement() const { switch (m_direction) { - case TRANSFORM_DIR_FORWARD: - // The first op logarithm is not defined for negative values. - resOp = std::make_shared(0., - // Don't clamp high end. - RangeOpData::EmptyValue(), - 0., - RangeOpData::EmptyValue()); - break; - case TRANSFORM_DIR_INVERSE: - // In principle, the power function is defined over the entire domain. - // However, in practice the input to the following logarithm is clamped - // to a very small positive number and this imposes a limit. - // E.g., log10(FLOAT_MIN) = -37.93, but this is so small that it makes - // more sense to consider it an exact inverse. - resOp = std::make_shared(); - break; + case TRANSFORM_DIR_FORWARD: + // The first op logarithm is not defined for negative values. + resOp = std::make_shared( + 0., + // Don't clamp high end. + RangeOpData::EmptyValue(), + 0., + RangeOpData::EmptyValue()); + break; + case TRANSFORM_DIR_INVERSE: + // In principle, the power function is defined over the entire domain. + // However, in practice the input to the following logarithm is clamped + // to a very small positive number and this imposes a limit. + // E.g., log10(FLOAT_MIN) = -37.93, but this is so small that it makes + // more sense to consider it an exact inverse. + resOp = std::make_shared(); + break; } } else if (!isCamera()) { switch (m_direction) { - case TRANSFORM_DIR_FORWARD: // LinToLog -> LogToLin - { - // Minimum value allowed is -linOffset/linSlope so that linSlope*x+linOffset > 0. - const double minValue = -m_redParams[LIN_SIDE_OFFSET] / m_redParams[LIN_SIDE_SLOPE]; - resOp = std::make_shared(minValue, - // Don't clamp high end. - RangeOpData::EmptyValue(), - minValue, - RangeOpData::EmptyValue()); - break; - } - case TRANSFORM_DIR_INVERSE: // LogToLin -> LinToLog - { - resOp = std::make_shared(); - break; - } + case TRANSFORM_DIR_FORWARD: // LinToLog -> LogToLin + { + // Minimum value allowed is -linOffset/linSlope so that linSlope*x+linOffset > 0. + const double minValue = -m_redParams[LIN_SIDE_OFFSET] / m_redParams[LIN_SIDE_SLOPE]; + resOp = std::make_shared( + minValue, + // Don't clamp high end. + RangeOpData::EmptyValue(), + minValue, + RangeOpData::EmptyValue()); + break; + } + case TRANSFORM_DIR_INVERSE: // LogToLin -> LinToLog + { + resOp = std::make_shared(); + break; + } } } else @@ -308,10 +316,10 @@ std::string LogOpData::getCacheID() const cacheIDStream << TransformDirectionToString(m_direction) << " "; - cacheIDStream << "Base " << getBaseString(DefaultValues::FLOAT_DECIMALS) << " "; - cacheIDStream << "LogSideSlope " << getLogSlopeString(DefaultValues::FLOAT_DECIMALS) << " "; + cacheIDStream << "Base " << getBaseString(DefaultValues::FLOAT_DECIMALS) << " "; + cacheIDStream << "LogSideSlope " << getLogSlopeString(DefaultValues::FLOAT_DECIMALS) << " "; cacheIDStream << "LogSideOffset " << getLogOffsetString(DefaultValues::FLOAT_DECIMALS) << " "; - cacheIDStream << "LinSideSlope " << getLinSlopeString(DefaultValues::FLOAT_DECIMALS) << " "; + cacheIDStream << "LinSideSlope " << getLinSlopeString(DefaultValues::FLOAT_DECIMALS) << " "; cacheIDStream << "LinSideOffset " << getLinOffsetString(DefaultValues::FLOAT_DECIMALS); if (m_redParams.size() > 4) { @@ -324,26 +332,26 @@ std::string LogOpData::getCacheID() const return cacheIDStream.str(); } -bool LogOpData::equals(const OpData& other) const +bool LogOpData::equals(const OpData & other) const { - if (!OpData::equals(other)) return false; + if (!OpData::equals(other)) + return false; - const LogOpData* log = static_cast(&other); + const LogOpData * log = static_cast(&other); - return (m_direction == log->m_direction - && m_base == log->m_base - && m_redParams == log->m_redParams - && m_greenParams == log->m_greenParams - && m_blueParams == log->m_blueParams); + return ( + m_direction == log->m_direction && m_base == log->m_base && m_redParams == log->m_redParams + && m_greenParams == log->m_greenParams && m_blueParams == log->m_blueParams); } LogOpDataRcPtr LogOpData::clone() const { - auto clone = std::make_shared(getBase(), - getRedParams(), - getGreenParams(), - getBlueParams(), - m_direction); + auto clone = std::make_shared( + getBase(), + getRedParams(), + getGreenParams(), + getBlueParams(), + m_direction); clone->getFormatMetadata() = getFormatMetadata(); return clone; } @@ -363,9 +371,8 @@ LogOpDataRcPtr LogOpData::inverse() const bool LogOpData::isInverse(ConstLogOpDataRcPtr & log) const { - if (GetInverseTransformDirection(m_direction) == log->m_direction - && allComponentsEqual() && log->allComponentsEqual() - && getRedParams() == log->getRedParams() + if (GetInverseTransformDirection(m_direction) == log->m_direction && allComponentsEqual() + && log->allComponentsEqual() && getRedParams() == log->getRedParams() && getBase() == log->getBase()) { return true; @@ -455,10 +462,8 @@ bool LogOpData::isSimpleLog() const { if (allComponentsEqual() && m_redParams.size() == 4) { - if (m_redParams[LOG_SIDE_SLOPE] == 1.0 - && m_redParams[LIN_SIDE_SLOPE] == 1.0 - && m_redParams[LIN_SIDE_OFFSET] == 0.0 - && m_redParams[LOG_SIDE_OFFSET] == 0.0) + if (m_redParams[LOG_SIDE_SLOPE] == 1.0 && m_redParams[LIN_SIDE_SLOPE] == 1.0 + && m_redParams[LIN_SIDE_OFFSET] == 0.0 && m_redParams[LOG_SIDE_OFFSET] == 0.0) { return true; } @@ -470,7 +475,7 @@ bool LogOpData::isLogBase(double base) const { if (isSimpleLog() && m_base == base) { - return true; + return true; } return false; } diff --git a/src/OpenColorIO/ops/log/LogOpData.h b/src/OpenColorIO/ops/log/LogOpData.h index 3c8ddc3e2b..2f4aa193b1 100644 --- a/src/OpenColorIO/ops/log/LogOpData.h +++ b/src/OpenColorIO/ops/log/LogOpData.h @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_OPS_LOG_LOGOPDATA_H #define INCLUDED_OCIO_OPS_LOG_LOGOPDATA_H @@ -30,10 +29,9 @@ typedef OCIO_SHARED_PTR ConstLogOpDataRcPtr; class LogOpData : public OpData { // This class represents the Log op. - // + // // A log op applies one of a family of parametric logarithmic functions. public: - // Order of LogParams follows LogAffineParameter: // LOG_SIDE_SLOPE, LOG_SIDE_OFFSET, // LIN_SIDE_SLOPE, LIN_SIDE_OFFSET. @@ -48,18 +46,20 @@ class LogOpData : public OpData LogOpData(double base, TransformDirection direction); - LogOpData(double base, - const double(&logSlope)[3], - const double(&logOffset)[3], - const double(&linSlope)[3], - const double(&linOffset)[3], - TransformDirection direction); - - LogOpData(double base, - const Params & redParams, - const Params & greenParams, - const Params & blueParams, - TransformDirection dir); + LogOpData( + double base, + const double (&logSlope)[3], + const double (&logOffset)[3], + const double (&linSlope)[3], + const double (&linOffset)[3], + TransformDirection direction); + + LogOpData( + double base, + const Params & redParams, + const Params & greenParams, + const Params & blueParams, + TransformDirection dir); virtual ~LogOpData(); @@ -77,7 +77,7 @@ class LogOpData : public OpData std::string getCacheID() const override; - bool equals(const OpData& other) const override; + bool equals(const OpData & other) const override; LogOpDataRcPtr clone() const; @@ -125,23 +125,25 @@ class LogOpData : public OpData double getBase() const noexcept; - void setValue(LogAffineParameter val, const double(&values)[3]); + void setValue(LogAffineParameter val, const double (&values)[3]); // Can be used to remove LINEAR_SLOPE void unsetLinearSlope(); // Return false if value is not defined. - bool getValue(LogAffineParameter val, double(&values)[3]) const noexcept; - - void setParameters(const double(&logSlope)[3], - const double(&logOffset)[3], - const double(&linSlope)[3], - const double(&linOffset)[3]); - - void getParameters(double(&logSlope)[3], - double(&logOffset)[3], - double(&linSlope)[3], - double(&linOffset)[3]) const; + bool getValue(LogAffineParameter val, double (&values)[3]) const noexcept; + + void setParameters( + const double (&logSlope)[3], + const double (&logOffset)[3], + const double (&linSlope)[3], + const double (&linOffset)[3]); + + void getParameters( + double (&logSlope)[3], + double (&logOffset)[3], + double (&linSlope)[3], + double (&linOffset)[3]) const; private: bool isLogBase(double base) const; diff --git a/src/OpenColorIO/ops/log/LogOpGPU.cpp b/src/OpenColorIO/ops/log/LogOpGPU.cpp index 6ea9756a68..f408735a90 100644 --- a/src/OpenColorIO/ops/log/LogOpGPU.cpp +++ b/src/OpenColorIO/ops/log/LogOpGPU.cpp @@ -15,12 +15,17 @@ namespace OCIO_NAMESPACE namespace { -void AddLogShader(GpuShaderCreatorRcPtr & shaderCreator, ConstLogOpDataRcPtr & /* logData */, float base) +void AddLogShader( + GpuShaderCreatorRcPtr & shaderCreator, + ConstLogOpDataRcPtr & /* logData */, + float base) { const float minValue = std::numeric_limits::min(); GpuShaderText st(shaderCreator->getLanguage()); + // clang-format off + st.indent(); st.newLine() << ""; st.newLine() << "// Add Log processing"; @@ -47,12 +52,19 @@ void AddLogShader(GpuShaderCreatorRcPtr & shaderCreator, ConstLogOpDataRcPtr & / st.newLine() << "}"; shaderCreator->addToFunctionShaderCode(st.string().c_str()); + + // clang-format on } -void AddAntiLogShader(GpuShaderCreatorRcPtr & shaderCreator, ConstLogOpDataRcPtr & /* logData */, float base) +void AddAntiLogShader( + GpuShaderCreatorRcPtr & shaderCreator, + ConstLogOpDataRcPtr & /* logData */, + float base) { GpuShaderText st(shaderCreator->getLanguage()); + // clang-format off + st.indent(); st.newLine() << ""; st.newLine() << "// Add Log 'Anti-Log' processing"; @@ -69,6 +81,8 @@ void AddAntiLogShader(GpuShaderCreatorRcPtr & shaderCreator, ConstLogOpDataRcPtr st.newLine() << "}"; shaderCreator->addToFunctionShaderCode(st.string().c_str()); + + // clang-format on } void AddLogToLinShader(GpuShaderCreatorRcPtr & shaderCreator, ConstLogOpDataRcPtr & logData) @@ -76,18 +90,22 @@ void AddLogToLinShader(GpuShaderCreatorRcPtr & shaderCreator, ConstLogOpDataRcPt const auto & paramsR = logData->getRedParams(); const auto & paramsG = logData->getGreenParams(); const auto & paramsB = logData->getBlueParams(); - const double base = logData->getBase(); + const double base = logData->getBase(); - const float logSlopeInv[3] = { 1.0f / (float)paramsR[LOG_SIDE_SLOPE], - 1.0f / (float)paramsG[LOG_SIDE_SLOPE], - 1.0f / (float)paramsB[LOG_SIDE_SLOPE] }; + const float logSlopeInv[3] + = {1.0f / (float)paramsR[LOG_SIDE_SLOPE], + 1.0f / (float)paramsG[LOG_SIDE_SLOPE], + 1.0f / (float)paramsB[LOG_SIDE_SLOPE]}; - const float linSlopeInv[3] = { 1.0f / (float)paramsR[LIN_SIDE_SLOPE], - 1.0f / (float)paramsG[LIN_SIDE_SLOPE], - 1.0f / (float)paramsB[LIN_SIDE_SLOPE] }; + const float linSlopeInv[3] + = {1.0f / (float)paramsR[LIN_SIDE_SLOPE], + 1.0f / (float)paramsG[LIN_SIDE_SLOPE], + 1.0f / (float)paramsB[LIN_SIDE_SLOPE]}; GpuShaderText st(shaderCreator->getLanguage()); + // clang-format off + st.indent(); st.newLine() << ""; st.newLine() << "// Add Log 'Log to Lin' processing"; @@ -116,6 +134,8 @@ void AddLogToLinShader(GpuShaderCreatorRcPtr & shaderCreator, ConstLogOpDataRcPt st.newLine() << "}"; shaderCreator->addToFunctionShaderCode(st.string().c_str()); + + // clang-format on } void AddLinToLogShader(GpuShaderCreatorRcPtr & shaderCreator, ConstLogOpDataRcPtr & logData) @@ -125,12 +145,14 @@ void AddLinToLogShader(GpuShaderCreatorRcPtr & shaderCreator, ConstLogOpDataRcPt const auto & paramsR = logData->getRedParams(); const auto & paramsG = logData->getGreenParams(); const auto & paramsB = logData->getBlueParams(); - const double base = logData->getBase(); + const double base = logData->getBase(); const float minValue = std::numeric_limits::min(); GpuShaderText st(shaderCreator->getLanguage()); + // clang-format off + st.indent(); st.newLine() << ""; st.newLine() << "// Add Log 'Lin to Log' processing"; @@ -160,10 +182,11 @@ void AddLinToLogShader(GpuShaderCreatorRcPtr & shaderCreator, ConstLogOpDataRcPt st.newLine() << "}"; shaderCreator->addToFunctionShaderCode(st.string().c_str()); + + // clang-format on } -void AddCameraLogToLinShader(GpuShaderCreatorRcPtr & shaderCreator, - ConstLogOpDataRcPtr & logData) +void AddCameraLogToLinShader(GpuShaderCreatorRcPtr & shaderCreator, ConstLogOpDataRcPtr & logData) { // if in <= logBreak // out = ( in - linearOffset ) / linearSlope @@ -174,11 +197,11 @@ void AddCameraLogToLinShader(GpuShaderCreatorRcPtr & shaderCreator, const auto & paramsR = logData->getRedParams(); const auto & paramsG = logData->getGreenParams(); const auto & paramsB = logData->getBlueParams(); - const double base = logData->getBase(); + const double base = logData->getBase(); - float linearSlopeR = LogUtil::GetLinearSlope(paramsR, base); - float linearSlopeG = LogUtil::GetLinearSlope(paramsG, base); - float linearSlopeB = LogUtil::GetLinearSlope(paramsB, base); + float linearSlopeR = LogUtil::GetLinearSlope(paramsR, base); + float linearSlopeG = LogUtil::GetLinearSlope(paramsG, base); + float linearSlopeB = LogUtil::GetLinearSlope(paramsB, base); float logSideBreakR = LogUtil::GetLogSideBreak(paramsR, base); float logSideBreakG = LogUtil::GetLogSideBreak(paramsG, base); float logSideBreakB = LogUtil::GetLogSideBreak(paramsB, base); @@ -186,17 +209,20 @@ void AddCameraLogToLinShader(GpuShaderCreatorRcPtr & shaderCreator, float linearOffsetG = LogUtil::GetLinearOffset(paramsG, linearSlopeG, logSideBreakG); float linearOffsetB = LogUtil::GetLinearOffset(paramsB, linearSlopeB, logSideBreakB); - const float logSlopeInv[3] = { 1.0f / (float)paramsR[LOG_SIDE_SLOPE], - 1.0f / (float)paramsG[LOG_SIDE_SLOPE], - 1.0f / (float)paramsB[LOG_SIDE_SLOPE] }; - - const float linSlopeInv[3] = { 1.0f / (float)paramsR[LIN_SIDE_SLOPE], - 1.0f / (float)paramsG[LIN_SIDE_SLOPE], - 1.0f / (float)paramsB[LIN_SIDE_SLOPE] }; + const float logSlopeInv[3] + = {1.0f / (float)paramsR[LOG_SIDE_SLOPE], + 1.0f / (float)paramsG[LOG_SIDE_SLOPE], + 1.0f / (float)paramsB[LOG_SIDE_SLOPE]}; + const float linSlopeInv[3] + = {1.0f / (float)paramsR[LIN_SIDE_SLOPE], + 1.0f / (float)paramsG[LIN_SIDE_SLOPE], + 1.0f / (float)paramsB[LIN_SIDE_SLOPE]}; GpuShaderText st(shaderCreator->getLanguage()); + // clang-format off + st.indent(); st.newLine() << ""; st.newLine() << "// Add Log 'Camera Log to Lin' processing"; @@ -239,10 +265,11 @@ void AddCameraLogToLinShader(GpuShaderCreatorRcPtr & shaderCreator, st.newLine() << "}"; shaderCreator->addToFunctionShaderCode(st.string().c_str()); + + // clang-format on } -void AddCameraLinToLogShader(GpuShaderCreatorRcPtr & shaderCreator, - ConstLogOpDataRcPtr & logData) +void AddCameraLinToLogShader(GpuShaderCreatorRcPtr & shaderCreator, ConstLogOpDataRcPtr & logData) { // if in <= linBreak // out = linearSlope * in + linearOffset @@ -252,11 +279,11 @@ void AddCameraLinToLogShader(GpuShaderCreatorRcPtr & shaderCreator, const auto & paramsR = logData->getRedParams(); const auto & paramsG = logData->getGreenParams(); const auto & paramsB = logData->getBlueParams(); - const double base = logData->getBase(); + const double base = logData->getBase(); - float linearSlopeR = LogUtil::GetLinearSlope(paramsR, base); - float linearSlopeG = LogUtil::GetLinearSlope(paramsG, base); - float linearSlopeB = LogUtil::GetLinearSlope(paramsB, base); + float linearSlopeR = LogUtil::GetLinearSlope(paramsR, base); + float linearSlopeG = LogUtil::GetLinearSlope(paramsG, base); + float linearSlopeB = LogUtil::GetLinearSlope(paramsB, base); float logSideBreakR = LogUtil::GetLogSideBreak(paramsR, base); float logSideBreakG = LogUtil::GetLogSideBreak(paramsG, base); float logSideBreakB = LogUtil::GetLogSideBreak(paramsB, base); @@ -265,14 +292,17 @@ void AddCameraLinToLogShader(GpuShaderCreatorRcPtr & shaderCreator, float linearOffsetB = LogUtil::GetLinearOffset(paramsB, linearSlopeB, logSideBreakB); // We account for the change of base by rolling the multiplier in with log slope. - const float logSlopeNew[3] = { (float)(paramsR[LOG_SIDE_SLOPE] / log(base)), - (float)(paramsG[LOG_SIDE_SLOPE] / log(base)), - (float)(paramsB[LOG_SIDE_SLOPE] / log(base)) }; + const float logSlopeNew[3] + = {(float)(paramsR[LOG_SIDE_SLOPE] / log(base)), + (float)(paramsG[LOG_SIDE_SLOPE] / log(base)), + (float)(paramsB[LOG_SIDE_SLOPE] / log(base))}; const float minValue = std::numeric_limits::min(); GpuShaderText st(shaderCreator->getLanguage()); + // clang-format off + st.indent(); st.newLine() << ""; st.newLine() << "// Add Log 'Camera Lin to Log' processing"; @@ -310,10 +340,12 @@ void AddCameraLinToLogShader(GpuShaderCreatorRcPtr & shaderCreator, st.newLine() << "}"; shaderCreator->addToFunctionShaderCode(st.string().c_str()); -} + // clang-format on } +} // namespace + void GetLogGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, ConstLogOpDataRcPtr & logData) { const TransformDirection dir = logData->getDirection(); @@ -321,24 +353,24 @@ void GetLogGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, ConstLogOpDat { switch (dir) { - case TRANSFORM_DIR_FORWARD: - AddLogShader(shaderCreator, logData, 2.0f); - break; - case TRANSFORM_DIR_INVERSE: - AddAntiLogShader(shaderCreator, logData, 2.0f); - break; + case TRANSFORM_DIR_FORWARD: + AddLogShader(shaderCreator, logData, 2.0f); + break; + case TRANSFORM_DIR_INVERSE: + AddAntiLogShader(shaderCreator, logData, 2.0f); + break; } } else if (logData->isLog10()) { switch (dir) { - case TRANSFORM_DIR_FORWARD: - AddLogShader(shaderCreator, logData, 10.0f); - break; - case TRANSFORM_DIR_INVERSE: - AddAntiLogShader(shaderCreator, logData, 10.0f); - break; + case TRANSFORM_DIR_FORWARD: + AddLogShader(shaderCreator, logData, 10.0f); + break; + case TRANSFORM_DIR_INVERSE: + AddAntiLogShader(shaderCreator, logData, 10.0f); + break; } } else @@ -347,28 +379,27 @@ void GetLogGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, ConstLogOpDat { switch (dir) { - case TRANSFORM_DIR_FORWARD: - AddCameraLinToLogShader(shaderCreator, logData); - break; - case TRANSFORM_DIR_INVERSE: - AddCameraLogToLinShader(shaderCreator, logData); - break; + case TRANSFORM_DIR_FORWARD: + AddCameraLinToLogShader(shaderCreator, logData); + break; + case TRANSFORM_DIR_INVERSE: + AddCameraLogToLinShader(shaderCreator, logData); + break; } } else { switch (dir) { - case TRANSFORM_DIR_FORWARD: - AddLinToLogShader(shaderCreator, logData); - break; - case TRANSFORM_DIR_INVERSE: - AddLogToLinShader(shaderCreator, logData); - break; + case TRANSFORM_DIR_FORWARD: + AddLinToLogShader(shaderCreator, logData); + break; + case TRANSFORM_DIR_INVERSE: + AddLogToLinShader(shaderCreator, logData); + break; } } } - } } // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/ops/log/LogOpGPU.h b/src/OpenColorIO/ops/log/LogOpGPU.h index 392e0e4424..745ba690c9 100644 --- a/src/OpenColorIO/ops/log/LogOpGPU.h +++ b/src/OpenColorIO/ops/log/LogOpGPU.h @@ -17,5 +17,3 @@ void GetLogGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, ConstLogOpDat } // namespace OCIO_NAMESPACE #endif - - diff --git a/src/OpenColorIO/ops/log/LogUtils.cpp b/src/OpenColorIO/ops/log/LogUtils.cpp index 77548acfe6..d589241c6a 100644 --- a/src/OpenColorIO/ops/log/LogUtils.cpp +++ b/src/OpenColorIO/ops/log/LogUtils.cpp @@ -6,9 +6,9 @@ #include +#include "Platform.h" #include "ops/log/LogOpData.h" #include "ops/log/LogUtils.h" -#include "Platform.h" namespace OCIO_NAMESPACE { @@ -66,22 +66,22 @@ const char * ConvertStyleToString(LogStyle style) { switch (style) { - case LOG10: - return LOG10_STR; - case LOG2: - return LOG2_STR; - case ANTI_LOG10: - return ANTI_LOG10_STR; - case ANTI_LOG2: - return ANTI_LOG2_STR; - case LOG_TO_LIN: - return LOG_TO_LIN_STR; - case LIN_TO_LOG: - return LIN_TO_LOG_STR; - case CAMERA_LOG_TO_LIN: - return CAMERA_LOG_TO_LIN_STR; - case CAMERA_LIN_TO_LOG: - return CAMERA_LIN_TO_LOG_STR; + case LOG10: + return LOG10_STR; + case LOG2: + return LOG2_STR; + case ANTI_LOG10: + return ANTI_LOG10_STR; + case ANTI_LOG2: + return ANTI_LOG2_STR; + case LOG_TO_LIN: + return LOG_TO_LIN_STR; + case LIN_TO_LOG: + return LIN_TO_LOG_STR; + case CAMERA_LOG_TO_LIN: + return CAMERA_LOG_TO_LIN_STR; + case CAMERA_LIN_TO_LOG: + return CAMERA_LIN_TO_LOG_STR; } std::stringstream ss("Unknown Log style: "); @@ -90,9 +90,7 @@ const char * ConvertStyleToString(LogStyle style) throw Exception(ss.str().c_str()); } - -void ConvertFromCTFToOCIO(const CTFParams::Params & ctfParams, - LogOpData::Params & ocioParams) +void ConvertFromCTFToOCIO(const CTFParams::Params & ctfParams, LogOpData::Params & ocioParams) { // Base is 10.0. static const double range = 0.002 * 1023.0; @@ -111,14 +109,13 @@ void ConvertFromCTFToOCIO(const CTFParams::Params & ctfParams, // We just need to avoid a div by 0 in the gain calculation. tmp_value = std::min(tmp_value, -0.0001); - const double gain = (highlight - shadow) - / (1. - pow(10.0, tmp_value)); + const double gain = (highlight - shadow) / (1. - pow(10.0, tmp_value)); const double offset = gain - (highlight - shadow); - ocioParams[LOG_SIDE_SLOPE] = 1. / mult_factor; - ocioParams[LIN_SIDE_SLOPE] = 1. / gain; - ocioParams[LIN_SIDE_OFFSET] = (offset - shadow) / gain; - ocioParams[LOG_SIDE_OFFSET] = refWhite; + ocioParams[LOG_SIDE_SLOPE] = 1. / mult_factor; + ocioParams[LIN_SIDE_SLOPE] = 1. / gain; + ocioParams[LIN_SIDE_OFFSET] = (offset - shadow) / gain; + ocioParams[LOG_SIDE_OFFSET] = refWhite; } void ValidateLegacyParams(const CTFParams::Params & ctfParams) @@ -167,70 +164,71 @@ void ValidateLegacyParams(const CTFParams::Params & ctfParams) } } -void ConvertLogParameters(const CTFParams & ctfParams, - double & base, - LogOpData::Params & redParams, - LogOpData::Params & greenParams, - LogOpData::Params & blueParams) +void ConvertLogParameters( + const CTFParams & ctfParams, + double & base, + LogOpData::Params & redParams, + LogOpData::Params & greenParams, + LogOpData::Params & blueParams) { redParams.resize(4); greenParams.resize(4); blueParams.resize(4); - redParams[LOG_SIDE_SLOPE] = greenParams[LOG_SIDE_SLOPE] = blueParams[LOG_SIDE_SLOPE] = 1.; - redParams[LIN_SIDE_SLOPE] = greenParams[LIN_SIDE_SLOPE] = blueParams[LIN_SIDE_SLOPE] = 1.; + redParams[LOG_SIDE_SLOPE] = greenParams[LOG_SIDE_SLOPE] = blueParams[LOG_SIDE_SLOPE] = 1.; + redParams[LIN_SIDE_SLOPE] = greenParams[LIN_SIDE_SLOPE] = blueParams[LIN_SIDE_SLOPE] = 1.; redParams[LIN_SIDE_OFFSET] = greenParams[LIN_SIDE_OFFSET] = blueParams[LIN_SIDE_OFFSET] = 0.; redParams[LOG_SIDE_OFFSET] = greenParams[LOG_SIDE_OFFSET] = blueParams[LOG_SIDE_OFFSET] = 0.; switch (ctfParams.m_style) { - case LOG10: - { - // out = log(in) / log(10); - // Keep default values. - base = 10.0; - break; - } - case LOG2: - { - // out = log(in) / log(2); - // Keep default values but base. - base = 2.; - break; - } - case ANTI_LOG10: - { - // out = pow(10, in) - // Keep default values but direction. - base = 10.0; - break; - } - case ANTI_LOG2: - { - // out = pow(2, in) - // Keep default values but direction and base. - base = 2.; - break; - } - case LIN_TO_LOG: - // out = k3 * log(m3 * in + b3) / log(base3) + kb3 - // Keep base and direction to default values, - case LOG_TO_LIN: - // out = ( pow(base3, (in - kb3) / k3) - b3 ) / m3 - // Keep base to default values. - { - base = 10.0; - ValidateLegacyParams(ctfParams.get(CTFParams::red)); - ValidateLegacyParams(ctfParams.get(CTFParams::green)); - ValidateLegacyParams(ctfParams.get(CTFParams::blue)); - ConvertFromCTFToOCIO(ctfParams.get(CTFParams::red), redParams); - ConvertFromCTFToOCIO(ctfParams.get(CTFParams::green), greenParams); - ConvertFromCTFToOCIO(ctfParams.get(CTFParams::blue), blueParams); - break; - } - case CAMERA_LIN_TO_LOG: - case CAMERA_LOG_TO_LIN: - // Should not be used for new style. - break; + case LOG10: + { + // out = log(in) / log(10); + // Keep default values. + base = 10.0; + break; + } + case LOG2: + { + // out = log(in) / log(2); + // Keep default values but base. + base = 2.; + break; + } + case ANTI_LOG10: + { + // out = pow(10, in) + // Keep default values but direction. + base = 10.0; + break; + } + case ANTI_LOG2: + { + // out = pow(2, in) + // Keep default values but direction and base. + base = 2.; + break; + } + case LIN_TO_LOG: + // out = k3 * log(m3 * in + b3) / log(base3) + kb3 + // Keep base and direction to default values, + case LOG_TO_LIN: + // out = ( pow(base3, (in - kb3) / k3) - b3 ) / m3 + // Keep base to default values. + { + base = 10.0; + ValidateLegacyParams(ctfParams.get(CTFParams::red)); + ValidateLegacyParams(ctfParams.get(CTFParams::green)); + ValidateLegacyParams(ctfParams.get(CTFParams::blue)); + ConvertFromCTFToOCIO(ctfParams.get(CTFParams::red), redParams); + ConvertFromCTFToOCIO(ctfParams.get(CTFParams::green), greenParams); + ConvertFromCTFToOCIO(ctfParams.get(CTFParams::blue), blueParams); + break; + } + case CAMERA_LIN_TO_LOG: + case CAMERA_LOG_TO_LIN: + // Should not be used for new style. + break; } } @@ -238,16 +236,16 @@ TransformDirection GetLogDirection(LogStyle style) { switch (style) { - case LOG10: - case LOG2: - case LIN_TO_LOG: - case CAMERA_LIN_TO_LOG: - return TRANSFORM_DIR_FORWARD; - case ANTI_LOG10: - case ANTI_LOG2: - case LOG_TO_LIN: - case CAMERA_LOG_TO_LIN: - return TRANSFORM_DIR_INVERSE; + case LOG10: + case LOG2: + case LIN_TO_LOG: + case CAMERA_LIN_TO_LOG: + return TRANSFORM_DIR_FORWARD; + case ANTI_LOG10: + case ANTI_LOG2: + case LOG_TO_LIN: + case CAMERA_LOG_TO_LIN: + return TRANSFORM_DIR_INVERSE; } return TRANSFORM_DIR_FORWARD; } @@ -261,9 +259,10 @@ float GetLinearSlope(const LogOpData::Params & params, double base) } else { - return (float)(params[LOG_SIDE_SLOPE] * params[LIN_SIDE_SLOPE] / - ( (params[LIN_SIDE_SLOPE] * params[LIN_SIDE_BREAK] + - params[LIN_SIDE_OFFSET] ) * log(base) )); + return ( + float)(params[LOG_SIDE_SLOPE] * params[LIN_SIDE_SLOPE] + / ((params[LIN_SIDE_SLOPE] * params[LIN_SIDE_BREAK] + params[LIN_SIDE_OFFSET]) + * log(base))); } } @@ -273,7 +272,8 @@ float GetLogSideBreak(const LogOpData::Params & params, double base) // // out = log2(linBreak*linSlope + linOffset) * logSlope / log2(base) + logOffset - float logSideBreak = log2((float)(params[LIN_SIDE_SLOPE] * params[LIN_SIDE_BREAK] + params[LIN_SIDE_OFFSET])); + float logSideBreak + = log2((float)(params[LIN_SIDE_SLOPE] * params[LIN_SIDE_BREAK] + params[LIN_SIDE_OFFSET])); logSideBreak *= (float)params[LOG_SIDE_SLOPE] / log2((float)base); logSideBreak += (float)params[LOG_SIDE_OFFSET]; @@ -285,6 +285,5 @@ float GetLinearOffset(const LogOpData::Params & params, float linearSlope, float return logSideBreak - linearSlope * (float)params[LIN_SIDE_BREAK]; } -} +} // namespace LogUtil } // namespace OCIO_NAMESPACE - diff --git a/src/OpenColorIO/ops/log/LogUtils.h b/src/OpenColorIO/ops/log/LogUtils.h index 44246914ac..2636c1a1a8 100644 --- a/src/OpenColorIO/ops/log/LogUtils.h +++ b/src/OpenColorIO/ops/log/LogUtils.h @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_LOGUTILS_H #define INCLUDED_OCIO_LOGUTILS_H @@ -28,12 +27,12 @@ enum LogStyle }; // Strings for CLF/CTF files. -static constexpr char LOG2_STR[] = "log2"; -static constexpr char LOG10_STR[] = "log10"; -static constexpr char ANTI_LOG2_STR[] = "antiLog2"; -static constexpr char ANTI_LOG10_STR[] = "antiLog10"; -static constexpr char LIN_TO_LOG_STR[] = "linToLog"; -static constexpr char LOG_TO_LIN_STR[] = "logToLin"; +static constexpr char LOG2_STR[] = "log2"; +static constexpr char LOG10_STR[] = "log10"; +static constexpr char ANTI_LOG2_STR[] = "antiLog2"; +static constexpr char ANTI_LOG10_STR[] = "antiLog10"; +static constexpr char LIN_TO_LOG_STR[] = "linToLog"; +static constexpr char LOG_TO_LIN_STR[] = "logToLin"; static constexpr char CAMERA_LIN_TO_LOG_STR[] = "cameraLinToLog"; static constexpr char CAMERA_LOG_TO_LIN_STR[] = "cameraLogToLin"; @@ -42,9 +41,7 @@ const char * ConvertStyleToString(LogStyle style); struct CTFParams { - CTFParams() - { - } + CTFParams() {} LogStyle m_style = LOG10; @@ -72,21 +69,17 @@ struct CTFParams shadow }; - Params & get(Channels c) - { - return m_params[c]; - } + Params & get(Channels c) { return m_params[c]; } - const Params & get(Channels c) const - { - return m_params[c]; - } + const Params & get(Channels c) const { return m_params[c]; } // red, green, blue. // Gamma, refWhite, refBlack, highlight, shadow. - Params m_params[3] = { { 0., 0., 0., 0., 0. }, - { 0., 0., 0., 0., 0. }, - { 0., 0., 0., 0., 0. } }; + Params m_params[3] = { + {0., 0., 0., 0., 0.}, + {0., 0., 0., 0., 0.}, + {0., 0., 0., 0., 0.} + }; bool setType(Type type) { @@ -101,20 +94,18 @@ struct CTFParams return true; } - Type getType() const - { - return m_type; - } + Type getType() const { return m_type; } private: Type m_type = UNKNOWN; }; -void ConvertLogParameters(const CTFParams & ctfParams, - double & base, - LogOpData::Params & redParams, - LogOpData::Params & greenParams, - LogOpData::Params & blueParams); +void ConvertLogParameters( + const CTFParams & ctfParams, + double & base, + LogOpData::Params & redParams, + LogOpData::Params & greenParams, + LogOpData::Params & blueParams); TransformDirection GetLogDirection(LogStyle style); @@ -122,8 +113,7 @@ float GetLinearSlope(const LogOpData::Params & params, double base); float GetLogSideBreak(const LogOpData::Params & params, double base); float GetLinearOffset(const LogOpData::Params & params, float linearSlope, float logSideBreak); -} +} // namespace LogUtil } // namespace OCIO_NAMESPACE #endif - diff --git a/src/OpenColorIO/ops/lut1d/Lut1DOp.cpp b/src/OpenColorIO/ops/lut1d/Lut1DOp.cpp index 412462414b..384c6609b7 100644 --- a/src/OpenColorIO/ops/lut1d/Lut1DOp.cpp +++ b/src/OpenColorIO/ops/lut1d/Lut1DOp.cpp @@ -9,15 +9,15 @@ #include #include "BitDepthUtils.h" -#include "HashUtils.h" #include "GpuShaderUtils.h" +#include "HashUtils.h" #include "MathUtils.h" +#include "SSE.h" +#include "ops/OpTools.h" #include "ops/lut1d/Lut1DOp.h" #include "ops/lut1d/Lut1DOpCPU.h" #include "ops/lut1d/Lut1DOpGPU.h" #include "ops/matrix/MatrixOp.h" -#include "ops/OpTools.h" -#include "SSE.h" #include "transforms/Lut1DTransform.h" namespace OCIO_NAMESPACE @@ -32,7 +32,7 @@ typedef OCIO_SHARED_PTR ConstLut1DOpRcPtr; class Lut1DOp : public Op { public: - Lut1DOp() = delete; + Lut1DOp() = delete; Lut1DOp(const Lut1DOp &) = delete; explicit Lut1DOp(Lut1DOpDataRcPtr & lutData); virtual ~Lut1DOp(); @@ -117,13 +117,13 @@ void Lut1DOp::combineWith(OpRcPtrVec & ops, ConstOpRcPtr & secondOp) const "before calling combineWith."); } ConstLut1DOpRcPtr typedRcPtr = DynamicPtrCast(secondOp); - auto secondLut = typedRcPtr->lut1DData(); + auto secondLut = typedRcPtr->lut1DData(); // We want compose to upsample the LUTs to minimize precision loss. - const auto compFlag = Lut1DOpData::COMPOSE_RESAMPLE_BIG; - auto thisLut = lut1DData(); - Lut1DOpDataRcPtr result = Lut1DOpData::Compose(thisLut, secondLut, compFlag); - auto composedOp = std::make_shared(result); + const auto compFlag = Lut1DOpData::COMPOSE_RESAMPLE_BIG; + auto thisLut = lut1DData(); + Lut1DOpDataRcPtr result = Lut1DOpData::Compose(thisLut, secondLut, compFlag); + auto composedOp = std::make_shared(result); ops.push_back(composedOp); } @@ -173,11 +173,9 @@ void Lut1DOp::extractGpuShaderInfo(GpuShaderCreatorRcPtr & shaderCreator) const GetLut1DGPUShaderProgram(shaderCreator, lutData); } -} +} // namespace -void CreateLut1DOp(OpRcPtrVec & ops, - Lut1DOpDataRcPtr & lut, - TransformDirection direction) +void CreateLut1DOp(OpRcPtrVec & ops, Lut1DOpDataRcPtr & lut, TransformDirection direction) { // TODO: Detect if 1D LUT can be exactly approximated as y = mx + b // If so, return a mtx instead. @@ -191,35 +189,36 @@ void CreateLut1DOp(OpRcPtrVec & ops, ops.push_back(std::make_shared(lutData)); } -void GenerateIdentityLut1D(float* img, int numElements, int numChannels) +void GenerateIdentityLut1D(float * img, int numElements, int numChannels) { - if(!img) return; + if (!img) + return; int numChannelsToFill = std::min(3, numChannels); - float scale = 1.0f / ((float) numElements - 1.0f); - for(int i=0; i(op->data()); + auto lutData = DynamicPtrCast(op->data()); auto lutTransform = Lut1DTransform::Create(); - auto & data = dynamic_cast(lutTransform.get())->data(); + auto & data = dynamic_cast(lutTransform.get())->data(); data = *lutData; group->appendTransform(lutTransform); } -void BuildLut1DOp(OpRcPtrVec & ops, - const Lut1DTransform & transform, - TransformDirection dir) +void BuildLut1DOp(OpRcPtrVec & ops, const Lut1DTransform & transform, TransformDirection dir) { const auto & data = dynamic_cast(transform).data(); data.validate(); diff --git a/src/OpenColorIO/ops/lut1d/Lut1DOp.h b/src/OpenColorIO/ops/lut1d/Lut1DOp.h index f9f224174e..0bf3a167bd 100644 --- a/src/OpenColorIO/ops/lut1d/Lut1DOp.h +++ b/src/OpenColorIO/ops/lut1d/Lut1DOp.h @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_LUT1DOP_H #define INCLUDED_OCIO_LUT1DOP_H @@ -14,15 +13,17 @@ namespace OCIO_NAMESPACE { // This generates an identity 1D LUT, from 0.0 to 1.0 -void GenerateIdentityLut1D(float* img, int numElements, int numChannels); +void GenerateIdentityLut1D(float * img, int numElements, int numChannels); // This generates a linear scaled 1D LUT, from start to end. -void GenerateLinearScaleLut1D(float* img, int numElements, int numChannels, - float start, float end); - -void CreateLut1DOp(OpRcPtrVec & ops, - Lut1DOpDataRcPtr & lut, - TransformDirection direction); +void GenerateLinearScaleLut1D( + float * img, + int numElements, + int numChannels, + float start, + float end); + +void CreateLut1DOp(OpRcPtrVec & ops, Lut1DOpDataRcPtr & lut, TransformDirection direction); // Create a Lut1DTransform decoupled from op and append it to the GroupTransform. void CreateLut1DTransform(GroupTransformRcPtr & group, ConstOpRcPtr & op); diff --git a/src/OpenColorIO/ops/lut1d/Lut1DOpCPU.cpp b/src/OpenColorIO/ops/lut1d/Lut1DOpCPU.cpp index 6c618b9fd2..f0754a2720 100644 --- a/src/OpenColorIO/ops/lut1d/Lut1DOpCPU.cpp +++ b/src/OpenColorIO/ops/lut1d/Lut1DOpCPU.cpp @@ -10,21 +10,18 @@ #include "BitDepthUtils.h" #include "MathUtils.h" -#include "ops/lut1d/Lut1DOpCPU.h" -#include "ops/OpTools.h" #include "Platform.h" #include "SSE.h" +#include "ops/OpTools.h" +#include "ops/lut1d/Lut1DOpCPU.h" #include "CPUInfo.h" -#include "Lut1DOpCPU_SSE2.h" #include "Lut1DOpCPU_AVX.h" #include "Lut1DOpCPU_AVX2.h" #include "Lut1DOpCPU_AVX512.h" +#include "Lut1DOpCPU_SSE2.h" - -#define L_ADJUST(val) \ - (T)((isOutInteger) ? Clamp((val)+0.5f, outMin, outMax) : SanitizeFloat(val)) - +#define L_ADJUST(val) (T)((isOutInteger) ? Clamp((val) + 0.5f, outMin, outMax) : SanitizeFloat(val)) namespace OCIO_NAMESPACE { @@ -54,19 +51,15 @@ inline uint16_t GetLookupValue(const float & val) return (uint16_t)val; } -template -struct LookupLut +template struct LookupLut { - static inline OutType compute(const OutType * lutData, - const InType & val) + static inline OutType compute(const OutType * lutData, const InType & val) { return lutData[GetLookupValue(val)]; } }; - -template -class BaseLut1DRenderer : public OpCPU +template class BaseLut1DRenderer : public OpCPU { public: explicit BaseLut1DRenderer(ConstLut1DOpDataRcPtr & lut); @@ -78,16 +71,13 @@ class BaseLut1DRenderer : public OpCPU constexpr bool isLookup() const noexcept { return inBD != BIT_DEPTH_F32; } protected: - virtual void update(ConstLut1DOpDataRcPtr & lut); - template - void updateData(ConstLut1DOpDataRcPtr & lut); + template void updateData(ConstLut1DOpDataRcPtr & lut); void reset(); - template - void resetData(); + template void resetData(); protected: unsigned long m_dim = 0; @@ -100,14 +90,14 @@ class BaseLut1DRenderer : public OpCPU BitDepth m_outBitDepth = BIT_DEPTH_UNKNOWN; - float m_step = 1.0f; + float m_step = 1.0f; float m_dimMinusOne = 0.0f; - Lut1DOpCPUApplyFunc *m_applyLutFunc = nullptr; + Lut1DOpCPUApplyFunc * m_applyLutFunc = nullptr; private: - BaseLut1DRenderer() = delete; - BaseLut1DRenderer(const BaseLut1DRenderer &) = delete; + BaseLut1DRenderer() = delete; + BaseLut1DRenderer(const BaseLut1DRenderer &) = delete; BaseLut1DRenderer & operator=(const BaseLut1DRenderer &) = delete; }; @@ -122,56 +112,67 @@ struct IndexPair static IndexPair GetEdgeFloatValues(float fIn); }; -template +template class Lut1DRendererHalfCode : public BaseLut1DRenderer { public: Lut1DRendererHalfCode() = delete; explicit Lut1DRendererHalfCode(ConstLut1DOpDataRcPtr & lut) - : BaseLut1DRenderer(lut) {} + : BaseLut1DRenderer(lut) + { + } Lut1DRendererHalfCode(ConstLut1DOpDataRcPtr & lut, BitDepth outBitDepth) - : BaseLut1DRenderer(lut, outBitDepth) {} + : BaseLut1DRenderer(lut, outBitDepth) + { + } void apply(const void * inImg, void * outImg, long numPixels) const override; }; -template -class Lut1DRenderer : public BaseLut1DRenderer +template class Lut1DRenderer : public BaseLut1DRenderer { public: Lut1DRenderer() = delete; - explicit Lut1DRenderer(ConstLut1DOpDataRcPtr & lut) - : BaseLut1DRenderer(lut) {} + explicit Lut1DRenderer(ConstLut1DOpDataRcPtr & lut) + : BaseLut1DRenderer(lut) + { + } Lut1DRenderer(ConstLut1DOpDataRcPtr & lut, BitDepth outBitDepth) - : BaseLut1DRenderer(lut, outBitDepth) {} + : BaseLut1DRenderer(lut, outBitDepth) + { + } void apply(const void * inImg, void * outImg, long numPixels) const override; }; -template +template class Lut1DRendererHueAdjust : public Lut1DRenderer { public: Lut1DRendererHueAdjust() = delete; explicit Lut1DRendererHueAdjust(ConstLut1DOpDataRcPtr & lut) - : Lut1DRenderer(lut, BIT_DEPTH_F32) {} // HueAdjust needs float processing. + : Lut1DRenderer(lut, BIT_DEPTH_F32) + { + } // HueAdjust needs float processing. void apply(const void * inImg, void * outImg, long numPixels) const override; }; -template +template class Lut1DRendererHalfCodeHueAdjust : public Lut1DRendererHalfCode { public: Lut1DRendererHalfCodeHueAdjust() = delete; explicit Lut1DRendererHalfCodeHueAdjust(ConstLut1DOpDataRcPtr & lut) - : Lut1DRendererHalfCode(lut, BIT_DEPTH_F32) {} // HueAdjust needs float processing. + : Lut1DRendererHalfCode(lut, BIT_DEPTH_F32) + { + } // HueAdjust needs float processing. void apply(const void * inImg, void * outImg, long numPixels) const override; }; @@ -181,39 +182,40 @@ class Lut1DRendererHalfCodeHueAdjust : public Lut1DRendererHalfCode struct ComponentParams { ComponentParams() - : lutStart(nullptr) - , startOffset(0.f) - , lutEnd(nullptr) - , negLutStart(nullptr) - , negStartOffset(0.f) - , negLutEnd(nullptr) - , flipSign(1.f) - , bisectPoint(0.f) - {} - - const float * lutStart; // Copy of the pointer to start of effective lutData. - float startOffset; // Difference between real and effective start of lut. - const float * lutEnd; // Copy of the pointer to end of effective lutData. - const float * negLutStart;// lutStart for negative part of half domain LUT. - float negStartOffset; // startOffset for negative part of half domain LUT. - const float * negLutEnd; // lutEnd for negative part of half domain LUT. - float flipSign; // Flip the sign of value to handle decreasing luts. - float bisectPoint; // Point of switching from pos to neg of half domain. - - static void setComponentParams(ComponentParams & params, - const Lut1DOpData::ComponentProperties & properties, - const float * lutPtr, - float lutZeroEntry); + : lutStart(nullptr) + , startOffset(0.f) + , lutEnd(nullptr) + , negLutStart(nullptr) + , negStartOffset(0.f) + , negLutEnd(nullptr) + , flipSign(1.f) + , bisectPoint(0.f) + { + } + + const float * lutStart; // Copy of the pointer to start of effective lutData. + float startOffset; // Difference between real and effective start of lut. + const float * lutEnd; // Copy of the pointer to end of effective lutData. + const float * negLutStart; // lutStart for negative part of half domain LUT. + float negStartOffset; // startOffset for negative part of half domain LUT. + const float * negLutEnd; // lutEnd for negative part of half domain LUT. + float flipSign; // Flip the sign of value to handle decreasing luts. + float bisectPoint; // Point of switching from pos to neg of half domain. + + static void setComponentParams( + ComponentParams & params, + const Lut1DOpData::ComponentProperties & properties, + const float * lutPtr, + float lutZeroEntry); }; -template -class InvLut1DRenderer : public OpCPU +template class InvLut1DRenderer : public OpCPU { public: InvLut1DRenderer() = delete; explicit InvLut1DRenderer(ConstLut1DOpDataRcPtr & lut); - InvLut1DRenderer(const InvLut1DRenderer&) = delete; - InvLut1DRenderer& operator=(const InvLut1DRenderer&) = delete; + InvLut1DRenderer(const InvLut1DRenderer &) = delete; + InvLut1DRenderer & operator=(const InvLut1DRenderer &) = delete; virtual ~InvLut1DRenderer(); void apply(const void * inImg, void * outImg, long numPixels) const override; @@ -229,21 +231,21 @@ class InvLut1DRenderer : public OpCPU ComponentParams m_paramsG; ComponentParams m_paramsB; - unsigned long m_dim; + unsigned long m_dim; std::vector m_tmpLutR; std::vector m_tmpLutG; std::vector m_tmpLutB; - float m_alphaScaling; // Bit-depth scale factor for alpha channel. + float m_alphaScaling; // Bit-depth scale factor for alpha channel. }; -template +template class InvLut1DRendererHalfCode : public InvLut1DRenderer { public: InvLut1DRendererHalfCode() = delete; explicit InvLut1DRendererHalfCode(ConstLut1DOpDataRcPtr & lut); - InvLut1DRendererHalfCode(const InvLut1DRendererHalfCode &) = delete; - InvLut1DRendererHalfCode& operator=(const InvLut1DRendererHalfCode &) = delete; + InvLut1DRendererHalfCode(const InvLut1DRendererHalfCode &) = delete; + InvLut1DRendererHalfCode & operator=(const InvLut1DRendererHalfCode &) = delete; virtual ~InvLut1DRendererHalfCode(); void updateData(ConstLut1DOpDataRcPtr & lut) override; @@ -251,16 +253,16 @@ class InvLut1DRendererHalfCode : public InvLut1DRenderer void apply(const void * inImg, void * outImg, long numPixels) const override; }; -template +template class InvLut1DRendererHueAdjust : public InvLut1DRenderer { public: explicit InvLut1DRendererHueAdjust(ConstLut1DOpDataRcPtr & lut); - + void apply(const void * inImg, void * outImg, long numPixels) const override; }; -template +template class InvLut1DRendererHalfCodeHueAdjust : public InvLut1DRendererHalfCode { public: @@ -269,14 +271,13 @@ class InvLut1DRendererHalfCodeHueAdjust : public InvLut1DRendererHalfCode +template BaseLut1DRenderer::BaseLut1DRenderer(ConstLut1DOpDataRcPtr & lut) - : OpCPU() - , m_dim(lut->getArray().getLength()) - , m_outBitDepth(outBD) + : OpCPU() + , m_dim(lut->getArray().getLength()) + , m_outBitDepth(outBD) { - static_assert(inBD!=BIT_DEPTH_UINT32 && inBD!=BIT_DEPTH_UINT14, "Unsupported bit depth."); + static_assert(inBD != BIT_DEPTH_UINT32 && inBD != BIT_DEPTH_UINT14, "Unsupported bit depth."); update(lut); #if OCIO_USE_SSE2 @@ -308,13 +309,13 @@ BaseLut1DRenderer::BaseLut1DRenderer(ConstLut1DOpDataRcPtr & lut) #endif } -template +template BaseLut1DRenderer::BaseLut1DRenderer(ConstLut1DOpDataRcPtr & lut, BitDepth outBitDepth) - : OpCPU() - , m_dim(lut->getArray().getLength()) - , m_outBitDepth(outBitDepth) + : OpCPU() + , m_dim(lut->getArray().getLength()) + , m_outBitDepth(outBitDepth) { - static_assert(inBD!=BIT_DEPTH_UINT32 && inBD!=BIT_DEPTH_UINT14, "Unsupported bit depth."); + static_assert(inBD != BIT_DEPTH_UINT32 && inBD != BIT_DEPTH_UINT14, "Unsupported bit depth."); update(lut); #if OCIO_USE_SSE2 @@ -339,10 +340,10 @@ BaseLut1DRenderer::BaseLut1DRenderer(ConstLut1DOpDataRcPtr & lut, B #endif } -template +template void BaseLut1DRenderer::update(ConstLut1DOpDataRcPtr & lut) { - switch(m_outBitDepth) + switch (m_outBitDepth) { case BIT_DEPTH_UINT8: updateData::Type>(lut); @@ -371,8 +372,8 @@ void BaseLut1DRenderer::update(ConstLut1DOpDataRcPtr & lut) } } -template -template +template +template void BaseLut1DRenderer::updateData(ConstLut1DOpDataRcPtr & lut) { resetData(); @@ -392,14 +393,16 @@ void BaseLut1DRenderer::updateData(ConstLut1DOpDataRcPtr & lut) ConstLut1DOpDataRcPtr newLut = lut; // If we are able to lookup, need to resample the LUT based on inBitDepth. - if(mustResample) + if (mustResample) { ConstLut1DOpDataRcPtr newLutTmp = Lut1DOpData::MakeLookupDomain(inBD); // Note: Compose should render at 32f, to avoid infinite recursion. - newLut = Lut1DOpData::Compose(newLutTmp, lut, - // Prevent compose from modifying newLut domain. - Lut1DOpData::COMPOSE_RESAMPLE_NO); + newLut = Lut1DOpData::Compose( + newLutTmp, + lut, + // Prevent compose from modifying newLut domain. + Lut1DOpData::COMPOSE_RESAMPLE_NO); } m_dim = newLut->getArray().getLength(); @@ -411,11 +414,11 @@ void BaseLut1DRenderer::updateData(ConstLut1DOpDataRcPtr & lut) const Array::Values & lutValues = newLut->getArray().getValues(); // TODO: Would be faster if R, G, B were adjacent in memory? - for(unsigned long i=0; i::updateData(ConstLut1DOpDataRcPtr & lut) m_tmpLutG = new float[m_dim]; m_tmpLutB = new float[m_dim]; - for(unsigned long i=0; i -void BaseLut1DRenderer::reset() +template void BaseLut1DRenderer::reset() { - if(!m_tmpLutR && !m_tmpLutG && !m_tmpLutB) return; + if (!m_tmpLutR && !m_tmpLutG && !m_tmpLutB) + return; if (isLookup()) { - switch(m_outBitDepth) + switch (m_outBitDepth) { case BIT_DEPTH_UINT8: resetData::Type>(); @@ -483,29 +485,32 @@ void BaseLut1DRenderer::reset() } } -template -template +template +template void BaseLut1DRenderer::resetData() { - delete [](T*)m_tmpLutR; m_tmpLutR = nullptr; - delete [](T*)m_tmpLutG; m_tmpLutG = nullptr; - delete [](T*)m_tmpLutB; m_tmpLutB = nullptr; + delete[] (T *)m_tmpLutR; + m_tmpLutR = nullptr; + delete[] (T *)m_tmpLutG; + m_tmpLutG = nullptr; + delete[] (T *)m_tmpLutB; + m_tmpLutB = nullptr; } -template -BaseLut1DRenderer::~BaseLut1DRenderer() +template BaseLut1DRenderer::~BaseLut1DRenderer() { reset(); } -template -void Lut1DRendererHalfCode::apply(const void * inImg, void * outImg, long numPixels) const +template +void Lut1DRendererHalfCode::apply(const void * inImg, void * outImg, long numPixels) + const { typedef typename BitDepthInfo::Type InType; typedef typename BitDepthInfo::Type OutType; const InType * in = (InType *)inImg; - OutType * out = (OutType *)outImg; + OutType * out = (OutType *)outImg; // Input pixel format allows lookup rather than interpolation. // @@ -517,24 +522,24 @@ void Lut1DRendererHalfCode::apply(const void * inImg, void * outImg const OutType * lutG = (const OutType *)this->m_tmpLutG; const OutType * lutB = (const OutType *)this->m_tmpLutB; - for (long idx=0; idx::compute(lutR, in[0]); out[1] = LookupLut::compute(lutG, in[1]); out[2] = LookupLut::compute(lutB, in[2]); out[3] = OutType(in[3] * this->m_alphaScaling); - in += 4; + in += 4; out += 4; } } - else // Need to interpolate rather than simply lookup. + else // Need to interpolate rather than simply lookup. { const float * lutR = (const float *)this->m_tmpLutR; const float * lutG = (const float *)this->m_tmpLutG; const float * lutB = (const float *)this->m_tmpLutB; - for(long idx=0; idx::apply(const void * inImg, void * outImg // Since fraction is in the domain [0, 1), interpolate using // 1-fraction in order to avoid cases like -/+Inf * 0. - out[0] = Converter::CastValue( - lerpf(lutR[redInterVals.valB], - lutR[redInterVals.valA], - 1.0f-redInterVals.fraction)); + out[0] = Converter::CastValue(lerpf( + lutR[redInterVals.valB], + lutR[redInterVals.valA], + 1.0f - redInterVals.fraction)); - out[1] = Converter::CastValue( - lerpf(lutG[greenInterVals.valB], - lutG[greenInterVals.valA], - 1.0f-greenInterVals.fraction)); + out[1] = Converter::CastValue(lerpf( + lutG[greenInterVals.valB], + lutG[greenInterVals.valA], + 1.0f - greenInterVals.fraction)); - out[2] = Converter::CastValue( - lerpf(lutB[blueInterVals.valB], - lutB[blueInterVals.valA], - 1.0f-blueInterVals.fraction)); + out[2] = Converter::CastValue(lerpf( + lutB[blueInterVals.valB], + lutB[blueInterVals.valA], + 1.0f - blueInterVals.fraction)); out[3] = Converter::CastValue(in[3] * this->m_alphaScaling); - in += 4; + in += 4; out += 4; } } @@ -572,19 +577,19 @@ IndexPair IndexPair::GetEdgeFloatValues(float fIn) half halfVal; IndexPair idxPair; - halfVal = half( fIn ); - if(halfVal.isInfinity()) + halfVal = half(fIn); + if (halfVal.isInfinity()) { halfVal = halfVal.isNegative() ? -HALF_MAX : HALF_MAX; - fIn = halfVal; + fIn = halfVal; } // Convert back to float to compare to fIn // and interpolate both values. - const float floatTemp = (float) halfVal; + const float floatTemp = (float)halfVal; // Strict comparison required otherwise negative fractions will occur. - if (fabs(floatTemp) > fabs(fIn)) + if (fabs(floatTemp) > fabs(fIn)) { idxPair.valB = halfVal.bits(); idxPair.valA = idxPair.valB; @@ -597,9 +602,9 @@ IndexPair IndexPair::GetEdgeFloatValues(float fIn) ++(idxPair.valB); halfVal.setBits(idxPair.valB); - if(halfVal.isInfinity()) + if (halfVal.isInfinity()) { - halfVal = halfVal.isNegative () ? -HALF_MAX : HALF_MAX; + halfVal = halfVal.isNegative() ? -HALF_MAX : HALF_MAX; idxPair.valB = halfVal.bits(); // Necessary to reset fIn too (consider fIn = 65519, it's > HALF_MAX but not Inf). fIn = halfVal; @@ -607,26 +612,27 @@ IndexPair IndexPair::GetEdgeFloatValues(float fIn) } halfVal.setBits(idxPair.valA); - const float fA = (float) halfVal; + const float fA = (float)halfVal; halfVal.setBits(idxPair.valB); - const float fB = (float) halfVal; + const float fB = (float)halfVal; idxPair.fraction = (fIn - fA) / (fB - fA); - if (IsNan(idxPair.fraction)) idxPair.fraction = 0.0f; + if (IsNan(idxPair.fraction)) + idxPair.fraction = 0.0f; return idxPair; } -template +template void Lut1DRenderer::apply(const void * inImg, void * outImg, long numPixels) const { typedef typename BitDepthInfo::Type InType; typedef typename BitDepthInfo::Type OutType; const InType * in = (InType *)inImg; - OutType * out = (OutType *)outImg; + OutType * out = (OutType *)outImg; // Input pixel format allows lookup rather than interpolation. // @@ -638,14 +644,14 @@ void Lut1DRenderer::apply(const void * inImg, void * outImg, long n const OutType * lutG = (const OutType *)this->m_tmpLutG; const OutType * lutB = (const OutType *)this->m_tmpLutB; - for(long idx=0; idx::compute(lutR, in[0]); out[1] = LookupLut::compute(lutG, in[1]); out[2] = LookupLut::compute(lutB, in[2]); out[3] = OutType(in[3] * this->m_alphaScaling); - in += 4; + in += 4; out += 4; } } @@ -656,13 +662,13 @@ void Lut1DRenderer::apply(const void * inImg, void * outImg, long n const float * lutB = (const float *)this->m_tmpLutB; this->m_applyLutFunc(lutR, lutG, lutB, this->m_dim, inImg, outImg, numPixels); } - else // Need to interpolate rather than simply lookup. + else // Need to interpolate rather than simply lookup. { const float * lutR = (const float *)this->m_tmpLutR; const float * lutG = (const float *)this->m_tmpLutG; const float * lutB = (const float *)this->m_tmpLutB; - for(long i=0; im_step * in[0]; @@ -701,20 +707,14 @@ void Lut1DRenderer::apply(const void * inImg, void * outImg, long n // 0*Infinity (which is NaN). out[0] = Converter::CastValue( - lerpf(lutR[(unsigned int)highIdx[0]], - lutR[(unsigned int)lowIdx[0]], - delta[0])); + lerpf(lutR[(unsigned int)highIdx[0]], lutR[(unsigned int)lowIdx[0]], delta[0])); out[1] = Converter::CastValue( - lerpf(lutG[(unsigned int)highIdx[1]], - lutG[(unsigned int)lowIdx[1]], - delta[1])); + lerpf(lutG[(unsigned int)highIdx[1]], lutG[(unsigned int)lowIdx[1]], delta[1])); out[2] = Converter::CastValue( - lerpf(lutB[(unsigned int)highIdx[2]], - lutB[(unsigned int)lowIdx[2]], - delta[2])); + lerpf(lutB[(unsigned int)highIdx[2]], lutB[(unsigned int)lowIdx[2]], delta[2])); out[3] = Converter::CastValue(in[3] * this->m_alphaScaling); - in += 4; + in += 4; out += 4; } } @@ -724,13 +724,12 @@ namespace GamutMapUtils { // Compute the indices for the smallest, middle, and largest elements of // RGB[3]. (Trying to be clever and do this without branching.) -inline void Order3(const float* RGB, int& min, int& mid, int& max) +inline void Order3(const float * RGB, int & min, int & mid, int & max) { // 0 1 2 3 4 5 6 7 8 (typical val - 3) - static const int table[] = { 2, 1, 0, 2, 1, 0, 2, 1, 2, 0, 1, 2 }; + static const int table[] = {2, 1, 0, 2, 1, 0, 2, 1, 2, 0, 1, 2}; - int val = (int(RGB[0] > RGB[1]) * 5 + int(RGB[1] > RGB[2]) * 4) - - int(RGB[0] > RGB[2]) * 3 + 3; + int val = (int(RGB[0] > RGB[1]) * 5 + int(RGB[1] > RGB[2]) * 4) - int(RGB[0] > RGB[2]) * 3 + 3; // A NaN in a logical comparison always results in False. // So the case to be careful of here is { A, NaN, B } with A > B. @@ -742,15 +741,17 @@ inline void Order3(const float* RGB, int& min, int& mid, int& max) mid = table[++val]; min = table[++val]; } -}; - +}; // namespace GamutMapUtils // TODO: Below largely copy/pasted the regular and halfCode renderers in order // to implement the hueAdjust versions quickly and without risk of breaking // the original renderers. -template -void Lut1DRendererHalfCodeHueAdjust::apply(const void * inImg, void * outImg, long numPixels) const +template +void Lut1DRendererHalfCodeHueAdjust::apply( + const void * inImg, + void * outImg, + long numPixels) const { typedef typename BitDepthInfo::Type InType; typedef typename BitDepthInfo::Type OutType; @@ -760,28 +761,26 @@ void Lut1DRendererHalfCodeHueAdjust::apply(const void * inImg, void const float * lutB = (const float *)this->m_tmpLutB; const InType * in = (InType *)inImg; - OutType * out = (OutType *)outImg; + OutType * out = (OutType *)outImg; // NB: The if/else is expanded at compile time based on the template args. // (Should be no runtime cost.) if (inBD != BIT_DEPTH_F32) { - for(long idx=0; idx::compute(lutR, in[0]), - LookupLut::compute(lutG, in[1]), - LookupLut::compute(lutB, in[2]) }; + float RGB2[] + = {LookupLut::compute(lutR, in[0]), + LookupLut::compute(lutG, in[1]), + LookupLut::compute(lutB, in[2])}; const float new_chroma = RGB2[max] - RGB2[min]; @@ -792,13 +791,13 @@ void Lut1DRendererHalfCodeHueAdjust::apply(const void * inImg, void out[2] = OutType(RGB2[2]); out[3] = OutType(in[3] * this->m_alphaScaling); - in += 4; + in += 4; out += 4; } } - else // Need to interpolate rather than simply lookup. + else // Need to interpolate rather than simply lookup. { - for(long idx=0; idx::apply(const void * inImg, void // Since fraction is in the domain [0, 1), interpolate using // 1-fraction in order to avoid cases like -/+Inf * 0. - float RGB2[] = { - lerpf(lutR[redInterVals.valB], - lutR[redInterVals.valA], - 1.0f-redInterVals.fraction), - lerpf(lutG[greenInterVals.valB], - lutG[greenInterVals.valA], - 1.0f-greenInterVals.fraction), - lerpf(lutB[blueInterVals.valB], - lutB[blueInterVals.valA], - 1.0f-blueInterVals.fraction) }; + float RGB2[] + = {lerpf( + lutR[redInterVals.valB], + lutR[redInterVals.valA], + 1.0f - redInterVals.fraction), + lerpf( + lutG[greenInterVals.valB], + lutG[greenInterVals.valA], + 1.0f - greenInterVals.fraction), + lerpf( + lutB[blueInterVals.valB], + lutB[blueInterVals.valA], + 1.0f - blueInterVals.fraction)}; // TODO: ease SSE implementation (may be applied to all chans): - // RGB2[channel] = (RGB[channel] - RGB(min)) + // RGB2[channel] = (RGB[channel] - RGB(min)) // * new_chroma / orig_chroma + RGB2[min]. const float orig_chroma = RGB[max] - RGB[min]; - const float hue_factor - = orig_chroma == 0.f ? 0.f - : (RGB[mid] - RGB[min]) / orig_chroma; + const float hue_factor = orig_chroma == 0.f ? 0.f : (RGB[mid] - RGB[min]) / orig_chroma; const float new_chroma = RGB2[max] - RGB2[min]; - RGB2[mid] = hue_factor * new_chroma + RGB2[min]; + RGB2[mid] = hue_factor * new_chroma + RGB2[min]; out[0] = Converter::CastValue(RGB2[0]); out[1] = Converter::CastValue(RGB2[1]); out[2] = Converter::CastValue(RGB2[2]); out[3] = Converter::CastValue(in[3] * this->m_alphaScaling); - in += 4; + in += 4; out += 4; } } } -template -void Lut1DRendererHueAdjust::apply(const void * inImg, void * outImg, long numPixels) const +template +void Lut1DRendererHueAdjust::apply(const void * inImg, void * outImg, long numPixels) + const { typedef typename BitDepthInfo::Type InType; typedef typename BitDepthInfo::Type OutType; @@ -855,13 +856,13 @@ void Lut1DRendererHueAdjust::apply(const void * inImg, void * outIm const float * lutB = (const float *)this->m_tmpLutB; const InType * in = (InType *)inImg; - OutType * out = (OutType *)outImg; + OutType * out = (OutType *)outImg; // NB: The if/else is expanded at compile time based on the template args. // (Should be no runtime cost.) if (inBD != BIT_DEPTH_F32) { - for(long idx=0; idx::apply(const void * inImg, void * outIm GamutMapUtils::Order3(RGB, min, mid, max); const float orig_chroma = RGB[max] - RGB[min]; - const float hue_factor - = orig_chroma == 0.f ? 0.f - : (RGB[mid] - RGB[min]) / orig_chroma; + const float hue_factor = orig_chroma == 0.f ? 0.f : (RGB[mid] - RGB[min]) / orig_chroma; - float RGB2[] = { - LookupLut::compute(lutR, in[0]), - LookupLut::compute(lutG, in[1]), - LookupLut::compute(lutB, in[2]) - }; + float RGB2[] + = {LookupLut::compute(lutR, in[0]), + LookupLut::compute(lutG, in[1]), + LookupLut::compute(lutB, in[2])}; const float new_chroma = RGB2[max] - RGB2[min]; @@ -888,38 +886,29 @@ void Lut1DRendererHueAdjust::apply(const void * inImg, void * outIm out[2] = OutType(RGB2[2]); out[3] = OutType(in[3] * this->m_alphaScaling); - in += 4; + in += 4; out += 4; } } - else // Need to interpolate rather than simply lookup. + else // Need to interpolate rather than simply lookup. { - for(long i=0; im_step, - this->m_step, - this->m_step)); + __m128 idx = _mm_mul_ps( + _mm_set_ps(in[3], RGB[2], RGB[1], RGB[0]), + _mm_set_ps(1.0f, this->m_step, this->m_step, this->m_step)); // _mm_max_ps => NaNs become 0 - idx = _mm_min_ps(_mm_max_ps(idx, EZERO), - _mm_set1_ps(this->m_dimMinusOne)); + idx = _mm_min_ps(_mm_max_ps(idx, EZERO), _mm_set1_ps(this->m_dimMinusOne)); // zero < std::floor(idx) < maxIdx // SSE => zero < truncate(idx) < maxIdx @@ -929,16 +918,18 @@ void Lut1DRendererHueAdjust::apply(const void * inImg, void * outIm // zero < std::ceil(idx) < maxIdx // SSE => (lowIdx (already truncated) + 1) < maxIdx - __m128 hIdx = _mm_min_ps(_mm_add_ps(lIdx, EONE), - _mm_set1_ps(this->m_dimMinusOne)); + __m128 hIdx = _mm_min_ps(_mm_add_ps(lIdx, EONE), _mm_set1_ps(this->m_dimMinusOne)); // Computing delta relative to high rather than lowIdx // to save computing (1-delta) below. __m128 d = _mm_sub_ps(hIdx, idx); - OCIO_ALIGN(float delta[4]); _mm_store_ps(delta, d); - OCIO_ALIGN(float lowIdx[4]); _mm_store_ps(lowIdx, lIdx); - OCIO_ALIGN(float highIdx[4]); _mm_store_ps(highIdx, hIdx); + OCIO_ALIGN(float delta[4]); + _mm_store_ps(delta, d); + OCIO_ALIGN(float lowIdx[4]); + _mm_store_ps(lowIdx, lIdx); + OCIO_ALIGN(float highIdx[4]); + _mm_store_ps(highIdx, hIdx); #else float idx[3]; idx[0] = this->m_step * RGB[0]; @@ -975,11 +966,10 @@ void Lut1DRendererHueAdjust::apply(const void * inImg, void * outIm // in order to avoid cases like -/+Inf * 0. Therefore we never multiply by 0 and // thus handle the case where A or B is infinity and return infinity rather than // 0*Infinity (which is NaN). - float RGB2[] = { - lerpf(lutR[(unsigned int)highIdx[0]], lutR[(unsigned int)lowIdx[0]], delta[0]), - lerpf(lutG[(unsigned int)highIdx[1]], lutG[(unsigned int)lowIdx[1]], delta[1]), - lerpf(lutB[(unsigned int)highIdx[2]], lutB[(unsigned int)lowIdx[2]], delta[2]) - }; + float RGB2[] + = {lerpf(lutR[(unsigned int)highIdx[0]], lutR[(unsigned int)lowIdx[0]], delta[0]), + lerpf(lutG[(unsigned int)highIdx[1]], lutG[(unsigned int)lowIdx[1]], delta[1]), + lerpf(lutB[(unsigned int)highIdx[2]], lutB[(unsigned int)lowIdx[2]], delta[2])}; const float new_chroma = RGB2[max] - RGB2[min]; @@ -990,7 +980,7 @@ void Lut1DRendererHueAdjust::apply(const void * inImg, void * outIm out[2] = Converter::CastValue(RGB2[2]); out[3] = Converter::CastValue(in[3] * this->m_alphaScaling); - in += 4; + in += 4; out += 4; } } @@ -1008,48 +998,52 @@ namespace // flipSign: Flips val if we're working with the negative of the orig LUT. // scale: From LUT index units to outDepth units. // val: The value to invert. -// Return the result that would produce val if used +// Return the result that would produce val if used // in a forward linear interpolation in the LUT. -float FindLutInv(const float * start, - const float startOffset, - const float * end, - const float flipSign, - const float scale, - const float val) +float FindLutInv( + const float * start, + const float startOffset, + const float * end, + const float flipSign, + const float scale, + const float val) { // Note that the LUT data pointed to by start/end must be in increasing order, // regardless of whether the original LUT was increasing or decreasing because // this function uses std::lower_bound(). // Clamp the value to the range of the LUT. - const float cv = std::min( std::max( val * flipSign, *start ), *end ); + const float cv = std::min(std::max(val * flipSign, *start), *end); // std::lower_bound() - // "Returns an iterator pointing to the first element in the range [first,last) + // "Returns an iterator pointing to the first element in the range [first,last) // which does not compare less than val (but could be equal)." // (NB: This is correct using either end or end+1 since lower_bound will return a // value one greater than the second argument if no values in the array are >= cv.) // http://www.sgi.com/tech/stl/lower_bound.html - const float* lowbound = std::lower_bound(start, end, cv); + const float * lowbound = std::lower_bound(start, end, cv); // lower_bound() returns first entry >= val so decrement it unless val == *start. - if (lowbound > start) { + if (lowbound > start) + { --lowbound; } - const float* highbound = lowbound; - if (highbound < end) { + const float * highbound = lowbound; + if (highbound < end) + { ++highbound; } // Delta is the fractional distance of val between the adjacent LUT entries. float delta = 0.f; - if (*highbound > *lowbound) { // (handle flat spots by leaving delta = 0) + if (*highbound > *lowbound) + { // (handle flat spots by leaving delta = 0) delta = (cv - *lowbound) / (*highbound - *lowbound); } // Inds is the index difference from the effective start to lowbound. - const float inds = (float)( lowbound - start ); + const float inds = (float)(lowbound - start); // Correct for the fact that start is not the beginning of the LUT if it // starts with a flat spot. @@ -1072,40 +1066,44 @@ float FindLutInv(const float * start, // val: The value to invert. // Return the result that would produce val if used in a forward linear // interpolation in the LUT. -float FindLutInvHalf(const float * start, - const float startOffset, - const float * end, - const float flipSign, - const float scale, - const float val) +float FindLutInvHalf( + const float * start, + const float startOffset, + const float * end, + const float flipSign, + const float scale, + const float val) { // Note that the LUT data pointed to by start/end must be in increasing order, // regardless of whether the original LUT was increasing or decreasing because // this function uses std::lower_bound(). // Clamp the value to the range of the LUT. - const float cv = std::min( std::max( val * flipSign, *start ), *end ); + const float cv = std::min(std::max(val * flipSign, *start), *end); - const float* lowbound = std::lower_bound(start, end, cv); + const float * lowbound = std::lower_bound(start, end, cv); // lower_bound() returns first entry >= val so decrement it unless val == *start. - if (lowbound > start) { + if (lowbound > start) + { --lowbound; } - const float* highbound = lowbound; - if (highbound < end) { + const float * highbound = lowbound; + if (highbound < end) + { ++highbound; } // Delta is the fractional distance of val between the adjacent LUT entries. float delta = 0.f; - if (*highbound > *lowbound) { // (handle flat spots by leaving delta = 0) + if (*highbound > *lowbound) + { // (handle flat spots by leaving delta = 0) delta = (cv - *lowbound) / (*highbound - *lowbound); } // Inds is the index difference from the effective start to lowbound. - const float inds = (float)( lowbound - start ); + const float inds = (float)(lowbound - start); // Correct for the fact that start is not the beginning of the LUT if it // starts with a flat spot. @@ -1122,52 +1120,51 @@ float FindLutInvHalf(const float * start, float base = h; h.setBits((unsigned short)(totalInds + 1)); float basePlus1 = h; - float domain = base + delta * (basePlus1 - base); + float domain = base + delta * (basePlus1 - base); // Scale converts from units of [0,dim] to [0,outDepth]. return domain * scale; } -} +} // namespace -template -InvLut1DRenderer::InvLut1DRenderer(ConstLut1DOpDataRcPtr & lut) - : OpCPU() - , m_dim(0) - , m_alphaScaling(0.0f) +template +InvLut1DRenderer::InvLut1DRenderer(ConstLut1DOpDataRcPtr & lut) + : OpCPU() + , m_dim(0) + , m_alphaScaling(0.0f) { updateData(lut); } -template -InvLut1DRenderer::~InvLut1DRenderer() +template InvLut1DRenderer::~InvLut1DRenderer() { resetData(); } -void ComponentParams::setComponentParams(ComponentParams & params, - const Lut1DOpData::ComponentProperties & properties, - const float * lutPtr, - float lutZeroEntry) +void ComponentParams::setComponentParams( + ComponentParams & params, + const Lut1DOpData::ComponentProperties & properties, + const float * lutPtr, + float lutZeroEntry) { - params.flipSign = properties.isIncreasing ? 1.f: -1.f; - params.bisectPoint = lutZeroEntry; - params.startOffset = (float) properties.startDomain; - params.lutStart = lutPtr + properties.startDomain; - params.lutEnd = lutPtr + properties.endDomain; - params.negStartOffset = (float) properties.negStartDomain; - params.negLutStart = lutPtr + properties.negStartDomain; - params.negLutEnd = lutPtr + properties.negEndDomain; + params.flipSign = properties.isIncreasing ? 1.f : -1.f; + params.bisectPoint = lutZeroEntry; + params.startOffset = (float)properties.startDomain; + params.lutStart = lutPtr + properties.startDomain; + params.lutEnd = lutPtr + properties.endDomain; + params.negStartOffset = (float)properties.negStartDomain; + params.negLutStart = lutPtr + properties.negStartDomain; + params.negLutEnd = lutPtr + properties.negEndDomain; } -template -void InvLut1DRenderer::resetData() +template void InvLut1DRenderer::resetData() { m_tmpLutR.resize(0); m_tmpLutG.resize(0); m_tmpLutB.resize(0); } -template +template void InvLut1DRenderer::updateData(ConstLut1DOpDataRcPtr & lut) { resetData(); @@ -1182,7 +1179,7 @@ void InvLut1DRenderer::updateData(ConstLut1DOpDataRcPtr & lut) m_tmpLutG.resize(0); m_tmpLutB.resize(0); - if( !hasSingleLut ) + if (!hasSingleLut) { m_tmpLutG.resize(m_dim); m_tmpLutB.resize(m_dim); @@ -1195,14 +1192,18 @@ void InvLut1DRenderer::updateData(ConstLut1DOpDataRcPtr & lut) ComponentParams::setComponentParams(this->m_paramsR, redProperties, m_tmpLutR.data(), 0.f); - if( hasSingleLut ) + if (hasSingleLut) { // NB: All pointers refer to _tmpLutR. this->m_paramsB = this->m_paramsG = this->m_paramsR; } else { - ComponentParams::setComponentParams(this->m_paramsG, greenProperties, m_tmpLutG.data(), 0.f); + ComponentParams::setComponentParams( + this->m_paramsG, + greenProperties, + m_tmpLutG.data(), + 0.f); ComponentParams::setComponentParams(this->m_paramsB, blueProperties, m_tmpLutB.data(), 0.f); } @@ -1213,18 +1214,18 @@ void InvLut1DRenderer::updateData(ConstLut1DOpDataRcPtr & lut) const float lutScale = (float)GetBitDepthMaxValue(inBD); - const Array::Values& lutValues = lut->getArray().getValues(); - for(unsigned long i = 0; igetArray().getValues(); + for (unsigned long i = 0; i < m_dim; ++i) { - m_tmpLutR[i] = redProperties.isIncreasing ? lutValues[i*3+0] * lutScale : - -lutValues[i*3+0] * lutScale; + m_tmpLutR[i] = redProperties.isIncreasing ? lutValues[i * 3 + 0] * lutScale + : -lutValues[i * 3 + 0] * lutScale; - if(!hasSingleLut) + if (!hasSingleLut) { - m_tmpLutG[i] = greenProperties.isIncreasing ? lutValues[i*3+1] * lutScale : - -lutValues[i*3+1] * lutScale; - m_tmpLutB[i] = blueProperties.isIncreasing ? lutValues[i*3+2] * lutScale : - -lutValues[i*3+2] * lutScale; + m_tmpLutG[i] = greenProperties.isIncreasing ? lutValues[i * 3 + 1] * lutScale + : -lutValues[i * 3 + 1] * lutScale; + m_tmpLutB[i] = blueProperties.isIncreasing ? lutValues[i * 3 + 2] * lutScale + : -lutValues[i * 3 + 2] * lutScale; } } @@ -1234,72 +1235,75 @@ void InvLut1DRenderer::updateData(ConstLut1DOpDataRcPtr & lut) // Converts from index units to inDepth units of the original LUT. // (Note that inDepth of the original LUT is outDepth of the inverse LUT.) - m_scale = outMax / (float) (m_dim - 1); + m_scale = outMax / (float)(m_dim - 1); } -template +template void InvLut1DRenderer::apply(const void * inImg, void * outImg, long numPixels) const { typedef typename BitDepthInfo::Type InType; typedef typename BitDepthInfo::Type OutType; const InType * in = (InType *)inImg; - OutType * out = (OutType *)outImg; + OutType * out = (OutType *)outImg; - for(long idx=0; idx::CastValue( - FindLutInv(this->m_paramsR.lutStart, - this->m_paramsR.startOffset, - this->m_paramsR.lutEnd, - this->m_paramsR.flipSign, - m_scale, - (float)in[0])); + out[0] = Converter::CastValue(FindLutInv( + this->m_paramsR.lutStart, + this->m_paramsR.startOffset, + this->m_paramsR.lutEnd, + this->m_paramsR.flipSign, + m_scale, + (float)in[0])); // green - out[1] = Converter::CastValue( - FindLutInv(this->m_paramsG.lutStart, - this->m_paramsG.startOffset, - this->m_paramsG.lutEnd, - this->m_paramsG.flipSign, - m_scale, - (float)in[1])); + out[1] = Converter::CastValue(FindLutInv( + this->m_paramsG.lutStart, + this->m_paramsG.startOffset, + this->m_paramsG.lutEnd, + this->m_paramsG.flipSign, + m_scale, + (float)in[1])); // blue - out[2] = Converter::CastValue( - FindLutInv(this->m_paramsB.lutStart, - this->m_paramsB.startOffset, - this->m_paramsB.lutEnd, - this->m_paramsB.flipSign, - m_scale, - (float)in[2])); + out[2] = Converter::CastValue(FindLutInv( + this->m_paramsB.lutStart, + this->m_paramsB.startOffset, + this->m_paramsB.lutEnd, + this->m_paramsB.flipSign, + m_scale, + (float)in[2])); // alpha out[3] = Converter::CastValue(in[3] * m_alphaScaling); - in += 4; + in += 4; out += 4; } } -template -InvLut1DRendererHueAdjust::InvLut1DRendererHueAdjust(ConstLut1DOpDataRcPtr & lut) - : InvLut1DRenderer(lut) +template +InvLut1DRendererHueAdjust::InvLut1DRendererHueAdjust(ConstLut1DOpDataRcPtr & lut) + : InvLut1DRenderer(lut) { this->updateData(lut); } -template -void InvLut1DRendererHueAdjust::apply(const void * inImg, void * outImg, long numPixels) const +template +void InvLut1DRendererHueAdjust::apply( + const void * inImg, + void * outImg, + long numPixels) const { typedef typename BitDepthInfo::Type InType; typedef typename BitDepthInfo::Type OutType; const InType * in = (InType *)inImg; - OutType * out = (OutType *)outImg; + OutType * out = (OutType *)outImg; - for(long idx=0; idx::apply(const void * inImg, void * ou GamutMapUtils::Order3(RGB, min, mid, max); const float orig_chroma = RGB[max] - RGB[min]; - const float hue_factor - = (orig_chroma == 0.f) ? 0.f - : (RGB[mid] - RGB[min]) / orig_chroma; - - float RGB2[] = { - // red - FindLutInv(this->m_paramsR.lutStart, - this->m_paramsR.startOffset, - this->m_paramsR.lutEnd, - this->m_paramsR.flipSign, - this->m_scale, - RGB[0]), - // green - FindLutInv(this->m_paramsG.lutStart, - this->m_paramsG.startOffset, - this->m_paramsG.lutEnd, - this->m_paramsG.flipSign, - this->m_scale, - RGB[1]), - // blue - FindLutInv(this->m_paramsB.lutStart, - this->m_paramsB.startOffset, - this->m_paramsB.lutEnd, - this->m_paramsB.flipSign, - this->m_scale, - RGB[2]) - }; + const float hue_factor = (orig_chroma == 0.f) ? 0.f : (RGB[mid] - RGB[min]) / orig_chroma; + + float RGB2[] = {// red + FindLutInv( + this->m_paramsR.lutStart, + this->m_paramsR.startOffset, + this->m_paramsR.lutEnd, + this->m_paramsR.flipSign, + this->m_scale, + RGB[0]), + // green + FindLutInv( + this->m_paramsG.lutStart, + this->m_paramsG.startOffset, + this->m_paramsG.lutEnd, + this->m_paramsG.flipSign, + this->m_scale, + RGB[1]), + // blue + FindLutInv( + this->m_paramsB.lutStart, + this->m_paramsB.startOffset, + this->m_paramsB.lutEnd, + this->m_paramsB.flipSign, + this->m_scale, + RGB[2])}; const float new_chroma = RGB2[max] - RGB2[min]; @@ -1344,25 +1347,25 @@ void InvLut1DRendererHueAdjust::apply(const void * inImg, void * ou out[2] = Converter::CastValue(RGB2[2]); out[3] = Converter::CastValue(in[3] * this->m_alphaScaling); - in += 4; + in += 4; out += 4; } } -template -InvLut1DRendererHalfCode::InvLut1DRendererHalfCode(ConstLut1DOpDataRcPtr & lut) - : InvLut1DRenderer(lut) +template +InvLut1DRendererHalfCode::InvLut1DRendererHalfCode(ConstLut1DOpDataRcPtr & lut) + : InvLut1DRenderer(lut) { this->updateData(lut); } -template +template InvLut1DRendererHalfCode::~InvLut1DRendererHalfCode() { this->resetData(); } -template +template void InvLut1DRendererHalfCode::updateData(ConstLut1DOpDataRcPtr & lut) { this->resetData(); @@ -1377,7 +1380,7 @@ void InvLut1DRendererHalfCode::updateData(ConstLut1DOpDataRcPtr & l this->m_tmpLutG.resize(0); this->m_tmpLutB.resize(0); - if( !hasSingleLut ) + if (!hasSingleLut) { this->m_tmpLutG.resize(this->m_dim); this->m_tmpLutB.resize(this->m_dim); @@ -1390,17 +1393,29 @@ void InvLut1DRendererHalfCode::updateData(ConstLut1DOpDataRcPtr & l const Array::Values & lutValues = lut->getArray().getValues(); - ComponentParams::setComponentParams(this->m_paramsR, redProperties, this->m_tmpLutR.data(), lutValues[0]); + ComponentParams::setComponentParams( + this->m_paramsR, + redProperties, + this->m_tmpLutR.data(), + lutValues[0]); - if( hasSingleLut ) + if (hasSingleLut) { // NB: All pointers refer to m_tmpLutR. this->m_paramsB = this->m_paramsG = this->m_paramsR; } else { - ComponentParams::setComponentParams(this->m_paramsG, greenProperties, this->m_tmpLutG.data(), lutValues[1]); - ComponentParams::setComponentParams(this->m_paramsB, blueProperties, this->m_tmpLutB.data(), lutValues[2]); + ComponentParams::setComponentParams( + this->m_paramsG, + greenProperties, + this->m_tmpLutG.data(), + lutValues[1]); + ComponentParams::setComponentParams( + this->m_paramsB, + blueProperties, + this->m_tmpLutB.data(), + lutValues[2]); } const float lutScale = (float)GetBitDepthMaxValue(inBD); @@ -1409,32 +1424,32 @@ void InvLut1DRendererHalfCode::updateData(ConstLut1DOpDataRcPtr & l // Note: Since FindLutInv requires increasing arrays, if the LUT is // decreasing we negate the values to obtain the required sort order // of smallest to largest. - for(unsigned long i = 0; i < 32768; ++i) // positive half domain + for (unsigned long i = 0; i < 32768; ++i) // positive half domain { - this->m_tmpLutR[i] = redProperties.isIncreasing ? lutValues[i*3+0] * lutScale : - -lutValues[i*3+0] * lutScale; + this->m_tmpLutR[i] = redProperties.isIncreasing ? lutValues[i * 3 + 0] * lutScale + : -lutValues[i * 3 + 0] * lutScale; - if( !hasSingleLut ) + if (!hasSingleLut) { - this->m_tmpLutG[i] = greenProperties.isIncreasing ? lutValues[i*3+1] * lutScale : - -lutValues[i*3+1] * lutScale; - this->m_tmpLutB[i] = blueProperties.isIncreasing ? lutValues[i*3+2] * lutScale : - -lutValues[i*3+2] * lutScale; + this->m_tmpLutG[i] = greenProperties.isIncreasing ? lutValues[i * 3 + 1] * lutScale + : -lutValues[i * 3 + 1] * lutScale; + this->m_tmpLutB[i] = blueProperties.isIncreasing ? lutValues[i * 3 + 2] * lutScale + : -lutValues[i * 3 + 2] * lutScale; } } - for(unsigned long i = 32768; i < 65536; ++i) // negative half domain + for (unsigned long i = 32768; i < 65536; ++i) // negative half domain { // (Per above, the LUT must be increasing, so negative half domain is sign reversed.) - this->m_tmpLutR[i] = redProperties.isIncreasing ? -lutValues[i*3+0] * lutScale : - lutValues[i*3+0] * lutScale; + this->m_tmpLutR[i] = redProperties.isIncreasing ? -lutValues[i * 3 + 0] * lutScale + : lutValues[i * 3 + 0] * lutScale; - if( !hasSingleLut ) + if (!hasSingleLut) { - this->m_tmpLutG[i] = greenProperties.isIncreasing ? -lutValues[i*3+1] * lutScale : - lutValues[i*3+1] * lutScale; - this->m_tmpLutB[i] = blueProperties.isIncreasing ? -lutValues[i*3+2] * lutScale : - lutValues[i*3+2] * lutScale; + this->m_tmpLutG[i] = greenProperties.isIncreasing ? -lutValues[i * 3 + 1] * lutScale + : lutValues[i * 3 + 1] * lutScale; + this->m_tmpLutB[i] = blueProperties.isIncreasing ? -lutValues[i * 3 + 2] * lutScale + : lutValues[i * 3 + 2] * lutScale; } } @@ -1448,20 +1463,21 @@ void InvLut1DRendererHalfCode::updateData(ConstLut1DOpDataRcPtr & l this->m_scale = outMax; } -template -void InvLut1DRendererHalfCode::apply(const void * inImg, void * outImg, long numPixels) const +template +void InvLut1DRendererHalfCode::apply(const void * inImg, void * outImg, long numPixels) + const { typedef typename BitDepthInfo::Type InType; typedef typename BitDepthInfo::Type OutType; const InType * in = (InType *)inImg; - OutType * out = (OutType *)outImg; + OutType * out = (OutType *)outImg; const bool redIsIncreasing = this->m_paramsR.flipSign > 0.f; const bool grnIsIncreasing = this->m_paramsG.flipSign > 0.f; const bool bluIsIncreasing = this->m_paramsB.flipSign > 0.f; - for(long idx=0; idx::apply(const void * inImg, void * out // the neg effective domain starts. // If this proves to be a problem, could move the clamp here instead. - const float redIn = in[0]; - const float redOut - = (redIsIncreasing == (redIn >= this->m_paramsR.bisectPoint)) - ? FindLutInvHalf(this->m_paramsR.lutStart, - this->m_paramsR.startOffset, - this->m_paramsR.lutEnd, - this->m_paramsR.flipSign, - this->m_scale, - redIn) - : FindLutInvHalf(this->m_paramsR.negLutStart, - this->m_paramsR.negStartOffset, - this->m_paramsR.negLutEnd, - -this->m_paramsR.flipSign, - this->m_scale, - redIn); - - const float grnIn = in[1]; - const float grnOut - = (grnIsIncreasing == (grnIn >= this->m_paramsG.bisectPoint)) - ? FindLutInvHalf(this->m_paramsG.lutStart, - this->m_paramsG.startOffset, - this->m_paramsG.lutEnd, - this->m_paramsG.flipSign, - this->m_scale, - grnIn) - : FindLutInvHalf(this->m_paramsG.negLutStart, - this->m_paramsG.negStartOffset, - this->m_paramsG.negLutEnd, - -this->m_paramsG.flipSign, - this->m_scale, - grnIn); - - const float bluIn = in[2]; - const float bluOut - = (bluIsIncreasing == (bluIn >= this->m_paramsB.bisectPoint)) - ? FindLutInvHalf(this->m_paramsB.lutStart, - this->m_paramsB.startOffset, - this->m_paramsB.lutEnd, - this->m_paramsB.flipSign, - this->m_scale, - bluIn) - : FindLutInvHalf(this->m_paramsB.negLutStart, - this->m_paramsB.negStartOffset, - this->m_paramsB.negLutEnd, - -this->m_paramsR.flipSign, - this->m_scale, - bluIn); + const float redIn = in[0]; + const float redOut = (redIsIncreasing == (redIn >= this->m_paramsR.bisectPoint)) + ? FindLutInvHalf( + this->m_paramsR.lutStart, + this->m_paramsR.startOffset, + this->m_paramsR.lutEnd, + this->m_paramsR.flipSign, + this->m_scale, + redIn) + : FindLutInvHalf( + this->m_paramsR.negLutStart, + this->m_paramsR.negStartOffset, + this->m_paramsR.negLutEnd, + -this->m_paramsR.flipSign, + this->m_scale, + redIn); + + const float grnIn = in[1]; + const float grnOut = (grnIsIncreasing == (grnIn >= this->m_paramsG.bisectPoint)) + ? FindLutInvHalf( + this->m_paramsG.lutStart, + this->m_paramsG.startOffset, + this->m_paramsG.lutEnd, + this->m_paramsG.flipSign, + this->m_scale, + grnIn) + : FindLutInvHalf( + this->m_paramsG.negLutStart, + this->m_paramsG.negStartOffset, + this->m_paramsG.negLutEnd, + -this->m_paramsG.flipSign, + this->m_scale, + grnIn); + + const float bluIn = in[2]; + const float bluOut = (bluIsIncreasing == (bluIn >= this->m_paramsB.bisectPoint)) + ? FindLutInvHalf( + this->m_paramsB.lutStart, + this->m_paramsB.startOffset, + this->m_paramsB.lutEnd, + this->m_paramsB.flipSign, + this->m_scale, + bluIn) + : FindLutInvHalf( + this->m_paramsB.negLutStart, + this->m_paramsB.negStartOffset, + this->m_paramsB.negLutEnd, + -this->m_paramsR.flipSign, + this->m_scale, + bluIn); out[0] = Converter::CastValue(redOut); out[1] = Converter::CastValue(grnOut); out[2] = Converter::CastValue(bluOut); out[3] = Converter::CastValue(in[3] * this->m_alphaScaling); - in += 4; + in += 4; out += 4; } } -template -InvLut1DRendererHalfCodeHueAdjust::InvLut1DRendererHalfCodeHueAdjust(ConstLut1DOpDataRcPtr & lut) - : InvLut1DRendererHalfCode(lut) +template +InvLut1DRendererHalfCodeHueAdjust::InvLut1DRendererHalfCodeHueAdjust( + ConstLut1DOpDataRcPtr & lut) + : InvLut1DRendererHalfCode(lut) { this->updateData(lut); } -template -void InvLut1DRendererHalfCodeHueAdjust::apply(const void * inImg, void * outImg, long numPixels) const +template +void InvLut1DRendererHalfCodeHueAdjust::apply( + const void * inImg, + void * outImg, + long numPixels) const { typedef typename BitDepthInfo::Type InType; typedef typename BitDepthInfo::Type OutType; const InType * in = (InType *)inImg; - OutType * out = (OutType *)outImg; + OutType * out = (OutType *)outImg; const bool redIsIncreasing = this->m_paramsR.flipSign > 0.f; const bool grnIsIncreasing = this->m_paramsG.flipSign > 0.f; const bool bluIsIncreasing = this->m_paramsB.flipSign > 0.f; - for(long idx=0; idx= this->m_paramsR.bisectPoint)) - ? FindLutInvHalf(this->m_paramsR.lutStart, - this->m_paramsR.startOffset, - this->m_paramsR.lutEnd, - this->m_paramsR.flipSign, - this->m_scale, - RGB[0]) - : FindLutInvHalf(this->m_paramsR.negLutStart, - this->m_paramsR.negStartOffset, - this->m_paramsR.negLutEnd, - -this->m_paramsR.flipSign, - this->m_scale, - RGB[0]); - - const float grnOut - = (grnIsIncreasing == (RGB[1] >= this->m_paramsG.bisectPoint)) - ? FindLutInvHalf(this->m_paramsG.lutStart, - this->m_paramsG.startOffset, - this->m_paramsG.lutEnd, - this->m_paramsG.flipSign, - this->m_scale, - RGB[1]) - : FindLutInvHalf(this->m_paramsG.negLutStart, - this->m_paramsG.negStartOffset, - this->m_paramsG.negLutEnd, - -this->m_paramsG.flipSign, - this->m_scale, - RGB[1]); - - const float bluOut - = (bluIsIncreasing == (RGB[2] >= this->m_paramsB.bisectPoint)) - ? FindLutInvHalf(this->m_paramsB.lutStart, - this->m_paramsB.startOffset, - this->m_paramsB.lutEnd, - this->m_paramsB.flipSign, - this->m_scale, - RGB[2]) - : FindLutInvHalf(this->m_paramsB.negLutStart, - this->m_paramsB.negStartOffset, - this->m_paramsB.negLutEnd, - -this->m_paramsR.flipSign, - this->m_scale, - RGB[2]); - - float RGB2[] = { redOut, grnOut, bluOut }; + const float hue_factor = orig_chroma == 0.f ? 0.f : (RGB[mid] - RGB[min]) / orig_chroma; + + const float redOut = (redIsIncreasing == (RGB[0] >= this->m_paramsR.bisectPoint)) + ? FindLutInvHalf( + this->m_paramsR.lutStart, + this->m_paramsR.startOffset, + this->m_paramsR.lutEnd, + this->m_paramsR.flipSign, + this->m_scale, + RGB[0]) + : FindLutInvHalf( + this->m_paramsR.negLutStart, + this->m_paramsR.negStartOffset, + this->m_paramsR.negLutEnd, + -this->m_paramsR.flipSign, + this->m_scale, + RGB[0]); + + const float grnOut = (grnIsIncreasing == (RGB[1] >= this->m_paramsG.bisectPoint)) + ? FindLutInvHalf( + this->m_paramsG.lutStart, + this->m_paramsG.startOffset, + this->m_paramsG.lutEnd, + this->m_paramsG.flipSign, + this->m_scale, + RGB[1]) + : FindLutInvHalf( + this->m_paramsG.negLutStart, + this->m_paramsG.negStartOffset, + this->m_paramsG.negLutEnd, + -this->m_paramsG.flipSign, + this->m_scale, + RGB[1]); + + const float bluOut = (bluIsIncreasing == (RGB[2] >= this->m_paramsB.bisectPoint)) + ? FindLutInvHalf( + this->m_paramsB.lutStart, + this->m_paramsB.startOffset, + this->m_paramsB.lutEnd, + this->m_paramsB.flipSign, + this->m_scale, + RGB[2]) + : FindLutInvHalf( + this->m_paramsB.negLutStart, + this->m_paramsB.negStartOffset, + this->m_paramsB.negLutEnd, + -this->m_paramsR.flipSign, + this->m_scale, + RGB[2]); + + float RGB2[] = {redOut, grnOut, bluOut}; const float new_chroma = RGB2[max] - RGB2[min]; @@ -1618,12 +1642,12 @@ void InvLut1DRendererHalfCodeHueAdjust::apply(const void * inImg, v out[2] = Converter::CastValue(RGB2[2]); out[3] = Converter::CastValue(in[3] * this->m_alphaScaling); - in += 4; + in += 4; out += 4; } } -template +template OpCPURcPtr GetForwardLut1DRenderer(ConstLut1DOpDataRcPtr & lut) { // NB: Unlike bit-depth, the half domain status of a LUT @@ -1632,85 +1656,91 @@ OpCPURcPtr GetForwardLut1DRenderer(ConstLut1DOpDataRcPtr & lut) { if (lut->getHueAdjust() == HUE_NONE) { - return std::make_shared< Lut1DRendererHalfCode >(lut); + return std::make_shared>(lut); } else { - return std::make_shared< Lut1DRendererHalfCodeHueAdjust >(lut); + return std::make_shared>(lut); } } else { if (lut->getHueAdjust() == HUE_NONE) { - return std::make_shared< Lut1DRenderer >(lut); + return std::make_shared>(lut); } else { - return std::make_shared< Lut1DRendererHueAdjust >(lut); + return std::make_shared>(lut); } } } -} +} // namespace -template +template ConstOpCPURcPtr GetLut1DRenderer_OutBitDepth(ConstLut1DOpDataRcPtr & lut) { switch (lut->getDirection()) { - case TRANSFORM_DIR_FORWARD: - { - return GetForwardLut1DRenderer(lut); - break; - } - case TRANSFORM_DIR_INVERSE: - { - if (lut->isInputHalfDomain()) + case TRANSFORM_DIR_FORWARD: { - if (lut->getHueAdjust() == HUE_NONE) - { - return std::make_shared< InvLut1DRendererHalfCode >(lut); - } - else - { - return std::make_shared< InvLut1DRendererHalfCodeHueAdjust >(lut); - } + return GetForwardLut1DRenderer(lut); + break; } - else + case TRANSFORM_DIR_INVERSE: { - if (lut->getHueAdjust() == HUE_NONE) + if (lut->isInputHalfDomain()) { - return std::make_shared< InvLut1DRenderer >(lut); + if (lut->getHueAdjust() == HUE_NONE) + { + return std::make_shared>(lut); + } + else + { + return std::make_shared>(lut); + } } else { - return std::make_shared< InvLut1DRendererHueAdjust >(lut); + if (lut->getHueAdjust() == HUE_NONE) + { + return std::make_shared>(lut); + } + else + { + return std::make_shared>(lut); + } } + break; } - break; - } } throw Exception("Illegal LUT1D direction."); } -template +template ConstOpCPURcPtr GetLut1DRenderer_InBitDepth(ConstLut1DOpDataRcPtr & lut, BitDepth outBD) { - switch(outBD) + switch (outBD) { case BIT_DEPTH_UINT8: - return GetLut1DRenderer_OutBitDepth(lut); break; + return GetLut1DRenderer_OutBitDepth(lut); + break; case BIT_DEPTH_UINT10: - return GetLut1DRenderer_OutBitDepth(lut); break; + return GetLut1DRenderer_OutBitDepth(lut); + break; case BIT_DEPTH_UINT12: - return GetLut1DRenderer_OutBitDepth(lut); break; + return GetLut1DRenderer_OutBitDepth(lut); + break; case BIT_DEPTH_UINT16: - return GetLut1DRenderer_OutBitDepth(lut); break; + return GetLut1DRenderer_OutBitDepth(lut); + break; case BIT_DEPTH_F16: - return GetLut1DRenderer_OutBitDepth(lut); break; + return GetLut1DRenderer_OutBitDepth(lut); + break; case BIT_DEPTH_F32: - return GetLut1DRenderer_OutBitDepth(lut); break; + return GetLut1DRenderer_OutBitDepth(lut); + break; case BIT_DEPTH_UINT14: case BIT_DEPTH_UINT32: @@ -1725,20 +1755,26 @@ ConstOpCPURcPtr GetLut1DRenderer_InBitDepth(ConstLut1DOpDataRcPtr & lut, BitDept ConstOpCPURcPtr GetLut1DRenderer(ConstLut1DOpDataRcPtr & lut, BitDepth inBD, BitDepth outBD) { - switch(inBD) + switch (inBD) { case BIT_DEPTH_UINT8: - return GetLut1DRenderer_InBitDepth(lut, outBD); break; + return GetLut1DRenderer_InBitDepth(lut, outBD); + break; case BIT_DEPTH_UINT10: - return GetLut1DRenderer_InBitDepth(lut, outBD); break; + return GetLut1DRenderer_InBitDepth(lut, outBD); + break; case BIT_DEPTH_UINT12: - return GetLut1DRenderer_InBitDepth(lut, outBD); break; + return GetLut1DRenderer_InBitDepth(lut, outBD); + break; case BIT_DEPTH_UINT16: - return GetLut1DRenderer_InBitDepth(lut, outBD); break; + return GetLut1DRenderer_InBitDepth(lut, outBD); + break; case BIT_DEPTH_F16: - return GetLut1DRenderer_InBitDepth(lut, outBD); break; + return GetLut1DRenderer_InBitDepth(lut, outBD); + break; case BIT_DEPTH_F32: - return GetLut1DRenderer_InBitDepth(lut, outBD); break; + return GetLut1DRenderer_InBitDepth(lut, outBD); + break; case BIT_DEPTH_UINT14: case BIT_DEPTH_UINT32: @@ -1751,6 +1787,4 @@ ConstOpCPURcPtr GetLut1DRenderer(ConstLut1DOpDataRcPtr & lut, BitDepth inBD, Bit return ConstOpCPURcPtr(); } - } // namespace OCIO_NAMESPACE - diff --git a/src/OpenColorIO/ops/lut1d/Lut1DOpCPU_AVX.cpp b/src/OpenColorIO/ops/lut1d/Lut1DOpCPU_AVX.cpp index e0d1648b22..b30b9279df 100644 --- a/src/OpenColorIO/ops/lut1d/Lut1DOpCPU_AVX.cpp +++ b/src/OpenColorIO/ops/lut1d/Lut1DOpCPU_AVX.cpp @@ -12,34 +12,36 @@ namespace OCIO_NAMESPACE { -namespace { - -#define i32gather_ps_avx(src, dst, idx, indices, buffer) \ - _mm256_store_si256((__m256i *)indices, idx); \ - buffer[0] = (src)[indices[0]]; \ - buffer[1] = (src)[indices[1]]; \ - buffer[2] = (src)[indices[2]]; \ - buffer[3] = (src)[indices[3]]; \ - buffer[4] = (src)[indices[4]]; \ - buffer[5] = (src)[indices[5]]; \ - buffer[6] = (src)[indices[6]]; \ - buffer[7] = (src)[indices[7]]; \ - dst = _mm256_load_ps(buffer) +namespace +{ + +#define i32gather_ps_avx(src, dst, idx, indices, buffer) \ + _mm256_store_si256((__m256i *)indices, idx); \ + buffer[0] = (src)[indices[0]]; \ + buffer[1] = (src)[indices[1]]; \ + buffer[2] = (src)[indices[2]]; \ + buffer[3] = (src)[indices[3]]; \ + buffer[4] = (src)[indices[4]]; \ + buffer[5] = (src)[indices[5]]; \ + buffer[6] = (src)[indices[6]]; \ + buffer[7] = (src)[indices[7]]; \ + dst = _mm256_load_ps(buffer) static inline __m256 fmadd_ps_avx(__m256 a, __m256 b, __m256 c) { - return _mm256_add_ps(_mm256_mul_ps(a, b), c); + return _mm256_add_ps(_mm256_mul_ps(a, b), c); } -static inline __m256 apply_lut_avx(const float *lut, __m256 v, const __m256& scale, const __m256& lut_max) +static inline __m256 +apply_lut_avx(const float * lut, __m256 v, const __m256 & scale, const __m256 & lut_max) { AVX_ALIGN(uint32_t indices_p[8]); AVX_ALIGN(uint32_t indices_n[8]); AVX_ALIGN(float buffer_p[8]); AVX_ALIGN(float buffer_n[8]); - __m256 zero = _mm256_setzero_ps(); - __m256 one_f = _mm256_set1_ps(1); + __m256 zero = _mm256_setzero_ps(); + __m256 one_f = _mm256_set1_ps(1); __m256 scaled = _mm256_mul_ps(v, scale); @@ -63,27 +65,36 @@ static inline __m256 apply_lut_avx(const float *lut, __m256 v, const __m256& sca } template -static inline void linear1D(const float *lutR, const float *lutG,const float *lutB, int dim, const void *inImg, void *outImg, long numPixels) +static inline void linear1D( + const float * lutR, + const float * lutG, + const float * lutB, + int dim, + const void * inImg, + void * outImg, + long numPixels) { typedef typename BitDepthInfo::Type InType; typedef typename BitDepthInfo::Type OutType; - const InType *src = (const InType*)inImg; - OutType *dst = (OutType*)outImg; - __m256 r,g,b,a, alpha_scale; + const InType * src = (const InType *)inImg; + OutType * dst = (OutType *)outImg; + __m256 r, g, b, a, alpha_scale; - float rgb_scale = 1.0f / (float)BitDepthInfo::maxValue * ((float)dim -1); + float rgb_scale = 1.0f / (float)BitDepthInfo::maxValue * ((float)dim - 1); const __m256 lut_scale = _mm256_set1_ps(rgb_scale); - const __m256 lut_max = _mm256_set1_ps((float)dim -1); + const __m256 lut_max = _mm256_set1_ps((float)dim - 1); if (inBD != outBD) - alpha_scale = _mm256_set1_ps((float)BitDepthInfo::maxValue / (float)BitDepthInfo::maxValue); + alpha_scale = _mm256_set1_ps( + (float)BitDepthInfo::maxValue / (float)BitDepthInfo::maxValue); int pixel_count = numPixels / 8 * 8; - int remainder = numPixels - pixel_count; + int remainder = numPixels - pixel_count; - for (int i = 0; i < pixel_count; i += 8 ) { + for (int i = 0; i < pixel_count; i += 8) + { AVXRGBAPack::Load(src, r, g, b, a); r = apply_lut_avx(lutR, r, lut_scale, lut_max); @@ -99,19 +110,20 @@ static inline void linear1D(const float *lutR, const float *lutG,const float *lu dst += 32; } - // handler leftovers pixels - if (remainder) { + // handler leftovers pixels + if (remainder) + { InType in_buf[32] = {}; OutType out_buf[32]; // memcpy(in_buf, src, remainder * 4 * sizeof(InType)); - for (int i = 0; i < remainder*4; i+=4) + for (int i = 0; i < remainder * 4; i += 4) { in_buf[i + 0] = src[0]; in_buf[i + 1] = src[1]; in_buf[i + 2] = src[2]; in_buf[i + 3] = src[3]; - src+=4; + src += 4; } AVXRGBAPack::Load(in_buf, r, g, b, a); @@ -125,22 +137,20 @@ static inline void linear1D(const float *lutR, const float *lutG,const float *lu AVXRGBAPack::Store(out_buf, r, g, b, a); // memcpy(dst, out_buf, remainder * 4 * sizeof(OutType)); - for (int i = 0; i < remainder*4; i+=4) + for (int i = 0; i < remainder * 4; i += 4) { dst[0] = out_buf[i + 0]; dst[1] = out_buf[i + 1]; dst[2] = out_buf[i + 2]; dst[3] = out_buf[i + 3]; - dst+=4; + dst += 4; } - } } -template -inline Lut1DOpCPUApplyFunc * GetConvertInBitDepth(BitDepth outBD) +template inline Lut1DOpCPUApplyFunc * GetConvertInBitDepth(BitDepth outBD) { - switch(outBD) + switch (outBD) { case BIT_DEPTH_UINT8: return linear1D; @@ -174,7 +184,7 @@ Lut1DOpCPUApplyFunc * AVXGetLut1DApplyFunc(BitDepth inBD, BitDepth outBD) { // Lut1DOp only uses interpolation for in float in formats - switch(inBD) + switch (inBD) { case BIT_DEPTH_UINT8: case BIT_DEPTH_UINT10: @@ -194,6 +204,6 @@ Lut1DOpCPUApplyFunc * AVXGetLut1DApplyFunc(BitDepth inBD, BitDepth outBD) return nullptr; } -} // OCIO_NAMESPACE +} // namespace OCIO_NAMESPACE #endif // OCIO_USE_AVX \ No newline at end of file diff --git a/src/OpenColorIO/ops/lut1d/Lut1DOpCPU_AVX.h b/src/OpenColorIO/ops/lut1d/Lut1DOpCPU_AVX.h index c828169fd2..f1b0b8995b 100644 --- a/src/OpenColorIO/ops/lut1d/Lut1DOpCPU_AVX.h +++ b/src/OpenColorIO/ops/lut1d/Lut1DOpCPU_AVX.h @@ -8,7 +8,14 @@ #include "CPUInfo.h" -typedef void (Lut1DOpCPUApplyFunc)(const float *, const float *, const float *, int, const void *, void *, long); +typedef void(Lut1DOpCPUApplyFunc)( + const float *, + const float *, + const float *, + int, + const void *, + void *, + long); #if OCIO_USE_AVX namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/ops/lut1d/Lut1DOpCPU_AVX2.cpp b/src/OpenColorIO/ops/lut1d/Lut1DOpCPU_AVX2.cpp index 32e59ff679..7e75a81f89 100644 --- a/src/OpenColorIO/ops/lut1d/Lut1DOpCPU_AVX2.cpp +++ b/src/OpenColorIO/ops/lut1d/Lut1DOpCPU_AVX2.cpp @@ -12,13 +12,14 @@ namespace OCIO_NAMESPACE { -namespace { - +namespace +{ -static inline __m256 apply_lut_avx2(const float *lut, __m256 v, const __m256& scale, const __m256& lut_max) +static inline __m256 +apply_lut_avx2(const float * lut, __m256 v, const __m256 & scale, const __m256 & lut_max) { - __m256 zero = _mm256_setzero_ps(); - __m256 one_f = _mm256_set1_ps(1); + __m256 zero = _mm256_setzero_ps(); + __m256 one_f = _mm256_set1_ps(1); __m256 scaled = _mm256_mul_ps(v, scale); @@ -41,27 +42,36 @@ static inline __m256 apply_lut_avx2(const float *lut, __m256 v, const __m256& sc } template -static inline void linear1D(const float *lutR, const float *lutG,const float *lutB, int dim, const void *inImg, void *outImg, long numPixels) +static inline void linear1D( + const float * lutR, + const float * lutG, + const float * lutB, + int dim, + const void * inImg, + void * outImg, + long numPixels) { typedef typename BitDepthInfo::Type InType; typedef typename BitDepthInfo::Type OutType; - const InType *src = (const InType*)inImg; - OutType *dst = (OutType*)outImg; - __m256 r,g,b,a, alpha_scale; + const InType * src = (const InType *)inImg; + OutType * dst = (OutType *)outImg; + __m256 r, g, b, a, alpha_scale; - float rgb_scale = 1.0f / (float)BitDepthInfo::maxValue * ((float)dim -1); + float rgb_scale = 1.0f / (float)BitDepthInfo::maxValue * ((float)dim - 1); const __m256 lut_scale = _mm256_set1_ps(rgb_scale); - const __m256 lut_max = _mm256_set1_ps((float)dim -1); + const __m256 lut_max = _mm256_set1_ps((float)dim - 1); if (inBD != outBD) - alpha_scale = _mm256_set1_ps((float)BitDepthInfo::maxValue / (float)BitDepthInfo::maxValue); + alpha_scale = _mm256_set1_ps( + (float)BitDepthInfo::maxValue / (float)BitDepthInfo::maxValue); int pixel_count = numPixels / 8 * 8; - int remainder = numPixels - pixel_count; + int remainder = numPixels - pixel_count; - for (int i = 0; i < pixel_count; i += 8 ) { + for (int i = 0; i < pixel_count; i += 8) + { AVX2RGBAPack::Load(src, r, g, b, a); r = apply_lut_avx2(lutR, r, lut_scale, lut_max); @@ -77,19 +87,20 @@ static inline void linear1D(const float *lutR, const float *lutG,const float *lu dst += 32; } - // handler leftovers pixels - if (remainder) { + // handler leftovers pixels + if (remainder) + { InType in_buf[32] = {}; OutType out_buf[32]; // memcpy(in_buf, src, remainder * 4 * sizeof(InType)); - for (int i = 0; i < remainder*4; i+=4) + for (int i = 0; i < remainder * 4; i += 4) { in_buf[i + 0] = src[0]; in_buf[i + 1] = src[1]; in_buf[i + 2] = src[2]; in_buf[i + 3] = src[3]; - src+=4; + src += 4; } AVX2RGBAPack::Load(in_buf, r, g, b, a); @@ -103,22 +114,20 @@ static inline void linear1D(const float *lutR, const float *lutG,const float *lu AVX2RGBAPack::Store(out_buf, r, g, b, a); // memcpy(dst, out_buf, remainder * 4 * sizeof(OutType)); - for (int i = 0; i < remainder*4; i+=4) + for (int i = 0; i < remainder * 4; i += 4) { dst[0] = out_buf[i + 0]; dst[1] = out_buf[i + 1]; dst[2] = out_buf[i + 2]; dst[3] = out_buf[i + 3]; - dst+=4; + dst += 4; } - } } -template -inline Lut1DOpCPUApplyFunc * GetConvertInBitDepth(BitDepth outBD) +template inline Lut1DOpCPUApplyFunc * GetConvertInBitDepth(BitDepth outBD) { - switch(outBD) + switch (outBD) { case BIT_DEPTH_UINT8: return linear1D; @@ -152,7 +161,7 @@ Lut1DOpCPUApplyFunc * AVX2GetLut1DApplyFunc(BitDepth inBD, BitDepth outBD) { // Lut1DOp only uses interpolation for in float in formats - switch(inBD) + switch (inBD) { case BIT_DEPTH_UINT8: case BIT_DEPTH_UINT10: @@ -172,6 +181,6 @@ Lut1DOpCPUApplyFunc * AVX2GetLut1DApplyFunc(BitDepth inBD, BitDepth outBD) return nullptr; } -} // OCIO_NAMESPACE +} // namespace OCIO_NAMESPACE #endif // OCIO_USE_AVX2 \ No newline at end of file diff --git a/src/OpenColorIO/ops/lut1d/Lut1DOpCPU_AVX2.h b/src/OpenColorIO/ops/lut1d/Lut1DOpCPU_AVX2.h index a3e63d67eb..f3043a8a10 100644 --- a/src/OpenColorIO/ops/lut1d/Lut1DOpCPU_AVX2.h +++ b/src/OpenColorIO/ops/lut1d/Lut1DOpCPU_AVX2.h @@ -8,7 +8,14 @@ #include "CPUInfo.h" -typedef void (Lut1DOpCPUApplyFunc)(const float *, const float *, const float *, int, const void *, void *, long); +typedef void(Lut1DOpCPUApplyFunc)( + const float *, + const float *, + const float *, + int, + const void *, + void *, + long); #if OCIO_USE_AVX2 namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/ops/lut1d/Lut1DOpCPU_AVX512.cpp b/src/OpenColorIO/ops/lut1d/Lut1DOpCPU_AVX512.cpp index 7ca2dbd054..998152bc83 100644 --- a/src/OpenColorIO/ops/lut1d/Lut1DOpCPU_AVX512.cpp +++ b/src/OpenColorIO/ops/lut1d/Lut1DOpCPU_AVX512.cpp @@ -12,13 +12,14 @@ namespace OCIO_NAMESPACE { -namespace { - +namespace +{ -static inline __m512 apply_lut_avx512(const float *lut, __m512 v, const __m512& scale, const __m512& lut_max) +static inline __m512 +apply_lut_avx512(const float * lut, __m512 v, const __m512 & scale, const __m512 & lut_max) { - __m512 zero = _mm512_setzero_ps(); - __m512 one_f = _mm512_set1_ps(1); + __m512 zero = _mm512_setzero_ps(); + __m512 one_f = _mm512_set1_ps(1); __m512 scaled = _mm512_mul_ps(v, scale); @@ -41,27 +42,36 @@ static inline __m512 apply_lut_avx512(const float *lut, __m512 v, const __m512& } template -static inline void linear1D(const float *lutR, const float *lutG,const float *lutB, int dim, const void *inImg, void *outImg, long numPixels) +static inline void linear1D( + const float * lutR, + const float * lutG, + const float * lutB, + int dim, + const void * inImg, + void * outImg, + long numPixels) { typedef typename BitDepthInfo::Type InType; typedef typename BitDepthInfo::Type OutType; - const InType *src = (const InType*)inImg; - OutType *dst = (OutType*)outImg; - __m512 r,g,b,a, alpha_scale; + const InType * src = (const InType *)inImg; + OutType * dst = (OutType *)outImg; + __m512 r, g, b, a, alpha_scale; - float rgb_scale = 1.0f / (float)BitDepthInfo::maxValue * ((float)dim -1); + float rgb_scale = 1.0f / (float)BitDepthInfo::maxValue * ((float)dim - 1); const __m512 lut_scale = _mm512_set1_ps(rgb_scale); - const __m512 lut_max = _mm512_set1_ps((float)dim -1); + const __m512 lut_max = _mm512_set1_ps((float)dim - 1); if (inBD != outBD) - alpha_scale = _mm512_set1_ps((float)BitDepthInfo::maxValue / (float)BitDepthInfo::maxValue); + alpha_scale = _mm512_set1_ps( + (float)BitDepthInfo::maxValue / (float)BitDepthInfo::maxValue); int pixel_count = numPixels / 16 * 16; - int remainder = numPixels - pixel_count; + int remainder = numPixels - pixel_count; - for (int i = 0; i < pixel_count; i += 16 ) { + for (int i = 0; i < pixel_count; i += 16) + { AVX512RGBAPack::Load(src, r, g, b, a); r = apply_lut_avx512(lutR, r, lut_scale, lut_max); @@ -77,8 +87,9 @@ static inline void linear1D(const float *lutR, const float *lutG,const float *lu dst += 64; } - // handler leftovers pixels - if (remainder) { + // handler leftovers pixels + if (remainder) + { AVX512RGBAPack::LoadMasked(src, r, g, b, a, remainder); r = apply_lut_avx512(lutR, r, lut_scale, lut_max); @@ -92,10 +103,9 @@ static inline void linear1D(const float *lutR, const float *lutG,const float *lu } } -template -inline Lut1DOpCPUApplyFunc * GetConvertInBitDepth(BitDepth outBD) +template inline Lut1DOpCPUApplyFunc * GetConvertInBitDepth(BitDepth outBD) { - switch(outBD) + switch (outBD) { case BIT_DEPTH_UINT8: return linear1D; @@ -125,7 +135,7 @@ Lut1DOpCPUApplyFunc * AVX512GetLut1DApplyFunc(BitDepth inBD, BitDepth outBD) { // Lut1DOp only uses interpolation for in float in formats - switch(inBD) + switch (inBD) { case BIT_DEPTH_UINT8: case BIT_DEPTH_UINT10: @@ -145,6 +155,6 @@ Lut1DOpCPUApplyFunc * AVX512GetLut1DApplyFunc(BitDepth inBD, BitDepth outBD) return nullptr; } -} // OCIO_NAMESPACE +} // namespace OCIO_NAMESPACE #endif // OCIO_USE_AVX512 \ No newline at end of file diff --git a/src/OpenColorIO/ops/lut1d/Lut1DOpCPU_AVX512.h b/src/OpenColorIO/ops/lut1d/Lut1DOpCPU_AVX512.h index 2120d7354e..944a503156 100644 --- a/src/OpenColorIO/ops/lut1d/Lut1DOpCPU_AVX512.h +++ b/src/OpenColorIO/ops/lut1d/Lut1DOpCPU_AVX512.h @@ -8,7 +8,14 @@ #include "CPUInfo.h" -typedef void (Lut1DOpCPUApplyFunc)(const float *, const float *, const float *, int, const void *, void *, long); +typedef void(Lut1DOpCPUApplyFunc)( + const float *, + const float *, + const float *, + int, + const void *, + void *, + long); #if OCIO_USE_AVX512 namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/ops/lut1d/Lut1DOpCPU_SSE2.cpp b/src/OpenColorIO/ops/lut1d/Lut1DOpCPU_SSE2.cpp index c170e17914..73b71ae4f1 100644 --- a/src/OpenColorIO/ops/lut1d/Lut1DOpCPU_SSE2.cpp +++ b/src/OpenColorIO/ops/lut1d/Lut1DOpCPU_SSE2.cpp @@ -12,24 +12,24 @@ namespace OCIO_NAMESPACE { -namespace { +namespace +{ -#define i32gather_ps_sse2(src, dst, idx, indices, buffer) \ - _mm_store_si128((__m128i *)indices, idx); \ - buffer[0] = (src)[indices[0]]; \ - buffer[1] = (src)[indices[1]]; \ - buffer[2] = (src)[indices[2]]; \ - buffer[3] = (src)[indices[3]]; \ - dst = _mm_load_ps(buffer) +#define i32gather_ps_sse2(src, dst, idx, indices, buffer) \ + _mm_store_si128((__m128i *)indices, idx); \ + buffer[0] = (src)[indices[0]]; \ + buffer[1] = (src)[indices[1]]; \ + buffer[2] = (src)[indices[2]]; \ + buffer[3] = (src)[indices[3]]; \ + dst = _mm_load_ps(buffer) static inline __m128 fmadd_ps_sse2(__m128 a, __m128 b, __m128 c) { #if OCIO_USE_SSE2NEON return vreinterpretq_m128_f32( - vfmaq_f32(vreinterpretq_f32_m128(c), vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b)) - ); + vfmaq_f32(vreinterpretq_f32_m128(c), vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b))); #else - return _mm_add_ps(_mm_mul_ps(a, b), c); + return _mm_add_ps(_mm_mul_ps(a, b), c); #endif } @@ -43,16 +43,16 @@ static inline __m128 floor_ps_sse2(__m128 v) #endif } - -static inline __m128 apply_lut_sse2(const float *lut, __m128 v, const __m128& scale, const __m128& lut_max) +static inline __m128 +apply_lut_sse2(const float * lut, __m128 v, const __m128 & scale, const __m128 & lut_max) { SSE2_ALIGN(uint32_t indices_p[4]); SSE2_ALIGN(uint32_t indices_n[4]); SSE2_ALIGN(float buffer_p[4]); SSE2_ALIGN(float buffer_n[4]); - __m128 zero = _mm_setzero_ps(); - __m128 one_f = _mm_set1_ps(1); + __m128 zero = _mm_setzero_ps(); + __m128 one_f = _mm_set1_ps(1); __m128 scaled = _mm_mul_ps(v, scale); @@ -76,27 +76,36 @@ static inline __m128 apply_lut_sse2(const float *lut, __m128 v, const __m128& sc } template -static inline void linear1D(const float *lutR, const float *lutG,const float *lutB, int dim, const void *inImg, void *outImg, long numPixels) +static inline void linear1D( + const float * lutR, + const float * lutG, + const float * lutB, + int dim, + const void * inImg, + void * outImg, + long numPixels) { typedef typename BitDepthInfo::Type InType; typedef typename BitDepthInfo::Type OutType; - const InType *src = (const InType*)inImg; - OutType *dst = (OutType*)outImg; - __m128 r,g,b,a, alpha_scale; + const InType * src = (const InType *)inImg; + OutType * dst = (OutType *)outImg; + __m128 r, g, b, a, alpha_scale; - float rgb_scale = 1.0f / (float)BitDepthInfo::maxValue * ((float)dim -1); + float rgb_scale = 1.0f / (float)BitDepthInfo::maxValue * ((float)dim - 1); const __m128 lut_scale = _mm_set1_ps(rgb_scale); - const __m128 lut_max = _mm_set1_ps((float)dim -1); + const __m128 lut_max = _mm_set1_ps((float)dim - 1); if (inBD != outBD) - alpha_scale = _mm_set1_ps((float)BitDepthInfo::maxValue / (float)BitDepthInfo::maxValue); + alpha_scale = _mm_set1_ps( + (float)BitDepthInfo::maxValue / (float)BitDepthInfo::maxValue); int pixel_count = numPixels / 4 * 4; - int remainder = numPixels - pixel_count; + int remainder = numPixels - pixel_count; - for (int i = 0; i < pixel_count; i += 4 ) { + for (int i = 0; i < pixel_count; i += 4) + { SSE2RGBAPack::Load(src, r, g, b, a); r = apply_lut_sse2(lutR, r, lut_scale, lut_max); @@ -112,19 +121,20 @@ static inline void linear1D(const float *lutR, const float *lutG,const float *lu dst += 16; } - // handler leftovers pixels - if (remainder) { + // handler leftovers pixels + if (remainder) + { InType in_buf[16] = {}; OutType out_buf[16]; // memcpy(in_buf, src, remainder * 4 * sizeof(InType)); - for (int i = 0; i < remainder*4; i+=4) + for (int i = 0; i < remainder * 4; i += 4) { in_buf[i + 0] = src[0]; in_buf[i + 1] = src[1]; in_buf[i + 2] = src[2]; in_buf[i + 3] = src[3]; - src+=4; + src += 4; } SSE2RGBAPack::Load(in_buf, r, g, b, a); @@ -138,22 +148,20 @@ static inline void linear1D(const float *lutR, const float *lutG,const float *lu SSE2RGBAPack::Store(out_buf, r, g, b, a); // memcpy(dst, out_buf, remainder * 4 * sizeof(OutType)); - for (int i = 0; i < remainder*4; i+=4) + for (int i = 0; i < remainder * 4; i += 4) { dst[0] = out_buf[i + 0]; dst[1] = out_buf[i + 1]; dst[2] = out_buf[i + 2]; dst[3] = out_buf[i + 3]; - dst+=4; + dst += 4; } - } } -template -inline Lut1DOpCPUApplyFunc * GetConvertInBitDepth(BitDepth outBD) +template inline Lut1DOpCPUApplyFunc * GetConvertInBitDepth(BitDepth outBD) { - switch(outBD) + switch (outBD) { case BIT_DEPTH_UINT8: return linear1D; @@ -183,7 +191,7 @@ Lut1DOpCPUApplyFunc * SSE2GetLut1DApplyFunc(BitDepth inBD, BitDepth outBD) { // Lut1DOp only uses interpolation for in float in formats - switch(inBD) + switch (inBD) { case BIT_DEPTH_UINT8: case BIT_DEPTH_UINT10: @@ -203,6 +211,6 @@ Lut1DOpCPUApplyFunc * SSE2GetLut1DApplyFunc(BitDepth inBD, BitDepth outBD) return nullptr; } -} // OCIO_NAMESPACE +} // namespace OCIO_NAMESPACE #endif // OCIO_USE_SSE2 \ No newline at end of file diff --git a/src/OpenColorIO/ops/lut1d/Lut1DOpCPU_SSE2.h b/src/OpenColorIO/ops/lut1d/Lut1DOpCPU_SSE2.h index 9349e76533..928b3c7e9a 100644 --- a/src/OpenColorIO/ops/lut1d/Lut1DOpCPU_SSE2.h +++ b/src/OpenColorIO/ops/lut1d/Lut1DOpCPU_SSE2.h @@ -8,7 +8,14 @@ #include "CPUInfo.h" -typedef void (Lut1DOpCPUApplyFunc)(const float *, const float *, const float *, int, const void *, void *, long); +typedef void(Lut1DOpCPUApplyFunc)( + const float *, + const float *, + const float *, + int, + const void *, + void *, + long); #if OCIO_USE_SSE2 namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/ops/lut1d/Lut1DOpData.cpp b/src/OpenColorIO/ops/lut1d/Lut1DOpData.cpp index a12a7a3e1f..a3286d0995 100644 --- a/src/OpenColorIO/ops/lut1d/Lut1DOpData.cpp +++ b/src/OpenColorIO/ops/lut1d/Lut1DOpData.cpp @@ -9,10 +9,10 @@ #include "BitDepthUtils.h" #include "HashUtils.h" #include "MathUtils.h" +#include "ops/OpTools.h" #include "ops/lut1d/Lut1DOp.h" #include "ops/lut1d/Lut1DOpData.h" #include "ops/matrix/MatrixOp.h" -#include "ops/OpTools.h" #include "ops/range/RangeOpData.h" namespace OCIO_NAMESPACE @@ -20,10 +20,11 @@ namespace OCIO_NAMESPACE // Number of possible values for the Half domain. static const unsigned long HALF_DOMAIN_REQUIRED_ENTRIES = 65536; -Lut1DOpData::Lut3by1DArray::Lut3by1DArray(HalfFlags halfFlags, - unsigned long numChannels, - unsigned long length, - bool filterNANs) +Lut1DOpData::Lut3by1DArray::Lut3by1DArray( + HalfFlags halfFlags, + unsigned long numChannels, + unsigned long length, + bool filterNANs) { if (length < 2) { @@ -47,12 +48,13 @@ void Lut1DOpData::Lut3by1DArray::fill(HalfFlags halfFlags, bool filterNANs) const unsigned long dim = getLength(); const unsigned long maxChannels = getNumColorComponents(); - Array::Values& values = getValues(); + Array::Values & values = getValues(); if (Lut1DOpData::IsInputHalfDomain(halfFlags)) { - for (unsigned long idx = 0; idx(htemp); if (IsNan(ftemp) && filterNANs) { @@ -60,23 +62,22 @@ void Lut1DOpData::Lut3by1DArray::fill(HalfFlags halfFlags, bool filterNANs) } const unsigned long row = maxChannels * idx; - for (unsigned long channel = 0; channel 1024 * 1024) { std::ostringstream oss; - oss << "LUT 1D: Length '" << length - << "' must not be greater than 1024x1024 (1048576)."; + oss << "LUT 1D: Length '" << length << "' must not be greater than 1024x1024 (1048576)."; throw Exception(oss.str().c_str()); } Array::resize(length, numColorComponents); @@ -116,18 +116,18 @@ bool Lut1DOpData::Lut3by1DArray::isIdentity(HalfFlags halfFlags) const // most LUTs, we'll return false after only a few iterations of the loop. // So for now we've remove the member to store the result of this computation. // - const unsigned long dim = getLength(); - const Array::Values& values = getValues(); + const unsigned long dim = getLength(); + const Array::Values & values = getValues(); const unsigned long maxChannels = getMaxColorComponents(); if (Lut1DOpData::IsInputHalfDomain(halfFlags)) { - for (unsigned long idx = 0; idxgetRedProperties(); - const unsigned long length = invLut->getArray().getLength(); + const unsigned long length = invLut->getArray().getLength(); // If the start or end of the LUT contains a flat region, that will cause // a round-trip to be limited. @@ -311,82 +310,79 @@ OpDataRcPtr Lut1DOpData::getPairIdentityReplacement(ConstLut1DOpDataRcPtr & lut2 double maxValue = 1.; switch (m_direction) { - case TRANSFORM_DIR_FORWARD: // Fwd Lut1D -> Inv Lut1D - { - // A round-trip in this order will impose at least a clamp to [0,1] - // based on what happens entering the first Fwd Lut1D. However, the - // clamping may be to an even narrower range if there are flat regions. - // - // The flat region limitation is imposed based on the where it falls - // relative to the [0,1] input domain. - - // TODO: A RangeOp has one min & max for all channels, whereas a Lut1D may - // have three independent channels. Potentially could look at all chans - // and take the extrema of each? For now, just using the first channel. - const unsigned long minIndex = redProperties.startDomain; - const unsigned long maxIndex = redProperties.endDomain; - - minValue = (double)minIndex / (length - 1); - maxValue = (double)maxIndex / (length - 1); - break; - } - case TRANSFORM_DIR_INVERSE: // Inv Lut1D -> Fwd Lut1D - { - // A round-trip in this order will impose a clamp, but it may be to - // bounds outside of [0,1] since the Fwd LUT may contain values outside - // [0,1] and so the Inv LUT will accept inputs on that extended range. - // - // The flat region limitation is imposed based on the output range. - - const bool isIncreasing = redProperties.isIncreasing; - const unsigned long maxChannels = invLut->getArray().getMaxColorComponents(); - const unsigned long lastValIndex = (length - 1) * maxChannels; - // Note that the array for the invLut has had initializeFromForward() - // done and so any reversals have been converted to flat regions and - // the extrema are at the beginning & end of the LUT. - const Array::Values & lutValues = invLut->getArray().getValues(); - - // TODO: Currently only basing this on the red channel. - minValue = isIncreasing ? lutValues[0] : lutValues[lastValIndex]; - maxValue = isIncreasing ? lutValues[lastValIndex] : lutValues[0]; - break; - } + case TRANSFORM_DIR_FORWARD: // Fwd Lut1D -> Inv Lut1D + { + // A round-trip in this order will impose at least a clamp to [0,1] + // based on what happens entering the first Fwd Lut1D. However, the + // clamping may be to an even narrower range if there are flat regions. + // + // The flat region limitation is imposed based on the where it falls + // relative to the [0,1] input domain. + + // TODO: A RangeOp has one min & max for all channels, whereas a Lut1D may + // have three independent channels. Potentially could look at all chans + // and take the extrema of each? For now, just using the first channel. + const unsigned long minIndex = redProperties.startDomain; + const unsigned long maxIndex = redProperties.endDomain; + + minValue = (double)minIndex / (length - 1); + maxValue = (double)maxIndex / (length - 1); + break; + } + case TRANSFORM_DIR_INVERSE: // Inv Lut1D -> Fwd Lut1D + { + // A round-trip in this order will impose a clamp, but it may be to + // bounds outside of [0,1] since the Fwd LUT may contain values outside + // [0,1] and so the Inv LUT will accept inputs on that extended range. + // + // The flat region limitation is imposed based on the output range. + + const bool isIncreasing = redProperties.isIncreasing; + const unsigned long maxChannels = invLut->getArray().getMaxColorComponents(); + const unsigned long lastValIndex = (length - 1) * maxChannels; + // Note that the array for the invLut has had initializeFromForward() + // done and so any reversals have been converted to flat regions and + // the extrema are at the beginning & end of the LUT. + const Array::Values & lutValues = invLut->getArray().getValues(); + + // TODO: Currently only basing this on the red channel. + minValue = isIncreasing ? lutValues[0] : lutValues[lastValIndex]; + maxValue = isIncreasing ? lutValues[lastValIndex] : lutValues[0]; + break; + } } - res = std::make_shared(minValue, maxValue, - minValue, maxValue); + res = std::make_shared(minValue, maxValue, minValue, maxValue); } return res; } void Lut1DOpData::setInputHalfDomain(bool isHalfDomain) noexcept { - m_halfFlags = (isHalfDomain) ? - ((HalfFlags)(m_halfFlags | LUT_INPUT_HALF_CODE)) : - ((HalfFlags)(m_halfFlags & ~LUT_INPUT_HALF_CODE)); + m_halfFlags = (isHalfDomain) ? ((HalfFlags)(m_halfFlags | LUT_INPUT_HALF_CODE)) + : ((HalfFlags)(m_halfFlags & ~LUT_INPUT_HALF_CODE)); } void Lut1DOpData::setOutputRawHalfs(bool isRawHalfs) noexcept { - m_halfFlags = (isRawHalfs) ? - ((HalfFlags)(m_halfFlags | LUT_OUTPUT_HALF_CODE)) : - ((HalfFlags)(m_halfFlags & ~LUT_OUTPUT_HALF_CODE)); + m_halfFlags = (isRawHalfs) ? ((HalfFlags)(m_halfFlags | LUT_OUTPUT_HALF_CODE)) + : ((HalfFlags)(m_halfFlags & ~LUT_OUTPUT_HALF_CODE)); } bool Lut1DOpData::IsValidInterpolation(Interpolation interpolation) { switch (interpolation) { - case INTERP_BEST: - case INTERP_DEFAULT: - case INTERP_LINEAR: - case INTERP_NEAREST: - return true; - case INTERP_CUBIC: - case INTERP_TETRAHEDRAL: - case INTERP_UNKNOWN: - default: - return false; + case INTERP_BEST: + case INTERP_DEFAULT: + case INTERP_LINEAR: + case INTERP_NEAREST: + return true; + case INTERP_CUBIC: + case INTERP_TETRAHEDRAL: + case INTERP_UNKNOWN: + default: + return false; } } @@ -410,7 +406,7 @@ void Lut1DOpData::validate() const { getArray().validate(); } - catch (const Exception& e) + catch (const Exception & e) { std::ostringstream oss; oss << "1D LUT content array issue: "; @@ -420,8 +416,7 @@ void Lut1DOpData::validate() const } // If isHalfDomain is set, we need to make sure we have 65536 entries. - if (isInputHalfDomain() && getArray().getLength() - != HALF_DOMAIN_REQUIRED_ENTRIES) + if (isInputHalfDomain() && getArray().getLength() != HALF_DOMAIN_REQUIRED_ENTRIES) { std::ostringstream oss; oss << "1D LUT: "; @@ -443,33 +438,31 @@ unsigned long Lut1DOpData::GetLutIdealSize(BitDepth incomingBitDepth) switch (incomingBitDepth) { - case BIT_DEPTH_UINT8: - case BIT_DEPTH_UINT10: - case BIT_DEPTH_UINT12: - case BIT_DEPTH_UINT14: - case BIT_DEPTH_UINT16: - return (unsigned long)(GetBitDepthMaxValue(incomingBitDepth) + 1); - - case BIT_DEPTH_F16: - case BIT_DEPTH_F32: - break; - - case BIT_DEPTH_UNKNOWN: - case BIT_DEPTH_UINT32: - default: - { - std::string err("Bit-depth is not supported: "); - err += BitDepthToString(incomingBitDepth); - throw Exception(err.c_str()); - } + case BIT_DEPTH_UINT8: + case BIT_DEPTH_UINT10: + case BIT_DEPTH_UINT12: + case BIT_DEPTH_UINT14: + case BIT_DEPTH_UINT16: + return (unsigned long)(GetBitDepthMaxValue(incomingBitDepth) + 1); + + case BIT_DEPTH_F16: + case BIT_DEPTH_F32: + break; + case BIT_DEPTH_UNKNOWN: + case BIT_DEPTH_UINT32: + default: + { + std::string err("Bit-depth is not supported: "); + err += BitDepthToString(incomingBitDepth); + throw Exception(err.c_str()); + } } return 65536; } -unsigned long Lut1DOpData::GetLutIdealSize(BitDepth inputBitDepth, - HalfFlags halfFlags) +unsigned long Lut1DOpData::GetLutIdealSize(BitDepth inputBitDepth, HalfFlags halfFlags) { // Returns the number of entries that fill() expects in order to make // an identity LUT. @@ -494,12 +487,11 @@ bool Lut1DOpData::mayLookup(BitDepth incomingDepth) const { return incomingDepth == BIT_DEPTH_F16; } - else // not a half-domain LUT + else // not a half-domain LUT { if (!IsFloatBitDepth(incomingDepth)) { - return m_array.getLength() - == (GetBitDepthMaxValue(incomingDepth) + 1); + return m_array.getLength() == (GetBitDepthMaxValue(incomingDepth) + 1); } } return false; @@ -528,20 +520,20 @@ Lut1DOpDataRcPtr Lut1DOpData::MakeLookupDomain(BitDepth incomingDepth) bool Lut1DOpData::haveEqualBasics(const Lut1DOpData & other) const { // Question: Should interpolation style be considered? - return m_halfFlags == other.m_halfFlags && - m_hueAdjust == other.m_hueAdjust && - m_array == other.m_array; + return m_halfFlags == other.m_halfFlags && m_hueAdjust == other.m_hueAdjust + && m_array == other.m_array; } bool Lut1DOpData::equals(const OpData & other) const { - if (!OpData::equals(other)) return false; + if (!OpData::equals(other)) + return false; - const Lut1DOpData* lop = static_cast(&other); + const Lut1DOpData * lop = static_cast(&other); // NB: The m_invQuality is not currently included. - if (m_direction != lop->m_direction || - getConcreteInterpolation() != lop->getConcreteInterpolation()) + if (m_direction != lop->m_direction + || getConcreteInterpolation() != lop->getConcreteInterpolation()) { return false; } @@ -569,10 +561,8 @@ Lut1DOpDataRcPtr Lut1DOpData::clone() const bool Lut1DOpData::isInverse(ConstLut1DOpDataRcPtr & other) const { - if ((m_direction == TRANSFORM_DIR_FORWARD && - other->m_direction == TRANSFORM_DIR_INVERSE) || - (m_direction == TRANSFORM_DIR_INVERSE && - other->m_direction == TRANSFORM_DIR_FORWARD)) + if ((m_direction == TRANSFORM_DIR_FORWARD && other->m_direction == TRANSFORM_DIR_INVERSE) + || (m_direction == TRANSFORM_DIR_INVERSE && other->m_direction == TRANSFORM_DIR_FORWARD)) { // Note: The inverse LUT 1D finalize modifies the array to make it // monotonic, hence, this could return false in unexpected cases. @@ -592,8 +582,8 @@ Lut1DOpDataRcPtr Lut1DOpData::inverse() const { Lut1DOpDataRcPtr invLut = clone(); - invLut->m_direction = (m_direction == TRANSFORM_DIR_FORWARD) ? - TRANSFORM_DIR_INVERSE : TRANSFORM_DIR_FORWARD; + invLut->m_direction + = (m_direction == TRANSFORM_DIR_FORWARD) ? TRANSFORM_DIR_INVERSE : TRANSFORM_DIR_FORWARD; // Note that any existing metadata could become stale at this point but // trying to update it is also challenging since inverse() is sometimes @@ -603,27 +593,27 @@ Lut1DOpDataRcPtr Lut1DOpData::inverse() const namespace { -const char* GetHueAdjustName(Lut1DHueAdjust algo) +const char * GetHueAdjustName(Lut1DHueAdjust algo) { switch (algo) { - case HUE_DW3: - { - return "dw3"; - } - case HUE_NONE: - { - return "none"; - } - case HUE_WYPN: - { - throw Exception("1D LUT HUE_WYPN hue adjust style is not implemented."); - } + case HUE_DW3: + { + return "dw3"; + } + case HUE_NONE: + { + return "none"; + } + case HUE_WYPN: + { + throw Exception("1D LUT HUE_WYPN hue adjust style is not implemented."); + } } throw Exception("1D LUT has an invalid hue adjust style."); } -} +} // namespace std::string Lut1DOpData::getCacheID() const { @@ -637,12 +627,13 @@ std::string Lut1DOpData::getCacheID() const cacheIDStream << getID() << " "; } - cacheIDStream << CacheIDHash(reinterpret_cast(&values[0]), - values.size() * sizeof(values[0])) + cacheIDStream << CacheIDHash( + reinterpret_cast(&values[0]), + values.size() * sizeof(values[0])) << " "; - cacheIDStream << TransformDirectionToString(m_direction) << " "; - cacheIDStream << InterpolationToString(m_interpolation) << " "; + cacheIDStream << TransformDirectionToString(m_direction) << " "; + cacheIDStream << InterpolationToString(m_interpolation) << " "; cacheIDStream << (isInputHalfDomain() ? "half domain" : "standard domain") << " "; cacheIDStream << GetHueAdjustName(m_hueAdjust); @@ -664,7 +655,6 @@ std::string Lut1DOpData::getCacheID() const // the first op is sufficient, in other cases we need to create a new more // finely sampled domain to try and make the result less lossy. - //----------------------------------------------------------------------------- // Calculate a new LUT by evaluating a new domain (lut) through a set of ops. // @@ -698,10 +688,7 @@ void Lut1DOpData::ComposeVec(Lut1DOpDataRcPtr & lut, OpRcPtrVec & ops) // Evaluate the transforms at 32f. // Note: If any ops are bypassed, that will be respected here. - EvalTransform((const float*)(&inValues[0]), - (float*)(&inValues[0]), - numPixels, - ops); + EvalTransform((const float *)(&inValues[0]), (float *)(&inValues[0]), numPixels, ops); } // Compose two Lut1DOpData. @@ -712,17 +699,19 @@ void Lut1DOpData::ComposeVec(Lut1DOpDataRcPtr & lut, OpRcPtrVec & ops) // table for the hue adjust renderer. We could potentially do a lock object in // that renderer to over-ride the hue adjust temporarily like in invLut1d. // But for now, put the burdon on the caller to use Lut1DOpData::mayCompose first. -Lut1DOpDataRcPtr Lut1DOpData::Compose(ConstLut1DOpDataRcPtr & lutc1, - ConstLut1DOpDataRcPtr & lutc2, - ComposeMethod compFlag) +Lut1DOpDataRcPtr Lut1DOpData::Compose( + ConstLut1DOpDataRcPtr & lutc1, + ConstLut1DOpDataRcPtr & lutc2, + ComposeMethod compFlag) { - // We need a non-const version of luts to create the op and temporaly change the direction if needed. - // Op will not be modified (except by finalize, but that should have been done already). + // We need a non-const version of luts to create the op and temporaly change the direction if + // needed. Op will not be modified (except by finalize, but that should have been done already). Lut1DOpDataRcPtr lut1 = std::const_pointer_cast(lutc1); Lut1DOpDataRcPtr lut2 = std::const_pointer_cast(lutc2); - bool restoreInverse = false; - if (lut1->getDirection() == TRANSFORM_DIR_INVERSE && lut2->getDirection() == TRANSFORM_DIR_INVERSE) + bool restoreInverse = false; + if (lut1->getDirection() == TRANSFORM_DIR_INVERSE + && lut2->getDirection() == TRANSFORM_DIR_INVERSE) { // Using the fact that: inv(l2 x l1) = inv(l1) x inv(l2). // Compute l2 x l1 and invert the result. @@ -736,29 +725,29 @@ Lut1DOpDataRcPtr Lut1DOpData::Compose(ConstLut1DOpDataRcPtr & lutc1, OpRcPtrVec ops; unsigned long minSize = 0; - bool needHalfDomain = false; + bool needHalfDomain = false; switch (compFlag) { - case COMPOSE_RESAMPLE_NO: - { - minSize = 0; - break; - } - case COMPOSE_RESAMPLE_BIG: - { - minSize = 65536; - break; - } - case COMPOSE_RESAMPLE_HD: - { - minSize = 65536; - needHalfDomain = true; - break; - } + case COMPOSE_RESAMPLE_NO: + { + minSize = 0; + break; + } + case COMPOSE_RESAMPLE_BIG: + { + minSize = 65536; + break; + } + case COMPOSE_RESAMPLE_HD: + { + minSize = 65536; + needHalfDomain = true; + break; + } - // TODO: May want to add another style which is the maximum of lut2 - // size (careful of half domain), and in-depth ideal size. + // TODO: May want to add another style which is the maximum of lut2 + // size (careful of half domain), and in-depth ideal size. } const unsigned long lut1Size = lutc1->getArray().getLength(); @@ -785,15 +774,15 @@ Lut1DOpDataRcPtr Lut1DOpData::Compose(ConstLut1DOpDataRcPtr & lutc1, } else { - result = std::make_shared(needHalfDomain ? Lut1DOpData::LUT_INPUT_HALF_CODE : - Lut1DOpData::LUT_STANDARD, - minSize, true); + result = std::make_shared( + needHalfDomain ? Lut1DOpData::LUT_INPUT_HALF_CODE : Lut1DOpData::LUT_STANDARD, + minSize, + true); } - result->setInterpolation(lut1->getInterpolation()); - auto metadata = lut1->getFormatMetadata(); + auto metadata = lut1->getFormatMetadata(); result->getFormatMetadata() = metadata; } else @@ -888,14 +877,15 @@ bool Lut1DOpData::hasExtendedRange() const // LUT has a half domain but outputs integers within [0,65535] so the // inverse actually wants a normal 16i domain. - const Array::Values& values = getArray().getValues(); + const Array::Values & values = getArray().getValues(); constexpr float normalMin = 0.0f - 1e-5f; constexpr float normalMax = 1.0f + 1e-5f; for (auto & val : values) { - if (IsNan(val)) continue; + if (IsNan(val)) + continue; if (val < normalMin) { return true; @@ -929,7 +919,7 @@ void Lut1DOpData::initializeFromForward() // NB: The file reader must call setFileOutputBitDepth since some methods // need to know the original scaling of the LUT. - // NB: The half domain includes pos/neg infinity and NaNs. + // NB: The half domain includes pos/neg infinity and NaNs. // InitializeFromForward makes the LUT monotonic to ensure a unique inverse and // determines an effective domain to handle flat spots at the ends nicely. // It's not clear how the NaN part of the domain should be included in the @@ -938,17 +928,17 @@ void Lut1DOpData::initializeFromForward() // the pre-processing ignore the NaN part of the domain. // Note: Data allocated for the array is length*getMaxColorComponents(). - const unsigned long length = getArray().getLength(); - const unsigned long maxChannels = getArray().getMaxColorComponents(); + const unsigned long length = getArray().getLength(); + const unsigned long maxChannels = getArray().getMaxColorComponents(); const unsigned long activeChannels = getArray().getNumColorComponents(); - Array::Values& values = getArray().getValues(); + Array::Values & values = getArray().getValues(); for (unsigned long c = 0; c < activeChannels; ++c) { // Determine if the LUT is overall increasing or decreasing. // The heuristic used is to compare first and last entries. // (Note flat LUTs (arbitrarily) have isIncreasing == false.) - unsigned long lowInd = c; + unsigned long lowInd = c; unsigned long highInd = (length - 1) * maxChannels + c; if (isInputHalfDomain()) { @@ -956,8 +946,8 @@ void Lut1DOpData::initializeFromForward() // correctly populate the whole domain, so using -HALF_MAX and // +HALF_MAX could potentially give unreliable results. // Just using 0 and 1 for now. - lowInd = 0u * maxChannels + c; // 0.0 - highInd = 15360u * maxChannels + c; // 15360 == 1.0 + lowInd = 0u * maxChannels + c; // 0.0 + highInd = 15360u * maxChannels + c; // 15360 == 1.0 } { @@ -973,8 +963,7 @@ void Lut1DOpData::initializeFromForward() if (!isInputHalfDomain()) { float prevValue = values[c]; - for (unsigned long idx = c + maxChannels; - idx < length * maxChannels; + for (unsigned long idx = c + maxChannels; idx < length * maxChannels; idx += maxChannels) { if (isIncreasing != (values[idx] > prevValue)) @@ -991,11 +980,9 @@ void Lut1DOpData::initializeFromForward() { // Do positive numbers. unsigned long startInd = 0u * maxChannels + c; // 0 == +zero - unsigned long endInd = 31744u * maxChannels; // 31744 == +infinity - float prevValue = values[startInd]; - for (unsigned long idx = startInd + maxChannels; - idx <= endInd; - idx += maxChannels) + unsigned long endInd = 31744u * maxChannels; // 31744 == +infinity + float prevValue = values[startInd]; + for (unsigned long idx = startInd + maxChannels; idx <= endInd; idx += maxChannels) { if (isIncreasing != (values[idx] > prevValue)) { @@ -1009,9 +996,9 @@ void Lut1DOpData::initializeFromForward() // Do negative numbers. isIncreasing = !isIncreasing; - startInd = 32768u * maxChannels + c; // 32768 == -zero - endInd = 64512u * maxChannels; // 64512 == -infinity - prevValue = values[c]; // prev value for -0 is +0 (disallow overlaps) + startInd = 32768u * maxChannels + c; // 32768 == -zero + endInd = 64512u * maxChannels; // 64512 == -infinity + prevValue = values[c]; // prev value for -0 is +0 (disallow overlaps) for (unsigned long idx = startInd; idx <= endInd; idx += maxChannels) { if (isIncreasing != (values[idx] > prevValue)) @@ -1034,25 +1021,24 @@ void Lut1DOpData::initializeFromForward() if (!isInputHalfDomain()) { unsigned long endDomain = length - 1; - const float endValue = values[endDomain * maxChannels + c]; - while (endDomain > 0 - && values[(endDomain - 1) * maxChannels + c] == endValue) + const float endValue = values[endDomain * maxChannels + c]; + while (endDomain > 0 && values[(endDomain - 1) * maxChannels + c] == endValue) { --endDomain; } unsigned long startDomain = 0; - const float startValue = values[startDomain * maxChannels + c]; + const float startValue = values[startDomain * maxChannels + c]; // Note that this works for both increasing and decreasing LUTs // since there is no reqmt that startValue < endValue. while (startDomain < endDomain - && values[(startDomain + 1) * maxChannels + c] == startValue) + && values[(startDomain + 1) * maxChannels + c] == startValue) { ++startDomain; } m_componentProperties[c].startDomain = startDomain; - m_componentProperties[c].endDomain = endDomain; + m_componentProperties[c].endDomain = endDomain; } else { @@ -1067,46 +1053,45 @@ void Lut1DOpData::initializeFromForward() // LUT and these seem to make the value for both inf and 65504 // a NaN. Limiting the effective domain allows 65504 to invert // correctly. - unsigned long endDomain = 31743u; // +65504 = largest half value < inf - const float endValue = values[endDomain * maxChannels + c]; - while (endDomain > 0 - && values[(endDomain - 1) * maxChannels + c] == endValue) + unsigned long endDomain = 31743u; // +65504 = largest half value < inf + const float endValue = values[endDomain * maxChannels + c]; + while (endDomain > 0 && values[(endDomain - 1) * maxChannels + c] == endValue) { --endDomain; } - unsigned long startDomain = 0; // positive zero - const float startValue = values[startDomain * maxChannels + c]; + unsigned long startDomain = 0; // positive zero + const float startValue = values[startDomain * maxChannels + c]; // Note that this works for both increasing and decreasing LUTs // since there is no reqmt that startValue < endValue. while (startDomain < endDomain - && values[(startDomain + 1) * maxChannels + c] == startValue) + && values[(startDomain + 1) * maxChannels + c] == startValue) { ++startDomain; } m_componentProperties[c].startDomain = startDomain; - m_componentProperties[c].endDomain = endDomain; + m_componentProperties[c].endDomain = endDomain; // Negative half of domain has its own start/end. - unsigned long negEndDomain = 64511u; // -65504 = last value before neg inf - const float negEndValue = values[negEndDomain * maxChannels + c]; - while (negEndDomain > 32768u // negative zero - && values[(negEndDomain - 1) * maxChannels + c] == negEndValue) + unsigned long negEndDomain = 64511u; // -65504 = last value before neg inf + const float negEndValue = values[negEndDomain * maxChannels + c]; + while (negEndDomain > 32768u // negative zero + && values[(negEndDomain - 1) * maxChannels + c] == negEndValue) { --negEndDomain; } unsigned long negStartDomain = 32768u; // negative zero - const float negStartValue = values[negStartDomain * maxChannels + c]; + const float negStartValue = values[negStartDomain * maxChannels + c]; while (negStartDomain < negEndDomain - && values[(negStartDomain + 1) * maxChannels + c] == negStartValue) + && values[(negStartDomain + 1) * maxChannels + c] == negStartValue) { ++negStartDomain; } m_componentProperties[c].negStartDomain = negStartDomain; - m_componentProperties[c].negEndDomain = negEndDomain; + m_componentProperties[c].negEndDomain = negEndDomain; } } } diff --git a/src/OpenColorIO/ops/lut1d/Lut1DOpData.h b/src/OpenColorIO/ops/lut1d/Lut1DOpData.h index d06ca8da6d..5c7d03c265 100644 --- a/src/OpenColorIO/ops/lut1d/Lut1DOpData.h +++ b/src/OpenColorIO/ops/lut1d/Lut1DOpData.h @@ -7,9 +7,8 @@ #include #include "Op.h" -#include "ops/OpArray.h" #include "PrivateTypes.h" - +#include "ops/OpArray.h" namespace OCIO_NAMESPACE { @@ -20,7 +19,6 @@ typedef OCIO_SHARED_PTR ConstLut1DOpDataRcPtr; class Lut1DOpData : public OpData { public: - // List of flags that describe 1-D LUT index and value encoding. // // 1-D LUT indices and values can either be expressed in standard numeric @@ -28,14 +26,14 @@ class Lut1DOpData : public OpData // representations of a 16 bit floating point value. See: // http://en.wikipedia.org/wiki/Half-precision_floating-point_format. // - enum HalfFlags { - LUT_STANDARD = 0x00, // Indices & values use standard encoding. - LUT_INPUT_HALF_CODE = 0x01, // LUT indices are half float codes. + enum HalfFlags + { + LUT_STANDARD = 0x00, // Indices & values use standard encoding. + LUT_INPUT_HALF_CODE = 0x01, // LUT indices are half float codes. LUT_OUTPUT_HALF_CODE = 0x02, // LUT values are half float codes. - LUT_INPUT_OUTPUT_HALF_CODE = - LUT_INPUT_HALF_CODE - | LUT_OUTPUT_HALF_CODE // Indices and values are half float codes. + LUT_INPUT_OUTPUT_HALF_CODE + = LUT_INPUT_HALF_CODE | LUT_OUTPUT_HALF_CODE // Indices and values are half float codes. }; // Contains properties needed for inversion of a single channel of a LUT. @@ -46,7 +44,9 @@ class Lut1DOpData : public OpData , startDomain(0) , endDomain(0) , negStartDomain(0) - , negEndDomain(0) {} + , negEndDomain(0) + { + } bool isIncreasing; // Represents the overall increasing state. unsigned long startDomain; // Is the lowest index such that LUT[start] != LUT[start+1]. @@ -62,9 +62,9 @@ class Lut1DOpData : public OpData // Control behavior of 1D LUT composition. enum ComposeMethod { - COMPOSE_RESAMPLE_NO = 0, // Preserve original domain. - COMPOSE_RESAMPLE_BIG = 1, // Min size is 65536. - COMPOSE_RESAMPLE_HD = 2 // Half-domain. + COMPOSE_RESAMPLE_NO = 0, // Preserve original domain. + COMPOSE_RESAMPLE_BIG = 1, // Min size is 65536. + COMPOSE_RESAMPLE_HD = 2 // Half-domain. }; // Calculate a new LUT by evaluating a new domain (lut) through a set of ops (ops). @@ -73,11 +73,10 @@ class Lut1DOpData : public OpData // The ops are a set of ops to compose the LUT with. It will be finalized. static void ComposeVec(Lut1DOpDataRcPtr & lut, OpRcPtrVec & ops); - // Use functional composition to generate a single op that + // Use functional composition to generate a single op that // approximates the effect of the pair of ops. - static Lut1DOpDataRcPtr Compose(ConstLut1DOpDataRcPtr & lut1, - ConstLut1DOpDataRcPtr & lut2, - ComposeMethod compFlag); + static Lut1DOpDataRcPtr + Compose(ConstLut1DOpDataRcPtr & lut1, ConstLut1DOpDataRcPtr & lut2, ComposeMethod compFlag); // Return the size to use for an identity LUT of the specified bit-depth. static unsigned long GetLutIdealSize(BitDepth incomingBitDepth); @@ -119,13 +118,9 @@ class Lut1DOpData : public OpData // Return returns true if this LUT requires half code indices as input. static inline bool IsInputHalfDomain(HalfFlags halfFlags) noexcept { - return ((halfFlags & LUT_INPUT_HALF_CODE) == - LUT_INPUT_HALF_CODE); - } - inline bool isInputHalfDomain() const noexcept - { - return IsInputHalfDomain(m_halfFlags); + return ((halfFlags & LUT_INPUT_HALF_CODE) == LUT_INPUT_HALF_CODE); } + inline bool isInputHalfDomain() const noexcept { return IsInputHalfDomain(m_halfFlags); } // Note: this function is used by the xml reader to build the op and is // not intended for other use. @@ -135,9 +130,9 @@ class Lut1DOpData : public OpData // not intended for other use. void setOutputRawHalfs(bool isRawHalfs) noexcept; - inline bool isOutputRawHalfs() const noexcept { - return ((m_halfFlags & LUT_OUTPUT_HALF_CODE) == - LUT_OUTPUT_HALF_CODE); + inline bool isOutputRawHalfs() const noexcept + { + return ((m_halfFlags & LUT_OUTPUT_HALF_CODE) == LUT_OUTPUT_HALF_CODE); } inline HalfFlags getHalfFlags() const noexcept { return m_halfFlags; } @@ -164,12 +159,9 @@ class Lut1DOpData : public OpData bool mayCompose(ConstLut1DOpDataRcPtr & other) const; - // Return true if this Lut1DOp applies the same LUT + // Return true if this Lut1DOp applies the same LUT // to each of r, g, and b. - inline bool hasSingleLut() const - { - return (m_array.getNumColorComponents() == 1); - } + inline bool hasSingleLut() const { return (m_array.getNumColorComponents() == 1); } // Determine if the LUT has an appropriate domain to allow // lookup rather than interpolation. @@ -181,10 +173,7 @@ class Lut1DOpData : public OpData OpDataRcPtr getPairIdentityReplacement(ConstLut1DOpDataRcPtr & lut2) const; - inline const ComponentProperties & getRedProperties() const - { - return m_componentProperties[0]; - } + inline const ComponentProperties & getRedProperties() const { return m_componentProperties[0]; } inline const ComponentProperties & getGreenProperties() const { @@ -212,10 +201,11 @@ class Lut1DOpData : public OpData { public: explicit Lut3by1DArray(HalfFlags halfFlags); - Lut3by1DArray(HalfFlags halfFlags, - unsigned long numChannels, - unsigned long length, - bool filterNANs); + Lut3by1DArray( + HalfFlags halfFlags, + unsigned long numChannels, + unsigned long length, + bool filterNANs); ~Lut3by1DArray(); bool isIdentity(HalfFlags halfFlags) const; @@ -225,15 +215,15 @@ class Lut1DOpData : public OpData unsigned long getNumValues() const override; protected: - // Fill the LUT 1D with appropriate default values + // Fill the LUT 1D with appropriate default values // representing an identity LUT. void fill(HalfFlags halfFlags, bool filterNANs); public: // Default copy constructor and assignation operator are fine. - Lut3by1DArray() = default; - Lut3by1DArray(const Lut3by1DArray &) = default; - Lut3by1DArray & operator= (const Lut3by1DArray &) = default; + Lut3by1DArray() = default; + Lut3by1DArray(const Lut3by1DArray &) = default; + Lut3by1DArray & operator=(const Lut3by1DArray &) = default; }; private: @@ -249,15 +239,14 @@ class Lut1DOpData : public OpData // Get the LUT length that would allow a look-up for inputBitDepth. // - halfFlags except if the LUT has a half domain, always return 65536 - static unsigned long GetLutIdealSize(BitDepth inputBitDepth, - HalfFlags halfFlags); + static unsigned long GetLutIdealSize(BitDepth inputBitDepth, HalfFlags halfFlags); - Interpolation m_interpolation; - Lut3by1DArray m_array; - HalfFlags m_halfFlags; - Lut1DHueAdjust m_hueAdjust; + Interpolation m_interpolation; + Lut3by1DArray m_array; + HalfFlags m_halfFlags; + Lut1DHueAdjust m_hueAdjust; - TransformDirection m_direction; + TransformDirection m_direction; // Members for inverse LUT. ComponentProperties m_componentProperties[3]; diff --git a/src/OpenColorIO/ops/lut1d/Lut1DOpGPU.cpp b/src/OpenColorIO/ops/lut1d/Lut1DOpGPU.cpp index 59091817da..31ecbcf7b5 100644 --- a/src/OpenColorIO/ops/lut1d/Lut1DOpGPU.cpp +++ b/src/OpenColorIO/ops/lut1d/Lut1DOpGPU.cpp @@ -16,10 +16,11 @@ namespace OCIO_NAMESPACE namespace { -void CreatePaddedLutChannels(unsigned long width, - unsigned long height, - const std::vector & channel, - std::vector & paddedChannel) +void CreatePaddedLutChannels( + unsigned long width, + unsigned long height, + const std::vector & channel, + std::vector & paddedChannel) { // The 1D LUT always contains 3 channels. const unsigned long currWidth = (unsigned long)(channel.size() / 3); @@ -37,10 +38,11 @@ void CreatePaddedLutChannels(unsigned long width, const unsigned long step = width - 1; for (unsigned long i = 0; i < (currWidth - step); i += step) { - std::transform(&channel[3 * i], - &channel[3 * (i + step)], - std::back_inserter(paddedChannel), - [](float val) {return SanitizeFloat(val); }); + std::transform( + &channel[3 * i], + &channel[3 * (i + step)], + std::back_inserter(paddedChannel), + [](float val) { return SanitizeFloat(val); }); paddedChannel.push_back(SanitizeFloat(channel[3 * (i + step) + 0])); paddedChannel.push_back(SanitizeFloat(channel[3 * (i + step) + 1])); @@ -51,10 +53,11 @@ void CreatePaddedLutChannels(unsigned long width, // If there are still texels to fill, add them to the texture data. if (leftover > 0) { - std::transform(&channel[3 * (currWidth - leftover)], - &channel[3 * (currWidth - 1)], - std::back_inserter(paddedChannel), - [](float val) {return SanitizeFloat(val); }); + std::transform( + &channel[3 * (currWidth - leftover)], + &channel[3 * (currWidth - 1)], + std::back_inserter(paddedChannel), + [](float val) { return SanitizeFloat(val); }); paddedChannel.push_back(SanitizeFloat(channel[3 * (currWidth - 1) + 0])); paddedChannel.push_back(SanitizeFloat(channel[3 * (currWidth - 1) + 1])); @@ -81,10 +84,11 @@ void CreatePaddedLutChannels(unsigned long width, } } -void CreatePaddedRedChannel(unsigned long width, - unsigned long height, - const std::vector & channel, // Contains RGB. - std::vector & paddedChannel) // Expects Red only. +void CreatePaddedRedChannel( + unsigned long width, + unsigned long height, + const std::vector & channel, // Contains RGB. + std::vector & paddedChannel) // Expects Red only. { // The 1D LUT always contains 3 channels. const unsigned long currWidth = (unsigned long)(channel.size() / 3); @@ -140,14 +144,16 @@ void CreatePaddedRedChannel(unsigned long width, } } -} // anon. +} // namespace -void GetLut1DGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, - ConstLut1DOpDataRcPtr & lutData) +void GetLut1DGPUShaderProgram( + GpuShaderCreatorRcPtr & shaderCreator, + ConstLut1DOpDataRcPtr & lutData) { if (shaderCreator->getLanguage() == LANGUAGE_OSL_1) { - throw Exception("The Lut1DOp is not yet supported by the 'Open Shading language (OSL)' translation"); + throw Exception( + "The Lut1DOp is not yet supported by the 'Open Shading language (OSL)' translation"); } const unsigned long defaultMaxWidth = shaderCreator->getTextureMaxWidth(); @@ -157,10 +163,10 @@ void GetLut1DGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, const unsigned long height = (length / defaultMaxWidth) + 1; const unsigned long numChannels = lutData->getArray().getNumColorComponents(); - // Note: The 1D LUT needs a GPU texture for the Look-up table implementation. + // Note: The 1D LUT needs a GPU texture for the Look-up table implementation. // However, the texture type & content may vary based on the number of channels // i.e. when all channels are identical a F32 Red GPU texture is enough. - + const bool singleChannel = (numChannels == 1); // Adjust LUT texture to allow for correct 2d linear interpolation, if needed. @@ -180,9 +186,7 @@ void GetLut1DGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, // Register the RGB LUT. std::ostringstream resName; - resName << shaderCreator->getResourcePrefix() - << std::string("_") - << std::string("lut1d_") + resName << shaderCreator->getResourcePrefix() << std::string("_") << std::string("lut1d_") << shaderCreator->getNextResourceIndex(); // Note: Remove potentially problematic double underscores from GLSL resource names. @@ -199,18 +203,21 @@ void GetLut1DGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, } // (Using CacheID here to potentially allow reuse of existing textures.) - shaderCreator->addTexture(name.c_str(), - GpuShaderText::getSamplerName(name).c_str(), - width, - height, - singleChannel ? GpuShaderCreator::TEXTURE_RED_CHANNEL - : GpuShaderCreator::TEXTURE_RGB_CHANNEL, - dimensions, - lutData->getConcreteInterpolation(), - &values[0]); + shaderCreator->addTexture( + name.c_str(), + GpuShaderText::getSamplerName(name).c_str(), + width, + height, + singleChannel ? GpuShaderCreator::TEXTURE_RED_CHANNEL + : GpuShaderCreator::TEXTURE_RGB_CHANNEL, + dimensions, + lutData->getConcreteInterpolation(), + &values[0]); // Add the LUT code to the OCIO shader program. + // clang-format off + if (dimensions == GpuShaderDesc::TEXTURE_2D) { // In case the 1D LUT length exceeds the 1D texture maximum length, @@ -384,7 +391,7 @@ void GetLut1DGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, shaderCreator->addToFunctionShaderCode(ss.string().c_str()); + // clang-format on } } // namespace OCIO_NAMESPACE - diff --git a/src/OpenColorIO/ops/lut1d/Lut1DOpGPU.h b/src/OpenColorIO/ops/lut1d/Lut1DOpGPU.h index 653bfd43c9..27a74dcebd 100644 --- a/src/OpenColorIO/ops/lut1d/Lut1DOpGPU.h +++ b/src/OpenColorIO/ops/lut1d/Lut1DOpGPU.h @@ -12,11 +12,10 @@ namespace OCIO_NAMESPACE { -void GetLut1DGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, ConstLut1DOpDataRcPtr & lutData); +void GetLut1DGPUShaderProgram( + GpuShaderCreatorRcPtr & shaderCreator, + ConstLut1DOpDataRcPtr & lutData); } // namespace OCIO_NAMESPACE - #endif - - diff --git a/src/OpenColorIO/ops/lut3d/Lut3DOp.cpp b/src/OpenColorIO/ops/lut3d/Lut3DOp.cpp index 4f0de76f4d..1b49057735 100644 --- a/src/OpenColorIO/ops/lut3d/Lut3DOp.cpp +++ b/src/OpenColorIO/ops/lut3d/Lut3DOp.cpp @@ -12,11 +12,11 @@ #include "GpuShaderUtils.h" #include "HashUtils.h" #include "MathUtils.h" +#include "ops/OpTools.h" #include "ops/lut3d/Lut3DOp.h" #include "ops/lut3d/Lut3DOpCPU.h" #include "ops/lut3d/Lut3DOpGPU.h" #include "ops/matrix/MatrixOp.h" -#include "ops/OpTools.h" #include "transforms/Lut3DTransform.h" namespace OCIO_NAMESPACE @@ -24,7 +24,8 @@ namespace OCIO_NAMESPACE void GenerateIdentityLut3D(float * img, int edgeLen, int numChannels, Lut3DOrder lut3DOrder) { - if (!img) return; + if (!img) + return; if (numChannels < 3) { throw Exception("Cannot generate idenitity 3d LUT with less than 3 channels."); @@ -34,20 +35,20 @@ void GenerateIdentityLut3D(float * img, int edgeLen, int numChannels, Lut3DOrder if (lut3DOrder == LUT3DORDER_FAST_RED) { - for (int i = 0; i < edgeLen*edgeLen*edgeLen; i++) + for (int i = 0; i < edgeLen * edgeLen * edgeLen; i++) { - img[numChannels*i + 0] = (float)(i%edgeLen) * c; - img[numChannels*i + 1] = (float)((i / edgeLen) % edgeLen) * c; - img[numChannels*i + 2] = (float)((i / edgeLen / edgeLen) % edgeLen) * c; + img[numChannels * i + 0] = (float)(i % edgeLen) * c; + img[numChannels * i + 1] = (float)((i / edgeLen) % edgeLen) * c; + img[numChannels * i + 2] = (float)((i / edgeLen / edgeLen) % edgeLen) * c; } } else if (lut3DOrder == LUT3DORDER_FAST_BLUE) { - for (int i = 0; i < edgeLen*edgeLen*edgeLen; i++) + for (int i = 0; i < edgeLen * edgeLen * edgeLen; i++) { - img[numChannels*i + 0] = (float)((i / edgeLen / edgeLen) % edgeLen) * c; - img[numChannels*i + 1] = (float)((i / edgeLen) % edgeLen) * c; - img[numChannels*i + 2] = (float)(i%edgeLen) * c; + img[numChannels * i + 0] = (float)((i / edgeLen / edgeLen) % edgeLen) * c; + img[numChannels * i + 1] = (float)((i / edgeLen) % edgeLen) * c; + img[numChannels * i + 2] = (float)(i % edgeLen) * c; } } else @@ -60,7 +61,7 @@ int Get3DLutEdgeLenFromNumPixels(int numPixels) { int dim = static_cast(roundf(powf((float)numPixels, 1.0f / 3.0f))); - if (dim*dim*dim != numPixels) + if (dim * dim * dim != numPixels) { std::ostringstream os; os << "Cannot infer 3D LUT size. "; @@ -79,7 +80,7 @@ namespace class Lut3DOp : public Op { public: - Lut3DOp() = delete; + Lut3DOp() = delete; Lut3DOp(const Lut3DOp &) = delete; explicit Lut3DOp(Lut3DOpDataRcPtr & data); virtual ~Lut3DOp(); @@ -101,15 +102,9 @@ class Lut3DOp : public Op void extractGpuShaderInfo(GpuShaderCreatorRcPtr & shaderCreator) const override; protected: - ConstLut3DOpDataRcPtr lut3DData() const - { - return DynamicPtrCast(data()); - } + ConstLut3DOpDataRcPtr lut3DData() const { return DynamicPtrCast(data()); } - Lut3DOpDataRcPtr lut3DData() - { - return DynamicPtrCast(data()); - } + Lut3DOpDataRcPtr lut3DData() { return DynamicPtrCast(data()); } }; typedef OCIO_SHARED_PTR Lut3DOpRcPtr; @@ -172,10 +167,10 @@ void Lut3DOp::combineWith(OpRcPtrVec & ops, ConstOpRcPtr & secondOp) const throw Exception("Lut3DOp: canCombineWith must be checked before calling combineWith."); } ConstLut3DOpRcPtr typedRcPtr = DynamicPtrCast(secondOp); - auto secondLut = typedRcPtr->lut3DData(); - auto thisLut = lut3DData(); - auto composed = Lut3DOpData::Compose(thisLut, secondLut); - auto composedOp = std::make_shared(composed); + auto secondLut = typedRcPtr->lut3DData(); + auto thisLut = lut3DData(); + auto composed = Lut3DOpData::Compose(thisLut, secondLut); + auto composedOp = std::make_shared(composed); ops.push_back(composedOp); } @@ -218,7 +213,7 @@ void Lut3DOp::extractGpuShaderInfo(GpuShaderCreatorRcPtr & shaderCreator) const GetLut3DGPUShaderProgram(shaderCreator, lutData); } -} +} // namespace void CreateLut3DOp(OpRcPtrVec & ops, Lut3DOpDataRcPtr & lut, TransformDirection direction) { @@ -239,18 +234,16 @@ void CreateLut3DTransform(GroupTransformRcPtr & group, ConstOpRcPtr & op) { throw Exception("CreateLut3DTransform: op has to be a Lut3DOp"); } - auto lutData = DynamicPtrCast(op->data()); - auto lutTransform = Lut3DTransform::Create(); - Lut3DOpData & data = dynamic_cast(lutTransform.get())->data(); + auto lutData = DynamicPtrCast(op->data()); + auto lutTransform = Lut3DTransform::Create(); + Lut3DOpData & data = dynamic_cast(lutTransform.get())->data(); data = *lutData; group->appendTransform(lutTransform); } -void BuildLut3DOp(OpRcPtrVec & ops, - const Lut3DTransform & transform, - TransformDirection dir) +void BuildLut3DOp(OpRcPtrVec & ops, const Lut3DTransform & transform, TransformDirection dir) { const auto & data = dynamic_cast(transform).data(); data.validate(); @@ -260,4 +253,3 @@ void BuildLut3DOp(OpRcPtrVec & ops, } } // namespace OCIO_NAMESPACE - diff --git a/src/OpenColorIO/ops/lut3d/Lut3DOp.h b/src/OpenColorIO/ops/lut3d/Lut3DOp.h index 195cd86102..ce02a7e09c 100644 --- a/src/OpenColorIO/ops/lut3d/Lut3DOp.h +++ b/src/OpenColorIO/ops/lut3d/Lut3DOp.h @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_LUT3DOP_H #define INCLUDED_OCIO_LUT3DOP_H @@ -15,19 +14,18 @@ namespace OCIO_NAMESPACE // LUT entries ordered in such a way that the red coordinate changes fastest, // then the green coordinate, and finally, the blue coordinate changes slowest -inline int GetLut3DIndex_RedFast(int indexR, int indexG, int indexB, - int sizeR, int sizeG, int /*sizeB*/) +inline int +GetLut3DIndex_RedFast(int indexR, int indexG, int indexB, int sizeR, int sizeG, int /*sizeB*/) { return 3 * (indexR + sizeR * (indexG + sizeG * indexB)); } - // RGB channel ordering. // LUT entries ordered in such a way that the blue coordinate changes fastest, // then the green coordinate, and finally, the red coordinate changes slowest -inline int GetLut3DIndex_BlueFast(int indexR, int indexG, int indexB, - int /*sizeR*/, int sizeG, int sizeB) +inline int +GetLut3DIndex_BlueFast(int indexR, int indexG, int indexB, int /*sizeR*/, int sizeG, int sizeB) { return 3 * (indexB + sizeB * (indexG + sizeG * indexR)); } @@ -43,16 +41,13 @@ enum Lut3DOrder LUT3DORDER_FAST_BLUE }; -void GenerateIdentityLut3D(float* img, int edgeLen, int numChannels, - Lut3DOrder lut3DOrder); +void GenerateIdentityLut3D(float * img, int edgeLen, int numChannels, Lut3DOrder lut3DOrder); // Essentially the cube root, but will throw an exception if the // cube root is not exact. int Get3DLutEdgeLenFromNumPixels(int numPixels); -void CreateLut3DOp(OpRcPtrVec & ops, - Lut3DOpDataRcPtr & lut, - TransformDirection direction); +void CreateLut3DOp(OpRcPtrVec & ops, Lut3DOpDataRcPtr & lut, TransformDirection direction); // Create a Lut3DTransform decoupled from op and append it to the GroupTransform. void CreateLut3DTransform(GroupTransformRcPtr & group, ConstOpRcPtr & op); diff --git a/src/OpenColorIO/ops/lut3d/Lut3DOpCPU.cpp b/src/OpenColorIO/ops/lut3d/Lut3DOpCPU.cpp index d7ea8483a0..aab3881ddb 100644 --- a/src/OpenColorIO/ops/lut3d/Lut3DOpCPU.cpp +++ b/src/OpenColorIO/ops/lut3d/Lut3DOpCPU.cpp @@ -9,23 +9,28 @@ #include #include "BitDepthUtils.h" -#include "MathUtils.h" -#include "ops/lut3d/Lut3DOpCPU.h" -#include "ops/OpTools.h" -#include "Platform.h" -#include "SSE.h" #include "CPUInfo.h" -#include "Lut3DOpCPU_SSE2.h" #include "Lut3DOpCPU_AVX.h" #include "Lut3DOpCPU_AVX2.h" #include "Lut3DOpCPU_AVX512.h" +#include "Lut3DOpCPU_SSE2.h" +#include "MathUtils.h" +#include "Platform.h" +#include "SSE.h" +#include "ops/OpTools.h" +#include "ops/lut3d/Lut3DOpCPU.h" namespace OCIO_NAMESPACE { namespace { -typedef void (apply_lut_func)(const float *lut3d, int dim, const float *src, float *dst, int total_pixel_count); +typedef void(apply_lut_func)( + const float * lut3d, + int dim, + const float * src, + float * dst, + int total_pixel_count); class BaseLut3DRenderer : public OpCPU { @@ -38,22 +43,22 @@ class BaseLut3DRenderer : public OpCPU // Creates a LUT aligned to a 16 byte boundary with RGB and 0 for alpha // in order to be able to load the LUT using _mm_load_ps. - float* createOptLut(const Array::Values& lut) const; + float * createOptLut(const Array::Values & lut) const; protected: // Keep all these values because they are invariant during the // processing. So to slim the processing code, these variables // are computed in the constructor. - float* m_optLut; - unsigned long m_dim; - float m_step; - int m_components; - apply_lut_func *m_applyLutFunc; + float * m_optLut; + unsigned long m_dim; + float m_step; + int m_components; + apply_lut_func * m_applyLutFunc; private: - BaseLut3DRenderer() = delete; - BaseLut3DRenderer(const BaseLut3DRenderer&) = delete; - BaseLut3DRenderer& operator=(const BaseLut3DRenderer&) = delete; + BaseLut3DRenderer() = delete; + BaseLut3DRenderer(const BaseLut3DRenderer &) = delete; + BaseLut3DRenderer & operator=(const BaseLut3DRenderer &) = delete; }; class Lut3DTetrahedralRenderer : public BaseLut3DRenderer @@ -72,7 +77,6 @@ class Lut3DRenderer : public BaseLut3DRenderer virtual ~Lut3DRenderer(); void apply(const void * inImg, void * outImg, long numPixels) const; - }; class InvLut3DRenderer : public OpCPU @@ -81,16 +85,17 @@ class InvLut3DRenderer : public OpCPU // A level of the RangeTree. struct treeLevel { - unsigned long elems; // number of elements on this level - unsigned long chans; // in/out channels of the LUT - std::vector minVals; // min LUT value for the sub-tree - std::vector maxVals; // max LUT value for the sub-tree - ulongVector child0offsets; // offsets to the first children - ulongVector numChildren; // number of children in the subtree + unsigned long elems; // number of elements on this level + unsigned long chans; // in/out channels of the LUT + std::vector minVals; // min LUT value for the sub-tree + std::vector maxVals; // max LUT value for the sub-tree + ulongVector child0offsets; // offsets to the first children + ulongVector numChildren; // number of children in the subtree treeLevel() { - elems = 0; chans = 0; + elems = 0; + chans = 0; } }; typedef std::vector TreeLevels; @@ -98,14 +103,12 @@ class InvLut3DRenderer : public OpCPU // Structure that identifies the base grid for a position in the LUT. struct baseInd { - unsigned long inds[3] = { 0, 0, 0 }; // indices into the LUT - unsigned long hash = 0; // hash for this location + unsigned long inds[3] = {0, 0, 0}; // indices into the LUT + unsigned long hash = 0; // hash for this location - bool operator<(const baseInd& val) const { return hash < val.hash; } + bool operator<(const baseInd & val) const { return hash < val.hash; } - baseInd() - { - } + baseInd() {} }; typedef std::vector BaseIndsVec; @@ -123,7 +126,7 @@ class InvLut3DRenderer : public OpCPU // Populate the tree using the LUT values. // - gridVector Pointer to the vectorized 3d-LUT values. // - gridSize The dimension of each side of the 3d-LUT. - void initialize(float *gridVector, unsigned long gridSize); + void initialize(float * gridVector, unsigned long gridSize); virtual ~RangeTree(); @@ -131,16 +134,16 @@ class InvLut3DRenderer : public OpCPU inline unsigned long getChans() const { return m_chans; } // Get the length of each side of the LUT captured by the tree. - inline const unsigned long* getGridSize() const { return m_gsz; } + inline const unsigned long * getGridSize() const { return m_gsz; } // Get the depth (number of levels) in the tree. inline unsigned long getDepth() const { return m_depth; } // Get the tree levels data structure. - inline const TreeLevels& getLevels() const { return m_levels; } + inline const TreeLevels & getLevels() const { return m_levels; } // Get the offsets to the base of the vectors. - inline const BaseIndsVec& getBaseInds() const { return m_baseInds; } + inline const BaseIndsVec & getBaseInds() const { return m_baseInds; } // Debugging method to print tree properties. // void print() const; @@ -150,25 +153,23 @@ class InvLut3DRenderer : public OpCPU void initInds(); // Initialize the tree with the min and max values for each LUT cube. - void initRanges(float *grvec); + void initRanges(float * grvec); void indsToHash(const unsigned long i); - void updateChildren(const ulongVector &hashes, - const unsigned long level); + void updateChildren(const ulongVector & hashes, const unsigned long level); void updateRanges(const unsigned long level); - unsigned long m_chans = 0; // in/out channels of the LUT - unsigned long m_gsz[4] = {0,0,0,0}; // grid size of the LUT - unsigned long m_depth = 0; // depth of the tree - TreeLevels m_levels; // tree level structure - BaseIndsVec m_baseInds; // indices for LUT base grid points - ulongVector m_levelScales; // scaling of the tree levels + unsigned long m_chans = 0; // in/out channels of the LUT + unsigned long m_gsz[4] = {0, 0, 0, 0}; // grid size of the LUT + unsigned long m_depth = 0; // depth of the tree + TreeLevels m_levels; // tree level structure + BaseIndsVec m_baseInds; // indices for LUT base grid points + ulongVector m_levelScales; // scaling of the tree levels }; public: - explicit InvLut3DRenderer(ConstLut3DOpDataRcPtr & lut); virtual ~InvLut3DRenderer(); @@ -180,20 +181,19 @@ class InvLut3DRenderer : public OpCPU void extrapolate3DArray(ConstLut3DOpDataRcPtr & lut); protected: - float m_scale; // output scaling for r, g and b - // components - long m_dim; // grid size of the extrapolated 3d-LUT - RangeTree m_tree; // object to allow fast range queries of - // the LUT - std::vector m_grvec; // extrapolated 3d-LUT values + float m_scale; // output scaling for r, g and b + // components + long m_dim; // grid size of the extrapolated 3d-LUT + RangeTree m_tree; // object to allow fast range queries of + // the LUT + std::vector m_grvec; // extrapolated 3d-LUT values private: - InvLut3DRenderer() = delete; - InvLut3DRenderer(const InvLut3DRenderer&) = delete; - InvLut3DRenderer& operator=(const InvLut3DRenderer&) = delete; + InvLut3DRenderer() = delete; + InvLut3DRenderer(const InvLut3DRenderer &) = delete; + InvLut3DRenderer & operator=(const InvLut3DRenderer &) = delete; }; - #if OCIO_USE_SSE2 //---------------------------------------------------------------------------- @@ -201,13 +201,16 @@ class InvLut3DRenderer : public OpCPU // Pixels ordered in such a way that the blue coordinate changes fastest, // then the green coordinate, and finally, the red coordinate changes slowest // -inline __m128i GetLut3DIndices(const __m128i &idxR, - const __m128i &idxG, - const __m128i &idxB, - const __m128i /*&sizesR*/, - const __m128i &sizesG, - const __m128i &sizesB) +inline __m128i GetLut3DIndices( + const __m128i & idxR, + const __m128i & idxG, + const __m128i & idxB, + const __m128i /*&sizesR*/, + const __m128i & sizesG, + const __m128i & sizesB) { + // clang-format off + // SSE2 doesn't have 4-way multiplication for integer registers, so we need // split them into two register and multiply-add them separately, and then // combine the results. @@ -244,18 +247,21 @@ inline __m128i GetLut3DIndices(const __m128i &idxR, // 4 * (idxB2 + sizesB * (idxG2 + sizesG * idxR2)), // 4 * (idxB3 + sizesB * (idxG3 + sizesG * idxR3)) } return _mm_slli_epi32(r, 2); + + // clang-format on } -inline void LookupNearest4(float* optLut, - const __m128i &rIndices, - const __m128i &gIndices, - const __m128i &bIndices, - const __m128i &dim, - __m128 res[4]) +inline void LookupNearest4( + float * optLut, + const __m128i & rIndices, + const __m128i & gIndices, + const __m128i & bIndices, + const __m128i & dim, + __m128 res[4]) { __m128i offsets = GetLut3DIndices(rIndices, gIndices, bIndices, dim, dim, dim); - int* offsetInt = (int*)&offsets; + int * offsetInt = (int *)&offsets; res[0] = _mm_load_ps(optLut + offsetInt[0]); res[1] = _mm_load_ps(optLut + offsetInt[1]); @@ -266,7 +272,7 @@ inline void LookupNearest4(float* optLut, #else // Linear -inline void lerp_rgb(float* out, float* a, float* b, float* z) +inline void lerp_rgb(float * out, float * a, float * b, float * z) { out[0] = (b[0] - a[0]) * z[0] + a[0]; out[1] = (b[1] - a[1]) * z[1] + a[1]; @@ -274,8 +280,7 @@ inline void lerp_rgb(float* out, float* a, float* b, float* z) } // Bilinear -inline void lerp_rgb(float* out, float* a, float* b, float* c, - float* d, float* y, float* z) +inline void lerp_rgb(float * out, float * a, float * b, float * c, float * d, float * y, float * z) { float v1[3]; float v2[3]; @@ -286,20 +291,30 @@ inline void lerp_rgb(float* out, float* a, float* b, float* c, } // Trilinear -inline void lerp_rgb(float* out, float* a, float* b, float* c, float* d, - float* e, float* f, float* g, float* h, - float* x, float* y, float* z) +inline void lerp_rgb( + float * out, + float * a, + float * b, + float * c, + float * d, + float * e, + float * f, + float * g, + float * h, + float * x, + float * y, + float * z) { float v1[3]; float v2[3]; - lerp_rgb(v1, a,b,c,d,y,z); - lerp_rgb(v2, e,f,g,h,y,z); + lerp_rgb(v1, a, b, c, d, y, z); + lerp_rgb(v2, e, f, g, h, y, z); lerp_rgb(out, v1, v2, x); } #endif -inline int GetLut3DIndexBlueFast(int indexR, int indexG, int indexB, long dim, int components=3) +inline int GetLut3DIndexBlueFast(int indexR, int indexG, int indexB, long dim, int components = 3) { return components * (indexB + (int)dim * (indexG + (int)dim * indexR)); } @@ -343,15 +358,15 @@ void BaseLut3DRenderer::updateData(ConstLut3DOpDataRcPtr & lut) #if OCIO_USE_SSE2 // Creates a LUT aligned to a 16 byte boundary with RGB and 0 for alpha // in order to be able to load the LUT using _mm_load_ps. -float* BaseLut3DRenderer::createOptLut(const Array::Values& lut) const +float * BaseLut3DRenderer::createOptLut(const Array::Values & lut) const { const long maxEntries = m_dim * m_dim * m_dim; - float *optLut = - (float*)Platform::AlignedMalloc(maxEntries * m_components * sizeof(float), 16); + float * optLut + = (float *)Platform::AlignedMalloc(maxEntries * m_components * sizeof(float), 16); - float* currentValue = optLut; - for (long idx = 0; idx 1) { @@ -621,6 +637,8 @@ void Lut3DTetrahedralRenderer::apply(const void * inImg, void * outImg, long num out += 4; } } + + // clang-format on } Lut3DRenderer::Lut3DRenderer(ConstLut3DOpDataRcPtr & lut) @@ -635,16 +653,18 @@ Lut3DRenderer::~Lut3DRenderer() void Lut3DRenderer::apply(const void * inImg, void * outImg, long numPixels) const { const float * in = (const float *)inImg; - float * out = (float *)outImg; + float * out = (float *)outImg; #if OCIO_USE_SSE2 - __m128 step = _mm_set1_ps(m_step); + __m128 step = _mm_set1_ps(m_step); __m128 maxIdx = _mm_set1_ps((float)(m_dim - 1)); - __m128i dim = _mm_set1_epi32(m_dim); + __m128i dim = _mm_set1_epi32(m_dim); __m128 v[8]; + // clang-format off + for (long i = 0; i < numPixels; ++i) { float newAlpha = (float)in[3]; @@ -816,6 +836,9 @@ void Lut3DRenderer::apply(const void * inImg, void * outImg, long numPixels) con in += 4; out += 4; } + + // clang-format on + #endif } @@ -834,27 +857,25 @@ void Lut3DRenderer::apply(const void * inImg, void * outImg, long numPixels) con // This function tests a given grid of the LUT to see if it contains the inverse. // A customized matrix factorization updating technique is used to compute this // as efficiently as possible. -unsigned long invert_hypercube -( - unsigned long n, - float* x_out, - const float* gr, - unsigned long* ind2off, - float* val, - unsigned long* guess, - unsigned long list_len, - long* ops_list, - unsigned long* entering_list, - unsigned long* new_vert_list, - unsigned long* path_list, - unsigned long* path_order -) +unsigned long invert_hypercube( + unsigned long n, + float * x_out, + const float * gr, + unsigned long * ind2off, + float * val, + unsigned long * guess, + unsigned long list_len, + long * ops_list, + unsigned long * entering_list, + unsigned long * new_vert_list, + unsigned long * path_list, + unsigned long * path_order) { // Singularity tolerance const double ZERO_TOL = 1.0e-9; // Feasibility tolerances const double NEGZERO_TOL = -1.0e-9; - const double ONE_TOL = 1.0 + 1.0e-9; + const double ONE_TOL = 1.0 + 1.0e-9; unsigned long row_perm[MAX_N], col_perm[MAX_N]; unsigned long sweep_to[MAX_SWEEPS], sweep_from[MAX_SWEEPS]; @@ -862,8 +883,8 @@ unsigned long invert_hypercube double b[MAX_N], x2[MAX_N]; double new_vert[MAX_N]; - long backsub = 0; - unsigned long infeas = 0; + long backsub = 0; + unsigned long infeas = 0; const unsigned long nm1 = n - 1; const unsigned long nm2 = n - 2; unsigned long numsweeps = 0; @@ -876,10 +897,11 @@ unsigned long invert_hypercube for (unsigned long i = 0; i < n; i++) { - row_perm[i] = i; col_perm[i] = i; + row_perm[i] = i; + col_perm[i] = i; base_vert[i] = gr[base_ind + i]; - b[i] = val[i] - base_vert[i]; - y[i] = b[i]; + b[i] = val[i] - base_vert[i]; + y[i] = b[i]; for (unsigned long j = 0; j < n; j++) { U[i][j] = (i == j) ? 1.0 : 0.0; @@ -891,10 +913,13 @@ unsigned long invert_hypercube backsub = ops_list[i]; if (backsub < 0) { - numsweeps = 0; backsub = 0; + numsweeps = 0; + backsub = 0; for (unsigned long j = 0; j < n; j++) { - y[j] = b[j]; row_perm[j] = j; col_perm[j] = j; + y[j] = b[j]; + row_perm[j] = j; + col_perm[j] = j; for (unsigned long k = 0; k < n; k++) { U[j][k] = (j == k) ? 1.0 : 0.0; @@ -906,7 +931,7 @@ unsigned long invert_hypercube for (unsigned long j = 0; j < n; j++) { const unsigned long tmp_ind = base_ind + n * new_vert_list[i]; - new_vert[j] = gr[tmp_ind + j] - base_vert[j]; + new_vert[j] = gr[tmp_ind + j] - base_vert[j]; } for (unsigned long j = 0; j < numsweeps; j++) @@ -938,15 +963,16 @@ unsigned long invert_hypercube for (unsigned long j = leaving_nz - 1; j < nm1; j++) { const unsigned long jp1 = j + 1; - unsigned long piv = j; - unsigned long col_piv = j; - double abs_d = fabs(U[row_perm[j]][col_perm[j]]); + unsigned long piv = j; + unsigned long col_piv = j; + double abs_d = fabs(U[row_perm[j]][col_perm[j]]); for (unsigned long k = jp1; k < n; k++) { const double abs_n = fabs(U[row_perm[k]][col_perm[j]]); if (abs_n > abs_d) { - abs_d = abs_n; piv = k; + abs_d = abs_n; + piv = k; } } @@ -958,23 +984,26 @@ unsigned long invert_hypercube for (unsigned long k = j; k < n; k++) { const double abs_n = fabs(U[row_perm[k]][col_perm[h]]); - if (abs_n > abs_d) { - abs_d = abs_n; piv = k; col_piv = h; + if (abs_n > abs_d) + { + abs_d = abs_n; + piv = k; + col_piv = h; } } if (abs_d > ZERO_TOL) { const unsigned long tmp_ind = col_perm[j]; - col_perm[j] = col_perm[col_piv]; - col_perm[col_piv] = tmp_ind; + col_perm[j] = col_perm[col_piv]; + col_perm[col_piv] = tmp_ind; } } } if (piv != j) { const unsigned long tmp_ind = row_perm[j]; - row_perm[j] = row_perm[piv]; - row_perm[piv] = tmp_ind; + row_perm[j] = row_perm[piv]; + row_perm[piv] = tmp_ind; } const double denom = U[row_perm[j]][col_perm[j]]; @@ -983,16 +1012,16 @@ unsigned long invert_hypercube double num = U[row_perm[h]][col_perm[j]]; if (fabs(num) >= ZERO_TOL) { - double f = num / denom; + double f = num / denom; U[row_perm[h]][col_perm[j]] = 0.0; for (unsigned long k = jp1; k < n; k++) { U[row_perm[h]][col_perm[k]] -= f * U[row_perm[j]][col_perm[k]]; } y[row_perm[h]] -= f * y[row_perm[j]]; - sweep_to[numsweeps] = row_perm[h]; + sweep_to[numsweeps] = row_perm[h]; sweep_from[numsweeps] = row_perm[j]; - sweep_f[numsweeps] = f; + sweep_f[numsweeps] = f; numsweeps += 1; } } @@ -1013,7 +1042,7 @@ unsigned long invert_hypercube } else { - x[js] = 0.0; + x[js] = 0.0; infeas = 0; } } @@ -1049,12 +1078,13 @@ unsigned long invert_hypercube x2[col_perm[j]] = x[j]; } - unsigned long tmp_ind = i * n + n - 1; + unsigned long tmp_ind = i * n + n - 1; x_out[path_list[tmp_ind]] = float(x2[path_order[0]]); tmp_ind--; for (unsigned long j = 1; j < n; j++) { - x_out[path_list[tmp_ind]] = float(x2[path_order[j]] + x_out[path_list[tmp_ind + 1]]); + x_out[path_list[tmp_ind]] + = float(x2[path_order[j]] + x_out[path_list[tmp_ind + 1]]); tmp_ind--; } @@ -1085,10 +1115,10 @@ InvLut3DRenderer::RangeTree::~RangeTree() { } -void InvLut3DRenderer::RangeTree::initRanges(float *grvec) +void InvLut3DRenderer::RangeTree::initRanges(float * grvec) { const unsigned long depthm1 = m_depth - 1; - const unsigned long N = m_levels[depthm1].elems; + const unsigned long N = m_levels[depthm1].elems; m_levels[depthm1].minVals.resize(N * m_chans); m_levels[depthm1].maxVals.resize(N * m_chans); // Our 3d-LUTs are stored with the blue chan varying most rapidly. @@ -1097,6 +1127,8 @@ void InvLut3DRenderer::RangeTree::initRanges(float *grvec) unsigned long cornerOffsets[8]; unsigned long corners = 0; + // clang-format off + if (m_chans == 3) { corners = 8; @@ -1122,12 +1154,15 @@ void InvLut3DRenderer::RangeTree::initRanges(float *grvec) throw Exception("Unsupported channel number."); } - float minVal[MAX_N] = { 0.0f, 0.0f, 0.0f, 0.0f }; - float maxVal[MAX_N] = { 0.0f, 0.0f, 0.0f, 0.0f }; + // clang-format on + + float minVal[MAX_N] = {0.0f, 0.0f, 0.0f, 0.0f}; + float maxVal[MAX_N] = {0.0f, 0.0f, 0.0f, 0.0f}; for (unsigned long i = 0; i < N; i++) { - const unsigned long baseOffset = m_baseInds[i].inds[0] * ind0scale + - m_baseInds[i].inds[1] * ind1scale + m_baseInds[i].inds[2]; + const unsigned long baseOffset = m_baseInds[i].inds[0] * ind0scale + + m_baseInds[i].inds[1] * ind1scale + + m_baseInds[i].inds[2]; for (unsigned long k = 0; k < m_chans; k++) { @@ -1203,7 +1238,7 @@ void InvLut3DRenderer::RangeTree::initInds() void InvLut3DRenderer::RangeTree::indsToHash(const unsigned long i) { - const unsigned long pows2[4] = { 1, 2, 4, 8 }; + const unsigned long pows2[4] = {1, 2, 4, 8}; unsigned long keyBits[16]; const unsigned long depthm1 = m_depth - 1; @@ -1225,20 +1260,19 @@ void InvLut3DRenderer::RangeTree::indsToHash(const unsigned long i) } void InvLut3DRenderer::RangeTree::updateChildren( - const ulongVector &hashes, - const unsigned long level -) + const ulongVector & hashes, + const unsigned long level) { const unsigned long levelSize = m_levels[level].elems; m_levels[level].child0offsets.resize(levelSize); m_levels[level].numChildren.resize(levelSize); const unsigned long maxChildren = 1 << m_chans; - const unsigned long gap = m_levelScales[level + 1] * maxChildren; - unsigned long cnt = 1; + const unsigned long gap = m_levelScales[level + 1] * maxChildren; + unsigned long cnt = 1; m_levels[level].child0offsets[0] = 0; - const unsigned long prevSize = static_cast(hashes.size()); + const unsigned long prevSize = static_cast(hashes.size()); for (unsigned long i = 1; i < prevSize; i++) { if (hashes[i] - hashes[i - 1] > gap) @@ -1250,8 +1284,8 @@ void InvLut3DRenderer::RangeTree::updateChildren( for (unsigned long i = 0; i < levelSize - 1; i++) { - m_levels[level].numChildren[i] = m_levels[level].child0offsets[i + 1] - - m_levels[level].child0offsets[i]; + m_levels[level].numChildren[i] + = m_levels[level].child0offsets[i + 1] - m_levels[level].child0offsets[i]; } const unsigned long tmp = static_cast(hashes.size() - m_levels[level].child0offsets[levelSize - 1]); @@ -1261,7 +1295,7 @@ void InvLut3DRenderer::RangeTree::updateChildren( void InvLut3DRenderer::RangeTree::updateRanges(const unsigned long level) { const unsigned long maxChildren = 1 << m_chans; - const unsigned long levelSize = m_levels[level].elems; + const unsigned long levelSize = m_levels[level].elems; m_levels[level].minVals.resize(levelSize * m_chans); m_levels[level].maxVals.resize(levelSize * m_chans); @@ -1271,10 +1305,10 @@ void InvLut3DRenderer::RangeTree::updateRanges(const unsigned long level) const unsigned long index = m_levels[level].child0offsets[i]; for (unsigned long k = 0; k < m_chans; k++) { - m_levels[level].minVals[i * m_chans + k] = - m_levels[level + 1].minVals[index * m_chans + k]; - m_levels[level].maxVals[i * m_chans + k] = - m_levels[level + 1].maxVals[index * m_chans + k]; + m_levels[level].minVals[i * m_chans + k] + = m_levels[level + 1].minVals[index * m_chans + k]; + m_levels[level].maxVals[i * m_chans + k] + = m_levels[level + 1].maxVals[index * m_chans + k]; } // New min/max combine the min/max for all children from next lower level. @@ -1285,13 +1319,13 @@ void InvLut3DRenderer::RangeTree::updateRanges(const unsigned long level) const unsigned long ind = index + j - 1; for (unsigned long k = 0; k < m_chans; k++) { - const float minVal = m_levels[level].minVals[i * m_chans + k]; + const float minVal = m_levels[level].minVals[i * m_chans + k]; const float childMinVal = m_levels[level + 1].minVals[ind * m_chans + k]; if (childMinVal < minVal) { m_levels[level].minVals[i * m_chans + k] = childMinVal; } - const float maxVal = m_levels[level].maxVals[i * m_chans + k]; + const float maxVal = m_levels[level].maxVals[i * m_chans + k]; const float childMaxVal = m_levels[level + 1].maxVals[ind * m_chans + k]; if (childMaxVal > maxVal) { @@ -1303,15 +1337,15 @@ void InvLut3DRenderer::RangeTree::updateRanges(const unsigned long level) } } -void InvLut3DRenderer::RangeTree::initialize(float *grvec, unsigned long gsz) +void InvLut3DRenderer::RangeTree::initialize(float * grvec, unsigned long gsz) { - m_chans = 3; // only supporting Lut3D for now + m_chans = 3; // only supporting Lut3D for now m_gsz[0] = m_gsz[1] = m_gsz[2] = gsz; - m_gsz[3] = 0; + m_gsz[3] = 0; // Determine depth of tree. float maxGsz = 0.f; - for (unsigned long i = 0; igetArray().getLength() + 2; // extrapolation adds 2 + m_dim = lut->getArray().getLength() + 2; // extrapolation adds 2 m_tree.initialize(m_grvec.data(), m_dim); - //m_tree.print(); + // m_tree.print(); // Converts from index units to inDepth units of the original LUT. // (Note that inDepth of the original LUT is outDepth of the inverse LUT.) @@ -1460,20 +1495,20 @@ void InvLut3DRenderer::updateData(ConstLut3DOpDataRcPtr & lut) void InvLut3DRenderer::extrapolate3DArray(ConstLut3DOpDataRcPtr & lut) { - const unsigned long dim = lut->getArray().getLength(); + const unsigned long dim = lut->getArray().getLength(); const unsigned long newDim = dim + 2; - const Lut3DOpData::Lut3DArray& array = - static_cast(lut->getArray()); + const Lut3DOpData::Lut3DArray & array + = static_cast(lut->getArray()); Lut3DOpData::Lut3DArray newArray(newDim); // Copy center values. - for (unsigned long idx = 0; idx= 0) { while (currentChild[level] < currentNumChildren[level]) { + // clang-format off const unsigned long node = currentChildInd[level]; const bool inRange = R >= levels[level].minVals[node * chans] && @@ -1687,7 +1729,7 @@ void InvLut3DRenderer::apply(const void * inImg, void * outImg, long numPixels) B <= levels[level].maxVals[node * chans + 2]; currentChild[level]++; currentChildInd[level]++; - + // clang-format on if (inRange) { if (level == depthm1) @@ -1695,27 +1737,37 @@ void InvLut3DRenderer::apply(const void * inImg, void * outImg, long numPixels) for (unsigned long k = 0; k < chans; k++) baseIndx[k] = baseInds[node].inds[k]; - float fxval[3] = { R, G, B }; - - const bool valid = (invert_hypercube(3, result, m_grvec.data(), - offs, fxval, baseIndx, - list_len, ops_list, - entering_list, new_vert_list, - path_list, path_order) != 0); + float fxval[3] = {R, G, B}; + + const bool valid + = (invert_hypercube( + 3, + result, + m_grvec.data(), + offs, + fxval, + baseIndx, + list_len, + ops_list, + entering_list, + new_vert_list, + path_list, + path_order) + != 0); if (valid) { - level = 0; // to exit outer loop + level = 0; // to exit outer loop break; } } else { - const int newLevel = level + 1; + const int newLevel = level + 1; currentNumChildren[newLevel] = levels[level].numChildren[node]; - currentChildInd[newLevel] = levels[level].child0offsets[node]; - level = newLevel; - currentChild[level] = 0; + currentChildInd[newLevel] = levels[level].child0offsets[node]; + level = newLevel; + currentChild[level] = 0; } } } @@ -1728,7 +1780,7 @@ void InvLut3DRenderer::apply(const void * inImg, void * outImg, long numPixels) out[3] = in[3]; } - in += 4; + in += 4; out += 4; } } @@ -1746,18 +1798,18 @@ ConstOpCPURcPtr GetForwardLut3DRenderer(ConstLut3DOpDataRcPtr & lut) } } -} // anonymous namspace +} // namespace ConstOpCPURcPtr GetLut3DRenderer(ConstLut3DOpDataRcPtr & lut) { switch (lut->getDirection()) { - case TRANSFORM_DIR_FORWARD: - return GetForwardLut3DRenderer(lut); - break; - case TRANSFORM_DIR_INVERSE: - return std::make_shared(lut); - break; + case TRANSFORM_DIR_FORWARD: + return GetForwardLut3DRenderer(lut); + break; + case TRANSFORM_DIR_INVERSE: + return std::make_shared(lut); + break; } throw Exception("Illegal LUT3D direction."); } diff --git a/src/OpenColorIO/ops/lut3d/Lut3DOpCPU_AVX.cpp b/src/OpenColorIO/ops/lut3d/Lut3DOpCPU_AVX.cpp index 8bb7784f25..d51ce4bafd 100644 --- a/src/OpenColorIO/ops/lut3d/Lut3DOpCPU_AVX.cpp +++ b/src/OpenColorIO/ops/lut3d/Lut3DOpCPU_AVX.cpp @@ -10,16 +10,19 @@ namespace OCIO_NAMESPACE { -namespace { +namespace +{ -struct Lut3DContextAVX { - const float *lut; +struct Lut3DContextAVX +{ + const float * lut; __m256 lutmax; __m256 lutsize; __m256 lutsize2; }; -struct rgbavec_avx { +struct rgbavec_avx +{ __m256 r, g, b, a; }; @@ -34,28 +37,28 @@ static inline __m256 movehl_ps_avx(__m256 a, __m256 b) return _mm256_castpd_ps(_mm256_unpackhi_pd(_mm256_castps_pd(b), _mm256_castps_pd(a))); } -static inline __m256 load2_m128_avx(const float *hi, const float *low) +static inline __m256 load2_m128_avx(const float * hi, const float * low) { return _mm256_insertf128_ps(_mm256_castps128_ps256(_mm_loadu_ps(low)), _mm_loadu_ps(hi), 1); } -#define gather_rgb_avx(src, idx) \ - _mm256_store_si256((__m256i *)indices, idx); \ - row0 = load2_m128_avx(src + indices[4], src + indices[0]); \ - row1 = load2_m128_avx(src + indices[5], src + indices[1]); \ - row2 = load2_m128_avx(src + indices[6], src + indices[2]); \ - row3 = load2_m128_avx(src + indices[7], src + indices[3]); \ - tmp0 = _mm256_unpacklo_ps(row0, row1); \ - tmp2 = _mm256_unpacklo_ps(row2, row3); \ - tmp1 = _mm256_unpackhi_ps(row0, row1); \ - tmp3 = _mm256_unpackhi_ps(row2, row3); \ - sample_r = movelh_ps_avx(tmp0, tmp2); \ - sample_g = movehl_ps_avx(tmp2, tmp0); \ +#define gather_rgb_avx(src, idx) \ + _mm256_store_si256((__m256i *)indices, idx); \ + row0 = load2_m128_avx(src + indices[4], src + indices[0]); \ + row1 = load2_m128_avx(src + indices[5], src + indices[1]); \ + row2 = load2_m128_avx(src + indices[6], src + indices[2]); \ + row3 = load2_m128_avx(src + indices[7], src + indices[3]); \ + tmp0 = _mm256_unpacklo_ps(row0, row1); \ + tmp2 = _mm256_unpacklo_ps(row2, row3); \ + tmp1 = _mm256_unpackhi_ps(row0, row1); \ + tmp3 = _mm256_unpackhi_ps(row2, row3); \ + sample_r = movelh_ps_avx(tmp0, tmp2); \ + sample_g = movehl_ps_avx(tmp2, tmp0); \ sample_b = movelh_ps_avx(tmp1, tmp3) static inline __m256 fmadd_ps_avx(__m256 a, __m256 b, __m256 c) { - return _mm256_add_ps(_mm256_mul_ps(a, b), c); + return _mm256_add_ps(_mm256_mul_ps(a, b), c); } static inline __m256 blendv_avx(__m256 a, __m256 b, __m256 mask) @@ -65,14 +68,15 @@ static inline __m256 blendv_avx(__m256 a, __m256 b, __m256 mask) https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106704 */ #if defined __GNUC__ && __GNUC__ >= 12 && __GNUC_MINOR__ < 3 __m256 result; - __asm__ volatile("vblendvps %3, %2, %1, %0" : "=x" (result) : "x" (a), "x" (b),"x" (mask):); + __asm__ volatile("vblendvps %3, %2, %1, %0" : "=x"(result) : "x"(a), "x"(b), "x"(mask) :); return result; #else return _mm256_blendv_ps(a, b, mask); #endif } -static inline rgbavec_avx interp_tetrahedral_avx(const Lut3DContextAVX &ctx, __m256 r, __m256 g, __m256 b, __m256 a) +static inline rgbavec_avx +interp_tetrahedral_avx(const Lut3DContextAVX & ctx, __m256 r, __m256 g, __m256 b, __m256 a) { AVX_ALIGN(uint32_t indices[8]); @@ -91,8 +95,8 @@ static inline rgbavec_avx interp_tetrahedral_avx(const Lut3DContextAVX &ctx, __m __m256 lutsize = ctx.lutsize; __m256 lutsize2 = ctx.lutsize2; - __m256 one_f = _mm256_set1_ps(1.0f); - __m256 four_f = _mm256_set1_ps(4.0f); + __m256 one_f = _mm256_set1_ps(1.0f); + __m256 four_f = _mm256_set1_ps(4.0f); __m256 prev_r = _mm256_floor_ps(r); __m256 prev_g = _mm256_floor_ps(g); @@ -120,9 +124,9 @@ static inline rgbavec_avx interp_tetrahedral_avx(const Lut3DContextAVX &ctx, __m // This is the tetrahedral blend equation // red = (1-x0) * c000.r + (x0-x1) * cxxxa.r + (x1-x2) * cxxxb.r + x2 * c111.r; // The x values are the rgb delta values sorted, x0 >= x1 >= x2 - // c### are samples from the lut, which are indices made with prev_(r,g,b) and next_(r,g,b) values - // 0 = use prev, 1 = use next - // c### = (prev_r or next_r) * (lutsize * lutsize) + (prev_g or next_g) * lutsize + (prev_b or next_b) + // c### are samples from the lut, which are indices made with prev_(r,g,b) and next_(r,g,b) + // values 0 = use prev, 1 = use next c### = (prev_r or next_r) * (lutsize * lutsize) + (prev_g + // or next_g) * lutsize + (prev_b or next_b) // cxxxa // always uses 1 next and 2 prev and next is largest delta @@ -143,27 +147,27 @@ static inline rgbavec_avx interp_tetrahedral_avx(const Lut3DContextAVX &ctx, __m __m256 gt_b = _mm256_cmp_ps(d_b, d_r, _CMP_GT_OQ); // b>r // r> !b>r && r>g - mask = _mm256_andnot_ps(gt_b, gt_r); + mask = _mm256_andnot_ps(gt_b, gt_r); cxxxa = blendv_avx(prev_r, next_r, mask); // r< !r>g && b>r - mask = _mm256_andnot_ps(gt_r, gt_b); + mask = _mm256_andnot_ps(gt_r, gt_b); cxxxb = blendv_avx(next_r, prev_r, mask); // g> !r>g && g>b - mask = _mm256_andnot_ps(gt_r, gt_g); + mask = _mm256_andnot_ps(gt_r, gt_g); cxxxa = _mm256_add_ps(cxxxa, blendv_avx(prev_g, next_g, mask)); // g< !g>b && r>g - mask = _mm256_andnot_ps(gt_g, gt_r); + mask = _mm256_andnot_ps(gt_g, gt_r); cxxxb = _mm256_add_ps(cxxxb, blendv_avx(next_g, prev_g, mask)); // b> !g>b && b>r - mask = _mm256_andnot_ps(gt_g, gt_b); + mask = _mm256_andnot_ps(gt_g, gt_b); cxxxa = _mm256_add_ps(cxxxa, blendv_avx(prev_b, next_b, mask)); // b< !b>r && g>b - mask = _mm256_andnot_ps(gt_b, gt_g); + mask = _mm256_andnot_ps(gt_b, gt_g); cxxxb = _mm256_add_ps(cxxxb, blendv_avx(next_b, prev_b, mask)); __m256 c000 = _mm256_add_ps(_mm256_add_ps(prev_r, prev_g), prev_b); @@ -196,7 +200,7 @@ static inline rgbavec_avx interp_tetrahedral_avx(const Lut3DContextAVX &ctx, __m gather_rgb_avx(ctx.lut, cxxxa_idx); // (x0-x1) * cxxxa - v = _mm256_sub_ps(x0, x1); + v = _mm256_sub_ps(x0, x1); result.r = fmadd_ps_avx(v, sample_r, result.r); result.g = fmadd_ps_avx(v, sample_g, result.g); result.b = fmadd_ps_avx(v, sample_b, result.b); @@ -204,7 +208,7 @@ static inline rgbavec_avx interp_tetrahedral_avx(const Lut3DContextAVX &ctx, __m gather_rgb_avx(ctx.lut, cxxxb_idx); // (x1-x2) * cxxxb - v = _mm256_sub_ps(x1, x2); + v = _mm256_sub_ps(x1, x2); result.r = fmadd_ps_avx(v, sample_r, result.r); result.g = fmadd_ps_avx(v, sample_g, result.g); result.b = fmadd_ps_avx(v, sample_b, result.b); @@ -221,20 +225,25 @@ static inline rgbavec_avx interp_tetrahedral_avx(const Lut3DContextAVX &ctx, __m return result; } -template -static inline void applyTetrahedralAVXFunc(const float *lut3d, int dim, const float *src, float *dst, int total_pixel_count) +template +static inline void applyTetrahedralAVXFunc( + const float * lut3d, + int dim, + const float * src, + float * dst, + int total_pixel_count) { typedef typename BitDepthInfo::Type InType; typedef typename BitDepthInfo::Type OutType; - __m256 r,g,b,a; + __m256 r, g, b, a; rgbavec_avx c; Lut3DContextAVX ctx; - float lutmax = (float)dim- 1; + float lutmax = (float)dim - 1; __m256 scale = _mm256_set1_ps(lutmax); - __m256 zero = _mm256_setzero_ps(); + __m256 zero = _mm256_setzero_ps(); ctx.lut = lut3d; ctx.lutmax = _mm256_set1_ps(lutmax); @@ -242,9 +251,9 @@ static inline void applyTetrahedralAVXFunc(const float *lut3d, int dim, const fl ctx.lutsize2 = _mm256_set1_ps((float)dim * dim * 4); int pixel_count = total_pixel_count / 8 * 8; - int remainder = total_pixel_count - pixel_count; + int remainder = total_pixel_count - pixel_count; - for (int i = 0; i < pixel_count; i += 8 ) + for (int i = 0; i < pixel_count; i += 8) { AVXRGBAPack::Load(src, r, g, b, a); @@ -270,19 +279,19 @@ static inline void applyTetrahedralAVXFunc(const float *lut3d, int dim, const fl dst += 32; } - // handler leftovers pixels + // handler leftovers pixels if (remainder) { InType in_buf[32] = {}; OutType out_buf[32]; - for (int i = 0; i < remainder*4; i+=4) + for (int i = 0; i < remainder * 4; i += 4) { in_buf[i + 0] = src[0]; in_buf[i + 1] = src[1]; in_buf[i + 2] = src[2]; in_buf[i + 3] = src[3]; - src+=4; + src += 4; } AVXRGBAPack::Load(in_buf, r, g, b, a); @@ -304,24 +313,29 @@ static inline void applyTetrahedralAVXFunc(const float *lut3d, int dim, const fl AVXRGBAPack::Store(out_buf, c.r, c.g, c.b, c.a); - for (int i = 0; i < remainder*4; i+=4) + for (int i = 0; i < remainder * 4; i += 4) { dst[0] = out_buf[i + 0]; dst[1] = out_buf[i + 1]; dst[2] = out_buf[i + 2]; dst[3] = out_buf[i + 3]; - dst+=4; + dst += 4; } } } } // anonymous namespace -void applyTetrahedralAVX(const float *lut3d, int dim, const float *src, float *dst, int total_pixel_count) +void applyTetrahedralAVX( + const float * lut3d, + int dim, + const float * src, + float * dst, + int total_pixel_count) { applyTetrahedralAVXFunc(lut3d, dim, src, dst, total_pixel_count); } -} // OCIO_NAMESPACE +} // namespace OCIO_NAMESPACE #endif // OCIO_USE_AVX \ No newline at end of file diff --git a/src/OpenColorIO/ops/lut3d/Lut3DOpCPU_AVX.h b/src/OpenColorIO/ops/lut3d/Lut3DOpCPU_AVX.h index abed452ae4..c7d4761d2a 100644 --- a/src/OpenColorIO/ops/lut3d/Lut3DOpCPU_AVX.h +++ b/src/OpenColorIO/ops/lut3d/Lut3DOpCPU_AVX.h @@ -12,7 +12,12 @@ namespace OCIO_NAMESPACE { -void applyTetrahedralAVX(const float *lut3d, int dim, const float *src, float *dst, int total_pixel_count); +void applyTetrahedralAVX( + const float * lut3d, + int dim, + const float * src, + float * dst, + int total_pixel_count); } // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/ops/lut3d/Lut3DOpCPU_AVX2.cpp b/src/OpenColorIO/ops/lut3d/Lut3DOpCPU_AVX2.cpp index 96a4ff6f67..e361f9e038 100644 --- a/src/OpenColorIO/ops/lut3d/Lut3DOpCPU_AVX2.cpp +++ b/src/OpenColorIO/ops/lut3d/Lut3DOpCPU_AVX2.cpp @@ -11,25 +11,33 @@ namespace OCIO_NAMESPACE { -namespace { +namespace +{ -struct Lut3DContextAVX2 { - const float *lut; +struct Lut3DContextAVX2 +{ + const float * lut; __m256 lutmax; __m256 lutsize; __m256 lutsize2; }; -struct rgbavec_avx2 { +struct rgbavec_avx2 +{ __m256 r, g, b, a; }; -#define gather_rgb_avx2(src, idx) \ - sample_r = _mm256_i32gather_ps(src+0, idx, 4); \ - sample_g = _mm256_i32gather_ps(src+1, idx, 4); \ - sample_b = _mm256_i32gather_ps(src+2, idx, 4) - -static inline rgbavec_avx2 interp_tetrahedral_avx2(const Lut3DContextAVX2 &ctx, __m256& r, __m256& g, __m256& b, __m256& a) +#define gather_rgb_avx2(src, idx) \ + sample_r = _mm256_i32gather_ps(src + 0, idx, 4); \ + sample_g = _mm256_i32gather_ps(src + 1, idx, 4); \ + sample_b = _mm256_i32gather_ps(src + 2, idx, 4) + +static inline rgbavec_avx2 interp_tetrahedral_avx2( + const Lut3DContextAVX2 & ctx, + __m256 & r, + __m256 & g, + __m256 & b, + __m256 & a) { __m256 x0, x1, x2; __m256 cxxxa; @@ -43,8 +51,8 @@ static inline rgbavec_avx2 interp_tetrahedral_avx2(const Lut3DContextAVX2 &ctx, __m256 lutsize = ctx.lutsize; __m256 lutsize2 = ctx.lutsize2; - __m256 one_f = _mm256_set1_ps(1.0f); - __m256 four_f = _mm256_set1_ps(4.0f); + __m256 one_f = _mm256_set1_ps(1.0f); + __m256 four_f = _mm256_set1_ps(4.0f); __m256 prev_r = _mm256_floor_ps(r); __m256 prev_g = _mm256_floor_ps(g); @@ -72,9 +80,9 @@ static inline rgbavec_avx2 interp_tetrahedral_avx2(const Lut3DContextAVX2 &ctx, // This is the tetrahedral blend equation // red = (1-x0) * c000.r + (x0-x1) * cxxxa.r + (x1-x2) * cxxxb.r + x2 * c111.r; // The x values are the rgb delta values sorted, x0 >= x1 >= x2 - // c### are samples from the lut, which are indices made with prev_(r,g,b) and next_(r,g,b) values - // 0 = use prev, 1 = use next - // c### = (prev_r or next_r) * (lutsize * lutsize) + (prev_g or next_g) * lutsize + (prev_b or next_b) + // c### are samples from the lut, which are indices made with prev_(r,g,b) and next_(r,g,b) + // values 0 = use prev, 1 = use next c### = (prev_r or next_r) * (lutsize * lutsize) + (prev_g + // or next_g) * lutsize + (prev_b or next_b) // cxxxa // always uses 1 next and 2 prev and next is largest delta @@ -95,27 +103,27 @@ static inline rgbavec_avx2 interp_tetrahedral_avx2(const Lut3DContextAVX2 &ctx, __m256 gt_b = _mm256_cmp_ps(d_b, d_r, _CMP_GT_OQ); // b>r // r> !b>r && r>g - mask = _mm256_andnot_ps(gt_b, gt_r); + mask = _mm256_andnot_ps(gt_b, gt_r); cxxxa = _mm256_blendv_ps(prev_r, next_r, mask); // r< !r>g && b>r - mask = _mm256_andnot_ps(gt_r, gt_b); + mask = _mm256_andnot_ps(gt_r, gt_b); cxxxb = _mm256_blendv_ps(next_r, prev_r, mask); // g> !r>g && g>b - mask = _mm256_andnot_ps(gt_r, gt_g); + mask = _mm256_andnot_ps(gt_r, gt_g); cxxxa = _mm256_add_ps(cxxxa, _mm256_blendv_ps(prev_g, next_g, mask)); // g< !g>b && r>g - mask = _mm256_andnot_ps(gt_g, gt_r); + mask = _mm256_andnot_ps(gt_g, gt_r); cxxxb = _mm256_add_ps(cxxxb, _mm256_blendv_ps(next_g, prev_g, mask)); // b> !g>b && b>r - mask = _mm256_andnot_ps(gt_g, gt_b); + mask = _mm256_andnot_ps(gt_g, gt_b); cxxxa = _mm256_add_ps(cxxxa, _mm256_blendv_ps(prev_b, next_b, mask)); // b< !b>r && g>b - mask = _mm256_andnot_ps(gt_b, gt_g); + mask = _mm256_andnot_ps(gt_b, gt_g); cxxxb = _mm256_add_ps(cxxxb, _mm256_blendv_ps(next_b, prev_b, mask)); __m256 c000 = _mm256_add_ps(_mm256_add_ps(prev_r, prev_g), prev_b); @@ -148,7 +156,7 @@ static inline rgbavec_avx2 interp_tetrahedral_avx2(const Lut3DContextAVX2 &ctx, gather_rgb_avx2(ctx.lut, cxxxa_idx); // (x0-x1) * cxxxa - v = _mm256_sub_ps(x0, x1); + v = _mm256_sub_ps(x0, x1); result.r = _mm256_fmadd_ps(v, sample_r, result.r); result.g = _mm256_fmadd_ps(v, sample_g, result.g); result.b = _mm256_fmadd_ps(v, sample_b, result.b); @@ -156,7 +164,7 @@ static inline rgbavec_avx2 interp_tetrahedral_avx2(const Lut3DContextAVX2 &ctx, gather_rgb_avx2(ctx.lut, cxxxb_idx); // (x1-x2) * cxxxb - v = _mm256_sub_ps(x1, x2); + v = _mm256_sub_ps(x1, x2); result.r = _mm256_fmadd_ps(v, sample_r, result.r); result.g = _mm256_fmadd_ps(v, sample_g, result.g); result.b = _mm256_fmadd_ps(v, sample_b, result.b); @@ -173,22 +181,27 @@ static inline rgbavec_avx2 interp_tetrahedral_avx2(const Lut3DContextAVX2 &ctx, return result; } -template -inline void applyTetrahedralAVX2Func(const float *lut3d, int dim, const void *inImg, void *outImg, int numPixels) +template +inline void applyTetrahedralAVX2Func( + const float * lut3d, + int dim, + const void * inImg, + void * outImg, + int numPixels) { typedef typename BitDepthInfo::Type InType; typedef typename BitDepthInfo::Type OutType; const InType * src = (InType *)inImg; - OutType * dst = (OutType *)outImg; - __m256 r,g,b,a; + OutType * dst = (OutType *)outImg; + __m256 r, g, b, a; rgbavec_avx2 c; Lut3DContextAVX2 ctx; float lutmax = (float)dim - 1; - __m256 scale = _mm256_set1_ps(lutmax); - __m256 zero = _mm256_setzero_ps(); + __m256 scale = _mm256_set1_ps(lutmax); + __m256 zero = _mm256_setzero_ps(); ctx.lut = lut3d; ctx.lutmax = _mm256_set1_ps(lutmax); @@ -196,9 +209,9 @@ inline void applyTetrahedralAVX2Func(const float *lut3d, int dim, const void *in ctx.lutsize2 = _mm256_set1_ps((float)dim * dim * 4); int pixel_count = numPixels / 8 * 8; - int remainder = numPixels - pixel_count; + int remainder = numPixels - pixel_count; - for (int i = 0; i < pixel_count; i += 8 ) + for (int i = 0; i < pixel_count; i += 8) { AVX2RGBAPack::Load(src, r, g, b, a); @@ -223,19 +236,19 @@ inline void applyTetrahedralAVX2Func(const float *lut3d, int dim, const void *in dst += 32; } - // handler leftovers pixels + // handler leftovers pixels if (remainder) { InType in_buf[32] = {}; OutType out_buf[32]; - for (int i = 0; i < remainder*4; i+=4) + for (int i = 0; i < remainder * 4; i += 4) { in_buf[i + 0] = src[0]; in_buf[i + 1] = src[1]; in_buf[i + 2] = src[2]; in_buf[i + 3] = src[3]; - src+=4; + src += 4; } AVX2RGBAPack::Load(in_buf, r, g, b, a); @@ -257,24 +270,29 @@ inline void applyTetrahedralAVX2Func(const float *lut3d, int dim, const void *in AVX2RGBAPack::Store(out_buf, c.r, c.g, c.b, c.a); - for (int i = 0; i < remainder*4; i+=4) + for (int i = 0; i < remainder * 4; i += 4) { dst[0] = out_buf[i + 0]; dst[1] = out_buf[i + 1]; dst[2] = out_buf[i + 2]; dst[3] = out_buf[i + 3]; - dst+=4; + dst += 4; } } } } // anonymous namespace -void applyTetrahedralAVX2(const float *lut3d, int dim, const float *src, float *dst, int total_pixel_count) +void applyTetrahedralAVX2( + const float * lut3d, + int dim, + const float * src, + float * dst, + int total_pixel_count) { applyTetrahedralAVX2Func(lut3d, dim, src, dst, total_pixel_count); } -} // OCIO_NAMESPACE +} // namespace OCIO_NAMESPACE #endif // OCIO_USE_AVX2 \ No newline at end of file diff --git a/src/OpenColorIO/ops/lut3d/Lut3DOpCPU_AVX2.h b/src/OpenColorIO/ops/lut3d/Lut3DOpCPU_AVX2.h index 6a8f72395f..b6ac7e025f 100644 --- a/src/OpenColorIO/ops/lut3d/Lut3DOpCPU_AVX2.h +++ b/src/OpenColorIO/ops/lut3d/Lut3DOpCPU_AVX2.h @@ -12,7 +12,12 @@ namespace OCIO_NAMESPACE { -void applyTetrahedralAVX2(const float *lut3d, int dim, const float *src, float *dst, int total_pixel_count); +void applyTetrahedralAVX2( + const float * lut3d, + int dim, + const float * src, + float * dst, + int total_pixel_count); } // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/ops/lut3d/Lut3DOpCPU_AVX512.cpp b/src/OpenColorIO/ops/lut3d/Lut3DOpCPU_AVX512.cpp index b659dad4a2..d48fcd4305 100644 --- a/src/OpenColorIO/ops/lut3d/Lut3DOpCPU_AVX512.cpp +++ b/src/OpenColorIO/ops/lut3d/Lut3DOpCPU_AVX512.cpp @@ -11,30 +11,38 @@ namespace OCIO_NAMESPACE { -namespace { +namespace +{ -struct Lut3DContextAVX512 { - const float *lut; +struct Lut3DContextAVX512 +{ + const float * lut; __m512 lutmax; __m512 lutsize; __m512 lutsize2; }; -struct rgbavec_avx512 { +struct rgbavec_avx512 +{ __m512 r, g, b, a; }; -#define gather_rgb_avx512(src, idx) \ - sample_r = _mm512_i32gather_ps(idx, (void * )(src+0), 4); \ - sample_g = _mm512_i32gather_ps(idx, (void * )(src+1), 4); \ - sample_b = _mm512_i32gather_ps(idx, (void * )(src+2), 4) - -static inline rgbavec_avx512 interp_tetrahedral_avx512(const Lut3DContextAVX512 &ctx, __m512& r, __m512& g, __m512& b, __m512& a) +#define gather_rgb_avx512(src, idx) \ + sample_r = _mm512_i32gather_ps(idx, (void *)(src + 0), 4); \ + sample_g = _mm512_i32gather_ps(idx, (void *)(src + 1), 4); \ + sample_b = _mm512_i32gather_ps(idx, (void *)(src + 2), 4) + +static inline rgbavec_avx512 interp_tetrahedral_avx512( + const Lut3DContextAVX512 & ctx, + __m512 & r, + __m512 & g, + __m512 & b, + __m512 & a) { __m512 x0, x1, x2; __m512 cxxxa; __m512 cxxxb; - __mmask16 mask; + __mmask16 mask; __m512 sample_r, sample_g, sample_b; rgbavec_avx512 result; @@ -43,8 +51,8 @@ static inline rgbavec_avx512 interp_tetrahedral_avx512(const Lut3DContextAVX512 __m512 lutsize = ctx.lutsize; __m512 lutsize2 = ctx.lutsize2; - __m512 one_f = _mm512_set1_ps(1.0f); - __m512 four_f = _mm512_set1_ps(4.0f); + __m512 one_f = _mm512_set1_ps(1.0f); + __m512 four_f = _mm512_set1_ps(4.0f); __m512 prev_r = _mm512_floor_ps(r); __m512 prev_g = _mm512_floor_ps(g); @@ -72,9 +80,9 @@ static inline rgbavec_avx512 interp_tetrahedral_avx512(const Lut3DContextAVX512 // This is the tetrahedral blend equation // red = (1-x0) * c000.r + (x0-x1) * cxxxa.r + (x1-x2) * cxxxb.r + x2 * c111.r; // The x values are the rgb delta values sorted, x0 >= x1 >= x2 - // c### are samples from the lut, which are indices made with prev_(r,g,b) and next_(r,g,b) values - // 0 = use prev, 1 = use next - // c### = (prev_r or next_r) * (lutsize * lutsize) + (prev_g or next_g) * lutsize + (prev_b or next_b) + // c### are samples from the lut, which are indices made with prev_(r,g,b) and next_(r,g,b) + // values 0 = use prev, 1 = use next c### = (prev_r or next_r) * (lutsize * lutsize) + (prev_g + // or next_g) * lutsize + (prev_b or next_b) // cxxxa // always uses 1 next and 2 prev and next is largest delta @@ -95,27 +103,27 @@ static inline rgbavec_avx512 interp_tetrahedral_avx512(const Lut3DContextAVX512 __mmask16 gt_b = _mm512_cmp_ps_mask(d_b, d_r, _CMP_GT_OQ); // b>r // r> !b>r && r>g - mask = _mm512_kandn(gt_b, gt_r); + mask = _mm512_kandn(gt_b, gt_r); cxxxa = _mm512_mask_blend_ps(mask, prev_r, next_r); // r< !r>g && b>r - mask = _mm512_kandn(gt_r, gt_b); + mask = _mm512_kandn(gt_r, gt_b); cxxxb = _mm512_mask_blend_ps(mask, next_r, prev_r); // g> !r>g && g>b - mask = _mm512_kandn(gt_r, gt_g); + mask = _mm512_kandn(gt_r, gt_g); cxxxa = _mm512_add_ps(cxxxa, _mm512_mask_blend_ps(mask, prev_g, next_g)); // g< !g>b && r>g - mask = _mm512_kandn(gt_g, gt_r); + mask = _mm512_kandn(gt_g, gt_r); cxxxb = _mm512_add_ps(cxxxb, _mm512_mask_blend_ps(mask, next_g, prev_g)); // b> !g>b && b>r - mask = _mm512_kandn(gt_g, gt_b); + mask = _mm512_kandn(gt_g, gt_b); cxxxa = _mm512_add_ps(cxxxa, _mm512_mask_blend_ps(mask, prev_b, next_b)); // b< !b>r && g>b - mask = _mm512_kandn(gt_b, gt_g); + mask = _mm512_kandn(gt_b, gt_g); cxxxb = _mm512_add_ps(cxxxb, _mm512_mask_blend_ps(mask, next_b, prev_b)); __m512 c000 = _mm512_add_ps(_mm512_add_ps(prev_r, prev_g), prev_b); @@ -148,7 +156,7 @@ static inline rgbavec_avx512 interp_tetrahedral_avx512(const Lut3DContextAVX512 gather_rgb_avx512(ctx.lut, cxxxa_idx); // (x0-x1) * cxxxa - v = _mm512_sub_ps(x0, x1); + v = _mm512_sub_ps(x0, x1); result.r = _mm512_fmadd_ps(v, sample_r, result.r); result.g = _mm512_fmadd_ps(v, sample_g, result.g); result.b = _mm512_fmadd_ps(v, sample_b, result.b); @@ -156,7 +164,7 @@ static inline rgbavec_avx512 interp_tetrahedral_avx512(const Lut3DContextAVX512 gather_rgb_avx512(ctx.lut, cxxxb_idx); // (x1-x2) * cxxxb - v = _mm512_sub_ps(x1, x2); + v = _mm512_sub_ps(x1, x2); result.r = _mm512_fmadd_ps(v, sample_r, result.r); result.g = _mm512_fmadd_ps(v, sample_g, result.g); result.b = _mm512_fmadd_ps(v, sample_b, result.b); @@ -173,22 +181,27 @@ static inline rgbavec_avx512 interp_tetrahedral_avx512(const Lut3DContextAVX512 return result; } -template -inline void applyTetrahedralAVX512Func(const float *lut3d, int dim, const void *inImg, void *outImg, int numPixels) +template +inline void applyTetrahedralAVX512Func( + const float * lut3d, + int dim, + const void * inImg, + void * outImg, + int numPixels) { typedef typename BitDepthInfo::Type InType; typedef typename BitDepthInfo::Type OutType; const InType * src = (InType *)inImg; - OutType * dst = (OutType *)outImg; - __m512 r,g,b,a; + OutType * dst = (OutType *)outImg; + __m512 r, g, b, a; rgbavec_avx512 c; Lut3DContextAVX512 ctx; float lutmax = (float)dim - 1; - __m512 scale = _mm512_set1_ps(lutmax); - __m512 zero = _mm512_setzero_ps(); + __m512 scale = _mm512_set1_ps(lutmax); + __m512 zero = _mm512_setzero_ps(); ctx.lut = lut3d; ctx.lutmax = _mm512_set1_ps(lutmax); @@ -196,9 +209,9 @@ inline void applyTetrahedralAVX512Func(const float *lut3d, int dim, const void * ctx.lutsize2 = _mm512_set1_ps((float)dim * dim * 4); int pixel_count = numPixels / 16 * 16; - int remainder = numPixels - pixel_count; + int remainder = numPixels - pixel_count; - for (int i = 0; i < pixel_count; i += 16 ) + for (int i = 0; i < pixel_count; i += 16) { AVX512RGBAPack::Load(src, r, g, b, a); @@ -223,7 +236,7 @@ inline void applyTetrahedralAVX512Func(const float *lut3d, int dim, const void * dst += 64; } - // handler leftovers pixels + // handler leftovers pixels if (remainder) { AVX512RGBAPack::LoadMasked(src, r, g, b, a, remainder); @@ -249,11 +262,21 @@ inline void applyTetrahedralAVX512Func(const float *lut3d, int dim, const void * } // anonymous namespace -void applyTetrahedralAVX512(const float *lut3d, int dim, const float *src, float *dst, int total_pixel_count) +void applyTetrahedralAVX512( + const float * lut3d, + int dim, + const float * src, + float * dst, + int total_pixel_count) { - applyTetrahedralAVX512Func(lut3d, dim, src, dst, total_pixel_count); + applyTetrahedralAVX512Func( + lut3d, + dim, + src, + dst, + total_pixel_count); } -} // OCIO_NAMESPACE +} // namespace OCIO_NAMESPACE #endif // OCIO_USE_AVX512 \ No newline at end of file diff --git a/src/OpenColorIO/ops/lut3d/Lut3DOpCPU_AVX512.h b/src/OpenColorIO/ops/lut3d/Lut3DOpCPU_AVX512.h index 70ff195cda..3f9557461a 100644 --- a/src/OpenColorIO/ops/lut3d/Lut3DOpCPU_AVX512.h +++ b/src/OpenColorIO/ops/lut3d/Lut3DOpCPU_AVX512.h @@ -12,7 +12,12 @@ namespace OCIO_NAMESPACE { -void applyTetrahedralAVX512(const float *lut3d, int dim, const float *src, float *dst, int total_pixel_count); +void applyTetrahedralAVX512( + const float * lut3d, + int dim, + const float * src, + float * dst, + int total_pixel_count); } // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/ops/lut3d/Lut3DOpCPU_SSE2.cpp b/src/OpenColorIO/ops/lut3d/Lut3DOpCPU_SSE2.cpp index e7b338d360..f3e3798c33 100644 --- a/src/OpenColorIO/ops/lut3d/Lut3DOpCPU_SSE2.cpp +++ b/src/OpenColorIO/ops/lut3d/Lut3DOpCPU_SSE2.cpp @@ -9,31 +9,34 @@ namespace OCIO_NAMESPACE { -namespace { +namespace +{ -struct Lut3DContextSSE2 { - const float *lut; +struct Lut3DContextSSE2 +{ + const float * lut; __m128 lutmax; __m128 lutsize; __m128 lutsize2; }; -struct rgbavec_sse2 { +struct rgbavec_sse2 +{ __m128 r, g, b, a; }; -#define gather_rgb_sse2(src, idx) \ - _mm_store_si128((__m128i *)indices, idx); \ - row0 = _mm_loadu_ps(src + indices[0]); \ - row1 = _mm_loadu_ps(src + indices[1]); \ - row2 = _mm_loadu_ps(src + indices[2]); \ - row3 = _mm_loadu_ps(src + indices[3]); \ - tmp0 = _mm_unpacklo_ps(row0, row1); \ - tmp2 = _mm_unpacklo_ps(row2, row3); \ - tmp1 = _mm_unpackhi_ps(row0, row1); \ - tmp3 = _mm_unpackhi_ps(row2, row3); \ - sample_r = _mm_movelh_ps(tmp0, tmp2); \ - sample_g = _mm_movehl_ps(tmp2, tmp0); \ +#define gather_rgb_sse2(src, idx) \ + _mm_store_si128((__m128i *)indices, idx); \ + row0 = _mm_loadu_ps(src + indices[0]); \ + row1 = _mm_loadu_ps(src + indices[1]); \ + row2 = _mm_loadu_ps(src + indices[2]); \ + row3 = _mm_loadu_ps(src + indices[3]); \ + tmp0 = _mm_unpacklo_ps(row0, row1); \ + tmp2 = _mm_unpacklo_ps(row2, row3); \ + tmp1 = _mm_unpackhi_ps(row0, row1); \ + tmp3 = _mm_unpackhi_ps(row2, row3); \ + sample_r = _mm_movelh_ps(tmp0, tmp2); \ + sample_g = _mm_movehl_ps(tmp2, tmp0); \ sample_b = _mm_movelh_ps(tmp1, tmp3) static inline __m128 floor_ps_sse2(__m128 v) @@ -59,14 +62,14 @@ static inline __m128 fmadd_ps_sse2(__m128 a, __m128 b, __m128 c) { #if OCIO_USE_SSE2NEON return vreinterpretq_m128_f32( - vfmaq_f32(vreinterpretq_f32_m128(c), vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b)) - ); + vfmaq_f32(vreinterpretq_f32_m128(c), vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b))); #else - return _mm_add_ps(_mm_mul_ps(a, b), c); + return _mm_add_ps(_mm_mul_ps(a, b), c); #endif } -static inline rgbavec_sse2 interp_tetrahedral_sse2(const Lut3DContextSSE2 &ctx, __m128 r, __m128 g, __m128 b, __m128 a) +static inline rgbavec_sse2 +interp_tetrahedral_sse2(const Lut3DContextSSE2 & ctx, __m128 r, __m128 g, __m128 b, __m128 a) { SSE2_ALIGN(uint32_t indices[4]); @@ -85,8 +88,8 @@ static inline rgbavec_sse2 interp_tetrahedral_sse2(const Lut3DContextSSE2 &ctx, __m128 lutsize = ctx.lutsize; __m128 lutsize2 = ctx.lutsize2; - __m128 one_f = _mm_set1_ps(1.0f); - __m128 four_f = _mm_set1_ps(4.0f); + __m128 one_f = _mm_set1_ps(1.0f); + __m128 four_f = _mm_set1_ps(4.0f); __m128 prev_r = floor_ps_sse2(r); __m128 prev_g = floor_ps_sse2(g); @@ -114,9 +117,9 @@ static inline rgbavec_sse2 interp_tetrahedral_sse2(const Lut3DContextSSE2 &ctx, // This is the tetrahedral blend equation // red = (1-x0) * c000.r + (x0-x1) * cxxxa.r + (x1-x2) * cxxxb.r + x2 * c111.r; // The x values are the rgb delta values sorted, x0 >= x1 >= x2 - // c### are samples from the lut, which are indices made with prev_(r,g,b) and next_(r,g,b) values - // 0 = use prev, 1 = use next - // c### = (prev_r or next_r) * (lutsize * lutsize) + (prev_g or next_g) * lutsize + (prev_b or next_b) + // c### are samples from the lut, which are indices made with prev_(r,g,b) and next_(r,g,b) + // values 0 = use prev, 1 = use next c### = (prev_r or next_r) * (lutsize * lutsize) + (prev_g + // or next_g) * lutsize + (prev_b or next_b) // cxxxa // always uses 1 next and 2 prev and next is largest delta @@ -190,7 +193,7 @@ static inline rgbavec_sse2 interp_tetrahedral_sse2(const Lut3DContextSSE2 &ctx, gather_rgb_sse2(ctx.lut, cxxxa_idx); // (x0-x1) * cxxxa - v = _mm_sub_ps(x0, x1); + v = _mm_sub_ps(x0, x1); result.r = fmadd_ps_sse2(v, sample_r, result.r); result.g = fmadd_ps_sse2(v, sample_g, result.g); result.b = fmadd_ps_sse2(v, sample_b, result.b); @@ -198,7 +201,7 @@ static inline rgbavec_sse2 interp_tetrahedral_sse2(const Lut3DContextSSE2 &ctx, gather_rgb_sse2(ctx.lut, cxxxb_idx); // (x1-x2) * cxxxb - v = _mm_sub_ps(x1, x2); + v = _mm_sub_ps(x1, x2); result.r = fmadd_ps_sse2(v, sample_r, result.r); result.g = fmadd_ps_sse2(v, sample_g, result.g); result.b = fmadd_ps_sse2(v, sample_b, result.b); @@ -215,8 +218,13 @@ static inline rgbavec_sse2 interp_tetrahedral_sse2(const Lut3DContextSSE2 &ctx, return result; } -template -static inline void applyTetrahedralSSE2Func(const float *lut3d, int dim, const float *src, float *dst, int total_pixel_count) +template +static inline void applyTetrahedralSSE2Func( + const float * lut3d, + int dim, + const float * src, + float * dst, + int total_pixel_count) { typedef typename BitDepthInfo::Type InType; typedef typename BitDepthInfo::Type OutType; @@ -227,21 +235,21 @@ static inline void applyTetrahedralSSE2Func(const float *lut3d, int dim, const f Lut3DContextSSE2 ctx; - float lutmax = (float)dim - 1; + float lutmax = (float)dim - 1; __m128 scale_r = _mm_set1_ps(lutmax); __m128 scale_g = _mm_set1_ps(lutmax); __m128 scale_b = _mm_set1_ps(lutmax); __m128 zero = _mm_setzero_ps(); - ctx.lut = lut3d; + ctx.lut = lut3d; ctx.lutmax = _mm_set1_ps(lutmax); ctx.lutsize = _mm_set1_ps((float)dim * 4); ctx.lutsize2 = _mm_set1_ps((float)dim * dim * 4); int pixel_count = total_pixel_count / 4 * 4; - int remainder = total_pixel_count - pixel_count; + int remainder = total_pixel_count - pixel_count; - for (int i = 0; i < pixel_count; i += 4 ) + for (int i = 0; i < pixel_count; i += 4) { SSE2RGBAPack::Load(src, r, g, b, a); @@ -267,17 +275,18 @@ static inline void applyTetrahedralSSE2Func(const float *lut3d, int dim, const f } // handler leftovers pixels - if (remainder) { + if (remainder) + { InType in_buf[16] = {}; OutType out_buf[16]; - for (int i = 0; i < remainder*4; i+=4) + for (int i = 0; i < remainder * 4; i += 4) { in_buf[i + 0] = src[0]; in_buf[i + 1] = src[1]; in_buf[i + 2] = src[2]; in_buf[i + 3] = src[3]; - src+=4; + src += 4; } SSE2RGBAPack::Load(in_buf, r, g, b, a); @@ -299,23 +308,28 @@ static inline void applyTetrahedralSSE2Func(const float *lut3d, int dim, const f SSE2RGBAPack::Store(out_buf, c.r, c.g, c.b, c.a); - for (int i = 0; i < remainder*4; i+=4) + for (int i = 0; i < remainder * 4; i += 4) { dst[0] = out_buf[i + 0]; dst[1] = out_buf[i + 1]; dst[2] = out_buf[i + 2]; dst[3] = out_buf[i + 3]; - dst+=4; + dst += 4; } } } } // anonymous namespace -void applyTetrahedralSSE2(const float *lut3d, int dim, const float *src, float *dst, int total_pixel_count) +void applyTetrahedralSSE2( + const float * lut3d, + int dim, + const float * src, + float * dst, + int total_pixel_count) { applyTetrahedralSSE2Func(lut3d, dim, src, dst, total_pixel_count); } -} // OCIO_NAMESPACE +} // namespace OCIO_NAMESPACE #endif // OCIO_USE_SSE2 \ No newline at end of file diff --git a/src/OpenColorIO/ops/lut3d/Lut3DOpCPU_SSE2.h b/src/OpenColorIO/ops/lut3d/Lut3DOpCPU_SSE2.h index 8e6293642d..b673482b56 100644 --- a/src/OpenColorIO/ops/lut3d/Lut3DOpCPU_SSE2.h +++ b/src/OpenColorIO/ops/lut3d/Lut3DOpCPU_SSE2.h @@ -12,7 +12,12 @@ namespace OCIO_NAMESPACE { -void applyTetrahedralSSE2(const float *lut3d, int dim, const float *src, float *dst, int total_pixel_count); +void applyTetrahedralSSE2( + const float * lut3d, + int dim, + const float * src, + float * dst, + int total_pixel_count); } // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/ops/lut3d/Lut3DOpData.cpp b/src/OpenColorIO/ops/lut3d/Lut3DOpData.cpp index e17cbcfce6..28dcedd973 100644 --- a/src/OpenColorIO/ops/lut3d/Lut3DOpData.cpp +++ b/src/OpenColorIO/ops/lut3d/Lut3DOpData.cpp @@ -8,11 +8,11 @@ #include "BitDepthUtils.h" #include "HashUtils.h" #include "MathUtils.h" +#include "Platform.h" +#include "ops/OpTools.h" #include "ops/lut3d/Lut3DOp.h" #include "ops/lut3d/Lut3DOpData.h" -#include "ops/OpTools.h" #include "ops/range/RangeOpData.h" -#include "Platform.h" namespace OCIO_NAMESPACE { @@ -40,7 +40,7 @@ Lut3DOpDataRcPtr MakeFastLut3DFromInverse(ConstLut3DOpDataRcPtr & lut) // Make a domain for the composed Lut3D. // TODO: Using a large number like 48 here is better for accuracy, // but it causes a delay when creating the renderer. - const long GridSize = 48u; + const long GridSize = 48u; Lut3DOpDataRcPtr newDomain = std::make_shared(GridSize); newDomain->setFileOutputBitDepth(lut->getFileOutputBitDepth()); @@ -54,7 +54,7 @@ Lut3DOpDataRcPtr MakeFastLut3DFromInverse(ConstLut3DOpDataRcPtr & lut) // style of forward evaluation. // TODO: Although this seems like the "correct" thing to do, it does // not seem to help accuracy (and is slower). To investigate ... - //result->setInterpolation(INTERP_TETRAHEDRAL); + // result->setInterpolation(INTERP_TETRAHEDRAL); return result; } @@ -71,8 +71,7 @@ const unsigned long Lut3DOpData::maxSupportedLength = 129; // needs to render values through the ops. In some cases the domain of // the first op is sufficient, in other cases we need to create a new more // finely sampled domain to try and make the result less lossy. -Lut3DOpDataRcPtr Lut3DOpData::Compose(ConstLut3DOpDataRcPtr & lutc1, - ConstLut3DOpDataRcPtr & lutc2) +Lut3DOpDataRcPtr Lut3DOpData::Compose(ConstLut3DOpDataRcPtr & lutc1, ConstLut3DOpDataRcPtr & lutc2) { // TODO: Composition of LUTs is a potentially lossy operation. // We try to be safe by making the result at least as big as either lut1 or @@ -83,8 +82,9 @@ Lut3DOpDataRcPtr Lut3DOpData::Compose(ConstLut3DOpDataRcPtr & lutc1, Lut3DOpDataRcPtr lut1 = std::const_pointer_cast(lutc1); Lut3DOpDataRcPtr lut2 = std::const_pointer_cast(lutc2); - bool restoreInverse = false; - if (lut1->getDirection() == TRANSFORM_DIR_INVERSE && lut2->getDirection() == TRANSFORM_DIR_INVERSE) + bool restoreInverse = false; + if (lut1->getDirection() == TRANSFORM_DIR_INVERSE + && lut2->getDirection() == TRANSFORM_DIR_INVERSE) { // Using the fact that: iInv(l2 x l1) = inv(l1) x inv(l2). // Compute l2 x l1 and inverse the result. @@ -95,8 +95,8 @@ Lut3DOpDataRcPtr Lut3DOpData::Compose(ConstLut3DOpDataRcPtr & lutc1, restoreInverse = true; } - const long min_sz = lut2->getArray().getLength(); - const long n = lut1->getArray().getLength(); + const long min_sz = lut2->getArray().getLength(); + const long n = lut1->getArray().getLength(); const long domain_size = std::max(min_sz, n); OpRcPtrVec ops; @@ -116,7 +116,7 @@ Lut3DOpDataRcPtr Lut3DOpData::Compose(ConstLut3DOpDataRcPtr & lutc1, result = std::make_shared(lut1->getInterpolation(), domain_size); - auto metadata = lut1->getFormatMetadata(); + auto metadata = lut1->getFormatMetadata(); result->getFormatMetadata() = metadata; // Interpolate through both LUTs in this case (resample). @@ -137,13 +137,10 @@ Lut3DOpDataRcPtr Lut3DOpData::Compose(ConstLut3DOpDataRcPtr & lutc1, result->setFileOutputBitDepth(fileOutBD); const Array::Values & domain = result->getArray().getValues(); - const long gridSize = result->getArray().getLength(); - const long numPixels = gridSize * gridSize * gridSize; + const long gridSize = result->getArray().getLength(); + const long numPixels = gridSize * gridSize * gridSize; - EvalTransform((const float*)(&domain[0]), - (float*)(&domain[0]), - numPixels, - ops); + EvalTransform((const float *)(&domain[0]), (float *)(&domain[0]), numPixels, ops); if (restoreInverse) { @@ -165,11 +162,11 @@ Lut3DOpData::Lut3DArray::~Lut3DArray() { } -Lut3DOpData::Lut3DArray& Lut3DOpData::Lut3DArray::operator=(const Array& a) +Lut3DOpData::Lut3DArray & Lut3DOpData::Lut3DArray::operator=(const Array & a) { if (this != &a) { - *(Array*)this = a; + *(Array *)this = a; } return *this; } @@ -177,20 +174,20 @@ Lut3DOpData::Lut3DArray& Lut3DOpData::Lut3DArray::operator=(const Array& a) void Lut3DOpData::Lut3DArray::fill() { // Make an identity LUT. - const long length = getLength(); + const long length = getLength(); const long maxChannels = getMaxColorComponents(); - Array::Values& values = getValues(); + Array::Values & values = getValues(); const float stepValue = 1.0f / ((float)length - 1.0f); - const long maxEntries = length*length*length; + const long maxEntries = length * length * length; - for (long idx = 0; idx maxSupportedLength) { std::ostringstream oss; - oss << "LUT 3D: Grid size '" << length - << "' must not be greater than '" << maxSupportedLength << "'."; + oss << "LUT 3D: Grid size '" << length << "' must not be greater than '" + << maxSupportedLength << "'."; throw Exception(oss.str().c_str()); } Array::resize(length, numColorComponents); @@ -208,30 +205,30 @@ void Lut3DOpData::Lut3DArray::resize(unsigned long length, unsigned long numColo unsigned long Lut3DOpData::Lut3DArray::getNumValues() const { - const unsigned long numEntries = getLength()*getLength()*getLength(); - return numEntries*getMaxColorComponents(); + const unsigned long numEntries = getLength() * getLength() * getLength(); + return numEntries * getMaxColorComponents(); } -void Lut3DOpData::Lut3DArray::getRGB(long i, long j, long k, float* RGB) const +void Lut3DOpData::Lut3DArray::getRGB(long i, long j, long k, float * RGB) const { - const long length = getLength(); - const long maxChannels = getMaxColorComponents(); - const Array::Values& values = getValues(); + const long length = getLength(); + const long maxChannels = getMaxColorComponents(); + const Array::Values & values = getValues(); // Array order matches ctf order: channels vary most rapidly, then B, G, R. - long offset = (i*length*length + j*length + k) * maxChannels; - RGB[0] = values[offset]; - RGB[1] = values[++offset]; - RGB[2] = values[++offset]; + long offset = (i * length * length + j * length + k) * maxChannels; + RGB[0] = values[offset]; + RGB[1] = values[++offset]; + RGB[2] = values[++offset]; } -void Lut3DOpData::Lut3DArray::setRGB(long i, long j, long k, float* RGB) +void Lut3DOpData::Lut3DArray::setRGB(long i, long j, long k, float * RGB) { - const long length = getLength(); + const long length = getLength(); const long maxChannels = getMaxColorComponents(); - Array::Values& values = getValues(); + Array::Values & values = getValues(); // Array order matches ctf order: channels vary most rapidly, then B, G, R. - long offset = (i*length*length + j*length + k) * maxChannels; - values[offset] = RGB[0]; + long offset = (i * length * length + j * length + k) * maxChannels; + values[offset] = RGB[0]; values[++offset] = RGB[1]; values[++offset] = RGB[2]; } @@ -241,8 +238,8 @@ void Lut3DOpData::Lut3DArray::scale(float scaleFactor) // Don't scale if scaleFactor = 1.0f. if (scaleFactor != 1.0f) { - Array::Values& arrayVals = getValues(); - const size_t size = arrayVals.size(); + Array::Values & arrayVals = getValues(); + const size_t size = arrayVals.size(); for (size_t i = 0; i < size; i++) { @@ -293,33 +290,33 @@ Interpolation Lut3DOpData::GetConcreteInterpolation(Interpolation interp) { switch (interp) { - case INTERP_BEST: - case INTERP_TETRAHEDRAL: - return INTERP_TETRAHEDRAL; - - case INTERP_DEFAULT: - case INTERP_LINEAR: - case INTERP_CUBIC: - case INTERP_NEAREST: - // NB: In OCIO v2, INTERP_NEAREST is implemented as trilinear, - // this is a change from OCIO v1. - case INTERP_UNKNOWN: - // NB: INTERP_UNKNOWN is not valid and will make validate() throw. - default: - return INTERP_LINEAR; + case INTERP_BEST: + case INTERP_TETRAHEDRAL: + return INTERP_TETRAHEDRAL; + + case INTERP_DEFAULT: + case INTERP_LINEAR: + case INTERP_CUBIC: + case INTERP_NEAREST: + // NB: In OCIO v2, INTERP_NEAREST is implemented as trilinear, + // this is a change from OCIO v1. + case INTERP_UNKNOWN: + // NB: INTERP_UNKNOWN is not valid and will make validate() throw. + default: + return INTERP_LINEAR; } } void Lut3DOpData::setArrayFromRedFastestOrder(const std::vector & lut) { - Array & lutArray = getArray(); + Array & lutArray = getArray(); const auto lutSize = lutArray.getLength(); if (lutSize * lutSize * lutSize * 3 != lut.size()) { std::ostringstream oss; oss << "Lut3D length '" << lutSize << " * " << lutSize << " * " << lutSize << " * 3"; - oss << "' does not match the vector size '"<< lut.size() <<"'."; + oss << "' does not match the vector size '" << lut.size() << "'."; throw Exception(oss.str().c_str()); } @@ -330,10 +327,10 @@ void Lut3DOpData::setArrayFromRedFastestOrder(const std::vector & lut) for (unsigned long r = 0; r < lutSize; ++r) { // Lut3DOpData Array index. Blue changes fastest. - const unsigned long blueFastIdx = 3 * ((r*lutSize + g)*lutSize + b); + const unsigned long blueFastIdx = 3 * ((r * lutSize + g) * lutSize + b); // Float array index. Red changes fastest. - const unsigned long redFastIdx = 3 * ((b*lutSize + g)*lutSize + r); + const unsigned long redFastIdx = 3 * ((b * lutSize + g) * lutSize + r); lutArray[blueFastIdx + 0] = lut[redFastIdx + 0]; lutArray[blueFastIdx + 1] = lut[redFastIdx + 1]; @@ -347,16 +344,16 @@ bool Lut3DOpData::IsValidInterpolation(Interpolation interpolation) { switch (interpolation) { - case INTERP_BEST: - case INTERP_TETRAHEDRAL: - case INTERP_DEFAULT: - case INTERP_LINEAR: - case INTERP_NEAREST: - return true; - case INTERP_CUBIC: - case INTERP_UNKNOWN: - default: - return false; + case INTERP_BEST: + case INTERP_TETRAHEDRAL: + case INTERP_DEFAULT: + case INTERP_LINEAR: + case INTERP_NEAREST: + return true; + case INTERP_CUBIC: + case INTERP_UNKNOWN: + default: + return false; } } @@ -375,7 +372,7 @@ void Lut3DOpData::validate() const { getArray().validate(); } - catch (const Exception& e) + catch (const Exception & e) { std::ostringstream oss; oss << "Lut3D content array issue: "; @@ -389,7 +386,7 @@ void Lut3DOpData::validate() const throw Exception("Lut3D has an incorrect number of color components. "); } - if (getArray().getLength()>maxSupportedLength) + if (getArray().getLength() > maxSupportedLength) { // This should never happen. Enforced by resize. std::ostringstream oss; @@ -424,12 +421,12 @@ bool Lut3DOpData::haveEqualBasics(const Lut3DOpData & other) const bool Lut3DOpData::equals(const OpData & other) const { - if (!OpData::equals(other)) return false; + if (!OpData::equals(other)) + return false; - const Lut3DOpData* lop = static_cast(&other); + const Lut3DOpData * lop = static_cast(&other); - if (m_direction != lop->m_direction - || m_interpolation != lop->m_interpolation) + if (m_direction != lop->m_direction || m_interpolation != lop->m_interpolation) { return false; } @@ -444,10 +441,8 @@ Lut3DOpDataRcPtr Lut3DOpData::clone() const bool Lut3DOpData::isInverse(ConstLut3DOpDataRcPtr & other) const { - if ((m_direction == TRANSFORM_DIR_FORWARD - && other->m_direction == TRANSFORM_DIR_INVERSE) || - (m_direction == TRANSFORM_DIR_INVERSE - && other->m_direction == TRANSFORM_DIR_FORWARD)) + if ((m_direction == TRANSFORM_DIR_FORWARD && other->m_direction == TRANSFORM_DIR_INVERSE) + || (m_direction == TRANSFORM_DIR_INVERSE && other->m_direction == TRANSFORM_DIR_FORWARD)) { return haveEqualBasics(*other); } @@ -458,8 +453,8 @@ Lut3DOpDataRcPtr Lut3DOpData::inverse() const { Lut3DOpDataRcPtr invLut = clone(); - invLut->m_direction = (m_direction == TRANSFORM_DIR_FORWARD) ? - TRANSFORM_DIR_INVERSE : TRANSFORM_DIR_FORWARD; + invLut->m_direction + = (m_direction == TRANSFORM_DIR_FORWARD) ? TRANSFORM_DIR_INVERSE : TRANSFORM_DIR_FORWARD; // Note that any existing metadata could become stale at this point but // trying to update it is also challenging since inverse() is sometimes @@ -479,11 +474,12 @@ std::string Lut3DOpData::getCacheID() const cacheIDStream << getID() << " "; } - cacheIDStream << CacheIDHash(reinterpret_cast(&values[0]), - values.size() * sizeof(values[0])) + cacheIDStream << CacheIDHash( + reinterpret_cast(&values[0]), + values.size() * sizeof(values[0])) << " "; - cacheIDStream << InterpolationToString(m_interpolation) << " "; + cacheIDStream << InterpolationToString(m_interpolation) << " "; cacheIDStream << TransformDirectionToString(m_direction) << " "; return cacheIDStream.str(); diff --git a/src/OpenColorIO/ops/lut3d/Lut3DOpData.h b/src/OpenColorIO/ops/lut3d/Lut3DOpData.h index 370f496c74..f3c10f79bd 100644 --- a/src/OpenColorIO/ops/lut3d/Lut3DOpData.h +++ b/src/OpenColorIO/ops/lut3d/Lut3DOpData.h @@ -9,9 +9,8 @@ #include #include "Op.h" -#include "ops/OpArray.h" #include "PrivateTypes.h" - +#include "ops/OpArray.h" namespace OCIO_NAMESPACE { @@ -22,11 +21,10 @@ typedef OCIO_SHARED_PTR ConstLut3DOpDataRcPtr; class Lut3DOpData : public OpData { public: - // The maximum grid size supported for a 3D LUT. static const unsigned long maxSupportedLength; - // Use functional composition to generate a single op that + // Use functional composition to generate a single op that // approximates the effect of the pair of ops. static Lut3DOpDataRcPtr Compose(ConstLut3DOpDataRcPtr & lut1, ConstLut3DOpDataRcPtr & lut2); @@ -81,7 +79,7 @@ class Lut3DOpData : public OpData Lut3DOpDataRcPtr inverse() const; - bool equals(const OpData& other) const override; + bool equals(const OpData & other) const override; std::string getCacheID() const override; @@ -101,40 +99,38 @@ class Lut3DOpData : public OpData public: Lut3DArray(unsigned long dimension); - Lut3DArray(const Lut3DArray &) = default; - Lut3DArray & operator= (const Lut3DArray &) = default; + Lut3DArray(const Lut3DArray &) = default; + Lut3DArray & operator=(const Lut3DArray &) = default; ~Lut3DArray(); - Lut3DArray& operator=(const Array& a); + Lut3DArray & operator=(const Array & a); void resize(unsigned long length, unsigned long numColorComponents) override; unsigned long getNumValues() const override; - void getRGB(long i, long j, long k, float* RGB) const; + void getRGB(long i, long j, long k, float * RGB) const; - void setRGB(long i, long j, long k, float* RGB); + void setRGB(long i, long j, long k, float * RGB); void scale(float scaleFactor); protected: // Fill the LUT 3D with appropriate default values. void fill(); - }; private: Lut3DOpData() = delete; - Interpolation m_interpolation; - Lut3DArray m_array; + Interpolation m_interpolation; + Lut3DArray m_array; - TransformDirection m_direction; + TransformDirection m_direction; // Out bit-depth to be used for file I/O. BitDepth m_fileOutBitDepth = BIT_DEPTH_UNKNOWN; - }; bool operator==(const Lut3DOpData & lhs, const Lut3DOpData & rhs); diff --git a/src/OpenColorIO/ops/lut3d/Lut3DOpGPU.cpp b/src/OpenColorIO/ops/lut3d/Lut3DOpGPU.cpp index 786f52961c..0f437fbaca 100644 --- a/src/OpenColorIO/ops/lut3d/Lut3DOpGPU.cpp +++ b/src/OpenColorIO/ops/lut3d/Lut3DOpGPU.cpp @@ -10,22 +10,22 @@ #include "ops/lut3d/Lut3DOpGPU.h" #include "utils/StringUtils.h" - namespace OCIO_NAMESPACE { -void GetLut3DGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, ConstLut3DOpDataRcPtr & lutData) +void GetLut3DGPUShaderProgram( + GpuShaderCreatorRcPtr & shaderCreator, + ConstLut3DOpDataRcPtr & lutData) { if (shaderCreator->getLanguage() == LANGUAGE_OSL_1) { - throw Exception("The Lut3DOp is not yet supported by the 'Open Shading language (OSL)' translation"); + throw Exception( + "The Lut3DOp is not yet supported by the 'Open Shading language (OSL)' translation"); } std::ostringstream resName; - resName << shaderCreator->getResourcePrefix() - << std::string("_") - << std::string("lut3d_") + resName << shaderCreator->getResourcePrefix() << std::string("_") << std::string("lut3d_") << shaderCreator->getNextResourceIndex(); // Note: Remove potentially problematic double underscores from GLSL resource names. @@ -39,11 +39,12 @@ void GetLut3DGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, ConstLut3DO samplerInterpolation = INTERP_NEAREST; } // (Using CacheID here to potentially allow reuse of existing textures.) - shaderCreator->add3DTexture(name.c_str(), - GpuShaderText::getSamplerName(name).c_str(), - lutData->getGridSize(), - samplerInterpolation, - &lutData->getArray()[0]); + shaderCreator->add3DTexture( + name.c_str(), + GpuShaderText::getSamplerName(name).c_str(), + lutData->getGridSize(), + samplerInterpolation, + &lutData->getArray()[0]); { GpuShaderText ss(shaderCreator->getLanguage()); @@ -51,12 +52,13 @@ void GetLut3DGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, ConstLut3DO shaderCreator->addToDeclareShaderCode(ss.string().c_str()); } - const float dim = (float)lutData->getGridSize(); // incr = 1/dim (amount needed to increment one index in the grid) const float incr = 1.0f / dim; + // clang-format off + { GpuShaderText ss(shaderCreator->getLanguage()); ss.indent(); @@ -241,7 +243,8 @@ void GetLut3DGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, ConstLut3DO shaderCreator->addToFunctionShaderCode(ss.string().c_str()); } -} + // clang-format on +} } // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/ops/lut3d/Lut3DOpGPU.h b/src/OpenColorIO/ops/lut3d/Lut3DOpGPU.h index d34996f65f..bd0a94e86d 100644 --- a/src/OpenColorIO/ops/lut3d/Lut3DOpGPU.h +++ b/src/OpenColorIO/ops/lut3d/Lut3DOpGPU.h @@ -12,9 +12,10 @@ namespace OCIO_NAMESPACE { -void GetLut3DGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, ConstLut3DOpDataRcPtr & lutData); +void GetLut3DGPUShaderProgram( + GpuShaderCreatorRcPtr & shaderCreator, + ConstLut3DOpDataRcPtr & lutData); } // namespace OCIO_NAMESPACE - #endif diff --git a/src/OpenColorIO/ops/matrix/MatrixOp.cpp b/src/OpenColorIO/ops/matrix/MatrixOp.cpp index 93505a284e..32d2b6439b 100644 --- a/src/OpenColorIO/ops/matrix/MatrixOp.cpp +++ b/src/OpenColorIO/ops/matrix/MatrixOp.cpp @@ -37,12 +37,10 @@ namespace class MatrixOffsetOp : public Op { public: - MatrixOffsetOp() = delete; + MatrixOffsetOp() = delete; MatrixOffsetOp(const MatrixOffsetOp &) = delete; - MatrixOffsetOp(const double * m44, - const double * offset4, - TransformDirection direction); + MatrixOffsetOp(const double * m44, const double * offset4, TransformDirection direction); MatrixOffsetOp(MatrixOpDataRcPtr & matrix); @@ -69,14 +67,13 @@ class MatrixOffsetOp : public Op MatrixOpDataRcPtr matrixData() { return DynamicPtrCast(data()); } }; - typedef OCIO_SHARED_PTR MatrixOffsetOpRcPtr; typedef OCIO_SHARED_PTR ConstMatrixOffsetOpRcPtr; - -MatrixOffsetOp::MatrixOffsetOp(const double * m44, - const double * offset4, - TransformDirection direction) +MatrixOffsetOp::MatrixOffsetOp( + const double * m44, + const double * offset4, + TransformDirection direction) : Op() { MatrixOpDataRcPtr mat = std::make_shared(direction); @@ -98,7 +95,8 @@ OpRcPtr MatrixOffsetOp::clone() const } MatrixOffsetOp::~MatrixOffsetOp() -{ } +{ +} std::string MatrixOffsetOp::getInfo() const { @@ -108,7 +106,8 @@ std::string MatrixOffsetOp::getInfo() const bool MatrixOffsetOp::isSameType(ConstOpRcPtr & op) const { ConstMatrixOffsetOpRcPtr typedRcPtr = DynamicPtrCast(op); - if(!typedRcPtr) return false; + if (!typedRcPtr) + return false; return true; } @@ -153,7 +152,7 @@ void MatrixOffsetOp::combineWith(OpRcPtrVec & ops, ConstOpRcPtr & secondOp) cons } ConstMatrixOffsetOpRcPtr typedRcPtr = DynamicPtrCast(secondOp); - auto thisData = typedRcPtr->matrixData(); + auto thisData = typedRcPtr->matrixData(); MatrixOpDataRcPtr composedMat = matrixData()->compose(thisData); if (!composedMat->isNoOp()) { @@ -197,54 +196,49 @@ void MatrixOffsetOp::extractGpuShaderInfo(GpuShaderCreatorRcPtr & shaderCreator) GetMatrixGPUShaderProgram(shaderCreator, data); } -} // Anon namespace - +} // namespace /////////////////////////////////////////////////////////////////////////// - -void CreateScaleOp(OpRcPtrVec & ops, - const double * scale4, - TransformDirection direction) +void CreateScaleOp(OpRcPtrVec & ops, const double * scale4, TransformDirection direction) { - static constexpr double offset4[4] { 0, 0, 0, 0 }; + static constexpr double offset4[4]{0, 0, 0, 0}; CreateScaleOffsetOp(ops, scale4, offset4, direction); } -void CreateMatrixOp(OpRcPtrVec & ops, - const double * m44, - TransformDirection direction) +void CreateMatrixOp(OpRcPtrVec & ops, const double * m44, TransformDirection direction) { - static constexpr double offset4[4] { 0.0, 0.0, 0.0, 0.0 }; + static constexpr double offset4[4]{0.0, 0.0, 0.0, 0.0}; CreateMatrixOffsetOp(ops, m44, offset4, direction); } -void CreateOffsetOp(OpRcPtrVec & ops, - const double * offset4, - TransformDirection direction) +void CreateOffsetOp(OpRcPtrVec & ops, const double * offset4, TransformDirection direction) { - static constexpr double scale4[4] { 1.0, 1.0, 1.0, 1.0 }; + static constexpr double scale4[4]{1.0, 1.0, 1.0, 1.0}; CreateScaleOffsetOp(ops, scale4, offset4, direction); } -void CreateScaleOffsetOp(OpRcPtrVec & ops, - const double * scale4, const double * offset4, - TransformDirection direction) +void CreateScaleOffsetOp( + OpRcPtrVec & ops, + const double * scale4, + const double * offset4, + TransformDirection direction) { - double m44[16]{ 0.0 }; + double m44[16]{0.0}; - m44[0] = scale4[0]; - m44[5] = scale4[1]; + m44[0] = scale4[0]; + m44[5] = scale4[1]; m44[10] = scale4[2]; m44[15] = scale4[3]; CreateMatrixOffsetOp(ops, m44, offset4, direction); } -void CreateSaturationOp(OpRcPtrVec & ops, - double sat, - const double * lumaCoef3, - TransformDirection direction) +void CreateSaturationOp( + OpRcPtrVec & ops, + double sat, + const double * lumaCoef3, + TransformDirection direction) { double matrix[16]; double offset[4]; @@ -253,9 +247,11 @@ void CreateSaturationOp(OpRcPtrVec & ops, CreateMatrixOffsetOp(ops, matrix, offset, direction); } -void CreateMatrixOffsetOp(OpRcPtrVec & ops, - const double * m44, const double * offset4, - TransformDirection direction) +void CreateMatrixOffsetOp( + OpRcPtrVec & ops, + const double * m44, + const double * offset4, + TransformDirection direction) { auto mat = std::make_shared(); mat->setRGBA(m44); @@ -265,46 +261,46 @@ void CreateMatrixOffsetOp(OpRcPtrVec & ops, CreateMatrixOp(ops, mat, TRANSFORM_DIR_FORWARD); } -void CreateFitOp(OpRcPtrVec & ops, - const double * oldmin4, const double * oldmax4, - const double * newmin4, const double * newmax4, - TransformDirection direction) +void CreateFitOp( + OpRcPtrVec & ops, + const double * oldmin4, + const double * oldmax4, + const double * newmin4, + const double * newmax4, + TransformDirection direction) { double matrix[16]; double offset[4]; - MatrixTransform::Fit(matrix, offset, - oldmin4, oldmax4, - newmin4, newmax4); + MatrixTransform::Fit(matrix, offset, oldmin4, oldmax4, newmin4, newmax4); CreateMatrixOffsetOp(ops, matrix, offset, direction); } void CreateIdentityMatrixOp(OpRcPtrVec & ops, TransformDirection direction) { - double matrix[16]{ 0.0 }; - matrix[0] = 1.0; - matrix[5] = 1.0; - matrix[10] = 1.0; - matrix[15] = 1.0; - const double offset[4] = { 0.0, 0.0, 0.0, 0.0 }; - - ops.push_back(std::make_shared(matrix, - offset, - direction)); + double matrix[16]{0.0}; + matrix[0] = 1.0; + matrix[5] = 1.0; + matrix[10] = 1.0; + matrix[15] = 1.0; + const double offset[4] = {0.0, 0.0, 0.0, 0.0}; + + ops.push_back(std::make_shared(matrix, offset, direction)); } -void CreateMinMaxOp(OpRcPtrVec & ops, - const double * from_min3, - const double * from_max3, - TransformDirection direction) +void CreateMinMaxOp( + OpRcPtrVec & ops, + const double * from_min3, + const double * from_max3, + TransformDirection direction) { - double scale4[4] = { 1.0, 1.0, 1.0, 1.0 }; - double offset4[4] = { 0.0, 0.0, 0.0, 0.0 }; + double scale4[4] = {1.0, 1.0, 1.0, 1.0}; + double offset4[4] = {0.0, 0.0, 0.0, 0.0}; bool somethingToDo = false; for (int i = 0; i < 3; ++i) { - scale4[i] = 1.0 / (from_max3[i] - from_min3[i]); + scale4[i] = 1.0 / (from_max3[i] - from_min3[i]); offset4[i] = -from_min3[i] * scale4[i]; somethingToDo |= (scale4[i] != 1.0 || offset4[i] != 0.0); } @@ -315,19 +311,17 @@ void CreateMinMaxOp(OpRcPtrVec & ops, } } -void CreateMinMaxOp(OpRcPtrVec & ops, - float from_min, - float from_max, - TransformDirection direction) +void CreateMinMaxOp(OpRcPtrVec & ops, float from_min, float from_max, TransformDirection direction) { - const double min[3] = { from_min, from_min, from_min }; - const double max[3] = { from_max, from_max, from_max }; + const double min[3] = {from_min, from_min, from_min}; + const double max[3] = {from_max, from_max, from_max}; CreateMinMaxOp(ops, min, max, direction); } -void CreateMatrixOp(OpRcPtrVec & ops, - MatrixOpData::MatrixArrayPtr & matrix, - TransformDirection direction) +void CreateMatrixOp( + OpRcPtrVec & ops, + MatrixOpData::MatrixArrayPtr & matrix, + TransformDirection direction) { MatrixOpDataRcPtr mat = std::make_shared(*matrix.get()); CreateMatrixOp(ops, mat, direction); @@ -338,7 +332,7 @@ void CreateMatrixOp(OpRcPtrVec & ops, MatrixOpDataRcPtr & matrix, TransformDirec auto mat = matrix; if (direction == TRANSFORM_DIR_INVERSE) { - mat = matrix->clone(); + mat = matrix->clone(); auto newDir = CombineTransformDirections(mat->getDirection(), direction); mat->setDirection(newDir); } @@ -362,18 +356,16 @@ void CreateMatrixTransform(GroupTransformRcPtr & group, ConstOpRcPtr & op) { throw Exception("CreateMatrixTransform: op has to be a MatrixOffsetOp"); } - auto matTransform = MatrixTransform::Create(); - MatrixOpData & data = dynamic_cast(matTransform.get())->data(); + auto matTransform = MatrixTransform::Create(); + MatrixOpData & data = dynamic_cast(matTransform.get())->data(); auto matDataSrc = DynamicPtrCast(op->data()); - data = *matDataSrc; + data = *matDataSrc; group->appendTransform(matTransform); } -void BuildMatrixOp(OpRcPtrVec & ops, - const MatrixTransform & transform, - TransformDirection dir) +void BuildMatrixOp(OpRcPtrVec & ops, const MatrixTransform & transform, TransformDirection dir) { const MatrixOpData & data = dynamic_cast(transform).data(); data.validate(); @@ -383,4 +375,3 @@ void BuildMatrixOp(OpRcPtrVec & ops, } } // namespace OCIO_NAMESPACE - diff --git a/src/OpenColorIO/ops/matrix/MatrixOp.h b/src/OpenColorIO/ops/matrix/MatrixOp.h index d8020976df..be14cf3ab0 100644 --- a/src/OpenColorIO/ops/matrix/MatrixOp.h +++ b/src/OpenColorIO/ops/matrix/MatrixOp.h @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_MATRIXOFFSETOP_H #define INCLUDED_OCIO_MATRIXOFFSETOP_H @@ -18,62 +17,66 @@ namespace OCIO_NAMESPACE // Use whichever is most convenient; they are equally efficient. // Note that op is always created even if resulting op is a no-op. -void CreateScaleOp(OpRcPtrVec & ops, - const double * scale4, - TransformDirection direction); - -void CreateMatrixOp(OpRcPtrVec & ops, - const double * m44, - TransformDirection direction); - -void CreateOffsetOp(OpRcPtrVec & ops, - const double * offset4, - TransformDirection direction); - -void CreateMatrixOffsetOp(OpRcPtrVec & ops, - const double * m44, const double * offset4, - TransformDirection direction); - -void CreateScaleOffsetOp(OpRcPtrVec & ops, - const double * scale4, const double * offset4, - TransformDirection direction); - -void CreateFitOp(OpRcPtrVec & ops, - const double * oldmin4, const double * oldmax4, - const double * newmin4, const double * newmax4, - TransformDirection direction); - -void CreateSaturationOp(OpRcPtrVec & ops, - double sat, - const double * lumaCoef3, - TransformDirection direction); - -void CreateMatrixOffsetOp(OpRcPtrVec & ops, - const float * m44, const float * offset4, - TransformDirection direction); - -void CreateFitOp(OpRcPtrVec & ops, - const float * oldmin4, const float * oldmax4, - const float * newmin4, const float * newmax4, - TransformDirection direction); - -void CreateMinMaxOp(OpRcPtrVec & ops, - const double * from_min3, - const double * from_max3, - TransformDirection direction); - -void CreateMinMaxOp(OpRcPtrVec & ops, - float from_min, - float from_max, - TransformDirection direction); - -void CreateMatrixOp(OpRcPtrVec & ops, - MatrixOpData::MatrixArrayPtr & matrix, - TransformDirection direction); - -void CreateMatrixOp(OpRcPtrVec & ops, - MatrixOpDataRcPtr & matrix, - TransformDirection direction); +void CreateScaleOp(OpRcPtrVec & ops, const double * scale4, TransformDirection direction); + +void CreateMatrixOp(OpRcPtrVec & ops, const double * m44, TransformDirection direction); + +void CreateOffsetOp(OpRcPtrVec & ops, const double * offset4, TransformDirection direction); + +void CreateMatrixOffsetOp( + OpRcPtrVec & ops, + const double * m44, + const double * offset4, + TransformDirection direction); + +void CreateScaleOffsetOp( + OpRcPtrVec & ops, + const double * scale4, + const double * offset4, + TransformDirection direction); + +void CreateFitOp( + OpRcPtrVec & ops, + const double * oldmin4, + const double * oldmax4, + const double * newmin4, + const double * newmax4, + TransformDirection direction); + +void CreateSaturationOp( + OpRcPtrVec & ops, + double sat, + const double * lumaCoef3, + TransformDirection direction); + +void CreateMatrixOffsetOp( + OpRcPtrVec & ops, + const float * m44, + const float * offset4, + TransformDirection direction); + +void CreateFitOp( + OpRcPtrVec & ops, + const float * oldmin4, + const float * oldmax4, + const float * newmin4, + const float * newmax4, + TransformDirection direction); + +void CreateMinMaxOp( + OpRcPtrVec & ops, + const double * from_min3, + const double * from_max3, + TransformDirection direction); + +void CreateMinMaxOp(OpRcPtrVec & ops, float from_min, float from_max, TransformDirection direction); + +void CreateMatrixOp( + OpRcPtrVec & ops, + MatrixOpData::MatrixArrayPtr & matrix, + TransformDirection direction); + +void CreateMatrixOp(OpRcPtrVec & ops, MatrixOpDataRcPtr & matrix, TransformDirection direction); void CreateIdentityMatrixOp(OpRcPtrVec & ops); diff --git a/src/OpenColorIO/ops/matrix/MatrixOpCPU.cpp b/src/OpenColorIO/ops/matrix/MatrixOpCPU.cpp index a30e0d68ec..8f421e86a2 100644 --- a/src/OpenColorIO/ops/matrix/MatrixOpCPU.cpp +++ b/src/OpenColorIO/ops/matrix/MatrixOpCPU.cpp @@ -5,9 +5,9 @@ #include "BitDepthUtils.h" #include "MathUtils.h" -#include "ops/matrix/MatrixOpCPU.h" #include "Platform.h" #include "SSE.h" +#include "ops/matrix/MatrixOpCPU.h" namespace OCIO_NAMESPACE { @@ -17,7 +17,7 @@ namespace class ScaleRenderer : public OpCPU { public: - ScaleRenderer() = delete; + ScaleRenderer() = delete; ScaleRenderer(const ScaleRenderer &) = delete; explicit ScaleRenderer(ConstMatrixOpDataRcPtr & mat); @@ -30,7 +30,7 @@ class ScaleRenderer : public OpCPU class ScaleWithOffsetRenderer : public OpCPU { public: - ScaleWithOffsetRenderer() = delete; + ScaleWithOffsetRenderer() = delete; ScaleWithOffsetRenderer(const ScaleRenderer &) = delete; explicit ScaleWithOffsetRenderer(ConstMatrixOpDataRcPtr & mat); @@ -44,14 +44,13 @@ class ScaleWithOffsetRenderer : public OpCPU class MatrixWithOffsetRenderer : public OpCPU { public: - MatrixWithOffsetRenderer() = delete; + MatrixWithOffsetRenderer() = delete; MatrixWithOffsetRenderer(const MatrixWithOffsetRenderer &) = delete; explicit MatrixWithOffsetRenderer(ConstMatrixOpDataRcPtr & mat); void apply(const void * inImg, void * outImg, long numPixels) const override; private: - float m_column1[4]; float m_column2[4]; float m_column3[4]; @@ -63,7 +62,7 @@ class MatrixWithOffsetRenderer : public OpCPU class MatrixRenderer : public OpCPU { public: - MatrixRenderer() = delete; + MatrixRenderer() = delete; MatrixRenderer(const MatrixRenderer &) = delete; MatrixRenderer(ConstMatrixOpDataRcPtr & mat); @@ -90,7 +89,7 @@ ScaleRenderer::ScaleRenderer(ConstMatrixOpDataRcPtr & mat) void ScaleRenderer::apply(const void * inImg, void * outImg, long numPixels) const { const float * in = (const float *)inImg; - float * out = (float *)outImg; + float * out = (float *)outImg; for (long idx = 0; idx < numPixels; ++idx) { @@ -99,7 +98,7 @@ void ScaleRenderer::apply(const void * inImg, void * outImg, long numPixels) con out[2] = in[2] * m_scale[2]; out[3] = in[3] * m_scale[3]; - in += 4; + in += 4; out += 4; } } @@ -114,7 +113,7 @@ ScaleWithOffsetRenderer::ScaleWithOffsetRenderer(ConstMatrixOpDataRcPtr & mat) m_scale[2] = (float)m[10]; m_scale[3] = (float)m[15]; - const MatrixOpData::Offsets& o = mat->getOffsets(); + const MatrixOpData::Offsets & o = mat->getOffsets(); m_offset[0] = (float)o[0]; m_offset[1] = (float)o[1]; @@ -125,7 +124,7 @@ ScaleWithOffsetRenderer::ScaleWithOffsetRenderer(ConstMatrixOpDataRcPtr & mat) void ScaleWithOffsetRenderer::apply(const void * inImg, void * outImg, long numPixels) const { const float * in = (const float *)inImg; - float * out = (float *)outImg; + float * out = (float *)outImg; for (long idx = 0; idx < numPixels; ++idx) { @@ -134,7 +133,7 @@ void ScaleWithOffsetRenderer::apply(const void * inImg, void * outImg, long numP out[2] = in[2] * m_scale[2] + m_offset[2]; out[3] = in[3] * m_scale[3] + m_offset[3]; - in += 4; + in += 4; out += 4; } } @@ -142,9 +141,9 @@ void ScaleWithOffsetRenderer::apply(const void * inImg, void * outImg, long numP MatrixWithOffsetRenderer::MatrixWithOffsetRenderer(ConstMatrixOpDataRcPtr & mat) : OpCPU() { - const unsigned long dim = mat->getArray().getLength(); - const unsigned long twoDim = 2 * dim; - const unsigned long threeDim = 3 * dim; + const unsigned long dim = mat->getArray().getLength(); + const unsigned long twoDim = 2 * dim; + const unsigned long threeDim = 3 * dim; const ArrayDouble::Values & m = mat->getArray().getValues(); // Red multipliers. @@ -177,7 +176,6 @@ MatrixWithOffsetRenderer::MatrixWithOffsetRenderer(ConstMatrixOpDataRcPtr & mat) m_offset[1] = (float)o[1]; m_offset[2] = (float)o[2]; m_offset[3] = (float)o[3]; - } // Apply the rendering @@ -209,27 +207,15 @@ MatrixWithOffsetRenderer::MatrixWithOffsetRenderer(ConstMatrixOpDataRcPtr & mat) void MatrixWithOffsetRenderer::apply(const void * inImg, void * outImg, long numPixels) const { const float * in = (const float *)inImg; - float * out = (float *)outImg; + float * out = (float *)outImg; #if OCIO_USE_SSE2 // Matrix decomposition per _column. - __m128 m0 = _mm_set_ps(m_column1[3], - m_column1[2], - m_column1[1], - m_column1[0]); - __m128 m1 = _mm_set_ps(m_column2[3], - m_column2[2], - m_column2[1], - m_column2[0]); - __m128 m2 = _mm_set_ps(m_column3[3], - m_column3[2], - m_column3[1], - m_column3[0]); - __m128 m3 = _mm_set_ps(m_column4[3], - m_column4[2], - m_column4[1], - m_column4[0]); - __m128 o = _mm_set_ps(m_offset[3], m_offset[2], m_offset[1], m_offset[0]); + __m128 m0 = _mm_set_ps(m_column1[3], m_column1[2], m_column1[1], m_column1[0]); + __m128 m1 = _mm_set_ps(m_column2[3], m_column2[2], m_column2[1], m_column2[0]); + __m128 m2 = _mm_set_ps(m_column3[3], m_column3[2], m_column3[1], m_column3[0]); + __m128 m3 = _mm_set_ps(m_column4[3], m_column4[2], m_column4[1], m_column4[0]); + __m128 o = _mm_set_ps(m_offset[3], m_offset[2], m_offset[1], m_offset[0]); for (long idx = 0; idx < numPixels; ++idx) { @@ -244,11 +230,11 @@ void MatrixWithOffsetRenderer::apply(const void * inImg, void * outImg, long num __m128 am3 = _mm_mul_ps(m3, a); __m128 img = _mm_add_ps(_mm_add_ps(rm0, gm1), _mm_add_ps(bm2, am3)); - img = _mm_add_ps(img, o); + img = _mm_add_ps(img, o); _mm_storeu_ps(out, img); - in += 4; + in += 4; out += 4; } #else @@ -259,40 +245,27 @@ void MatrixWithOffsetRenderer::apply(const void * inImg, void * outImg, long num const float b = in[2]; const float a = in[3]; - out[0] = r*m_column1[0] - + g*m_column2[0] - + b*m_column3[0] - + a*m_column4[0] - + m_offset[0]; - out[1] = r*m_column1[1] - + g*m_column2[1] - + b*m_column3[1] - + a*m_column4[1] - + m_offset[1]; - out[2] = r*m_column1[2] - + g*m_column2[2] - + b*m_column3[2] - + a*m_column4[2] - + m_offset[2]; - out[3] = r*m_column1[3] - + g*m_column2[3] - + b*m_column3[3] - + a*m_column4[3] - + m_offset[3]; - - in += 4; + out[0] = r * m_column1[0] + g * m_column2[0] + b * m_column3[0] + a * m_column4[0] + + m_offset[0]; + out[1] = r * m_column1[1] + g * m_column2[1] + b * m_column3[1] + a * m_column4[1] + + m_offset[1]; + out[2] = r * m_column1[2] + g * m_column2[2] + b * m_column3[2] + a * m_column4[2] + + m_offset[2]; + out[3] = r * m_column1[3] + g * m_column2[3] + b * m_column3[3] + a * m_column4[3] + + m_offset[3]; + + in += 4; out += 4; } #endif - } MatrixRenderer::MatrixRenderer(ConstMatrixOpDataRcPtr & mat) : OpCPU() { - const unsigned long dim = mat->getArray().getLength(); - const unsigned long twoDim = 2 * dim; - const unsigned long threeDim = 3 * dim; + const unsigned long dim = mat->getArray().getLength(); + const unsigned long twoDim = 2 * dim; + const unsigned long threeDim = 3 * dim; const ArrayDouble::Values & m = mat->getArray().getValues(); // Red multipliers. @@ -323,26 +296,14 @@ MatrixRenderer::MatrixRenderer(ConstMatrixOpDataRcPtr & mat) void MatrixRenderer::apply(const void * inImg, void * outImg, long numPixels) const { const float * in = (const float *)inImg; - float * out = (float *)outImg; + float * out = (float *)outImg; #if OCIO_USE_SSE2 // Matrix decomposition per _column. - __m128 m0 = _mm_set_ps(m_column1[3], - m_column1[2], - m_column1[1], - m_column1[0]); - __m128 m1 = _mm_set_ps(m_column2[3], - m_column2[2], - m_column2[1], - m_column2[0]); - __m128 m2 = _mm_set_ps(m_column3[3], - m_column3[2], - m_column3[1], - m_column3[0]); - __m128 m3 = _mm_set_ps(m_column4[3], - m_column4[2], - m_column4[1], - m_column4[0]); + __m128 m0 = _mm_set_ps(m_column1[3], m_column1[2], m_column1[1], m_column1[0]); + __m128 m1 = _mm_set_ps(m_column2[3], m_column2[2], m_column2[1], m_column2[0]); + __m128 m2 = _mm_set_ps(m_column3[3], m_column3[2], m_column3[1], m_column3[0]); + __m128 m3 = _mm_set_ps(m_column4[3], m_column4[2], m_column4[1], m_column4[0]); for (long idx = 0; idx < numPixels; ++idx) { @@ -360,7 +321,7 @@ void MatrixRenderer::apply(const void * inImg, void * outImg, long numPixels) co _mm_storeu_ps(out, img); - in += 4; + in += 4; out += 4; } #else @@ -371,31 +332,19 @@ void MatrixRenderer::apply(const void * inImg, void * outImg, long numPixels) co const float b = in[2]; const float a = in[3]; - out[0] = r*m_column1[0] - + g*m_column2[0] - + b*m_column3[0] - + a*m_column4[0]; - out[1] = r*m_column1[1] - + g*m_column2[1] - + b*m_column3[1] - + a*m_column4[1]; - out[2] = r*m_column1[2] - + g*m_column2[2] - + b*m_column3[2] - + a*m_column4[2]; - out[3] = r*m_column1[3] - + g*m_column2[3] - + b*m_column3[3] - + a*m_column4[3]; - - in += 4; + out[0] = r * m_column1[0] + g * m_column2[0] + b * m_column3[0] + a * m_column4[0]; + out[1] = r * m_column1[1] + g * m_column2[1] + b * m_column3[1] + a * m_column4[1]; + out[2] = r * m_column1[2] + g * m_column2[2] + b * m_column3[2] + a * m_column4[2]; + out[3] = r * m_column1[3] + g * m_column2[3] + b * m_column3[3] + a * m_column4[3]; + + in += 4; out += 4; } #endif } -} +} // namespace ConstOpCPURcPtr GetMatrixRenderer(ConstMatrixOpDataRcPtr & mat) { @@ -428,4 +377,3 @@ ConstOpCPURcPtr GetMatrixRenderer(ConstMatrixOpDataRcPtr & mat) } } // namespace OCIO_NAMESPACE - diff --git a/src/OpenColorIO/ops/matrix/MatrixOpData.cpp b/src/OpenColorIO/ops/matrix/MatrixOpData.cpp index 9750b154eb..6ca0892523 100644 --- a/src/OpenColorIO/ops/matrix/MatrixOpData.cpp +++ b/src/OpenColorIO/ops/matrix/MatrixOpData.cpp @@ -1,15 +1,15 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. -#include #include +#include #include #include "HashUtils.h" #include "MathUtils.h" -#include "ops/matrix/MatrixOpData.h" #include "Platform.h" +#include "ops/matrix/MatrixOpData.h" namespace OCIO_NAMESPACE { @@ -27,7 +27,7 @@ MatrixOpData::Offsets::Offsets(const Offsets & o) memcpy(m_values, o.m_values, 4 * sizeof(double)); } -MatrixOpData::Offsets& MatrixOpData::Offsets::operator=(const Offsets & o) +MatrixOpData::Offsets & MatrixOpData::Offsets::operator=(const Offsets & o) { if (this != &o) { @@ -41,8 +41,7 @@ bool MatrixOpData::Offsets::operator==(const Offsets & o) const return (std::memcmp(m_values, o.m_values, 4 * sizeof(double)) == 0); } -template -void MatrixOpData::Offsets::setRGB(const T * v3) +template void MatrixOpData::Offsets::setRGB(const T * v3) { if (!v3) { @@ -58,8 +57,7 @@ void MatrixOpData::Offsets::setRGB(const T * v3) template void MatrixOpData::Offsets::setRGB(const float * v3); template void MatrixOpData::Offsets::setRGB(const double * v3); -template -void MatrixOpData::Offsets::setRGBA(const T * v4) +template void MatrixOpData::Offsets::setRGBA(const T * v4) { if (!v4) { @@ -77,8 +75,7 @@ template void MatrixOpData::Offsets::setRGBA(const double * v4); bool MatrixOpData::Offsets::isNotNull() const { - return m_values[0] != 0. || m_values[1] != 0. || - m_values[2] != 0. || m_values[3] != 0.; + return m_values[0] != 0. || m_values[1] != 0. || m_values[2] != 0. || m_values[3] != 0.; } void MatrixOpData::Offsets::scale(double s) @@ -97,9 +94,10 @@ MatrixOpData::MatrixArray::MatrixArray() MatrixOpData::MatrixArray & MatrixOpData::MatrixArray::operator=(const ArrayDouble & a) { - if (this == &a) return *this; + if (this == &a) + return *this; - *dynamic_cast(this) = a; + *dynamic_cast(this) = a; validate(); @@ -110,25 +108,25 @@ MatrixOpData::MatrixArrayPtr MatrixOpData::MatrixArray::inner(const MatrixArray { // Use operator= to make sure we have a 4x4 copy // of the original matrices. - MatrixArray A_4x4 = *this; - MatrixArray B_4x4 = B; + MatrixArray A_4x4 = *this; + MatrixArray B_4x4 = B; const ArrayDouble::Values & Avals = A_4x4.getValues(); const ArrayDouble::Values & Bvals = B_4x4.getValues(); - MatrixArrayPtr OutPtr = std::make_shared(); - ArrayDouble::Values& Ovals = OutPtr->getValues(); + MatrixArrayPtr OutPtr = std::make_shared(); + ArrayDouble::Values & Ovals = OutPtr->getValues(); const unsigned long dim = OutPtr->getLength(); // Note: The matrix elements are stored in the vector // in row-major order. // [ a00, a01, a02, a03, a10, a11, a12, a13, a20, ... a44 ] - for (unsigned long row = 0; row(); - MatrixArray & s = *invPtr; + MatrixArray & s = *invPtr; const unsigned long dim = invPtr->getLength(); // Inversion starts with identity (without bit-depth scaling). - s[0] = 1.; - s[5] = 1.; + s[0] = 1.; + s[5] = 1.; s[10] = 1.; s[15] = 1.; @@ -194,21 +192,21 @@ MatrixOpData::MatrixArrayPtr MatrixOpData::MatrixArray::inverse() const { int pivot = i; - double pivotsize = t[i*dim + i]; + double pivotsize = t[i * dim + i]; if (pivotsize < 0) pivotsize = -pivotsize; for (int j = i + 1; j < 4; j++) { - double tmp = t[j*dim + i]; + double tmp = t[j * dim + i]; if (tmp < 0.0) tmp = -tmp; if (tmp > pivotsize) { - pivot = j; + pivot = j; pivotsize = tmp; } } @@ -224,24 +222,24 @@ MatrixOpData::MatrixArrayPtr MatrixOpData::MatrixArray::inverse() const { double tmp; - tmp = t[i*dim + j]; - t[i*dim + j] = t[pivot*dim + j]; - t[pivot*dim + j] = tmp; + tmp = t[i * dim + j]; + t[i * dim + j] = t[pivot * dim + j]; + t[pivot * dim + j] = tmp; - tmp = s[i*dim + j]; - s[i*dim + j] = s[pivot*dim + j]; - s[pivot*dim + j] = tmp; + tmp = s[i * dim + j]; + s[i * dim + j] = s[pivot * dim + j]; + s[pivot * dim + j] = tmp; } } for (int j = i + 1; j < 4; j++) { - double f = t[j*dim + i] / t[i*dim + i]; + double f = t[j * dim + i] / t[i * dim + i]; for (int k = 0; k < 4; k++) { - t[j*dim + k] -= f * t[i*dim + k]; - s[j*dim + k] -= f * s[i*dim + k]; + t[j * dim + k] -= f * t[i * dim + k]; + s[j * dim + k] -= f * s[i * dim + k]; } } } @@ -254,25 +252,25 @@ MatrixOpData::MatrixArrayPtr MatrixOpData::MatrixArray::inverse() const // TODO: Perhaps change to throw even if f is near // zero (nearly singular). - if ((f = t[i*dim + i]) == 0.0) + if ((f = t[i * dim + i]) == 0.0) { throw Exception("Singular Matrix can't be inverted."); } for (int j = 0; j < 4; j++) { - t[i*dim + j] /= f; - s[i*dim + j] /= f; + t[i * dim + j] /= f; + s[i * dim + j] /= f; } for (int j = 0; j < i; j++) { - f = t[j*dim + i]; + f = t[j * dim + i]; for (int k = 0; k < 4; k++) { - t[j*dim + k] -= f * t[i*dim + k]; - s[j*dim + k] -= f * s[i*dim + k]; + t[j * dim + k] -= f * t[i * dim + k]; + s[j * dim + k] -= f * s[i * dim + k]; } } } @@ -280,23 +278,22 @@ MatrixOpData::MatrixArrayPtr MatrixOpData::MatrixArray::inverse() const return invPtr; } -template -void MatrixOpData::MatrixArray::setRGB(const T * values) +template void MatrixOpData::MatrixArray::setRGB(const T * values) { Values & v = getValues(); - v[ 0] = double(values[0]); - v[ 1] = double(values[1]); - v[ 2] = double(values[2]); - v[ 3] = 0.; + v[0] = double(values[0]); + v[1] = double(values[1]); + v[2] = double(values[2]); + v[3] = 0.; - v[ 4] = double(values[3]); - v[ 5] = double(values[4]); - v[ 6] = double(values[5]); - v[ 7] = 0.; + v[4] = double(values[3]); + v[5] = double(values[4]); + v[6] = double(values[5]); + v[7] = 0.; - v[ 8] = double(values[6]); - v[ 9] = double(values[7]); + v[8] = double(values[6]); + v[9] = double(values[7]); v[10] = double(values[8]); v[11] = 0.; @@ -316,23 +313,23 @@ unsigned long MatrixOpData::MatrixArray::getNumValues() const bool MatrixOpData::MatrixArray::isUnityDiagonal() const { - const unsigned long dim = getLength(); + const unsigned long dim = getLength(); const ArrayDouble::Values & values = getValues(); - for (unsigned long i = 0; i(this)->expandFrom3x3To4x4(); + const_cast(this)->expandFrom3x3To4x4(); } else if (getLength() != 4) { @@ -466,13 +463,12 @@ double MatrixOpData::getArrayValue(unsigned long index) const return m_array.getValues()[index]; } -void MatrixOpData::setRGB(const float* values) +void MatrixOpData::setRGB(const float * values) { m_array.setRGB(values); } -template -void MatrixOpData::setRGBA(const T * values) +template void MatrixOpData::setRGBA(const T * values) { m_array.setRGBA(values); } @@ -534,17 +530,17 @@ bool MatrixOpData::isIdentity() const const double maxDiff = 1e-6; - const ArrayDouble & a = getArray(); + const ArrayDouble & a = getArray(); const ArrayDouble::Values & m = a.getValues(); - const unsigned long dim = a.getLength(); + const unsigned long dim = a.getLength(); - for (unsigned long i = 0; i val ? max_val : val; - val = fabs(B->getOffsets()[i]); + val = fabs(B->getOffsets()[i]); max_val = max_val > val ? max_val : val; } @@ -728,18 +721,18 @@ MatrixOpDataRcPtr MatrixOpData::compose(ConstMatrixOpDataRcPtr & B) const void MatrixOpData::cleanUp(double offsetScale) { - const ArrayDouble & a = getArray(); + const ArrayDouble & a = getArray(); const ArrayDouble::Values & m = a.getValues(); - const unsigned long dim = a.getLength(); + const unsigned long dim = a.getLength(); // Estimate the magnitude of the matrix. double max_val = 0.; - for (unsigned long i = 0; i val ? max_val : val; + max_val = max_val > val ? max_val : val; } } @@ -749,17 +742,17 @@ void MatrixOpData::cleanUp(double offsetScale) // either from being written to files or via the factories that take float // args. In any case, the tolerance is small enough to pick up anything // that would be significant in the context of color management. - const double scale = max_val > 1e-4 ? max_val : 1e-4; + const double scale = max_val > 1e-4 ? max_val : 1e-4; const double abs_tol = scale * 1e-7; // Replace values that are close to integers by exact values. - for (unsigned long i = 0; i 1e-4 ? offsetScale : 1e-4; + const double scale2 = offsetScale > 1e-4 ? offsetScale : 1e-4; const double abs_tol2 = scale2 * 1e-7; - for (unsigned long i = 0; i(&other); + const MatrixOpData * mop = static_cast(&other); - return (m_direction == mop->m_direction && - m_offsets == mop->m_offsets && - m_array == mop->m_array); + return ( + m_direction == mop->m_direction && m_offsets == mop->m_offsets && m_array == mop->m_array); } void MatrixOpData::setDirection(TransformDirection dir) noexcept @@ -811,7 +804,7 @@ MatrixOpDataRcPtr MatrixOpData::getAsForward() const // TODO: Perhaps calculate pseudo-inverse rather than throw. // Calculate the inverse offset. - const Offsets& offsets = getOffsets(); + const Offsets & offsets = getOffsets(); Offsets invOffsets; if (offsets.isNotNull()) { @@ -819,8 +812,8 @@ MatrixOpDataRcPtr MatrixOpData::getAsForward() const invOffsets.scale(-1); } - MatrixOpDataRcPtr invOp = std::make_shared(); - invOp->m_fileInBitDepth = m_fileOutBitDepth; + MatrixOpDataRcPtr invOp = std::make_shared(); + invOp->m_fileInBitDepth = m_fileOutBitDepth; invOp->m_fileOutBitDepth = m_fileInBitDepth; invOp->setRGBA(&(invMatrixArray->getValues()[0])); @@ -848,12 +841,8 @@ std::string MatrixOpData::getCacheID() const cacheIDStream << TransformDirectionToString(m_direction) << " "; std::string hash; - hash += CacheIDHash( - (const char *) &(getArray().getValues()[0]), - 16 * sizeof(double)); - hash += CacheIDHash( - (const char *) getOffsets().getValues(), - 4 * sizeof(double)); + hash += CacheIDHash((const char *)&(getArray().getValues()[0]), 16 * sizeof(double)); + hash += CacheIDHash((const char *)getOffsets().getValues(), 4 * sizeof(double)); cacheIDStream << CacheIDHash(hash.c_str(), hash.size()); diff --git a/src/OpenColorIO/ops/matrix/MatrixOpData.h b/src/OpenColorIO/ops/matrix/MatrixOpData.h index 4b6448f20b..09195c4b09 100644 --- a/src/OpenColorIO/ops/matrix/MatrixOpData.h +++ b/src/OpenColorIO/ops/matrix/MatrixOpData.h @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_MATRIXOPDATA_H #define INCLUDED_OCIO_MATRIXOPDATA_H @@ -20,13 +19,13 @@ typedef OCIO_SHARED_PTR MatrixOpDataRcPtr; typedef OCIO_SHARED_PTR ConstMatrixOpDataRcPtr; // The class represents the Matrix op. -// +// // The class specifies a matrix transformation to be applied to // the input values. The input and output of a matrix are always // 4-component values. // An offset vector is also applied to the result. // The output values are calculated using the row-order convention: -// +// // Rout = a[0][0]*Rin + a[0][1]*Gin + a[0][2]*Bin + a[0][3]*Ain + o[0]; // Gout = a[1][0]*Rin + a[1][1]*Gin + a[1][2]*Bin + a[1][3]*Ain + o[1]; // Bout = a[2][0]*Rin + a[2][1]*Gin + a[2][2]*Bin + a[2][3]*Ain + o[2]; @@ -35,7 +34,6 @@ typedef OCIO_SHARED_PTR ConstMatrixOpDataRcPtr; class MatrixOpData : public OpData { public: - static MatrixOpDataRcPtr CreateDiagonalMatrix(double diagValue); class Offsets @@ -46,42 +44,28 @@ class MatrixOpData : public OpData Offsets(const Offsets & o); ~Offsets() = default; - Offsets& operator=(const Offsets & o); + Offsets & operator=(const Offsets & o); bool operator==(const Offsets & o) const; - template - void setRGB(const T * v3); + template void setRGB(const T * v3); - template - void setRGBA(const T * v4); + template void setRGBA(const T * v4); - inline const double & operator[](unsigned long index) const - { - return m_values[index]; - } + inline const double & operator[](unsigned long index) const { return m_values[index]; } - inline double & operator[](unsigned long index) - { - return m_values[index]; - } + inline double & operator[](unsigned long index) { return m_values[index]; } - inline const double * getValues() const - { - return m_values; - } + inline const double * getValues() const { return m_values; } - inline double * getValues() - { - return m_values; - } + inline double * getValues() { return m_values; } bool isNotNull() const; void scale(double s); private: - double m_values[4] {0., 0., 0., 0.}; + double m_values[4]{0., 0., 0., 0.}; }; class MatrixArray; @@ -91,9 +75,9 @@ class MatrixOpData : public OpData { public: MatrixArray(); - MatrixArray(const MatrixArray &) = default; + MatrixArray(const MatrixArray &) = default; MatrixArray & operator=(const MatrixArray & m) = default; - virtual ~MatrixArray() = default; + virtual ~MatrixArray() = default; MatrixArray & operator=(const ArrayDouble & a); @@ -107,13 +91,12 @@ class MatrixOpData : public OpData MatrixArrayPtr inner(const MatrixArray & B) const; MatrixArrayPtr inner(const MatrixArrayPtr & B) const; - // Inner product (multiplication) of the matrix with the offsets b. + // Inner product (multiplication) of the matrix with the offsets b. Offsets inner(const Offsets & b) const; MatrixArrayPtr inverse() const; - template - void setRGB(const T * values); + template void setRGB(const T * values); void setRGBA(const float * values); void setRGBA(const double * values); @@ -144,40 +127,21 @@ class MatrixOpData : public OpData // Set the RGB values (alpha reset to 0). void setRGB(const float * values); - template - void setRGBA(const T * values); + template void setRGBA(const T * values); - inline const Offsets & getOffsets() const - { - return m_offsets; - } + inline const Offsets & getOffsets() const { return m_offsets; } - inline Offsets & getOffsets() - { - return m_offsets; - } + inline Offsets & getOffsets() { return m_offsets; } double getOffsetValue(unsigned long index) const; - inline void setRGBOffsets(const float * offsets) - { - m_offsets.setRGB(offsets); - } + inline void setRGBOffsets(const float * offsets) { m_offsets.setRGB(offsets); } - inline void setRGBAOffsets(const float * offsets) - { - m_offsets.setRGBA(offsets); - } + inline void setRGBAOffsets(const float * offsets) { m_offsets.setRGBA(offsets); } - inline void setRGBAOffsets(const double * offsets) - { - m_offsets.setRGBA(offsets); - } + inline void setRGBAOffsets(const double * offsets) { m_offsets.setRGBA(offsets); } - inline void setOffsets(const Offsets & offsets) - { - m_offsets = offsets; - } + inline void setOffsets(const Offsets & offsets) { m_offsets = offsets; } void setOffsetValue(unsigned long index, double value); @@ -230,16 +194,15 @@ class MatrixOpData : public OpData void scale(double inScale, double outScale); private: - MatrixArray m_array; - Offsets m_offsets; + Offsets m_offsets; // In bit-depth to be used for file I/O. BitDepth m_fileInBitDepth = BIT_DEPTH_UNKNOWN; // Out bit-depth to be used for file I/O. BitDepth m_fileOutBitDepth = BIT_DEPTH_UNKNOWN; - TransformDirection m_direction{ TRANSFORM_DIR_FORWARD }; + TransformDirection m_direction{TRANSFORM_DIR_FORWARD}; }; bool operator==(const MatrixOpData & lhs, const MatrixOpData & rhs); diff --git a/src/OpenColorIO/ops/matrix/MatrixOpGPU.cpp b/src/OpenColorIO/ops/matrix/MatrixOpGPU.cpp index 3641b895ab..b66e42f62e 100644 --- a/src/OpenColorIO/ops/matrix/MatrixOpGPU.cpp +++ b/src/OpenColorIO/ops/matrix/MatrixOpGPU.cpp @@ -1,16 +1,16 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #include #include "ops/matrix/MatrixOpGPU.h" - namespace OCIO_NAMESPACE { -void GetMatrixGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, ConstMatrixOpDataRcPtr & matrix) +void GetMatrixGPUShaderProgram( + GpuShaderCreatorRcPtr & shaderCreator, + ConstMatrixOpDataRcPtr & matrix) { GpuShaderText ss(shaderCreator->getLanguage()); ss.indent(); @@ -27,37 +27,37 @@ void GetMatrixGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, ConstMatri const std::string pxl(shaderCreator->getPixelName()); - ss.newLine() << ss.float4Decl("res") - << " = " << ss.float4Const(pxl + ".rgb.r", - pxl + ".rgb.g", - pxl + ".rgb.b", - pxl + ".a") << ";"; + ss.newLine() << ss.float4Decl("res") << " = " + << ss.float4Const(pxl + ".rgb.r", pxl + ".rgb.g", pxl + ".rgb.b", pxl + ".a") + << ";"; if (!matrix->isUnityDiagonal()) { if (matrix->isDiagonal()) { ss.newLine() << "res = " - << ss.float4Const((float)values[0], - (float)values[5], - (float)values[10], - (float)values[15]) + << ss.float4Const( + (float)values[0], + (float)values[5], + (float)values[10], + (float)values[15]) << " * res;"; } else { // NOTE: The in-place matrix computation is not supported by OSL so, // a temporary variable is needed. - ss.newLine() << ss.float4Decl("tmp") << " = res;"; + ss.newLine() << ss.float4Decl("tmp") << " = res;"; ss.newLine() << "res = " << ss.mat4fMul(&values[0], "tmp") << ";"; } } if (matrix->hasOffsets()) { - ss.newLine() << "res = " - << ss.float4Const((float)offs[0], (float)offs[1], (float)offs[2], (float)offs[3]) - << " + res;"; + ss.newLine() + << "res = " + << ss.float4Const((float)offs[0], (float)offs[1], (float)offs[2], (float)offs[3]) + << " + res;"; } ss.newLine() << pxl << ".rgb = " << ss.float3Const("res.x", "res.y", "res.z") << ";"; diff --git a/src/OpenColorIO/ops/matrix/MatrixOpGPU.h b/src/OpenColorIO/ops/matrix/MatrixOpGPU.h index 4b2c679bcf..7049496286 100644 --- a/src/OpenColorIO/ops/matrix/MatrixOpGPU.h +++ b/src/OpenColorIO/ops/matrix/MatrixOpGPU.h @@ -12,11 +12,10 @@ namespace OCIO_NAMESPACE { -void GetMatrixGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, - ConstMatrixOpDataRcPtr & matrix); +void GetMatrixGPUShaderProgram( + GpuShaderCreatorRcPtr & shaderCreator, + ConstMatrixOpDataRcPtr & matrix); } // namespace OCIO_NAMESPACE #endif // INCLUDED_OCIO_GPU_MATRIXOP_H - - diff --git a/src/OpenColorIO/ops/noop/NoOps.cpp b/src/OpenColorIO/ops/noop/NoOps.cpp index cf71b1fde5..0de1d25488 100644 --- a/src/OpenColorIO/ops/noop/NoOps.cpp +++ b/src/OpenColorIO/ops/noop/NoOps.cpp @@ -1,19 +1,17 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #include #include #include -#include "ops/allocation/AllocationOp.h" #include "NoOps.h" -#include "OpBuilders.h" #include "Op.h" +#include "OpBuilders.h" +#include "ops/allocation/AllocationOp.h" #include "ops/lut3d/Lut3DOp.h" - namespace OCIO_NAMESPACE { @@ -22,13 +20,13 @@ namespace class AllocationNoOp : public Op { public: - AllocationNoOp() = delete; - AllocationNoOp(const AllocationNoOp &) = delete; - AllocationNoOp& operator=(const AllocationNoOp &) = delete; + AllocationNoOp() = delete; + AllocationNoOp(const AllocationNoOp &) = delete; + AllocationNoOp & operator=(const AllocationNoOp &) = delete; explicit AllocationNoOp(const AllocationData & allocationData) - : Op() - , m_allocationData(allocationData) + : Op() + , m_allocationData(allocationData) { data().reset(new NoOpData()); } @@ -49,7 +47,9 @@ class AllocationNoOp : public Op void apply(void * /*img*/, long /*numPixels*/) const override {} void apply(const void * inImg, void * outImg, long numPixels) const override - { memcpy(outImg, inImg, numPixels * 4 * sizeof(float)); } + { + memcpy(outImg, inImg, numPixels * 4 * sizeof(float)); + } void extractGpuShaderInfo(GpuShaderCreatorRcPtr & /*shaderCreator*/) const override {} @@ -70,13 +70,15 @@ OpRcPtr AllocationNoOp::clone() const bool AllocationNoOp::isSameType(ConstOpRcPtr & op) const { ConstAllocationNoOpRcPtr typedRcPtr = DynamicPtrCast(op); - if(!typedRcPtr) return false; + if (!typedRcPtr) + return false; return true; } bool AllocationNoOp::isInverse(ConstOpRcPtr & op) const { - if(!isSameType(op)) return false; + if (!isSameType(op)) + return false; return true; } @@ -93,20 +95,19 @@ void AllocationNoOp::getGpuAllocation(AllocationData & allocation) const // Return whether the op defines an Allocation bool DefinesGpuAllocation(const OpRcPtr & op) { - ConstAllocationNoOpRcPtr allocationNoOpRcPtr = - DynamicPtrCast(op); + ConstAllocationNoOpRcPtr allocationNoOpRcPtr = DynamicPtrCast(op); - if(allocationNoOpRcPtr) return true; + if (allocationNoOpRcPtr) + return true; return false; } -} +} // namespace void CreateGpuAllocationNoOp(OpRcPtrVec & ops, const AllocationData & allocationData) { - ops.push_back( std::make_shared(allocationData) ); + ops.push_back(std::make_shared(allocationData)); } - namespace { // Find the minimal index range in the opVec that does not support @@ -118,26 +119,26 @@ namespace // If the entire opVec supports GPU generation, both the // startIndex and endIndex will equal -1 -void GetGpuUnsupportedIndexRange(int * startIndex, int * endIndex, - const OpRcPtrVec & opVec) +void GetGpuUnsupportedIndexRange(int * startIndex, int * endIndex, const OpRcPtrVec & opVec) { int start = -1; - int end = -1; + int end = -1; - for(unsigned int i=0; isupportedByLegacyShader()) + if (!opVec[i]->supportedByLegacyShader()) { - if(start<0) + if (start < 0) { start = i; - end = i; + end = i; } - else end = i; + else + end = i; } } @@ -145,24 +146,24 @@ void GetGpuUnsupportedIndexRange(int * startIndex, int * endIndex, // one that defines a GpuAllocation. (we can only upload to // the gpu at a location are tagged with an allocation) - while(start>0) + while (start > 0) { - if(DefinesGpuAllocation(opVec[start])) break; - --start; + if (DefinesGpuAllocation(opVec[start])) + break; + --start; } - if(startIndex) *startIndex = start; - if(endIndex) *endIndex = end; + if (startIndex) + *startIndex = start; + if (endIndex) + *endIndex = end; } - -bool GetGpuAllocation(AllocationData & allocation, - const OpRcPtr & op) +bool GetGpuAllocation(AllocationData & allocation, const OpRcPtr & op) { - AllocationNoOpRcPtr allocationNoOpRcPtr = - DynamicPtrCast(op); + AllocationNoOpRcPtr allocationNoOpRcPtr = DynamicPtrCast(op); - if(!allocationNoOpRcPtr) + if (!allocationNoOpRcPtr) { return false; } @@ -170,34 +171,35 @@ bool GetGpuAllocation(AllocationData & allocation, allocationNoOpRcPtr->getGpuAllocation(allocation); return true; } -} +} // namespace OpRcPtrVec Create3DLut(const OpRcPtrVec & ops, unsigned edgelen) { - if(ops.size()==0) return OpRcPtrVec(); + if (ops.size() == 0) + return OpRcPtrVec(); const unsigned lut3DEdgeLen = edgelen; - const unsigned lut3DNumPixels = lut3DEdgeLen*lut3DEdgeLen*lut3DEdgeLen; + const unsigned lut3DNumPixels = lut3DEdgeLen * lut3DEdgeLen * lut3DEdgeLen; Lut3DOpDataRcPtr lut = std::make_shared(lut3DEdgeLen); // Allocate 3D LUT image, RGBA - std::vector lut3D(lut3DNumPixels*4); + std::vector lut3D(lut3DNumPixels * 4); GenerateIdentityLut3D(&lut3D[0], lut3DEdgeLen, 4, LUT3DORDER_FAST_BLUE); // Apply the lattice ops to it - for(const auto & op : ops) + for (const auto & op : ops) { op->apply(&lut3D[0], &lut3D[0], lut3DNumPixels); } // Convert the RGBA image to an RGB image, in place. auto & lutArray = lut->getArray(); - for(unsigned i=0; iclone() ); + gpuPreOps.push_back(ops[i]->clone()); } } // Analytical -> 3D LUT -> analytical else { // Handle analytical shader block before start index. - for(int i=0; iclone() ); + gpuPreOps.push_back(ops[i]->clone()); } // Get the GPU Allocation at the cross-over point @@ -253,7 +253,7 @@ void PartitionGPUOps(OpRcPtrVec & gpuPreOps, // color-wise AllocationData allocation; - if(gpuLut3DOpStartIndex<0 || gpuLut3DOpStartIndex>=(int)ops.size()) + if (gpuLut3DOpStartIndex < 0 || gpuLut3DOpStartIndex >= (int)ops.size()) { std::ostringstream error; error << "Invalid GpuUnsupportedIndexRange: "; @@ -266,22 +266,22 @@ void PartitionGPUOps(OpRcPtrVec & gpuPreOps, // If the specified location defines an allocation, use it. // It's possible that this index wont define an allocation. // (For example in the case of getProcessor(FileTransform) - if(GetGpuAllocation(allocation, ops[gpuLut3DOpStartIndex])) + if (GetGpuAllocation(allocation, ops[gpuLut3DOpStartIndex])) { CreateAllocationOps(gpuPreOps, allocation, TRANSFORM_DIR_FORWARD); CreateAllocationOps(gpuLatticeOps, allocation, TRANSFORM_DIR_INVERSE); } // Handle cpu lattice processing - for(int i=gpuLut3DOpStartIndex; i<=gpuLut3DOpEndIndex; ++i) + for (int i = gpuLut3DOpStartIndex; i <= gpuLut3DOpEndIndex; ++i) { - gpuLatticeOps.push_back( ops[i]->clone() ); + gpuLatticeOps.push_back(ops[i]->clone()); } // And then handle the gpu post processing - for(int i=gpuLut3DOpEndIndex+1; i<(int)ops.size(); ++i) + for (int i = gpuLut3DOpEndIndex + 1; i < (int)ops.size(); ++i) { - gpuPostOps.push_back( ops[i]->clone() ); + gpuPostOps.push_back(ops[i]->clone()); } } } @@ -293,9 +293,9 @@ namespace class FileNoOp : public Op { public: - FileNoOp() = delete; - FileNoOp(const FileNoOp &) = delete; - FileNoOp& operator=(const FileNoOp &) = delete; + FileNoOp() = delete; + FileNoOp(const FileNoOp &) = delete; + FileNoOp & operator=(const FileNoOp &) = delete; explicit FileNoOp(const std::string & fileReference) : Op() @@ -320,7 +320,9 @@ class FileNoOp : public Op void apply(void * /*img*/, long /*numPixels*/) const override {} void apply(const void * inImg, void * outImg, long numPixels) const override - { memcpy(outImg, inImg, numPixels * 4 * sizeof(float)); } + { + memcpy(outImg, inImg, numPixels * 4 * sizeof(float)); + } void extractGpuShaderInfo(GpuShaderCreatorRcPtr & /*shaderCreator*/) const override {} @@ -340,7 +342,8 @@ OpRcPtr FileNoOp::clone() const bool FileNoOp::isSameType(ConstOpRcPtr & op) const { ConstFileNoOpRcPtr typedRcPtr = DynamicPtrCast(op); - if(!typedRcPtr) return false; + if (!typedRcPtr) + return false; return true; } @@ -360,17 +363,13 @@ std::string FileNoOp::getCacheID() const return m_fileReference; } -} +} // namespace -void CreateFileNoOp(OpRcPtrVec & ops, - const std::string & fileReference) +void CreateFileNoOp(OpRcPtrVec & ops, const std::string & fileReference) { - ops.push_back( std::make_shared(fileReference) ); + ops.push_back(std::make_shared(fileReference)); } - - - //////////////////////////////////////////////////////////////////////////// namespace @@ -378,13 +377,13 @@ namespace class LookNoOp : public Op { public: - LookNoOp() = delete; - LookNoOp(const LookNoOp &) = delete; - LookNoOp& operator=(const LookNoOp &) = delete; + LookNoOp() = delete; + LookNoOp(const LookNoOp &) = delete; + LookNoOp & operator=(const LookNoOp &) = delete; explicit LookNoOp(const std::string & look) - : Op() - , m_look(look) + : Op() + , m_look(look) { data().reset(new NoOpData()); } @@ -406,7 +405,9 @@ class LookNoOp : public Op void apply(void * /*img*/, long /*numPixels*/) const override {} void apply(const void * inImg, void * outImg, long numPixels) const override - { memcpy(outImg, inImg, numPixels * 4 * sizeof(float)); } + { + memcpy(outImg, inImg, numPixels * 4 * sizeof(float)); + } void extractGpuShaderInfo(GpuShaderCreatorRcPtr & /*shaderCreator*/) const override {} @@ -425,7 +426,8 @@ OpRcPtr LookNoOp::clone() const bool LookNoOp::isSameType(ConstOpRcPtr & op) const { ConstLookNoOpRcPtr typedRcPtr = DynamicPtrCast(op); - if(!typedRcPtr) return false; + if (!typedRcPtr) + return false; return true; } @@ -444,13 +446,11 @@ std::string LookNoOp::getCacheID() const return m_look; } -} +} // namespace -void CreateLookNoOp(OpRcPtrVec & ops, - const std::string & look) +void CreateLookNoOp(OpRcPtrVec & ops, const std::string & look) { - ops.push_back( std::make_shared(look) ); + ops.push_back(std::make_shared(look)); } } // namespace OCIO_NAMESPACE - diff --git a/src/OpenColorIO/ops/noop/NoOps.h b/src/OpenColorIO/ops/noop/NoOps.h index 8141cbe01e..cbe37fbad1 100644 --- a/src/OpenColorIO/ops/noop/NoOps.h +++ b/src/OpenColorIO/ops/noop/NoOps.h @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_GPUALLOCATIONNOOP_H #define INCLUDED_OCIO_GPUALLOCATIONNOOP_H @@ -25,21 +24,23 @@ OpRcPtrVec Create3DLut(const OpRcPtrVec & ops, unsigned edgelen); // Additional ops will optionally be inserted to take into account // allocation transformations -void PartitionGPUOps(OpRcPtrVec & gpuPreOps, - OpRcPtrVec & gpuLatticeOps, - OpRcPtrVec & gpuPostOps, - const OpRcPtrVec & ops); +void PartitionGPUOps( + OpRcPtrVec & gpuPreOps, + OpRcPtrVec & gpuLatticeOps, + OpRcPtrVec & gpuPostOps, + const OpRcPtrVec & ops); -void CreateFileNoOp(OpRcPtrVec & ops, - const std::string & fname); +void CreateFileNoOp(OpRcPtrVec & ops, const std::string & fname); -void CreateLookNoOp(OpRcPtrVec & ops, - const std::string & lookName); +void CreateLookNoOp(OpRcPtrVec & ops, const std::string & lookName); class NoOpData : public OpData { public: - NoOpData() : OpData() { } + NoOpData() + : OpData() + { + } NoOpData(const NoOpData &) = delete; Type getType() const override { return NoOpType; } @@ -56,13 +57,17 @@ class NoOpData : public OpData class FileNoOpData : public NoOpData { public: - FileNoOpData() = delete; + FileNoOpData() = delete; FileNoOpData(const FileNoOpData &) = delete; - FileNoOpData(const std::string & path) : NoOpData(), m_path(path) { } + FileNoOpData(const std::string & path) + : NoOpData() + , m_path(path) + { + } const std::string & getPath() const { return m_path; } void setComplete() const { m_complete = true; } - bool getComplete() const { return m_complete; } + bool getComplete() const { return m_complete; } private: std::string m_path; @@ -73,7 +78,6 @@ class FileNoOpData : public NoOpData typedef OCIO_SHARED_PTR FileNoOpDataRcPtr; typedef OCIO_SHARED_PTR ConstFileNoOpDataRcPtr; - } // namespace OCIO_NAMESPACE #endif diff --git a/src/OpenColorIO/ops/range/RangeOp.cpp b/src/OpenColorIO/ops/range/RangeOp.cpp index f708908fbd..05b5f0ff29 100644 --- a/src/OpenColorIO/ops/range/RangeOp.cpp +++ b/src/OpenColorIO/ops/range/RangeOp.cpp @@ -13,9 +13,9 @@ #include "MathUtils.h" #include "ops/lut1d/Lut1DOpData.h" #include "ops/lut3d/Lut3DOpData.h" +#include "ops/range/RangeOp.h" #include "ops/range/RangeOpCPU.h" #include "ops/range/RangeOpGPU.h" -#include "ops/range/RangeOp.h" #include "transforms/RangeTransform.h" namespace OCIO_NAMESPACE @@ -56,12 +56,10 @@ class RangeOp : public Op protected: ConstRangeOpDataRcPtr rangeData() const { return DynamicPtrCast(data()); } RangeOpDataRcPtr rangeData() { return DynamicPtrCast(data()); } - }; - RangeOp::RangeOp(RangeOpDataRcPtr & range) - : Op() + : Op() { range->validate(); data() = range; @@ -101,8 +99,8 @@ bool RangeOp::isInverse(ConstOpRcPtr & /* op */) const bool RangeOp::canCombineWith(ConstOpRcPtr & op2) const { auto opData2 = op2->data(); - auto type2 = opData2->getType(); - auto range1 = rangeData(); + auto type2 = opData2->getType(); + auto range1 = rangeData(); // Need to validate prior to calling isIdentity to make sure scale and offset are updated. range1->validate(); @@ -149,13 +147,13 @@ bool RangeOp::canCombineWith(ConstOpRcPtr & op2) const void RangeOp::combineWith(OpRcPtrVec & ops, ConstOpRcPtr & secondOp) const { - if(!canCombineWith(secondOp)) + if (!canCombineWith(secondOp)) { throw Exception("RangeOp: canCombineWith must be checked before calling combineWith."); } auto opData = secondOp->data(); - auto type = opData->getType(); + auto type = opData->getType(); if (type == OpData::Lut1DType || type == OpData::Lut3DType) { // Avoid clone (we actually want to use the second op). @@ -165,10 +163,10 @@ void RangeOp::combineWith(OpRcPtrVec & ops, ConstOpRcPtr & secondOp) const else { // Range + Range. - auto range1 = rangeData(); + auto range1 = rangeData(); auto typedRcPtr = DynamicPtrCast(secondOp); - auto range2 = typedRcPtr->rangeData(); - auto resRange = range1->compose(range2); + auto range2 = typedRcPtr->rangeData(); + auto resRange = range1->compose(range2); CreateRangeOp(ops, resRange, TRANSFORM_DIR_FORWARD); } } @@ -209,19 +207,17 @@ void RangeOp::extractGpuShaderInfo(GpuShaderCreatorRcPtr & shaderCreator) const GetRangeGPUShaderProgram(shaderCreator, data); } -} // Anon namespace - - - +} // namespace /////////////////////////////////////////////////////////////////////////// - - -void CreateRangeOp(OpRcPtrVec & ops, - double minInValue, double maxInValue, - double minOutValue, double maxOutValue, - TransformDirection direction) +void CreateRangeOp( + OpRcPtrVec & ops, + double minInValue, + double maxInValue, + double minOutValue, + double maxOutValue, + TransformDirection direction) { auto data = std::make_shared(minInValue, maxInValue, minOutValue, maxOutValue); @@ -233,7 +229,7 @@ void CreateRangeOp(OpRcPtrVec & ops, RangeOpDataRcPtr & rangeData, TransformDire auto range = rangeData; if (direction == TRANSFORM_DIR_INVERSE) { - range = rangeData->clone(); + range = rangeData->clone(); auto newDir = CombineTransformDirections(range->getDirection(), direction); range->setDirection(newDir); } @@ -251,7 +247,7 @@ void CreateRangeTransform(GroupTransformRcPtr & group, ConstOpRcPtr & op) throw Exception("CreateRangeTransform: op has to be a RangeOp"); } RangeTransformRcPtr rangeTransform = RangeTransform::Create(); - RangeOpData & data = dynamic_cast(rangeTransform.get())->data(); + RangeOpData & data = dynamic_cast(rangeTransform.get())->data(); ConstRangeOpDataRcPtr rangeDataSrc = DynamicPtrCast(op->data()); @@ -260,11 +256,9 @@ void CreateRangeTransform(GroupTransformRcPtr & group, ConstOpRcPtr & op) group->appendTransform(rangeTransform); } -void BuildRangeOp(OpRcPtrVec & ops, - const RangeTransform & transform, - TransformDirection dir) +void BuildRangeOp(OpRcPtrVec & ops, const RangeTransform & transform, TransformDirection dir) { - const auto & data = dynamic_cast(&transform)->data(); + const auto & data = dynamic_cast(&transform)->data(); data.validate(); diff --git a/src/OpenColorIO/ops/range/RangeOp.h b/src/OpenColorIO/ops/range/RangeOp.h index 4ec2194662..f0204abb64 100644 --- a/src/OpenColorIO/ops/range/RangeOp.h +++ b/src/OpenColorIO/ops/range/RangeOp.h @@ -1,11 +1,9 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_RANGEOP_H #define INCLUDED_OCIO_RANGEOP_H - #include #include @@ -13,20 +11,20 @@ #include "Op.h" #include "ops/range/RangeOpData.h" - namespace OCIO_NAMESPACE { // Create a range op from its input and output bounds. -void CreateRangeOp(OpRcPtrVec & ops, - double minInValue, double maxInValue, - double minOutValue, double maxOutValue, - TransformDirection direction); +void CreateRangeOp( + OpRcPtrVec & ops, + double minInValue, + double maxInValue, + double minOutValue, + double maxOutValue, + TransformDirection direction); // Create a range op from an OpData Range. -void CreateRangeOp(OpRcPtrVec & ops, - RangeOpDataRcPtr & rangeData, - TransformDirection direction); +void CreateRangeOp(OpRcPtrVec & ops, RangeOpDataRcPtr & rangeData, TransformDirection direction); // Create a copy of the range transform in the op and append it to the GroupTransform. void CreateRangeTransform(GroupTransformRcPtr & group, ConstOpRcPtr & op); diff --git a/src/OpenColorIO/ops/range/RangeOpCPU.cpp b/src/OpenColorIO/ops/range/RangeOpCPU.cpp index b78c458b46..b60a9a0e91 100644 --- a/src/OpenColorIO/ops/range/RangeOpCPU.cpp +++ b/src/OpenColorIO/ops/range/RangeOpCPU.cpp @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #include #include @@ -16,7 +15,6 @@ namespace OCIO_NAMESPACE class RangeOpCPU : public OpCPU { public: - RangeOpCPU(ConstRangeOpDataRcPtr & range); protected: @@ -61,13 +59,12 @@ class RangeMaxRenderer : public RangeOpCPU virtual void apply(const void * inImg, void * outImg, long numPixels) const override; }; - RangeOpCPU::RangeOpCPU(ConstRangeOpDataRcPtr & range) - : OpCPU() - , m_scale(0.0f) - , m_offset(0.0f) - , m_lowerBound(0.0f) - , m_upperBound(0.0f) + : OpCPU() + , m_scale(0.0f) + , m_offset(0.0f) + , m_lowerBound(0.0f) + , m_upperBound(0.0f) { m_scale = (float)range->getScale(); m_offset = (float)range->getOffset(); @@ -76,20 +73,19 @@ RangeOpCPU::RangeOpCPU(ConstRangeOpDataRcPtr & range) } RangeScaleMinMaxRenderer::RangeScaleMinMaxRenderer(ConstRangeOpDataRcPtr & range) - : RangeOpCPU(range) + : RangeOpCPU(range) { } void RangeScaleMinMaxRenderer::apply(const void * inImg, void * outImg, long numPixels) const { const float * in = (const float *)inImg; - float * out = (float *)outImg; + float * out = (float *)outImg; - for(long idx=0; idx #include "ops/range/RangeOpData.h" - namespace OCIO_NAMESPACE { @@ -18,5 +15,4 @@ ConstOpCPURcPtr GetRangeRenderer(ConstRangeOpDataRcPtr & range); } // namespace OCIO_NAMESPACE - #endif \ No newline at end of file diff --git a/src/OpenColorIO/ops/range/RangeOpData.cpp b/src/OpenColorIO/ops/range/RangeOpData.cpp index 7d3509baf2..e75f304c75 100644 --- a/src/OpenColorIO/ops/range/RangeOpData.cpp +++ b/src/OpenColorIO/ops/range/RangeOpData.cpp @@ -7,9 +7,9 @@ #include "BitDepthUtils.h" #include "MathUtils.h" +#include "Platform.h" #include "fileformats/ctf/IndexMapping.h" #include "ops/range/RangeOpData.h" -#include "Platform.h" namespace OCIO_NAMESPACE { @@ -19,46 +19,47 @@ namespace DefaultValues const int FLOAT_DECIMALS = 7; } - RangeOpData::RangeOpData() - : OpData() - , m_minInValue(RangeOpData::EmptyValue()) - , m_maxInValue(RangeOpData::EmptyValue()) - , m_minOutValue(RangeOpData::EmptyValue()) - , m_maxOutValue(RangeOpData::EmptyValue()) + : OpData() + , m_minInValue(RangeOpData::EmptyValue()) + , m_maxInValue(RangeOpData::EmptyValue()) + , m_minOutValue(RangeOpData::EmptyValue()) + , m_maxOutValue(RangeOpData::EmptyValue()) - , m_scale(1.) - , m_offset(0.) + , m_scale(1.) + , m_offset(0.) { } -RangeOpData::RangeOpData(double minInValue, - double maxInValue, - double minOutValue, - double maxOutValue) - : OpData() - , m_minInValue(minInValue) - , m_maxInValue(maxInValue) - , m_minOutValue(minOutValue) - , m_maxOutValue(maxOutValue) - , m_scale(0.) - , m_offset(0.) +RangeOpData::RangeOpData( + double minInValue, + double maxInValue, + double minOutValue, + double maxOutValue) + : OpData() + , m_minInValue(minInValue) + , m_maxInValue(maxInValue) + , m_minOutValue(minOutValue) + , m_maxOutValue(maxOutValue) + , m_scale(0.) + , m_offset(0.) { validate(); } -RangeOpData::RangeOpData(double minInValue, - double maxInValue, - double minOutValue, - double maxOutValue, - TransformDirection dir) - : OpData() - , m_minInValue(minInValue) - , m_maxInValue(maxInValue) - , m_minOutValue(minOutValue) - , m_maxOutValue(maxOutValue) - , m_scale(0.) - , m_offset(0.) +RangeOpData::RangeOpData( + double minInValue, + double maxInValue, + double minOutValue, + double maxOutValue, + TransformDirection dir) + : OpData() + , m_minInValue(minInValue) + , m_maxInValue(maxInValue) + , m_minOutValue(minOutValue) + , m_maxOutValue(maxOutValue) + , m_scale(0.) + , m_offset(0.) { setDirection(dir); validate(); @@ -66,14 +67,14 @@ RangeOpData::RangeOpData(double minInValue, RangeOpData::RangeOpData(const IndexMapping & pIM, unsigned int len, BitDepth bitdepth) : OpData() - , m_minInValue(RangeOpData::EmptyValue()) - , m_maxInValue(RangeOpData::EmptyValue()) - , m_minOutValue(RangeOpData::EmptyValue()) - , m_maxOutValue(RangeOpData::EmptyValue()) - , m_scale(0.) - , m_offset(0.) - , m_fileInBitDepth(bitdepth) - , m_fileOutBitDepth(bitdepth) + , m_minInValue(RangeOpData::EmptyValue()) + , m_maxInValue(RangeOpData::EmptyValue()) + , m_minOutValue(RangeOpData::EmptyValue()) + , m_maxOutValue(RangeOpData::EmptyValue()) + , m_scale(0.) + , m_offset(0.) + , m_fileInBitDepth(bitdepth) + , m_fileOutBitDepth(bitdepth) { if (pIM.getDimension() != 2) { @@ -96,7 +97,7 @@ RangeOpData::RangeOpData(const IndexMapping & pIM, unsigned int len, BitDepth bi // are already clipped safely on input to the LUT renderers). pIM.getPair(1u, first, second); - m_maxInValue = first * scaleIn; + m_maxInValue = first * scaleIn; m_maxOutValue = second / (double)(len - 1u); validate(); @@ -116,66 +117,62 @@ void RangeOpData::setMinInValue(double value) m_minInValue = value; } -bool RangeOpData::hasMinInValue() const +bool RangeOpData::hasMinInValue() const { return !IsNan((float)m_minInValue); } void RangeOpData::unsetMinInValue() { - m_minInValue = EmptyValue(); + m_minInValue = EmptyValue(); } - void RangeOpData::setMaxInValue(double value) { m_maxInValue = value; } -bool RangeOpData::hasMaxInValue() const +bool RangeOpData::hasMaxInValue() const { return !IsNan((float)m_maxInValue); } void RangeOpData::unsetMaxInValue() { - m_maxInValue = EmptyValue(); + m_maxInValue = EmptyValue(); } - void RangeOpData::setMinOutValue(double value) { m_minOutValue = value; } -bool RangeOpData::hasMinOutValue() const +bool RangeOpData::hasMinOutValue() const { return !IsNan((float)m_minOutValue); } void RangeOpData::unsetMinOutValue() { - m_minOutValue = EmptyValue(); + m_minOutValue = EmptyValue(); } - void RangeOpData::setMaxOutValue(double value) { m_maxOutValue = value; } -bool RangeOpData::hasMaxOutValue() const +bool RangeOpData::hasMaxOutValue() const { return !IsNan((float)m_maxOutValue); } void RangeOpData::unsetMaxOutValue() { - m_maxOutValue = EmptyValue(); + m_maxOutValue = EmptyValue(); } - -// Important: The spec allows max/min elements to be missing. When this +// Important: The spec allows max/min elements to be missing. When this // happens, we set the member variables to NaN. The interpretation of this // is that no clamping is requested at that bound. The use of the NaN // technique is not exposed outside this module. @@ -243,22 +240,22 @@ void RangeOpData::validate() const // A one-sided clamp must have matching in & out values. - if (IsNan((float)m_maxInValue) && !IsNan((float)m_minInValue) && - FloatsDiffer(m_minOutValue, m_minInValue)) + if (IsNan((float)m_maxInValue) && !IsNan((float)m_minInValue) + && FloatsDiffer(m_minOutValue, m_minInValue)) { throw Exception("In and out minimum limits must be equal " "if maximum values are missing in Range."); } - if (IsNan((float)m_minInValue) && !IsNan((float)m_maxInValue) && - FloatsDiffer(m_maxOutValue, m_maxInValue)) + if (IsNan((float)m_minInValue) && !IsNan((float)m_maxInValue) + && FloatsDiffer(m_maxOutValue, m_maxInValue)) { throw Exception("In and out maximum limits must be equal " "if minimum values are missing in Range."); } // Complete the initialization of the object. - fillScaleOffset(); // This also validates that maxIn - minIn != 0. + fillScaleOffset(); // This also validates that maxIn - minIn != 0. } // A RangeOp always clamps (the noClamp style is converted to a Matrix). @@ -277,12 +274,12 @@ bool RangeOpData::isIdentity() const return false; } - if ( !minIsEmpty() && m_minInValue > 0.0 ) + if (!minIsEmpty() && m_minInValue > 0.0) { return false; } - if ( !maxIsEmpty() && m_maxInValue < 1.0 ) + if (!maxIsEmpty() && m_maxInValue < 1.0) { return false; } @@ -292,12 +289,12 @@ bool RangeOpData::isIdentity() const bool RangeOpData::clampsToLutDomain() const { - if ( minIsEmpty() || m_minInValue < 0.0 ) + if (minIsEmpty() || m_minInValue < 0.0) { return false; } - if ( maxIsEmpty() || m_maxInValue > 1.0 ) + if (maxIsEmpty() || m_maxInValue > 1.0) { return false; } @@ -307,7 +304,7 @@ bool RangeOpData::clampsToLutDomain() const bool RangeOpData::isClampNegs() const { - return maxIsEmpty() && ! minIsEmpty() && m_minInValue == 0.0; + return maxIsEmpty() && !minIsEmpty() && m_minInValue == 0.0; } bool RangeOpData::FloatsDiffer(double x1, double x2) @@ -317,13 +314,13 @@ bool RangeOpData::FloatsDiffer(double x1, double x2) bool different = false; - if ( fabs(x1) < 1e-3 ) + if (fabs(x1) < 1e-3) { - different = fabs( x1 - x2 ) > 1e-6; // absolute error near zero + different = fabs(x1 - x2) > 1e-6; // absolute error near zero } else { - different = fabs( 1.0 - (x2 / x1) ) > 1e-6; // relative error otherwise + different = fabs(1.0 - (x2 / x1)) > 1e-6; // relative error otherwise } return different; @@ -334,14 +331,14 @@ bool RangeOpData::scales() const // Check if offset is non-zero or scale is not unity. // Offset is likely to be zero, so cannot do a relative comparison. - if ( fabs(m_offset) > 1e-6 ) + if (fabs(m_offset) > 1e-6) { return true; } // Scale may vary from very small to vary large, however it's also allowed to be 0, so neither // relative or absolute comparison is appropriate for all cases. - if ( FloatsDiffer(m_scale, 1.0) ) + if (FloatsDiffer(m_scale, 1.0)) { return true; } @@ -351,8 +348,8 @@ bool RangeOpData::scales() const RangeOpDataRcPtr RangeOpData::compose(ConstRangeOpDataRcPtr & r) const { - double minInNew = m_minInValue; - double maxInNew = m_maxInValue; + double minInNew = m_minInValue; + double maxInNew = m_maxInValue; double minOutNew = r->m_minOutValue; double maxOutNew = r->m_maxOutValue; if (!minIsEmpty()) @@ -455,15 +452,15 @@ void RangeOpData::fillScaleOffset() const if (minIsEmpty()) { - m_offset = 0.; // Bottom unlimited but top clamps + m_offset = 0.; // Bottom unlimited but top clamps } else { - if (maxIsEmpty()) // Top unlimited but bottom clamps + if (maxIsEmpty()) // Top unlimited but bottom clamps { m_offset = 0.; } - else // Both ends clamp + else // Both ends clamp { double denom = m_maxInValue - m_minInValue; if (fabs(denom) < 1e-6) @@ -471,7 +468,7 @@ void RangeOpData::fillScaleOffset() const throw Exception("Range maxInValue is too close to minInValue"); } // NB: Allowing out min == max as it could be useful to create a constant. - m_scale = (m_maxOutValue - m_minOutValue) / denom; + m_scale = (m_maxOutValue - m_minOutValue) / denom; m_offset = m_minOutValue - m_scale * m_minInValue; } } @@ -491,7 +488,7 @@ MatrixOpDataRcPtr RangeOpData::convertToMatrix() const fwdThis = tempFwd.get(); } // Create an identity matrix. - MatrixOpDataRcPtr mtx = std::make_shared(); + MatrixOpDataRcPtr mtx = std::make_shared(); mtx->getFormatMetadata() = fwdThis->getFormatMetadata(); mtx->setFileInputBitDepth(fwdThis->getFileInputBitDepth()); mtx->setFileOutputBitDepth(fwdThis->getFileOutputBitDepth()); @@ -515,31 +512,31 @@ MatrixOpDataRcPtr RangeOpData::convertToMatrix() const bool RangeOpData::equals(const OpData & other) const { // NB: FormatMetadata and fileIn/OutDepths are ignored. - if (!OpData::equals(other)) return false; + if (!OpData::equals(other)) + return false; - const RangeOpData* rop = static_cast(&other); + const RangeOpData * rop = static_cast(&other); if (m_direction != rop->m_direction) { return false; } - if ( (minIsEmpty() != rop->minIsEmpty()) || - (maxIsEmpty() != rop->maxIsEmpty()) ) + if ((minIsEmpty() != rop->minIsEmpty()) || (maxIsEmpty() != rop->maxIsEmpty())) { return false; } - if (!minIsEmpty() && !rop->minIsEmpty() && - ( FloatsDiffer(m_minInValue, rop->m_minInValue) || - FloatsDiffer(m_minOutValue, rop->m_minOutValue) ) ) + if (!minIsEmpty() && !rop->minIsEmpty() + && (FloatsDiffer(m_minInValue, rop->m_minInValue) + || FloatsDiffer(m_minOutValue, rop->m_minOutValue))) { return false; } - if (!maxIsEmpty() && !rop->maxIsEmpty() && - ( FloatsDiffer(m_maxInValue, rop->m_maxInValue) || - FloatsDiffer(m_maxOutValue, rop->m_maxOutValue) ) ) + if (!maxIsEmpty() && !rop->maxIsEmpty() + && (FloatsDiffer(m_maxInValue, rop->m_maxInValue) + || FloatsDiffer(m_maxOutValue, rop->m_maxOutValue))) { return false; } @@ -558,16 +555,17 @@ RangeOpDataRcPtr RangeOpData::getAsForward() const { return clone(); } - RangeOpDataRcPtr invOp = std::make_shared(getMinOutValue(), - getMaxOutValue(), - getMinInValue(), - getMaxInValue()); + RangeOpDataRcPtr invOp = std::make_shared( + getMinOutValue(), + getMaxOutValue(), + getMinInValue(), + getMaxInValue()); // Note any existing metadata may be stale at this point, but trying to update it is // challenging. invOp->getFormatMetadata() = getFormatMetadata(); - invOp->m_fileInBitDepth = m_fileOutBitDepth; - invOp->m_fileOutBitDepth = m_fileInBitDepth; + invOp->m_fileInBitDepth = m_fileOutBitDepth; + invOp->m_fileOutBitDepth = m_fileInBitDepth; invOp->validate(); @@ -588,18 +586,15 @@ std::string RangeOpData::getCacheID() const cacheIDStream.precision(DefaultValues::FLOAT_DECIMALS); - cacheIDStream << "[" << m_minInValue - << ", " << m_maxInValue - << ", " << m_minOutValue - << ", " << m_maxOutValue - << "]"; + cacheIDStream << "[" << m_minInValue << ", " << m_maxInValue << ", " << m_minOutValue << ", " + << m_maxOutValue << "]"; return cacheIDStream.str(); } void RangeOpData::normalize() { - const double inScale = 1.0 / GetBitDepthMaxValue(getFileInputBitDepth()); + const double inScale = 1.0 / GetBitDepthMaxValue(getFileInputBitDepth()); const double outScale = 1.0 / GetBitDepthMaxValue(getFileOutputBitDepth()); if (!minIsEmpty()) { diff --git a/src/OpenColorIO/ops/range/RangeOpData.h b/src/OpenColorIO/ops/range/RangeOpData.h index 9fdde8ec6e..0ea1765ec6 100644 --- a/src/OpenColorIO/ops/range/RangeOpData.h +++ b/src/OpenColorIO/ops/range/RangeOpData.h @@ -1,17 +1,14 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_RANGEOPDATA_H #define INCLUDED_OCIO_RANGEOPDATA_H - #include #include "Op.h" #include "ops/matrix/MatrixOp.h" - namespace OCIO_NAMESPACE { @@ -22,27 +19,27 @@ typedef OCIO_SHARED_PTR ConstRangeOpDataRcPtr; class IndexMapping; // The class represents the Range op data. -// +// // The Range is used to apply an affine transform (scale & offset), // clamp values to min/max bounds, or apply a simple bit-depth conversion. -// +// // The spec is somewhat ambiguous about the details so we are required // to make some judgement calls. The spec allows max/min elements to // be missing. This means no clamping is requested. In order to keep // the semantics reasonable, we further require that if minIn is set // then minOut must also be set (but setting minIn doesn't require maxIn). -// +// // The min/max tags serve two purposes, they define the scale and offset // that will be applied to map in to out. They also clamp values. -// +// // If no min/max tags are present, the op does bit-depth conversion // without clamping. If only min but not max is present then clamping // is only done at the low end (and vice versa). -// +// // If only min or max is present, the spec doesn't give details so we // set the scale to whatever is necessary to do bit-depth conversion // and set the offset to map the in bound to the out bound. -// +// class RangeOpData : public OpData { public: @@ -50,17 +47,19 @@ class RangeOpData : public OpData RangeOpData(const RangeOpData &) = default; - RangeOpData(double minInValue, // Lower bound of the domain - double maxInValue, // Upper bound of the domain - double minOutValue, // Lower bound of the range - double maxOutValue // Upper bound of the range - ); + RangeOpData( + double minInValue, // Lower bound of the domain + double maxInValue, // Upper bound of the domain + double minOutValue, // Lower bound of the range + double maxOutValue // Upper bound of the range + ); - RangeOpData(double minInValue, // Lower bound of the domain - double maxInValue, // Upper bound of the domain - double minOutValue, // Lower bound of the range - double maxOutValue, // Upper bound of the range - TransformDirection dir); + RangeOpData( + double minInValue, // Lower bound of the domain + double maxInValue, // Upper bound of the domain + double minOutValue, // Lower bound of the range + double maxOutValue, // Upper bound of the range + TransformDirection dir); // Constructor from a 2-entry index map from a Lut1D or Lut3D. // Note: Throws if the index map is not appropriate. @@ -75,7 +74,7 @@ class RangeOpData : public OpData RangeOpDataRcPtr clone() const; // - // Note: The setters below do not call validate and are only for use + // Note: The setters below do not call validate and are only for use // by the file format parser. // @@ -140,7 +139,7 @@ class RangeOpData : public OpData // Create a MatrixOp that is equivalent to the Range except does not clamp. MatrixOpDataRcPtr convertToMatrix() const; - bool equals(const OpData& other) const override; + bool equals(const OpData & other) const override; RangeOpDataRcPtr getAsForward() const; @@ -164,17 +163,17 @@ class RangeOpData : public OpData static bool FloatsDiffer(double x1, double x2); private: - double m_minInValue; // Minimum for the input value - double m_maxInValue; // Maximum for the input value - double m_minOutValue; // Minimum for the output value - double m_maxOutValue; // Maximum for the output value - mutable double m_scale; // Scaling calculated from the limits - mutable double m_offset; // Offset calculated from the limits + double m_minInValue; // Minimum for the input value + double m_maxInValue; // Maximum for the input value + double m_minOutValue; // Minimum for the output value + double m_maxOutValue; // Maximum for the output value + mutable double m_scale; // Scaling calculated from the limits + mutable double m_offset; // Offset calculated from the limits BitDepth m_fileInBitDepth = BIT_DEPTH_UNKNOWN; // In bit-depth to be used for file I/O BitDepth m_fileOutBitDepth = BIT_DEPTH_UNKNOWN; // Out bit-depth to be used for file I/O - TransformDirection m_direction{ TRANSFORM_DIR_FORWARD }; + TransformDirection m_direction{TRANSFORM_DIR_FORWARD}; }; bool operator==(const RangeOpData & lhs, const RangeOpData & rhs); diff --git a/src/OpenColorIO/ops/range/RangeOpGPU.cpp b/src/OpenColorIO/ops/range/RangeOpGPU.cpp index e817912677..ddfb06bc45 100644 --- a/src/OpenColorIO/ops/range/RangeOpGPU.cpp +++ b/src/OpenColorIO/ops/range/RangeOpGPU.cpp @@ -8,7 +8,6 @@ #include "MathUtils.h" #include "ops/range/RangeOpGPU.h" - namespace OCIO_NAMESPACE { @@ -26,52 +25,35 @@ void GetRangeGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, ConstRangeO const std::string pix(shaderCreator->getPixelName()); const std::string pixrgb = pix + std::string(".rgb"); - if(range->scales()) + if (range->scales()) { - const double scale[3] - = { range->getScale(), - range->getScale(), - range->getScale() }; - - const double offset[3] - = { range->getOffset(), - range->getOffset(), - range->getOffset() }; - - ss.newLine() << pixrgb << " = " - << pixrgb << " * " - << ss.float3Const(scale[0], scale[1], scale[2]) - << " + " - << ss.float3Const(offset[0], offset[1], offset[2]) - << ";"; + const double scale[3] = {range->getScale(), range->getScale(), range->getScale()}; + + const double offset[3] = {range->getOffset(), range->getOffset(), range->getOffset()}; + + ss.newLine() << pixrgb << " = " << pixrgb << " * " + << ss.float3Const(scale[0], scale[1], scale[2]) << " + " + << ss.float3Const(offset[0], offset[1], offset[2]) << ";"; } - if(!range->minIsEmpty()) + if (!range->minIsEmpty()) { const double lowerBound[3] - = { range->getMinOutValue(), - range->getMinOutValue(), - range->getMinOutValue() }; - - ss.newLine() << pixrgb << " = " - << "max(" << ss.float3Const(lowerBound[0], - lowerBound[1], - lowerBound[2]) << ", " - << pixrgb << ");"; + = {range->getMinOutValue(), range->getMinOutValue(), range->getMinOutValue()}; + + ss.newLine() << pixrgb << " = " << "max(" + << ss.float3Const(lowerBound[0], lowerBound[1], lowerBound[2]) << ", " + << pixrgb << ");"; } if (!range->maxIsEmpty()) { const double upperBound[3] - = { range->getMaxOutValue(), - range->getMaxOutValue(), - range->getMaxOutValue() }; - - ss.newLine() << pixrgb << " = " - << "min(" << ss.float3Const(upperBound[0], - upperBound[1], - upperBound[2]) << ", " - << pixrgb << ");"; + = {range->getMaxOutValue(), range->getMaxOutValue(), range->getMaxOutValue()}; + + ss.newLine() << pixrgb << " = " << "min(" + << ss.float3Const(upperBound[0], upperBound[1], upperBound[2]) << ", " + << pixrgb << ");"; } ss.dedent(); @@ -81,5 +63,4 @@ void GetRangeGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, ConstRangeO shaderCreator->addToFunctionShaderCode(ss.string().c_str()); } - } // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/ops/range/RangeOpGPU.h b/src/OpenColorIO/ops/range/RangeOpGPU.h index 33bfdcc030..940db3ec6c 100644 --- a/src/OpenColorIO/ops/range/RangeOpGPU.h +++ b/src/OpenColorIO/ops/range/RangeOpGPU.h @@ -1,17 +1,14 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_RANGEOP_GPU_H #define INCLUDED_OCIO_RANGEOP_GPU_H - #include #include "GpuShaderUtils.h" #include "ops/range/RangeOpData.h" - namespace OCIO_NAMESPACE { @@ -19,7 +16,4 @@ void GetRangeGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, ConstRangeO } // namespace OCIO_NAMESPACE - #endif - - diff --git a/src/OpenColorIO/ops/reference/ReferenceOpData.cpp b/src/OpenColorIO/ops/reference/ReferenceOpData.cpp index 4b8b766f3c..5141c51e3e 100644 --- a/src/OpenColorIO/ops/reference/ReferenceOpData.cpp +++ b/src/OpenColorIO/ops/reference/ReferenceOpData.cpp @@ -3,11 +3,10 @@ #include -#include "ops/reference/ReferenceOpData.h" #include "Platform.h" +#include "ops/reference/ReferenceOpData.h" #include "transforms/FileTransform.h" - namespace OCIO_NAMESPACE { @@ -39,21 +38,26 @@ bool ReferenceOpData::hasChannelCrosstalk() const return true; } -bool ReferenceOpData::equals(const OpData& other) const +bool ReferenceOpData::equals(const OpData & other) const { - if (!OpData::equals(other)) return false; + if (!OpData::equals(other)) + return false; - const ReferenceOpData* rop = static_cast(&other); + const ReferenceOpData * rop = static_cast(&other); - if (m_referenceStyle != rop->m_referenceStyle) return false; - if (m_direction != rop->m_direction) return false; + if (m_referenceStyle != rop->m_referenceStyle) + return false; + if (m_direction != rop->m_direction) + return false; if (m_referenceStyle == REF_PATH) { - if (m_path != rop->m_path) return false; + if (m_path != rop->m_path) + return false; } else { - if (m_alias != rop->m_alias) return false; + if (m_alias != rop->m_alias) + return false; } return true; diff --git a/src/OpenColorIO/ops/reference/ReferenceOpData.h b/src/OpenColorIO/ops/reference/ReferenceOpData.h index 74751e265b..9420e41751 100644 --- a/src/OpenColorIO/ops/reference/ReferenceOpData.h +++ b/src/OpenColorIO/ops/reference/ReferenceOpData.h @@ -4,9 +4,9 @@ #ifndef INCLUDED_OCIO_REFERENCEOPDATA_H #define INCLUDED_OCIO_REFERENCEOPDATA_H +#include #include #include -#include #include "Op.h" @@ -42,46 +42,31 @@ class ReferenceOpData : public OpData bool hasChannelCrosstalk() const override; - bool equals(const OpData& other) const override; + bool equals(const OpData & other) const override; std::string getCacheID() const override; - ReferenceStyle getReferenceStyle() const - { - return m_referenceStyle; - } + ReferenceStyle getReferenceStyle() const { return m_referenceStyle; } - const std::string & getPath() const - { - return m_path; - } + const std::string & getPath() const { return m_path; } void setPath(const std::string & path) { m_referenceStyle = REF_PATH; - m_path = path; + m_path = path; } - const std::string & getAlias() const - { - return m_alias; - } + const std::string & getAlias() const { return m_alias; } void setAlias(const std::string & alias) { m_referenceStyle = REF_ALIAS; - m_alias = alias; + m_alias = alias; } - TransformDirection getDirection() const - { - return m_direction; - } + TransformDirection getDirection() const { return m_direction; } - void setDirection(TransformDirection dir) - { - m_direction = dir; - } + void setDirection(TransformDirection dir) { m_direction = dir; } private: ReferenceStyle m_referenceStyle = REF_PATH; diff --git a/src/OpenColorIO/transforms/AllocationTransform.cpp b/src/OpenColorIO/transforms/AllocationTransform.cpp old mode 100755 new mode 100644 index eeca74431d..ecc2c263bf --- a/src/OpenColorIO/transforms/AllocationTransform.cpp +++ b/src/OpenColorIO/transforms/AllocationTransform.cpp @@ -7,8 +7,8 @@ #include -#include "ops/allocation/AllocationOp.h" #include "OpBuilders.h" +#include "ops/allocation/AllocationOp.h" namespace OCIO_NAMESPACE { @@ -17,7 +17,7 @@ AllocationTransformRcPtr AllocationTransform::Create() return AllocationTransformRcPtr(new AllocationTransform(), &deleter); } -void AllocationTransform::deleter(AllocationTransform* t) +void AllocationTransform::deleter(AllocationTransform * t) { delete t; } @@ -29,23 +29,23 @@ class AllocationTransform::Impl Allocation m_allocation; std::vector m_vars; - Impl() : - m_dir(TRANSFORM_DIR_FORWARD), - m_allocation(ALLOCATION_UNIFORM) - { } + Impl() + : m_dir(TRANSFORM_DIR_FORWARD) + , m_allocation(ALLOCATION_UNIFORM) + { + } Impl(const Impl &) = delete; - ~Impl() - { } + ~Impl() {} - Impl& operator= (const Impl & rhs) + Impl & operator=(const Impl & rhs) { if (this != &rhs) { - m_dir = rhs.m_dir; + m_dir = rhs.m_dir; m_allocation = rhs.m_allocation; - m_vars = rhs.m_vars; + m_vars = rhs.m_vars; } return *this; } @@ -53,7 +53,6 @@ class AllocationTransform::Impl /////////////////////////////////////////////////////////////////////////// - AllocationTransform::AllocationTransform() : m_impl(new AllocationTransform::Impl) { @@ -62,7 +61,7 @@ AllocationTransform::AllocationTransform() TransformRcPtr AllocationTransform::createEditableCopy() const { AllocationTransformRcPtr transform = AllocationTransform::Create(); - *(transform->m_impl) = *m_impl; + *(transform->m_impl) = *m_impl; return transform; } @@ -72,7 +71,7 @@ AllocationTransform::~AllocationTransform() m_impl = nullptr; } -TransformDirection AllocationTransform::getDirection() const noexcept +TransformDirection AllocationTransform::getDirection() const noexcept { return getImpl()->m_dir; } @@ -97,16 +96,19 @@ void AllocationTransform::validate() const if (getImpl()->m_allocation == ALLOCATION_UNIFORM) { - if(getImpl()->m_vars.size()!=2 && getImpl()->m_vars.size()!=0) + if (getImpl()->m_vars.size() != 2 && getImpl()->m_vars.size() != 0) { - throw Exception("AllocationTransform: wrong number of values for the uniform allocation"); + throw Exception( + "AllocationTransform: wrong number of values for the uniform allocation"); } } else if (getImpl()->m_allocation == ALLOCATION_LG2) { - if(getImpl()->m_vars.size()!=3 && getImpl()->m_vars.size()!=2 && getImpl()->m_vars.size()!=0) + if (getImpl()->m_vars.size() != 3 && getImpl()->m_vars.size() != 2 + && getImpl()->m_vars.size() != 0) { - throw Exception("AllocationTransform: wrong number of values for the logarithmic allocation"); + throw Exception( + "AllocationTransform: wrong number of values for the logarithmic allocation"); } } else @@ -132,11 +134,9 @@ int AllocationTransform::getNumVars() const void AllocationTransform::getVars(float * vars) const { - if(!getImpl()->m_vars.empty()) + if (!getImpl()->m_vars.empty()) { - memcpy(vars, - &getImpl()->m_vars[0], - getImpl()->m_vars.size()*sizeof(float)); + memcpy(vars, &getImpl()->m_vars[0], getImpl()->m_vars.size() * sizeof(float)); } } @@ -144,15 +144,13 @@ void AllocationTransform::setVars(int numvars, const float * vars) { getImpl()->m_vars.resize(numvars); - if(!getImpl()->m_vars.empty()) + if (!getImpl()->m_vars.empty()) { - memcpy(&getImpl()->m_vars[0], - vars, - numvars*sizeof(float)); + memcpy(&getImpl()->m_vars[0], vars, numvars * sizeof(float)); } } -std::ostream& operator<< (std::ostream& os, const AllocationTransform& t) +std::ostream & operator<<(std::ostream & os, const AllocationTransform & t) { Allocation allocation(t.getAllocation()); const int numVars(t.getNumVars()); @@ -178,21 +176,20 @@ std::ostream& operator<< (std::ostream& os, const AllocationTransform& t) return os; } - /////////////////////////////////////////////////////////////////////////// - -void BuildAllocationOp(OpRcPtrVec & ops, - const AllocationTransform & allocationTransform, - TransformDirection dir) +void BuildAllocationOp( + OpRcPtrVec & ops, + const AllocationTransform & allocationTransform, + TransformDirection dir) { - TransformDirection combinedDir = CombineTransformDirections(dir, - allocationTransform.getDirection()); + TransformDirection combinedDir + = CombineTransformDirections(dir, allocationTransform.getDirection()); AllocationData data; data.allocation = allocationTransform.getAllocation(); data.vars.resize(allocationTransform.getNumVars()); - if(!data.vars.empty()) + if (!data.vars.empty()) { allocationTransform.getVars(&data.vars[0]); } @@ -200,4 +197,3 @@ void BuildAllocationOp(OpRcPtrVec & ops, CreateAllocationOps(ops, data, combinedDir); } } // namespace OCIO_NAMESPACE - diff --git a/src/OpenColorIO/transforms/BuiltinTransform.cpp b/src/OpenColorIO/transforms/BuiltinTransform.cpp index 1f3f4d8e79..1b92472abe 100644 --- a/src/OpenColorIO/transforms/BuiltinTransform.cpp +++ b/src/OpenColorIO/transforms/BuiltinTransform.cpp @@ -1,16 +1,14 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #include #include #include "Op.h" -#include "transforms/builtins/BuiltinTransformRegistry.h" -#include "transforms/BuiltinTransform.h" #include "Platform.h" - +#include "transforms/BuiltinTransform.h" +#include "transforms/builtins/BuiltinTransformRegistry.h" namespace OCIO_NAMESPACE { @@ -64,7 +62,8 @@ void BuiltinTransformImpl::setStyle(const char * style) { for (size_t index = 0; index < BuiltinTransformRegistry::Get()->getNumBuiltins(); ++index) { - if (0 == Platform::Strcasecmp(style, BuiltinTransformRegistry::Get()->getBuiltinStyle(index))) + if (0 + == Platform::Strcasecmp(style, BuiltinTransformRegistry::Get()->getBuiltinStyle(index))) { m_transformIndex = index; return; @@ -77,28 +76,21 @@ void BuiltinTransformImpl::setStyle(const char * style) throw Exception(oss.str().c_str()); } - -void BuildBuiltinOps(OpRcPtrVec & ops, - const BuiltinTransform & transform, - TransformDirection dir) +void BuildBuiltinOps(OpRcPtrVec & ops, const BuiltinTransform & transform, TransformDirection dir) { - const TransformDirection combinedDir = CombineTransformDirections(dir, transform.getDirection()); + const TransformDirection combinedDir + = CombineTransformDirections(dir, transform.getDirection()); - const BuiltinTransformImpl * pImpl = dynamic_cast(&transform); + const BuiltinTransformImpl * pImpl = dynamic_cast(&transform); CreateBuiltinTransformOps(ops, pImpl->getTransformIndex(), combinedDir); } - -std::ostream & operator<< (std::ostream & os, const BuiltinTransform & t) noexcept +std::ostream & operator<<(std::ostream & os, const BuiltinTransform & t) noexcept { - os << ""; + os << ""; return os; } - - } // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/transforms/BuiltinTransform.h b/src/OpenColorIO/transforms/BuiltinTransform.h index 3c053f2725..2d91b44cc6 100644 --- a/src/OpenColorIO/transforms/BuiltinTransform.h +++ b/src/OpenColorIO/transforms/BuiltinTransform.h @@ -1,24 +1,21 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_BUILTINTRANSFORM_H #define INCLUDED_OCIO_BUILTINTRANSFORM_H - #include - namespace OCIO_NAMESPACE { class BuiltinTransformImpl : public BuiltinTransform { public: - BuiltinTransformImpl() = default; - BuiltinTransformImpl(const BuiltinTransformImpl &) = delete; + BuiltinTransformImpl() = default; + BuiltinTransformImpl(const BuiltinTransformImpl &) = delete; BuiltinTransformImpl & operator=(const BuiltinTransformImpl &) = delete; - ~BuiltinTransformImpl() override = default; + ~BuiltinTransformImpl() override = default; TransformRcPtr createEditableCopy() const override; @@ -35,11 +32,10 @@ class BuiltinTransformImpl : public BuiltinTransform static void deleter(BuiltinTransform * t); private: - TransformDirection m_direction{ TRANSFORM_DIR_FORWARD }; - size_t m_transformIndex{ 0 }; // Index of the built-in transform. + TransformDirection m_direction{TRANSFORM_DIR_FORWARD}; + size_t m_transformIndex{0}; // Index of the built-in transform. }; - } // namespace OCIO_NAMESPACE -#endif // INCLUDED_OCIO_BUILTINTRANSFORM_H +#endif // INCLUDED_OCIO_BUILTINTRANSFORM_H diff --git a/src/OpenColorIO/transforms/CDLTransform.cpp b/src/OpenColorIO/transforms/CDLTransform.cpp old mode 100755 new mode 100644 index cee7ed963d..e0a19cc12e --- a/src/OpenColorIO/transforms/CDLTransform.cpp +++ b/src/OpenColorIO/transforms/CDLTransform.cpp @@ -7,17 +7,16 @@ #include -#include "fileformats/cdl/CDLParser.h" #include "Logging.h" #include "MathUtils.h" #include "Mutex.h" #include "OpBuilders.h" #include "ParseUtils.h" #include "Platform.h" +#include "fileformats/cdl/CDLParser.h" #include "transforms/CDLTransform.h" #include "transforms/FileTransform.h" - namespace OCIO_NAMESPACE { CDLTransformRcPtr CDLTransform::Create() @@ -30,7 +29,6 @@ CDLTransformImplRcPtr CDLTransformImpl::Create() return CDLTransformImplRcPtr(new CDLTransformImpl(), &CDLTransformImpl::deleter); } - CDLTransformRcPtr GetCDL(GroupTransformRcPtr & group, const std::string & cdlId) { if (cdlId.empty()) @@ -97,7 +95,7 @@ CDLTransformRcPtr CDLTransform::CreateFromFile(const char * src, const char * cd GetCachedFileAndFormat(format, cachedFile, src, INTERP_DEFAULT, *(Config::Create())); GroupTransformRcPtr group = cachedFile->getCDLGroup(); - const std::string cdlId{ cdlId_ ? cdlId_ : "" }; + const std::string cdlId{cdlId_ ? cdlId_ : ""}; return GetCDL(group, cdlId); } @@ -124,12 +122,12 @@ void CDLTransformImpl::deleter(CDLTransform * t) TransformRcPtr CDLTransformImpl::createEditableCopy() const { - TransformRcPtr transform = CDLTransform::Create(); - dynamic_cast(transform.get())->data() = data(); + TransformRcPtr transform = CDLTransform::Create(); + dynamic_cast(transform.get())->data() = data(); return transform; } -TransformDirection CDLTransformImpl::getDirection() const noexcept +TransformDirection CDLTransformImpl::getDirection() const noexcept { return data().getDirection(); } @@ -169,9 +167,10 @@ const FormatMetadata & CDLTransformImpl::getFormatMetadata() const noexcept bool CDLTransformImpl::equals(const CDLTransform & other) const noexcept { - if (this == &other) return true; + if (this == &other) + return true; // NB: A tolerance of 1e-9 is used when comparing the parameters. - return data() == dynamic_cast(&other)->data(); + return data() == dynamic_cast(&other)->data(); } CDLStyle CDLTransformImpl::getStyle() const @@ -203,9 +202,9 @@ void CDLTransformImpl::getSlope(double * rgb) const } const CDLOpData::ChannelParams & params = data().getSlopeParams(); - rgb[0] = params[0]; - rgb[1] = params[1]; - rgb[2] = params[2]; + rgb[0] = params[0]; + rgb[1] = params[1]; + rgb[2] = params[2]; } void CDLTransformImpl::setOffset(const double * rgb) @@ -226,9 +225,9 @@ void CDLTransformImpl::getOffset(double * rgb) const } const CDLOpData::ChannelParams & params = data().getOffsetParams(); - rgb[0] = params[0]; - rgb[1] = params[1]; - rgb[2] = params[2]; + rgb[0] = params[0]; + rgb[1] = params[1]; + rgb[2] = params[2]; } void CDLTransformImpl::setPower(const double * rgb) @@ -249,9 +248,9 @@ void CDLTransformImpl::getPower(double * rgb) const } const CDLOpData::ChannelParams & params = data().getPowerParams(); - rgb[0] = params[0]; - rgb[1] = params[1]; - rgb[2] = params[2]; + rgb[0] = params[0]; + rgb[1] = params[1]; + rgb[2] = params[2]; } void CDLTransformImpl::setSOP(const double * vec9) @@ -274,19 +273,19 @@ void CDLTransformImpl::getSOP(double * vec9) const } const CDLOpData::ChannelParams & slopes = data().getSlopeParams(); - vec9[0] = slopes[0]; - vec9[1] = slopes[1]; - vec9[2] = slopes[2]; + vec9[0] = slopes[0]; + vec9[1] = slopes[1]; + vec9[2] = slopes[2]; const CDLOpData::ChannelParams & offsets = data().getOffsetParams(); - vec9[3] = offsets[0]; - vec9[4] = offsets[1]; - vec9[5] = offsets[2]; + vec9[3] = offsets[0]; + vec9[4] = offsets[1]; + vec9[5] = offsets[2]; const CDLOpData::ChannelParams & powers = data().getPowerParams(); - vec9[6] = powers[0]; - vec9[7] = powers[1]; - vec9[8] = powers[2]; + vec9[6] = powers[0]; + vec9[7] = powers[1]; + vec9[8] = powers[2]; } void CDLTransformImpl::setSat(double sat) @@ -331,7 +330,7 @@ void CDLTransformImpl::setID(const char * id) const char * CDLTransformImpl::getFirstSOPDescription() const { const auto & info = data().getFormatMetadata(); - int descIndex = info.getFirstChildIndex(METADATA_SOP_DESCRIPTION); + int descIndex = info.getFirstChildIndex(METADATA_SOP_DESCRIPTION); if (descIndex == -1) { return ""; @@ -344,7 +343,7 @@ const char * CDLTransformImpl::getFirstSOPDescription() const void CDLTransformImpl::setFirstSOPDescription(const char * description) { - auto & info = data().getFormatMetadata(); + auto & info = data().getFormatMetadata(); int descIndex = info.getFirstChildIndex(METADATA_SOP_DESCRIPTION); if (descIndex == -1) { @@ -366,7 +365,7 @@ void CDLTransformImpl::setFirstSOPDescription(const char * description) } } -std::ostream & operator<< (std::ostream & os, const CDLTransform & t) +std::ostream & operator<<(std::ostream & os, const CDLTransform & t) { double sop[9]; t.getSOP(sop); @@ -376,7 +375,8 @@ std::ostream & operator<< (std::ostream & os, const CDLTransform & t) os << ", sop="; for (unsigned int i = 0; i < 9; ++i) { - if (i != 0) os << " "; + if (i != 0) + os << " "; os << sop[i]; } os << ", sat=" << t.getSat(); @@ -386,4 +386,3 @@ std::ostream & operator<< (std::ostream & os, const CDLTransform & t) } } // namespace OCIO_NAMESPACE - diff --git a/src/OpenColorIO/transforms/CDLTransform.h b/src/OpenColorIO/transforms/CDLTransform.h index 2e0005b7d0..9ba51ead05 100644 --- a/src/OpenColorIO/transforms/CDLTransform.h +++ b/src/OpenColorIO/transforms/CDLTransform.h @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_CDLTRANSFORM_H #define INCLUDED_OCIO_CDLTRANSFORM_H @@ -14,10 +13,10 @@ namespace OCIO_NAMESPACE { -static constexpr char METADATA_INPUT_DESCRIPTION[] = "InputDescription"; +static constexpr char METADATA_INPUT_DESCRIPTION[] = "InputDescription"; static constexpr char METADATA_VIEWING_DESCRIPTION[] = "ViewingDescription"; -static constexpr char METADATA_SOP_DESCRIPTION[] = "SOPDescription"; -static constexpr char METADATA_SAT_DESCRIPTION[] = "SATDescription"; +static constexpr char METADATA_SOP_DESCRIPTION[] = "SOPDescription"; +static constexpr char METADATA_SAT_DESCRIPTION[] = "SATDescription"; class CDLTransformImpl; typedef OCIO_SHARED_PTR CDLTransformImplRcPtr; @@ -30,10 +29,10 @@ class CDLTransformImpl : public CDLTransform public: static CDLTransformImplRcPtr Create(); - CDLTransformImpl() = default; - CDLTransformImpl(const CDLTransformImpl &) = delete; + CDLTransformImpl() = default; + CDLTransformImpl(const CDLTransformImpl &) = delete; CDLTransformImpl & operator=(const CDLTransformImpl &) = delete; - virtual ~CDLTransformImpl() = default; + virtual ~CDLTransformImpl() = default; TransformRcPtr createEditableCopy() const override; diff --git a/src/OpenColorIO/transforms/ColorSpaceTransform.cpp b/src/OpenColorIO/transforms/ColorSpaceTransform.cpp old mode 100755 new mode 100644 index 2039ea66bd..13346001ac --- a/src/OpenColorIO/transforms/ColorSpaceTransform.cpp +++ b/src/OpenColorIO/transforms/ColorSpaceTransform.cpp @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #include #include @@ -12,7 +11,6 @@ #include "ops/allocation/AllocationOp.h" #include "ops/noop/NoOps.h" - namespace OCIO_NAMESPACE { ColorSpaceTransformRcPtr ColorSpaceTransform::Create() @@ -20,7 +18,7 @@ ColorSpaceTransformRcPtr ColorSpaceTransform::Create() return ColorSpaceTransformRcPtr(new ColorSpaceTransform(), &deleter); } -void ColorSpaceTransform::deleter(ColorSpaceTransform* t) +void ColorSpaceTransform::deleter(ColorSpaceTransform * t) { delete t; } @@ -28,17 +26,17 @@ void ColorSpaceTransform::deleter(ColorSpaceTransform* t) class ColorSpaceTransform::Impl { public: - TransformDirection m_dir{ TRANSFORM_DIR_FORWARD }; + TransformDirection m_dir{TRANSFORM_DIR_FORWARD}; std::string m_src; std::string m_dst; - bool m_dataBypass{ true }; + bool m_dataBypass{true}; - Impl() = default; + Impl() = default; Impl(const Impl &) = delete; ~Impl() = default; - Impl& operator= (const Impl & rhs) + Impl & operator=(const Impl & rhs) { if (this != &rhs) { @@ -61,7 +59,7 @@ ColorSpaceTransform::ColorSpaceTransform() TransformRcPtr ColorSpaceTransform::createEditableCopy() const { ColorSpaceTransformRcPtr transform = ColorSpaceTransform::Create(); - *(transform->m_impl) = *m_impl; + *(transform->m_impl) = *m_impl; return transform; } @@ -135,7 +133,7 @@ void ColorSpaceTransform::setDataBypass(bool bypass) noexcept getImpl()->m_dataBypass = bypass; } -std::ostream& operator<< (std::ostream& os, const ColorSpaceTransform& t) +std::ostream & operator<<(std::ostream & os, const ColorSpaceTransform & t) { os << "resolveStringVar(srcName.c_str()) ); - ConstColorSpaceRcPtr dst = config.getColorSpace( context->resolveStringVar(dstName.c_str()) ); + ConstColorSpaceRcPtr src = config.getColorSpace(context->resolveStringVar(srcName.c_str())); + ConstColorSpaceRcPtr dst = config.getColorSpace(context->resolveStringVar(dstName.c_str())); ConstNamedTransformRcPtr srcNamedTransform; ConstNamedTransformRcPtr dstNamedTransform; if (!src) { - srcNamedTransform = config.getNamedTransform( context->resolveStringVar(srcName.c_str()) ); + srcNamedTransform = config.getNamedTransform(context->resolveStringVar(srcName.c_str())); if (!srcNamedTransform) { ThrowMissingCS(srcName.c_str()); @@ -192,7 +191,7 @@ void BuildColorSpaceOps(OpRcPtrVec & ops, } if (!dst) { - dstNamedTransform = config.getNamedTransform( context->resolveStringVar(dstName.c_str()) ); + dstNamedTransform = config.getNamedTransform(context->resolveStringVar(dstName.c_str())); if (!dstNamedTransform) { ThrowMissingCS(dstName.c_str()); @@ -218,36 +217,40 @@ void BuildColorSpaceOps(OpRcPtrVec & ops, namespace { -bool AreColorSpacesInSameEqualityGroup(const ConstColorSpaceRcPtr & csa, - const ConstColorSpaceRcPtr & csb) +bool AreColorSpacesInSameEqualityGroup( + const ConstColorSpaceRcPtr & csa, + const ConstColorSpaceRcPtr & csb) { // See issue #602. Using names in case one of the color space would be a copy. - if (StringUtils::Compare(csa->getName(), csb->getName())) return true; + if (StringUtils::Compare(csa->getName(), csb->getName())) + return true; std::string a = csa->getEqualityGroup(); std::string b = csb->getEqualityGroup(); - if(!a.empty()) return (a==b); + if (!a.empty()) + return (a == b); return false; } -} +} // namespace -void BuildColorSpaceOps(OpRcPtrVec & ops, - const Config & config, - const ConstContextRcPtr & context, - const ConstColorSpaceRcPtr & srcColorSpace, - const ConstColorSpaceRcPtr & dstColorSpace, - bool dataBypass) +void BuildColorSpaceOps( + OpRcPtrVec & ops, + const Config & config, + const ConstContextRcPtr & context, + const ConstColorSpaceRcPtr & srcColorSpace, + const ConstColorSpaceRcPtr & dstColorSpace, + bool dataBypass) { - if(!srcColorSpace) + if (!srcColorSpace) throw Exception("BuildColorSpaceOps failed, null srcColorSpace."); - if(!dstColorSpace) + if (!dstColorSpace) throw Exception("BuildColorSpaceOps failed, null dstColorSpace."); - if(AreColorSpacesInSameEqualityGroup(srcColorSpace, dstColorSpace)) + if (AreColorSpacesInSameEqualityGroup(srcColorSpace, dstColorSpace)) return; - if(dataBypass && (dstColorSpace->isData() || srcColorSpace->isData())) + if (dataBypass && (dstColorSpace->isData() || srcColorSpace->isData())) return; // Consider dt8 -> vd8? @@ -261,19 +264,23 @@ void BuildColorSpaceOps(OpRcPtrVec & ops, // There are two possible reference spaces, the main (scene-referred) one and the // display-referred one. If the src and dst use different reference spaces, use the // default ViewTransform to convert between them. - BuildReferenceConversionOps(ops, config, context, - srcColorSpace->getReferenceSpaceType(), - dstColorSpace->getReferenceSpaceType()); + BuildReferenceConversionOps( + ops, + config, + context, + srcColorSpace->getReferenceSpaceType(), + dstColorSpace->getReferenceSpaceType()); // Go from the reference space to dstColorSpace. BuildColorSpaceFromReferenceOps(ops, config, context, dstColorSpace, dataBypass); } -void BuildColorSpaceToReferenceOps(OpRcPtrVec & ops, - const Config & config, - const ConstContextRcPtr & context, - const ConstColorSpaceRcPtr & srcColorSpace, - bool dataBypass) +void BuildColorSpaceToReferenceOps( + OpRcPtrVec & ops, + const Config & config, + const ConstContextRcPtr & context, + const ConstColorSpaceRcPtr & srcColorSpace, + bool dataBypass) { if (!srcColorSpace) throw Exception("BuildColorSpaceOps failed, null colorSpace."); @@ -296,22 +303,31 @@ void BuildColorSpaceToReferenceOps(OpRcPtrVec & ops, // * ref->cs in the inverse direction. if (srcColorSpace->getTransform(COLORSPACE_DIR_TO_REFERENCE)) { - BuildOps(ops, config, context, srcColorSpace->getTransform(COLORSPACE_DIR_TO_REFERENCE), - TRANSFORM_DIR_FORWARD); + BuildOps( + ops, + config, + context, + srcColorSpace->getTransform(COLORSPACE_DIR_TO_REFERENCE), + TRANSFORM_DIR_FORWARD); } else if (srcColorSpace->getTransform(COLORSPACE_DIR_FROM_REFERENCE)) { - BuildOps(ops, config, context, srcColorSpace->getTransform(COLORSPACE_DIR_FROM_REFERENCE), - TRANSFORM_DIR_INVERSE); + BuildOps( + ops, + config, + context, + srcColorSpace->getTransform(COLORSPACE_DIR_FROM_REFERENCE), + TRANSFORM_DIR_INVERSE); } // Otherwise, both are not defined so its a no-op. This is not an error condition. } -void BuildColorSpaceFromReferenceOps(OpRcPtrVec & ops, - const Config & config, - const ConstContextRcPtr & context, - const ConstColorSpaceRcPtr & dstColorSpace, - bool dataBypass) +void BuildColorSpaceFromReferenceOps( + OpRcPtrVec & ops, + const Config & config, + const ConstContextRcPtr & context, + const ConstColorSpaceRcPtr & dstColorSpace, + bool dataBypass) { if (!dstColorSpace) throw Exception("BuildColorSpaceOps failed, null colorSpace."); @@ -324,13 +340,21 @@ void BuildColorSpaceFromReferenceOps(OpRcPtrVec & ops, // * cs->ref in the inverse direction. if (dstColorSpace->getTransform(COLORSPACE_DIR_FROM_REFERENCE)) { - BuildOps(ops, config, context, dstColorSpace->getTransform(COLORSPACE_DIR_FROM_REFERENCE), - TRANSFORM_DIR_FORWARD); + BuildOps( + ops, + config, + context, + dstColorSpace->getTransform(COLORSPACE_DIR_FROM_REFERENCE), + TRANSFORM_DIR_FORWARD); } else if (dstColorSpace->getTransform(COLORSPACE_DIR_TO_REFERENCE)) { - BuildOps(ops, config, context, dstColorSpace->getTransform(COLORSPACE_DIR_TO_REFERENCE), - TRANSFORM_DIR_INVERSE); + BuildOps( + ops, + config, + context, + dstColorSpace->getTransform(COLORSPACE_DIR_TO_REFERENCE), + TRANSFORM_DIR_INVERSE); } // Otherwise, both are not defined so its a no-op. This is not an error condition. @@ -345,11 +369,12 @@ void BuildColorSpaceFromReferenceOps(OpRcPtrVec & ops, CreateGpuAllocationNoOp(ops, dstAllocation); } -void BuildReferenceConversionOps(OpRcPtrVec & ops, - const Config & config, - const ConstContextRcPtr & context, - ReferenceSpaceType srcReferenceSpace, - ReferenceSpaceType dstReferenceSpace) +void BuildReferenceConversionOps( + OpRcPtrVec & ops, + const Config & config, + const ConstContextRcPtr & context, + ReferenceSpaceType srcReferenceSpace, + ReferenceSpaceType dstReferenceSpace) { if (srcReferenceSpace != dstReferenceSpace) { @@ -360,43 +385,57 @@ void BuildReferenceConversionOps(OpRcPtrVec & ops, throw Exception("There is no view transform between the main scene-referred space " "and the display-referred space."); } - if (srcReferenceSpace == REFERENCE_SPACE_SCENE) // convert scene-referred to display-referred + if (srcReferenceSpace + == REFERENCE_SPACE_SCENE) // convert scene-referred to display-referred { if (view->getTransform(VIEWTRANSFORM_DIR_FROM_REFERENCE)) { - BuildOps(ops, config, context, - view->getTransform(VIEWTRANSFORM_DIR_FROM_REFERENCE), - TRANSFORM_DIR_FORWARD); + BuildOps( + ops, + config, + context, + view->getTransform(VIEWTRANSFORM_DIR_FROM_REFERENCE), + TRANSFORM_DIR_FORWARD); } else if (view->getTransform(VIEWTRANSFORM_DIR_TO_REFERENCE)) { - BuildOps(ops, config, context, - view->getTransform(VIEWTRANSFORM_DIR_TO_REFERENCE), - TRANSFORM_DIR_INVERSE); + BuildOps( + ops, + config, + context, + view->getTransform(VIEWTRANSFORM_DIR_TO_REFERENCE), + TRANSFORM_DIR_INVERSE); } } else // convert display-referred to scene-referred { if (view->getTransform(VIEWTRANSFORM_DIR_TO_REFERENCE)) { - BuildOps(ops, config, context, - view->getTransform(VIEWTRANSFORM_DIR_TO_REFERENCE), - TRANSFORM_DIR_FORWARD); + BuildOps( + ops, + config, + context, + view->getTransform(VIEWTRANSFORM_DIR_TO_REFERENCE), + TRANSFORM_DIR_FORWARD); } else if (view->getTransform(VIEWTRANSFORM_DIR_FROM_REFERENCE)) { - BuildOps(ops, config, context, - view->getTransform(VIEWTRANSFORM_DIR_FROM_REFERENCE), - TRANSFORM_DIR_INVERSE); + BuildOps( + ops, + config, + context, + view->getTransform(VIEWTRANSFORM_DIR_FROM_REFERENCE), + TRANSFORM_DIR_INVERSE); } } } } -bool CollectContextVariables(const Config & config, - const Context & context, - ConstNamedTransformRcPtr & nt, - ContextRcPtr & usedContextVars) +bool CollectContextVariables( + const Config & config, + const Context & context, + ConstNamedTransformRcPtr & nt, + ContextRcPtr & usedContextVars) { bool foundContextVars = false; @@ -418,10 +457,11 @@ bool CollectContextVariables(const Config & config, return foundContextVars; } -bool CollectContextVariables(const Config & config, - const Context & context, - ConstColorSpaceRcPtr & cs, - ContextRcPtr & usedContextVars) +bool CollectContextVariables( + const Config & config, + const Context & context, + ConstColorSpaceRcPtr & cs, + ContextRcPtr & usedContextVars) { bool foundContextVars = false; @@ -443,13 +483,14 @@ bool CollectContextVariables(const Config & config, return foundContextVars; } -bool CollectContextVariables(const Config & config, - const Context & context, - const ColorSpaceTransform & tr, - ContextRcPtr & usedContextVars) +bool CollectContextVariables( + const Config & config, + const Context & context, + const ColorSpaceTransform & tr, + ContextRcPtr & usedContextVars) { bool foundContextVars = false; - + // NB: The search could return false positive but should not miss anything i.e. it looks // for context variables in both directions even if only one will be used. diff --git a/src/OpenColorIO/transforms/DisplayViewTransform.cpp b/src/OpenColorIO/transforms/DisplayViewTransform.cpp index 629008cf3b..df76492950 100644 --- a/src/OpenColorIO/transforms/DisplayViewTransform.cpp +++ b/src/OpenColorIO/transforms/DisplayViewTransform.cpp @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #include #include @@ -11,7 +10,6 @@ #include "NamedTransform.h" #include "OpBuilders.h" - namespace OCIO_NAMESPACE { @@ -20,7 +18,7 @@ DisplayViewTransformRcPtr DisplayViewTransform::Create() return DisplayViewTransformRcPtr(new DisplayViewTransform(), &deleter); } -void DisplayViewTransform::deleter(DisplayViewTransform* t) +void DisplayViewTransform::deleter(DisplayViewTransform * t) { delete t; } @@ -28,18 +26,18 @@ void DisplayViewTransform::deleter(DisplayViewTransform* t) class DisplayViewTransform::Impl { public: - TransformDirection m_dir{ TRANSFORM_DIR_FORWARD }; + TransformDirection m_dir{TRANSFORM_DIR_FORWARD}; std::string m_src; std::string m_display; std::string m_view; - bool m_looksBypass{ false }; - bool m_dataBypass{ true }; + bool m_looksBypass{false}; + bool m_dataBypass{true}; - Impl() = default; - Impl(const Impl &) = delete; - ~Impl() = default; - Impl& operator= (const Impl & rhs) = default; + Impl() = default; + Impl(const Impl &) = delete; + ~Impl() = default; + Impl & operator=(const Impl & rhs) = default; }; /////////////////////////////////////////////////////////////////////////// @@ -52,7 +50,7 @@ DisplayViewTransform::DisplayViewTransform() TransformRcPtr DisplayViewTransform::createEditableCopy() const { DisplayViewTransformRcPtr transform = DisplayViewTransform::Create(); - *(transform->m_impl) = *m_impl; // Perform a deep copy. + *(transform->m_impl) = *m_impl; // Perform a deep copy. return transform; } @@ -151,7 +149,7 @@ bool DisplayViewTransform::getDataBypass() const noexcept return getImpl()->m_dataBypass; } -std::ostream& operator<< (std::ostream& os, const DisplayViewTransform& t) +std::ostream & operator<<(std::ostream & os, const DisplayViewTransform & t) { os << "getReferenceSpaceType(); + const auto vtRef = viewTransform->getReferenceSpaceType(); const auto curCSRef = sourceCS->getReferenceSpaceType(); BuildReferenceConversionOps(ops, config, context, curCSRef, vtRef); // Apply view transform. if (viewTransform->getTransform(VIEWTRANSFORM_DIR_FROM_REFERENCE)) { - BuildOps(ops, config, context, - viewTransform->getTransform(VIEWTRANSFORM_DIR_FROM_REFERENCE), - TRANSFORM_DIR_FORWARD); + BuildOps( + ops, + config, + context, + viewTransform->getTransform(VIEWTRANSFORM_DIR_FROM_REFERENCE), + TRANSFORM_DIR_FORWARD); } else if (viewTransform->getTransform(VIEWTRANSFORM_DIR_TO_REFERENCE)) { - BuildOps(ops, config, context, - viewTransform->getTransform(VIEWTRANSFORM_DIR_TO_REFERENCE), - TRANSFORM_DIR_INVERSE); + BuildOps( + ops, + config, + context, + viewTransform->getTransform(VIEWTRANSFORM_DIR_TO_REFERENCE), + TRANSFORM_DIR_INVERSE); } else { @@ -219,13 +224,14 @@ void BuildSourceToDisplay(OpRcPtrVec & ops, // Helper function to build the list of ops to convert from the display color space (using a view // transform) to the source color space. This is used when building ops in the inverse direction. -void BuildDisplayToSource(OpRcPtrVec & ops, - const Config & config, - const ConstContextRcPtr & context, - const ConstColorSpaceRcPtr & displayCS, - const ConstViewTransformRcPtr & viewTransform, - const ConstColorSpaceRcPtr & sourceCS, - bool dataBypass) +void BuildDisplayToSource( + OpRcPtrVec & ops, + const Config & config, + const ConstContextRcPtr & context, + const ConstColorSpaceRcPtr & displayCS, + const ConstViewTransformRcPtr & viewTransform, + const ConstColorSpaceRcPtr & sourceCS, + bool dataBypass) { // Convert to the display-referred reference space from the displayColorSpace. BuildColorSpaceToReferenceOps(ops, config, context, displayCS, dataBypass); @@ -233,15 +239,21 @@ void BuildDisplayToSource(OpRcPtrVec & ops, // Apply view transform inverted. if (viewTransform->getTransform(VIEWTRANSFORM_DIR_TO_REFERENCE)) { - BuildOps(ops, config, context, - viewTransform->getTransform(VIEWTRANSFORM_DIR_TO_REFERENCE), - TRANSFORM_DIR_FORWARD); + BuildOps( + ops, + config, + context, + viewTransform->getTransform(VIEWTRANSFORM_DIR_TO_REFERENCE), + TRANSFORM_DIR_FORWARD); } else if (viewTransform->getTransform(VIEWTRANSFORM_DIR_FROM_REFERENCE)) { - BuildOps(ops, config, context, - viewTransform->getTransform(VIEWTRANSFORM_DIR_FROM_REFERENCE), - TRANSFORM_DIR_INVERSE); + BuildOps( + ops, + config, + context, + viewTransform->getTransform(VIEWTRANSFORM_DIR_FROM_REFERENCE), + TRANSFORM_DIR_INVERSE); } else { @@ -253,7 +265,7 @@ void BuildDisplayToSource(OpRcPtrVec & ops, // If necessary, convert from the type of reference space used by the view transform to the // reference space of the source color space. - const auto vtRef = viewTransform->getReferenceSpaceType(); + const auto vtRef = viewTransform->getReferenceSpaceType(); const auto inCSRef = sourceCS->getReferenceSpaceType(); BuildReferenceConversionOps(ops, config, context, vtRef, inCSRef); @@ -261,12 +273,13 @@ void BuildDisplayToSource(OpRcPtrVec & ops, BuildColorSpaceFromReferenceOps(ops, config, context, sourceCS, dataBypass); } -void BuildNamedTransformToDisplay(OpRcPtrVec & ops, - const Config & config, - const ConstContextRcPtr & context, - const ConstNamedTransformRcPtr & viewNamedTransform, - const ConstColorSpaceRcPtr & displayCS, - bool dataBypass) +void BuildNamedTransformToDisplay( + OpRcPtrVec & ops, + const Config & config, + const ConstContextRcPtr & context, + const ConstNamedTransformRcPtr & viewNamedTransform, + const ConstColorSpaceRcPtr & displayCS, + bool dataBypass) { // Apply view named transform. auto transform = NamedTransform::GetTransform(viewNamedTransform, TRANSFORM_DIR_FORWARD); @@ -276,12 +289,13 @@ void BuildNamedTransformToDisplay(OpRcPtrVec & ops, BuildColorSpaceFromReferenceOps(ops, config, context, displayCS, dataBypass); } -void BuildDisplayToNamedTransform(OpRcPtrVec & ops, - const Config & config, - const ConstContextRcPtr & context, - const ConstColorSpaceRcPtr & displayCS, - const ConstNamedTransformRcPtr & viewNamedTransform, - bool dataBypass) +void BuildDisplayToNamedTransform( + OpRcPtrVec & ops, + const Config & config, + const ConstContextRcPtr & context, + const ConstColorSpaceRcPtr & displayCS, + const ConstNamedTransformRcPtr & viewNamedTransform, + bool dataBypass) { // Convert to the display-referred reference space from the displayColorSpace. BuildColorSpaceToReferenceOps(ops, config, context, displayCS, dataBypass); @@ -292,11 +306,12 @@ void BuildDisplayToNamedTransform(OpRcPtrVec & ops, } // Build ops for a display/view transform. -void BuildDisplayOps(OpRcPtrVec & ops, - const Config & config, - const ConstContextRcPtr & context, - const DisplayViewTransform & displayViewTransform, - TransformDirection dir) +void BuildDisplayOps( + OpRcPtrVec & ops, + const Config & config, + const ConstContextRcPtr & context, + const DisplayViewTransform & displayViewTransform, + TransformDirection dir) { // There are two ways of specifying a DisplayViewTransform: either with a colorspace, or with // a view_transform plus display_colorspace. It is permitted to substitute a named_transform @@ -307,7 +322,7 @@ void BuildDisplayOps(OpRcPtrVec & ops, // Validate src color space. const std::string srcColorSpaceName = displayViewTransform.getSrc(); - ConstColorSpaceRcPtr srcColorSpace = config.getColorSpace(srcColorSpaceName.c_str()); + ConstColorSpaceRcPtr srcColorSpace = config.getColorSpace(srcColorSpaceName.c_str()); if (!srcColorSpace) { std::ostringstream os; @@ -334,8 +349,8 @@ void BuildDisplayOps(OpRcPtrVec & ops, const std::string view = displayViewTransform.getView(); // Get the view transform if any: if it exists, it can be a view transform or a named transform. - const std::string viewTransformName = config.getDisplayViewTransformName(display.c_str(), - view.c_str()); + const std::string viewTransformName + = config.getDisplayViewTransformName(display.c_str(), view.c_str()); ConstViewTransformRcPtr viewTransform; ConstNamedTransformRcPtr viewNamedTransform; if (!viewTransformName.empty()) @@ -370,7 +385,7 @@ void BuildDisplayOps(OpRcPtrVec & ops, // color space in the config. // 3. Else, the "display_colorspace" string if it's a View with a "view_transform". // - // (Though, in the implementation, both the "colorspace" and "display_colorspace" of + // (Though, in the implementation, both the "colorspace" and "display_colorspace" of // a View are stored in the same variable and there is currently no validation to ensure // for example that "display_colorspace" is not used if there is no view transform. // So it's really the presence or absence of the "view_transform" that determines how @@ -388,7 +403,7 @@ void BuildDisplayOps(OpRcPtrVec & ops, throw Exception(os.str().c_str()); } - // Note: If there is a view transform, the display color space isn't allowed to be a + // Note: If there is a view transform, the display color space isn't allowed to be a // named transform, hence the error message only says "color space". if (viewTransform || viewNamedTransform) { @@ -400,7 +415,7 @@ void BuildDisplayOps(OpRcPtrVec & ops, } // At this point, there is no view transform, so displayColorSpaceName is typically - // from the "colorspace" attribute of the View, not the "display_colorspace". The + // from the "colorspace" attribute of the View, not the "display_colorspace". The // former may be a named transform but the latter may not (since a view transform // is present.) csNamedTransform = config.getNamedTransform(displayColorSpaceName.c_str()); @@ -415,8 +430,8 @@ void BuildDisplayOps(OpRcPtrVec & ops, } // By default, data color spaces are not processed. - const bool dataBypass = displayViewTransform.getDataBypass(); - const bool srcData = (srcColorSpace && srcColorSpace->isData()) ? true : false; + const bool dataBypass = displayViewTransform.getDataBypass(); + const bool srcData = (srcColorSpace && srcColorSpace->isData()) ? true : false; const bool displayData = (displayColorSpace && displayColorSpace->isData()) ? true : false; if (dataBypass && (srcData || displayData)) { @@ -436,101 +451,124 @@ void BuildDisplayOps(OpRcPtrVec & ops, const auto combinedDir = CombineTransformDirections(dir, displayViewTransform.getDirection()); switch (combinedDir) { - case TRANSFORM_DIR_FORWARD: - { - // Start from src color space. - ConstColorSpaceRcPtr currentCS = srcColorSpace; - - // Apply looks if needed. - if (!looks.empty()) + case TRANSFORM_DIR_FORWARD: { - // Note that this updates the currentCS to be the process space of the last look - // applied. - BuildLookOps(ops, currentCS, false, config, context, looks); - } + // Start from src color space. + ConstColorSpaceRcPtr currentCS = srcColorSpace; - if (csNamedTransform) - { - // Ignore currentCS. The forward direction NamedTransform is used for the forward - // direction DisplayViewTransform. - auto transform = NamedTransform::GetTransform(csNamedTransform, - TRANSFORM_DIR_FORWARD); - BuildOps(ops, config, context, transform, TRANSFORM_DIR_FORWARD); - } - else if (viewNamedTransform) - { - BuildNamedTransformToDisplay(ops, config, context, viewNamedTransform, - displayColorSpace, dataBypass); - } - else if (viewTransform) - { - BuildSourceToDisplay(ops, config, context, currentCS, viewTransform, - displayColorSpace, dataBypass); - } - else - { - // This is the simple case where the View only had the "colorspace" attribute, - // which is referred to here as displayColorSpace. Apply the conversion to there - // from the current color space (which may vary if a look was applied). - BuildColorSpaceOps(ops, config, context, currentCS, displayColorSpace, dataBypass); - } - break; - } - case TRANSFORM_DIR_INVERSE: - { - // The source color space of the view transform might need to be computed. In forward, - // looks (if present) are applied and will change the current color space that is used - // as the starting point of the view transform. Looks need to be used in order to find - // what color space to use for the view transform in the inverse direction. - ConstColorSpaceRcPtr vtSourceCS = srcColorSpace; - if (!looks.empty()) - { - // Get the result color space of applying the looks in the forward direction. - const char * csRes = LooksResultColorSpace(config, context, looks); - vtSourceCS = config.getColorSpace(csRes); - } + // Apply looks if needed. + if (!looks.empty()) + { + // Note that this updates the currentCS to be the process space of the last look + // applied. + BuildLookOps(ops, currentCS, false, config, context, looks); + } - if (csNamedTransform) - { - // Ignore currentCS. - auto transform = NamedTransform::GetTransform(csNamedTransform, - TRANSFORM_DIR_INVERSE); - BuildOps(ops, config, context, transform, TRANSFORM_DIR_FORWARD); - } - else if (viewNamedTransform) - { - BuildDisplayToNamedTransform(ops, config, context, displayColorSpace, - viewNamedTransform, dataBypass); - } - else if (viewTransform) - { - BuildDisplayToSource(ops, config, context, displayColorSpace, viewTransform, - vtSourceCS, dataBypass); + if (csNamedTransform) + { + // Ignore currentCS. The forward direction NamedTransform is used for the forward + // direction DisplayViewTransform. + auto transform + = NamedTransform::GetTransform(csNamedTransform, TRANSFORM_DIR_FORWARD); + BuildOps(ops, config, context, transform, TRANSFORM_DIR_FORWARD); + } + else if (viewNamedTransform) + { + BuildNamedTransformToDisplay( + ops, + config, + context, + viewNamedTransform, + displayColorSpace, + dataBypass); + } + else if (viewTransform) + { + BuildSourceToDisplay( + ops, + config, + context, + currentCS, + viewTransform, + displayColorSpace, + dataBypass); + } + else + { + // This is the simple case where the View only had the "colorspace" attribute, + // which is referred to here as displayColorSpace. Apply the conversion to there + // from the current color space (which may vary if a look was applied). + BuildColorSpaceOps(ops, config, context, currentCS, displayColorSpace, dataBypass); + } + break; } - else + case TRANSFORM_DIR_INVERSE: { - // Apply the conversion from the display color space to the vtSourceCS. - BuildColorSpaceOps(ops, config, context, displayColorSpace, vtSourceCS, dataBypass); - } + // The source color space of the view transform might need to be computed. In forward, + // looks (if present) are applied and will change the current color space that is used + // as the starting point of the view transform. Looks need to be used in order to find + // what color space to use for the view transform in the inverse direction. + ConstColorSpaceRcPtr vtSourceCS = srcColorSpace; + if (!looks.empty()) + { + // Get the result color space of applying the looks in the forward direction. + const char * csRes = LooksResultColorSpace(config, context, looks); + vtSourceCS = config.getColorSpace(csRes); + } - if (!looks.empty()) - { - // Apply looks in inverse direction. Note that vtSourceCS is updated. - looks.reverse(); - BuildLookOps(ops, vtSourceCS, false, config, context, looks); + if (csNamedTransform) + { + // Ignore currentCS. + auto transform + = NamedTransform::GetTransform(csNamedTransform, TRANSFORM_DIR_INVERSE); + BuildOps(ops, config, context, transform, TRANSFORM_DIR_FORWARD); + } + else if (viewNamedTransform) + { + BuildDisplayToNamedTransform( + ops, + config, + context, + displayColorSpace, + viewNamedTransform, + dataBypass); + } + else if (viewTransform) + { + BuildDisplayToSource( + ops, + config, + context, + displayColorSpace, + viewTransform, + vtSourceCS, + dataBypass); + } + else + { + // Apply the conversion from the display color space to the vtSourceCS. + BuildColorSpaceOps(ops, config, context, displayColorSpace, vtSourceCS, dataBypass); + } + + if (!looks.empty()) + { + // Apply looks in inverse direction. Note that vtSourceCS is updated. + looks.reverse(); + BuildLookOps(ops, vtSourceCS, false, config, context, looks); - // End in srcColorSpace. - BuildColorSpaceOps(ops, config, context, vtSourceCS, srcColorSpace, dataBypass); + // End in srcColorSpace. + BuildColorSpaceOps(ops, config, context, vtSourceCS, srcColorSpace, dataBypass); + } + break; } - break; - } } } -bool CollectContextVariables(const Config & config, - const Context & context, - const DisplayViewTransform & tr, - ContextRcPtr & usedContextVars) +bool CollectContextVariables( + const Config & config, + const Context & context, + const DisplayViewTransform & tr, + ContextRcPtr & usedContextVars) { bool foundContextVars = false; @@ -586,7 +624,8 @@ bool CollectContextVariables(const Config & config, for (const auto & token : tokens) { ConstLookRcPtr look = config.getLook(token.name.c_str()); - if (look && CollectContextVariables(config, context, token.dir, *look, usedContextVars)) + if (look + && CollectContextVariables(config, context, token.dir, *look, usedContextVars)) { foundContextVars = true; } diff --git a/src/OpenColorIO/transforms/ExponentTransform.cpp b/src/OpenColorIO/transforms/ExponentTransform.cpp old mode 100755 new mode 100644 index 719c9b44dc..d776608739 --- a/src/OpenColorIO/transforms/ExponentTransform.cpp +++ b/src/OpenColorIO/transforms/ExponentTransform.cpp @@ -22,8 +22,8 @@ void ExponentTransformImpl::deleter(ExponentTransform * t) TransformRcPtr ExponentTransformImpl::createEditableCopy() const { - TransformRcPtr transform = ExponentTransform::Create(); - dynamic_cast(transform.get())->data() = data(); + TransformRcPtr transform = ExponentTransform::Create(); + dynamic_cast(transform.get())->data() = data(); return transform; } @@ -44,7 +44,7 @@ void ExponentTransformImpl::validate() const Transform::validate(); data().validate(); } - catch(Exception & ex) + catch (Exception & ex) { std::string errMsg("ExponentTransform validation failed: "); errMsg += ex.what(); @@ -64,23 +64,24 @@ const FormatMetadata & ExponentTransformImpl::getFormatMetadata() const noexcept bool ExponentTransformImpl::equals(const ExponentTransform & other) const noexcept { - if (this == &other) return true; - return data() == dynamic_cast(&other)->data(); + if (this == &other) + return true; + return data() == dynamic_cast(&other)->data(); } -void ExponentTransformImpl::setValue(const double(&vec4)[4]) noexcept +void ExponentTransformImpl::setValue(const double (&vec4)[4]) noexcept { - data().getRedParams() [0] = vec4[0]; + data().getRedParams()[0] = vec4[0]; data().getGreenParams()[0] = vec4[1]; - data().getBlueParams() [0] = vec4[2]; + data().getBlueParams()[0] = vec4[2]; data().getAlphaParams()[0] = vec4[3]; } -void ExponentTransformImpl::getValue(double(&vec4)[4]) const noexcept +void ExponentTransformImpl::getValue(double (&vec4)[4]) const noexcept { - vec4[0] = data().getRedParams() [0]; + vec4[0] = data().getRedParams()[0]; vec4[1] = data().getGreenParams()[0]; - vec4[2] = data().getBlueParams() [0]; + vec4[2] = data().getBlueParams()[0]; vec4[3] = data().getAlphaParams()[0]; } @@ -95,7 +96,7 @@ void ExponentTransformImpl::setNegativeStyle(NegativeStyle style) data().setStyle(GammaOpData::ConvertStyleBasic(style, curDir)); } -std::ostream & operator<< (std::ostream & os, const ExponentTransform & t) +std::ostream & operator<<(std::ostream & os, const ExponentTransform & t) { double value[4]; t.getValue(value); @@ -114,6 +115,4 @@ std::ostream & operator<< (std::ostream & os, const ExponentTransform & t) return os; } - } // namespace OCIO_NAMESPACE - diff --git a/src/OpenColorIO/transforms/ExponentTransform.h b/src/OpenColorIO/transforms/ExponentTransform.h index 1fbe6dddc7..5654bf1b43 100644 --- a/src/OpenColorIO/transforms/ExponentTransform.h +++ b/src/OpenColorIO/transforms/ExponentTransform.h @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_EXPONENTTRANSFORM_H #define INCLUDED_OCIO_EXPONENTTRANSFORM_H @@ -9,17 +8,16 @@ #include "ops/gamma/GammaOpData.h" - namespace OCIO_NAMESPACE { class ExponentTransformImpl : public ExponentTransform { public: - ExponentTransformImpl() = default; - ExponentTransformImpl(const ExponentTransformImpl &) = delete; + ExponentTransformImpl() = default; + ExponentTransformImpl(const ExponentTransformImpl &) = delete; ExponentTransformImpl & operator=(const ExponentTransformImpl &) = delete; - virtual ~ExponentTransformImpl() = default; + virtual ~ExponentTransformImpl() = default; TransformRcPtr createEditableCopy() const override; @@ -33,8 +31,8 @@ class ExponentTransformImpl : public ExponentTransform bool equals(const ExponentTransform & other) const noexcept override; - void getValue(double(&values)[4]) const noexcept override; - void setValue(const double(&values)[4]) noexcept override; + void getValue(double (&values)[4]) const noexcept override; + void setValue(const double (&values)[4]) noexcept override; NegativeStyle getNegativeStyle() const override; void setNegativeStyle(NegativeStyle style) override; @@ -48,7 +46,6 @@ class ExponentTransformImpl : public ExponentTransform GammaOpData m_data; }; - } // namespace OCIO_NAMESPACE -#endif // INCLUDED_OCIO_EXPONENTTRANSFORM_H +#endif // INCLUDED_OCIO_EXPONENTTRANSFORM_H diff --git a/src/OpenColorIO/transforms/ExponentWithLinearTransform.cpp b/src/OpenColorIO/transforms/ExponentWithLinearTransform.cpp index 53c4ca480b..b1e0e01b14 100644 --- a/src/OpenColorIO/transforms/ExponentWithLinearTransform.cpp +++ b/src/OpenColorIO/transforms/ExponentWithLinearTransform.cpp @@ -13,8 +13,9 @@ namespace OCIO_NAMESPACE ExponentWithLinearTransformRcPtr ExponentWithLinearTransform::Create() { - return ExponentWithLinearTransformRcPtr(new ExponentWithLinearTransformImpl(), - &ExponentWithLinearTransformImpl::deleter); + return ExponentWithLinearTransformRcPtr( + new ExponentWithLinearTransformImpl(), + &ExponentWithLinearTransformImpl::deleter); } void ExponentWithLinearTransformImpl::deleter(ExponentWithLinearTransform * t) @@ -24,10 +25,10 @@ void ExponentWithLinearTransformImpl::deleter(ExponentWithLinearTransform * t) ExponentWithLinearTransformImpl::ExponentWithLinearTransformImpl() { - data().setRedParams({ 1., 0. }); - data().setGreenParams({ 1., 0. }); - data().setBlueParams({ 1., 0. }); - data().setAlphaParams({ 1., 0. }); + data().setRedParams({1., 0.}); + data().setGreenParams({1., 0.}); + data().setBlueParams({1., 0.}); + data().setAlphaParams({1., 0.}); data().setStyle(GammaOpData::MONCURVE_FWD); } @@ -35,7 +36,7 @@ ExponentWithLinearTransformImpl::ExponentWithLinearTransformImpl() TransformRcPtr ExponentWithLinearTransformImpl::createEditableCopy() const { TransformRcPtr transform = ExponentWithLinearTransform::Create(); - dynamic_cast(transform.get())->data() = data(); + dynamic_cast(transform.get())->data() = data(); return transform; } @@ -82,34 +83,36 @@ const FormatMetadata & ExponentWithLinearTransformImpl::getFormatMetadata() cons return data().getFormatMetadata(); } -bool ExponentWithLinearTransformImpl::equals(const ExponentWithLinearTransform & other) const noexcept +bool ExponentWithLinearTransformImpl::equals( + const ExponentWithLinearTransform & other) const noexcept { - if (this == &other) return true; - return data() == dynamic_cast(&other)->data(); + if (this == &other) + return true; + return data() == dynamic_cast(&other)->data(); } -void ExponentWithLinearTransformImpl::setGamma(const double(&values)[4]) noexcept +void ExponentWithLinearTransformImpl::setGamma(const double (&values)[4]) noexcept { - data().getRedParams() [0] = values[0]; + data().getRedParams()[0] = values[0]; data().getGreenParams()[0] = values[1]; - data().getBlueParams() [0] = values[2]; + data().getBlueParams()[0] = values[2]; data().getAlphaParams()[0] = values[3]; } -void ExponentWithLinearTransformImpl::getGamma(double(&values)[4]) const noexcept +void ExponentWithLinearTransformImpl::getGamma(double (&values)[4]) const noexcept { - values[0] = data().getRedParams() [0]; + values[0] = data().getRedParams()[0]; values[1] = data().getGreenParams()[0]; - values[2] = data().getBlueParams() [0]; + values[2] = data().getBlueParams()[0]; values[3] = data().getAlphaParams()[0]; } -void ExponentWithLinearTransformImpl::setOffset(const double(&values)[4]) noexcept +void ExponentWithLinearTransformImpl::setOffset(const double (&values)[4]) noexcept { - const GammaOpData::Params red = { data().getRedParams() [0], values[0] }; - const GammaOpData::Params grn = { data().getGreenParams()[0], values[1] }; - const GammaOpData::Params blu = { data().getBlueParams() [0], values[2] }; - const GammaOpData::Params alp = { data().getAlphaParams()[0], values[3] }; + const GammaOpData::Params red = {data().getRedParams()[0], values[0]}; + const GammaOpData::Params grn = {data().getGreenParams()[0], values[1]}; + const GammaOpData::Params blu = {data().getBlueParams()[0], values[2]}; + const GammaOpData::Params alp = {data().getAlphaParams()[0], values[3]}; data().setRedParams(red); data().setGreenParams(grn); @@ -117,12 +120,12 @@ void ExponentWithLinearTransformImpl::setOffset(const double(&values)[4]) noexce data().setAlphaParams(alp); } -void ExponentWithLinearTransformImpl::getOffset(double(&values)[4]) const noexcept +void ExponentWithLinearTransformImpl::getOffset(double (&values)[4]) const noexcept { - values[0] = data().getRedParams().size() == 2 ? data().getRedParams() [1] : 0.; - values[1] = data().getGreenParams().size()== 2 ? data().getGreenParams()[1] : 0.; - values[2] = data().getBlueParams().size() == 2 ? data().getBlueParams() [1] : 0.; - values[3] = data().getAlphaParams().size()== 2 ? data().getAlphaParams()[1] : 0.; + values[0] = data().getRedParams().size() == 2 ? data().getRedParams()[1] : 0.; + values[1] = data().getGreenParams().size() == 2 ? data().getGreenParams()[1] : 0.; + values[2] = data().getBlueParams().size() == 2 ? data().getBlueParams()[1] : 0.; + values[3] = data().getAlphaParams().size() == 2 ? data().getAlphaParams()[1] : 0.; } NegativeStyle ExponentWithLinearTransformImpl::getNegativeStyle() const @@ -133,11 +136,11 @@ NegativeStyle ExponentWithLinearTransformImpl::getNegativeStyle() const void ExponentWithLinearTransformImpl::setNegativeStyle(NegativeStyle style) { const auto dir = getDirection(); - auto styleOp = GammaOpData::ConvertStyleMonCurve(style, dir); + auto styleOp = GammaOpData::ConvertStyleMonCurve(style, dir); data().setStyle(styleOp); } -std::ostream & operator<< (std::ostream & os, const ExponentWithLinearTransform & t) +std::ostream & operator<<(std::ostream & os, const ExponentWithLinearTransform & t) { os << "(transform.get())->data() = data(); + dynamic_cast(transform.get())->data() = data(); return transform; } @@ -63,8 +64,9 @@ const FormatMetadata & ExposureContrastTransformImpl::getFormatMetadata() const bool ExposureContrastTransformImpl::equals(const ExposureContrastTransform & other) const noexcept { - if (this == &other) return true; - return data() == dynamic_cast(&other)->data(); + if (this == &other) + return true; + return data() == dynamic_cast(&other)->data(); } ExposureContrastStyle ExposureContrastTransformImpl::getStyle() const @@ -183,8 +185,7 @@ void ExposureContrastTransformImpl::setLogMidGray(double logMidGray) return data().setLogMidGray(logMidGray); } - -std::ostream& operator<< (std::ostream & os, const ExposureContrastTransform & t) +std::ostream & operator<<(std::ostream & os, const ExposureContrastTransform & t) { os << " #include +#include +#include #include #include #include -#include -#include #include @@ -18,9 +18,9 @@ #include "Logging.h" #include "Mutex.h" #include "OCIOZArchive.h" -#include "ops/noop/NoOps.h" #include "PathUtils.h" #include "Platform.h" +#include "ops/noop/NoOps.h" #include "utils/StringUtils.h" namespace OCIO_NAMESPACE @@ -30,7 +30,7 @@ FileTransformRcPtr FileTransform::Create() return FileTransformRcPtr(new FileTransform(), &deleter); } -void FileTransform::deleter(FileTransform* t) +void FileTransform::deleter(FileTransform * t) { delete t; } @@ -38,17 +38,17 @@ void FileTransform::deleter(FileTransform* t) class FileTransform::Impl { public: - TransformDirection m_dir{ TRANSFORM_DIR_FORWARD }; - Interpolation m_interp{ INTERP_DEFAULT }; + TransformDirection m_dir{TRANSFORM_DIR_FORWARD}; + Interpolation m_interp{INTERP_DEFAULT}; std::string m_src; std::string m_cccid; - CDLStyle m_cdlStyle{ CDL_TRANSFORM_DEFAULT }; + CDLStyle m_cdlStyle{CDL_TRANSFORM_DEFAULT}; - Impl() = default; - Impl(const Impl &) = delete; - Impl & operator= (const Impl &) = default; - ~Impl() = default; + Impl() = default; + Impl(const Impl &) = delete; + Impl & operator=(const Impl &) = default; + ~Impl() = default; }; /////////////////////////////////////////////////////////////////////////// @@ -61,7 +61,7 @@ FileTransform::FileTransform() TransformRcPtr FileTransform::createEditableCopy() const { FileTransformRcPtr transform = FileTransform::Create(); - *(transform->m_impl) = *m_impl; + *(transform->m_impl) = *m_impl; return transform; } @@ -163,7 +163,7 @@ bool FileTransform::IsFormatExtensionSupported(const char * extension) return FormatRegistry::GetInstance().isFormatExtensionSupported(extension); } -std::ostream& operator<< (std::ostream& os, const FileTransform& t) +std::ostream & operator<<(std::ostream & os, const FileTransform & t) { os << "(m_rawFormats.size()); } -FileFormat* FormatRegistry::getRawFormatByIndex(int index) const +FileFormat * FormatRegistry::getRawFormatByIndex(int index) const { - if(index<0 || index>=getNumRawFormats()) + if (index < 0 || index >= getNumRawFormats()) { return NULL; } @@ -451,7 +450,7 @@ FileFormat* FormatRegistry::getRawFormatByIndex(int index) const int FormatRegistry::getNumFormats(int capability) const noexcept { - if(capability == FORMAT_CAPABILITY_READ) + if (capability == FORMAT_CAPABILITY_READ) { return static_cast(m_readFormatNames.size()); } @@ -468,9 +467,9 @@ int FormatRegistry::getNumFormats(int capability) const noexcept const char * FormatRegistry::getFormatNameByIndex(int capability, int index) const noexcept { - if(capability == FORMAT_CAPABILITY_READ) + if (capability == FORMAT_CAPABILITY_READ) { - if(index<0 || index>=static_cast(m_readFormatNames.size())) + if (index < 0 || index >= static_cast(m_readFormatNames.size())) { return ""; } @@ -478,15 +477,15 @@ const char * FormatRegistry::getFormatNameByIndex(int capability, int index) con } else if (capability == FORMAT_CAPABILITY_BAKE) { - if (index<0 || index >= static_cast(m_bakeFormatNames.size())) + if (index < 0 || index >= static_cast(m_bakeFormatNames.size())) { return ""; } return m_bakeFormatNames[index].c_str(); } - else if(capability == FORMAT_CAPABILITY_WRITE) + else if (capability == FORMAT_CAPABILITY_WRITE) { - if(index<0 || index>=static_cast(m_writeFormatNames.size())) + if (index < 0 || index >= static_cast(m_writeFormatNames.size())) { return ""; } @@ -497,10 +496,9 @@ const char * FormatRegistry::getFormatNameByIndex(int capability, int index) con const char * FormatRegistry::getFormatExtensionByIndex(int capability, int index) const noexcept { - if(capability == FORMAT_CAPABILITY_READ) + if (capability == FORMAT_CAPABILITY_READ) { - if(index<0 - || index>=static_cast(m_readFormatExtensions.size())) + if (index < 0 || index >= static_cast(m_readFormatExtensions.size())) { return ""; } @@ -508,17 +506,15 @@ const char * FormatRegistry::getFormatExtensionByIndex(int capability, int index } else if (capability == FORMAT_CAPABILITY_BAKE) { - if (index<0 - || index >= static_cast(m_bakeFormatExtensions.size())) + if (index < 0 || index >= static_cast(m_bakeFormatExtensions.size())) { return ""; } return m_bakeFormatExtensions[index].c_str(); } - else if(capability == FORMAT_CAPABILITY_WRITE) + else if (capability == FORMAT_CAPABILITY_WRITE) { - if(index<0 - || index>=static_cast(m_writeFormatExtensions.size())) + if (index < 0 || index >= static_cast(m_writeFormatExtensions.size())) { return ""; } @@ -557,34 +553,35 @@ bool FormatRegistry::isFormatExtensionSupported(const char * extension) const FileFormat::~FileFormat() { - } std::string FileFormat::getName() const { FormatInfoVec infoVec; getFormatInfo(infoVec); - if(infoVec.size()>0) + if (infoVec.size() > 0) { return infoVec[0].name; } return "Unknown Format"; } -void FileFormat::bake(const Baker & /*baker*/, - const std::string & formatName, - std::ostream & /*ostream*/) const +void FileFormat::bake( + const Baker & /*baker*/, + const std::string & formatName, + std::ostream & /*ostream*/) const { std::ostringstream os; os << "Format '" << formatName << "' does not support baking."; throw Exception(os.str().c_str()); } -void FileFormat::write(const ConstConfigRcPtr & /*config*/, - const ConstContextRcPtr & /*context*/, - const GroupTransform & /*group*/, - const std::string & formatName, - std::ostream & /*ostream*/) const +void FileFormat::write( + const ConstConfigRcPtr & /*config*/, + const ConstContextRcPtr & /*context*/, + const GroupTransform & /*group*/, + const std::string & formatName, + std::ostream & /*ostream*/) const { std::ostringstream os; os << "Format '" << formatName << "' does not support writing."; @@ -594,18 +591,18 @@ void FileFormat::write(const ConstConfigRcPtr & /*config*/, namespace { -void LoadFileUncached(FileFormat * & returnFormat, - CachedFileRcPtr & returnCachedFile, - const std::string & filepath, - Interpolation interp, - const Config& config) +void LoadFileUncached( + FileFormat *& returnFormat, + CachedFileRcPtr & returnCachedFile, + const std::string & filepath, + Interpolation interp, + const Config & config) { returnFormat = NULL; { std::ostringstream oss; - oss << "**" << std::endl - << "Opening " << filepath; + oss << "**" << std::endl << "Opening " << filepath; LogDebug(oss.str()); } @@ -615,28 +612,27 @@ void LoadFileUncached(FileFormat * & returnFormat, std::string root, extension; pystring::os::path::splitext(root, extension, filepath); // remove the leading '.' - extension = pystring::replace(extension,".","",1); + extension = pystring::replace(extension, ".", "", 1); FormatRegistry & formatRegistry = FormatRegistry::GetInstance(); FileFormatVector possibleFormats; formatRegistry.getFileFormatForExtension(extension, possibleFormats); FileFormatVector::const_iterator endFormat = possibleFormats.end(); - FileFormatVector::const_iterator itFormat = possibleFormats.begin(); - while(itFormat != endFormat) + FileFormatVector::const_iterator itFormat = possibleFormats.begin(); + while (itFormat != endFormat) { - FileFormat * tryFormat = *itFormat; + FileFormat * tryFormat = *itFormat; std::unique_ptr pStream = nullptr; try { pStream = getLutData( config, - filepath, - tryFormat->isBinary() ? std::ios_base::binary : std::ios_base::in - ); + filepath, + tryFormat->isBinary() ? std::ios_base::binary : std::ios_base::in); auto & filestream = *pStream; - + if (!filestream.good()) { std::ostringstream os; @@ -649,7 +645,7 @@ void LoadFileUncached(FileFormat * & returnFormat, CachedFileRcPtr cachedFile = tryFormat->read(filestream, filepath, interp); - if(IsDebugLoggingEnabled()) + if (IsDebugLoggingEnabled()) { std::ostringstream os; os << " Loaded primary format "; @@ -657,18 +653,18 @@ void LoadFileUncached(FileFormat * & returnFormat, LogDebug(os.str()); } - returnFormat = tryFormat; + returnFormat = tryFormat; returnCachedFile = cachedFile; closeLutStream(config, filestream); return; } - catch(std::exception & e) + catch (std::exception & e) { if (pStream) { - closeLutStream(config, *pStream); + closeLutStream(config, *pStream); } primaryErrorText += " '"; @@ -676,7 +672,7 @@ void LoadFileUncached(FileFormat * & returnFormat, primaryErrorText += "' failed with: "; primaryErrorText += e.what(); - if(IsDebugLoggingEnabled()) + if (IsDebugLoggingEnabled()) { std::ostringstream os; os << " Failed primary format "; @@ -692,16 +688,14 @@ void LoadFileUncached(FileFormat * & returnFormat, CachedFileRcPtr cachedFile; FileFormat * altFormat = NULL; - for(int findex = 0; - findex pStream = nullptr; @@ -709,11 +703,10 @@ void LoadFileUncached(FileFormat * & returnFormat, { pStream = getLutData( config, - filepath, - altFormat->isBinary() ? std::ios_base::binary : std::ios_base::in - ); - auto& filestream = *pStream; - + filepath, + altFormat->isBinary() ? std::ios_base::binary : std::ios_base::in); + auto & filestream = *pStream; + if (!filestream.good()) { std::ostringstream os; @@ -727,7 +720,7 @@ void LoadFileUncached(FileFormat * & returnFormat, cachedFile = altFormat->read(filestream, filepath, interp); - if(IsDebugLoggingEnabled()) + if (IsDebugLoggingEnabled()) { std::ostringstream os; os << " Loaded alt format "; @@ -735,21 +728,21 @@ void LoadFileUncached(FileFormat * & returnFormat, LogDebug(os.str()); } - returnFormat = altFormat; + returnFormat = altFormat; returnCachedFile = cachedFile; closeLutStream(config, filestream); return; } - catch(std::exception & e) + catch (std::exception & e) { if (pStream) { - closeLutStream(config, *pStream); + closeLutStream(config, *pStream); } - - if(IsDebugLoggingEnabled()) + + if (IsDebugLoggingEnabled()) { std::ostringstream os; os << " Failed alt format "; @@ -775,7 +768,7 @@ void LoadFileUncached(FileFormat * & returnFormat, os << "(Enable debug log for errors from all formats.) "; } - if(!possibleFormats.empty()) + if (!possibleFormats.empty()) { if (possibleFormats.size() == 1) { @@ -799,8 +792,8 @@ struct FileCacheResult { Mutex mutex; FileFormat * format = nullptr; - bool ready = false; - bool error = false; + bool ready = false; + bool error = false; CachedFileRcPtr cachedFile; std::string exceptionText; @@ -811,16 +804,16 @@ typedef OCIO_SHARED_PTR FileCacheResultPtr; } // namespace - // A global file content cache. template class GenericCache; GenericCache g_fileCache; -void GetCachedFileAndFormat(FileFormat * & format, - CachedFileRcPtr & cachedFile, - const std::string & filepath, - Interpolation interp, - const Config& config) +void GetCachedFileAndFormat( + FileFormat *& format, + CachedFileRcPtr & cachedFile, + const std::string & filepath, + Interpolation interp, + const Config & config) { // Have a two-mutex approach to decouple the cache entry creation from // the data creation. It was originally done to improve the multi-threaded @@ -830,7 +823,7 @@ void GetCachedFileAndFormat(FileFormat * & format, FileCacheResultPtr result; { AutoMutex guard(g_fileCache.lock()); - + if (g_fileCache.isEnabled()) { // As the entry is a shared pointer instance, having an empty one @@ -839,7 +832,7 @@ void GetCachedFileAndFormat(FileFormat * & format, result = g_fileCache[filepath]; if (!result) { - result = std::make_shared(); + result = std::make_shared(); g_fileCache[filepath] = result; } } @@ -863,7 +856,7 @@ void GetCachedFileAndFormat(FileFormat * & format, } catch (std::exception & e) { - result->error = true; + result->error = true; result->exceptionText = e.what(); } catch (...) @@ -882,7 +875,7 @@ void GetCachedFileAndFormat(FileFormat * & format, } else { - format = result->format; + format = result->format; cachedFile = result->cachedFile; } @@ -910,14 +903,15 @@ void ClearFileTransformCaches() g_fileCache.clear(); } -void BuildFileTransformOps(OpRcPtrVec & ops, - const Config& config, - const ConstContextRcPtr & context, - const FileTransform& fileTransform, - TransformDirection dir) +void BuildFileTransformOps( + OpRcPtrVec & ops, + const Config & config, + const ConstContextRcPtr & context, + const FileTransform & fileTransform, + TransformDirection dir) { std::string src = fileTransform.getSrc(); - if(src.empty()) + if (src.empty()) { std::ostringstream os; os << "The transform file has not been specified."; @@ -931,13 +925,13 @@ void BuildFileTransformOps(OpRcPtrVec & ops, { ConstOpRcPtr const_op(op); ConstOpDataRcPtr data = const_op->data(); - auto fileData = DynamicPtrCast(data); + auto fileData = DynamicPtrCast(data); if (fileData) { // Error if file is still being loaded and is the same as the // one about to be loaded. - if (!fileData->getComplete() && - Platform::Strcasecmp(fileData->getPath().c_str(), filepath.c_str()) == 0) + if (!fileData->getComplete() + && Platform::Strcasecmp(fileData->getPath().c_str(), filepath.c_str()) == 0) { std::ostringstream os; os << "Reference to: " << filepath; @@ -948,14 +942,10 @@ void BuildFileTransformOps(OpRcPtrVec & ops, } } - FileFormat* format = NULL; + FileFormat * format = NULL; CachedFileRcPtr cachedFile; - GetCachedFileAndFormat(format, - cachedFile, - filepath, - fileTransform.getInterpolation(), - config); + GetCachedFileAndFormat(format, cachedFile, filepath, fileTransform.getInterpolation(), config); try { @@ -963,7 +953,7 @@ void BuildFileTransformOps(OpRcPtrVec & ops, CreateFileNoOp(ops, filepath); ConstOpRcPtr fileNoOpConst = ops.back(); - OpRcPtr fileNoOp = ops.back(); + OpRcPtr fileNoOp = ops.back(); // CTF implementation of FileFormat::buildFileOps might call // BuildFileTransformOps for References. @@ -971,7 +961,7 @@ void BuildFileTransformOps(OpRcPtrVec & ops, // File has been loaded completely. It may now be referenced again. ConstOpDataRcPtr data = fileNoOpConst->data(); - auto fileData = DynamicPtrCast(data); + auto fileData = DynamicPtrCast(data); if (fileData) { fileData->setComplete(); diff --git a/src/OpenColorIO/transforms/FileTransform.h b/src/OpenColorIO/transforms/FileTransform.h index 19b2b8c73f..dca7794833 100644 --- a/src/OpenColorIO/transforms/FileTransform.h +++ b/src/OpenColorIO/transforms/FileTransform.h @@ -1,21 +1,18 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_FILETRANSFORM_H #define INCLUDED_OCIO_FILETRANSFORM_H - #include #include #include "Op.h" -#include "ops/noop/NoOps.h" #include "PrivateTypes.h" +#include "ops/noop/NoOps.h" #include "utils/StringUtils.h" - namespace OCIO_NAMESPACE { void ClearFileTransformCaches(); @@ -23,13 +20,10 @@ void ClearFileTransformCaches(); class CachedFile { public: - CachedFile() {}; - virtual ~CachedFile() {}; + CachedFile(){}; + virtual ~CachedFile(){}; - virtual GroupTransformRcPtr getCDLGroup() const - { - throw Exception("Not a CDL file format."); - } + virtual GroupTransformRcPtr getCDLGroup() const { throw Exception("Not a CDL file format."); } }; typedef OCIO_SHARED_PTR CachedFileRcPtr; @@ -52,15 +46,16 @@ enum FormatBakeFlags : unsigned int struct FormatInfo { - std::string name; // Name must be globally unique - std::string extension; // Extension has to be lower case and does not need to be unique + std::string name; // Name must be globally unique + std::string extension; // Extension has to be lower case and does not need to be unique FormatCapabilityFlags capabilities; FormatBakeFlags bake_capabilities; - FormatInfo(): - capabilities(FORMAT_CAPABILITY_NONE), - bake_capabilities(FORMAT_BAKE_CAPABILITY_NONE) - { } + FormatInfo() + : capabilities(FORMAT_CAPABILITY_NONE) + , bake_capabilities(FORMAT_BAKE_CAPABILITY_NONE) + { + } }; typedef std::vector FormatInfoVec; @@ -75,47 +70,48 @@ class FileFormat // read an istream. originalFileName is used by parsers that make use // of aspects of the file name as part of the parsing. // It may be set to an empty string if not known. - virtual CachedFileRcPtr read(std::istream & istream, - const std::string & originalFileName, - Interpolation interp) const = 0; - - virtual void bake(const Baker & baker, - const std::string & formatName, - std::ostream & ostream) const; - - virtual void write(const ConstConfigRcPtr & config, - const ConstContextRcPtr & context, - const GroupTransform & group, - const std::string & formatName, - std::ostream & ostream) const; - - virtual void buildFileOps(OpRcPtrVec & ops, - const Config & config, - const ConstContextRcPtr & context, - CachedFileRcPtr cachedFile, - const FileTransform & fileTransform, - TransformDirection dir) const = 0; + virtual CachedFileRcPtr + read(std::istream & istream, const std::string & originalFileName, Interpolation interp) const + = 0; + + virtual void bake(const Baker & baker, const std::string & formatName, std::ostream & ostream) + const; + + virtual void write( + const ConstConfigRcPtr & config, + const ConstContextRcPtr & context, + const GroupTransform & group, + const std::string & formatName, + std::ostream & ostream) const; + + virtual void buildFileOps( + OpRcPtrVec & ops, + const Config & config, + const ConstContextRcPtr & context, + CachedFileRcPtr cachedFile, + const FileTransform & fileTransform, + TransformDirection dir) const + = 0; // True if the file is a binary rather than text-based format. - virtual bool isBinary() const - { - return false; - } + virtual bool isBinary() const { return false; } // For logging purposes. std::string getName() const; + private: - FileFormat& operator= (const FileFormat &); + FileFormat & operator=(const FileFormat &); }; -void GetCachedFileAndFormat(FileFormat * & format, - CachedFileRcPtr & cachedFile, - const std::string & filepath, - Interpolation interp, - const Config& config); +void GetCachedFileAndFormat( + FileFormat *& format, + CachedFileRcPtr & cachedFile, + const std::string & filepath, + Interpolation interp, + const Config & config); -typedef std::map FileFormatMap; -typedef std::vector FileFormatVector; +typedef std::map FileFormatMap; +typedef std::vector FileFormatVector; typedef std::map FileFormatVectorMap; // TODO: This interface is ugly. What private API is actually appropriate? @@ -128,21 +124,24 @@ class FormatRegistry public: static FormatRegistry & GetInstance(); - FileFormat* getFileFormatByName(const std::string & name) const; - void getFileFormatForExtension(const std::string & extension, FileFormatVector & possibleFormats) const; + FileFormat * getFileFormatByName(const std::string & name) const; + void getFileFormatForExtension( + const std::string & extension, + FileFormatVector & possibleFormats) const; int getNumRawFormats() const; - FileFormat* getRawFormatByIndex(int index) const; + FileFormat * getRawFormatByIndex(int index) const; int getNumFormats(int capability) const noexcept; const char * getFormatNameByIndex(int capability, int index) const noexcept; const char * getFormatExtensionByIndex(int capability, int index) const noexcept; bool isFormatExtensionSupported(const char * extension) const; + private: FormatRegistry(); ~FormatRegistry(); - void registerFileFormat(FileFormat* format); + void registerFileFormat(FileFormat * format); FileFormatMap m_formatsByName; FileFormatVectorMap m_formatsByExtension; diff --git a/src/OpenColorIO/transforms/FixedFunctionTransform.cpp b/src/OpenColorIO/transforms/FixedFunctionTransform.cpp index 1449e09dba..7923f15b2c 100644 --- a/src/OpenColorIO/transforms/FixedFunctionTransform.cpp +++ b/src/OpenColorIO/transforms/FixedFunctionTransform.cpp @@ -13,19 +13,20 @@ namespace OCIO_NAMESPACE FixedFunctionTransformRcPtr FixedFunctionTransform::Create(FixedFunctionStyle style) { - return FixedFunctionTransformRcPtr(new FixedFunctionTransformImpl(style), - &FixedFunctionTransformImpl::deleter); + return FixedFunctionTransformRcPtr( + new FixedFunctionTransformImpl(style), + &FixedFunctionTransformImpl::deleter); } -FixedFunctionTransformRcPtr FixedFunctionTransform::Create(FixedFunctionStyle style, - const double * params, - size_t num) +FixedFunctionTransformRcPtr +FixedFunctionTransform::Create(FixedFunctionStyle style, const double * params, size_t num) { FixedFunctionOpData::Params p(num); std::copy(params, params + num, p.begin()); - return FixedFunctionTransformRcPtr(new FixedFunctionTransformImpl(style, p), - &FixedFunctionTransformImpl::deleter); + return FixedFunctionTransformRcPtr( + new FixedFunctionTransformImpl(style, p), + &FixedFunctionTransformImpl::deleter); } FixedFunctionTransformImpl::FixedFunctionTransformImpl(FixedFunctionStyle style) @@ -33,8 +34,9 @@ FixedFunctionTransformImpl::FixedFunctionTransformImpl(FixedFunctionStyle style) { } -FixedFunctionTransformImpl::FixedFunctionTransformImpl(FixedFunctionStyle style, - const FixedFunctionOpData::Params & p) +FixedFunctionTransformImpl::FixedFunctionTransformImpl( + FixedFunctionStyle style, + const FixedFunctionOpData::Params & p) : m_data(FixedFunctionOpData::ConvertStyle(style, TRANSFORM_DIR_FORWARD), p) { } @@ -57,11 +59,11 @@ TransformRcPtr FixedFunctionTransformImpl::createEditableCopy() const { // A validation is done when creating the instance so the params are mandatory. const double * values = ¶ms[0]; - transform = FixedFunctionTransform::Create(getStyle(), values, params.size()); + transform = FixedFunctionTransform::Create(getStyle(), values, params.size()); } // Also copy the Format Metadata if any. - dynamic_cast(transform.get())->data() = data(); + dynamic_cast(transform.get())->data() = data(); return transform; } @@ -103,8 +105,9 @@ const FormatMetadata & FixedFunctionTransformImpl::getFormatMetadata() const noe bool FixedFunctionTransformImpl::equals(const FixedFunctionTransform & other) const noexcept { - if (this == &other) return true; - return data() == dynamic_cast(&other)->data(); + if (this == &other) + return true; + return data() == dynamic_cast(&other)->data(); } FixedFunctionStyle FixedFunctionTransformImpl::getStyle() const @@ -126,7 +129,7 @@ size_t FixedFunctionTransformImpl::getNumParams() const void FixedFunctionTransformImpl::setParams(const double * params, size_t num) { FixedFunctionOpData::Params p(num); - std::copy(params, params+num, p.begin()); + std::copy(params, params + num, p.begin()); data().setParams(p); } @@ -136,14 +139,14 @@ void FixedFunctionTransformImpl::getParams(double * params) const std::copy(p.cbegin(), p.cend(), params); } -std::ostream & operator<< (std::ostream & os, const FixedFunctionTransform & t) +std::ostream & operator<<(std::ostream & os, const FixedFunctionTransform & t) { os << "(transform.get())->data() = data(); + dynamic_cast(transform.get())->data() = data(); return transform; } @@ -50,7 +51,7 @@ void GradingPrimaryTransformImpl::validate() const Transform::validate(); data().validate(); } - catch(Exception & ex) + catch (Exception & ex) { std::string errMsg("GradingPrimaryTransform validation failed: "); errMsg += ex.what(); @@ -68,11 +69,11 @@ const FormatMetadata & GradingPrimaryTransformImpl::getFormatMetadata() const no return data().getFormatMetadata(); } - bool GradingPrimaryTransformImpl::equals(const GradingPrimaryTransform & other) const noexcept { - if (this == &other) return true; - return data() == dynamic_cast(&other)->data(); + if (this == &other) + return true; + return data() == dynamic_cast(&other)->data(); } GradingStyle GradingPrimaryTransformImpl::getStyle() const noexcept @@ -110,7 +111,7 @@ void GradingPrimaryTransformImpl::makeNonDynamic() noexcept data().getDynamicPropertyInternal()->makeNonDynamic(); } -std::ostream& operator<< (std::ostream & os, const GradingPrimaryTransform & t) noexcept +std::ostream & operator<<(std::ostream & os, const GradingPrimaryTransform & t) noexcept { os << ""; + os << ""; return os; } std::ostream & operator<<(std::ostream & os, const GradingPrimary & prim) { - os << ""; + os << ""; if (prim.m_clampBlack != GradingPrimary::NoClampBlack()) { os << ", clampBlack=" << prim.m_clampBlack; diff --git a/src/OpenColorIO/transforms/GradingPrimaryTransform.h b/src/OpenColorIO/transforms/GradingPrimaryTransform.h index 8c4a9d50f5..5e31fc63cc 100644 --- a/src/OpenColorIO/transforms/GradingPrimaryTransform.h +++ b/src/OpenColorIO/transforms/GradingPrimaryTransform.h @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_GRADINGPRIMARYTRANSFORM_H #define INCLUDED_OCIO_GRADINGPRIMARYTRANSFORM_H @@ -9,7 +8,6 @@ #include "ops/gradingprimary/GradingPrimaryOpData.h" - namespace OCIO_NAMESPACE { @@ -17,10 +15,10 @@ class GradingPrimaryTransformImpl : public GradingPrimaryTransform { public: explicit GradingPrimaryTransformImpl(GradingStyle style); - GradingPrimaryTransformImpl() = delete; - GradingPrimaryTransformImpl(const GradingPrimaryTransformImpl &) = delete; - GradingPrimaryTransformImpl& operator=(const GradingPrimaryTransformImpl &) = delete; - ~GradingPrimaryTransformImpl() override = default; + GradingPrimaryTransformImpl() = delete; + GradingPrimaryTransformImpl(const GradingPrimaryTransformImpl &) = delete; + GradingPrimaryTransformImpl & operator=(const GradingPrimaryTransformImpl &) = delete; + ~GradingPrimaryTransformImpl() override = default; TransformRcPtr createEditableCopy() const override; @@ -54,7 +52,6 @@ class GradingPrimaryTransformImpl : public GradingPrimaryTransform GradingPrimaryOpData m_data; }; - } // namespace OCIO_NAMESPACE -#endif // INCLUDED_OCIO_GRADINGPRIMARYTRANSFORM_H +#endif // INCLUDED_OCIO_GRADINGPRIMARYTRANSFORM_H diff --git a/src/OpenColorIO/transforms/GradingRGBCurveTransform.cpp b/src/OpenColorIO/transforms/GradingRGBCurveTransform.cpp index 77ace5ad4f..c3b89a3903 100644 --- a/src/OpenColorIO/transforms/GradingRGBCurveTransform.cpp +++ b/src/OpenColorIO/transforms/GradingRGBCurveTransform.cpp @@ -11,7 +11,8 @@ namespace OCIO_NAMESPACE { GradingRGBCurveTransformRcPtr GradingRGBCurveTransform::Create(GradingStyle style) { - return GradingRGBCurveTransformRcPtr(new GradingRGBCurveTransformImpl(style), + return GradingRGBCurveTransformRcPtr( + new GradingRGBCurveTransformImpl(style), &GradingRGBCurveTransformImpl::deleter); } @@ -28,7 +29,7 @@ void GradingRGBCurveTransformImpl::deleter(GradingRGBCurveTransform * t) TransformRcPtr GradingRGBCurveTransformImpl::createEditableCopy() const { GradingRGBCurveTransformRcPtr transform = GradingRGBCurveTransform::Create(getStyle()); - dynamic_cast(transform.get())->data() = data(); + dynamic_cast(transform.get())->data() = data(); return transform; } @@ -67,11 +68,11 @@ const FormatMetadata & GradingRGBCurveTransformImpl::getFormatMetadata() const n return data().getFormatMetadata(); } - bool GradingRGBCurveTransformImpl::equals(const GradingRGBCurveTransform & other) const noexcept { - if (this == &other) return true; - return data() == dynamic_cast(&other)->data(); + if (this == &other) + return true; + return data() == dynamic_cast(&other)->data(); } GradingStyle GradingRGBCurveTransformImpl::getStyle() const noexcept @@ -134,7 +135,7 @@ void GradingRGBCurveTransformImpl::makeNonDynamic() noexcept data().getDynamicPropertyInternal()->makeNonDynamic(); } -std::ostream& operator<< (std::ostream & os, const GradingRGBCurveTransform & t) noexcept +std::ostream & operator<<(std::ostream & os, const GradingRGBCurveTransform & t) noexcept { os << "(transform.get())->data() = data(); + dynamic_cast(transform.get())->data() = data(); return transform; } @@ -50,7 +51,7 @@ void GradingToneTransformImpl::validate() const Transform::validate(); data().validate(); } - catch(Exception & ex) + catch (Exception & ex) { std::string errMsg("GradingToneTransform validation failed: "); errMsg += ex.what(); @@ -68,11 +69,11 @@ const FormatMetadata & GradingToneTransformImpl::getFormatMetadata() const noexc return data().getFormatMetadata(); } - bool GradingToneTransformImpl::equals(const GradingToneTransform & other) const noexcept { - if (this == &other) return true; - return data() == dynamic_cast(&other)->data(); + if (this == &other) + return true; + return data() == dynamic_cast(&other)->data(); } GradingStyle GradingToneTransformImpl::getStyle() const noexcept @@ -110,7 +111,7 @@ void GradingToneTransformImpl::makeNonDynamic() noexcept data().getDynamicPropertyInternal()->makeNonDynamic(); } -std::ostream& operator<< (std::ostream & os, const GradingToneTransform & t) noexcept +std::ostream & operator<<(std::ostream & os, const GradingToneTransform & t) noexcept { os << ""; + << " master=" << rgbmsw.m_master << " start=" << rgbmsw.m_start + << " width=" << rgbmsw.m_width << ">"; return ost; } std::ostream & operator<<(std::ostream & os, const GradingTone & tone) { - os << ""; return os; diff --git a/src/OpenColorIO/transforms/GradingToneTransform.h b/src/OpenColorIO/transforms/GradingToneTransform.h index 63830c8338..ac0f5fc11f 100644 --- a/src/OpenColorIO/transforms/GradingToneTransform.h +++ b/src/OpenColorIO/transforms/GradingToneTransform.h @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_GRADINGTONETRANSFORM_H #define INCLUDED_OCIO_GRADINGTONETRANSFORM_H @@ -9,7 +8,6 @@ #include "ops/gradingtone/GradingToneOpData.h" - namespace OCIO_NAMESPACE { @@ -17,10 +15,10 @@ class GradingToneTransformImpl : public GradingToneTransform { public: explicit GradingToneTransformImpl(GradingStyle style); - GradingToneTransformImpl() = delete; - GradingToneTransformImpl(const GradingToneTransformImpl &) = delete; - GradingToneTransformImpl& operator=(const GradingToneTransformImpl &) = delete; - ~GradingToneTransformImpl() override = default; + GradingToneTransformImpl() = delete; + GradingToneTransformImpl(const GradingToneTransformImpl &) = delete; + GradingToneTransformImpl & operator=(const GradingToneTransformImpl &) = delete; + ~GradingToneTransformImpl() override = default; TransformRcPtr createEditableCopy() const override; @@ -54,7 +52,6 @@ class GradingToneTransformImpl : public GradingToneTransform GradingToneOpData m_data; }; - } // namespace OCIO_NAMESPACE -#endif // INCLUDED_OCIO_GRADINGTONETRANSFORM_H +#endif // INCLUDED_OCIO_GRADINGTONETRANSFORM_H diff --git a/src/OpenColorIO/transforms/GroupTransform.cpp b/src/OpenColorIO/transforms/GroupTransform.cpp old mode 100755 new mode 100644 index 89ba45c267..3be094abb3 --- a/src/OpenColorIO/transforms/GroupTransform.cpp +++ b/src/OpenColorIO/transforms/GroupTransform.cpp @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #include #include @@ -11,7 +10,6 @@ #include "transforms/FileTransform.h" #include "transforms/GroupTransform.h" - namespace OCIO_NAMESPACE { GroupTransformRcPtr GroupTransform::Create() @@ -24,7 +22,6 @@ void GroupTransformImpl::Deleter(GroupTransform * t) delete static_cast(t); } - /////////////////////////////////////////////////////////////////////////// GroupTransformImpl::GroupTransformImpl() @@ -36,10 +33,10 @@ GroupTransformImpl::GroupTransformImpl() TransformRcPtr GroupTransformImpl::createEditableCopy() const { GroupTransformRcPtr transform = GroupTransform::Create(); - auto groupImpl = dynamic_cast(transform.get()); - groupImpl->m_dir = m_dir; - groupImpl->m_vec = m_vec; - groupImpl->m_metadata = m_metadata; + auto groupImpl = dynamic_cast(transform.get()); + groupImpl->m_dir = m_dir; + groupImpl->m_vec = m_vec; + groupImpl->m_metadata = m_metadata; return transform; } @@ -66,7 +63,7 @@ void GroupTransformImpl::validate() const throw Exception(errMsg.c_str()); } - for(const auto & val : m_vec) + for (const auto & val : m_vec) { val->validate(); } @@ -111,11 +108,12 @@ void GroupTransformImpl::prependTransform(TransformRcPtr transform) noexcept m_vec.insert(m_vec.begin(), transform); } -void GroupTransformImpl::write(const ConstConfigRcPtr & config, - const char * formatName, - std::ostream & os) const +void GroupTransformImpl::write( + const ConstConfigRcPtr & config, + const char * formatName, + std::ostream & os) const { - FileFormat* fmt = FormatRegistry::GetInstance().getFileFormatByName(formatName); + FileFormat * fmt = FormatRegistry::GetInstance().getFileFormatByName(formatName); if (!fmt) { @@ -153,7 +151,7 @@ const char * GroupTransform::GetFormatExtensionByIndex(int index) noexcept return FormatRegistry::GetInstance().getFormatExtensionByIndex(FORMAT_CAPABILITY_WRITE, index); } -std::ostream & operator<< (std::ostream & os, const GroupTransform & groupTransform) +std::ostream & operator<<(std::ostream & os, const GroupTransform & groupTransform) { os << "= 0; --i) - { - ConstTransformRcPtr childTransform = groupTransform.getTransform(i); - BuildOps(ops, config, context, childTransform, TRANSFORM_DIR_INVERSE); - } - break; + case TRANSFORM_DIR_FORWARD: + for (int i = 0; i < groupTransform.getNumTransforms(); ++i) + { + ConstTransformRcPtr childTransform = groupTransform.getTransform(i); + BuildOps(ops, config, context, childTransform, TRANSFORM_DIR_FORWARD); + } + break; + case TRANSFORM_DIR_INVERSE: + for (int i = groupTransform.getNumTransforms() - 1; i >= 0; --i) + { + ConstTransformRcPtr childTransform = groupTransform.getTransform(i); + BuildOps(ops, config, context, childTransform, TRANSFORM_DIR_INVERSE); + } + break; } } -bool CollectContextVariables(const Config & config, - const Context & context, - const GroupTransform & tr, - ContextRcPtr & usedContextVars) +bool CollectContextVariables( + const Config & config, + const Context & context, + const GroupTransform & tr, + ContextRcPtr & usedContextVars) { bool foundContextVars = false; @@ -223,4 +223,3 @@ bool CollectContextVariables(const Config & config, } } // namespace OCIO_NAMESPACE - diff --git a/src/OpenColorIO/transforms/GroupTransform.h b/src/OpenColorIO/transforms/GroupTransform.h index 038404088a..6c54b91e18 100644 --- a/src/OpenColorIO/transforms/GroupTransform.h +++ b/src/OpenColorIO/transforms/GroupTransform.h @@ -1,46 +1,34 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_GROUPTRANSFORM_H #define INCLUDED_OCIO_GROUPTRANSFORM_H #include - namespace OCIO_NAMESPACE { class GroupTransformImpl : public GroupTransform { public: - GroupTransformImpl(); - GroupTransformImpl(const GroupTransformImpl &) = delete; - GroupTransformImpl& operator=(const GroupTransformImpl &) = delete; - ~GroupTransformImpl() override = default; + GroupTransformImpl(const GroupTransformImpl &) = delete; + GroupTransformImpl & operator=(const GroupTransformImpl &) = delete; + ~GroupTransformImpl() override = default; TransformRcPtr createEditableCopy() const override; TransformDirection getDirection() const noexcept override; void setDirection(TransformDirection dir) noexcept override; - TransformType getTransformType() const noexcept override - { - return TRANSFORM_TYPE_GROUP; - } + TransformType getTransformType() const noexcept override { return TRANSFORM_TYPE_GROUP; } void validate() const override; - FormatMetadata & getFormatMetadata() noexcept override - { - return m_metadata; - } + FormatMetadata & getFormatMetadata() noexcept override { return m_metadata; } - const FormatMetadata & getFormatMetadata() const noexcept override - { - return m_metadata; - } + const FormatMetadata & getFormatMetadata() const noexcept override { return m_metadata; } ConstTransformRcPtr getTransform(int index) const override; @@ -52,9 +40,8 @@ class GroupTransformImpl : public GroupTransform void prependTransform(TransformRcPtr transform) noexcept override; - void write(const ConstConfigRcPtr & config, - const char * formatName, - std::ostream & os) const override; + void write(const ConstConfigRcPtr & config, const char * formatName, std::ostream & os) + const override; static void Deleter(GroupTransform * t); @@ -66,6 +53,6 @@ class GroupTransformImpl : public GroupTransform TransformRcPtrVec m_vec; }; -} +} // namespace OCIO_NAMESPACE #endif \ No newline at end of file diff --git a/src/OpenColorIO/transforms/LogAffineTransform.cpp b/src/OpenColorIO/transforms/LogAffineTransform.cpp index d54de42d85..fe7b752b47 100644 --- a/src/OpenColorIO/transforms/LogAffineTransform.cpp +++ b/src/OpenColorIO/transforms/LogAffineTransform.cpp @@ -17,7 +17,7 @@ LogAffineTransformRcPtr LogAffineTransform::Create() return LogAffineTransformRcPtr(new LogAffineTransformImpl(), &LogAffineTransformImpl::deleter); } -void LogAffineTransformImpl::deleter(LogAffineTransform* t) +void LogAffineTransformImpl::deleter(LogAffineTransform * t) { delete static_cast(t); } @@ -29,8 +29,8 @@ LogAffineTransformImpl::LogAffineTransformImpl() TransformRcPtr LogAffineTransformImpl::createEditableCopy() const { - LogAffineTransformRcPtr transform = LogAffineTransform::Create(); - dynamic_cast(transform.get())->data() = data(); + LogAffineTransformRcPtr transform = LogAffineTransform::Create(); + dynamic_cast(transform.get())->data() = data(); return transform; } @@ -71,8 +71,9 @@ const FormatMetadata & LogAffineTransformImpl::getFormatMetadata() const noexcep bool LogAffineTransformImpl::equals(const LogAffineTransform & other) const noexcept { - if (this == &other) return true; - return data() == dynamic_cast(&other)->data(); + if (this == &other) + return true; + return data() == dynamic_cast(&other)->data(); } void LogAffineTransformImpl::setBase(double base) noexcept @@ -85,41 +86,41 @@ double LogAffineTransformImpl::getBase() const noexcept return data().getBase(); } -void LogAffineTransformImpl::setLogSideSlopeValue(const double(&values)[3]) noexcept +void LogAffineTransformImpl::setLogSideSlopeValue(const double (&values)[3]) noexcept { data().setValue(LOG_SIDE_SLOPE, values); } -void LogAffineTransformImpl::setLogSideOffsetValue(const double(&values)[3]) noexcept +void LogAffineTransformImpl::setLogSideOffsetValue(const double (&values)[3]) noexcept { data().setValue(LOG_SIDE_OFFSET, values); } -void LogAffineTransformImpl::setLinSideSlopeValue(const double(&values)[3]) noexcept +void LogAffineTransformImpl::setLinSideSlopeValue(const double (&values)[3]) noexcept { data().setValue(LIN_SIDE_SLOPE, values); } -void LogAffineTransformImpl::setLinSideOffsetValue(const double(&values)[3]) noexcept +void LogAffineTransformImpl::setLinSideOffsetValue(const double (&values)[3]) noexcept { data().setValue(LIN_SIDE_OFFSET, values); } -void LogAffineTransformImpl::getLogSideSlopeValue(double(&values)[3]) const noexcept +void LogAffineTransformImpl::getLogSideSlopeValue(double (&values)[3]) const noexcept { data().getValue(LOG_SIDE_SLOPE, values); } -void LogAffineTransformImpl::getLogSideOffsetValue(double(&values)[3]) const noexcept +void LogAffineTransformImpl::getLogSideOffsetValue(double (&values)[3]) const noexcept { data().getValue(LOG_SIDE_OFFSET, values); } -void LogAffineTransformImpl::getLinSideSlopeValue(double(&values)[3]) const noexcept +void LogAffineTransformImpl::getLinSideSlopeValue(double (&values)[3]) const noexcept { data().getValue(LIN_SIDE_SLOPE, values); } -void LogAffineTransformImpl::getLinSideOffsetValue(double(&values)[3]) const noexcept +void LogAffineTransformImpl::getLinSideOffsetValue(double (&values)[3]) const noexcept { data().getValue(LIN_SIDE_OFFSET, values); } -std::ostream & operator<< (std::ostream & os, const LogAffineTransform & t) +std::ostream & operator<<(std::ostream & os, const LogAffineTransform & t) { os << "m_impl) = *m_impl; + *(transform->m_impl) = *m_impl; return transform; } @@ -146,9 +145,10 @@ bool LookTransform::getSkipColorSpaceConversion() const return getImpl()->m_skipColorSpaceConversion; } -const char * LooksResultColorSpace(const Config & config, - const ConstContextRcPtr & context, - const LookParseResult & looks) +const char * LooksResultColorSpace( + const Config & config, + const ConstContextRcPtr & context, + const LookParseResult & looks) { if (!looks.empty()) { @@ -166,11 +166,13 @@ const char * LooksResultColorSpace(const Config & config, return ""; } -const char * LookTransform::GetLooksResultColorSpace(const ConstConfigRcPtr & config, - const ConstContextRcPtr & context, - const char * looksStr) +const char * LookTransform::GetLooksResultColorSpace( + const ConstConfigRcPtr & config, + const ConstContextRcPtr & context, + const char * looksStr) { - if (!looksStr || !*looksStr) return ""; + if (!looksStr || !*looksStr) + return ""; LookParseResult looks; looks.parse(looksStr); @@ -178,14 +180,15 @@ const char * LookTransform::GetLooksResultColorSpace(const ConstConfigRcPtr & co return LooksResultColorSpace(*config, context, looks); } -std::ostream& operator<< (std::ostream& os, const LookTransform& t) +std::ostream & operator<<(std::ostream & os, const LookTransform & t) { os << ""; return os; } @@ -200,38 +203,42 @@ namespace // It returns the list of ops (which could be empty if looks are all no-ops), and the final process // color space after applying the complete look transformation. // -void RunLookTokens(OpRcPtrVec & ops, // [in/out] - ConstColorSpaceRcPtr & currentColorSpace, // [in/out] - bool skipColorSpaceConversion, - const Config & config, - const ConstContextRcPtr & context, - const LookParseResult::Tokens & lookTokens) +void RunLookTokens( + OpRcPtrVec & ops, // [in/out] + ConstColorSpaceRcPtr & currentColorSpace, // [in/out] + bool skipColorSpaceConversion, + const Config & config, + const ConstContextRcPtr & context, + const LookParseResult::Tokens & lookTokens) { - if(lookTokens.empty()) return; + if (lookTokens.empty()) + return; - for(unsigned int i=0; igetTransform()) - { - BuildOps(tmpOps, config, context, look->getTransform(), TRANSFORM_DIR_FORWARD); - } - else if (look->getInverseTransform()) + case TRANSFORM_DIR_FORWARD: { - BuildOps(tmpOps, config, context, look->getInverseTransform(), TRANSFORM_DIR_INVERSE); - } - break; - } - case TRANSFORM_DIR_INVERSE: - { - CreateLookNoOp(tmpOps, std::string("-") + lookName); - if (look->getInverseTransform()) - { - BuildOps(tmpOps, config, context, look->getInverseTransform(), TRANSFORM_DIR_FORWARD); + CreateLookNoOp(tmpOps, lookName); + if (look->getTransform()) + { + BuildOps(tmpOps, config, context, look->getTransform(), TRANSFORM_DIR_FORWARD); + } + else if (look->getInverseTransform()) + { + BuildOps( + tmpOps, + config, + context, + look->getInverseTransform(), + TRANSFORM_DIR_INVERSE); + } + break; } - else if (look->getTransform()) + case TRANSFORM_DIR_INVERSE: { - BuildOps(tmpOps, config, context, look->getTransform(), TRANSFORM_DIR_INVERSE); + CreateLookNoOp(tmpOps, std::string("-") + lookName); + if (look->getInverseTransform()) + { + BuildOps( + tmpOps, + config, + context, + look->getInverseTransform(), + TRANSFORM_DIR_FORWARD); + } + else if (look->getTransform()) + { + BuildOps(tmpOps, config, context, look->getTransform(), TRANSFORM_DIR_INVERSE); + } + break; } - break; - } } ConstColorSpaceRcPtr processColorSpace = config.getColorSpace(look->getProcessSpace()); - if(!processColorSpace) + if (!processColorSpace) { std::ostringstream os; os << "RunLookTokens error. "; @@ -289,12 +306,10 @@ void RunLookTokens(OpRcPtrVec & ops, // [in/out] } // If current color space is already the process space skip the conversion. - if (!skipColorSpaceConversion && - currentColorSpace.get() != processColorSpace.get()) + if (!skipColorSpaceConversion && currentColorSpace.get() != processColorSpace.get()) { // Default behavior is to bypass data color space. - BuildColorSpaceOps(ops, config, context, - currentColorSpace, processColorSpace, true); + BuildColorSpaceOps(ops, config, context, currentColorSpace, processColorSpace, true); currentColorSpace = processColorSpace; } @@ -302,33 +317,34 @@ void RunLookTokens(OpRcPtrVec & ops, // [in/out] } } -} // anon namespace +} // namespace //////////////////////////////////////////////////////////////////////////// -void BuildLookOps(OpRcPtrVec & ops, - const Config & config, - const ConstContextRcPtr & context, - const LookTransform & lookTransform, - TransformDirection dir) +void BuildLookOps( + OpRcPtrVec & ops, + const Config & config, + const ConstContextRcPtr & context, + const LookTransform & lookTransform, + TransformDirection dir) { ConstColorSpaceRcPtr src = config.getColorSpace(lookTransform.getSrc()); - if(!src) + if (!src) { std::ostringstream os; os << "BuildLookOps error."; os << "The specified lookTransform specifies a src colorspace, '"; - os << lookTransform.getSrc() << "', which is not defined."; + os << lookTransform.getSrc() << "', which is not defined."; throw Exception(os.str().c_str()); } ConstColorSpaceRcPtr dst = config.getColorSpace(lookTransform.getDst()); - if(!dst) + if (!dst) { std::ostringstream os; os << "BuildLookOps error."; os << "The specified lookTransform specifies a dst colorspace, '"; - os << lookTransform.getDst() << "', which is not defined."; + os << lookTransform.getDst() << "', which is not defined."; throw Exception(os.str().c_str()); } @@ -337,20 +353,15 @@ void BuildLookOps(OpRcPtrVec & ops, // The code must handle the inverse src/dst colorspace transformation explicitly. const auto combinedDir = CombineTransformDirections(dir, lookTransform.getDirection()); - if(combinedDir == TRANSFORM_DIR_INVERSE) + if (combinedDir == TRANSFORM_DIR_INVERSE) { std::swap(src, dst); looks.reverse(); } - const bool skipColorSpaceConversion = lookTransform.getSkipColorSpaceConversion(); + const bool skipColorSpaceConversion = lookTransform.getSkipColorSpaceConversion(); ConstColorSpaceRcPtr currentColorSpace = src; - BuildLookOps(ops, - currentColorSpace, - skipColorSpaceConversion, - config, - context, - looks); + BuildLookOps(ops, currentColorSpace, skipColorSpaceConversion, config, context, looks); // If current color space is already the dst space skip the conversion. if (!skipColorSpaceConversion && currentColorSpace.get() != dst.get()) @@ -360,34 +371,36 @@ void BuildLookOps(OpRcPtrVec & ops, } } -void BuildLookOps(OpRcPtrVec & ops, - ConstColorSpaceRcPtr & currentColorSpace, // in-out - bool skipColorSpaceConversion, - const Config & config, - const ConstContextRcPtr & context, - const LookParseResult & looks) +void BuildLookOps( + OpRcPtrVec & ops, + ConstColorSpaceRcPtr & currentColorSpace, // in-out + bool skipColorSpaceConversion, + const Config & config, + const ConstContextRcPtr & context, + const LookParseResult & looks) { const LookParseResult::Options & options = looks.getOptions(); - if(options.empty()) + if (options.empty()) { // Do nothing. } - else if(options.size() == 1) + else if (options.size() == 1) { // As an optimization, if we only have a single look option, just push back onto the // final location. - RunLookTokens(ops, - currentColorSpace, - skipColorSpaceConversion, - config, - context, - options[0]); + RunLookTokens( + ops, + currentColorSpace, + skipColorSpaceConversion, + config, + context, + options[0]); } else { // If we have multiple look options, try each one in order, and if we can create the ops - // without a missing file exception, push back it's results and return i.e., take the + // without a missing file exception, push back it's results and return i.e., take the // first successully created look. bool success = false; @@ -396,25 +409,21 @@ void BuildLookOps(OpRcPtrVec & ops, OpRcPtrVec tmpOps; ConstColorSpaceRcPtr cs; - for(unsigned int i=0; i(t); } @@ -41,8 +42,8 @@ Lut1DTransformImpl::Lut1DTransformImpl(Lut1DOpData::HalfFlags halfFlag, unsigned TransformRcPtr Lut1DTransformImpl::createEditableCopy() const { - Lut1DTransformRcPtr transform = Lut1DTransform::Create(); - dynamic_cast(transform.get())->data() = data(); + Lut1DTransformRcPtr transform = Lut1DTransform::Create(); + dynamic_cast(transform.get())->data() = data(); return transform; } @@ -94,8 +95,9 @@ const FormatMetadata & Lut1DTransformImpl::getFormatMetadata() const noexcept bool Lut1DTransformImpl::equals(const Lut1DTransform & other) const noexcept { - if (this == &other) return true; - return data() == dynamic_cast(&other)->data(); + if (this == &other) + return true; + return data() == dynamic_cast(&other)->data(); } void Lut1DTransformImpl::setLength(unsigned long length) @@ -118,12 +120,12 @@ void CheckLUT1DIndex(const char * function, unsigned long index, unsigned long s throw Exception(oss.str().c_str()); } } -} +} // namespace void Lut1DTransformImpl::setValue(unsigned long index, float r, float g, float b) { CheckLUT1DIndex("setValue", index, getLength()); - data().getArray()[3 * index] = r; + data().getArray()[3 * index] = r; data().getArray()[3 * index + 1] = g; data().getArray()[3 * index + 2] = b; } @@ -181,7 +183,7 @@ Interpolation Lut1DTransformImpl::getInterpolation() const return data().getInterpolation(); } -std::ostream & operator<< (std::ostream & os, const Lut1DTransform & t) +std::ostream & operator<<(std::ostream & os, const Lut1DTransform & t) { os << "(t); } @@ -39,8 +39,8 @@ Lut3DTransformImpl::Lut3DTransformImpl(unsigned long gridSize) TransformRcPtr Lut3DTransformImpl::createEditableCopy() const { - Lut3DTransformRcPtr transform = Lut3DTransform::Create(); - dynamic_cast(transform.get())->data() = data(); + Lut3DTransformRcPtr transform = Lut3DTransform::Create(); + dynamic_cast(transform.get())->data() = data(); return transform; } @@ -91,8 +91,9 @@ const FormatMetadata & Lut3DTransformImpl::getFormatMetadata() const noexcept bool Lut3DTransformImpl::equals(const Lut3DTransform & other) const noexcept { - if (this == &other) return true; - return data() == dynamic_cast(&other)->data(); + if (this == &other) + return true; + return data() == dynamic_cast(&other)->data(); } unsigned long Lut3DTransformImpl::getGridSize() const @@ -103,7 +104,7 @@ unsigned long Lut3DTransformImpl::getGridSize() const void Lut3DTransformImpl::setGridSize(unsigned long gridSize) { auto & lutArray = m_data.getArray(); - lutArray = Lut3DOpData::Lut3DArray(gridSize); + lutArray = Lut3DOpData::Lut3DArray(gridSize); } namespace @@ -111,9 +112,11 @@ namespace static constexpr char COMPONENT_R[] = "Red"; static constexpr char COMPONENT_G[] = "Green"; static constexpr char COMPONENT_B[] = "Blue"; -void CheckLUT3DIndex(const char * function, - const char * component, - unsigned long index, unsigned long size) +void CheckLUT3DIndex( + const char * function, + const char * component, + unsigned long index, + unsigned long size) { if (index >= size) { @@ -124,12 +127,15 @@ void CheckLUT3DIndex(const char * function, throw Exception(oss.str().c_str()); } } -} +} // namespace -void Lut3DTransformImpl::setValue(unsigned long indexR, - unsigned long indexG, - unsigned long indexB, - float r, float g, float b) +void Lut3DTransformImpl::setValue( + unsigned long indexR, + unsigned long indexG, + unsigned long indexB, + float r, + float g, + float b) { const unsigned long gs = getGridSize(); CheckLUT3DIndex("setValue", COMPONENT_R, indexR, gs); @@ -137,17 +143,19 @@ void Lut3DTransformImpl::setValue(unsigned long indexR, CheckLUT3DIndex("setValue", COMPONENT_B, indexB, gs); // Array is stored in blue-fastest order. - const unsigned long arrayIdx = 3 * ((indexR*gs + indexG)*gs + indexB); - m_data.getArray()[arrayIdx] = r; + const unsigned long arrayIdx = 3 * ((indexR * gs + indexG) * gs + indexB); + m_data.getArray()[arrayIdx] = r; m_data.getArray()[arrayIdx + 1] = g; m_data.getArray()[arrayIdx + 2] = b; } - -void Lut3DTransformImpl::getValue(unsigned long indexR, - unsigned long indexG, - unsigned long indexB, - float & r, float & g, float & b) const +void Lut3DTransformImpl::getValue( + unsigned long indexR, + unsigned long indexG, + unsigned long indexB, + float & r, + float & g, + float & b) const { const unsigned long gs = getGridSize(); CheckLUT3DIndex("getValue", COMPONENT_R, indexR, gs); @@ -155,10 +163,10 @@ void Lut3DTransformImpl::getValue(unsigned long indexR, CheckLUT3DIndex("getValue", COMPONENT_B, indexB, gs); // Array is stored in blue-fastest order. - const unsigned long arrayIdx = 3 * ((indexR*gs + indexG)*gs + indexB); - r = m_data.getArray()[arrayIdx]; - g = m_data.getArray()[arrayIdx + 1]; - b = m_data.getArray()[arrayIdx + 2]; + const unsigned long arrayIdx = 3 * ((indexR * gs + indexG) * gs + indexB); + r = m_data.getArray()[arrayIdx]; + g = m_data.getArray()[arrayIdx + 1]; + b = m_data.getArray()[arrayIdx + 2]; } void Lut3DTransformImpl::setInterpolation(Interpolation algo) @@ -171,7 +179,7 @@ Interpolation Lut3DTransformImpl::getInterpolation() const return m_data.getInterpolation(); } -std::ostream & operator<< (std::ostream & os, const Lut3DTransform & t) +std::ostream & operator<<(std::ostream & os, const Lut3DTransform & t) { os << "(transform.get())->data() = data(); + MatrixTransformRcPtr transform = MatrixTransform::Create(); + dynamic_cast(transform.get())->data() = data(); return transform; } @@ -44,7 +44,7 @@ void MatrixTransformImpl::validate() const Transform::validate(); data().validate(); } - catch(Exception & ex) + catch (Exception & ex) { std::string errMsg("MatrixTransform validation failed: "); errMsg += ex.what(); @@ -81,20 +81,22 @@ const FormatMetadata & MatrixTransformImpl::getFormatMetadata() const noexcept bool MatrixTransformImpl::equals(const MatrixTransform & other) const noexcept { - if (this == &other) return true; - return data() == dynamic_cast(&other)->data(); + if (this == &other) + return true; + return data() == dynamic_cast(&other)->data(); } void MatrixTransformImpl::setMatrix(const double * m44) { - if (m44) data().setRGBA(m44); + if (m44) + data().setRGBA(m44); } -template -void GetMatrix(const ArrayDouble::Values & vals, T * m44) +template void GetMatrix(const ArrayDouble::Values & vals, T * m44) { - static_assert(std::is_floating_point::value, - "Only single and double precision floats are supported"); + static_assert( + std::is_floating_point::value, + "Only single and double precision floats are supported"); if (m44) { @@ -125,16 +127,17 @@ void MatrixTransformImpl::getMatrix(double * m44) const void MatrixTransformImpl::setOffset(const double * offset4) { - if (offset4) data().setRGBAOffsets(offset4); + if (offset4) + data().setRGBAOffsets(offset4); } -template -void GetOffset(const double * vals, T * offset4) +template void GetOffset(const double * vals, T * offset4) { - static_assert(std::is_floating_point::value, - "Only single and double precision floats are supported"); + static_assert( + std::is_floating_point::value, + "Only single and double precision floats are supported"); - if(offset4) + if (offset4) { offset4[0] = (T)vals[0]; offset4[1] = (T)vals[1]; @@ -159,20 +162,28 @@ We algebraiclly manipulate the terms into y = mx + b form as: m = (newmax-newmin)/(oldmax-oldmin) b = (newmin*oldmax - newmax*oldmin) / (oldmax-oldmin) */ -void MatrixTransform::Fit(double * m44, double * offset4, - const double * oldmin4, const double * oldmax4, - const double * newmin4, const double * newmax4) +void MatrixTransform::Fit( + double * m44, + double * offset4, + const double * oldmin4, + const double * oldmax4, + const double * newmin4, + const double * newmax4) { - if(!oldmin4 || !oldmax4) return; - if(!newmin4 || !newmax4) return; + if (!oldmin4 || !oldmax4) + return; + if (!newmin4 || !newmax4) + return; - if(m44) memset(m44, 0, 16*sizeof(double)); - if(offset4) memset(offset4, 0, 4*sizeof(double)); + if (m44) + memset(m44, 0, 16 * sizeof(double)); + if (offset4) + memset(offset4, 0, 4 * sizeof(double)); - for(int i=0; i<4; ++i) + for (int i = 0; i < 4; ++i) { double denom = oldmax4[i] - oldmin4[i]; - if(IsScalarEqualToZero(denom)) + if (IsScalarEqualToZero(denom)) { std::ostringstream os; os << "Cannot create Fit operator. "; @@ -182,8 +193,10 @@ void MatrixTransform::Fit(double * m44, double * offset4, throw Exception(os.str().c_str()); } - if(m44) m44[5*i] = (newmax4[i]-newmin4[i]) / denom; - if(offset4) offset4[i] = (newmin4[i]*oldmax4[i] - newmax4[i]*oldmin4[i]) / denom; + if (m44) + m44[5 * i] = (newmax4[i] - newmin4[i]) / denom; + if (offset4) + offset4[i] = (newmin4[i] * oldmax4[i] - newmax4[i] * oldmin4[i]) / denom; } } @@ -192,8 +205,8 @@ void MatrixTransform::Identity(double * m44, double * offset4) if (m44) { memset(m44, 0, 16 * sizeof(double)); - m44[0] = 1.0; - m44[5] = 1.0; + m44[0] = 1.0; + m44[5] = 1.0; m44[10] = 1.0; m44[15] = 1.0; } @@ -207,12 +220,12 @@ void MatrixTransform::Identity(double * m44, double * offset4) } } -void MatrixTransform::Sat(double * m44, double * offset4, - double sat, const double * lumaCoef3) +void MatrixTransform::Sat(double * m44, double * offset4, double sat, const double * lumaCoef3) { - if(!lumaCoef3) return; + if (!lumaCoef3) + return; - if(m44) + if (m44) { m44[0] = (1. - sat) * lumaCoef3[0] + sat; m44[1] = (1. - sat) * lumaCoef3[1]; @@ -224,8 +237,8 @@ void MatrixTransform::Sat(double * m44, double * offset4, m44[6] = (1. - sat) * lumaCoef3[2]; m44[7] = 0.0; - m44[8] = (1. - sat) * lumaCoef3[0]; - m44[9] = (1. - sat) * lumaCoef3[1]; + m44[8] = (1. - sat) * lumaCoef3[0]; + m44[9] = (1. - sat) * lumaCoef3[1]; m44[10] = (1. - sat) * lumaCoef3[2] + sat; m44[11] = 0.0; @@ -235,7 +248,7 @@ void MatrixTransform::Sat(double * m44, double * offset4, m44[15] = 1.0; } - if(offset4) + if (offset4) { offset4[0] = 0.0; offset4[1] = 0.0; @@ -244,21 +257,21 @@ void MatrixTransform::Sat(double * m44, double * offset4, } } -void MatrixTransform::Scale(double * m44, double * offset4, - const double * scale4) +void MatrixTransform::Scale(double * m44, double * offset4, const double * scale4) { - if(!scale4) return; + if (!scale4) + return; - if(m44) + if (m44) { - memset(m44, 0, 16*sizeof(double)); - m44[0] = scale4[0]; - m44[5] = scale4[1]; + memset(m44, 0, 16 * sizeof(double)); + m44[0] = scale4[0]; + m44[5] = scale4[1]; m44[10] = scale4[2]; m44[15] = scale4[3]; } - if(offset4) + if (offset4) { offset4[0] = 0.0; offset4[1] = 0.0; @@ -266,13 +279,16 @@ void MatrixTransform::Scale(double * m44, double * offset4, offset4[3] = 0.0; } } -void MatrixTransform::View(double * m44, double * offset4, - int * channelHot4, - const double * lumaCoef3) +void MatrixTransform::View( + double * m44, + double * offset4, + int * channelHot4, + const double * lumaCoef3) { - if(!channelHot4 || !lumaCoef3) return; + if (!channelHot4 || !lumaCoef3) + return; - if(offset4) + if (offset4) { offset4[0] = 0.0; offset4[1] = 0.0; @@ -280,38 +296,37 @@ void MatrixTransform::View(double * m44, double * offset4, offset4[3] = 0.0; } - if(m44) + if (m44) { - memset(m44, 0, 16*sizeof(double)); + memset(m44, 0, 16 * sizeof(double)); // All channels are hot, return identity - if(channelHot4[0] && channelHot4[1] && - channelHot4[2] && channelHot4[3]) + if (channelHot4[0] && channelHot4[1] && channelHot4[2] && channelHot4[3]) { Identity(m44, 0x0); } // If not all the channels are hot, but alpha is, // just show it. - else if(channelHot4[3]) + else if (channelHot4[3]) { - for(int i=0; i<4; ++i) + for (int i = 0; i < 4; ++i) { - m44[4*i+3] = 1.0; + m44[4 * i + 3] = 1.0; } } // Blend rgb as specified, place it in all 3 output // channels (to make a grayscale final image) else { - double values[3] = { 0.0, 0.0, 0.0 }; + double values[3] = {0.0, 0.0, 0.0}; - for(int i = 0; i < 3; ++i) + for (int i = 0; i < 3; ++i) { values[i] += lumaCoef3[i] * (channelHot4[i] ? 1.0 : 0.0); } double sum = values[0] + values[1] + values[2]; - if(!IsScalarEqualToZero(sum)) + if (!IsScalarEqualToZero(sum)) { values[0] /= sum; values[1] /= sum; @@ -319,11 +334,11 @@ void MatrixTransform::View(double * m44, double * offset4, } // Copy rgb into rgb rows - for(int row=0; row<3; ++row) + for (int row = 0; row < 3; ++row) { - for(int i=0; i<3; i++) + for (int i = 0; i < 3; i++) { - m44[4*row+i] = values[i]; + m44[4 * row + i] = values[i]; } } @@ -338,7 +353,7 @@ namespace const int DOUBLE_DECIMALS = 16; } -std::ostream& operator<< (std::ostream& os, const MatrixTransform& t) noexcept +std::ostream & operator<<(std::ostream & os, const MatrixTransform & t) noexcept { double matrix[16], offset[4]; @@ -366,4 +381,3 @@ std::ostream& operator<< (std::ostream& os, const MatrixTransform& t) noexcept } } // namespace OCIO_NAMESPACE - diff --git a/src/OpenColorIO/transforms/MatrixTransform.h b/src/OpenColorIO/transforms/MatrixTransform.h index 4a2172aa8d..cb0685cbb0 100644 --- a/src/OpenColorIO/transforms/MatrixTransform.h +++ b/src/OpenColorIO/transforms/MatrixTransform.h @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_MATRIXTRANSFORM_H #define INCLUDED_OCIO_MATRIXTRANSFORM_H @@ -9,17 +8,16 @@ #include "ops/matrix/MatrixOpData.h" - namespace OCIO_NAMESPACE { class MatrixTransformImpl : public MatrixTransform { public: - MatrixTransformImpl() = default; - MatrixTransformImpl(const MatrixTransformImpl &) = delete; - MatrixTransformImpl& operator=(const MatrixTransformImpl &) = delete; - ~MatrixTransformImpl() override = default; + MatrixTransformImpl() = default; + MatrixTransformImpl(const MatrixTransformImpl &) = delete; + MatrixTransformImpl & operator=(const MatrixTransformImpl &) = delete; + ~MatrixTransformImpl() override = default; TransformRcPtr createEditableCopy() const override; @@ -53,7 +51,6 @@ class MatrixTransformImpl : public MatrixTransform MatrixOpData m_data; }; - } // namespace OCIO_NAMESPACE -#endif // INCLUDED_OCIO_MATRIXTRANSFORM_H +#endif // INCLUDED_OCIO_MATRIXTRANSFORM_H diff --git a/src/OpenColorIO/transforms/RangeTransform.cpp b/src/OpenColorIO/transforms/RangeTransform.cpp index 745cb20e37..f8c9126f82 100644 --- a/src/OpenColorIO/transforms/RangeTransform.cpp +++ b/src/OpenColorIO/transforms/RangeTransform.cpp @@ -23,8 +23,8 @@ void RangeTransformImpl::deleter(RangeTransform * t) TransformRcPtr RangeTransformImpl::createEditableCopy() const { - RangeTransformRcPtr transform = RangeTransform::Create(); - dynamic_cast(transform.get())->data() = data(); + RangeTransformRcPtr transform = RangeTransform::Create(); + dynamic_cast(transform.get())->data() = data(); transform->setStyle(m_style); return transform; } @@ -64,7 +64,7 @@ void RangeTransformImpl::validate() const } } } - catch(Exception & ex) + catch (Exception & ex) { std::string errMsg("RangeTransform validation failed: "); errMsg += ex.what(); @@ -101,9 +101,10 @@ void RangeTransformImpl::setFileOutputBitDepth(BitDepth bitDepth) noexcept bool RangeTransformImpl::equals(const RangeTransform & other) const noexcept { - if (this == &other) return true; - return data() == dynamic_cast(&other)->data() - && m_style == other.getStyle(); + if (this == &other) + return true; + return data() == dynamic_cast(&other)->data() + && m_style == other.getStyle(); } void RangeTransformImpl::setMinInValue(double val) noexcept @@ -126,7 +127,6 @@ void RangeTransformImpl::unsetMinInValue() noexcept data().unsetMinInValue(); } - void RangeTransformImpl::setMaxInValue(double val) noexcept { data().setMaxInValue(val); @@ -147,7 +147,6 @@ void RangeTransformImpl::unsetMaxInValue() noexcept data().unsetMaxInValue(); } - void RangeTransformImpl::setMinOutValue(double val) noexcept { data().setMinOutValue(val); @@ -168,7 +167,6 @@ void RangeTransformImpl::unsetMinOutValue() noexcept data().unsetMinOutValue(); } - void RangeTransformImpl::setMaxOutValue(double val) noexcept { data().setMaxOutValue(val); @@ -189,22 +187,24 @@ void RangeTransformImpl::unsetMaxOutValue() noexcept data().unsetMaxOutValue(); } - -std::ostream& operator<< (std::ostream & os, const RangeTransform & t) noexcept +std::ostream & operator<<(std::ostream & os, const RangeTransform & t) noexcept { os << ""; return os; } - - } // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/transforms/RangeTransform.h b/src/OpenColorIO/transforms/RangeTransform.h index 526da30e92..fd0905b1fb 100644 --- a/src/OpenColorIO/transforms/RangeTransform.h +++ b/src/OpenColorIO/transforms/RangeTransform.h @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_RANGETRANSFORM_H #define INCLUDED_OCIO_RANGETRANSFORM_H @@ -9,17 +8,16 @@ #include "ops/range/RangeOpData.h" - namespace OCIO_NAMESPACE { class RangeTransformImpl : public RangeTransform { public: - RangeTransformImpl() = default; - RangeTransformImpl(const RangeTransformImpl &) = delete; - RangeTransformImpl& operator=(const RangeTransformImpl &) = delete; - ~RangeTransformImpl() override = default; + RangeTransformImpl() = default; + RangeTransformImpl(const RangeTransformImpl &) = delete; + RangeTransformImpl & operator=(const RangeTransformImpl &) = delete; + ~RangeTransformImpl() override = default; TransformRcPtr createEditableCopy() const override; @@ -67,11 +65,10 @@ class RangeTransformImpl : public RangeTransform static void deleter(RangeTransform * t); private: - RangeStyle m_style = RANGE_CLAMP; + RangeStyle m_style = RANGE_CLAMP; RangeOpData m_data; }; - } // namespace OCIO_NAMESPACE -#endif // INCLUDED_OCIO_RANGETRANSFORM_H +#endif // INCLUDED_OCIO_RANGETRANSFORM_H diff --git a/src/OpenColorIO/transforms/builtins/ACES.cpp b/src/OpenColorIO/transforms/builtins/ACES.cpp index d1e3321727..e167c63b13 100644 --- a/src/OpenColorIO/transforms/builtins/ACES.cpp +++ b/src/OpenColorIO/transforms/builtins/ACES.cpp @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #include #include @@ -17,7 +16,6 @@ #include "transforms/builtins/BuiltinTransformRegistry.h" #include "transforms/builtins/OpHelpers.h" - namespace OCIO_NAMESPACE { @@ -35,7 +33,7 @@ void GenerateOps(OpRcPtrVec & ops) CreateMatrixOp(ops, matrix, TRANSFORM_DIR_FORWARD); } -} // namespace AP1_to_CIE_XYZ_D65 +} // namespace AP1_to_CIE_XYZ_D65 namespace ACEScct_to_LINEAR { @@ -47,16 +45,17 @@ static constexpr double logSideOffset = 9.72 / 17.52; static constexpr double linSideBreak = 0.0078125; static constexpr double base = 2.; -static const LogOpData::Params - params { logSideSlope, logSideOffset, linSideSlope, linSideOffset, linSideBreak }; +static const LogOpData::Params + params{logSideSlope, logSideOffset, linSideSlope, linSideOffset, linSideBreak}; static const LogOpData log(base, params, params, params, TRANSFORM_DIR_INVERSE); -} // namespace ACEScct_to_LINEAR +} // namespace ACEScct_to_LINEAR namespace ADX_to_ACES { +// clang-format off static constexpr unsigned lutSize = 11; static constexpr double nonuniform_LUT[lutSize * 2] { @@ -72,10 +71,12 @@ static constexpr double nonuniform_LUT[lutSize * 2] 0.500000000000000, -1.121718645000000, 0.600000000000000, -0.926545676714876 }; +// clang-format on void GenerateOps(OpRcPtrVec & ops) { // Note that in CTL, the matrices are stored transposed. + // clang-format off static constexpr double CDD_TO_CID[4 * 4] { 0.75573, 0.22197, 0.02230, 0., @@ -83,36 +84,37 @@ void GenerateOps(OpRcPtrVec & ops) 0.16134, 0.07406, 0.76460, 0., 0., 0., 0., 1. }; + // clang-format on // Convert Channel Dependent Density values into Channel Independent Density values. CreateMatrixOp(ops, &CDD_TO_CID[0], TRANSFORM_DIR_FORWARD); - auto GenerateLutValues = [](double in) -> float - { + auto GenerateLutValues = [](double in) -> float { double out = 0.; if (in < nonuniform_LUT[0]) // Lower bound i.e. in < nonuniform_LUT[0, 0]. { // Extrapolate to ease conversion to LUT1D. - const double slope = (nonuniform_LUT[3] - nonuniform_LUT[1]) - / (nonuniform_LUT[2] - nonuniform_LUT[0]); + const double slope + = (nonuniform_LUT[3] - nonuniform_LUT[1]) / (nonuniform_LUT[2] - nonuniform_LUT[0]); out = nonuniform_LUT[1] - slope * (nonuniform_LUT[0] - in); - if (out < -10.) out = -10.; + if (out < -10.) + out = -10.; } - else if (in <= nonuniform_LUT[(lutSize-1) * 2]) + else if (in <= nonuniform_LUT[(lutSize - 1) * 2]) { out = Interpolate1D(lutSize, &nonuniform_LUT[0], in); } else // Upper bound i.e. in > nonuniform_LUT[lutSize-1, 0]. { - const double REF_PT - = (7120. - 1520.) / 8000. * (100. / 55.) - std::log10(0.18); + const double REF_PT = (7120. - 1520.) / 8000. * (100. / 55.) - std::log10(0.18); out = (100. / 55.) * in - REF_PT; - if (out > 4.8162678) out = 4.8162678; // log10(HALF_MAX) + if (out > 4.8162678) + out = 4.8162678; // log10(HALF_MAX) } return float(out); @@ -124,6 +126,7 @@ void GenerateOps(OpRcPtrVec & ops) // Convert Relative Log Exposure values to Relative Exposure values. CreateLogOp(ops, 10., TRANSFORM_DIR_INVERSE); + // clang-format off static constexpr double EXP_TO_ACES[4 * 4] { 0.72286, 0.12630, 0.15084, 0., @@ -131,12 +134,13 @@ void GenerateOps(OpRcPtrVec & ops) 0.01427, 0.08213, 0.90359, 0., 0., 0., 0., 1. }; + // clang-format on // Convert Relative Exposure values to ACES values. - CreateMatrixOp(ops, &EXP_TO_ACES[0], TRANSFORM_DIR_FORWARD); + CreateMatrixOp(ops, &EXP_TO_ACES[0], TRANSFORM_DIR_FORWARD); } -} // namespace ADX_to_ACES +} // namespace ADX_to_ACES namespace ACES_OUTPUT { @@ -147,20 +151,27 @@ void Generate_RRT_preamble_ops(OpRcPtrVec & ops) CreateFixedFunctionOp(ops, FixedFunctionOpData::ACES_RED_MOD_10_FWD, {}); - CreateRangeOp(ops, - 0., RangeOpData::EmptyValue(), // don't clamp high end - 0., RangeOpData::EmptyValue(), // don't clamp high end - TRANSFORM_DIR_FORWARD); + CreateRangeOp( + ops, + 0., + RangeOpData::EmptyValue(), // don't clamp high end + 0., + RangeOpData::EmptyValue(), // don't clamp high end + TRANSFORM_DIR_FORWARD); MatrixOpData::MatrixArrayPtr matrix = build_conversion_matrix(ACES_AP0::primaries, ACES_AP1::primaries, ADAPTATION_NONE); CreateMatrixOp(ops, matrix, TRANSFORM_DIR_FORWARD); - CreateRangeOp(ops, - 0., RangeOpData::EmptyValue(), // don't clamp high end - 0., RangeOpData::EmptyValue(), // don't clamp high end - TRANSFORM_DIR_FORWARD); + CreateRangeOp( + ops, + 0., + RangeOpData::EmptyValue(), // don't clamp high end + 0., + RangeOpData::EmptyValue(), // don't clamp high end + TRANSFORM_DIR_FORWARD); + // clang-format off static constexpr double RRT_SAT_MAT[4 * 4] { 0.970889148671, 0.026963270632, 0.002147580696, 0., @@ -168,7 +179,8 @@ void Generate_RRT_preamble_ops(OpRcPtrVec & ops) 0.010889148671, 0.026963270632, 0.962147580696, 0., 0., 0., 0., 1. }; - CreateMatrixOp(ops, &RRT_SAT_MAT[0], TRANSFORM_DIR_FORWARD); + // clang-format on + CreateMatrixOp(ops, &RRT_SAT_MAT[0], TRANSFORM_DIR_FORWARD); } void Generate_tonecurve_ops(OpRcPtrVec & ops) @@ -178,6 +190,7 @@ void Generate_tonecurve_ops(OpRcPtrVec & ops) // Apply RRT shaper using the same quadratic B-spline as the CTL. { + // clang-format off auto curve = GradingBSplineCurve::Create({ {-5.26017743f, -4.f}, {-3.75502745f, -3.57868829f}, @@ -187,13 +200,17 @@ void Generate_tonecurve_ops(OpRcPtrVec & ops) { 2.86763245f, 3.83406206f}, { 4.67381243f, 4.f} }); - float slopes[] = { 0.f, 0.55982688f, 1.77532247f, 1.55f, 0.8787017f, 0.18374463f, 0.f }; + // clang-format on + float slopes[] = {0.f, 0.55982688f, 1.77532247f, 1.55f, 0.8787017f, 0.18374463f, 0.f}; for (size_t i = 0; i < 7; ++i) { - curve->setSlope( i, slopes[i] ); + curve->setSlope(i, slopes[i]); } ConstGradingBSplineCurveRcPtr m = curve; - auto identity = GradingBSplineCurve::Create({ { 0.f, 0.f }, { 1.f, 1.f } }); + auto identity = GradingBSplineCurve::Create({ + {0.f, 0.f}, + {1.f, 1.f} + }); ConstGradingBSplineCurveRcPtr z = identity; auto gc = std::make_shared(GRADING_LOG, z, z, z, m); @@ -202,6 +219,7 @@ void Generate_tonecurve_ops(OpRcPtrVec & ops) // Apply SDR ODT shaper using the same quadratic B-spline as the CTL. { + // clang-format off auto curve = GradingBSplineCurve::Create({ {-2.54062362f, -1.69897000f}, {-2.08035721f, -1.58843500f}, @@ -219,15 +237,32 @@ void Generate_tonecurve_ops(OpRcPtrVec & ops) { 2.67087173f, 1.66065457f}, { 3.00247681f, 1.68124124f} }); - float slopes[] = { 0.f, 0.4803088f, 0.5405565f, 0.79149813f, 0.9055625f, 0.98460368f, - 0.96884766f, 1.f, 0.87078346f, 0.73702127f, 0.42068113f, 0.23763206f, - 0.14535362f, 0.08416378f, 0.04f }; + // clang-format on + float slopes[] + = {0.f, + 0.4803088f, + 0.5405565f, + 0.79149813f, + 0.9055625f, + 0.98460368f, + 0.96884766f, + 1.f, + 0.87078346f, + 0.73702127f, + 0.42068113f, + 0.23763206f, + 0.14535362f, + 0.08416378f, + 0.04f}; for (size_t i = 0; i < 15; ++i) { - curve->setSlope( i, slopes[i] ); + curve->setSlope(i, slopes[i]); } ConstGradingBSplineCurveRcPtr m = curve; - auto identity = GradingBSplineCurve::Create({ { 0.f, 0.f }, { 1.f, 1.f } }); + auto identity = GradingBSplineCurve::Create({ + {0.f, 0.f}, + {1.f, 1.f} + }); ConstGradingBSplineCurveRcPtr z = identity; auto gc = std::make_shared(GRADING_LOG, z, z, z, m); @@ -240,13 +275,14 @@ void Generate_tonecurve_ops(OpRcPtrVec & ops) // Apply Cinema White/Black correction. { static constexpr double CINEMA_WHITE = 48.; - // Note: ACESlib.ODT_Common.ctl claims that using pow10(log10(0.02) for black improves performance at 0, - // but that does not seem to be the case here, 0 input currently gives about 4e-11 XYZ output either way. + // Note: ACESlib.ODT_Common.ctl claims that using pow10(log10(0.02) for black improves + // performance at 0, but that does not seem to be the case here, 0 input currently gives + // about 4e-11 XYZ output either way. static constexpr double CINEMA_BLACK = 0.02; static constexpr double scale = 1. / (CINEMA_WHITE - CINEMA_BLACK); - static constexpr double scale4[4] = { scale, scale, scale, 1. }; + static constexpr double scale4[4] = {scale, scale, scale, 1.}; static constexpr double offset = -CINEMA_BLACK * scale; - static constexpr double offset4[4] = { offset, offset, offset, 0. }; + static constexpr double offset4[4] = {offset, offset, offset, 0.}; CreateScaleOffsetOp(ops, scale4, offset4, TRANSFORM_DIR_FORWARD); } @@ -258,6 +294,7 @@ void Generate_video_adjustment_ops(OpRcPtrVec & ops) CreateFixedFunctionOp(ops, FixedFunctionOpData::ACES_DARK_TO_DIM_10_FWD, {}); // Desat to compensate 48 nit to 100 nit brightness. + // clang-format off static constexpr double DESAT_100_NITS[4 * 4] { 0.949056010175, 0.047185723607, 0.003758266219, 0., @@ -265,6 +302,7 @@ void Generate_video_adjustment_ops(OpRcPtrVec & ops) 0.019056010175, 0.047185723607, 0.933758266219, 0., 0., 0., 0., 1. }; + // clang-format on CreateMatrixOp(ops, &DESAT_100_NITS[0], TRANSFORM_DIR_FORWARD); } @@ -276,6 +314,7 @@ void Generate_hdr_tonecurve_ops(OpRcPtrVec & ops, double Y_MAX) // Apply RRT shaper using the same quadratic B-spline as the CTL. if (Y_MAX == 1000.) { + // clang-format off auto curve = GradingBSplineCurve::Create({ { -5.60050155f, -4.00000000f }, { -4.09535157f, -3.57868829f }, @@ -285,13 +324,17 @@ void Generate_hdr_tonecurve_ops(OpRcPtrVec & ops, double Y_MAX) { 1.53199279f, 2.87906206f }, { 2.84051500f, 3.00000000f } }); - const float slopes[] = { 0.f, 0.55982688f, 1.77532247f, 1.55f, 0.81219728f, 0.1848466f, 0.f }; + // clang-format on + const float slopes[] = {0.f, 0.55982688f, 1.77532247f, 1.55f, 0.81219728f, 0.1848466f, 0.f}; for (size_t i = 0; i < 7; ++i) { - curve->setSlope( i, slopes[i] ); + curve->setSlope(i, slopes[i]); } ConstGradingBSplineCurveRcPtr m = curve; - auto identity = GradingBSplineCurve::Create({ { 0.f, 0.f }, { 1.f, 1.f } }); + auto identity = GradingBSplineCurve::Create({ + {0.f, 0.f}, + {1.f, 1.f} + }); ConstGradingBSplineCurveRcPtr z = identity; auto gc = std::make_shared(GRADING_LOG, z, z, z, m); @@ -299,6 +342,7 @@ void Generate_hdr_tonecurve_ops(OpRcPtrVec & ops, double Y_MAX) } else if (Y_MAX == 2000.) { + // clang-format off auto curve = GradingBSplineCurve::Create({ { -5.59738488f, -4.00000000f }, { -4.09223490f, -3.57868829f }, @@ -308,13 +352,18 @@ void Generate_hdr_tonecurve_ops(OpRcPtrVec & ops, double Y_MAX) { 1.83472930f, 3.16609199f }, { 3.29306142f, 3.30103000f }, }); - const float slopes[] = { 0.f, 0.55982688f, 1.77532247f, 1.55f, 0.83637009f, 0.18505799f, 0.f }; + // clang-format on + const float slopes[] + = {0.f, 0.55982688f, 1.77532247f, 1.55f, 0.83637009f, 0.18505799f, 0.f}; for (size_t i = 0; i < 7; ++i) { - curve->setSlope( i, slopes[i] ); + curve->setSlope(i, slopes[i]); } ConstGradingBSplineCurveRcPtr m = curve; - auto identity = GradingBSplineCurve::Create({ { 0.f, 0.f }, { 1.f, 1.f } }); + auto identity = GradingBSplineCurve::Create({ + {0.f, 0.f}, + {1.f, 1.f} + }); ConstGradingBSplineCurveRcPtr z = identity; auto gc = std::make_shared(GRADING_LOG, z, z, z, m); @@ -322,6 +371,7 @@ void Generate_hdr_tonecurve_ops(OpRcPtrVec & ops, double Y_MAX) } else if (Y_MAX == 4000.) { + // clang-format off auto curve = GradingBSplineCurve::Create({ { -5.59503319f, -4.00000000f }, { -4.08988322f, -3.57868829f }, @@ -331,13 +381,18 @@ void Generate_hdr_tonecurve_ops(OpRcPtrVec & ops, double Y_MAX) { 2.13670081f, 3.45351273f }, { 3.74484285f, 3.60205999f }, }); - const float slopes[] = { 0.f, 0.55982688f, 1.77532247f, 1.55f, 0.85652519f, 0.18474395f, 0.f }; + // clang-format on + const float slopes[] + = {0.f, 0.55982688f, 1.77532247f, 1.55f, 0.85652519f, 0.18474395f, 0.f}; for (size_t i = 0; i < 7; ++i) { - curve->setSlope( i, slopes[i] ); + curve->setSlope(i, slopes[i]); } ConstGradingBSplineCurveRcPtr m = curve; - auto identity = GradingBSplineCurve::Create({ { 0.f, 0.f }, { 1.f, 1.f } }); + auto identity = GradingBSplineCurve::Create({ + {0.f, 0.f}, + {1.f, 1.f} + }); ConstGradingBSplineCurveRcPtr z = identity; auto gc = std::make_shared(GRADING_LOG, z, z, z, m); @@ -345,6 +400,7 @@ void Generate_hdr_tonecurve_ops(OpRcPtrVec & ops, double Y_MAX) } else if (Y_MAX == 108.) { + // clang-format off auto curve = GradingBSplineCurve::Create({ { -5.37852506f, -4.00000000f }, { -3.87337508f, -3.57868829f }, @@ -354,13 +410,18 @@ void Generate_hdr_tonecurve_ops(OpRcPtrVec & ops, double Y_MAX) { 0.79192092f, 1.96008059f }, { 1.61941895f, 2.03342376f }, }); - const float slopes[] = { 0.f, 0.55982688f, 1.77532247f, 1.55f, 0.68179646f, 0.17726487f, 0.f }; + // clang-format on + const float slopes[] + = {0.f, 0.55982688f, 1.77532247f, 1.55f, 0.68179646f, 0.17726487f, 0.f}; for (size_t i = 0; i < 7; ++i) { - curve->setSlope( i, slopes[i] ); + curve->setSlope(i, slopes[i]); } ConstGradingBSplineCurveRcPtr m = curve; - auto identity = GradingBSplineCurve::Create({ { 0.f, 0.f }, { 1.f, 1.f } }); + auto identity = GradingBSplineCurve::Create({ + {0.f, 0.f}, + {1.f, 1.f} + }); ConstGradingBSplineCurveRcPtr z = identity; auto gc = std::make_shared(GRADING_LOG, z, z, z, m); @@ -372,11 +433,11 @@ void Generate_hdr_tonecurve_ops(OpRcPtrVec & ops, double Y_MAX) // Apply Cinema White/Black correction. { - const double Y_MIN = 0.0001; - const double scale = 1. / (Y_MAX - Y_MIN); - const double scale4[4] = { scale, scale, scale, 1. }; - const double offset = -Y_MIN * scale; - const double offset4[4] = { offset, offset, offset, 0. }; + const double Y_MIN = 0.0001; + const double scale = 1. / (Y_MAX - Y_MIN); + const double scale4[4] = {scale, scale, scale, 1.}; + const double offset = -Y_MIN * scale; + const double offset4[4] = {offset, offset, offset, 0.}; CreateScaleOffsetOp(ops, scale4, offset4, TRANSFORM_DIR_FORWARD); } @@ -388,13 +449,9 @@ void Generate_sdr_primary_clamp_ops(OpRcPtrVec & ops, const Primaries & limitPri = build_conversion_matrix(ACES_AP1::primaries, limitPrimaries, ADAPTATION_BRADFORD); CreateMatrixOp(ops, matrix1, TRANSFORM_DIR_FORWARD); - CreateRangeOp(ops, - 0., 1., - 0., 1., - TRANSFORM_DIR_FORWARD); + CreateRangeOp(ops, 0., 1., 0., 1., TRANSFORM_DIR_FORWARD); - MatrixOpData::MatrixArrayPtr matrix2 - = rgb2xyz_from_xy(limitPrimaries); + MatrixOpData::MatrixArrayPtr matrix2 = rgb2xyz_from_xy(limitPrimaries); CreateMatrixOp(ops, matrix2, TRANSFORM_DIR_FORWARD); } @@ -404,13 +461,9 @@ void Generate_hdr_primary_clamp_ops(OpRcPtrVec & ops, const Primaries & limitPri = build_conversion_matrix(ACES_AP1::primaries, limitPrimaries, ADAPTATION_NONE); CreateMatrixOp(ops, matrix1, TRANSFORM_DIR_FORWARD); - CreateRangeOp(ops, - 0., 1., - 0., 1., - TRANSFORM_DIR_FORWARD); + CreateRangeOp(ops, 0., 1., 0., 1., TRANSFORM_DIR_FORWARD); - MatrixOpData::MatrixArrayPtr matrix2 - = rgb2xyz_from_xy(limitPrimaries); + MatrixOpData::MatrixArrayPtr matrix2 = rgb2xyz_from_xy(limitPrimaries); CreateMatrixOp(ops, matrix2, TRANSFORM_DIR_FORWARD); MatrixOpData::MatrixArrayPtr matrix3 @@ -423,26 +476,25 @@ void Generate_nit_normalization_ops(OpRcPtrVec & ops, double nit_level) // The PQ curve expects nits / 100 as input. Unnormalize 1.0 to the nit level for the transform // and then renormalize to put 100 nits at 1.0. const double scale = nit_level * 0.01; - const double scale4[4] = { scale, scale, scale, 1. }; + const double scale4[4] = {scale, scale, scale, 1.}; CreateScaleOp(ops, scale4, TRANSFORM_DIR_FORWARD); } void Generate_roll_white_d60_ops(OpRcPtrVec & ops) { - auto GenerateLutValues = [](double in) -> float - { + auto GenerateLutValues = [](double in) -> float { const double new_wht = 0.918; - const double width = 0.5; - const double x0 = -1.0; - const double x1 = x0 + width; - const double y0 = -new_wht; - const double y1 = x1; - const double m1 = (x1 - x0); - const double a = y0 - y1 + m1; - const double b = 2. * ( y1 - y0) - m1; - const double c = y0; - const double t = (-in - x0) / (x1 - x0); - double out = 0.0; + const double width = 0.5; + const double x0 = -1.0; + const double x1 = x0 + width; + const double y0 = -new_wht; + const double y1 = x1; + const double m1 = (x1 - x0); + const double a = y0 - y1 + m1; + const double b = 2. * (y1 - y0) - m1; + const double c = y0; + const double t = (-in - x0) / (x1 - x0); + double out = 0.0; if (t < 0.0) { out = -(t * b + c); @@ -453,7 +505,7 @@ void Generate_roll_white_d60_ops(OpRcPtrVec & ops) } else { - out = -(( t * a + b) * t + c); + out = -((t * a + b) * t + c); } return float(out); }; @@ -463,20 +515,19 @@ void Generate_roll_white_d60_ops(OpRcPtrVec & ops) void Generate_roll_white_d65_ops(OpRcPtrVec & ops) { - auto GenerateLutValues = [](double in) -> float - { + auto GenerateLutValues = [](double in) -> float { const double new_wht = 0.908; - const double width = 0.5; - const double x0 = -1.0; - const double x1 = x0 + width; - const double y0 = -new_wht; - const double y1 = x1; - const double m1 = (x1 - x0); - const double a = y0 - y1 + m1; - const double b = 2. * ( y1 - y0) - m1; - const double c = y0; - const double t = (-in - x0) / (x1 - x0); - double out = 0.0; + const double width = 0.5; + const double x0 = -1.0; + const double x1 = x0 + width; + const double y0 = -new_wht; + const double y1 = x1; + const double m1 = (x1 - x0); + const double a = y0 - y1 + m1; + const double b = 2. * (y1 - y0) - m1; + const double c = y0; + const double t = (-in - x0) / (x1 - x0); + double out = 0.0; if (t < 0.0) { out = -(t * b + c); @@ -487,7 +538,7 @@ void Generate_roll_white_d65_ops(OpRcPtrVec & ops) } else { - out = -(( t * a + b) * t + c); + out = -((t * a + b) * t + c); } return float(out); }; @@ -495,8 +546,7 @@ void Generate_roll_white_d65_ops(OpRcPtrVec & ops) CreateHalfLut(ops, GenerateLutValues); } -} // namespace ACES_OUTPUT - +} // namespace ACES_OUTPUT // // Create the built-in transforms. @@ -509,156 +559,168 @@ namespace ACES void RegisterAll(BuiltinTransformRegistryImpl & registry) noexcept { { - auto ACES_AP0_to_CIE_XYZ_D65_BFD_Functor = [](OpRcPtrVec & ops) - { + auto ACES_AP0_to_CIE_XYZ_D65_BFD_Functor = [](OpRcPtrVec & ops) { // The CIE XYZ space has its conventional normalization (i.e., to illuminant E). - // A neutral value of [1.,1.,1] in AP0 maps to the XYZ value of D65 ([0.9504..., 1., 1.089...]). + // A neutral value of [1.,1.,1] in AP0 maps to the XYZ value of D65 + // ([0.9504..., 1., 1.089...]). MatrixOpData::MatrixArrayPtr matrix = build_conversion_matrix_to_XYZ_D65(ACES_AP0::primaries, ADAPTATION_BRADFORD); CreateMatrixOp(ops, matrix, TRANSFORM_DIR_FORWARD); }; - registry.addBuiltin("UTILITY - ACES-AP0_to_CIE-XYZ-D65_BFD", - "Convert ACES AP0 primaries to CIE XYZ with a D65 white point with Bradford adaptation", - ACES_AP0_to_CIE_XYZ_D65_BFD_Functor); + registry.addBuiltin( + "UTILITY - ACES-AP0_to_CIE-XYZ-D65_BFD", + "Convert ACES AP0 primaries to CIE XYZ with a D65 white point with Bradford adaptation", + ACES_AP0_to_CIE_XYZ_D65_BFD_Functor); } { - auto ACES_AP1_to_CIE_XYZ_D65_BFD_Functor = [](OpRcPtrVec & ops) - { - AP1_to_CIE_XYZ_D65::GenerateOps(ops); - }; + auto ACES_AP1_to_CIE_XYZ_D65_BFD_Functor + = [](OpRcPtrVec & ops) { AP1_to_CIE_XYZ_D65::GenerateOps(ops); }; - registry.addBuiltin("UTILITY - ACES-AP1_to_CIE-XYZ-D65_BFD", - "Convert ACES AP1 primaries to CIE XYZ with a D65 white point with Bradford adaptation", - ACES_AP1_to_CIE_XYZ_D65_BFD_Functor); + registry.addBuiltin( + "UTILITY - ACES-AP1_to_CIE-XYZ-D65_BFD", + "Convert ACES AP1 primaries to CIE XYZ with a D65 white point with Bradford adaptation", + ACES_AP1_to_CIE_XYZ_D65_BFD_Functor); } { - auto ACES_AP1_to_LINEAR_REC709_BFD_Functor = [](OpRcPtrVec & ops) - { - MatrixOpData::MatrixArrayPtr matrix - = build_conversion_matrix(ACES_AP1::primaries, REC709::primaries, ADAPTATION_BRADFORD); + auto ACES_AP1_to_LINEAR_REC709_BFD_Functor = [](OpRcPtrVec & ops) { + MatrixOpData::MatrixArrayPtr matrix = build_conversion_matrix( + ACES_AP1::primaries, + REC709::primaries, + ADAPTATION_BRADFORD); CreateMatrixOp(ops, matrix, TRANSFORM_DIR_FORWARD); }; - registry.addBuiltin("UTILITY - ACES-AP1_to_LINEAR-REC709_BFD", - "Convert ACES AP1 primaries to linear Rec.709 primaries with Bradford adaptation", - ACES_AP1_to_LINEAR_REC709_BFD_Functor); + registry.addBuiltin( + "UTILITY - ACES-AP1_to_LINEAR-REC709_BFD", + "Convert ACES AP1 primaries to linear Rec.709 primaries with Bradford adaptation", + ACES_AP1_to_LINEAR_REC709_BFD_Functor); } { - auto ACEScct_LOG_to_LIN_Functor = [](OpRcPtrVec & ops) - { + auto ACEScct_LOG_to_LIN_Functor = [](OpRcPtrVec & ops) { LogOpDataRcPtr log = ACEScct_to_LINEAR::log.clone(); CreateLogOp(ops, log, TRANSFORM_DIR_FORWARD); }; - registry.addBuiltin("CURVE - ACEScct-LOG_to_LINEAR", - "Apply the log-to-lin curve used in ACEScct", - ACEScct_LOG_to_LIN_Functor); + registry.addBuiltin( + "CURVE - ACEScct-LOG_to_LINEAR", + "Apply the log-to-lin curve used in ACEScct", + ACEScct_LOG_to_LIN_Functor); } { - auto ACEScct_to_ACES2065_1_Functor = [](OpRcPtrVec & ops) - { + auto ACEScct_to_ACES2065_1_Functor = [](OpRcPtrVec & ops) { LogOpDataRcPtr log = ACEScct_to_LINEAR::log.clone(); CreateLogOp(ops, log, TRANSFORM_DIR_FORWARD); - MatrixOpData::MatrixArrayPtr matrix - = build_conversion_matrix(ACES_AP1::primaries, ACES_AP0::primaries, ADAPTATION_NONE); + MatrixOpData::MatrixArrayPtr matrix = build_conversion_matrix( + ACES_AP1::primaries, + ACES_AP0::primaries, + ADAPTATION_NONE); CreateMatrixOp(ops, matrix, TRANSFORM_DIR_FORWARD); }; - registry.addBuiltin("ACEScct_to_ACES2065-1", - "Convert ACEScct to ACES2065-1", - ACEScct_to_ACES2065_1_Functor); + registry.addBuiltin( + "ACEScct_to_ACES2065-1", + "Convert ACEScct to ACES2065-1", + ACEScct_to_ACES2065_1_Functor); } { - auto ACEScc_to_ACES2065_1_Functor = [](OpRcPtrVec & ops) - { - auto GenerateLutValues = [](double input) -> float - { + auto ACEScc_to_ACES2065_1_Functor = [](OpRcPtrVec & ops) { + auto GenerateLutValues = [](double input) -> float { // The functor input will be [0,1]. Remap this to a wider domain to better capture // the full extent of ACEScc. static constexpr double IN_MIN = -0.36; - static constexpr double IN_MAX = 1.50; - double in = input * (IN_MAX - IN_MIN) + IN_MIN; + static constexpr double IN_MAX = 1.50; + double in = input * (IN_MAX - IN_MIN) + IN_MIN; double out = 0.0f; if (in < ((9.72 - 15.0) / 17.52)) { - out = (std::pow( 2., in * 17.52 - 9.72) - std::pow( 2., -16.)) * 2.0; + out = (std::pow(2., in * 17.52 - 9.72) - std::pow(2., -16.)) * 2.0; } else { - out = std::pow( 2., in * 17.52 - 9.72); + out = std::pow(2., in * 17.52 - 9.72); } - // The CTL clamps at HALF_MAX, but it's better to avoid a slope discontinuity in a LUT. + // The CTL clamps at HALF_MAX, but it's better to avoid a slope discontinuity in a + // LUT. return float(out); }; // Allow the LUT to work over a wider input range to better capture the ACEScc extent. - CreateRangeOp(ops, - -0.36, 1.5, - 0.00, 1.0, - TRANSFORM_DIR_FORWARD); + CreateRangeOp(ops, -0.36, 1.5, 0.00, 1.0, TRANSFORM_DIR_FORWARD); CreateLut(ops, 4096, GenerateLutValues); - MatrixOpData::MatrixArrayPtr matrix - = build_conversion_matrix(ACES_AP1::primaries, ACES_AP0::primaries, ADAPTATION_NONE); + MatrixOpData::MatrixArrayPtr matrix = build_conversion_matrix( + ACES_AP1::primaries, + ACES_AP0::primaries, + ADAPTATION_NONE); CreateMatrixOp(ops, matrix, TRANSFORM_DIR_FORWARD); - // This helps when the transform is inverted to match the CTL, + // This helps when the transform is inverted to match the CTL, // which clamps incoming ACES2065-1 values. - CreateRangeOp(ops, - 0.00, RangeOpData::EmptyValue(), // don't clamp high end, - 0.00, RangeOpData::EmptyValue(), // don't clamp high end - TRANSFORM_DIR_FORWARD); + CreateRangeOp( + ops, + 0.00, + RangeOpData::EmptyValue(), // don't clamp high end, + 0.00, + RangeOpData::EmptyValue(), // don't clamp high end + TRANSFORM_DIR_FORWARD); }; - registry.addBuiltin("ACEScc_to_ACES2065-1", - "Convert ACEScc to ACES2065-1", - ACEScc_to_ACES2065_1_Functor); + registry.addBuiltin( + "ACEScc_to_ACES2065-1", + "Convert ACEScc to ACES2065-1", + ACEScc_to_ACES2065_1_Functor); } { - auto ACEScg_to_ACES2065_1_Functor = [](OpRcPtrVec & ops) - { - MatrixOpData::MatrixArrayPtr matrix - = build_conversion_matrix(ACES_AP1::primaries, ACES_AP0::primaries, ADAPTATION_NONE); + auto ACEScg_to_ACES2065_1_Functor = [](OpRcPtrVec & ops) { + MatrixOpData::MatrixArrayPtr matrix = build_conversion_matrix( + ACES_AP1::primaries, + ACES_AP0::primaries, + ADAPTATION_NONE); CreateMatrixOp(ops, matrix, TRANSFORM_DIR_FORWARD); }; - registry.addBuiltin("ACEScg_to_ACES2065-1", - "Convert ACEScg to ACES2065-1", - ACEScg_to_ACES2065_1_Functor); + registry.addBuiltin( + "ACEScg_to_ACES2065-1", + "Convert ACEScg to ACES2065-1", + ACEScg_to_ACES2065_1_Functor); } { - auto ACESproxy10i_to_ACES2065_1_Functor = [](OpRcPtrVec & ops) - { - CreateRangeOp(ops, - 64. / 1023., 940. / 1023., - (( 64 - 425.) / 50.) - 2.5, ((940 - 425.) / 50.) - 2.5, - TRANSFORM_DIR_FORWARD); + auto ACESproxy10i_to_ACES2065_1_Functor = [](OpRcPtrVec & ops) { + CreateRangeOp( + ops, + 64. / 1023., + 940. / 1023., + ((64 - 425.) / 50.) - 2.5, + ((940 - 425.) / 50.) - 2.5, + TRANSFORM_DIR_FORWARD); CreateLogOp(ops, 2., TRANSFORM_DIR_INVERSE); - MatrixOpData::MatrixArrayPtr matrix - = build_conversion_matrix(ACES_AP1::primaries, ACES_AP0::primaries, ADAPTATION_NONE); + MatrixOpData::MatrixArrayPtr matrix = build_conversion_matrix( + ACES_AP1::primaries, + ACES_AP0::primaries, + ADAPTATION_NONE); CreateMatrixOp(ops, matrix, TRANSFORM_DIR_FORWARD); }; - registry.addBuiltin("ACESproxy10i_to_ACES2065-1", - "Convert ACESproxy 10i to ACES2065-1", - ACESproxy10i_to_ACES2065_1_Functor); + registry.addBuiltin( + "ACESproxy10i_to_ACES2065-1", + "Convert ACESproxy 10i to ACES2065-1", + ACESproxy10i_to_ACES2065_1_Functor); } { - auto ADX10_to_ACES2065_1_Functor = [](OpRcPtrVec & ops) - { + auto ADX10_to_ACES2065_1_Functor = [](OpRcPtrVec & ops) { static constexpr double scale = 1023. / 500.; - static constexpr double scale4[4] = { scale, scale, scale, 1. }; - + static constexpr double scale4[4] = {scale, scale, scale, 1.}; + static constexpr double offset = -95. / 500.; - static constexpr double offset4[4] = { offset, offset, offset, 0. }; + static constexpr double offset4[4] = {offset, offset, offset, 0.}; // Convert ADX10 values to Channel Dependent Density values. CreateScaleOffsetOp(ops, scale4, offset4, TRANSFORM_DIR_FORWARD); @@ -667,18 +729,18 @@ void RegisterAll(BuiltinTransformRegistryImpl & registry) noexcept ADX_to_ACES::GenerateOps(ops); }; - registry.addBuiltin("ADX10_to_ACES2065-1", - "Convert ADX10 to ACES2065-1", - ADX10_to_ACES2065_1_Functor); + registry.addBuiltin( + "ADX10_to_ACES2065-1", + "Convert ADX10 to ACES2065-1", + ADX10_to_ACES2065_1_Functor); } { - auto ADX16_to_ACES2065_1_Functor = [](OpRcPtrVec & ops) - { + auto ADX16_to_ACES2065_1_Functor = [](OpRcPtrVec & ops) { static constexpr double scale = 65535. / 8000.; - static constexpr double scale4[4] = { scale, scale, scale, 1. }; - + static constexpr double scale4[4] = {scale, scale, scale, 1.}; + static constexpr double offset = -1520. / 8000.; - static constexpr double offset4[4] = { offset, offset, offset, 0. }; + static constexpr double offset4[4] = {offset, offset, offset, 0.}; // Convert ADX16 values to Channel Dependent Density values. CreateScaleOffsetOp(ops, scale4, offset4, TRANSFORM_DIR_FORWARD); @@ -687,14 +749,15 @@ void RegisterAll(BuiltinTransformRegistryImpl & registry) noexcept ADX_to_ACES::GenerateOps(ops); }; - registry.addBuiltin("ADX16_to_ACES2065-1", - "Convert ADX16 to ACES2065-1", - ADX16_to_ACES2065_1_Functor); + registry.addBuiltin( + "ADX16_to_ACES2065-1", + "Convert ADX16 to ACES2065-1", + ADX16_to_ACES2065_1_Functor); } { - auto BLUE_LIGHT_FIX_Functor = [](OpRcPtrVec & ops) - { + auto BLUE_LIGHT_FIX_Functor = [](OpRcPtrVec & ops) { // Note that in CTL, the matrices are stored transposed. + // clang-format off static constexpr double BLUE_LIGHT_FIX[4 * 4] { 0.9404372683, -0.0183068787, 0.0778696104, 0., @@ -702,30 +765,37 @@ void RegisterAll(BuiltinTransformRegistryImpl & registry) noexcept 0.0005471261, -0.0008833746, 1.0003362486, 0., 0., 0., 0., 1. }; + // clang-format on CreateMatrixOp(ops, &BLUE_LIGHT_FIX[0], TRANSFORM_DIR_FORWARD); }; - registry.addBuiltin("ACES-LMT - BLUE_LIGHT_ARTIFACT_FIX", - "LMT for desaturating blue hues to reduce clipping artifacts", - BLUE_LIGHT_FIX_Functor); + registry.addBuiltin( + "ACES-LMT - BLUE_LIGHT_ARTIFACT_FIX", + "LMT for desaturating blue hues to reduce clipping artifacts", + BLUE_LIGHT_FIX_Functor); } { - auto GAMUT_COMP_13_Functor = [](OpRcPtrVec & ops) - { - MatrixOpData::MatrixArrayPtr matrix - = build_conversion_matrix(ACES_AP0::primaries, ACES_AP1::primaries, ADAPTATION_NONE); + auto GAMUT_COMP_13_Functor = [](OpRcPtrVec & ops) { + MatrixOpData::MatrixArrayPtr matrix = build_conversion_matrix( + ACES_AP0::primaries, + ACES_AP1::primaries, + ADAPTATION_NONE); CreateMatrixOp(ops, matrix, TRANSFORM_DIR_FORWARD); - CreateFixedFunctionOp(ops, FixedFunctionOpData::ACES_GAMUT_COMP_13_FWD, { - 1.147, 1.264, 1.312, 0.815, 0.803, 0.880, 1.2}); + CreateFixedFunctionOp( + ops, + FixedFunctionOpData::ACES_GAMUT_COMP_13_FWD, + {1.147, 1.264, 1.312, 0.815, 0.803, 0.880, 1.2}); CreateMatrixOp(ops, matrix, TRANSFORM_DIR_INVERSE); }; - registry.addBuiltin("ACES-LMT - ACES 1.3 Reference Gamut Compression", - "LMT (applied in ACES2065-1) to compress scene-referred values from common cameras into the AP1 gamut", - GAMUT_COMP_13_Functor); + registry.addBuiltin( + "ACES-LMT - ACES 1.3 Reference Gamut Compression", + "LMT (applied in ACES2065-1) to compress scene-referred values from common cameras " + "into the AP1 gamut", + GAMUT_COMP_13_Functor); } // @@ -733,8 +803,7 @@ void RegisterAll(BuiltinTransformRegistryImpl & registry) noexcept // { - auto ACES2065_1_to_CIE_XYZ_cinema_1_0_Functor = [](OpRcPtrVec & ops) - { + auto ACES2065_1_to_CIE_XYZ_cinema_1_0_Functor = [](OpRcPtrVec & ops) { ACES_OUTPUT::Generate_RRT_preamble_ops(ops); ACES_OUTPUT::Generate_tonecurve_ops(ops); @@ -742,14 +811,14 @@ void RegisterAll(BuiltinTransformRegistryImpl & registry) noexcept AP1_to_CIE_XYZ_D65::GenerateOps(ops); }; - registry.addBuiltin("ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-CINEMA_1.0", - "Component of ACES Output Transforms for SDR cinema", - ACES2065_1_to_CIE_XYZ_cinema_1_0_Functor); + registry.addBuiltin( + "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-CINEMA_1.0", + "Component of ACES Output Transforms for SDR cinema", + ACES2065_1_to_CIE_XYZ_cinema_1_0_Functor); } { - auto ACES2065_1_to_CIE_XYZ_video_1_0_Functor = [](OpRcPtrVec & ops) - { + auto ACES2065_1_to_CIE_XYZ_video_1_0_Functor = [](OpRcPtrVec & ops) { ACES_OUTPUT::Generate_RRT_preamble_ops(ops); ACES_OUTPUT::Generate_tonecurve_ops(ops); @@ -759,14 +828,14 @@ void RegisterAll(BuiltinTransformRegistryImpl & registry) noexcept AP1_to_CIE_XYZ_D65::GenerateOps(ops); }; - registry.addBuiltin("ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-VIDEO_1.0", - "Component of ACES Output Transforms for SDR D65 video", - ACES2065_1_to_CIE_XYZ_video_1_0_Functor); + registry.addBuiltin( + "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-VIDEO_1.0", + "Component of ACES Output Transforms for SDR D65 video", + ACES2065_1_to_CIE_XYZ_video_1_0_Functor); } { - auto ACES2065_1_to_CIE_XYZ_cinema_rec709lim_1_1_Functor = [](OpRcPtrVec & ops) - { + auto ACES2065_1_to_CIE_XYZ_cinema_rec709lim_1_1_Functor = [](OpRcPtrVec & ops) { ACES_OUTPUT::Generate_RRT_preamble_ops(ops); ACES_OUTPUT::Generate_tonecurve_ops(ops); @@ -774,14 +843,14 @@ void RegisterAll(BuiltinTransformRegistryImpl & registry) noexcept ACES_OUTPUT::Generate_sdr_primary_clamp_ops(ops, REC709::primaries); }; - registry.addBuiltin("ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-CINEMA-REC709lim_1.1", - "Component of ACES Output Transforms for SDR cinema", - ACES2065_1_to_CIE_XYZ_cinema_rec709lim_1_1_Functor); + registry.addBuiltin( + "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-CINEMA-REC709lim_1.1", + "Component of ACES Output Transforms for SDR cinema", + ACES2065_1_to_CIE_XYZ_cinema_rec709lim_1_1_Functor); } { - auto ACES2065_1_to_CIE_XYZ_video_rec709lim_1_1_Functor = [](OpRcPtrVec & ops) - { + auto ACES2065_1_to_CIE_XYZ_video_rec709lim_1_1_Functor = [](OpRcPtrVec & ops) { ACES_OUTPUT::Generate_RRT_preamble_ops(ops); ACES_OUTPUT::Generate_tonecurve_ops(ops); @@ -791,14 +860,14 @@ void RegisterAll(BuiltinTransformRegistryImpl & registry) noexcept ACES_OUTPUT::Generate_sdr_primary_clamp_ops(ops, REC709::primaries); }; - registry.addBuiltin("ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-VIDEO-REC709lim_1.1", - "Component of ACES Output Transforms for SDR D65 video", - ACES2065_1_to_CIE_XYZ_video_rec709lim_1_1_Functor); + registry.addBuiltin( + "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-VIDEO-REC709lim_1.1", + "Component of ACES Output Transforms for SDR D65 video", + ACES2065_1_to_CIE_XYZ_video_rec709lim_1_1_Functor); } { - auto ACES2065_1_to_CIE_XYZ_video_p3lim_1_1_Functor = [](OpRcPtrVec & ops) - { + auto ACES2065_1_to_CIE_XYZ_video_p3lim_1_1_Functor = [](OpRcPtrVec & ops) { ACES_OUTPUT::Generate_RRT_preamble_ops(ops); ACES_OUTPUT::Generate_tonecurve_ops(ops); @@ -808,147 +877,161 @@ void RegisterAll(BuiltinTransformRegistryImpl & registry) noexcept ACES_OUTPUT::Generate_sdr_primary_clamp_ops(ops, P3_D65::primaries); }; - registry.addBuiltin("ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-VIDEO-P3lim_1.1", - "Component of ACES Output Transforms for SDR D65 video", - ACES2065_1_to_CIE_XYZ_video_p3lim_1_1_Functor); + registry.addBuiltin( + "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-VIDEO-P3lim_1.1", + "Component of ACES Output Transforms for SDR D65 video", + ACES2065_1_to_CIE_XYZ_video_p3lim_1_1_Functor); } { - auto ACES2065_1_to_CIE_XYZ_cinema_d60sim_1_1_Functor = [](OpRcPtrVec & ops) - { + auto ACES2065_1_to_CIE_XYZ_cinema_d60sim_1_1_Functor = [](OpRcPtrVec & ops) { ACES_OUTPUT::Generate_RRT_preamble_ops(ops); ACES_OUTPUT::Generate_tonecurve_ops(ops); - CreateRangeOp(ops, - RangeOpData::EmptyValue(), 1.0, // don't clamp low end - RangeOpData::EmptyValue(), 1.0, // don't clamp low end - TRANSFORM_DIR_FORWARD); + CreateRangeOp( + ops, + RangeOpData::EmptyValue(), + 1.0, // don't clamp low end + RangeOpData::EmptyValue(), + 1.0, // don't clamp low end + TRANSFORM_DIR_FORWARD); static constexpr double scale = 0.964; - static constexpr double scale4[4] = { scale, scale, scale, 1. }; + static constexpr double scale4[4] = {scale, scale, scale, 1.}; CreateScaleOp(ops, scale4, TRANSFORM_DIR_FORWARD); - MatrixOpData::MatrixArrayPtr matrix - = rgb2xyz_from_xy(ACES_AP1::primaries); + MatrixOpData::MatrixArrayPtr matrix = rgb2xyz_from_xy(ACES_AP1::primaries); CreateMatrixOp(ops, matrix, TRANSFORM_DIR_FORWARD); }; - registry.addBuiltin("ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-CINEMA-D60sim-D65_1.1", - "Component of ACES Output Transforms for SDR D65 cinema simulating D60 white", - ACES2065_1_to_CIE_XYZ_cinema_d60sim_1_1_Functor); + registry.addBuiltin( + "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-CINEMA-D60sim-D65_1.1", + "Component of ACES Output Transforms for SDR D65 cinema simulating D60 white", + ACES2065_1_to_CIE_XYZ_cinema_d60sim_1_1_Functor); } { - auto ACES2065_1_to_CIE_XYZ_video_d60sim_1_0_Functor = [](OpRcPtrVec & ops) - { + auto ACES2065_1_to_CIE_XYZ_video_d60sim_1_0_Functor = [](OpRcPtrVec & ops) { ACES_OUTPUT::Generate_RRT_preamble_ops(ops); ACES_OUTPUT::Generate_tonecurve_ops(ops); - CreateRangeOp(ops, - RangeOpData::EmptyValue(), 1.0, // don't clamp low end - RangeOpData::EmptyValue(), 1.0, // don't clamp low end - TRANSFORM_DIR_FORWARD); + CreateRangeOp( + ops, + RangeOpData::EmptyValue(), + 1.0, // don't clamp low end + RangeOpData::EmptyValue(), + 1.0, // don't clamp low end + TRANSFORM_DIR_FORWARD); static constexpr double scale = 0.955; - static constexpr double scale4[4] = { scale, scale, scale, 1. }; + static constexpr double scale4[4] = {scale, scale, scale, 1.}; CreateScaleOp(ops, scale4, TRANSFORM_DIR_FORWARD); ACES_OUTPUT::Generate_video_adjustment_ops(ops); - MatrixOpData::MatrixArrayPtr matrix - = rgb2xyz_from_xy(ACES_AP1::primaries); + MatrixOpData::MatrixArrayPtr matrix = rgb2xyz_from_xy(ACES_AP1::primaries); CreateMatrixOp(ops, matrix, TRANSFORM_DIR_FORWARD); }; - registry.addBuiltin("ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-VIDEO-D60sim-D65_1.0", - "Component of ACES Output Transforms for SDR D65 video simulating D60 white", - ACES2065_1_to_CIE_XYZ_video_d60sim_1_0_Functor); + registry.addBuiltin( + "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-VIDEO-D60sim-D65_1.0", + "Component of ACES Output Transforms for SDR D65 video simulating D60 white", + ACES2065_1_to_CIE_XYZ_video_d60sim_1_0_Functor); } { - auto ACES2065_1_to_CIE_XYZ_cinema_d60sim_dci_1_0_Functor = [](OpRcPtrVec & ops) - { + auto ACES2065_1_to_CIE_XYZ_cinema_d60sim_dci_1_0_Functor = [](OpRcPtrVec & ops) { ACES_OUTPUT::Generate_RRT_preamble_ops(ops); ACES_OUTPUT::Generate_tonecurve_ops(ops); ACES_OUTPUT::Generate_roll_white_d60_ops(ops); - CreateRangeOp(ops, - RangeOpData::EmptyValue(), 0.918, // don't clamp low end - RangeOpData::EmptyValue(), 0.918, // don't clamp low end - TRANSFORM_DIR_FORWARD); + CreateRangeOp( + ops, + RangeOpData::EmptyValue(), + 0.918, // don't clamp low end + RangeOpData::EmptyValue(), + 0.918, // don't clamp low end + TRANSFORM_DIR_FORWARD); static constexpr double scale = 0.96; - static constexpr double scale4[4] = { scale, scale, scale, 1. }; + static constexpr double scale4[4] = {scale, scale, scale, 1.}; CreateScaleOp(ops, scale4, TRANSFORM_DIR_FORWARD); - MatrixOpData::MatrixArrayPtr matrix - = rgb2xyz_from_xy(ACES_AP1::primaries); + MatrixOpData::MatrixArrayPtr matrix = rgb2xyz_from_xy(ACES_AP1::primaries); CreateMatrixOp(ops, matrix, TRANSFORM_DIR_FORWARD); - MatrixOpData::MatrixArrayPtr matrix2 - = build_vonkries_adapt(WHITEPOINT::DCI_XYZ, WHITEPOINT::D65_XYZ, ADAPTATION_BRADFORD); + MatrixOpData::MatrixArrayPtr matrix2 = build_vonkries_adapt( + WHITEPOINT::DCI_XYZ, + WHITEPOINT::D65_XYZ, + ADAPTATION_BRADFORD); CreateMatrixOp(ops, matrix2, TRANSFORM_DIR_FORWARD); }; - registry.addBuiltin("ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-CINEMA-D60sim-DCI_1.0", - "Component of ACES Output Transforms for SDR DCI cinema simulating D60 white", - ACES2065_1_to_CIE_XYZ_cinema_d60sim_dci_1_0_Functor); + registry.addBuiltin( + "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-CINEMA-D60sim-DCI_1.0", + "Component of ACES Output Transforms for SDR DCI cinema simulating D60 white", + ACES2065_1_to_CIE_XYZ_cinema_d60sim_dci_1_0_Functor); } { - auto ACES2065_1_to_CIE_XYZ_cinema_d65sim_dci_1_1_Functor = [](OpRcPtrVec & ops) - { + auto ACES2065_1_to_CIE_XYZ_cinema_d65sim_dci_1_1_Functor = [](OpRcPtrVec & ops) { ACES_OUTPUT::Generate_RRT_preamble_ops(ops); ACES_OUTPUT::Generate_tonecurve_ops(ops); ACES_OUTPUT::Generate_roll_white_d65_ops(ops); - CreateRangeOp(ops, - RangeOpData::EmptyValue(), 0.908, // don't clamp low end - RangeOpData::EmptyValue(), 0.908, // don't clamp low end - TRANSFORM_DIR_FORWARD); + CreateRangeOp( + ops, + RangeOpData::EmptyValue(), + 0.908, // don't clamp low end + RangeOpData::EmptyValue(), + 0.908, // don't clamp low end + TRANSFORM_DIR_FORWARD); static constexpr double scale = 0.9575; - static constexpr double scale4[4] = { scale, scale, scale, 1. }; + static constexpr double scale4[4] = {scale, scale, scale, 1.}; CreateScaleOp(ops, scale4, TRANSFORM_DIR_FORWARD); AP1_to_CIE_XYZ_D65::GenerateOps(ops); - MatrixOpData::MatrixArrayPtr matrix2 - = build_vonkries_adapt(WHITEPOINT::DCI_XYZ, WHITEPOINT::D65_XYZ, ADAPTATION_BRADFORD); + MatrixOpData::MatrixArrayPtr matrix2 = build_vonkries_adapt( + WHITEPOINT::DCI_XYZ, + WHITEPOINT::D65_XYZ, + ADAPTATION_BRADFORD); CreateMatrixOp(ops, matrix2, TRANSFORM_DIR_FORWARD); }; - registry.addBuiltin("ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-CINEMA-D65sim-DCI_1.1", - "Component of ACES Output Transforms for SDR DCI cinema simulating D65 white", - ACES2065_1_to_CIE_XYZ_cinema_d65sim_dci_1_1_Functor); + registry.addBuiltin( + "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-CINEMA-D65sim-DCI_1.1", + "Component of ACES Output Transforms for SDR DCI cinema simulating D65 white", + ACES2065_1_to_CIE_XYZ_cinema_d65sim_dci_1_1_Functor); } { - auto ACES2065_1_to_CIE_XYZ_hdr_video_1000nits_rec2020lim_1_1_Functor = [](OpRcPtrVec & ops) - { - ACES_OUTPUT::Generate_RRT_preamble_ops(ops); + auto ACES2065_1_to_CIE_XYZ_hdr_video_1000nits_rec2020lim_1_1_Functor + = [](OpRcPtrVec & ops) { + ACES_OUTPUT::Generate_RRT_preamble_ops(ops); - ACES_OUTPUT::Generate_hdr_tonecurve_ops(ops, 1000.); + ACES_OUTPUT::Generate_hdr_tonecurve_ops(ops, 1000.); - ACES_OUTPUT::Generate_hdr_primary_clamp_ops(ops, REC2020::primaries); + ACES_OUTPUT::Generate_hdr_primary_clamp_ops(ops, REC2020::primaries); - ACES_OUTPUT::Generate_nit_normalization_ops(ops, 1000.); - }; + ACES_OUTPUT::Generate_nit_normalization_ops(ops, 1000.); + }; - registry.addBuiltin("ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-VIDEO-1000nit-15nit-REC2020lim_1.1", - "Component of ACES Output Transforms for 1000 nit HDR D65 video", - ACES2065_1_to_CIE_XYZ_hdr_video_1000nits_rec2020lim_1_1_Functor); + registry.addBuiltin( + "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-VIDEO-1000nit-15nit-REC2020lim_1.1", + "Component of ACES Output Transforms for 1000 nit HDR D65 video", + ACES2065_1_to_CIE_XYZ_hdr_video_1000nits_rec2020lim_1_1_Functor); } { - auto ACES2065_1_to_CIE_XYZ_hdr_video_1000nits_p3lim_1_1_Functor = [](OpRcPtrVec & ops) - { + auto ACES2065_1_to_CIE_XYZ_hdr_video_1000nits_p3lim_1_1_Functor = [](OpRcPtrVec & ops) { ACES_OUTPUT::Generate_RRT_preamble_ops(ops); ACES_OUTPUT::Generate_hdr_tonecurve_ops(ops, 1000.); @@ -958,31 +1041,32 @@ void RegisterAll(BuiltinTransformRegistryImpl & registry) noexcept ACES_OUTPUT::Generate_nit_normalization_ops(ops, 1000.); }; - registry.addBuiltin("ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-VIDEO-1000nit-15nit-P3lim_1.1", - "Component of ACES Output Transforms for 1000 nit HDR D65 video", - ACES2065_1_to_CIE_XYZ_hdr_video_1000nits_p3lim_1_1_Functor); + registry.addBuiltin( + "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-VIDEO-1000nit-15nit-P3lim_1.1", + "Component of ACES Output Transforms for 1000 nit HDR D65 video", + ACES2065_1_to_CIE_XYZ_hdr_video_1000nits_p3lim_1_1_Functor); } { - auto ACES2065_1_to_CIE_XYZ_hdr_video_2000nits_rec2020lim_1_1_Functor = [](OpRcPtrVec & ops) - { - ACES_OUTPUT::Generate_RRT_preamble_ops(ops); + auto ACES2065_1_to_CIE_XYZ_hdr_video_2000nits_rec2020lim_1_1_Functor + = [](OpRcPtrVec & ops) { + ACES_OUTPUT::Generate_RRT_preamble_ops(ops); - ACES_OUTPUT::Generate_hdr_tonecurve_ops(ops, 2000.); + ACES_OUTPUT::Generate_hdr_tonecurve_ops(ops, 2000.); - ACES_OUTPUT::Generate_hdr_primary_clamp_ops(ops, REC2020::primaries); + ACES_OUTPUT::Generate_hdr_primary_clamp_ops(ops, REC2020::primaries); - ACES_OUTPUT::Generate_nit_normalization_ops(ops, 2000.); - }; + ACES_OUTPUT::Generate_nit_normalization_ops(ops, 2000.); + }; - registry.addBuiltin("ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-VIDEO-2000nit-15nit-REC2020lim_1.1", - "Component of ACES Output Transforms for 2000 nit HDR D65 video", - ACES2065_1_to_CIE_XYZ_hdr_video_2000nits_rec2020lim_1_1_Functor); + registry.addBuiltin( + "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-VIDEO-2000nit-15nit-REC2020lim_1.1", + "Component of ACES Output Transforms for 2000 nit HDR D65 video", + ACES2065_1_to_CIE_XYZ_hdr_video_2000nits_rec2020lim_1_1_Functor); } { - auto ACES2065_1_to_CIE_XYZ_hdr_video_2000nits_p3lim_1_1_Functor = [](OpRcPtrVec & ops) - { + auto ACES2065_1_to_CIE_XYZ_hdr_video_2000nits_p3lim_1_1_Functor = [](OpRcPtrVec & ops) { ACES_OUTPUT::Generate_RRT_preamble_ops(ops); ACES_OUTPUT::Generate_hdr_tonecurve_ops(ops, 2000.); @@ -992,31 +1076,32 @@ void RegisterAll(BuiltinTransformRegistryImpl & registry) noexcept ACES_OUTPUT::Generate_nit_normalization_ops(ops, 2000.); }; - registry.addBuiltin("ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-VIDEO-2000nit-15nit-P3lim_1.1", - "Component of ACES Output Transforms for 2000 nit HDR D65 video", - ACES2065_1_to_CIE_XYZ_hdr_video_2000nits_p3lim_1_1_Functor); + registry.addBuiltin( + "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-VIDEO-2000nit-15nit-P3lim_1.1", + "Component of ACES Output Transforms for 2000 nit HDR D65 video", + ACES2065_1_to_CIE_XYZ_hdr_video_2000nits_p3lim_1_1_Functor); } { - auto ACES2065_1_to_CIE_XYZ_hdr_video_4000nits_rec2020lim_1_1_Functor = [](OpRcPtrVec & ops) - { - ACES_OUTPUT::Generate_RRT_preamble_ops(ops); + auto ACES2065_1_to_CIE_XYZ_hdr_video_4000nits_rec2020lim_1_1_Functor + = [](OpRcPtrVec & ops) { + ACES_OUTPUT::Generate_RRT_preamble_ops(ops); - ACES_OUTPUT::Generate_hdr_tonecurve_ops(ops, 4000.); + ACES_OUTPUT::Generate_hdr_tonecurve_ops(ops, 4000.); - ACES_OUTPUT::Generate_hdr_primary_clamp_ops(ops, REC2020::primaries); + ACES_OUTPUT::Generate_hdr_primary_clamp_ops(ops, REC2020::primaries); - ACES_OUTPUT::Generate_nit_normalization_ops(ops, 4000.); - }; + ACES_OUTPUT::Generate_nit_normalization_ops(ops, 4000.); + }; - registry.addBuiltin("ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-VIDEO-4000nit-15nit-REC2020lim_1.1", - "Component of ACES Output Transforms for 4000 nit HDR D65 video", - ACES2065_1_to_CIE_XYZ_hdr_video_4000nits_rec2020lim_1_1_Functor); + registry.addBuiltin( + "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-VIDEO-4000nit-15nit-REC2020lim_1.1", + "Component of ACES Output Transforms for 4000 nit HDR D65 video", + ACES2065_1_to_CIE_XYZ_hdr_video_4000nits_rec2020lim_1_1_Functor); } { - auto ACES2065_1_to_CIE_XYZ_hdr_video_4000nits_p3lim_1_1_Functor = [](OpRcPtrVec & ops) - { + auto ACES2065_1_to_CIE_XYZ_hdr_video_4000nits_p3lim_1_1_Functor = [](OpRcPtrVec & ops) { ACES_OUTPUT::Generate_RRT_preamble_ops(ops); ACES_OUTPUT::Generate_hdr_tonecurve_ops(ops, 4000.); @@ -1026,14 +1111,14 @@ void RegisterAll(BuiltinTransformRegistryImpl & registry) noexcept ACES_OUTPUT::Generate_nit_normalization_ops(ops, 4000.); }; - registry.addBuiltin("ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-VIDEO-4000nit-15nit-P3lim_1.1", - "Component of ACES Output Transforms for 4000 nit HDR D65 video", - ACES2065_1_to_CIE_XYZ_hdr_video_4000nits_p3lim_1_1_Functor); + registry.addBuiltin( + "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-VIDEO-4000nit-15nit-P3lim_1.1", + "Component of ACES Output Transforms for 4000 nit HDR D65 video", + ACES2065_1_to_CIE_XYZ_hdr_video_4000nits_p3lim_1_1_Functor); } { - auto ACES2065_1_to_CIE_XYZ_hdr_cinema_108nits_p3lim_1_1_Functor = [](OpRcPtrVec & ops) - { + auto ACES2065_1_to_CIE_XYZ_hdr_cinema_108nits_p3lim_1_1_Functor = [](OpRcPtrVec & ops) { ACES_OUTPUT::Generate_RRT_preamble_ops(ops); ACES_OUTPUT::Generate_hdr_tonecurve_ops(ops, 108.); @@ -1043,9 +1128,10 @@ void RegisterAll(BuiltinTransformRegistryImpl & registry) noexcept ACES_OUTPUT::Generate_nit_normalization_ops(ops, 108.); }; - registry.addBuiltin("ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-CINEMA-108nit-7.2nit-P3lim_1.1", - "Component of ACES Output Transforms for 108 nit HDR D65 cinema", - ACES2065_1_to_CIE_XYZ_hdr_cinema_108nits_p3lim_1_1_Functor); + registry.addBuiltin( + "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-CINEMA-108nit-7.2nit-P3lim_1.1", + "Component of ACES Output Transforms for 108 nit HDR D65 cinema", + ACES2065_1_to_CIE_XYZ_hdr_cinema_108nits_p3lim_1_1_Functor); } } diff --git a/src/OpenColorIO/transforms/builtins/ACES.h b/src/OpenColorIO/transforms/builtins/ACES.h index 92e1bac529..5e38bad5f0 100644 --- a/src/OpenColorIO/transforms/builtins/ACES.h +++ b/src/OpenColorIO/transforms/builtins/ACES.h @@ -1,16 +1,13 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_ACES_H #define INCLUDED_OCIO_ACES_H - #include #include "transforms/builtins/ColorMatrixHelpers.h" - namespace OCIO_NAMESPACE { diff --git a/src/OpenColorIO/transforms/builtins/AppleCameras.cpp b/src/OpenColorIO/transforms/builtins/AppleCameras.cpp index 9f5f946114..832bd31688 100644 --- a/src/OpenColorIO/transforms/builtins/AppleCameras.cpp +++ b/src/OpenColorIO/transforms/builtins/AppleCameras.cpp @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #include #include @@ -12,7 +11,6 @@ #include "transforms/builtins/ColorMatrixHelpers.h" #include "transforms/builtins/OpHelpers.h" - namespace OCIO_NAMESPACE { @@ -21,8 +19,7 @@ namespace APPLE_LOG void GenerateAppleLogToLinearOps(OpRcPtrVec & ops) { - auto GenerateLutValues = [](double in) -> float - { + auto GenerateLutValues = [](double in) -> float { constexpr double R_0 = -0.05641088; constexpr double R_t = 0.01; constexpr double c = 47.28711236; @@ -30,7 +27,7 @@ void GenerateAppleLogToLinearOps(OpRcPtrVec & ops) constexpr double gamma = 0.08550479; constexpr double delta = 0.69336945; const double P_t = c * std::pow((R_t - R_0), 2.0); - + if (in >= P_t) { return float(std::pow(2.0, (in - delta) / gamma) - beta); @@ -46,7 +43,6 @@ void GenerateAppleLogToLinearOps(OpRcPtrVec & ops) }; CreateHalfLut(ops, GenerateLutValues); - } } // namespace APPLE_LOG @@ -60,28 +56,29 @@ namespace APPLE void RegisterAll(BuiltinTransformRegistryImpl & registry) noexcept { { - auto APPLE_LOG_to_ACES2065_1_Functor = [](OpRcPtrVec & ops) - { + auto APPLE_LOG_to_ACES2065_1_Functor = [](OpRcPtrVec & ops) { APPLE_LOG::GenerateAppleLogToLinearOps(ops); - - MatrixOpData::MatrixArrayPtr matrix - = build_conversion_matrix(REC2020::primaries, ACES_AP0::primaries, ADAPTATION_BRADFORD); + + MatrixOpData::MatrixArrayPtr matrix = build_conversion_matrix( + REC2020::primaries, + ACES_AP0::primaries, + ADAPTATION_BRADFORD); CreateMatrixOp(ops, matrix, TRANSFORM_DIR_FORWARD); }; - - registry.addBuiltin("APPLE_LOG_to_ACES2065-1", - "Convert Apple Log to ACES2065-1", - APPLE_LOG_to_ACES2065_1_Functor); + + registry.addBuiltin( + "APPLE_LOG_to_ACES2065-1", + "Convert Apple Log to ACES2065-1", + APPLE_LOG_to_ACES2065_1_Functor); } { - auto APPLE_LOG_to_Linear_Functor = [](OpRcPtrVec & ops) - { - APPLE_LOG::GenerateAppleLogToLinearOps(ops); - }; - - registry.addBuiltin("CURVE - APPLE_LOG_to_LINEAR", - "Convert Apple Log to linear", - APPLE_LOG_to_Linear_Functor); + auto APPLE_LOG_to_Linear_Functor + = [](OpRcPtrVec & ops) { APPLE_LOG::GenerateAppleLogToLinearOps(ops); }; + + registry.addBuiltin( + "CURVE - APPLE_LOG_to_LINEAR", + "Convert Apple Log to linear", + APPLE_LOG_to_Linear_Functor); } } diff --git a/src/OpenColorIO/transforms/builtins/AppleCameras.h b/src/OpenColorIO/transforms/builtins/AppleCameras.h index 52f6a9d579..c1ec72c0fe 100644 --- a/src/OpenColorIO/transforms/builtins/AppleCameras.h +++ b/src/OpenColorIO/transforms/builtins/AppleCameras.h @@ -1,14 +1,11 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_APPLE_CAMERAS_H #define INCLUDED_OCIO_APPLE_CAMERAS_H - #include - namespace OCIO_NAMESPACE { diff --git a/src/OpenColorIO/transforms/builtins/ArriCameras.cpp b/src/OpenColorIO/transforms/builtins/ArriCameras.cpp index 8260beffc7..499a177de3 100644 --- a/src/OpenColorIO/transforms/builtins/ArriCameras.cpp +++ b/src/OpenColorIO/transforms/builtins/ArriCameras.cpp @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #include #include "ops/log/LogOp.h" @@ -11,29 +10,28 @@ #include "transforms/builtins/BuiltinTransformRegistry.h" #include "transforms/builtins/ColorMatrixHelpers.h" - namespace OCIO_NAMESPACE { namespace ARRI_ALEXA_WIDE_GAMUT { -static const Chromaticities red_xy(0.68400, 0.31300); -static const Chromaticities grn_xy(0.22100, 0.84800); +static const Chromaticities red_xy(0.68400, 0.31300); +static const Chromaticities grn_xy(0.22100, 0.84800); static const Chromaticities blu_xy(0.08610, -0.10200); -static const Chromaticities wht_xy(0.31270, 0.32900); +static const Chromaticities wht_xy(0.31270, 0.32900); const Primaries primaries(red_xy, grn_xy, blu_xy, wht_xy); -} +} // namespace ARRI_ALEXA_WIDE_GAMUT namespace ARRI_WIDE_GAMUT_4 { -static const Chromaticities red_xy(0.73470, 0.26530); -static const Chromaticities grn_xy(0.14240, 0.85760); +static const Chromaticities red_xy(0.73470, 0.26530); +static const Chromaticities grn_xy(0.14240, 0.85760); static const Chromaticities blu_xy(0.09910, -0.03080); -static const Chromaticities wht_xy(0.31270, 0.32900); +static const Chromaticities wht_xy(0.31270, 0.32900); const Primaries primaries(red_xy, grn_xy, blu_xy, wht_xy); -} +} // namespace ARRI_WIDE_GAMUT_4 namespace ARRI_ALEXA_LOGC_EI800_to_LINEAR { @@ -44,27 +42,26 @@ static constexpr double logSideOffset = 0.3855369987; static constexpr double linSideBreak = ((1. / 9.) - linSideOffset) / linSideSlope; static constexpr double base = 10.; -static const LogOpData::Params - params { logSideSlope, logSideOffset, linSideSlope, linSideOffset, linSideBreak }; +static const LogOpData::Params + params{logSideSlope, logSideOffset, linSideSlope, linSideOffset, linSideBreak}; static const LogOpData log(base, params, params, params, TRANSFORM_DIR_INVERSE); -} +} // namespace ARRI_ALEXA_LOGC_EI800_to_LINEAR namespace ARRI_LOGC4_to_LINEAR { -static constexpr double linSideSlope = 2231.82630906769; -static constexpr double linSideOffset = 64.0; -static constexpr double logSideSlope = 0.0647954196341293; +static constexpr double linSideSlope = 2231.82630906769; +static constexpr double linSideOffset = 64.0; +static constexpr double logSideSlope = 0.0647954196341293; static constexpr double logSideOffset = -0.295908392682586; static constexpr double linSideBreak = -0.0180569961199113; -static constexpr double base = 2.; +static constexpr double base = 2.; -static const LogOpData::Params - params { logSideSlope, logSideOffset, linSideSlope, linSideOffset, linSideBreak }; +static const LogOpData::Params + params{logSideSlope, logSideOffset, linSideSlope, linSideOffset, linSideBreak}; static const LogOpData log(base, params, params, params, TRANSFORM_DIR_INVERSE); -} - +} // namespace ARRI_LOGC4_to_LINEAR namespace CAMERA { @@ -75,35 +72,39 @@ namespace ARRI void RegisterAll(BuiltinTransformRegistryImpl & registry) noexcept { { - auto ARRI_ALEXA_LOGC_EI800_AWG_to_ACES2065_1_Functor = [](OpRcPtrVec & ops) - { + auto ARRI_ALEXA_LOGC_EI800_AWG_to_ACES2065_1_Functor = [](OpRcPtrVec & ops) { LogOpDataRcPtr log = ARRI_ALEXA_LOGC_EI800_to_LINEAR::log.clone(); CreateLogOp(ops, log, TRANSFORM_DIR_FORWARD); - MatrixOpData::MatrixArrayPtr matrix - = build_conversion_matrix(ARRI_ALEXA_WIDE_GAMUT::primaries, ACES_AP0::primaries, ADAPTATION_CAT02); + MatrixOpData::MatrixArrayPtr matrix = build_conversion_matrix( + ARRI_ALEXA_WIDE_GAMUT::primaries, + ACES_AP0::primaries, + ADAPTATION_CAT02); CreateMatrixOp(ops, matrix, TRANSFORM_DIR_FORWARD); }; - registry.addBuiltin("ARRI_ALEXA-LOGC-EI800-AWG_to_ACES2065-1", - "Convert ARRI ALEXA LogC (EI800) ALEXA Wide Gamut to ACES2065-1", - ARRI_ALEXA_LOGC_EI800_AWG_to_ACES2065_1_Functor); + registry.addBuiltin( + "ARRI_ALEXA-LOGC-EI800-AWG_to_ACES2065-1", + "Convert ARRI ALEXA LogC (EI800) ALEXA Wide Gamut to ACES2065-1", + ARRI_ALEXA_LOGC_EI800_AWG_to_ACES2065_1_Functor); } { - auto ARRI_LOGC4_AWG4_to_ACES2065_1_Functor = [](OpRcPtrVec & ops) - { + auto ARRI_LOGC4_AWG4_to_ACES2065_1_Functor = [](OpRcPtrVec & ops) { LogOpDataRcPtr log = ARRI_LOGC4_to_LINEAR::log.clone(); CreateLogOp(ops, log, TRANSFORM_DIR_FORWARD); - MatrixOpData::MatrixArrayPtr matrix - = build_conversion_matrix(ARRI_WIDE_GAMUT_4::primaries, ACES_AP0::primaries, ADAPTATION_CAT02); + MatrixOpData::MatrixArrayPtr matrix = build_conversion_matrix( + ARRI_WIDE_GAMUT_4::primaries, + ACES_AP0::primaries, + ADAPTATION_CAT02); CreateMatrixOp(ops, matrix, TRANSFORM_DIR_FORWARD); }; - registry.addBuiltin("ARRI_LOGC4_to_ACES2065-1", - "Convert ARRI LogC4 to ACES2065-1", - ARRI_LOGC4_AWG4_to_ACES2065_1_Functor); + registry.addBuiltin( + "ARRI_LOGC4_to_ACES2065-1", + "Convert ARRI LogC4 to ACES2065-1", + ARRI_LOGC4_AWG4_to_ACES2065_1_Functor); } } diff --git a/src/OpenColorIO/transforms/builtins/ArriCameras.h b/src/OpenColorIO/transforms/builtins/ArriCameras.h index 8924c82edb..02cb5a1523 100644 --- a/src/OpenColorIO/transforms/builtins/ArriCameras.h +++ b/src/OpenColorIO/transforms/builtins/ArriCameras.h @@ -1,14 +1,11 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_ARRI_CAMERAS_H #define INCLUDED_OCIO_ARRI_CAMERAS_H - #include - namespace OCIO_NAMESPACE { diff --git a/src/OpenColorIO/transforms/builtins/BuiltinTransformRegistry.cpp b/src/OpenColorIO/transforms/builtins/BuiltinTransformRegistry.cpp index d828f11ace..b96a7a17cb 100644 --- a/src/OpenColorIO/transforms/builtins/BuiltinTransformRegistry.cpp +++ b/src/OpenColorIO/transforms/builtins/BuiltinTransformRegistry.cpp @@ -1,15 +1,14 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #include #include #include "Mutex.h" -#include "ops/matrix/MatrixOp.h" #include "OpBuilders.h" #include "Platform.h" +#include "ops/matrix/MatrixOp.h" #include "transforms/builtins/ACES.h" #include "transforms/builtins/AppleCameras.h" #include "transforms/builtins/ArriCameras.h" @@ -21,7 +20,6 @@ #include "transforms/builtins/SonyCameras.h" #include "utils/StringUtils.h" - namespace OCIO_NAMESPACE { @@ -31,7 +29,7 @@ namespace static BuiltinTransformRegistryRcPtr globalRegistry; static Mutex globalRegistryMutex; -} // anon. +} // namespace ConstBuiltinTransformRegistryRcPtr BuiltinTransformRegistry::Get() noexcept { @@ -46,13 +44,16 @@ ConstBuiltinTransformRegistryRcPtr BuiltinTransformRegistry::Get() noexcept return globalRegistry; } -void BuiltinTransformRegistryImpl::addBuiltin(const char * style, const char * description, OpCreator creator) +void BuiltinTransformRegistryImpl::addBuiltin( + const char * style, + const char * description, + OpCreator creator) { - BuiltinData data{ style, description ? description : "", creator }; + BuiltinData data{style, description ? description : "", creator}; for (auto & builtin : m_builtins) { - if (0==Platform::Strcasecmp(data.m_style.c_str(), builtin.m_style.c_str())) + if (0 == Platform::Strcasecmp(data.m_style.c_str(), builtin.m_style.c_str())) { builtin = data; return; @@ -93,7 +94,7 @@ void BuiltinTransformRegistryImpl::createOps(size_t index, OpRcPtrVec & ops) con { throw Exception("Invalid index."); } - + m_builtins[index].m_creator(ops); } @@ -101,10 +102,8 @@ void BuiltinTransformRegistryImpl::registerAll() noexcept { m_builtins.clear(); - m_builtins.push_back({"IDENTITY", "", [](OpRcPtrVec & ops) -> void - { - CreateIdentityMatrixOp(ops); - } } ); + m_builtins.push_back( + {"IDENTITY", "", [](OpRcPtrVec & ops) -> void { CreateIdentityMatrixOp(ops); }}); // ACES support. ACES::RegisterAll(*this); @@ -121,7 +120,6 @@ void BuiltinTransformRegistryImpl::registerAll() noexcept DISPLAY::RegisterAll(*this); } - void CreateBuiltinTransformOps(OpRcPtrVec & ops, size_t nameIndex, TransformDirection direction) { if (nameIndex > BuiltinTransformRegistry::Get()->getNumBuiltins()) @@ -134,22 +132,21 @@ void CreateBuiltinTransformOps(OpRcPtrVec & ops, size_t nameIndex, TransformDire switch (direction) { - case TRANSFORM_DIR_FORWARD: - { - registry->createOps(nameIndex, ops); - break; - } - case TRANSFORM_DIR_INVERSE: - { - OpRcPtrVec tmp; - registry->createOps(nameIndex, tmp); + case TRANSFORM_DIR_FORWARD: + { + registry->createOps(nameIndex, ops); + break; + } + case TRANSFORM_DIR_INVERSE: + { + OpRcPtrVec tmp; + registry->createOps(nameIndex, tmp); - OpRcPtrVec t = tmp.invert(); - ops.insert(ops.end(), t.begin(), t.end()); - break; - } + OpRcPtrVec t = tmp.invert(); + ops.insert(ops.end(), t.begin(), t.end()); + break; + } } } - } // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/transforms/builtins/BuiltinTransformRegistry.h b/src/OpenColorIO/transforms/builtins/BuiltinTransformRegistry.h index 36df917201..36cea068fd 100644 --- a/src/OpenColorIO/transforms/builtins/BuiltinTransformRegistry.h +++ b/src/OpenColorIO/transforms/builtins/BuiltinTransformRegistry.h @@ -1,18 +1,15 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_BUILTIN_TRANSFORM_REGISTRY_H #define INCLUDED_OCIO_BUILTIN_TRANSFORM_REGISTRY_H - #include #include #include "Op.h" - namespace OCIO_NAMESPACE { @@ -28,7 +25,7 @@ class BuiltinTransformRegistryImpl : public BuiltinTransformRegistry , m_creator(creator) { } - BuiltinData() = delete; + BuiltinData() = delete; BuiltinData(const BuiltinData & o) = default; BuiltinData(BuiltinData && o) noexcept : m_style(std::move(o.m_style)) @@ -36,24 +33,24 @@ class BuiltinTransformRegistryImpl : public BuiltinTransformRegistry , m_creator(std::move(o.m_creator)) { } - BuiltinData & operator= (const BuiltinData & o) + BuiltinData & operator=(const BuiltinData & o) { - m_style = o.m_style; + m_style = o.m_style; m_description = o.m_description; - m_creator = o.m_creator; + m_creator = o.m_creator; return *this; } std::string m_style; // The built-in transform style. std::string m_description; // The optional built-in transform description. - OpCreator m_creator; // Functor to create the op(s). + OpCreator m_creator; // Functor to create the op(s). }; using Builtins = std::vector; public: - BuiltinTransformRegistryImpl() = default; - BuiltinTransformRegistryImpl(const BuiltinTransformRegistryImpl &) = delete; + BuiltinTransformRegistryImpl() = default; + BuiltinTransformRegistryImpl(const BuiltinTransformRegistryImpl &) = delete; BuiltinTransformRegistryImpl & operator=(const BuiltinTransformRegistryImpl &) = delete; - ~BuiltinTransformRegistryImpl() = default; + ~BuiltinTransformRegistryImpl() = default; size_t getNumBuiltins() const noexcept override; const char * getBuiltinStyle(size_t index) const override; @@ -71,7 +68,6 @@ class BuiltinTransformRegistryImpl : public BuiltinTransformRegistry void CreateBuiltinTransformOps(OpRcPtrVec & ops, size_t nameIndex, TransformDirection direction); - } // namespace OCIO_NAMESPACE #endif // INCLUDED_OCIO_BUILTIN_TRANSFORM_REGISTRY_H diff --git a/src/OpenColorIO/transforms/builtins/CanonCameras.cpp b/src/OpenColorIO/transforms/builtins/CanonCameras.cpp index b6956d095a..f88bfde883 100644 --- a/src/OpenColorIO/transforms/builtins/CanonCameras.cpp +++ b/src/OpenColorIO/transforms/builtins/CanonCameras.cpp @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #include #include @@ -13,24 +12,22 @@ #include "transforms/builtins/ColorMatrixHelpers.h" #include "transforms/builtins/OpHelpers.h" - namespace OCIO_NAMESPACE { namespace CANON_CGAMUT { -static const Chromaticities red_xy(0.7400, 0.2700); -static const Chromaticities grn_xy(0.1700, 1.1400); +static const Chromaticities red_xy(0.7400, 0.2700); +static const Chromaticities grn_xy(0.1700, 1.1400); static const Chromaticities blu_xy(0.0800, -0.1000); -static const Chromaticities wht_xy(0.3127, 0.3290); +static const Chromaticities wht_xy(0.3127, 0.3290); const Primaries primaries(red_xy, grn_xy, blu_xy, wht_xy); -} +} // namespace CANON_CGAMUT namespace CANON_CLOG2 { -auto GenerateLutValues = [](double in) -> float -{ +auto GenerateLutValues = [](double in) -> float { double out = 0.; if (in < 0.092864125) @@ -44,12 +41,11 @@ auto GenerateLutValues = [](double in) -> float return float(out * 0.9); }; -} +} // namespace CANON_CLOG2 namespace CANON_CLOG3 { -auto GenerateLutValues = [](double in) -> float -{ +auto GenerateLutValues = [](double in) -> float { double out = 0.; if (in < 0.097465473) @@ -67,8 +63,7 @@ auto GenerateLutValues = [](double in) -> float return float(out * 0.9); }; -} - +} // namespace CANON_CLOG3 namespace CAMERA { @@ -79,53 +74,55 @@ namespace CANON void RegisterAll(BuiltinTransformRegistryImpl & registry) noexcept { { - auto CANON_CLOG2_CGAMUT_to_ACES2065_1_Functor = [](OpRcPtrVec & ops) - { + auto CANON_CLOG2_CGAMUT_to_ACES2065_1_Functor = [](OpRcPtrVec & ops) { CreateLut(ops, 4096, CANON_CLOG2::GenerateLutValues); - MatrixOpData::MatrixArrayPtr matrix - = build_conversion_matrix(CANON_CGAMUT::primaries, ACES_AP0::primaries, ADAPTATION_CAT02); + MatrixOpData::MatrixArrayPtr matrix = build_conversion_matrix( + CANON_CGAMUT::primaries, + ACES_AP0::primaries, + ADAPTATION_CAT02); CreateMatrixOp(ops, matrix, TRANSFORM_DIR_FORWARD); }; - registry.addBuiltin("CANON_CLOG2-CGAMUT_to_ACES2065-1", - "Convert Canon Log 2 Cinema Gamut to ACES2065-1", - CANON_CLOG2_CGAMUT_to_ACES2065_1_Functor); + registry.addBuiltin( + "CANON_CLOG2-CGAMUT_to_ACES2065-1", + "Convert Canon Log 2 Cinema Gamut to ACES2065-1", + CANON_CLOG2_CGAMUT_to_ACES2065_1_Functor); } { - auto CANON_CLOG2_to_Linear_Functor = [](OpRcPtrVec & ops) - { - CreateLut(ops, 4096, CANON_CLOG2::GenerateLutValues); - }; + auto CANON_CLOG2_to_Linear_Functor + = [](OpRcPtrVec & ops) { CreateLut(ops, 4096, CANON_CLOG2::GenerateLutValues); }; - registry.addBuiltin("CURVE - CANON_CLOG2_to_LINEAR", - "Convert Canon Log 2 to linear", - CANON_CLOG2_to_Linear_Functor); + registry.addBuiltin( + "CURVE - CANON_CLOG2_to_LINEAR", + "Convert Canon Log 2 to linear", + CANON_CLOG2_to_Linear_Functor); } { - auto CANON_CLOG3_CGAMUT_to_ACES2065_1_Functor = [](OpRcPtrVec & ops) - { + auto CANON_CLOG3_CGAMUT_to_ACES2065_1_Functor = [](OpRcPtrVec & ops) { CreateLut(ops, 4096, CANON_CLOG3::GenerateLutValues); - MatrixOpData::MatrixArrayPtr matrix - = build_conversion_matrix(CANON_CGAMUT::primaries, ACES_AP0::primaries, ADAPTATION_CAT02); + MatrixOpData::MatrixArrayPtr matrix = build_conversion_matrix( + CANON_CGAMUT::primaries, + ACES_AP0::primaries, + ADAPTATION_CAT02); CreateMatrixOp(ops, matrix, TRANSFORM_DIR_FORWARD); }; - registry.addBuiltin("CANON_CLOG3-CGAMUT_to_ACES2065-1", - "Convert Canon Log 3 Cinema Gamut to ACES2065-1", - CANON_CLOG3_CGAMUT_to_ACES2065_1_Functor); + registry.addBuiltin( + "CANON_CLOG3-CGAMUT_to_ACES2065-1", + "Convert Canon Log 3 Cinema Gamut to ACES2065-1", + CANON_CLOG3_CGAMUT_to_ACES2065_1_Functor); } { - auto CANON_CLOG3_to_Linear_Functor = [](OpRcPtrVec & ops) - { - CreateLut(ops, 4096, CANON_CLOG3::GenerateLutValues); - }; + auto CANON_CLOG3_to_Linear_Functor + = [](OpRcPtrVec & ops) { CreateLut(ops, 4096, CANON_CLOG3::GenerateLutValues); }; - registry.addBuiltin("CURVE - CANON_CLOG3_to_LINEAR", - "Convert Canon Log 3 to linear", - CANON_CLOG3_to_Linear_Functor); + registry.addBuiltin( + "CURVE - CANON_CLOG3_to_LINEAR", + "Convert Canon Log 3 to linear", + CANON_CLOG3_to_Linear_Functor); } } diff --git a/src/OpenColorIO/transforms/builtins/CanonCameras.h b/src/OpenColorIO/transforms/builtins/CanonCameras.h index 9c5f606539..1314c583a8 100644 --- a/src/OpenColorIO/transforms/builtins/CanonCameras.h +++ b/src/OpenColorIO/transforms/builtins/CanonCameras.h @@ -1,14 +1,11 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_CANON_CAMERAS_H #define INCLUDED_OCIO_CANON_CAMERAS_H - #include - namespace OCIO_NAMESPACE { diff --git a/src/OpenColorIO/transforms/builtins/ColorMatrixHelpers.cpp b/src/OpenColorIO/transforms/builtins/ColorMatrixHelpers.cpp index a97f3d6fdf..a51b6eac88 100644 --- a/src/OpenColorIO/transforms/builtins/ColorMatrixHelpers.cpp +++ b/src/OpenColorIO/transforms/builtins/ColorMatrixHelpers.cpp @@ -1,65 +1,63 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #include #include "transforms/builtins/ColorMatrixHelpers.h" - namespace OCIO_NAMESPACE { namespace CIE_XYZ_ILLUM_E { -static const Chromaticities red_xy(1., 0. ); -static const Chromaticities grn_xy(0., 1. ); -static const Chromaticities blu_xy(0., 0. ); -static const Chromaticities wht_xy(1./3., 1./3. ); +static const Chromaticities red_xy(1., 0.); +static const Chromaticities grn_xy(0., 1.); +static const Chromaticities blu_xy(0., 0.); +static const Chromaticities wht_xy(1. / 3., 1. / 3.); const Primaries primaries(red_xy, grn_xy, blu_xy, wht_xy); -} +} // namespace CIE_XYZ_ILLUM_E // ACES Primaries from SMPTE ST2065-1. namespace ACES_AP0 { -static const Chromaticities red_xy(0.7347, 0.2653 ); -static const Chromaticities grn_xy(0.0000, 1.0000 ); -static const Chromaticities blu_xy(0.0001, -0.0770 ); +static const Chromaticities red_xy(0.7347, 0.2653); +static const Chromaticities grn_xy(0.0000, 1.0000); +static const Chromaticities blu_xy(0.0001, -0.0770); static const Chromaticities wht_xy(0.32168, 0.33767); const Primaries primaries(red_xy, grn_xy, blu_xy, wht_xy); -} +} // namespace ACES_AP0 namespace ACES_AP1 { -static const Chromaticities red_xy(0.713, 0.293 ); -static const Chromaticities grn_xy(0.165, 0.830 ); -static const Chromaticities blu_xy(0.128, 0.044 ); +static const Chromaticities red_xy(0.713, 0.293); +static const Chromaticities grn_xy(0.165, 0.830); +static const Chromaticities blu_xy(0.128, 0.044); static const Chromaticities wht_xy(0.32168, 0.33767); const Primaries primaries(red_xy, grn_xy, blu_xy, wht_xy); -} +} // namespace ACES_AP1 namespace REC709 { -static const Chromaticities red_xy(0.64, 0.33 ); -static const Chromaticities grn_xy(0.30, 0.60 ); -static const Chromaticities blu_xy(0.15, 0.06 ); +static const Chromaticities red_xy(0.64, 0.33); +static const Chromaticities grn_xy(0.30, 0.60); +static const Chromaticities blu_xy(0.15, 0.06); static const Chromaticities wht_xy(0.3127, 0.3290); const Primaries primaries(red_xy, grn_xy, blu_xy, wht_xy); -} +} // namespace REC709 namespace REC2020 { -static const Chromaticities red_xy(0.708, 0.292 ); -static const Chromaticities grn_xy(0.170, 0.797 ); -static const Chromaticities blu_xy(0.131, 0.046 ); +static const Chromaticities red_xy(0.708, 0.292); +static const Chromaticities grn_xy(0.170, 0.797); +static const Chromaticities blu_xy(0.131, 0.046); static const Chromaticities wht_xy(0.3127, 0.3290); const Primaries primaries(red_xy, grn_xy, blu_xy, wht_xy); -} +} // namespace REC2020 namespace P3_DCI { @@ -69,133 +67,134 @@ static const Chromaticities blu_xy(0.150, 0.060); static const Chromaticities wht_xy(0.314, 0.351); const Primaries primaries(red_xy, grn_xy, blu_xy, wht_xy); -} +} // namespace P3_DCI namespace P3_D65 { -static const Chromaticities red_xy(0.680, 0.320 ); -static const Chromaticities grn_xy(0.265, 0.690 ); -static const Chromaticities blu_xy(0.150, 0.060 ); +static const Chromaticities red_xy(0.680, 0.320); +static const Chromaticities grn_xy(0.265, 0.690); +static const Chromaticities blu_xy(0.150, 0.060); static const Chromaticities wht_xy(0.3127, 0.3290); const Primaries primaries(red_xy, grn_xy, blu_xy, wht_xy); -} +} // namespace P3_D65 namespace P3_D60 { -static const Chromaticities red_xy(0.680, 0.320 ); -static const Chromaticities grn_xy(0.265, 0.690 ); -static const Chromaticities blu_xy(0.150, 0.060 ); +static const Chromaticities red_xy(0.680, 0.320); +static const Chromaticities grn_xy(0.265, 0.690); +static const Chromaticities blu_xy(0.150, 0.060); static const Chromaticities wht_xy(0.32168, 0.33767); const Primaries primaries(red_xy, grn_xy, blu_xy, wht_xy); -} +} // namespace P3_D60 namespace WHITEPOINT { const MatrixOpData::Offsets D60_XYZ(0.95264607456985, 1., 1.00882518435159, 0.); const MatrixOpData::Offsets D65_XYZ(0.95045592705167, 1., 1.08905775075988, 0.); const MatrixOpData::Offsets DCI_XYZ(0.89458689458689, 1., 0.95441595441595, 0.); -} +} // namespace WHITEPOINT // Here are some notes on how one derives the color space conversion // matrix starting with chromaticity coordinates. -// +// // We're looking for a 3x3 matrix M that converts tristimulus values to // standard CIE XYZ primaries from some other set of RGB primaries. // I.e.: -// +// // [ X Y Z ] = [ R G B ] * M // // (This note uses row * matrix rather than matrix * column notation, since // it's easier to type, but keep in mind that OCIO uses RGB as columns.) -// +// // If the red primary occurs at [ R G B] = [ 1 0 0] and similarly for // green and blue, then we have: -// -// [ rX rY rZ ] [ 1 0 0 ] +// +// [ rX rY rZ ] [ 1 0 0 ] // | gX gY gZ | = | 0 1 0 | * M = I * M -// [ bX bY bZ ] [ 0 0 1 ] -// +// [ bX bY bZ ] [ 0 0 1 ] +// // where [ rX rY rZ ] are the tristimulus values of the red primary // (likewise for green and blue) and the rows of M are simply the // measurements of the RGB primaries. The problem then is how to // find the matrix M. -// +// // We may proceed as follows: -// +// // Recall the definition of chromaticity coordinates: -// +// // x = X / ( X + Y + Z), y = Y / ( X + Y + Z), z = Z / ( X + Y + Z), -// +// // implying z = 1 - x - y, and also X = Y * x / y, and Z = Y * z / y. -// +// // For the red primary, call the chromaticity coordinates [ rx ry rz ] // and let rS = ( rX + rY + rZ) be the sum of its tristimulus values // (and likewise for green and blue). Then, by definition: -// +// // [ rX rY rZ ] [ rS 0 0 ] [ rx ry rz ] // | gX gY gZ | = | 0 gS 0 | * | gx gy gz | = I * M ( eq 1) // [ bX bY bZ ] [ 0 0 bS ] [ bx by bz ] -// +// // The left-most two matrices are unknowns. However, we can add the // constraint that the sum of the tristimulus values of the primaries // should give the tristimulus values of white, i.e.: -// +// // [ wX wY wZ ] = [ 1 1 1 ] * M ( eq 2) -// +// // We then arbitrarily choose the luminance of white based on how we // want to scale the CIE tristimulus values. E.g., to scale Y from // [0,1], we would set the luminance of white wY = 1. Then calculate // wX and wZ as: -// +// // wX = wY * wx / wy, wZ = wY * ( 1 - wx - wy) / wy. -// +// // Then, combining equations 1 and 2, we have: -// +// // [ rx ry rz ] // [ wX wY wZ ] = [ rS gS bS ] * | gx gy gz | ( eq 3) // [ bx by bz ] -// +// // where only rS, gS, and bS are unknown and may be solved for by // factoring (or inverting) the matrix on the right. Plugging these // into equation 1 gives the desired matrix M. MatrixOpData::MatrixArrayPtr rgb2xyz_from_xy(const Primaries & primaries) { - double wht_XYZ[3] { 0., 0., 0. }; - double gains[3] { 0., 0., 0. }; + double wht_XYZ[3]{0., 0., 0.}; + double gains[3]{0., 0., 0.}; // Create a 4x4 identity matrix. MatrixOpData::MatrixArrayPtr matrix = std::make_shared(); - matrix->setDoubleValue( 0, primaries.m_red.m_xy[0]); - matrix->setDoubleValue( 4, primaries.m_red.m_xy[1]); - matrix->setDoubleValue( 8, 1. - primaries.m_red.m_xy[0] - primaries.m_red.m_xy[1]); + matrix->setDoubleValue(0, primaries.m_red.m_xy[0]); + matrix->setDoubleValue(4, primaries.m_red.m_xy[1]); + matrix->setDoubleValue(8, 1. - primaries.m_red.m_xy[0] - primaries.m_red.m_xy[1]); - matrix->setDoubleValue( 1, primaries.m_grn.m_xy[0]); - matrix->setDoubleValue( 5, primaries.m_grn.m_xy[1]); - matrix->setDoubleValue( 9, 1. - primaries.m_grn.m_xy[0] - primaries.m_grn.m_xy[1]); + matrix->setDoubleValue(1, primaries.m_grn.m_xy[0]); + matrix->setDoubleValue(5, primaries.m_grn.m_xy[1]); + matrix->setDoubleValue(9, 1. - primaries.m_grn.m_xy[0] - primaries.m_grn.m_xy[1]); - matrix->setDoubleValue( 2, primaries.m_blu.m_xy[0]); - matrix->setDoubleValue( 6, primaries.m_blu.m_xy[1]); + matrix->setDoubleValue(2, primaries.m_blu.m_xy[0]); + matrix->setDoubleValue(6, primaries.m_blu.m_xy[1]); matrix->setDoubleValue(10, 1. - primaries.m_blu.m_xy[0] - primaries.m_blu.m_xy[1]); // 'matrix' is always well-conditioned, forming inverse is okay. MatrixOpData::MatrixArrayPtr invMatrix = matrix->inverse(); wht_XYZ[0] = primaries.m_wht.m_xy[0] / primaries.m_wht.m_xy[1]; - wht_XYZ[1] = 1.0; // Set scaling of XYZ values to [0, 1]. - wht_XYZ[2] = (1.0 - primaries.m_wht.m_xy[0] - primaries.m_wht.m_xy[1]) / primaries.m_wht.m_xy[1]; + wht_XYZ[1] = 1.0; // Set scaling of XYZ values to [0, 1]. + wht_XYZ[2] + = (1.0 - primaries.m_wht.m_xy[0] - primaries.m_wht.m_xy[1]) / primaries.m_wht.m_xy[1]; // Tristimulus value conversion matrix, initialized to a 4x4 identity matrix for now. MatrixOpData::MatrixArrayPtr rgb2xyz = std::make_shared(); for (unsigned i = 0; i < 3; i++) { - gains[i] = wht_XYZ[0] * invMatrix->getDoubleValue(i * 4 + 0) - + wht_XYZ[1] * invMatrix->getDoubleValue(i * 4 + 1) - + wht_XYZ[2] * invMatrix->getDoubleValue(i * 4 + 2); + gains[i] = wht_XYZ[0] * invMatrix->getDoubleValue(i * 4 + 0) + + wht_XYZ[1] * invMatrix->getDoubleValue(i * 4 + 1) + + wht_XYZ[2] * invMatrix->getDoubleValue(i * 4 + 2); for (unsigned j = 0; j < 3; j++) { @@ -206,10 +205,12 @@ MatrixOpData::MatrixArrayPtr rgb2xyz_from_xy(const Primaries & primaries) return rgb2xyz; } -MatrixOpData::MatrixArrayPtr build_vonkries_adapt(const MatrixOpData::Offsets & src_XYZ, - const MatrixOpData::Offsets & dst_XYZ, - AdaptationMethod method) +MatrixOpData::MatrixArrayPtr build_vonkries_adapt( + const MatrixOpData::Offsets & src_XYZ, + const MatrixOpData::Offsets & dst_XYZ, + AdaptationMethod method) { + // clang-format off static constexpr double CONE_RESP_MAT_BRADFORD[16]{ 0.8951, 0.2664, -0.1614, 0., -0.7502, 1.7135, 0.0367, 0., @@ -221,6 +222,7 @@ MatrixOpData::MatrixArrayPtr build_vonkries_adapt(const MatrixOpData::Offsets & -0.7036, 1.6975, 0.0061, 0., 0.0030, 0.0136, 0.9834, 0., 0., 0., 0., 1. }; + // clang-format on MatrixOpData::MatrixArrayPtr xyz2rgb = std::make_shared(); if (method == ADAPTATION_CAT02) @@ -237,15 +239,16 @@ MatrixOpData::MatrixArrayPtr build_vonkries_adapt(const MatrixOpData::Offsets & // Convert white point XYZ values to cone primary RGBs. const MatrixOpData::Offsets src_RGB(xyz2rgb->inner(src_XYZ)); const MatrixOpData::Offsets dst_RGB(xyz2rgb->inner(dst_XYZ)); - const double scaleFactor[4] { dst_RGB[0] / src_RGB[0], - dst_RGB[1] / src_RGB[1], - dst_RGB[2] / src_RGB[2], - 1. }; + const double scaleFactor[4]{ + dst_RGB[0] / src_RGB[0], + dst_RGB[1] / src_RGB[1], + dst_RGB[2] / src_RGB[2], + 1.}; // Make a diagonal matrix with the scale factors. MatrixOpData::MatrixArrayPtr scaleMat = std::make_shared(); - scaleMat->setDoubleValue( 0, scaleFactor[0]); - scaleMat->setDoubleValue( 5, scaleFactor[1]); + scaleMat->setDoubleValue(0, scaleFactor[0]); + scaleMat->setDoubleValue(5, scaleFactor[1]); scaleMat->setDoubleValue(10, scaleFactor[2]); scaleMat->setDoubleValue(15, scaleFactor[3]); @@ -253,11 +256,12 @@ MatrixOpData::MatrixArrayPtr build_vonkries_adapt(const MatrixOpData::Offsets & return rgb2xyz->inner(scaleMat->inner(xyz2rgb)); } -MatrixOpData::MatrixArrayPtr build_conversion_matrix(const Primaries & src_prims, - const Primaries & dst_prims, - const MatrixOpData::Offsets & src_wht_XYZ, - const MatrixOpData::Offsets & dst_wht_XYZ, - AdaptationMethod method) +MatrixOpData::MatrixArrayPtr build_conversion_matrix( + const Primaries & src_prims, + const Primaries & dst_prims, + const MatrixOpData::Offsets & src_wht_XYZ, + const MatrixOpData::Offsets & dst_wht_XYZ, + AdaptationMethod method) { static const MatrixOpData::Offsets ones(1., 1., 1., 0.); @@ -267,23 +271,23 @@ MatrixOpData::MatrixArrayPtr build_conversion_matrix(const Primaries & src_prims MatrixOpData::MatrixArrayPtr dst_xyz2rgb = dst_rgb2xyz->inverse(); // Return the composed matrix if no white point adaptation is needed. - if ( !src_wht_XYZ.isNotNull() && !dst_wht_XYZ.isNotNull() ) + if (!src_wht_XYZ.isNotNull() && !dst_wht_XYZ.isNotNull()) { // If the white points are equal, don't need to adapt. - if ( src_prims.m_wht.m_xy[0] == dst_prims.m_wht.m_xy[0] && - src_prims.m_wht.m_xy[1] == dst_prims.m_wht.m_xy[1] ) + if (src_prims.m_wht.m_xy[0] == dst_prims.m_wht.m_xy[0] + && src_prims.m_wht.m_xy[1] == dst_prims.m_wht.m_xy[1]) { return dst_xyz2rgb->inner(src_rgb2xyz); } } - if ( method == ADAPTATION_NONE ) + if (method == ADAPTATION_NONE) { return dst_xyz2rgb->inner(src_rgb2xyz); } // Calculate src and dst white XYZ. MatrixOpData::Offsets src_wht, dst_wht; - if ( dst_wht_XYZ.isNotNull() ) + if (dst_wht_XYZ.isNotNull()) { dst_wht = dst_wht_XYZ; } @@ -291,7 +295,7 @@ MatrixOpData::MatrixArrayPtr build_conversion_matrix(const Primaries & src_prims { dst_wht = dst_rgb2xyz->inner(ones); } - if ( src_wht_XYZ.isNotNull() ) + if (src_wht_XYZ.isNotNull()) { src_wht = src_wht_XYZ; } @@ -307,26 +311,39 @@ MatrixOpData::MatrixArrayPtr build_conversion_matrix(const Primaries & src_prims return dst_xyz2rgb->inner(vkmat->inner(src_rgb2xyz)); } -MatrixOpData::MatrixArrayPtr build_conversion_matrix(const Primaries & src_prims, - const Primaries & dst_prims, - AdaptationMethod method) +MatrixOpData::MatrixArrayPtr build_conversion_matrix( + const Primaries & src_prims, + const Primaries & dst_prims, + AdaptationMethod method) { static const MatrixOpData::Offsets zero(0., 0., 0., 0.); - return build_conversion_matrix( src_prims, dst_prims, zero, zero, method ); + return build_conversion_matrix(src_prims, dst_prims, zero, zero, method); } -MatrixOpData::MatrixArrayPtr build_conversion_matrix_to_XYZ_D65(const Primaries & src_prims, - AdaptationMethod method) +MatrixOpData::MatrixArrayPtr build_conversion_matrix_to_XYZ_D65( + const Primaries & src_prims, + AdaptationMethod method) { static const MatrixOpData::Offsets zero(0., 0., 0., 0.); - return build_conversion_matrix( src_prims, CIE_XYZ_ILLUM_E::primaries, zero, WHITEPOINT::D65_XYZ, method ); + return build_conversion_matrix( + src_prims, + CIE_XYZ_ILLUM_E::primaries, + zero, + WHITEPOINT::D65_XYZ, + method); } -MatrixOpData::MatrixArrayPtr build_conversion_matrix_from_XYZ_D65(const Primaries & dst_prims, - AdaptationMethod method) +MatrixOpData::MatrixArrayPtr build_conversion_matrix_from_XYZ_D65( + const Primaries & dst_prims, + AdaptationMethod method) { static const MatrixOpData::Offsets zero(0., 0., 0., 0.); - return build_conversion_matrix( CIE_XYZ_ILLUM_E::primaries, dst_prims, WHITEPOINT::D65_XYZ, zero, method ); + return build_conversion_matrix( + CIE_XYZ_ILLUM_E::primaries, + dst_prims, + WHITEPOINT::D65_XYZ, + zero, + method); } } // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/transforms/builtins/ColorMatrixHelpers.h b/src/OpenColorIO/transforms/builtins/ColorMatrixHelpers.h index 30898312fc..ddd2810d04 100644 --- a/src/OpenColorIO/transforms/builtins/ColorMatrixHelpers.h +++ b/src/OpenColorIO/transforms/builtins/ColorMatrixHelpers.h @@ -1,22 +1,19 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_COLOR_MATRIX_HELPERS_H #define INCLUDED_OCIO_COLOR_MATRIX_HELPERS_H - #include #include "ops/matrix/MatrixOpData.h" - namespace OCIO_NAMESPACE { struct Chromaticities { - Chromaticities() = delete; + Chromaticities() = delete; ~Chromaticities() = default; Chromaticities(double x, double y) @@ -33,7 +30,8 @@ struct Chromaticities Chromaticities & operator=(const Chromaticities & xy) { - if (this == &xy) return *this; + if (this == &xy) + return *this; m_xy[0] = xy.m_xy[0]; m_xy[1] = xy.m_xy[1]; @@ -41,32 +39,38 @@ struct Chromaticities return *this; } - double m_xy[2] { 0., 0. }; + double m_xy[2]{0., 0.}; }; struct Primaries { - Primaries() = delete; + Primaries() = delete; ~Primaries() = default; - Primaries(const Chromaticities & red, const Chromaticities & grn, const Chromaticities & blu, - const Chromaticities & wht) - : m_red(red) - , m_grn(grn) - , m_blu(blu) - , m_wht(wht) - {} + Primaries( + const Chromaticities & red, + const Chromaticities & grn, + const Chromaticities & blu, + const Chromaticities & wht) + : m_red(red) + , m_grn(grn) + , m_blu(blu) + , m_wht(wht) + { + } Primaries(const Primaries & primaries) - : m_red(primaries.m_red) - , m_grn(primaries.m_grn) - , m_blu(primaries.m_blu) - , m_wht(primaries.m_wht) - {} + : m_red(primaries.m_red) + , m_grn(primaries.m_grn) + , m_blu(primaries.m_blu) + , m_wht(primaries.m_wht) + { + } Primaries & operator=(const Primaries & primaries) { - if (this == &primaries) return *this; + if (this == &primaries) + return *this; m_red = primaries.m_red; m_grn = primaries.m_grn; @@ -127,7 +131,7 @@ namespace WHITEPOINT extern const MatrixOpData::Offsets D60_XYZ; extern const MatrixOpData::Offsets D65_XYZ; extern const MatrixOpData::Offsets DCI_XYZ; -} +} // namespace WHITEPOINT // Calculate a matrix to convert arbitrary RGB primary tristimulus values // to CIE XYZ tristimulus values using the CIE xy chromaticity coordinates @@ -146,39 +150,44 @@ enum AdaptationMethod ADAPTATION_CAT02 }; -// Build a von Kries type chromatic adaptation matrix from source white point src_XYZ to +// Build a von Kries type chromatic adaptation matrix from source white point src_XYZ to // destination white point dst_XYZ, using the chosen cone primary matrix. -MatrixOpData::MatrixArrayPtr build_vonkries_adapt(const MatrixOpData::Offsets & src_XYZ, - const MatrixOpData::Offsets & dst_XYZ, - AdaptationMethod method); +MatrixOpData::MatrixArrayPtr build_vonkries_adapt( + const MatrixOpData::Offsets & src_XYZ, + const MatrixOpData::Offsets & dst_XYZ, + AdaptationMethod method); // Build a conversion matrix from source primaries to destination primaries. // The resulting matrix will map [1,1,1] input RGB to [1,1,1] output RGB. -MatrixOpData::MatrixArrayPtr build_conversion_matrix(const Primaries & src_prims, - const Primaries & dst_prims, - AdaptationMethod method); +MatrixOpData::MatrixArrayPtr build_conversion_matrix( + const Primaries & src_prims, + const Primaries & dst_prims, + AdaptationMethod method); // Build a conversion matrix from source primaries to destination primaries with the option of // setting the adaptation source and destination manually. If you pass zeros for either of the // white points, that corresponding white point will be taken from the primaries. -MatrixOpData::MatrixArrayPtr build_conversion_matrix(const Primaries & src_prims, - const Primaries & dst_prims, - const MatrixOpData::Offsets & src_wht_XYZ, - const MatrixOpData::Offsets & dst_wht_XYZ, - AdaptationMethod method); +MatrixOpData::MatrixArrayPtr build_conversion_matrix( + const Primaries & src_prims, + const Primaries & dst_prims, + const MatrixOpData::Offsets & src_wht_XYZ, + const MatrixOpData::Offsets & dst_wht_XYZ, + AdaptationMethod method); // Build a conversion matrix to CIE XYZ D65 from the source primaries. -MatrixOpData::MatrixArrayPtr build_conversion_matrix_to_XYZ_D65(const Primaries & src_prims, - AdaptationMethod method); +MatrixOpData::MatrixArrayPtr build_conversion_matrix_to_XYZ_D65( + const Primaries & src_prims, + AdaptationMethod method); // Build a conversion matrix from CIE XYZ D65 to the destination primaries. -MatrixOpData::MatrixArrayPtr build_conversion_matrix_from_XYZ_D65(const Primaries & dst_prims, - AdaptationMethod method); +MatrixOpData::MatrixArrayPtr build_conversion_matrix_from_XYZ_D65( + const Primaries & dst_prims, + AdaptationMethod method); } // namespace OCIO_NAMESPACE #endif // INCLUDED_OCIO_COLOR_MATRIX_HELPERS_H diff --git a/src/OpenColorIO/transforms/builtins/Displays.cpp b/src/OpenColorIO/transforms/builtins/Displays.cpp index 8d8af97826..af8d95da33 100644 --- a/src/OpenColorIO/transforms/builtins/Displays.cpp +++ b/src/OpenColorIO/transforms/builtins/Displays.cpp @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #include #include @@ -15,7 +14,6 @@ #include "transforms/builtins/Displays.h" #include "transforms/builtins/OpHelpers.h" - namespace OCIO_NAMESPACE { @@ -33,11 +31,10 @@ static constexpr double c1 = c3 - c2 + 1.; void GeneratePQToLinearOps(OpRcPtrVec & ops) { - auto GenerateLutValues = [](double input) -> float - { + auto GenerateLutValues = [](double input) -> float { const double N = std::max(0., input); const double x = std::pow(N, 1. / m2); - double L = std::pow( std::max(0., x - c1) / (c2 - c3 * x), 1. / m1 ); + double L = std::pow(std::max(0., x - c1) / (c2 - c3 * x), 1. / m1); // L is in nits/10000, convert to nits/100. L *= 100.; @@ -49,13 +46,12 @@ void GeneratePQToLinearOps(OpRcPtrVec & ops) void GenerateLinearToPQOps(OpRcPtrVec & ops) { - auto GenerateLutValues = [](double input) -> float - { + auto GenerateLutValues = [](double input) -> float { // Input is in nits/100, convert to [0,1], where 1 is 10000 nits. - const double L = std::max(0., input * 0.01); - const double y = std::pow(L, m1); + const double L = std::max(0., input * 0.01); + const double y = std::pow(L, m1); const double ratpoly = (c1 + c2 * y) / (1. + c3 * y); - const double N = std::pow( std::max(0., ratpoly), m2 ); + const double N = std::pow(std::max(0., ratpoly), m2); return float(N); }; @@ -63,147 +59,173 @@ void GenerateLinearToPQOps(OpRcPtrVec & ops) CreateHalfLut(ops, GenerateLutValues); } -} // ST_2084 - +} // namespace ST_2084 void RegisterAll(BuiltinTransformRegistryImpl & registry) noexcept { { - auto CIE_XYZ_D65_to_REC1886_REC709_Functor = [](OpRcPtrVec & ops) - { + auto CIE_XYZ_D65_to_REC1886_REC709_Functor = [](OpRcPtrVec & ops) { MatrixOpData::MatrixArrayPtr matrix = build_conversion_matrix_from_XYZ_D65(REC709::primaries, ADAPTATION_NONE); CreateMatrixOp(ops, matrix, TRANSFORM_DIR_FORWARD); - const GammaOpData::Params rgbParams = { 2.4 }; - const GammaOpData::Params alphaParams = { 1.0 }; - auto gammaData = std::make_shared(GammaOpData::BASIC_REV, - rgbParams, rgbParams, rgbParams, alphaParams); + const GammaOpData::Params rgbParams = {2.4}; + const GammaOpData::Params alphaParams = {1.0}; + auto gammaData = std::make_shared( + GammaOpData::BASIC_REV, + rgbParams, + rgbParams, + rgbParams, + alphaParams); CreateGammaOp(ops, gammaData, TRANSFORM_DIR_FORWARD); }; - registry.addBuiltin("DISPLAY - CIE-XYZ-D65_to_REC.1886-REC.709", - "Convert CIE XYZ (D65 white) to Rec.1886/Rec.709 (HD video)", - CIE_XYZ_D65_to_REC1886_REC709_Functor); + registry.addBuiltin( + "DISPLAY - CIE-XYZ-D65_to_REC.1886-REC.709", + "Convert CIE XYZ (D65 white) to Rec.1886/Rec.709 (HD video)", + CIE_XYZ_D65_to_REC1886_REC709_Functor); } { - auto CIE_XYZ_D65_to_REC1886_REC2020_Functor = [](OpRcPtrVec & ops) - { + auto CIE_XYZ_D65_to_REC1886_REC2020_Functor = [](OpRcPtrVec & ops) { MatrixOpData::MatrixArrayPtr matrix = build_conversion_matrix_from_XYZ_D65(REC2020::primaries, ADAPTATION_NONE); CreateMatrixOp(ops, matrix, TRANSFORM_DIR_FORWARD); - const GammaOpData::Params rgbParams = { 2.4 }; - const GammaOpData::Params alphaParams = { 1.0 }; - auto gammaData = std::make_shared(GammaOpData::BASIC_REV, - rgbParams, rgbParams, rgbParams, alphaParams); + const GammaOpData::Params rgbParams = {2.4}; + const GammaOpData::Params alphaParams = {1.0}; + auto gammaData = std::make_shared( + GammaOpData::BASIC_REV, + rgbParams, + rgbParams, + rgbParams, + alphaParams); CreateGammaOp(ops, gammaData, TRANSFORM_DIR_FORWARD); }; - registry.addBuiltin("DISPLAY - CIE-XYZ-D65_to_REC.1886-REC.2020", - "Convert CIE XYZ (D65 white) to Rec.1886/Rec.2020 (UHD video)", - CIE_XYZ_D65_to_REC1886_REC2020_Functor); + registry.addBuiltin( + "DISPLAY - CIE-XYZ-D65_to_REC.1886-REC.2020", + "Convert CIE XYZ (D65 white) to Rec.1886/Rec.2020 (UHD video)", + CIE_XYZ_D65_to_REC1886_REC2020_Functor); } { - auto CIE_XYZ_D65_to_G22_REC709_Functor = [](OpRcPtrVec & ops) - { + auto CIE_XYZ_D65_to_G22_REC709_Functor = [](OpRcPtrVec & ops) { MatrixOpData::MatrixArrayPtr matrix = build_conversion_matrix_from_XYZ_D65(REC709::primaries, ADAPTATION_NONE); CreateMatrixOp(ops, matrix, TRANSFORM_DIR_FORWARD); - const GammaOpData::Params rgbParams = { 2.2 }; - const GammaOpData::Params alphaParams = { 1.0 }; - auto gammaData = std::make_shared(GammaOpData::BASIC_REV, - rgbParams, rgbParams, rgbParams, alphaParams); + const GammaOpData::Params rgbParams = {2.2}; + const GammaOpData::Params alphaParams = {1.0}; + auto gammaData = std::make_shared( + GammaOpData::BASIC_REV, + rgbParams, + rgbParams, + rgbParams, + alphaParams); CreateGammaOp(ops, gammaData, TRANSFORM_DIR_FORWARD); }; - registry.addBuiltin("DISPLAY - CIE-XYZ-D65_to_G2.2-REC.709", - "Convert CIE XYZ (D65 white) to Gamma2.2, Rec.709", - CIE_XYZ_D65_to_G22_REC709_Functor); + registry.addBuiltin( + "DISPLAY - CIE-XYZ-D65_to_G2.2-REC.709", + "Convert CIE XYZ (D65 white) to Gamma2.2, Rec.709", + CIE_XYZ_D65_to_G22_REC709_Functor); } { - auto CIE_XYZ_D65_to_SRGB_Functor = [](OpRcPtrVec & ops) - { + auto CIE_XYZ_D65_to_SRGB_Functor = [](OpRcPtrVec & ops) { MatrixOpData::MatrixArrayPtr matrix = build_conversion_matrix_from_XYZ_D65(REC709::primaries, ADAPTATION_NONE); CreateMatrixOp(ops, matrix, TRANSFORM_DIR_FORWARD); - const GammaOpData::Params rgbParams = { 2.4, 0.055 }; - const GammaOpData::Params alphaParams = { 1.0, 0.0 }; - auto gammaData = std::make_shared(GammaOpData::MONCURVE_REV, - rgbParams, rgbParams, rgbParams, alphaParams); + const GammaOpData::Params rgbParams = {2.4, 0.055}; + const GammaOpData::Params alphaParams = {1.0, 0.0}; + auto gammaData = std::make_shared( + GammaOpData::MONCURVE_REV, + rgbParams, + rgbParams, + rgbParams, + alphaParams); CreateGammaOp(ops, gammaData, TRANSFORM_DIR_FORWARD); }; - registry.addBuiltin("DISPLAY - CIE-XYZ-D65_to_sRGB", - "Convert CIE XYZ (D65 white) to sRGB (piecewise EOTF)", - CIE_XYZ_D65_to_SRGB_Functor); + registry.addBuiltin( + "DISPLAY - CIE-XYZ-D65_to_sRGB", + "Convert CIE XYZ (D65 white) to sRGB (piecewise EOTF)", + CIE_XYZ_D65_to_SRGB_Functor); } { - auto CIE_XYZ_D65_to_P3_DCI_BFD_Functor = [](OpRcPtrVec & ops) - { + auto CIE_XYZ_D65_to_P3_DCI_BFD_Functor = [](OpRcPtrVec & ops) { MatrixOpData::MatrixArrayPtr matrix = build_conversion_matrix_from_XYZ_D65(P3_DCI::primaries, ADAPTATION_BRADFORD); CreateMatrixOp(ops, matrix, TRANSFORM_DIR_FORWARD); - const GammaOpData::Params rgbParams = { 2.6 }; - const GammaOpData::Params alphaParams = { 1.0 }; - auto gammaData = std::make_shared(GammaOpData::BASIC_REV, - rgbParams, rgbParams, rgbParams, alphaParams); + const GammaOpData::Params rgbParams = {2.6}; + const GammaOpData::Params alphaParams = {1.0}; + auto gammaData = std::make_shared( + GammaOpData::BASIC_REV, + rgbParams, + rgbParams, + rgbParams, + alphaParams); CreateGammaOp(ops, gammaData, TRANSFORM_DIR_FORWARD); }; - registry.addBuiltin("DISPLAY - CIE-XYZ-D65_to_G2.6-P3-DCI-BFD", - "Convert CIE XYZ (D65 white) to Gamma 2.6, P3-DCI (DCI white with Bradford adaptation)", - CIE_XYZ_D65_to_P3_DCI_BFD_Functor); + registry.addBuiltin( + "DISPLAY - CIE-XYZ-D65_to_G2.6-P3-DCI-BFD", + "Convert CIE XYZ (D65 white) to Gamma 2.6, P3-DCI (DCI white with Bradford adaptation)", + CIE_XYZ_D65_to_P3_DCI_BFD_Functor); } { - auto CIE_XYZ_D65_to_P3_D65_Functor = [](OpRcPtrVec & ops) - { + auto CIE_XYZ_D65_to_P3_D65_Functor = [](OpRcPtrVec & ops) { MatrixOpData::MatrixArrayPtr matrix = build_conversion_matrix_from_XYZ_D65(P3_D65::primaries, ADAPTATION_NONE); CreateMatrixOp(ops, matrix, TRANSFORM_DIR_FORWARD); - const GammaOpData::Params rgbParams = { 2.6 }; - const GammaOpData::Params alphaParams = { 1.0 }; - auto gammaData = std::make_shared(GammaOpData::BASIC_REV, - rgbParams, rgbParams, rgbParams, alphaParams); + const GammaOpData::Params rgbParams = {2.6}; + const GammaOpData::Params alphaParams = {1.0}; + auto gammaData = std::make_shared( + GammaOpData::BASIC_REV, + rgbParams, + rgbParams, + rgbParams, + alphaParams); CreateGammaOp(ops, gammaData, TRANSFORM_DIR_FORWARD); }; - registry.addBuiltin("DISPLAY - CIE-XYZ-D65_to_G2.6-P3-D65", - "Convert CIE XYZ (D65 white) to Gamma 2.6, P3-D65", - CIE_XYZ_D65_to_P3_D65_Functor); + registry.addBuiltin( + "DISPLAY - CIE-XYZ-D65_to_G2.6-P3-D65", + "Convert CIE XYZ (D65 white) to Gamma 2.6, P3-D65", + CIE_XYZ_D65_to_P3_D65_Functor); } { - auto CIE_XYZ_D65_to_P3_D60_BFD_Functor = [](OpRcPtrVec & ops) - { + auto CIE_XYZ_D65_to_P3_D60_BFD_Functor = [](OpRcPtrVec & ops) { MatrixOpData::MatrixArrayPtr matrix = build_conversion_matrix_from_XYZ_D65(P3_D60::primaries, ADAPTATION_BRADFORD); CreateMatrixOp(ops, matrix, TRANSFORM_DIR_FORWARD); - const GammaOpData::Params rgbParams = { 2.6 }; - const GammaOpData::Params alphaParams = { 1.0 }; - auto gammaData = std::make_shared(GammaOpData::BASIC_REV, - rgbParams, rgbParams, rgbParams, alphaParams); + const GammaOpData::Params rgbParams = {2.6}; + const GammaOpData::Params alphaParams = {1.0}; + auto gammaData = std::make_shared( + GammaOpData::BASIC_REV, + rgbParams, + rgbParams, + rgbParams, + alphaParams); CreateGammaOp(ops, gammaData, TRANSFORM_DIR_FORWARD); }; - registry.addBuiltin("DISPLAY - CIE-XYZ-D65_to_G2.6-P3-D60-BFD", - "Convert CIE XYZ (D65 white) to Gamma 2.6, P3-D60 (Bradford adaptation)", - CIE_XYZ_D65_to_P3_D60_BFD_Functor); + registry.addBuiltin( + "DISPLAY - CIE-XYZ-D65_to_G2.6-P3-D60-BFD", + "Convert CIE XYZ (D65 white) to Gamma 2.6, P3-D60 (Bradford adaptation)", + CIE_XYZ_D65_to_P3_D60_BFD_Functor); } { - auto CIE_XYZ_D65_to_DisplayP3_Functor = [](OpRcPtrVec & ops) - { + auto CIE_XYZ_D65_to_DisplayP3_Functor = [](OpRcPtrVec & ops) { MatrixOpData::MatrixArrayPtr matrix = build_conversion_matrix_from_XYZ_D65(P3_D65::primaries, ADAPTATION_NONE); CreateMatrixOp(ops, matrix, TRANSFORM_DIR_FORWARD); @@ -221,43 +243,45 @@ void RegisterAll(BuiltinTransformRegistryImpl & registry) noexcept // https://developer.apple.com/documentation/coregraphics/kcgcolorspacedisplayp3 // https://developer.apple.com/documentation/appkit/nscolorspace/1644175-extendedsrgbcolorspace - const GammaOpData::Params rgbParams = { 2.4, 0.055 }; - const GammaOpData::Params alphaParams = { 1.0, 0.0 }; - auto gammaData = std::make_shared(GammaOpData::MONCURVE_MIRROR_REV, - rgbParams, rgbParams, rgbParams, alphaParams); + const GammaOpData::Params rgbParams = {2.4, 0.055}; + const GammaOpData::Params alphaParams = {1.0, 0.0}; + auto gammaData = std::make_shared( + GammaOpData::MONCURVE_MIRROR_REV, + rgbParams, + rgbParams, + rgbParams, + alphaParams); CreateGammaOp(ops, gammaData, TRANSFORM_DIR_FORWARD); }; - registry.addBuiltin("DISPLAY - CIE-XYZ-D65_to_DisplayP3", - "Convert CIE XYZ (D65 white) to Apple Display P3", - CIE_XYZ_D65_to_DisplayP3_Functor); + registry.addBuiltin( + "DISPLAY - CIE-XYZ-D65_to_DisplayP3", + "Convert CIE XYZ (D65 white) to Apple Display P3", + CIE_XYZ_D65_to_DisplayP3_Functor); } { - auto ST2084_to_Linear_Functor = [](OpRcPtrVec & ops) - { - ST_2084::GeneratePQToLinearOps(ops); - }; + auto ST2084_to_Linear_Functor + = [](OpRcPtrVec & ops) { ST_2084::GeneratePQToLinearOps(ops); }; - registry.addBuiltin("CURVE - ST-2084_to_LINEAR", - "Convert SMPTE ST-2084 (PQ) full-range to linear nits/100", - ST2084_to_Linear_Functor); + registry.addBuiltin( + "CURVE - ST-2084_to_LINEAR", + "Convert SMPTE ST-2084 (PQ) full-range to linear nits/100", + ST2084_to_Linear_Functor); } { - auto Linear_to_ST2084_Functor = [](OpRcPtrVec & ops) - { - ST_2084::GenerateLinearToPQOps(ops); - }; + auto Linear_to_ST2084_Functor + = [](OpRcPtrVec & ops) { ST_2084::GenerateLinearToPQOps(ops); }; - registry.addBuiltin("CURVE - LINEAR_to_ST-2084", - "Convert linear nits/100 to SMPTE ST-2084 (PQ) full-range", - Linear_to_ST2084_Functor); + registry.addBuiltin( + "CURVE - LINEAR_to_ST-2084", + "Convert linear nits/100 to SMPTE ST-2084 (PQ) full-range", + Linear_to_ST2084_Functor); } { - auto CIE_XYZ_D65_to_REC2100_PQ_Functor = [](OpRcPtrVec & ops) - { + auto CIE_XYZ_D65_to_REC2100_PQ_Functor = [](OpRcPtrVec & ops) { MatrixOpData::MatrixArrayPtr matrix = build_conversion_matrix_from_XYZ_D65(REC2020::primaries, ADAPTATION_NONE); CreateMatrixOp(ops, matrix, TRANSFORM_DIR_FORWARD); @@ -265,14 +289,14 @@ void RegisterAll(BuiltinTransformRegistryImpl & registry) noexcept ST_2084::GenerateLinearToPQOps(ops); }; - registry.addBuiltin("DISPLAY - CIE-XYZ-D65_to_REC.2100-PQ", - "Convert CIE XYZ (D65 white) to Rec.2100-PQ", - CIE_XYZ_D65_to_REC2100_PQ_Functor); + registry.addBuiltin( + "DISPLAY - CIE-XYZ-D65_to_REC.2100-PQ", + "Convert CIE XYZ (D65 white) to Rec.2100-PQ", + CIE_XYZ_D65_to_REC2100_PQ_Functor); } { - auto CIE_XYZ_D65_to_ST2084_P3_D65_Functor = [](OpRcPtrVec & ops) - { + auto CIE_XYZ_D65_to_ST2084_P3_D65_Functor = [](OpRcPtrVec & ops) { MatrixOpData::MatrixArrayPtr matrix = build_conversion_matrix_from_XYZ_D65(P3_D65::primaries, ADAPTATION_NONE); CreateMatrixOp(ops, matrix, TRANSFORM_DIR_FORWARD); @@ -280,14 +304,14 @@ void RegisterAll(BuiltinTransformRegistryImpl & registry) noexcept ST_2084::GenerateLinearToPQOps(ops); }; - registry.addBuiltin("DISPLAY - CIE-XYZ-D65_to_ST2084-P3-D65", - "Convert CIE XYZ (D65 white) to ST-2084 (PQ), P3-D65 primaries", - CIE_XYZ_D65_to_ST2084_P3_D65_Functor); + registry.addBuiltin( + "DISPLAY - CIE-XYZ-D65_to_ST2084-P3-D65", + "Convert CIE XYZ (D65 white) to ST-2084 (PQ), P3-D65 primaries", + CIE_XYZ_D65_to_ST2084_P3_D65_Functor); } { - auto CIE_XYZ_D65_to_REC2100_HLG_1000nit_Functor = [](OpRcPtrVec & ops) - { + auto CIE_XYZ_D65_to_REC2100_HLG_1000nit_Functor = [](OpRcPtrVec & ops) { MatrixOpData::MatrixArrayPtr matrix = build_conversion_matrix_from_XYZ_D65(REC2020::primaries, ADAPTATION_NONE); CreateMatrixOp(ops, matrix, TRANSFORM_DIR_FORWARD); @@ -297,35 +321,34 @@ void RegisterAll(BuiltinTransformRegistryImpl & registry) noexcept const double gamma = 1.2 + 0.42 * std::log10(Lw / 1000.); { static constexpr double scale = 100.; - static constexpr double scale4[4] = { scale, scale, scale, 1. }; + static constexpr double scale4[4] = {scale, scale, scale, 1.}; CreateScaleOp(ops, scale4, TRANSFORM_DIR_FORWARD); } { const double scale = std::pow(E_MAX, gamma) / Lw; - const double scale4[4] = { scale, scale, scale, 1. }; + const double scale4[4] = {scale, scale, scale, 1.}; CreateScaleOp(ops, scale4, TRANSFORM_DIR_FORWARD); } CreateFixedFunctionOp(ops, FixedFunctionOpData::REC2100_SURROUND_FWD, {1. / gamma}); - auto GenerateLutValues = [](double in) -> float - { - const double a = 0.17883277; - const double b = (1. - 4. * a) * E_MAX / 12.; - const double c0 = 0.5 - a * std::log(4. * a); - const double c = std::log(12. / E_MAX) * 0.17883277 + c0; + auto GenerateLutValues = [](double in) -> float { + const double a = 0.17883277; + const double b = (1. - 4. * a) * E_MAX / 12.; + const double c0 = 0.5 - a * std::log(4. * a); + const double c = std::log(12. / E_MAX) * 0.17883277 + c0; const double E_scale = 3. / E_MAX; const double E_break = E_MAX / 12.; - double out = 0.0; + double out = 0.0; const double E = std::max(in, 0.); if (in < E_break) { - out = std::sqrt( E * E_scale ); + out = std::sqrt(E * E_scale); } else { - out = std::min( 1., a * std::log(E - b) + c); + out = std::min(1., a * std::log(E - b) + c); } return float(out); }; @@ -333,11 +356,11 @@ void RegisterAll(BuiltinTransformRegistryImpl & registry) noexcept CreateHalfLut(ops, GenerateLutValues); }; - registry.addBuiltin("DISPLAY - CIE-XYZ-D65_to_REC.2100-HLG-1000nit", - "Convert CIE XYZ (D65 white) to Rec.2100-HLG, 1000 nit", - CIE_XYZ_D65_to_REC2100_HLG_1000nit_Functor); + registry.addBuiltin( + "DISPLAY - CIE-XYZ-D65_to_REC.2100-HLG-1000nit", + "Convert CIE XYZ (D65 white) to Rec.2100-HLG, 1000 nit", + CIE_XYZ_D65_to_REC2100_HLG_1000nit_Functor); } - } } // namespace DISPLAY diff --git a/src/OpenColorIO/transforms/builtins/Displays.h b/src/OpenColorIO/transforms/builtins/Displays.h index a95ac4fa3f..945d12d692 100644 --- a/src/OpenColorIO/transforms/builtins/Displays.h +++ b/src/OpenColorIO/transforms/builtins/Displays.h @@ -1,14 +1,11 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_DISPLAYS_TRANSFORMS_H #define INCLUDED_OCIO_DISPLAYS_TRANSFORMS_H - #include - namespace OCIO_NAMESPACE { diff --git a/src/OpenColorIO/transforms/builtins/OpHelpers.cpp b/src/OpenColorIO/transforms/builtins/OpHelpers.cpp index 0a30232993..89655f14bb 100644 --- a/src/OpenColorIO/transforms/builtins/OpHelpers.cpp +++ b/src/OpenColorIO/transforms/builtins/OpHelpers.cpp @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #include #include @@ -9,7 +8,6 @@ #include "ops/lut1d/Lut1DOp.h" #include "transforms/builtins/OpHelpers.h" - namespace OCIO_NAMESPACE { @@ -29,9 +27,9 @@ double Interpolate1D(unsigned lutSize, const double * lutValues, double in) { return lutValues[1]; } - else if (in >= lutValues[2 * (lutSize-1)]) + else if (in >= lutValues[2 * (lutSize - 1)]) { - return lutValues[2 * (lutSize-1) + 1]; + return lutValues[2 * (lutSize - 1) + 1]; } for (unsigned idx = 1; idx < lutSize; ++idx) @@ -44,24 +42,24 @@ double Interpolate1D(unsigned lutSize, const double * lutValues, double in) const double inCoeff = (in - lutValues[minIdx]) / (lutValues[maxIdx] - lutValues[minIdx]); - return lutValues[minIdx + 1] * (1.0 - inCoeff) - + lutValues[maxIdx + 1] * inCoeff; + return lutValues[minIdx + 1] * (1.0 - inCoeff) + lutValues[maxIdx + 1] * inCoeff; } } throw Exception("Invalid interpolation value."); } -void CreateLut(OpRcPtrVec & ops, - unsigned long lutDimension, - std::function lutValueGenerator) +void CreateLut( + OpRcPtrVec & ops, + unsigned long lutDimension, + std::function lutValueGenerator) { - Lut1DOpDataRcPtr lut = std::make_shared(Lut1DOpData::LUT_STANDARD, - lutDimension, false); + Lut1DOpDataRcPtr lut + = std::make_shared(Lut1DOpData::LUT_STANDARD, lutDimension, false); lut->setInterpolation(INTERP_LINEAR); lut->setDirection(TRANSFORM_DIR_FORWARD); - Array & array = lut->getArray(); + Array & array = lut->getArray(); Array::Values & values = array.getValues(); for (unsigned long idx = 0; idx < lutDimension; ++idx) @@ -74,9 +72,10 @@ void CreateLut(OpRcPtrVec & ops, CreateLut1DOp(ops, lut, TRANSFORM_DIR_FORWARD); } -void CreateLut(OpRcPtrVec & ops, - unsigned long lutDimension, - std::function lutValueGenerator) +void CreateLut( + OpRcPtrVec & ops, + unsigned long lutDimension, + std::function lutValueGenerator) { Lut1DOpDataRcPtr lut = std::make_shared(lutDimension); lut->setInterpolation(INTERP_LINEAR); @@ -86,14 +85,12 @@ void CreateLut(OpRcPtrVec & ops, for (unsigned long idx = 0; idx < lutDimension; ++idx) { - const double in[3] - { + const double in[3]{ double(idx) / (lutDimension - 1.), double(idx) / (lutDimension - 1.), - double(idx) / (lutDimension - 1.) - }; - - double out[3] {0., 0., 0.}; + double(idx) / (lutDimension - 1.)}; + + double out[3]{0., 0., 0.}; lutValueGenerator(in, out); @@ -107,12 +104,12 @@ void CreateLut(OpRcPtrVec & ops, void CreateHalfLut(OpRcPtrVec & ops, std::function lutValueGenerator) { - Lut1DOpDataRcPtr lut = std::make_shared(Lut1DOpData::LUT_INPUT_HALF_CODE, - 65536, true); + Lut1DOpDataRcPtr lut + = std::make_shared(Lut1DOpData::LUT_INPUT_HALF_CODE, 65536, true); lut->setInterpolation(INTERP_LINEAR); lut->setDirection(TRANSFORM_DIR_FORWARD); - Array & array = lut->getArray(); + Array & array = lut->getArray(); Array::Values & values = array.getValues(); const unsigned long lutDimension = array.getLength(); diff --git a/src/OpenColorIO/transforms/builtins/OpHelpers.h b/src/OpenColorIO/transforms/builtins/OpHelpers.h index ac11949281..59f72c937a 100644 --- a/src/OpenColorIO/transforms/builtins/OpHelpers.h +++ b/src/OpenColorIO/transforms/builtins/OpHelpers.h @@ -4,12 +4,10 @@ #ifndef INCLUDED_OCIO_TRANSFORM_HELPERS_H #define INCLUDED_OCIO_TRANSFORM_HELPERS_H - #include #include - namespace OCIO_NAMESPACE { @@ -21,23 +19,23 @@ double Interpolate1D(unsigned lutSize, const double * lutValues, double in); // Create a LUT 1D transform where values are the same for the three color components. // The input values are linearly spaced on [0,1]. The output values from the functor // should be nominally [0,1], although they may exceed that if needed. -void CreateLut(OpRcPtrVec & ops, - unsigned long lutDimension, - std::function lutValueGenerator); +void CreateLut( + OpRcPtrVec & ops, + unsigned long lutDimension, + std::function lutValueGenerator); // Create a LUT 1D transform where values may be different for the three color components. // The first argument is an array of RGB inputs to the functor, the second argument is for // the RGB outputs. -void CreateLut(OpRcPtrVec & ops, - unsigned long lutDimension, - std::function lutValueGenerator); +void CreateLut( + OpRcPtrVec & ops, + unsigned long lutDimension, + std::function lutValueGenerator); // The input values to the functor are all possible values of a half-float. // However NaNs are mapped to 0 and +/-Inf is mapped to +/-HALF_MAX. -void CreateHalfLut(OpRcPtrVec & ops, - std::function lutValueGenerator); +void CreateHalfLut(OpRcPtrVec & ops, std::function lutValueGenerator); } // namespace OCIO_NAMESPACE - #endif // INCLUDED_OCIO_TRANSFORM_HELPERS_H diff --git a/src/OpenColorIO/transforms/builtins/PanasonicCameras.cpp b/src/OpenColorIO/transforms/builtins/PanasonicCameras.cpp index 12b5ad10c0..5199e4bb5a 100644 --- a/src/OpenColorIO/transforms/builtins/PanasonicCameras.cpp +++ b/src/OpenColorIO/transforms/builtins/PanasonicCameras.cpp @@ -1,32 +1,30 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #include #include -#include "ops/matrix/MatrixOp.h" #include "ops/log/LogOp.h" +#include "ops/matrix/MatrixOp.h" #include "transforms/builtins/ACES.h" #include "transforms/builtins/BuiltinTransformRegistry.h" #include "transforms/builtins/ColorMatrixHelpers.h" #include "transforms/builtins/OpHelpers.h" #include "transforms/builtins/PanasonicCameras.h" - namespace OCIO_NAMESPACE { namespace PANASONIC_VLOG_VGAMUT { -static const Chromaticities red_xy(0.730, 0.280); -static const Chromaticities grn_xy(0.165, 0.840); -static const Chromaticities blu_xy(0.100, -0.030); -static const Chromaticities wht_xy(0.3127, 0.3290); +static const Chromaticities red_xy(0.730, 0.280); +static const Chromaticities grn_xy(0.165, 0.840); +static const Chromaticities blu_xy(0.100, -0.030); +static const Chromaticities wht_xy(0.3127, 0.3290); const Primaries primaries(red_xy, grn_xy, blu_xy, wht_xy); -} +} // namespace PANASONIC_VLOG_VGAMUT namespace PANASONIC_VLOG_VGAMUT_to_LINEAR { @@ -42,12 +40,11 @@ static constexpr double logSideOffset = d; static constexpr double linSideBreak = cut1; static constexpr double base = 10.; -static const LogOpData::Params - params { logSideSlope, logSideOffset, linSideSlope, linSideOffset, linSideBreak }; +static const LogOpData::Params + params{logSideSlope, logSideOffset, linSideSlope, linSideOffset, linSideBreak}; static const LogOpData log(base, params, params, params, TRANSFORM_DIR_INVERSE); -} - +} // namespace PANASONIC_VLOG_VGAMUT_to_LINEAR namespace CAMERA { @@ -58,19 +55,21 @@ namespace PANASONIC void RegisterAll(BuiltinTransformRegistryImpl & registry) noexcept { { - auto PANASONIC_VLOG_VGAMUT_to_ACES2065_1_Functor = [](OpRcPtrVec & ops) - { + auto PANASONIC_VLOG_VGAMUT_to_ACES2065_1_Functor = [](OpRcPtrVec & ops) { LogOpDataRcPtr log = PANASONIC_VLOG_VGAMUT_to_LINEAR::log.clone(); CreateLogOp(ops, log, TRANSFORM_DIR_FORWARD); - MatrixOpData::MatrixArrayPtr matrix - = build_conversion_matrix(PANASONIC_VLOG_VGAMUT::primaries, ACES_AP0::primaries, ADAPTATION_BRADFORD); + MatrixOpData::MatrixArrayPtr matrix = build_conversion_matrix( + PANASONIC_VLOG_VGAMUT::primaries, + ACES_AP0::primaries, + ADAPTATION_BRADFORD); CreateMatrixOp(ops, matrix, TRANSFORM_DIR_FORWARD); }; - registry.addBuiltin("PANASONIC_VLOG-VGAMUT_to_ACES2065-1", - "Convert Panasonic Varicam V-Log V-Gamut to ACES2065-1", - PANASONIC_VLOG_VGAMUT_to_ACES2065_1_Functor); + registry.addBuiltin( + "PANASONIC_VLOG-VGAMUT_to_ACES2065-1", + "Convert Panasonic Varicam V-Log V-Gamut to ACES2065-1", + PANASONIC_VLOG_VGAMUT_to_ACES2065_1_Functor); } } diff --git a/src/OpenColorIO/transforms/builtins/PanasonicCameras.h b/src/OpenColorIO/transforms/builtins/PanasonicCameras.h index 74ee4d2591..aaef85a16b 100644 --- a/src/OpenColorIO/transforms/builtins/PanasonicCameras.h +++ b/src/OpenColorIO/transforms/builtins/PanasonicCameras.h @@ -1,14 +1,11 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_PANASONIC_CAMERAS_H #define INCLUDED_OCIO_PANASONIC_CAMERAS_H - #include - namespace OCIO_NAMESPACE { diff --git a/src/OpenColorIO/transforms/builtins/RedCameras.cpp b/src/OpenColorIO/transforms/builtins/RedCameras.cpp index bea9c6f7bd..1c976a8e8d 100644 --- a/src/OpenColorIO/transforms/builtins/RedCameras.cpp +++ b/src/OpenColorIO/transforms/builtins/RedCameras.cpp @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #include #include @@ -13,19 +12,18 @@ #include "transforms/builtins/ColorMatrixHelpers.h" #include "transforms/builtins/RedCameras.h" - namespace OCIO_NAMESPACE { namespace RED_WIDE_GAMUT_RGB { -static const Chromaticities red_xy(0.780308, 0.304253); -static const Chromaticities grn_xy(0.121595, 1.493994); +static const Chromaticities red_xy(0.780308, 0.304253); +static const Chromaticities grn_xy(0.121595, 1.493994); static const Chromaticities blu_xy(0.095612, -0.084589); -static const Chromaticities wht_xy(0.3127, 0.3290); +static const Chromaticities wht_xy(0.3127, 0.3290); const Primaries primaries(red_xy, grn_xy, blu_xy, wht_xy); -} +} // namespace RED_WIDE_GAMUT_RGB namespace RED_REDLOGFILM_RWG_to_LINEAR { @@ -36,21 +34,20 @@ static constexpr double gamma = 0.6; static constexpr double highlight = 1.; static constexpr double shadow = 0.; static constexpr double multiFactor = range / gamma; -static const double gain = (highlight - shadow) - / (1. - std::pow(10., multiFactor * (refBlack - refWhite))); -static const double offset = gain - (highlight - shadow); +static const double gain + = (highlight - shadow) / (1. - std::pow(10., multiFactor *(refBlack - refWhite))); +static const double offset = gain - (highlight - shadow); static constexpr double logSideSlope = 1. / multiFactor; static constexpr double logSideOffset = refWhite; -static const double linSideSlope = 1. / gain; -static const double linSideOffset = (offset - shadow) / gain; +static const double linSideSlope = 1. / gain; +static const double linSideOffset = (offset - shadow) / gain; static constexpr double base = 10.; -static const LogOpData::Params - params { logSideSlope, logSideOffset, linSideSlope, linSideOffset }; +static const LogOpData::Params params{logSideSlope, logSideOffset, linSideSlope, linSideOffset}; static const LogOpData log(base, params, params, params, TRANSFORM_DIR_INVERSE); -} +} // namespace RED_REDLOGFILM_RWG_to_LINEAR namespace RED_LOG3G10_RWG_to_LINEAR { @@ -61,12 +58,11 @@ static constexpr double logSideOffset = 0.0; static constexpr double linSideBreak = -0.01; static constexpr double base = 10.; -static const LogOpData::Params - params { logSideSlope, logSideOffset, linSideSlope, linSideOffset, linSideBreak }; +static const LogOpData::Params + params{logSideSlope, logSideOffset, linSideSlope, linSideOffset, linSideBreak}; static const LogOpData log(base, params, params, params, TRANSFORM_DIR_INVERSE); -} - +} // namespace RED_LOG3G10_RWG_to_LINEAR namespace CAMERA { @@ -77,38 +73,38 @@ namespace RED void RegisterAll(BuiltinTransformRegistryImpl & registry) noexcept { { - auto RED_REDLOGFILM_RWG_to_ACES2065_1_Functor = [](OpRcPtrVec & ops) - { + auto RED_REDLOGFILM_RWG_to_ACES2065_1_Functor = [](OpRcPtrVec & ops) { LogOpDataRcPtr log = RED_REDLOGFILM_RWG_to_LINEAR::log.clone(); CreateLogOp(ops, log, TRANSFORM_DIR_FORWARD); - MatrixOpData::MatrixArrayPtr - rwg = build_conversion_matrix(RED_WIDE_GAMUT_RGB::primaries, - ACES_AP0::primaries, - ADAPTATION_BRADFORD); + MatrixOpData::MatrixArrayPtr rwg = build_conversion_matrix( + RED_WIDE_GAMUT_RGB::primaries, + ACES_AP0::primaries, + ADAPTATION_BRADFORD); CreateMatrixOp(ops, rwg, TRANSFORM_DIR_FORWARD); }; - registry.addBuiltin("RED_REDLOGFILM-RWG_to_ACES2065-1", - "Convert RED LogFilm RED Wide Gamut to ACES2065-1", - RED_REDLOGFILM_RWG_to_ACES2065_1_Functor); + registry.addBuiltin( + "RED_REDLOGFILM-RWG_to_ACES2065-1", + "Convert RED LogFilm RED Wide Gamut to ACES2065-1", + RED_REDLOGFILM_RWG_to_ACES2065_1_Functor); } { - auto RED_LOG3G10_RWG_to_ACES2065_1_Functor = [](OpRcPtrVec & ops) - { + auto RED_LOG3G10_RWG_to_ACES2065_1_Functor = [](OpRcPtrVec & ops) { LogOpDataRcPtr log = RED_LOG3G10_RWG_to_LINEAR::log.clone(); CreateLogOp(ops, log, TRANSFORM_DIR_FORWARD); - MatrixOpData::MatrixArrayPtr - rwg = build_conversion_matrix(RED_WIDE_GAMUT_RGB::primaries, - ACES_AP0::primaries, - ADAPTATION_BRADFORD); + MatrixOpData::MatrixArrayPtr rwg = build_conversion_matrix( + RED_WIDE_GAMUT_RGB::primaries, + ACES_AP0::primaries, + ADAPTATION_BRADFORD); CreateMatrixOp(ops, rwg, TRANSFORM_DIR_FORWARD); }; - registry.addBuiltin("RED_LOG3G10-RWG_to_ACES2065-1", - "Convert RED Log3G10 RED Wide Gamut to ACES2065-1", - RED_LOG3G10_RWG_to_ACES2065_1_Functor); + registry.addBuiltin( + "RED_LOG3G10-RWG_to_ACES2065-1", + "Convert RED Log3G10 RED Wide Gamut to ACES2065-1", + RED_LOG3G10_RWG_to_ACES2065_1_Functor); } } diff --git a/src/OpenColorIO/transforms/builtins/RedCameras.h b/src/OpenColorIO/transforms/builtins/RedCameras.h index 053f5171ab..14290fc33f 100644 --- a/src/OpenColorIO/transforms/builtins/RedCameras.h +++ b/src/OpenColorIO/transforms/builtins/RedCameras.h @@ -1,14 +1,11 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_RED_CAMERAS_H #define INCLUDED_OCIO_RED_CAMERAS_H - #include - namespace OCIO_NAMESPACE { diff --git a/src/OpenColorIO/transforms/builtins/SonyCameras.cpp b/src/OpenColorIO/transforms/builtins/SonyCameras.cpp index 18d9655e42..5a21e7c25f 100644 --- a/src/OpenColorIO/transforms/builtins/SonyCameras.cpp +++ b/src/OpenColorIO/transforms/builtins/SonyCameras.cpp @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #include #include @@ -13,30 +12,28 @@ #include "transforms/builtins/OpHelpers.h" #include "transforms/builtins/SonyCameras.h" - namespace OCIO_NAMESPACE { namespace SONY_SGAMUT3 { -static const Chromaticities red_xy(0.730, 0.280); -static const Chromaticities grn_xy(0.140, 0.855); +static const Chromaticities red_xy(0.730, 0.280); +static const Chromaticities grn_xy(0.140, 0.855); static const Chromaticities blu_xy(0.100, -0.050); static const Chromaticities wht_xy(0.3127, 0.3290); const Primaries primaries(red_xy, grn_xy, blu_xy, wht_xy); -} +} // namespace SONY_SGAMUT3 namespace SONY_SGAMUT3_CINE { -static const Chromaticities red_xy(0.766, 0.275); -static const Chromaticities grn_xy(0.225, 0.800); +static const Chromaticities red_xy(0.766, 0.275); +static const Chromaticities grn_xy(0.225, 0.800); static const Chromaticities blu_xy(0.089, -0.087); static const Chromaticities wht_xy(0.3127, 0.3290); const Primaries primaries(red_xy, grn_xy, blu_xy, wht_xy); -} - +} // namespace SONY_SGAMUT3_CINE namespace SONY_SLOG3_to_LINEAR { @@ -45,15 +42,14 @@ static constexpr double linSideOffset = 0.01 / (0.18 + 0.01); static constexpr double logSideSlope = 261.5 / 1023.; static constexpr double logSideOffset = 420. / 1023.; static constexpr double linSideBreak = 0.01125000; -static constexpr double linearSlope = ( (171.2102946929 - 95.) / 0.01125000) / 1023.; +static constexpr double linearSlope = ((171.2102946929 - 95.) / 0.01125000) / 1023.; static constexpr double base = 10.; -static const LogOpData::Params - params { logSideSlope, logSideOffset, linSideSlope, linSideOffset, linSideBreak, linearSlope }; +static const LogOpData::Params + params{logSideSlope, logSideOffset, linSideSlope, linSideOffset, linSideBreak, linearSlope}; static const LogOpData log(base, params, params, params, TRANSFORM_DIR_INVERSE); -} - +} // namespace SONY_SLOG3_to_LINEAR namespace CAMERA { @@ -64,45 +60,49 @@ namespace SONY void RegisterAll(BuiltinTransformRegistryImpl & registry) noexcept { { - auto SONY_SLOG3_SGAMUT3_to_ACES2065_1_Functor = [](OpRcPtrVec & ops) - { + auto SONY_SLOG3_SGAMUT3_to_ACES2065_1_Functor = [](OpRcPtrVec & ops) { LogOpDataRcPtr log = SONY_SLOG3_to_LINEAR::log.clone(); CreateLogOp(ops, log, TRANSFORM_DIR_FORWARD); - MatrixOpData::MatrixArrayPtr matrix - = build_conversion_matrix(SONY_SGAMUT3::primaries, ACES_AP0::primaries, ADAPTATION_CAT02); + MatrixOpData::MatrixArrayPtr matrix = build_conversion_matrix( + SONY_SGAMUT3::primaries, + ACES_AP0::primaries, + ADAPTATION_CAT02); CreateMatrixOp(ops, matrix, TRANSFORM_DIR_FORWARD); }; - registry.addBuiltin("SONY_SLOG3-SGAMUT3_to_ACES2065-1", - "Convert Sony S-Log3 S-Gamut3 to ACES2065-1", - SONY_SLOG3_SGAMUT3_to_ACES2065_1_Functor); + registry.addBuiltin( + "SONY_SLOG3-SGAMUT3_to_ACES2065-1", + "Convert Sony S-Log3 S-Gamut3 to ACES2065-1", + SONY_SLOG3_SGAMUT3_to_ACES2065_1_Functor); } { - auto SONY_SLOG3_SGAMUT3_CINE_to_ACES2065_1_Functor = [](OpRcPtrVec & ops) - { + auto SONY_SLOG3_SGAMUT3_CINE_to_ACES2065_1_Functor = [](OpRcPtrVec & ops) { LogOpDataRcPtr log = SONY_SLOG3_to_LINEAR::log.clone(); CreateLogOp(ops, log, TRANSFORM_DIR_FORWARD); - MatrixOpData::MatrixArrayPtr matrix - = build_conversion_matrix(SONY_SGAMUT3_CINE::primaries, ACES_AP0::primaries, ADAPTATION_CAT02); + MatrixOpData::MatrixArrayPtr matrix = build_conversion_matrix( + SONY_SGAMUT3_CINE::primaries, + ACES_AP0::primaries, + ADAPTATION_CAT02); CreateMatrixOp(ops, matrix, TRANSFORM_DIR_FORWARD); }; - registry.addBuiltin("SONY_SLOG3-SGAMUT3.CINE_to_ACES2065-1", - "Convert Sony S-Log3 S-Gamut3.Cine to ACES2065-1", - SONY_SLOG3_SGAMUT3_CINE_to_ACES2065_1_Functor); + registry.addBuiltin( + "SONY_SLOG3-SGAMUT3.CINE_to_ACES2065-1", + "Convert Sony S-Log3 S-Gamut3.Cine to ACES2065-1", + SONY_SLOG3_SGAMUT3_CINE_to_ACES2065_1_Functor); } { - auto SONY_SLOG3_SGAMUT3_VENICE_to_ACES2065_1_Functor = [](OpRcPtrVec & ops) - { + auto SONY_SLOG3_SGAMUT3_VENICE_to_ACES2065_1_Functor = [](OpRcPtrVec & ops) { LogOpDataRcPtr log = SONY_SLOG3_to_LINEAR::log.clone(); CreateLogOp(ops, log, TRANSFORM_DIR_FORWARD); // NB: Primaries were not provided for this case, only the matrix. // Note that in CTL, the matrices are stored transposed. + // clang-format off static constexpr double SGAMUT3_VENICE[4 * 4] { 0.7933297411, 0.0890786256, 0.1175916333, 0., @@ -110,22 +110,24 @@ void RegisterAll(BuiltinTransformRegistryImpl & registry) noexcept -0.0188647478, 0.0127694121, 1.0060953358, 0., 0., 0., 0., 1. }; + // clang-format on CreateMatrixOp(ops, &SGAMUT3_VENICE[0], TRANSFORM_DIR_FORWARD); }; - registry.addBuiltin("SONY_SLOG3-SGAMUT3-VENICE_to_ACES2065-1", - "Convert Sony S-Log3 S-Gamut3 for the Venice camera to ACES2065-1", - SONY_SLOG3_SGAMUT3_VENICE_to_ACES2065_1_Functor); + registry.addBuiltin( + "SONY_SLOG3-SGAMUT3-VENICE_to_ACES2065-1", + "Convert Sony S-Log3 S-Gamut3 for the Venice camera to ACES2065-1", + SONY_SLOG3_SGAMUT3_VENICE_to_ACES2065_1_Functor); } { - auto SONY_SLOG3_SGAMUT3_CINE_VENICE_to_ACES2065_1_Functor = [](OpRcPtrVec & ops) - { + auto SONY_SLOG3_SGAMUT3_CINE_VENICE_to_ACES2065_1_Functor = [](OpRcPtrVec & ops) { LogOpDataRcPtr log = SONY_SLOG3_to_LINEAR::log.clone(); CreateLogOp(ops, log, TRANSFORM_DIR_FORWARD); // NB: Primaries were not provided for this case, only the matrix. // Note that in CTL, the matrices are stored transposed. + // clang-format off static constexpr double SGAMUT3_CINE_VENICE[4 * 4] { 0.6742570921, 0.2205717359, 0.1051711720, 0., @@ -133,12 +135,14 @@ void RegisterAll(BuiltinTransformRegistryImpl & registry) noexcept -0.0382090673, -0.0179383766, 1.0561474439, 0., 0., 0., 0., 1. }; + // clang-format on CreateMatrixOp(ops, &SGAMUT3_CINE_VENICE[0], TRANSFORM_DIR_FORWARD); }; - registry.addBuiltin("SONY_SLOG3-SGAMUT3.CINE-VENICE_to_ACES2065-1", - "Convert Sony S-Log3 S-Gamut3.Cine for the Venice camera to ACES2065-1", - SONY_SLOG3_SGAMUT3_CINE_VENICE_to_ACES2065_1_Functor); + registry.addBuiltin( + "SONY_SLOG3-SGAMUT3.CINE-VENICE_to_ACES2065-1", + "Convert Sony S-Log3 S-Gamut3.Cine for the Venice camera to ACES2065-1", + SONY_SLOG3_SGAMUT3_CINE_VENICE_to_ACES2065_1_Functor); } } diff --git a/src/OpenColorIO/transforms/builtins/SonyCameras.h b/src/OpenColorIO/transforms/builtins/SonyCameras.h index 1a53041284..2f1e457aa0 100644 --- a/src/OpenColorIO/transforms/builtins/SonyCameras.h +++ b/src/OpenColorIO/transforms/builtins/SonyCameras.h @@ -1,14 +1,11 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_SONY_CAMERAS_H #define INCLUDED_OCIO_SONY_CAMERAS_H - #include - namespace OCIO_NAMESPACE { diff --git a/src/apps/ocioarchive/main.cpp b/src/apps/ocioarchive/main.cpp index 68054a6daf..db91f71a11 100644 --- a/src/apps/ocioarchive/main.cpp +++ b/src/apps/ocioarchive/main.cpp @@ -1,12 +1,12 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. -#include #include +#include #include -#include #include "utils/StringUtils.h" +#include namespace OCIO = OCIO_NAMESPACE; @@ -23,10 +23,9 @@ namespace OCIO = OCIO_NAMESPACE; static std::vector args; // Fill 'args' array with OpenColorIO arguments. -static int -parse_end_args(int argc, const char *argv[]) +static int parse_end_args(int argc, const char * argv[]) { - while (argc>0) + while (argc > 0) { args.push_back(argv[0]); argc--; @@ -36,7 +35,7 @@ parse_end_args(int argc, const char *argv[]) return 0; } -int main(int argc, const char **argv) +int main(int argc, const char ** argv) { ArgParse ap; std::string inputconfig; @@ -45,14 +44,15 @@ int main(int argc, const char **argv) // Default value is current directory. std::string extractDestination; - bool extract = false; - bool list = false; - bool help = false; + bool extract = false; + bool list = false; + bool help = false; - int32_t err = MZ_OK; - mz_zip_file* file_info = NULL; - void* reader = NULL; + int32_t err = MZ_OK; + mz_zip_file * file_info = NULL; + void * reader = NULL; + // clang-format off ap.options("ocioarchive -- Archive a config and its LUT files or extract a config archive. \n\n" " Note that any existing OCIOZ archive with the same name will be overwritten.\n" " The .ocioz extension will be added to the archive name, if not provided.\n\n" @@ -77,8 +77,9 @@ int main(int argc, const char **argv) "-h", &help, "Display the help and exit", NULL ); + // clang-format on - if (ap.parse (argc, argv) < 0) + if (ap.parse(argc, argv) < 0) { std::cerr << ap.geterror() << std::endl; exit(1); @@ -118,7 +119,6 @@ int main(int argc, const char **argv) std::cerr << "ERROR: Could not load config: " << configFilename << std::endl; exit(1); } - } else if (ocioEnv && *ocioEnv) { @@ -131,8 +131,8 @@ int main(int argc, const char **argv) catch (...) { // Capture any errors and display a custom message. - std::cerr << "ERROR: Could not load config from $OCIO variable: " - << ocioEnv << std::endl; + std::cerr << "ERROR: Could not load config from $OCIO variable: " << ocioEnv + << std::endl; exit(1); } } @@ -142,11 +142,11 @@ int main(int argc, const char **argv) exit(1); } - try + try { // The ocioz extension is added by the archive method. The assumption is that // archiveName is the filename without extension. - + // Do not add ocioz extension if already present. if (!StringUtils::EndsWith(archiveName, ".ocioz")) { @@ -161,7 +161,7 @@ int main(int argc, const char **argv) } else { - std::cerr << "Could not open output stream for: " + std::cerr << "Could not open output stream for: " << archiveName + std::string(OCIO::OCIO_CONFIG_ARCHIVE_FILE_EXT) << std::endl; exit(1); @@ -171,14 +171,14 @@ int main(int argc, const char **argv) { std::cerr << e.what() << std::endl; exit(1); - } + } } catch (OCIO::Exception & exception) { std::cerr << "ERROR: " << exception.what() << std::endl; exit(1); - } - catch (std::exception& exception) + } + catch (std::exception & exception) { std::cerr << "ERROR: " << exception.what() << std::endl; exit(1); @@ -201,7 +201,7 @@ int main(int argc, const char **argv) } archiveName = args[0].c_str(); - try + try { if (extractDestination.empty()) { @@ -209,7 +209,7 @@ int main(int argc, const char **argv) extractDestination = archiveName; // Remove extension, if present. - char * dst = const_cast(extractDestination.c_str()); + char * dst = const_cast(extractDestination.c_str()); mz_path_remove_extension(dst); extractDestination = dst; } @@ -241,7 +241,7 @@ int main(int argc, const char **argv) mz_zip_reader_create(&reader); #endif struct tm tmu_date; - + err = mz_zip_reader_open_file(reader, path.c_str()); if (err != MZ_OK) { @@ -264,7 +264,7 @@ int main(int argc, const char **argv) err = mz_zip_reader_entry_get_info(reader, &file_info); if (err != MZ_OK) { - std::cerr << "ERROR: Could not get information from entry: " << file_info->filename + std::cerr << "ERROR: Could not get information from entry: " << file_info->filename << std::endl; exit(1); } @@ -272,15 +272,20 @@ int main(int argc, const char **argv) mz_zip_time_t_to_tm(file_info->modified_date, &tmu_date); // Print entry information. - printf(" %2.2" PRIu32 "-%2.2" PRIu32 "-%2.2" PRIu32 " %2.2" PRIu32 \ - ":%2.2" PRIu32 " %8.8" PRIx32 " %s\n", - (uint32_t)tmu_date.tm_mon + 1, (uint32_t)tmu_date.tm_mday, - (uint32_t)tmu_date.tm_year % 100, - (uint32_t)tmu_date.tm_hour, (uint32_t)tmu_date.tm_min, - file_info->crc, file_info->filename); + printf( + " %2.2" PRIu32 "-%2.2" PRIu32 "-%2.2" PRIu32 " %2.2" PRIu32 ":%2.2" PRIu32 + " %8.8" PRIx32 " %s\n", + (uint32_t)tmu_date.tm_mon + 1, + (uint32_t)tmu_date.tm_mday, + (uint32_t)tmu_date.tm_year % 100, + (uint32_t)tmu_date.tm_hour, + (uint32_t)tmu_date.tm_min, + file_info->crc, + file_info->filename); err = mz_zip_reader_goto_next_entry(reader); - } while (err == MZ_OK); + } + while (err == MZ_OK); } // Generic error handling. @@ -288,7 +293,8 @@ int main(int argc, const char **argv) else { std::cerr << "Archive, extract, and/or list functions " - "may not be used at the same time." << std::endl; + "may not be used at the same time." + << std::endl; exit(1); } } diff --git a/src/apps/ociobakelut/main.cpp b/src/apps/ociobakelut/main.cpp index 95a9377fa4..9df01f6152 100644 --- a/src/apps/ociobakelut/main.cpp +++ b/src/apps/ociobakelut/main.cpp @@ -1,12 +1,11 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #include #include +#include #include #include -#include #include #include @@ -15,12 +14,11 @@ namespace OCIO = OCIO_NAMESPACE; #include "apputils/argparse.h" #include "ocioicc.h" - static std::string outputfile; -static int parse_end_args(int argc, const char *argv[]) +static int parse_end_args(int argc, const char * argv[]) { - if(argc>0) + if (argc > 0) { outputfile = argv[0]; } @@ -28,13 +26,13 @@ static int parse_end_args(int argc, const char *argv[]) return 0; } -OCIO::GroupTransformRcPtr parse_luts(int argc, const char *argv[]); +OCIO::GroupTransformRcPtr parse_luts(int argc, const char * argv[]); -int main (int argc, const char* argv[]) +int main(int argc, const char * argv[]) { - bool help = false; - int cubesize = -1; + bool help = false; + int cubesize = -1; int shapersize = -1; // cubsize^2 std::string format; std::string inputconfig; @@ -45,7 +43,7 @@ int main (int argc, const char* argv[]) std::string display; std::string view; bool usestdout = false; - bool verbose = false; + bool verbose = false; int whitepointtemp = 6505; std::string displayicc; @@ -55,9 +53,10 @@ int main (int argc, const char* argv[]) // What are the allowed baker output formats? std::ostringstream formats; formats << "the LUT format to bake: "; - for(int i=0; i\n\n" @@ -113,6 +113,7 @@ int main (int argc, const char* argv[]) "--copyright %s", ©right , "a copyright field added in the file (default: \"No copyright. Use freely.\")\n", // TODO: add --metadata option NULL); + // clang-format on if (ap.parse(argc, argv) < 0) { @@ -122,7 +123,7 @@ int main (int argc, const char* argv[]) return 1; } - if (help || (argc == 1 )) + if (help || (argc == 1)) { ap.usage(); std::cout << "\n"; @@ -130,7 +131,7 @@ int main (int argc, const char* argv[]) } // If we're printing to stdout, disable verbose printouts - if(usestdout) + if (usestdout) { verbose = false; } @@ -144,20 +145,20 @@ int main (int argc, const char* argv[]) { groupTransform = parse_luts(argc, argv); } - catch(const OCIO::Exception & e) + catch (const OCIO::Exception & e) { std::cerr << "\nERROR: " << e.what() << std::endl; std::cerr << "See --help for more info." << std::endl; return 1; } - catch(...) + catch (...) { std::cerr << "\nERROR: An unknown error occurred in parse_luts" << std::endl; std::cerr << "See --help for more info." << std::endl; return 1; } - if(!groupTransform) + if (!groupTransform) { std::cerr << "\nERROR: parse_luts returned null transform" << std::endl; std::cerr << "See --help for more info." << std::endl; @@ -166,33 +167,33 @@ int main (int argc, const char* argv[]) // If --luts have been specified, synthesize a new (temporary) configuration // with the transformation embedded in a colorspace. - if(groupTransform->getNumTransforms() > 0) + if (groupTransform->getNumTransforms() > 0) { - if(!inputspace.empty()) + if (!inputspace.empty()) { std::cerr << "\nERROR: --inputspace is not allowed when using --lut\n\n"; std::cerr << "See --help for more info." << std::endl; return 1; } - if(!outputspace.empty()) + if (!outputspace.empty()) { std::cerr << "\nERROR: --outputspace is not allowed when using --lut\n\n"; std::cerr << "See --help for more info." << std::endl; return 1; } - if(!looks.empty()) + if (!looks.empty()) { std::cerr << "\nERROR: --looks is not allowed when using --lut\n\n"; std::cerr << "See --help for more info." << std::endl; return 1; } - if(!shaperspace.empty()) + if (!shaperspace.empty()) { std::cerr << "\nERROR: --shaperspace is not allowed when using --lut\n\n"; std::cerr << "See --help for more info." << std::endl; return 1; } - if(!display.empty() || !view.empty()) + if (!display.empty() || !view.empty()) { std::cerr << "\nERROR: --displayview is not allowed when using --lut\n\n"; std::cerr << "See --help for more info." << std::endl; @@ -202,18 +203,17 @@ int main (int argc, const char* argv[]) OCIO::ConfigRcPtr editableConfig = OCIO::Config::Create(); OCIO::ColorSpaceRcPtr inputColorSpace = OCIO::ColorSpace::Create(); - inputspace = "RawInput"; + inputspace = "RawInput"; inputColorSpace->setName(inputspace.c_str()); editableConfig->addColorSpace(inputColorSpace); OCIO::ColorSpaceRcPtr outputColorSpace = OCIO::ColorSpace::Create(); - outputspace = "ProcessedOutput"; + outputspace = "ProcessedOutput"; outputColorSpace->setName(outputspace.c_str()); - outputColorSpace->setTransform(groupTransform, - OCIO::COLORSPACE_DIR_FROM_REFERENCE); + outputColorSpace->setTransform(groupTransform, OCIO::COLORSPACE_DIR_FROM_REFERENCE); - if(verbose) + if (verbose) { std::cout << "[OpenColorIO DEBUG]: Specified Transform:"; std::cout << *groupTransform; @@ -226,46 +226,46 @@ int main (int argc, const char* argv[]) else { - if(inputspace.empty()) + if (inputspace.empty()) { std::cerr << "\nERROR: You must specify the --inputspace.\n\n"; std::cerr << "See --help for more info." << std::endl; return 1; } - if(outputspace.empty() && (display.empty() && view.empty())) + if (outputspace.empty() && (display.empty() && view.empty())) { std::cerr << "\nERROR: You must specify either --outputspace or --displayview.\n\n"; std::cerr << "See --help for more info." << std::endl; return 1; } - if(display.empty() ^ view.empty()) + if (display.empty() ^ view.empty()) { std::cerr << "\nERROR: You must specify both display and view with --displayview.\n\n"; std::cerr << "See --help for more info." << std::endl; return 1; } - if(format.empty()) + if (format.empty()) { std::cerr << "\nERROR: You must specify the LUT format using --format.\n\n"; std::cerr << "See --help for more info." << std::endl; return 1; } - if(!inputconfig.empty()) + if (!inputconfig.empty()) { - if(!usestdout && verbose) + if (!usestdout && verbose) std::cout << "[OpenColorIO INFO]: Loading " << inputconfig << std::endl; config = OCIO::Config::CreateFromFile(inputconfig.c_str()); } - else if(OCIO::GetEnvVariable("OCIO")) + else if (OCIO::GetEnvVariable("OCIO")) { - if(!usestdout && verbose) + if (!usestdout && verbose) { - std::cout << "[OpenColorIO INFO]: Loading $OCIO " - << OCIO::GetEnvVariable("OCIO") << std::endl; + std::cout << "[OpenColorIO INFO]: Loading $OCIO " << OCIO::GetEnvVariable("OCIO") + << std::endl; } config = OCIO::Config::CreateFromEnv(); } @@ -273,12 +273,12 @@ int main (int argc, const char* argv[]) { std::cerr << "ERROR: You must specify an input OCIO configuration "; std::cerr << "(either with --iconfig or $OCIO).\n\n"; - ap.usage (); + ap.usage(); return 1; } } - if(outputfile.empty() && !usestdout) + if (outputfile.empty() && !usestdout) { std::cerr << "\nERROR: You must specify the outputfile or --stdout.\n\n"; std::cerr << "See --help for more info." << std::endl; @@ -289,35 +289,38 @@ int main (int argc, const char* argv[]) { // This could be moved to OCIO core by adding baking support for ICC // file format, here at the expense of adding the dependency to lcms2. - if(format == "icc") + if (format == "icc") { - if(description.empty()) + if (description.empty()) { description = outputfile; - if(verbose) - std::cout << "[OpenColorIO INFO]: \"--description\" set to default value of filename.icc: " << outputfile << "" << std::endl; + if (verbose) + std::cout << "[OpenColorIO INFO]: \"--description\" set to default value of " + "filename.icc: " + << outputfile << "" << std::endl; } - if(usestdout) + if (usestdout) { std::cerr << "\nERROR: --stdout not supported when writing ICC profiles.\n\n"; std::cerr << "See --help for more info." << std::endl; return 1; } - if(outputfile.empty()) + if (outputfile.empty()) { std::cerr << "ERROR: you need to specify a output ICC path\n"; std::cerr << "See --help for more info." << std::endl; return 1; } - if(!shaperspace.empty()) + if (!shaperspace.empty()) { std::cerr << "WARNING: shaperspace is ignored when generating ICC profiles.\n"; } - if(cubesize<2) cubesize = 32; // default + if (cubesize < 2) + cubesize = 32; // default OCIO::ConstProcessorRcPtr processor; if (!display.empty() && !view.empty()) @@ -343,16 +346,18 @@ int main (int argc, const char* argv[]) processor = config->getProcessor(transform, OCIO::TRANSFORM_DIR_FORWARD); } - OCIO::ConstCPUProcessorRcPtr cpuprocessor = processor->getOptimizedCPUProcessor(OCIO::OPTIMIZATION_LOSSLESS); - - SaveICCProfileToFile(outputfile, - cpuprocessor, - cubesize, - whitepointtemp, - displayicc, - description, - copyright, - verbose); + OCIO::ConstCPUProcessorRcPtr cpuprocessor + = processor->getOptimizedCPUProcessor(OCIO::OPTIMIZATION_LOSSLESS); + + SaveICCProfileToFile( + outputfile, + cpuprocessor, + cubesize, + whitepointtemp, + displayicc, + description, + copyright, + verbose); } else { @@ -367,46 +372,49 @@ int main (int argc, const char* argv[]) baker->setLooks(looks.c_str()); baker->setTargetSpace(outputspace.c_str()); baker->setDisplayView(display.c_str(), view.c_str()); - if(shapersize!=-1) baker->setShaperSize(shapersize); - if(cubesize!=-1) baker->setCubeSize(cubesize); + if (shapersize != -1) + baker->setShaperSize(shapersize); + if (cubesize != -1) + baker->setCubeSize(cubesize); // output LUT std::ostringstream output; - if(!usestdout && verbose) + if (!usestdout && verbose) std::cout << "[OpenColorIO INFO]: Baking '" << format << "' LUT" << std::endl; - if(usestdout) + if (usestdout) { baker->bake(std::cout); } else { std::ofstream f(outputfile.c_str()); - if(f.fail()) + if (f.fail()) { - std::cerr << "ERROR: Non-writable file path " << outputfile << " specified." << std::endl; + std::cerr << "ERROR: Non-writable file path " << outputfile << " specified." + << std::endl; return 1; } baker->bake(f); - if(verbose) + if (verbose) std::cout << "[OpenColorIO INFO]: Wrote '" << outputfile << "'" << std::endl; } } } - catch(OCIO::Exception & exception) + catch (OCIO::Exception & exception) { std::cerr << "OCIO Error: " << exception.what() << std::endl; std::cerr << "See --help for more info." << std::endl; return 1; } - catch (std::exception& exception) + catch (std::exception & exception) { std::cerr << "Error: " << exception.what() << "\n"; std::cerr << "See --help for more info." << std::endl; return 1; } - catch(...) + catch (...) { std::cerr << "Unknown OCIO error encountered." << std::endl; std::cerr << "See --help for more info." << std::endl; @@ -416,7 +424,6 @@ int main (int argc, const char* argv[]) return 0; } - // TODO: Replace this dirty argument parsing code with a clean version // that leverages the same codepath for the standard arguments. If // the OIIO derived argparse does not suffice, options we may want to consider @@ -428,26 +435,26 @@ int main (int argc, const char* argv[]) // then atof() will likely try to convert "--invlut" to its double equivalent, // resulting in an invalid (or at least undesired) scale value. -OCIO::GroupTransformRcPtr parse_luts(int argc, const char *argv[]) +OCIO::GroupTransformRcPtr parse_luts(int argc, const char * argv[]) { OCIO::GroupTransformRcPtr groupTransform = OCIO::GroupTransform::Create(); - const char *lastCCCId = NULL; // Ugly to use this but using GroupTransform::getTransform() - // returns a const object so we must set this - // prior to using --lut for now. + const char * lastCCCId = NULL; // Ugly to use this but using GroupTransform::getTransform() + // returns a const object so we must set this + // prior to using --lut for now. - for(int i=0; i=argc) + if (i + 1 >= argc) { throw OCIO::Exception("Error parsing --lut. Invalid num args"); } OCIO::FileTransformRcPtr t = OCIO::FileTransform::Create(); - t->setSrc(argv[i+1]); + t->setSrc(argv[i + 1]); t->setInterpolation(OCIO::INTERP_BEST); if (lastCCCId) { @@ -457,35 +464,35 @@ OCIO::GroupTransformRcPtr parse_luts(int argc, const char *argv[]) i += 1; } - else if(arg == "--cccid" || arg == "-cccid") + else if (arg == "--cccid" || arg == "-cccid") { - if(i+1>=argc) + if (i + 1 >= argc) { throw OCIO::Exception("Error parsing --cccid. Invalid num args"); } - lastCCCId = argv[i+1]; + lastCCCId = argv[i + 1]; i += 1; } - else if(arg == "--invlut" || arg == "-invlut") + else if (arg == "--invlut" || arg == "-invlut") { - if(i+1>=argc) + if (i + 1 >= argc) { throw OCIO::Exception("Error parsing --invlut. Invalid num args"); } OCIO::FileTransformRcPtr t = OCIO::FileTransform::Create(); - t->setSrc(argv[i+1]); + t->setSrc(argv[i + 1]); t->setInterpolation(OCIO::INTERP_BEST); t->setDirection(OCIO::TRANSFORM_DIR_INVERSE); groupTransform->appendTransform(t); i += 1; } - else if(arg == "--slope" || arg == "-slope") + else if (arg == "--slope" || arg == "-slope") { - if(i+3>=argc) + if (i + 3 >= argc) { throw OCIO::Exception("Error parsing --slope. Invalid num args"); } @@ -493,17 +500,17 @@ OCIO::GroupTransformRcPtr parse_luts(int argc, const char *argv[]) OCIO::CDLTransformRcPtr t = OCIO::CDLTransform::Create(); double scale[3]; - scale[0] = atof(argv[i+1]); - scale[1] = atof(argv[i+2]); - scale[2] = atof(argv[i+3]); + scale[0] = atof(argv[i + 1]); + scale[1] = atof(argv[i + 2]); + scale[2] = atof(argv[i + 3]); t->setSlope(scale); groupTransform->appendTransform(t); i += 3; } - else if(arg == "--offset" || arg == "-offset") + else if (arg == "--offset" || arg == "-offset") { - if(i+3>=argc) + if (i + 3 >= argc) { throw OCIO::Exception("Error parsing --offset. Invalid num args"); } @@ -511,17 +518,17 @@ OCIO::GroupTransformRcPtr parse_luts(int argc, const char *argv[]) OCIO::CDLTransformRcPtr t = OCIO::CDLTransform::Create(); double offset[3]; - offset[0] = atof(argv[i+1]); - offset[1] = atof(argv[i+2]); - offset[2] = atof(argv[i+3]); + offset[0] = atof(argv[i + 1]); + offset[1] = atof(argv[i + 2]); + offset[2] = atof(argv[i + 3]); t->setOffset(offset); groupTransform->appendTransform(t); i += 3; } - else if(arg == "--offset10" || arg == "-offset10") + else if (arg == "--offset10" || arg == "-offset10") { - if(i+3>=argc) + if (i + 3 >= argc) { throw OCIO::Exception("Error parsing --offset10. Invalid num args"); } @@ -529,16 +536,16 @@ OCIO::GroupTransformRcPtr parse_luts(int argc, const char *argv[]) OCIO::CDLTransformRcPtr t = OCIO::CDLTransform::Create(); double offset[3]; - offset[0] = atof(argv[i+1]) / 1023.0; - offset[1] = atof(argv[i+2]) / 1023.0; - offset[2] = atof(argv[i+3]) / 1023.0; + offset[0] = atof(argv[i + 1]) / 1023.0; + offset[1] = atof(argv[i + 2]) / 1023.0; + offset[2] = atof(argv[i + 3]) / 1023.0; t->setOffset(offset); groupTransform->appendTransform(t); i += 3; } - else if(arg == "--power" || arg == "-power") + else if (arg == "--power" || arg == "-power") { - if(i+3>=argc) + if (i + 3 >= argc) { throw OCIO::Exception("Error parsing --power. Invalid num args"); } @@ -546,23 +553,23 @@ OCIO::GroupTransformRcPtr parse_luts(int argc, const char *argv[]) OCIO::CDLTransformRcPtr t = OCIO::CDLTransform::Create(); double power[3]; - power[0] = atof(argv[i+1]); - power[1] = atof(argv[i+2]); - power[2] = atof(argv[i+3]); + power[0] = atof(argv[i + 1]); + power[1] = atof(argv[i + 2]); + power[2] = atof(argv[i + 3]); t->setPower(power); groupTransform->appendTransform(t); i += 3; } - else if(arg == "--sat" || arg == "-sat") + else if (arg == "--sat" || arg == "-sat") { - if(i+1>=argc) + if (i + 1 >= argc) { throw OCIO::Exception("Error parsing --sat. Invalid num args"); } OCIO::CDLTransformRcPtr t = OCIO::CDLTransform::Create(); - t->setSat(atof(argv[i+1])); + t->setSat(atof(argv[i + 1])); groupTransform->appendTransform(t); i += 1; diff --git a/src/apps/ociobakelut/ocioicc.cpp b/src/apps/ociobakelut/ocioicc.cpp index 55f5d7e407..f4405853c0 100644 --- a/src/apps/ociobakelut/ocioicc.cpp +++ b/src/apps/ociobakelut/ocioicc.cpp @@ -1,13 +1,13 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. +#include #include -#include #include +#include #include #include #include -#include #include @@ -19,10 +19,9 @@ namespace OCIO_NAMESPACE { - namespace { -void ErrorHandler(cmsContext /*ContextID*/, cmsUInt32Number /*ErrorCode*/, const char *Text) +void ErrorHandler(cmsContext /*ContextID*/, cmsUInt32Number /*ErrorCode*/, const char * Text) { std::cerr << "OCIO Error: " << Text << "\n"; return; @@ -32,14 +31,14 @@ typedef struct { cmsHTRANSFORM to_PCS16; cmsHTRANSFORM from_PCS16; - //OCIO::ConstProcessorRcPtr shaper_processor; + // OCIO::ConstProcessorRcPtr shaper_processor; OCIO::ConstCPUProcessorRcPtr processor; } SamplerData; -static void Add3GammaCurves(cmsPipeline* lut, cmsFloat64Number Curve) +static void Add3GammaCurves(cmsPipeline * lut, cmsFloat64Number Curve) { - cmsToneCurve* id = cmsBuildGamma(NULL, Curve); - cmsToneCurve* id3[3]; + cmsToneCurve * id = cmsBuildGamma(NULL, Curve); + cmsToneCurve * id3[3]; id3[0] = id; id3[1] = id; id3[2] = id; @@ -47,23 +46,21 @@ static void Add3GammaCurves(cmsPipeline* lut, cmsFloat64Number Curve) cmsFreeToneCurve(id); } -static void AddIdentityMatrix(cmsPipeline* lut) +static void AddIdentityMatrix(cmsPipeline * lut) { - const cmsFloat64Number Identity[] = { - 1, 0, 0, - 0, 1, 0, - 0, 0, 1, - 0, 0, 0 }; + const cmsFloat64Number Identity[] = {1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0}; cmsPipelineInsertStage(lut, cmsAT_END, cmsStageAllocMatrix(NULL, 3, 3, Identity, NULL)); } -static cmsInt32Number Display2PCS_Sampler16(const cmsUInt16Number in[], cmsUInt16Number out[], void* userdata) +static cmsInt32Number +Display2PCS_Sampler16(const cmsUInt16Number in[], cmsUInt16Number out[], void * userdata) { - //std::cout << "r" << in[0] << " g" << in[1] << " b" << in[2] << "\n"; - SamplerData* data = (SamplerData*) userdata; - cmsFloat32Number pix[3] = { static_cast(in[0])/65535.f, - static_cast(in[1])/65535.f, - static_cast(in[2])/65535.f}; + // std::cout << "r" << in[0] << " g" << in[1] << " b" << in[2] << "\n"; + SamplerData * data = (SamplerData *)userdata; + cmsFloat32Number pix[3] + = {static_cast(in[0]) / 65535.f, + static_cast(in[1]) / 65535.f, + static_cast(in[2]) / 65535.f}; data->processor->applyRGB(pix); out[0] = (cmsUInt16Number)std::max(std::min(pix[0] * 65535.f, 65535.f), 0.f); out[1] = (cmsUInt16Number)std::max(std::min(pix[1] * 65535.f, 65535.f), 0.f); @@ -72,25 +69,26 @@ static cmsInt32Number Display2PCS_Sampler16(const cmsUInt16Number in[], cmsUInt1 return 1; } -static cmsInt32Number PCS2Display_Sampler16(const cmsUInt16Number in[], cmsUInt16Number out[], void* userdata) +static cmsInt32Number +PCS2Display_Sampler16(const cmsUInt16Number in[], cmsUInt16Number out[], void * userdata) { - //std::cout << "r" << in[0] << " g" << in[1] << " b" << in[2] << "\n"; - SamplerData* data = (SamplerData*) userdata; + // std::cout << "r" << in[0] << " g" << in[1] << " b" << in[2] << "\n"; + SamplerData * data = (SamplerData *)userdata; cmsDoTransform(data->from_PCS16, in, out, 1); // we don't have a reverse Lab -> Display transform return 1; } -} // anon namespace - - -void SaveICCProfileToFile(const std::string & outputfile, - ConstCPUProcessorRcPtr & processor, - int cubesize, - int whitepointtemp, - const std::string & displayicc, - const std::string & description, - const std::string & copyright, - bool verbose) +} // namespace + +void SaveICCProfileToFile( + const std::string & outputfile, + ConstCPUProcessorRcPtr & processor, + int cubesize, + int whitepointtemp, + const std::string & displayicc, + const std::string & description, + const std::string & copyright, + bool verbose) { // Create the ICC Profile @@ -107,13 +105,15 @@ void SaveICCProfileToFile(const std::string & outputfile, // Display (OCIO sRGB cube -> LAB) cmsHPROFILE DisplayProfile; - if(displayicc != "") DisplayProfile = cmsOpenProfileFromFile(displayicc.c_str(), "r"); - else DisplayProfile = cmsCreate_sRGBProfileTHR(NULL); + if (displayicc != "") + DisplayProfile = cmsOpenProfileFromFile(displayicc.c_str(), "r"); + else + DisplayProfile = cmsCreate_sRGBProfileTHR(NULL); // Create an empty RGB Profile cmsHPROFILE hProfile = cmsCreateRGBProfileTHR(NULL, &whitePoint, NULL, NULL); - if(verbose) + if (verbose) std::cout << "[OpenColorIO INFO]: Setting up Profile: " << outputfile << "\n"; // Added Header fields @@ -124,8 +124,8 @@ void SaveICCProfileToFile(const std::string & outputfile, cmsSetHeaderRenderingIntent(hProfile, INTENT_PERCEPTUAL); // - cmsMLU* DescriptionMLU = cmsMLUalloc(NULL, 1); - cmsMLU* CopyrightMLU = cmsMLUalloc(NULL, 1); + cmsMLU * DescriptionMLU = cmsMLUalloc(NULL, 1); + cmsMLU * CopyrightMLU = cmsMLUalloc(NULL, 1); cmsMLUsetASCII(DescriptionMLU, "en", "US", description.c_str()); cmsMLUsetASCII(CopyrightMLU, "en", "US", copyright.c_str()); cmsWriteTag(hProfile, cmsSigProfileDescriptionTag, DescriptionMLU); @@ -136,10 +136,20 @@ void SaveICCProfileToFile(const std::string & outputfile, data.processor = processor; // 16Bit - data.to_PCS16 = cmsCreateTransform(DisplayProfile, TYPE_RGB_16, labProfile, TYPE_LabV2_16, - INTENT_PERCEPTUAL, cmsFLAGS_NOOPTIMIZE|cmsFLAGS_NOCACHE); - data.from_PCS16 = cmsCreateTransform(labProfile, TYPE_LabV2_16, DisplayProfile, TYPE_RGB_16, - INTENT_PERCEPTUAL, cmsFLAGS_NOOPTIMIZE|cmsFLAGS_NOCACHE); + data.to_PCS16 = cmsCreateTransform( + DisplayProfile, + TYPE_RGB_16, + labProfile, + TYPE_LabV2_16, + INTENT_PERCEPTUAL, + cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE); + data.from_PCS16 = cmsCreateTransform( + labProfile, + TYPE_LabV2_16, + DisplayProfile, + TYPE_RGB_16, + INTENT_PERCEPTUAL, + cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE); // // AToB0Tag - Device to PCS (16-bit) intent of 0 (perceptual) @@ -151,16 +161,16 @@ void SaveICCProfileToFile(const std::string & outputfile, // `- cmsSigCurveSetElemType // - if(verbose) + if (verbose) std::cout << "[OpenColorIO INFO]: Adding AToB0Tag\n"; - cmsPipeline* AToB0Tag = cmsPipelineAlloc(NULL, 3, 3); + cmsPipeline * AToB0Tag = cmsPipelineAlloc(NULL, 3, 3); Add3GammaCurves(AToB0Tag, 1.f); // cmsSigCurveSetElemType // cmsSigCLutElemType - cmsStage* AToB0Clut = cmsStageAllocCLut16bit(NULL, cubesize, 3, 3, NULL); + cmsStage * AToB0Clut = cmsStageAllocCLut16bit(NULL, cubesize, 3, 3, NULL); - if(verbose) + if (verbose) std::cout << "[OpenColorIO INFO]: Sampling AToB0 CLUT from Display to Lab\n"; cmsStageSampleCLut16bit(AToB0Clut, Display2PCS_Sampler16, &data, 0); cmsPipelineInsertStage(AToB0Tag, cmsAT_END, AToB0Clut); @@ -179,20 +189,20 @@ void SaveICCProfileToFile(const std::string & outputfile, // cmsSigCurveSetElemType // `- cmsSigMatrixElemType // `- cmsSigCurveSetElemType - // `- cmsSigCLutElemType + // `- cmsSigCLutElemType // `- cmsSigCurveSetElemType // - if(verbose) + if (verbose) std::cout << "[OpenColorIO INFO]: Adding BToA0Tag\n"; - cmsPipeline* BToA0Tag = cmsPipelineAlloc(NULL, 3, 3); + cmsPipeline * BToA0Tag = cmsPipelineAlloc(NULL, 3, 3); Add3GammaCurves(BToA0Tag, 1.f); // cmsSigCurveSetElemType AddIdentityMatrix(BToA0Tag); // cmsSigMatrixElemType Add3GammaCurves(BToA0Tag, 1.f); // cmsSigCurveSetElemType // cmsSigCLutElemType - cmsStage* BToA0Clut = cmsStageAllocCLut16bit(NULL, cubesize, 3, 3, NULL); - if(verbose) + cmsStage * BToA0Clut = cmsStageAllocCLut16bit(NULL, cubesize, 3, 3, NULL); + if (verbose) std::cout << "[OpenColorIO INFO]: Sampling BToA0 CLUT from Lab to Display\n"; cmsStageSampleCLut16bit(BToA0Clut, PCS2Display_Sampler16, &data, 0); cmsPipelineInsertStage(BToA0Tag, cmsAT_END, BToA0Clut); @@ -214,12 +224,12 @@ void SaveICCProfileToFile(const std::string & outputfile, // // Write // - if(verbose) + if (verbose) std::cout << "[OpenColorIO INFO]: Writing " << outputfile << std::endl; cmsSaveProfileToFile(hProfile, outputfile.c_str()); cmsCloseProfile(hProfile); - if(verbose) + if (verbose) std::cout << "[OpenColorIO INFO]: Finished\n"; } diff --git a/src/apps/ociobakelut/ocioicc.h b/src/apps/ociobakelut/ocioicc.h index 2d48d45135..5c0c35ce67 100644 --- a/src/apps/ociobakelut/ocioicc.h +++ b/src/apps/ociobakelut/ocioicc.h @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_OCIOICC_H #define INCLUDED_OCIO_OCIOICC_H @@ -30,16 +29,16 @@ namespace OCIO_NAMESPACE // source to PCS illuminant. Required only if the actual // illumination source is not D50. -void SaveICCProfileToFile(const std::string & outputfile, - ConstCPUProcessorRcPtr & processor, - int cubesize, - int whitepointtemp, - const std::string & displayicc, - const std::string & description, - const std::string & copyright, - bool verbose); +void SaveICCProfileToFile( + const std::string & outputfile, + ConstCPUProcessorRcPtr & processor, + int cubesize, + int whitepointtemp, + const std::string & displayicc, + const std::string & description, + const std::string & copyright, + bool verbose); } // namespace OCIO_NAMESPACE #endif - diff --git a/src/apps/ociocheck/main.cpp b/src/apps/ociocheck/main.cpp index b3c8c33854..1679f96331 100644 --- a/src/apps/ociocheck/main.cpp +++ b/src/apps/ociocheck/main.cpp @@ -2,8 +2,8 @@ // Copyright Contributors to the OpenColorIO Project. #include -#include #include +#include #include #include @@ -14,32 +14,34 @@ namespace OCIO = OCIO_NAMESPACE; #include "apputils/logGuard.h" #include "utils/StringUtils.h" - -const char * DESC_STRING = "\n\n" -"Ociocheck is useful to validate that the specified OCIO configuration\n" -"is valid, and that all the color transforms are defined and loadable.\n" -"For example, it is possible that the configuration may reference\n" -"lookup tables that do not exist and ociocheck will find these cases.\n" -"Unlike the config validate method, ociocheck parses all required LUTs.\n" -"All display/view pairs, color spaces, and named transforms are checked,\n" -"regardless of whether they are active or inactive.\n\n" -"Ociocheck can also be used to clean up formatting on an existing profile\n" -"that has been manually edited, using the '-o' option.\n"; - -int main(int argc, const char **argv) +const char * DESC_STRING + = "\n\n" + "Ociocheck is useful to validate that the specified OCIO configuration\n" + "is valid, and that all the color transforms are defined and loadable.\n" + "For example, it is possible that the configuration may reference\n" + "lookup tables that do not exist and ociocheck will find these cases.\n" + "Unlike the config validate method, ociocheck parses all required LUTs.\n" + "All display/view pairs, color spaces, and named transforms are checked,\n" + "regardless of whether they are active or inactive.\n\n" + "Ociocheck can also be used to clean up formatting on an existing profile\n" + "that has been manually edited, using the '-o' option.\n"; + +int main(int argc, const char ** argv) { - bool help = false; + bool help = false; int errorcount = 0; std::string inputconfig; std::string outputconfig; ArgParse ap; + // clang-format off ap.options("ociocheck -- validate an OpenColorIO configuration\n\n" "usage: ociocheck [options]\n", "--help", &help, "Print help message", "--iconfig %s", &inputconfig, "Input .ocio configuration file (default: $OCIO)", "--oconfig %s", &outputconfig, "Output .ocio file", NULL); + // clang-format on if (ap.parse(argc, argv) < 0) { @@ -67,13 +69,13 @@ int main(int argc, const char **argv) std::cout << "OpenColorIO Library Version: " << OCIO::GetVersion() << std::endl; std::cout << "OpenColorIO Library VersionHex: " << OCIO::GetVersionHex() << std::endl; - if(!inputconfig.empty()) + if (!inputconfig.empty()) { std::cout << std::endl; std::cout << "Loading " << inputconfig << std::endl; srcConfig = OCIO::Config::CreateFromFile(inputconfig.c_str()); } - else if(OCIO::GetEnvVariable("OCIO")) + else if (OCIO::GetEnvVariable("OCIO")) { std::cout << std::endl; std::cout << "Loading $OCIO " << OCIO::GetEnvVariable("OCIO") << std::endl; @@ -84,7 +86,7 @@ int main(int argc, const char **argv) std::cout << std::endl; std::cout << "ERROR: You must specify an input OCIO configuration "; std::cout << "(either with --iconfig or $OCIO).\n"; - ap.usage (); + ap.usage(); std::cout << DESC_STRING; return 1; } @@ -103,8 +105,7 @@ int main(int argc, const char **argv) for (int idx = 0; idx < config->getNumEnvironmentVars(); ++idx) { const char * name = config->getEnvironmentVarNameByIndex(idx); - std::cout << " " << name - << ": " << config->getEnvironmentVarDefault(name) + std::cout << " " << name << ": " << config->getEnvironmentVarDefault(name) << std::endl; } } @@ -133,7 +134,8 @@ int main(int argc, const char **argv) { std::cout << std::endl; std::cout << "Default Display: " << config->getDefaultDisplay() << std::endl; - std::cout << "Default View: " << config->getDefaultView(config->getDefaultDisplay()) << std::endl; + std::cout << "Default View: " << config->getDefaultView(config->getDefaultDisplay()) + << std::endl; // It's important that the getProcessor call below always loads the transforms // involved in each display/view pair. However, if the src color space is a @@ -143,7 +145,7 @@ int main(int argc, const char **argv) // src color space that will definitely allow the Processor to be created. OCIO::ConfigRcPtr displayTestConfig = config->createEditableCopy(); - auto cs = OCIO::ColorSpace::Create(OCIO::REFERENCE_SPACE_SCENE); + auto cs = OCIO::ColorSpace::Create(OCIO::REFERENCE_SPACE_SCENE); const std::string srcColorSpace = "ocioCheckTotallyUniqueColorSpaceName"; cs->setName(srcColorSpace.c_str()); auto ff = OCIO::FixedFunctionTransform::Create(OCIO::FIXED_FUNCTION_ACES_GLOW_10); @@ -165,21 +167,19 @@ int main(int argc, const char **argv) int numViews = config->getNumViews(OCIO::VIEW_SHARED, displayName); for (int idxView = 0; idxView < numViews; ++idxView) { - const char * viewName = config->getView(OCIO::VIEW_SHARED, - displayName, - idxView); + const char * viewName + = config->getView(OCIO::VIEW_SHARED, displayName, idxView); try { - OCIO::ConstProcessorRcPtr process - = displayTestConfig->getProcessor(srcColorSpace.c_str(), - displayName, - viewName, - OCIO::TRANSFORM_DIR_FORWARD); - - std::cout << "(" << displayName << ", " << viewName << ")" - << std::endl; + OCIO::ConstProcessorRcPtr process = displayTestConfig->getProcessor( + srcColorSpace.c_str(), + displayName, + viewName, + OCIO::TRANSFORM_DIR_FORWARD); + + std::cout << "(" << displayName << ", " << viewName << ")" << std::endl; } - catch(OCIO::Exception & exception) + catch (OCIO::Exception & exception) { std::cout << "ERROR: " << exception.what() << std::endl; errorcount += 1; @@ -190,20 +190,19 @@ int main(int argc, const char **argv) numViews = config->getNumViews(OCIO::VIEW_DISPLAY_DEFINED, displayName); for (int idxView = 0; idxView < numViews; ++idxView) { - const char * viewName = config->getView(OCIO::VIEW_DISPLAY_DEFINED, - displayName, idxView); + const char * viewName + = config->getView(OCIO::VIEW_DISPLAY_DEFINED, displayName, idxView); try { - OCIO::ConstProcessorRcPtr process - = displayTestConfig->getProcessor(srcColorSpace.c_str(), - displayName, - viewName, - OCIO::TRANSFORM_DIR_FORWARD); - - std::cout << "(" << displayName << ", " << viewName << ")" - << std::endl; + OCIO::ConstProcessorRcPtr process = displayTestConfig->getProcessor( + srcColorSpace.c_str(), + displayName, + viewName, + OCIO::TRANSFORM_DIR_FORWARD); + + std::cout << "(" << displayName << ", " << viewName << ")" << std::endl; } - catch(OCIO::Exception & exception) + catch (OCIO::Exception & exception) { std::cout << "ERROR: " << exception.what() << std::endl; errorcount += 1; @@ -218,30 +217,29 @@ int main(int argc, const char **argv) std::cout << "** Roles **" << std::endl; // All roles defined in OpenColorTypes.h. - std::set allRolesSet = { - OCIO::ROLE_DEFAULT, - OCIO::ROLE_SCENE_LINEAR, - OCIO::ROLE_DATA, - OCIO::ROLE_REFERENCE, - OCIO::ROLE_COMPOSITING_LOG, - OCIO::ROLE_COLOR_TIMING, - OCIO::ROLE_COLOR_PICKING, - OCIO::ROLE_TEXTURE_PAINT, - OCIO::ROLE_MATTE_PAINT, - OCIO::ROLE_RENDERING, - OCIO::ROLE_INTERCHANGE_SCENE, - OCIO::ROLE_INTERCHANGE_DISPLAY - }; + std::set allRolesSet + = {OCIO::ROLE_DEFAULT, + OCIO::ROLE_SCENE_LINEAR, + OCIO::ROLE_DATA, + OCIO::ROLE_REFERENCE, + OCIO::ROLE_COMPOSITING_LOG, + OCIO::ROLE_COLOR_TIMING, + OCIO::ROLE_COLOR_PICKING, + OCIO::ROLE_TEXTURE_PAINT, + OCIO::ROLE_MATTE_PAINT, + OCIO::ROLE_RENDERING, + OCIO::ROLE_INTERCHANGE_SCENE, + OCIO::ROLE_INTERCHANGE_DISPLAY}; // Print a list of the config's roles, appending ": user" if they are not one // of the "standard" roles defined in the library. - for(int i=0; igetNumRoles(); ++i) + for (int i = 0; i < config->getNumRoles(); ++i) { - const char * role = config->getRoleName(i); + const char * role = config->getRoleName(i); OCIO::ConstColorSpaceRcPtr cs = config->getColorSpace(role); - if(cs) + if (cs) { - if(allRolesSet.find(role) != allRolesSet.end()) + if (allRolesSet.find(role) != allRolesSet.end()) { std::cout << cs->getName() << " (" << role << ")" << std::endl; } @@ -268,15 +266,15 @@ int main(int argc, const char **argv) OCIO::ROLE_COMPOSITING_LOG, // LogConvert plug-in OCIO::ROLE_INTERCHANGE_SCENE, // Used by the library OCIO::ROLE_INTERCHANGE_DISPLAY, // Used by the library - }; + }; // Print a warning for any essential roles that are missing. // (Subsequent sections may raise an error.) - for(size_t i=0;igetColorSpace(role.c_str()); - if(!cs) + if (!cs) { std::cout << "WARNING: NOT DEFINED (" << role << ")" << std::endl; } @@ -288,30 +286,32 @@ int main(int argc, const char **argv) std::cout << "** ColorSpaces **" << std::endl; const int numCS = config->getNumColorSpaces( - OCIO::SEARCH_REFERENCE_SPACE_ALL, // Iterate over scene & display color spaces. - OCIO::COLORSPACE_ALL); // Iterate over active & inactive color spaces. + OCIO::SEARCH_REFERENCE_SPACE_ALL, // Iterate over scene & display color spaces. + OCIO::COLORSPACE_ALL); // Iterate over active & inactive color spaces. - for(int i=0; igetColorSpace(config->getColorSpaceNameByIndex( - OCIO::SEARCH_REFERENCE_SPACE_ALL, - OCIO::COLORSPACE_ALL, - i)); + OCIO::ConstColorSpaceRcPtr cs + = config->getColorSpace(config->getColorSpaceNameByIndex( + OCIO::SEARCH_REFERENCE_SPACE_ALL, + OCIO::COLORSPACE_ALL, + i)); // Try to load the transform for the to_ref direction -- this will load any LUTs. bool toRefOK = true; std::string toRefErrorText; try { - OCIO::ConstTransformRcPtr t = cs->getTransform(OCIO::COLORSPACE_DIR_TO_REFERENCE); - if(t) + OCIO::ConstTransformRcPtr t + = cs->getTransform(OCIO::COLORSPACE_DIR_TO_REFERENCE); + if (t) { OCIO::ConstProcessorRcPtr p = config->getProcessor(t); } } - catch(OCIO::Exception & exception) + catch (OCIO::Exception & exception) { - toRefOK = false; + toRefOK = false; toRefErrorText = exception.what(); } @@ -320,28 +320,29 @@ int main(int argc, const char **argv) std::string fromRefErrorText; try { - OCIO::ConstTransformRcPtr t = cs->getTransform(OCIO::COLORSPACE_DIR_FROM_REFERENCE); - if(t) + OCIO::ConstTransformRcPtr t + = cs->getTransform(OCIO::COLORSPACE_DIR_FROM_REFERENCE); + if (t) { OCIO::ConstProcessorRcPtr p = config->getProcessor(t); } } - catch(OCIO::Exception & exception) + catch (OCIO::Exception & exception) { - fromRefOK = false; + fromRefOK = false; fromRefErrorText = exception.what(); } - if(!toRefOK || !fromRefOK) + if (!toRefOK || !fromRefOK) { // There was a problem with one of the color space's transforms. std::cout << cs->getName(); std::cout << " -- error" << std::endl; - if(!toRefOK) + if (!toRefOK) { std::cout << "\t" << toRefErrorText << std::endl; } - if(!fromRefOK) + if (!fromRefOK) { std::cout << "\t" << fromRefErrorText << std::endl; } @@ -361,12 +362,12 @@ int main(int argc, const char **argv) // Iterate over active & inactive named transforms. const int numNT = config->getNumNamedTransforms(OCIO::NAMEDTRANSFORM_ALL); - if(numNT==0) + if (numNT == 0) { std::cout << "no named transforms defined" << std::endl; } - for(int i = 0; igetNamedTransform( config->getNamedTransformNameByIndex(OCIO::NAMEDTRANSFORM_ALL, i)); @@ -377,14 +378,14 @@ int main(int argc, const char **argv) try { OCIO::ConstTransformRcPtr t = nt->getTransform(OCIO::TRANSFORM_DIR_FORWARD); - if(t) + if (t) { OCIO::ConstProcessorRcPtr p = config->getProcessor(t); } } - catch(OCIO::Exception & exception) + catch (OCIO::Exception & exception) { - fwdOK = false; + fwdOK = false; fwdErrorText = exception.what(); } @@ -394,27 +395,27 @@ int main(int argc, const char **argv) try { OCIO::ConstTransformRcPtr t = nt->getTransform(OCIO::TRANSFORM_DIR_INVERSE); - if(t) + if (t) { OCIO::ConstProcessorRcPtr p = config->getProcessor(t); } } - catch(OCIO::Exception & exception) + catch (OCIO::Exception & exception) { - invOK = false; + invOK = false; invErrorText = exception.what(); } - if(!fwdOK || !invOK) + if (!fwdOK || !invOK) { // There was a problem with one of the named transform's transforms. std::cout << nt->getName(); std::cout << " -- error" << std::endl; - if(!fwdOK) + if (!fwdOK) { std::cout << "\t" << fwdErrorText << std::endl; } - if(!invOK) + if (!invOK) { std::cout << "\t" << invErrorText << std::endl; } @@ -433,14 +434,14 @@ int main(int argc, const char **argv) std::cout << "** Looks **" << std::endl; const int numL = config->getNumLooks(); - if(numL==0) + if (numL == 0) { std::cout << "no looks defined" << std::endl; } - for(int i=0; igetLook(config->getLookNameByIndex(i)); + OCIO::ConstLookRcPtr look = config->getLook(config->getLookNameByIndex(i)); // Try to load the transform -- this will load any LUTs. bool fwdOK = true; @@ -448,14 +449,14 @@ int main(int argc, const char **argv) try { OCIO::ConstTransformRcPtr t = look->getTransform(); - if(t) + if (t) { OCIO::ConstProcessorRcPtr p = config->getProcessor(t); } } - catch(OCIO::Exception & exception) + catch (OCIO::Exception & exception) { - fwdOK = false; + fwdOK = false; fwdErrorText = exception.what(); } @@ -465,27 +466,27 @@ int main(int argc, const char **argv) try { OCIO::ConstTransformRcPtr t = look->getInverseTransform(); - if(t) + if (t) { OCIO::ConstProcessorRcPtr p = config->getProcessor(t); } } - catch(OCIO::Exception & exception) + catch (OCIO::Exception & exception) { - invOK = false; + invOK = false; invErrorText = exception.what(); } - if(!fwdOK || !invOK) + if (!fwdOK || !invOK) { // There was a problem with one of the look transform's transforms. std::cout << look->getName(); std::cout << " -- error" << std::endl; - if(!fwdOK) + if (!fwdOK) { std::cout << "\t" << fwdErrorText << std::endl; } - if(!invOK) + if (!invOK) { std::cout << "\t" << invErrorText << std::endl; } @@ -510,8 +511,8 @@ int main(int argc, const char **argv) config->validate(); std::cout << logGuard.output(); - - cacheID = config->getCacheID(); + + cacheID = config->getCacheID(); isArchivable = config->isArchivable(); // Passed if there are no Error level logs. @@ -526,7 +527,7 @@ int main(int argc, const char **argv) errorcount += 1; } } - catch(OCIO::Exception & exception) + catch (OCIO::Exception & exception) { std::cout << "ERROR:" << std::endl; errorcount += 1; @@ -539,12 +540,12 @@ int main(int argc, const char **argv) std::cout << "CacheID: " << cacheID << std::endl; std::cout << "Archivable: " << (isArchivable ? "yes" : "no") << std::endl; - if(!outputconfig.empty()) + if (!outputconfig.empty()) { std::ofstream output; output.open(outputconfig.c_str()); - if(!output.is_open()) + if (!output.is_open()) { std::cout << "Error opening " << outputconfig << " for writing." << std::endl; } @@ -556,22 +557,24 @@ int main(int argc, const char **argv) } } } - catch(OCIO::Exception & exception) + catch (OCIO::Exception & exception) { std::cout << "ERROR: " << exception.what() << std::endl; return 1; - } catch (std::exception& exception) { + } + catch (std::exception & exception) + { std::cout << "ERROR: " << exception.what() << "\n"; return 1; } - catch(...) + catch (...) { std::cout << "Unknown error encountered." << std::endl; return 1; } std::cout << std::endl; - if(errorcount == 0) + if (errorcount == 0) { std::cout << "Tests complete." << std::endl << std::endl; return 0; diff --git a/src/apps/ociochecklut/main.cpp b/src/apps/ociochecklut/main.cpp index 9469090a15..d81a151acc 100644 --- a/src/apps/ociochecklut/main.cpp +++ b/src/apps/ociochecklut/main.cpp @@ -22,8 +22,8 @@ namespace class ProcessorWrapper { public: - ProcessorWrapper() = delete; - ProcessorWrapper(const ProcessorWrapper &) = delete; + ProcessorWrapper() = delete; + ProcessorWrapper(const ProcessorWrapper &) = delete; ProcessorWrapper & operator=(const ProcessorWrapper &) = delete; explicit ProcessorWrapper(bool verbose) @@ -41,10 +41,7 @@ class ProcessorWrapper #endif // OCIO_GPU_ENABLED } - void setCPU(OCIO::ConstCPUProcessorRcPtr cpu) - { - m_cpu = cpu; - } + void setCPU(OCIO::ConstCPUProcessorRcPtr cpu) { m_cpu = cpu; } #ifdef OCIO_GPU_ENABLED void setGPU(OCIO::ConstGPUProcessorRcPtr gpu) @@ -61,7 +58,7 @@ class ProcessorWrapper } m_oglApp->setPrintShader(m_verbose); - float image[4]{ 0.f, 0.f, 0.f, 0.f }; + float image[4]{0.f, 0.f, 0.f, 0.f}; m_oglApp->initImage(1, 1, OCIO::OglApp::COMPONENTS_RGBA, image); m_oglApp->createGLBuffers(); OCIO::GpuShaderDescRcPtr shaderDesc = OCIO::GpuShaderDesc::CreateShaderDesc(); @@ -89,7 +86,6 @@ class ProcessorWrapper } private: - #ifdef OCIO_GPU_ENABLED void applyGPU(std::vector & pixel) { @@ -100,9 +96,7 @@ class ProcessorWrapper } OCIO::OglAppRcPtr m_oglApp; #else - void applyGPU(std::vector &) - { - } + void applyGPU(std::vector &) {} #endif // OCIO_GPU_ENABLED OCIO::ConstCPUProcessorRcPtr m_cpu; @@ -120,7 +114,7 @@ static std::string inputfile; static int parsed = 0; static std::vector input; -static int parse_end_args(int /* argc */, const char *argv[]) +static int parse_end_args(int /* argc */, const char * argv[]) { if (parsed == 0) { @@ -149,8 +143,10 @@ void PrintFirstComponent(const std::string & in, const std::string & out) std::cout << in; } -void PrintAlignedVec(const std::vector & str, const std::vector & strAlign, - size_t comp) +void PrintAlignedVec( + const std::vector & str, + const std::vector & strAlign, + size_t comp) { PrintFirstComponent(str[0], strAlign[0]); std::cout << " "; @@ -162,11 +158,13 @@ void PrintAlignedVec(const std::vector & str, const std::vector & str, const std::vector & vec, size_t index, - size_t comp) +void ToString( + std::vector & str, + const std::vector & vec, + size_t index, + size_t comp) { str.push_back(ToString(vec[index + 0])); str.push_back(ToString(vec[index + 1])); @@ -177,16 +175,17 @@ void ToString(std::vector & str, const std::vector & vec, si } } -const char * DESC_STRING = "\n" -"OCIOCHECKLUT loads any LUT type supported by OCIO and prints any errors\n" -"encountered. Provide a normalized RGB or RGBA value to send that through\n" -"the LUT. Alternatively use the -t option to evaluate a set of test values.\n" -"Otherwise, if no RGB value is provided, a list of the operators in the LUT is printed.\n" -"Use -v to print warnings while parsing the LUT.\n"; +const char * DESC_STRING + = "\n" + "OCIOCHECKLUT loads any LUT type supported by OCIO and prints any errors\n" + "encountered. Provide a normalized RGB or RGBA value to send that through\n" + "the LUT. Alternatively use the -t option to evaluate a set of test values.\n" + "Otherwise, if no RGB value is provided, a list of the operators in the LUT is printed.\n" + "Use -v to print warnings while parsing the LUT.\n"; -} +} // namespace -int main (int argc, const char* argv[]) +int main(int argc, const char * argv[]) { bool verbose = false; bool help = false; @@ -198,6 +197,7 @@ int main (int argc, const char* argv[]) bool stepInfo = false; ArgParse ap; + // clang-format off ap.options("ociochecklut -- check any LUT file and optionally convert a pixel\n\n" "usage: ociochecklut or \n", "%*", parse_end_args, "", @@ -212,6 +212,7 @@ int main (int argc, const char* argv[]) "instead of the CPU one (--gpu is ignored)", "--gpuinfo", &outputgpuInfo, "Output the OCIO shader program", nullptr); + // clang-format on if (ap.parse(argc, argv) < 0 || help || inputfile.empty()) { @@ -288,8 +289,10 @@ int main (int argc, const char* argv[]) } if (usegpu || usegpuLegacy) { - proc.setGPU(usegpuLegacy ? processor->getOptimizedLegacyGPUProcessor(OCIO::OPTIMIZATION_DEFAULT, 32) - : processor->getDefaultGPUProcessor()); + proc.setGPU( + usegpuLegacy + ? processor->getOptimizedLegacyGPUProcessor(OCIO::OPTIMIZATION_DEFAULT, 32) + : processor->getDefaultGPUProcessor()); } else { @@ -319,10 +322,11 @@ int main (int argc, const char* argv[]) if (test && numInput > 0) { - std::cerr << "ERROR: Expecting either RGB (or RGBA) pixel or predefined RGB values (i.e. -t)." - << std::endl; + std::cerr + << "ERROR: Expecting either RGB (or RGBA) pixel or predefined RGB values (i.e. -t)." + << std::endl; return 1; - } + } size_t comp = 3; if (numInput == 4) @@ -331,26 +335,18 @@ int main (int argc, const char* argv[]) } else if (numInput != 3 && !test) { - std::cerr << "ERROR: Expecting either RGB or RGBA pixel." - << std::endl; + std::cerr << "ERROR: Expecting either RGB or RGBA pixel." << std::endl; return 1; } // Process the input values. bool validInput = true; - size_t curPix = 0; - - static const std::vector input4test = { - 0.f, 0.f, 0.f, - 0.18f, 0.18f, 0.18f, - 0.5f, 0.5f, 0.5f, - 1.f, 1.f, 1.f, - 2.f, 2.f, 2.f, - 100.f, 100.f, 100.f, - 1.f, 0.f, 0.f, - 0.f, 1.f, 0.f, - 0.f, 0.f, 1.f }; + size_t curPix = 0; + + static const std::vector input4test + = {0.f, 0.f, 0.f, 0.18f, 0.18f, 0.18f, 0.5f, 0.5f, 0.5f, 1.f, 1.f, 1.f, 2.f, 2.f, + 2.f, 100.f, 100.f, 100.f, 1.f, 0.f, 0.f, 0.f, 1.f, 0.f, 0.f, 0.f, 1.f}; if (verbose || stepInfo) { @@ -361,21 +357,24 @@ int main (int argc, const char* argv[]) { if (curPix < numInput) { - std::vector pixel = { input[curPix], input[curPix+1], input[curPix+2], - comp == 3 ? 0.0f : input[curPix + 3] }; + std::vector pixel + = {input[curPix], + input[curPix + 1], + input[curPix + 2], + comp == 3 ? 0.0f : input[curPix + 3]}; if (stepInfo) { // Process each step in a multi - transform LUT try { - // Create GroupTransform so that each can be processed one at a time. - auto processor = config->getProcessor(t); - auto transform = processor->createGroupTransform(); - std::vector inputPixel = pixel; + // Create GroupTransform so that each can be processed one at a time. + auto processor = config->getProcessor(t); + auto transform = processor->createGroupTransform(); + std::vector inputPixel = pixel; std::vector outputPixel = pixel; - const auto numTransforms = transform->getNumTransforms(); - + const auto numTransforms = transform->getNumTransforms(); + std::cout << std::endl; for (int i = 0; i < numTransforms; ++i) @@ -385,14 +384,17 @@ int main (int argc, const char* argv[]) if (usegpu || usegpuLegacy) { - proc.setGPU(usegpuLegacy ? processorStep->getOptimizedLegacyGPUProcessor(OCIO::OPTIMIZATION_DEFAULT, 32) - : processorStep->getDefaultGPUProcessor()); + proc.setGPU( + usegpuLegacy ? processorStep->getOptimizedLegacyGPUProcessor( + OCIO::OPTIMIZATION_DEFAULT, + 32) + : processorStep->getDefaultGPUProcessor()); } else { proc.setCPU(processorStep->getDefaultCPUProcessor()); } - + // Process the pixel proc.apply(outputPixel); @@ -422,17 +424,19 @@ int main (int argc, const char* argv[]) PrintAlignedVec(out, in, comp); std::cout << "]" << std::endl; - inputPixel = outputPixel; + inputPixel = outputPixel; } } - catch (const OCIO::Exception& exception) + catch (const OCIO::Exception & exception) { std::cerr << "ERROR: " << exception.what() << std::endl; return 1; } catch (...) { - std::cerr << "ERROR: Unknown error encountered while processing single step operator." << std::endl; + std::cerr << "ERROR: Unknown error encountered while processing single " + "step operator." + << std::endl; return 1; } @@ -445,14 +449,15 @@ int main (int argc, const char* argv[]) { proc.apply(pixel); } - catch (const OCIO::Exception& e) + catch (const OCIO::Exception & e) { std::cerr << "ERROR: Processing pixel: " << e.what() << std::endl; return 1; } catch (...) { - std::cerr << "ERROR: Unknown error encountered while processing pixel." << std::endl; + std::cerr << "ERROR: Unknown error encountered while processing pixel." + << std::endl; return 1; } @@ -496,7 +501,7 @@ int main (int argc, const char* argv[]) std::cout << std::endl; } curPix += comp; - } + } } else if (test) { @@ -504,11 +509,11 @@ int main (int argc, const char* argv[]) { std::cout << "Testing with predefined set of RGB pixels." << std::endl; } - input = input4test; - comp = 3; + input = input4test; + comp = 3; numInput = input4test.size(); - curPix = 0; - test = false; + curPix = 0; + test = false; } else { diff --git a/src/apps/ocioconvert/main.cpp b/src/apps/ocioconvert/main.cpp index 09dda655ea..95d811e80e 100644 --- a/src/apps/ocioconvert/main.cpp +++ b/src/apps/ocioconvert/main.cpp @@ -23,9 +23,9 @@ namespace OCIO = OCIO_NAMESPACE; static std::vector args; // Fill 'args' array with OpenColorIO arguments. -static int parse_end_args(int argc, const char *argv[]) +static int parse_end_args(int argc, const char * argv[]) { - while (argc>0) + while (argc > 0) { args.push_back(argv[0]); argc--; @@ -35,13 +35,13 @@ static int parse_end_args(int argc, const char *argv[]) return 0; } -bool ParseNameValuePair(std::string& name, std::string& value, const std::string& input); +bool ParseNameValuePair(std::string & name, std::string & value, const std::string & input); bool StringToFloat(float * fval, const char * str); bool StringToInt(int * ival, const char * str); -int main(int argc, const char **argv) +int main(int argc, const char ** argv) { ArgParse ap; @@ -58,6 +58,7 @@ int main(int argc, const char **argv) bool useDisplayView = false; bool useInvertView = false; + // clang-format off ap.options("ocioconvert -- apply colorspace transform to an image \n\n" "usage: ocioconvert [options] inputimage inputcolorspace outputimage outputcolorspace\n" " or: ocioconvert [options] --lut lutfile inputimage outputimage\n" @@ -86,11 +87,12 @@ int main(int argc, const char **argv) "for outputimage", NULL ); + // clang-format on - if (ap.parse (argc, argv) < 0) + if (ap.parse(argc, argv) < 0) { std::cerr << ap.geterror() << std::endl; - ap.usage (); + ap.usage(); exit(1); } @@ -121,8 +123,7 @@ int main(int argc, const char **argv) { if (args.size() != 4) { - std::cerr << "ERROR: Expecting 4 arguments, found " - << args.size() << "." << std::endl; + std::cerr << "ERROR: Expecting 4 arguments, found " << args.size() << "." << std::endl; ap.usage(); exit(1); } @@ -141,8 +142,8 @@ int main(int argc, const char **argv) { if (args.size() != 3) { - std::cerr << "ERROR: Expecting 3 arguments for --lut option, found " - << args.size() << "." << std::endl; + std::cerr << "ERROR: Expecting 3 arguments for --lut option, found " << args.size() + << "." << std::endl; ap.usage(); exit(1); } @@ -154,8 +155,8 @@ int main(int argc, const char **argv) { if (args.size() != 5) { - std::cerr << "ERROR: Expecting 5 arguments for --view option, found " - << args.size() << "." << std::endl; + std::cerr << "ERROR: Expecting 5 arguments for --view option, found " << args.size() + << "." << std::endl; ap.usage(); exit(1); } @@ -167,11 +168,12 @@ int main(int argc, const char **argv) } else if (useDisplayView && useInvertView) { - std::cerr << "ERROR: Options view & invertview can't be used at the same time." << std::endl; + std::cerr << "ERROR: Options view & invertview can't be used at the same time." + << std::endl; ap.usage(); exit(1); } - else if (useInvertView) + else if (useInvertView) { if (args.size() != 5) { @@ -180,11 +182,11 @@ int main(int argc, const char **argv) ap.usage(); exit(1); } - inputimage = args[0].c_str(); - display = args[1].c_str(); - view = args[2].c_str(); - outputimage = args[3].c_str(); - outputcolorspace = args[4].c_str(); + inputimage = args[0].c_str(); + display = args[1].c_str(); + view = args[2].c_str(); + outputimage = args[3].c_str(); + outputcolorspace = args[4].c_str(); } if (verbose) @@ -200,8 +202,8 @@ int main(int argc, const char **argv) std::cout << std::endl; std::cout << "OCIO Config. file: '" << env << "'" << std::endl; OCIO::ConstConfigRcPtr config = OCIO::GetCurrentConfig(); - std::cout << "OCIO Config. version: " << config->getMajorVersion() << "." - << config->getMinorVersion() << std::endl; + std::cout << "OCIO Config. version: " << config->getMajorVersion() << "." + << config->getMinorVersion() << std::endl; std::cout << "OCIO search_path: " << config->getSearchPath() << std::endl; } catch (const OCIO::Exception & e) @@ -232,7 +234,7 @@ int main(int argc, const char **argv) OCIO::ImageIO imgInput; OCIO::ImageIO imgOutputCPU; // Default is to perform in-place conversion. - OCIO::ImageIO *imgOutput = &imgInput; + OCIO::ImageIO * imgOutput = &imgInput; // Load the image. std::cout << std::endl; @@ -278,8 +280,8 @@ int main(int argc, const char **argv) } else { - std::cerr << "Cannot convert image with " << imgInput.getNumChannels() - << " components." << std::endl; + std::cerr << "Cannot convert image with " << imgInput.getNumChannels() << " components." + << std::endl; exit(1); } @@ -300,8 +302,12 @@ int main(int argc, const char **argv) oglApp->setPrintShader(outputgpuInfo); - oglApp->initImage(imgInput.getWidth(), imgInput.getHeight(), comp, (float *)imgInput.getData()); - + oglApp->initImage( + imgInput.getWidth(), + imgInput.getHeight(), + comp, + (float *)imgInput.getData()); + oglApp->createGLBuffers(); } #endif // OCIO_GPU_ENABLED @@ -324,7 +330,7 @@ int main(int argc, const char **argv) OCIO::FileTransformRcPtr t = OCIO::FileTransform::Create(); t->setSrc(lutFile); t->setInterpolation(OCIO::INTERP_BEST); - + processor = config->getProcessor(t); } else if (useDisplayView) @@ -367,8 +373,9 @@ int main(int argc, const char **argv) shaderDesc->setLanguage(OCIO::GPU_LANGUAGE_GLSL_1_2); OCIO::ConstGPUProcessorRcPtr gpu - = usegpuLegacy ? processor->getOptimizedLegacyGPUProcessor(OCIO::OPTIMIZATION_DEFAULT, 32) - : processor->getDefaultGPUProcessor(); + = usegpuLegacy + ? processor->getOptimizedLegacyGPUProcessor(OCIO::OPTIMIZATION_DEFAULT, 32) + : processor->getDefaultGPUProcessor(); gpu->extractGpuShaderInfo(shaderDesc); oglApp->setShader(shaderDesc); @@ -408,13 +415,14 @@ int main(int argc, const char **argv) } else { - throw OCIO::Exception("Unsupported input bitdepth, must be uint8, uint16, half or float."); + throw OCIO::Exception( + "Unsupported input bitdepth, must be uint8, uint16, half or float."); } - OCIO::ConstCPUProcessorRcPtr cpuProcessor - = processor->getOptimizedCPUProcessor(inputBitDepth, - outputBitDepth, - OCIO::OPTIMIZATION_DEFAULT); + OCIO::ConstCPUProcessorRcPtr cpuProcessor = processor->getOptimizedCPUProcessor( + inputBitDepth, + outputBitDepth, + OCIO::OPTIMIZATION_DEFAULT); const bool useOutputBuffer = inputBitDepth != outputBitDepth; @@ -447,9 +455,7 @@ int main(int argc, const char **argv) std::chrono::duration duration = end - start; std::cout << std::endl; - std::cout << "CPU processing took: " - << duration.count() - << " ms" << std::endl; + std::cout << "CPU processing took: " << duration.count() << " ms" << std::endl; } } } @@ -466,13 +472,12 @@ int main(int argc, const char **argv) // Set the provided image attributes. bool parseError = false; - for (unsigned int i=0; iattribute(name, fval); } - for (unsigned int i=0; iattribute(name, ival); } - for (unsigned int i=0; igetDisplayViewColorSpaceName(display, view); + outputcolorspace = config->getDisplayViewColorSpaceName(display, view); } if (outputcolorspace) @@ -546,23 +550,20 @@ int main(int argc, const char **argv) return 0; } - // Parse name=value parts. // return true on success. -bool ParseNameValuePair(std::string& name, - std::string& value, - const std::string& input) +bool ParseNameValuePair(std::string & name, std::string & value, const std::string & input) { // split string into name=value. size_t pos = input.find('='); - if (pos==std::string::npos) + if (pos == std::string::npos) { return false; } - name = input.substr(0,pos); - value = input.substr(pos+1); + name = input.substr(0, pos); + value = input.substr(pos + 1); return true; } diff --git a/src/apps/ociocpuinfo/main.cpp b/src/apps/ociocpuinfo/main.cpp index ef5104e23c..1309a7adef 100644 --- a/src/apps/ociocpuinfo/main.cpp +++ b/src/apps/ociocpuinfo/main.cpp @@ -9,24 +9,24 @@ namespace OCIO = OCIO_NAMESPACE; int main() { - const OCIO::CPUInfo& cpu = OCIO::CPUInfo::instance(); + const OCIO::CPUInfo & cpu = OCIO::CPUInfo::instance(); - std::cout << "name : " << cpu.getName() << std::endl; - std::cout << "vendor : " << cpu.getVendor() << std::endl; - std::cout << "hasSSE2 : " << cpu.hasSSE2() << std::endl; - std::cout << "SSE2Slow : " << cpu.SSE2Slow() << std::endl; - std::cout << "hasSSE3 : " << cpu.hasSSE3() << std::endl; - std::cout << "SSE3Slow : " << cpu.SSE3Slow() << std::endl; - std::cout << "hasSSSE3 : " << cpu.hasSSSE3() << std::endl; - std::cout << "SSSE3Slow : " << cpu.SSSE3Slow() << std::endl; - std::cout << "hasSSE4 : " << cpu.hasSSE4() << std::endl; - std::cout << "hasSSE42 : " << cpu.hasSSE42() << std::endl; - std::cout << "hasAVX : " << cpu.hasAVX() << std::endl; - std::cout << "AVXSlow : " << cpu.AVXSlow() << std::endl; - std::cout << "hasAVX2 : " << cpu.hasAVX2() << std::endl; + std::cout << "name : " << cpu.getName() << std::endl; + std::cout << "vendor : " << cpu.getVendor() << std::endl; + std::cout << "hasSSE2 : " << cpu.hasSSE2() << std::endl; + std::cout << "SSE2Slow : " << cpu.SSE2Slow() << std::endl; + std::cout << "hasSSE3 : " << cpu.hasSSE3() << std::endl; + std::cout << "SSE3Slow : " << cpu.SSE3Slow() << std::endl; + std::cout << "hasSSSE3 : " << cpu.hasSSSE3() << std::endl; + std::cout << "SSSE3Slow : " << cpu.SSSE3Slow() << std::endl; + std::cout << "hasSSE4 : " << cpu.hasSSE4() << std::endl; + std::cout << "hasSSE42 : " << cpu.hasSSE42() << std::endl; + std::cout << "hasAVX : " << cpu.hasAVX() << std::endl; + std::cout << "AVXSlow : " << cpu.AVXSlow() << std::endl; + std::cout << "hasAVX2 : " << cpu.hasAVX2() << std::endl; std::cout << "AVX2SlowGather : " << cpu.AVX2SlowGather() << std::endl; - std::cout << "hasAVX512 : " << cpu.hasAVX512() << std::endl; - std::cout << "hasF16C : " << cpu.hasF16C() << std::endl; + std::cout << "hasAVX512 : " << cpu.hasAVX512() << std::endl; + std::cout << "hasF16C : " << cpu.hasF16C() << std::endl; return 0; } \ No newline at end of file diff --git a/src/apps/ociodisplay/main.cpp b/src/apps/ociodisplay/main.cpp index d464abcf02..3b92eb9ecc 100644 --- a/src/apps/ociodisplay/main.cpp +++ b/src/apps/ociodisplay/main.cpp @@ -1,14 +1,13 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #include -#include #include #include +#include #include -#include #include +#include #include #include #include @@ -17,6 +16,7 @@ #include namespace OCIO = OCIO_NAMESPACE; +// clang-format off #ifdef __APPLE__ #include #include @@ -32,16 +32,17 @@ namespace OCIO = OCIO_NAMESPACE; #if __APPLE__ #include "metalapp.h" #endif +// clang-format on #include "glsl.h" -#include "oglapp.h" #include "imageio.h" +#include "oglapp.h" bool g_verbose = false; bool g_gpulegacy = false; bool g_gpuinfo = false; #if __APPLE__ -bool g_useMetal = false; +bool g_useMetal = false; #endif std::string g_filename; @@ -52,22 +53,22 @@ std::string g_inputColorSpace; std::string g_display; std::string g_transformName; std::string g_look; -OCIO::OptimizationFlags g_optimization{ OCIO::OPTIMIZATION_DEFAULT }; +OCIO::OptimizationFlags g_optimization{OCIO::OPTIMIZATION_DEFAULT}; -static const std::array, 5> OptmizationMenu = { { - { "None", OCIO::OPTIMIZATION_NONE }, - { "Lossless", OCIO::OPTIMIZATION_LOSSLESS }, - { "Very good", OCIO::OPTIMIZATION_VERY_GOOD }, - { "Good", OCIO::OPTIMIZATION_GOOD }, - { "Draft", OCIO::OPTIMIZATION_DRAFT } } }; +static const std::array, 5> OptmizationMenu = { + {{"None", OCIO::OPTIMIZATION_NONE}, + {"Lossless", OCIO::OPTIMIZATION_LOSSLESS}, + {"Very good", OCIO::OPTIMIZATION_VERY_GOOD}, + {"Good", OCIO::OPTIMIZATION_GOOD}, + {"Draft", OCIO::OPTIMIZATION_DRAFT}} +}; -float g_exposure_fstop{ 0.0f }; -float g_display_gamma{ 1.0f }; -int g_channelHot[4]{ 1, 1, 1, 1 }; // show rgb +float g_exposure_fstop{0.0f}; +float g_display_gamma{1.0f}; +int g_channelHot[4]{1, 1, 1, 1}; // show rgb OCIO::OglAppRcPtr g_oglApp; - void UpdateOCIOGLState(); static void InitImageTexture(const char * filename) @@ -100,19 +101,19 @@ static void InitImageTexture(const char * filename) img.init(512, 512, OCIO::CHANNEL_ORDERING_RGBA, OCIO::BIT_DEPTH_F32); - float * pixels = (float *) img.getData(); - const long width = img.getWidth(); + float * pixels = (float *)img.getData(); + const long width = img.getWidth(); const long channels = img.getNumChannels(); - for (int y=0; yinitImage(img.getWidth(), - img.getHeight(), - comp, - (float*) img.getData()); + g_oglApp->initImage(img.getWidth(), img.getHeight(), comp, (float *)img.getData()); } - } void InitOCIO(const char * filename) { OCIO::ConstConfigRcPtr config = OCIO::GetCurrentConfig(); - g_display = config->getDefaultDisplay(); - g_transformName = config->getDefaultView(g_display.c_str()); - g_look = config->getDisplayViewLooks(g_display.c_str(), g_transformName.c_str()); + g_display = config->getDefaultDisplay(); + g_transformName = config->getDefaultView(g_display.c_str()); + g_look = config->getDisplayViewLooks(g_display.c_str(), g_transformName.c_str()); g_inputColorSpace = OCIO::ROLE_SCENE_LINEAR; if (filename && *filename) @@ -167,9 +164,8 @@ void InitOCIO(const char * filename) } else { - std::cout << "colorspace: " << g_inputColorSpace - << " \t(could not determine from filename, using default)" - << std::endl; + std::cout << "colorspace: " << g_inputColorSpace + << " \t(could not determine from filename, using default)" << std::endl; } } } @@ -251,37 +247,37 @@ static void Key(unsigned char key, int /*x*/, int /*y*/) static void SpecialKey(int key, int x, int y) { - (void) x; - (void) y; + (void)x; + (void)y; int mod = glutGetModifiers(); - if(key == GLUT_KEY_UP && (mod & GLUT_ACTIVE_CTRL)) + if (key == GLUT_KEY_UP && (mod & GLUT_ACTIVE_CTRL)) { g_exposure_fstop += 0.25f; } - else if(key == GLUT_KEY_DOWN && (mod & GLUT_ACTIVE_CTRL)) + else if (key == GLUT_KEY_DOWN && (mod & GLUT_ACTIVE_CTRL)) { g_exposure_fstop -= 0.25f; } - else if(key == GLUT_KEY_HOME && (mod & GLUT_ACTIVE_CTRL)) + else if (key == GLUT_KEY_HOME && (mod & GLUT_ACTIVE_CTRL)) { g_exposure_fstop = 0.0f; - g_display_gamma = 1.0f; + g_display_gamma = 1.0f; } - else if(key == GLUT_KEY_UP && (mod & GLUT_ACTIVE_ALT)) + else if (key == GLUT_KEY_UP && (mod & GLUT_ACTIVE_ALT)) { g_display_gamma *= 1.1f; } - else if(key == GLUT_KEY_DOWN && (mod & GLUT_ACTIVE_ALT)) + else if (key == GLUT_KEY_DOWN && (mod & GLUT_ACTIVE_ALT)) { g_display_gamma /= 1.1f; } - else if(key == GLUT_KEY_HOME && (mod & GLUT_ACTIVE_ALT)) + else if (key == GLUT_KEY_HOME && (mod & GLUT_ACTIVE_ALT)) { g_exposure_fstop = 0.0f; - g_display_gamma = 1.0f; + g_display_gamma = 1.0f; } UpdateOCIOGLState(); @@ -300,9 +296,9 @@ void UpdateOCIOGLState() OCIO::ConstConfigRcPtr config = OCIO::GetCurrentConfig(); OCIO::DisplayViewTransformRcPtr transform = OCIO::DisplayViewTransform::Create(); - transform->setSrc( g_inputColorSpace.c_str() ); - transform->setDisplay( g_display.c_str() ); - transform->setView( g_transformName.c_str() ); + transform->setSrc(g_inputColorSpace.c_str()); + transform->setDisplay(g_display.c_str()); + transform->setView(g_transformName.c_str()); OCIO::LegacyViewingPipelineRcPtr vp = OCIO::LegacyViewingPipeline::Create(); vp->setDisplayViewTransform(transform); @@ -320,10 +316,8 @@ void UpdateOCIOGLState() std::cout << " with:" << std::endl; std::cout << " exposure_fstop = " << g_exposure_fstop << std::endl; std::cout << " display_gamma = " << g_display_gamma << std::endl; - std::cout << " channels = " - << (g_channelHot[0] ? "R" : "") - << (g_channelHot[1] ? "G" : "") - << (g_channelHot[2] ? "B" : "") + std::cout << " channels = " << (g_channelHot[0] ? "R" : "") + << (g_channelHot[1] ? "G" : "") << (g_channelHot[2] ? "B" : "") << (g_channelHot[3] ? "A" : "") << std::endl; for (const auto & opt : OptmizationMenu) @@ -333,18 +327,17 @@ void UpdateOCIOGLState() std::cout << std::endl << "Optimization: " << opt.first << std::endl; } } - } // Add optional transforms to create a full-featured, "canonical" display pipeline // Fstop exposure control (in SCENE_LINEAR) { - double gain = powf(2.0f, g_exposure_fstop); - const double slope4f[] = { gain, gain, gain, gain }; + double gain = powf(2.0f, g_exposure_fstop); + const double slope4f[] = {gain, gain, gain, gain}; double m44[16]; double offset4[4]; OCIO::MatrixTransform::Scale(m44, offset4, slope4f); - OCIO::MatrixTransformRcPtr mtx = OCIO::MatrixTransform::Create(); + OCIO::MatrixTransformRcPtr mtx = OCIO::MatrixTransform::Create(); mtx->setMatrix(m44); mtx->setOffset(offset4); vp->setLinearCC(mtx); @@ -365,9 +358,9 @@ void UpdateOCIOGLState() // Post-display transform gamma { - double exponent = 1.0/std::max(1e-6, static_cast(g_display_gamma)); - const double exponent4f[4] = { exponent, exponent, exponent, exponent }; - OCIO::ExponentTransformRcPtr expTransform = OCIO::ExponentTransform::Create(); + double exponent = 1.0 / std::max(1e-6, static_cast(g_display_gamma)); + const double exponent4f[4] = {exponent, exponent, exponent, exponent}; + OCIO::ExponentTransformRcPtr expTransform = OCIO::ExponentTransform::Create(); expTransform->setValue(exponent4f); vp->setDisplayCC(expTransform); } @@ -391,10 +384,9 @@ void UpdateOCIOGLState() OCIO::GpuShaderDescRcPtr shaderDesc = OCIO::GpuShaderDesc::CreateShaderDesc(); shaderDesc->setLanguage( #if __APPLE__ - g_useMetal ? - OCIO::GPU_LANGUAGE_MSL_2_0 : + g_useMetal ? OCIO::GPU_LANGUAGE_MSL_2_0 : #endif - OCIO::GPU_LANGUAGE_GLSL_1_2); + OCIO::GPU_LANGUAGE_GLSL_1_2); shaderDesc->setFunctionName("OCIODisplay"); shaderDesc->setResourcePrefix("ocio_"); @@ -415,7 +407,7 @@ void menuCallback(int /*id*/) void imageColorSpace_CB(int id) { OCIO::ConstConfigRcPtr config = OCIO::GetCurrentConfig(); - const char * name = config->getColorSpaceNameByIndex(id); + const char * name = config->getColorSpaceNameByIndex(id); if (!name) { return; @@ -430,7 +422,7 @@ void imageColorSpace_CB(int id) void displayDevice_CB(int id) { OCIO::ConstConfigRcPtr config = OCIO::GetCurrentConfig(); - const char * display = config->getDisplay(id); + const char * display = config->getDisplay(id); if (!display) { return; @@ -438,7 +430,8 @@ void displayDevice_CB(int id) g_display = display; - const char * csname = config->getDisplayViewColorSpaceName(g_display.c_str(), g_transformName.c_str()); + const char * csname + = config->getDisplayViewColorSpaceName(g_display.c_str(), g_transformName.c_str()); if (!csname || !*csname) { g_transformName = config->getDefaultView(g_display.c_str()); @@ -499,7 +492,7 @@ static void PopulateOCIOMenus() int csMenuID = glutCreateMenu(imageColorSpace_CB); std::map families; - for (int i=0; igetNumColorSpaces(); ++i) + for (int i = 0; i < config->getNumColorSpaces(); ++i) { const char * csName = config->getColorSpaceNameByIndex(i); if (csName && *csName) @@ -510,7 +503,7 @@ static void PopulateOCIOMenus() const char * family = cs->getFamily(); if (family && *family) { - if (families.find(family)==families.end()) + if (families.find(family) == families.end()) { families[family] = glutCreateMenu(imageColorSpace_CB); glutAddMenuEntry(csName, i); @@ -534,26 +527,26 @@ static void PopulateOCIOMenus() } int deviceMenuID = glutCreateMenu(displayDevice_CB); - for (int i=0; igetNumDisplays(); ++i) + for (int i = 0; i < config->getNumDisplays(); ++i) { glutAddMenuEntry(config->getDisplay(i), i); } - int transformMenuID = glutCreateMenu(transform_CB); + int transformMenuID = glutCreateMenu(transform_CB); const char * defaultDisplay = config->getDefaultDisplay(); - for (int i=0; igetNumViews(defaultDisplay); ++i) + for (int i = 0; i < config->getNumViews(defaultDisplay); ++i) { glutAddMenuEntry(config->getView(defaultDisplay, i), i); } int lookMenuID = glutCreateMenu(look_CB); - for (int i=0; igetNumLooks(); ++i) + for (int i = 0; i < config->getNumLooks(); ++i) { glutAddMenuEntry(config->getLookNameByIndex(i), i); } int optimizationMenuID = glutCreateMenu(optimization_CB); - for (size_t i = 0; i(i)); } @@ -568,50 +561,51 @@ static void PopulateOCIOMenus() glutAttachMenu(GLUT_RIGHT_BUTTON); } -const char * USAGE_TEXT = "\n" -"Keys:\n" -"\tCtrl+Up: Exposure +1/4 stop (in scene linear)\n" -"\tCtrl+Down: Exposure -1/4 stop (in scene linear)\n" -"\tCtrl+Home: Reset Exposure + Gamma\n" -"\n" -"\tAlt+Up: Gamma up (post display transform)\n" -"\tAlt+Down: Gamma down (post display transform)\n" -"\tAlt+Home: Reset Exposure + Gamma\n" -"\n" -"\tC: View Color\n" -"\tR: View Red\n" -"\tG: View Green\n" -"\tB: View Blue\n" -"\tA: View Alpha\n" -"\tL: View Luma\n" -"\n" -"\tRight-Mouse Button: Configure Display / Transform / ColorSpace / Looks / Optimization\n" -"\n" -"\tEsc: Quit\n"; - -void parseArguments(int argc, char **argv) +const char * USAGE_TEXT + = "\n" + "Keys:\n" + "\tCtrl+Up: Exposure +1/4 stop (in scene linear)\n" + "\tCtrl+Down: Exposure -1/4 stop (in scene linear)\n" + "\tCtrl+Home: Reset Exposure + Gamma\n" + "\n" + "\tAlt+Up: Gamma up (post display transform)\n" + "\tAlt+Down: Gamma down (post display transform)\n" + "\tAlt+Home: Reset Exposure + Gamma\n" + "\n" + "\tC: View Color\n" + "\tR: View Red\n" + "\tG: View Green\n" + "\tB: View Blue\n" + "\tA: View Alpha\n" + "\tL: View Luma\n" + "\n" + "\tRight-Mouse Button: Configure Display / Transform / ColorSpace / Looks / Optimization\n" + "\n" + "\tEsc: Quit\n"; + +void parseArguments(int argc, char ** argv) { - for (int i=1; igetMajorVersion() << "." - << config->getMinorVersion() << std::endl; + std::cout << "OCIO Config. version: " << config->getMajorVersion() << "." + << config->getMinorVersion() << std::endl; std::cout << "OCIO search_path : " << config->getSearchPath() << std::endl; } } @@ -717,7 +712,7 @@ int main(int argc, char **argv) { InitOCIO(g_filename.c_str()); } - catch(OCIO::Exception & e) + catch (OCIO::Exception & e) { std::cerr << e.what() << std::endl; exit(1); diff --git a/src/apps/ociolutimage/main.cpp b/src/apps/ociolutimage/main.cpp index c34831ce43..5577ce8816 100644 --- a/src/apps/ociolutimage/main.cpp +++ b/src/apps/ociolutimage/main.cpp @@ -5,8 +5,8 @@ #include #include #include -#include #include +#include #include namespace OCIO = OCIO_NAMESPACE; @@ -22,16 +22,14 @@ enum Lut3DOrder LUT3DORDER_FAST_BLUE }; -void WriteLut3D(const std::string & filename, const float* lutdata, int edgeLen); -void GenerateIdentityLut3D(float* img, int edgeLen, int numChannels, Lut3DOrder lut3DOrder); +void WriteLut3D(const std::string & filename, const float * lutdata, int edgeLen); +void GenerateIdentityLut3D(float * img, int edgeLen, int numChannels, Lut3DOrder lut3DOrder); - -void GetLutImageSize(int & width, int & height, - int cubesize, int maxwidth) +void GetLutImageSize(int & width, int & height, int cubesize, int maxwidth) { // Compute the image width / height - width = cubesize*cubesize; - if (maxwidth>0 && width>=maxwidth) + width = cubesize * cubesize; + if (maxwidth > 0 && width >= maxwidth) { // TODO: Do something smarter here to find a better multiple, // to create a more pleasing gradient rendition. @@ -39,28 +37,26 @@ void GetLutImageSize(int & width, int & height, width = std::min(maxwidth, width); } - int numpixels = cubesize*cubesize*cubesize; - height = (int)(ceilf((float)numpixels/(float)width)); + int numpixels = cubesize * cubesize * cubesize; + height = (int)(ceilf((float)numpixels / (float)width)); } - -void Generate(int cubesize, int maxwidth, - const std::string & outputfile, - const std::string & configfile, - const std::string & incolorspace, - const std::string & outcolorspace) +void Generate( + int cubesize, + int maxwidth, + const std::string & outputfile, + const std::string & configfile, + const std::string & incolorspace, + const std::string & outcolorspace) { - int width = 0; - int height = 0; + int width = 0; + int height = 0; int numchannels = 3; GetLutImageSize(width, height, cubesize, maxwidth); - OCIO::ImageIO img(width, - height, - OCIO::CHANNEL_ORDERING_RGB, - OCIO::BIT_DEPTH_F32); + OCIO::ImageIO img(width, height, OCIO::CHANNEL_ORDERING_RGB, OCIO::BIT_DEPTH_F32); - float * pixels = (float*) img.getData(); + float * pixels = (float *)img.getData(); GenerateIdentityLut3D(pixels, cubesize, numchannels, LUT3DORDER_FAST_RED); @@ -83,10 +79,9 @@ void Generate(int cubesize, int maxwidth, throw OCIO::Exception(os.str().c_str()); } - OCIO::ConstCPUProcessorRcPtr processor = - config->getProcessor(incolorspace.c_str(), - outcolorspace.c_str() - )->getDefaultCPUProcessor(); + OCIO::ConstCPUProcessorRcPtr processor + = config->getProcessor(incolorspace.c_str(), outcolorspace.c_str()) + ->getDefaultCPUProcessor(); processor->apply(*img.getImageDesc()); } @@ -95,14 +90,15 @@ void Generate(int cubesize, int maxwidth, img.write(outputfile); } - -void Extract(int cubesize, int maxwidth, - const std::string & inputfile, - const std::string & outputfile) +void Extract( + int cubesize, + int maxwidth, + const std::string & inputfile, + const std::string & outputfile) { OCIO::ImageIO img(inputfile); - int width = 0; + int width = 0; int height = 0; GetLutImageSize(width, height, cubesize, maxwidth); @@ -120,24 +116,22 @@ void Extract(int cubesize, int maxwidth, throw OCIO::Exception("Image must have 3 channels."); } - int lut3DNumPixels = cubesize*cubesize*cubesize; + int lut3DNumPixels = cubesize * cubesize * cubesize; if (img.getWidth() * img.getHeight() < lut3DNumPixels) { throw OCIO::Exception("Image is not large enough to contain expected 3D LUT."); } - WriteLut3D(outputfile, (float*) img.getData(), cubesize); + WriteLut3D(outputfile, (float *)img.getData(), cubesize); } - - -int main(int argc, const char* argv[]) +int main(int argc, const char * argv[]) { bool generate = false; - bool extract = false; - int cubesize = 32; - int maxwidth = 2048; + bool extract = false; + int cubesize = 32; + int maxwidth = 2048; std::string inputfile; std::string outputfile; std::string config; @@ -146,6 +140,7 @@ int main(int argc, const char* argv[]) // TODO: Add optional allocation transform instead of colorconvert ArgParse ap; + // clang-format off ap.options("ociolutimage -- Convert a 3D LUT to or from an image\n\n" "usage: ociolutimage [options] \n\n" "example: ociolutimage --generate --output lut.exr\n" @@ -162,6 +157,7 @@ int main(int argc, const char* argv[]) "--config %s", &config, ".ocio configuration file (default: $OCIO)", "--colorconvert %s %s", &incolorspace, &outcolorspace, "Apply a color space conversion to the image.", NULL); + // clang-format on if (ap.parse(argc, argv) < 0) { @@ -171,7 +167,7 @@ int main(int argc, const char* argv[]) return 1; } - if (argc == 1 ) + if (argc == 1) { ap.usage(); std::cout << "\n"; @@ -182,12 +178,7 @@ int main(int argc, const char* argv[]) { try { - Generate(cubesize, - maxwidth, - outputfile, - config, - incolorspace, - outcolorspace); + Generate(cubesize, maxwidth, outputfile, config, incolorspace, outcolorspace); } catch (const std::exception & e) { @@ -204,10 +195,7 @@ int main(int argc, const char* argv[]) { try { - Extract(cubesize, - maxwidth, - inputfile, - outputfile); + Extract(cubesize, maxwidth, inputfile, outputfile); } catch (const std::exception & e) { @@ -234,14 +222,13 @@ int main(int argc, const char* argv[]) // TODO: These should be exposed from inside OCIO, in appropriate time. // -inline int GetLut3DIndex_RedFast(int indexR, int indexG, int indexB, - int sizeR, int sizeG, int /*sizeB*/) +inline int +GetLut3DIndex_RedFast(int indexR, int indexG, int indexB, int sizeR, int sizeG, int /*sizeB*/) { return 3 * (indexR + sizeR * (indexG + sizeG * indexB)); } -void GenerateIdentityLut3D(float* img, int edgeLen, int numChannels, - Lut3DOrder lut3DOrder) +void GenerateIdentityLut3D(float * img, int edgeLen, int numChannels, Lut3DOrder lut3DOrder) { if (!img) { @@ -257,20 +244,20 @@ void GenerateIdentityLut3D(float* img, int edgeLen, int numChannels, if (lut3DOrder == LUT3DORDER_FAST_RED) { - for (int i=0; i -#include #include +#include #include #include @@ -14,14 +13,13 @@ namespace OCIO = OCIO_NAMESPACE; #include "apputils/measure.h" #include "utils/StringUtils.h" - // Array of non OpenColorIO arguments. static std::vector args; // Fill 'args' array with OpenColorIO arguments. static int parse_end_args(int argc, const char * argv[]) { - while ( argc > 0) + while (argc > 0) { args.push_back(argv[0]); argc--; @@ -31,7 +29,9 @@ static int parse_end_args(int argc, const char * argv[]) return 0; } -void CreateOutputLutFile(const std::string & outLutFilepath, OCIO::ConstGroupTransformRcPtr transform) +void CreateOutputLutFile( + const std::string & outLutFilepath, + OCIO::ConstGroupTransformRcPtr transform) { // Get the processor. @@ -41,11 +41,11 @@ void CreateOutputLutFile(const std::string & outLutFilepath, OCIO::ConstGroupTra OCIO::ConstProcessorRcPtr processor = config->getProcessor(transform); // CLF file format does not support inverse 1D LUTs, optimize the processor - // to replace inverse 1D LUTs by 'fast forward' 1D LUTs. - OCIO::ConstProcessorRcPtr optProcessor - = processor->getOptimizedProcessor(OCIO::BIT_DEPTH_F32, - OCIO::BIT_DEPTH_F32, - OCIO::OPTIMIZATION_LUT_INV_FAST); + // to replace inverse 1D LUTs by 'fast forward' 1D LUTs. + OCIO::ConstProcessorRcPtr optProcessor = processor->getOptimizedProcessor( + OCIO::BIT_DEPTH_F32, + OCIO::BIT_DEPTH_F32, + OCIO::OPTIMIZATION_LUT_INV_FAST); // Create the CLF file. @@ -69,10 +69,7 @@ void CreateOutputLutFile(const std::string & outLutFilepath, OCIO::ConstGroupTra else { std::ostringstream oss; - oss << "Could not open the file '" - << outLutFilepath - << "'." - << std::endl; + oss << "Could not open the file '" << outLutFilepath << "'." << std::endl; throw OCIO::Exception(oss.str().c_str()); } } @@ -83,6 +80,7 @@ int main(int argc, const char ** argv) std::string cscColorSpace; ArgParse ap; + // clang-format off ap.options("ociomakeclf -- Convert a LUT into CLF format and optionally add conversions from/to ACES2065-1 to make it an LMT.\n" " If the csc argument is used, the CLF will contain the transforms:\n" " [ACES2065-1 to CSC space] [the LUT] [CSC space to ACES2065-1].\n\n" @@ -97,6 +95,7 @@ int main(int argc, const char ** argv) "--list", &listCSCColorSpaces, "List of the supported CSC color spaces", "--csc %s", &cscColorSpace, "The color space that the input LUT expects and produces", nullptr); + // clang-format on if (ap.parse(argc, argv) < 0) { @@ -111,7 +110,7 @@ int main(int argc, const char ** argv) return 0; } - // The LMT must accept and produce ACES2065-1 so look for all built-in transforms that produce + // The LMT must accept and produce ACES2065-1 so look for all built-in transforms that produce // that (based on the naming conventions). static constexpr char BuiltinSuffix[] = "_to_ACES2065-1"; @@ -140,16 +139,16 @@ int main(int argc, const char ** argv) ap.usage(); return 1; } - - const std::string inLutFilepath = args[0].c_str(); - const std::string outLutFilepath = args[1].c_str(); + + const std::string inLutFilepath = args[0].c_str(); + const std::string outLutFilepath = args[1].c_str(); const std::string originalCSC = cscColorSpace; if (!cscColorSpace.empty()) { cscColorSpace += BuiltinSuffix; - + OCIO::ConstBuiltinTransformRegistryRcPtr registry = OCIO::BuiltinTransformRegistry::Get(); bool cscFound = false; @@ -166,9 +165,7 @@ int main(int argc, const char ** argv) if (!cscFound) { - std::cerr << "ERROR: The LUT color space name '" - << originalCSC - << "' is not supported." + std::cerr << "ERROR: The LUT color space name '" << originalCSC << "' is not supported." << std::endl; return 1; } @@ -184,10 +181,8 @@ int main(int argc, const char ** argv) const std::string filepath = StringUtils::Lower(outLutFilepath); if (!StringUtils::EndsWith(filepath, ".clf")) { - std::cerr << "ERROR: The output LUT file path '" - << outLutFilepath - << "' must have a .clf extension." - << std::endl; + std::cerr << "ERROR: The output LUT file path '" << outLutFilepath + << "' must have a .clf extension." << std::endl; return 1; } } @@ -213,7 +208,9 @@ int main(int argc, const char ** argv) description += "ACES LMT transform built from a look LUT expecting color space: "; description += originalCSC; - grp->getFormatMetadata().addChildElement(OCIO::METADATA_DESCRIPTION, description.c_str()); + grp->getFormatMetadata().addChildElement( + OCIO::METADATA_DESCRIPTION, + description.c_str()); } std::string description; @@ -224,8 +221,10 @@ int main(int argc, const char ** argv) if (!cscColorSpace.empty()) { // TODO: It should overwrite existing input and output descriptors if any. - grp->getFormatMetadata().addChildElement(OCIO::METADATA_INPUT_DESCRIPTOR, "ACES2065-1"); - grp->getFormatMetadata().addChildElement(OCIO::METADATA_OUTPUT_DESCRIPTOR, "ACES2065-1"); + grp->getFormatMetadata().addChildElement(OCIO::METADATA_INPUT_DESCRIPTOR, "ACES2065-1"); + grp->getFormatMetadata().addChildElement( + OCIO::METADATA_OUTPUT_DESCRIPTOR, + "ACES2065-1"); } if (!cscColorSpace.empty()) diff --git a/src/apps/ocioperf/main.cpp b/src/apps/ocioperf/main.cpp index a3af75a587..66d14af68e 100644 --- a/src/apps/ocioperf/main.cpp +++ b/src/apps/ocioperf/main.cpp @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #include #include "apputils/argparse.h" @@ -9,9 +8,8 @@ #include #include -#include #include - +#include namespace OCIO = OCIO_NAMESPACE; @@ -19,25 +17,25 @@ namespace OCIO = OCIO_NAMESPACE; class CustomMeasure { public: - CustomMeasure() = delete; + CustomMeasure() = delete; CustomMeasure(const CustomMeasure &) = delete; explicit CustomMeasure(const char * explanation) - : m_explanations(explanation) - , m_iterations(1) + : m_explanations(explanation) + , m_iterations(1) { resume(); } explicit CustomMeasure(const char * explanation, unsigned iterations) - : m_explanations(explanation) - , m_iterations(iterations) + : m_explanations(explanation) + , m_iterations(iterations) { } ~CustomMeasure() { - if(m_started) + if (m_started) { pause(); } @@ -48,17 +46,16 @@ class CustomMeasure oss.width(9); oss.precision(6); - oss << m_explanations - << "For " << m_iterations << " iterations, it took: [" + oss << m_explanations << "For " << m_iterations << " iterations, it took: [" << m_durations[0].count(); if (m_iterations > 1) { oss << ", " - << (std::chrono::duration(m_duration - m_durations[0]).count() - / float(m_iterations-1)) - << ", " - << (m_duration.count()/float(m_iterations)); + << (std::chrono::duration(m_duration - m_durations[0]) + .count() + / float(m_iterations - 1)) + << ", " << (m_duration.count() / float(m_iterations)); } oss << "] ms"; @@ -69,21 +66,21 @@ class CustomMeasure void resume() { - if(m_started) + if (m_started) { throw OCIO::Exception("Measure already started."); } m_started = true; - m_start = std::chrono::high_resolution_clock::now(); + m_start = std::chrono::high_resolution_clock::now(); } void pause() { std::chrono::high_resolution_clock::time_point end - = std::chrono::high_resolution_clock::now(); + = std::chrono::high_resolution_clock::now(); - if(m_started) + if (m_started) { std::chrono::duration duration = end - m_start; @@ -100,35 +97,37 @@ class CustomMeasure private: const std::string m_explanations; - const unsigned m_iterations { 1 }; + const unsigned m_iterations{1}; - bool m_started { false }; + bool m_started{false}; std::chrono::high_resolution_clock::time_point m_start; - std::chrono::duration m_duration { 0 }; + std::chrono::duration m_duration{0}; std::vector> m_durations; }; // Process the complete image line by line. -void ProcessLines(CustomMeasure & m, - OCIO::ConstCPUProcessorRcPtr & cpuProcessor, - const OCIO::PackedImageDesc & img) +void ProcessLines( + CustomMeasure & m, + OCIO::ConstCPUProcessorRcPtr & cpuProcessor, + const OCIO::PackedImageDesc & img) { // Always process the same complete image. char * lineToProcess = reinterpret_cast(img.getData()); m.resume(); - for(int h=0; happly(imageDesc); @@ -141,21 +140,22 @@ void ProcessLines(CustomMeasure & m, } // Process the complete image pixel per pixel. -void ProcessPixels(CustomMeasure & m, - OCIO::ConstCPUProcessorRcPtr & cpuProcessor, - const OCIO::PackedImageDesc & img) +void ProcessPixels( + CustomMeasure & m, + OCIO::ConstCPUProcessorRcPtr & cpuProcessor, + const OCIO::PackedImageDesc & img) { // Always process the same complete image. char * lineToProcess = reinterpret_cast(img.getData()); m.resume(); - for(int h=0; happlyRGBA(reinterpret_cast(pixelToProcess)); + cpuProcessor->applyRGBA(reinterpret_cast(pixelToProcess)); // Find the next pixel. pixelToProcess += img.getXStrideBytes(); @@ -168,10 +168,10 @@ void ProcessPixels(CustomMeasure & m, m.pause(); } -int main(int argc, const char **argv) +int main(int argc, const char ** argv) { - bool help = false; - bool verbose = false; + bool help = false; + bool verbose = false; signed int testType = -1; std::string transformFile; std::string inColorSpace, outColorSpace, display, view; @@ -184,6 +184,7 @@ int main(int argc, const char **argv) bool useInvertview = false; ArgParse ap; + // clang-format off ap.options("ocioperf -- apply and measure a color transformation processing\n\n" "usage: ocioperf [options] --transform /path/to/file.clf\n\n", "--h", &help, @@ -214,8 +215,9 @@ int main(int argc, const char **argv) "--nooptim", &nooptim, "Disable the processor optimizations. Default is false", NULL); + // clang-format on - if (ap.parse (argc, argv) < 0) + if (ap.parse(argc, argv) < 0) { std::cerr << ap.geterror() << std::endl; ap.usage(); @@ -233,18 +235,18 @@ int main(int argc, const char **argv) std::cout << std::endl; std::cout << "OCIO Version: " << OCIO::GetVersion() << std::endl; const char * env = OCIO::GetEnvVariable("OCIO"); - if(env && *env) + if (env && *env) { try { std::cout << std::endl; std::cout << "OCIO Config. file: '" << env << "'" << std::endl; OCIO::ConstConfigRcPtr config = OCIO::GetCurrentConfig(); - std::cout << "OCIO Config. version: " << config->getMajorVersion() << "." - << config->getMinorVersion() << std::endl; + std::cout << "OCIO Config. version: " << config->getMajorVersion() << "." + << config->getMinorVersion() << std::endl; std::cout << "OCIO search_path: " << config->getSearchPath() << std::endl; } - catch(...) + catch (...) { std::cerr << "ERROR: Error loading the config file: '" << env << "'"; @@ -270,9 +272,9 @@ int main(int argc, const char **argv) OCIO::ConstProcessorRcPtr processor; if (!transformFile.empty()) { - OCIO::ConfigRcPtr config = OCIO::Config::CreateRaw()->createEditableCopy(); - config->setProcessorCacheFlags(nocache ? OCIO::PROCESSOR_CACHE_OFF - : OCIO::PROCESSOR_CACHE_DEFAULT); + OCIO::ConfigRcPtr config = OCIO::Config::CreateRaw()->createEditableCopy(); + config->setProcessorCacheFlags( + nocache ? OCIO::PROCESSOR_CACHE_OFF : OCIO::PROCESSOR_CACHE_DEFAULT); // Get the transform. OCIO::FileTransformRcPtr transform = OCIO::FileTransform::Create(); @@ -302,11 +304,13 @@ int main(int argc, const char **argv) if (env && *env) { std::cout << std::endl; - const std::string inputStr = !inColorSpace.empty() ? inColorSpace : "(" + display + ", " + view + ")"; - const std::string outputStr = !outColorSpace.empty() ? outColorSpace : "(" + display + ", " + view + ")"; - std::cout << "Processing from '" - << inputStr << "' to '" - << outputStr << "'" << std::endl; + const std::string inputStr + = !inColorSpace.empty() ? inColorSpace : "(" + display + ", " + view + ")"; + const std::string outputStr = !outColorSpace.empty() + ? outColorSpace + : "(" + display + ", " + view + ")"; + std::cout << "Processing from '" << inputStr << "' to '" << outputStr << "'" + << std::endl; } else { @@ -314,9 +318,9 @@ int main(int argc, const char **argv) } } - OCIO::ConfigRcPtr config = OCIO::Config::CreateFromEnv()->createEditableCopy(); - config->setProcessorCacheFlags(nocache ? OCIO::PROCESSOR_CACHE_OFF - : OCIO::PROCESSOR_CACHE_DEFAULT); + OCIO::ConfigRcPtr config = OCIO::Config::CreateFromEnv()->createEditableCopy(); + config->setProcessorCacheFlags( + nocache ? OCIO::PROCESSOR_CACHE_OFF : OCIO::PROCESSOR_CACHE_DEFAULT); { CustomMeasure m("Create the config identifier:\t\t", iterations); @@ -347,10 +351,10 @@ int main(int argc, const char **argv) useInvertview = !display.empty() && !view.empty() && !outColorSpace.empty(); // Errors validation - std::string msg; - if ((useColorspaces && !useDisplayview && !useInvertview) || - (useDisplayview && !useColorspaces && !useInvertview) || - (useInvertview && !useColorspaces && !useDisplayview)) + std::string msg; + if ((useColorspaces && !useDisplayview && !useInvertview) + || (useDisplayview && !useColorspaces && !useInvertview) + || (useInvertview && !useColorspaces && !useDisplayview)) { if (useColorspaces || useInvertview) { @@ -360,11 +364,11 @@ int main(int argc, const char **argv) { msg = "Create the (display, view) processor:\t"; } - } + } else { - static constexpr char err[] - {"Any combinations of --colorspaces, --view or --invertview is invalid."}; + static constexpr char err[]{ + "Any combinations of --colorspaces, --view or --invertview is invalid."}; throw OCIO::Exception(err); } @@ -378,11 +382,12 @@ int main(int argc, const char **argv) OCIO::ClearAllCaches(); } - // Processing colorspaces option + // Processing colorspaces option if (useColorspaces) { m.resume(); - processor = config->getProcessor(inColorSpace.c_str(), outColorSpace.c_str()); + processor + = config->getProcessor(inColorSpace.c_str(), outColorSpace.c_str()); m.pause(); } // Processing view option @@ -391,12 +396,13 @@ int main(int argc, const char **argv) OCIO::ConstMatrixTransformRcPtr noChannelView; m.resume(); - processor = OCIO::DisplayViewHelpers::GetProcessor(config, - inColorSpace.c_str(), - display.c_str(), - view.c_str(), - noChannelView, - OCIO::TRANSFORM_DIR_FORWARD); + processor = OCIO::DisplayViewHelpers::GetProcessor( + config, + inColorSpace.c_str(), + display.c_str(), + view.c_str(), + noChannelView, + OCIO::TRANSFORM_DIR_FORWARD); m.pause(); } // Processing invertview option @@ -405,12 +411,13 @@ int main(int argc, const char **argv) OCIO::ConstMatrixTransformRcPtr noChannelView; m.resume(); - processor = OCIO::DisplayViewHelpers::GetProcessor(config, - outColorSpace.c_str(), - display.c_str(), - view.c_str(), - noChannelView, - OCIO::TRANSFORM_DIR_INVERSE); + processor = OCIO::DisplayViewHelpers::GetProcessor( + config, + outColorSpace.c_str(), + display.c_str(), + view.c_str(), + noChannelView, + OCIO::TRANSFORM_DIR_INVERSE); m.pause(); } } @@ -424,10 +431,9 @@ int main(int argc, const char **argv) const OCIO::OptimizationFlags optimFlags = nooptim ? OCIO::OPTIMIZATION_NONE : OCIO::OPTIMIZATION_DEFAULT; - auto GetBitDepthFromString = [](const std::string & str) -> OCIO::BitDepth - { + auto GetBitDepthFromString = [](const std::string & str) -> OCIO::BitDepth { OCIO::BitDepth bd = OCIO::BIT_DEPTH_F32; - + if (str == "f32") { bd = OCIO::BIT_DEPTH_F32; @@ -455,12 +461,11 @@ int main(int argc, const char **argv) { CustomMeasure m("Create the optimized processor:\t\t", iterations); - for(unsigned iter=0; itergetOptimizedProcessor(inBitDepth, - outBitDepth, - optimFlags); + optProcessor + = processor->getOptimizedProcessor(inBitDepth, outBitDepth, optimFlags); m.pause(); } } @@ -471,7 +476,7 @@ int main(int argc, const char **argv) { CustomMeasure m("Create the GPU processor:\t\t", iterations); - for(unsigned iter=0; itergetOptimizedGPUProcessor(optimFlags); @@ -485,7 +490,7 @@ int main(int argc, const char **argv) { CustomMeasure m("Create the GPU shader:\t\t\t", iterations); - for(unsigned iter=0; itersetLanguage(OCIO::GPU_LANGUAGE_GLSL_1_2); @@ -502,12 +507,11 @@ int main(int argc, const char **argv) { CustomMeasure m("Create the CPU processor:\t\t", iterations); - for(unsigned iter=0; itergetOptimizedCPUProcessor(inBitDepth, - outBitDepth, - optimFlags); + cpuProcessor + = optProcessor->getOptimizedCPUProcessor(inBitDepth, outBitDepth, optimFlags); m.pause(); } } @@ -517,8 +521,8 @@ int main(int argc, const char **argv) // Create an arbitrary 4K RGBA image. - static constexpr size_t width = 3840; - static constexpr size_t height = 2160; + static constexpr size_t width = 3840; + static constexpr size_t height = 2160; static constexpr size_t numChannels = 4; static constexpr size_t maxElts = width * height; @@ -528,7 +532,7 @@ int main(int argc, const char **argv) // Generate a synthetic image by emulating a LUT3D identity algorithm that steps through // many different colors. Need to avoid a constant image, simple gradients, or anything - // that would result in more cache hits than a typical image. Also, want to step through a + // that would result in more cache hits than a typical image. Also, want to step through a // wide range of colors, including outside [0,1], in case some algorithms are faster or // slower for certain colors. @@ -538,24 +542,23 @@ int main(int argc, const char **argv) if (inBitDepth == OCIO::BIT_DEPTH_F32) { static constexpr float min = -1.0f; - static constexpr float max = 2.0f; + static constexpr float max = 2.0f; static constexpr float range = max - min; img_f32_ref.resize(maxElts * numChannels); // Retrofit value in the range. - auto adjustValue = [](float val) -> float - { - return val * range + min; - }; + auto adjustValue = [](float val) -> float { return val * range + min; }; for (size_t idx = 0; idx < maxElts; ++idx) { - img_f32_ref[numChannels * idx + 0] = adjustValue( ((idx / length / length) % length) * stepValue ); - img_f32_ref[numChannels * idx + 1] = adjustValue( ((idx / length) % length) * stepValue ); - img_f32_ref[numChannels * idx + 2] = adjustValue( (idx % length) * stepValue ); + img_f32_ref[numChannels * idx + 0] + = adjustValue(((idx / length / length) % length) * stepValue); + img_f32_ref[numChannels * idx + 1] + = adjustValue(((idx / length) % length) * stepValue); + img_f32_ref[numChannels * idx + 2] = adjustValue((idx % length) * stepValue); - img_f32_ref[numChannels * idx + 3] = adjustValue( float(idx) / maxElts ); + img_f32_ref[numChannels * idx + 3] = adjustValue(float(idx) / maxElts); } } else // request an integer image @@ -563,22 +566,22 @@ int main(int argc, const char **argv) img_ui16_ref.resize(maxElts * numChannels); // Retrofit value in the range. - auto adjustValue = [](float val) -> uint16_t - { - return static_cast(val * 65535); - }; + auto adjustValue + = [](float val) -> uint16_t { return static_cast(val * 65535); }; for (size_t idx = 0; idx < maxElts; ++idx) { - img_ui16_ref[numChannels * idx + 0] = adjustValue( ((idx / length / length) % length) * stepValue ); - img_ui16_ref[numChannels * idx + 1] = adjustValue( ((idx / length) % length) * stepValue ); - img_ui16_ref[numChannels * idx + 2] = adjustValue( (idx % length) * stepValue ); + img_ui16_ref[numChannels * idx + 0] + = adjustValue(((idx / length / length) % length) * stepValue); + img_ui16_ref[numChannels * idx + 1] + = adjustValue(((idx / length) % length) * stepValue); + img_ui16_ref[numChannels * idx + 2] = adjustValue((idx % length) * stepValue); - img_ui16_ref[numChannels * idx + 3] = adjustValue( float(idx) / maxElts ); + img_ui16_ref[numChannels * idx + 3] = adjustValue(float(idx) / maxElts); } } - if(testType==0 || testType==-1) + if (testType == 0 || testType == -1) { // Process the complete image (in place). @@ -586,20 +589,21 @@ int main(int argc, const char **argv) { CustomMeasure m("Process the complete image (in place):\t\t\t\t", iterations); - for(unsigned iter=0; iter inImg_f32 = img_f32_ref; + std::vector inImg_f32 = img_f32_ref; std::vector inImg_ui16 = img_ui16_ref; - OCIO::PackedImageDesc imgDesc(inBitDepth == OCIO::BIT_DEPTH_F32 - ? (void*)&inImg_f32[0] : (void*)&inImg_ui16[0], - width, - height, - numChannels, - inBitDepth, - OCIO::AutoStride, - OCIO::AutoStride, - OCIO::AutoStride); + OCIO::PackedImageDesc imgDesc( + inBitDepth == OCIO::BIT_DEPTH_F32 ? (void *)&inImg_f32[0] + : (void *)&inImg_ui16[0], + width, + height, + numChannels, + inBitDepth, + OCIO::AutoStride, + OCIO::AutoStride, + OCIO::AutoStride); // Apply the color transformation. m.resume(); @@ -611,43 +615,46 @@ int main(int argc, const char **argv) // Process the complete image with input and output buffers. { - std::vector inImg_f32 = img_f32_ref; + std::vector inImg_f32 = img_f32_ref; std::vector inImg_ui16 = img_ui16_ref; - OCIO::PackedImageDesc inImgDesc(inBitDepth == OCIO::BIT_DEPTH_F32 - ? (void*)&inImg_f32[0] : (void*)&inImg_ui16[0], - width, - height, - numChannels, - inBitDepth, - OCIO::AutoStride, - OCIO::AutoStride, - OCIO::AutoStride); + OCIO::PackedImageDesc inImgDesc( + inBitDepth == OCIO::BIT_DEPTH_F32 ? (void *)&inImg_f32[0] + : (void *)&inImg_ui16[0], + width, + height, + numChannels, + inBitDepth, + OCIO::AutoStride, + OCIO::AutoStride, + OCIO::AutoStride); std::vector outImg_f32 = img_f32_ref; - outImg_f32.resize(outBitDepth == OCIO::BIT_DEPTH_F32 ? width * height * numChannels : 0); + outImg_f32.resize( + outBitDepth == OCIO::BIT_DEPTH_F32 ? width * height * numChannels : 0); std::vector outImg_ui16 = img_ui16_ref; - outImg_ui16.resize(outBitDepth == OCIO::BIT_DEPTH_UINT16 ? width * height * numChannels : 0); - - OCIO::PackedImageDesc outImgDesc(outBitDepth == OCIO::BIT_DEPTH_F32 - ? (void*)&outImg_f32[0] : (void*)&outImg_ui16[0], - width, - height, - numChannels, - outBitDepth, - OCIO::AutoStride, - OCIO::AutoStride, - OCIO::AutoStride); + outImg_ui16.resize( + outBitDepth == OCIO::BIT_DEPTH_UINT16 ? width * height * numChannels : 0); + + OCIO::PackedImageDesc outImgDesc( + outBitDepth == OCIO::BIT_DEPTH_F32 ? (void *)&outImg_f32[0] + : (void *)&outImg_ui16[0], + width, + height, + numChannels, + outBitDepth, + OCIO::AutoStride, + OCIO::AutoStride, + OCIO::AutoStride); // Use a custom cpu processor as input and output bit depths could be different. - auto cpu = optProcessor->getOptimizedCPUProcessor(inBitDepth, - outBitDepth, - optimFlags); + auto cpu + = optProcessor->getOptimizedCPUProcessor(inBitDepth, outBitDepth, optimFlags); CustomMeasure m("Process the complete image (two buffers):\t\t\t", iterations); - for(unsigned iter=0; iter inImg_f32 = img_f32_ref; + std::vector inImg_f32 = img_f32_ref; std::vector inImg_ui16 = img_ui16_ref; - OCIO::PackedImageDesc inImgDesc(inBitDepth == OCIO::BIT_DEPTH_F32 - ? (void*)&inImg_f32[0] : (void*)&inImg_ui16[0], - width, - height, - numChannels, - inBitDepth, - OCIO::AutoStride, - OCIO::AutoStride, - OCIO::AutoStride); - - CustomMeasure m("Process the complete image (in place) but line by line:\t\t", iterations); - - for(unsigned iter=0; iter inImg_f32 = img_f32_ref; - OCIO::PackedImageDesc inImgDesc((void*)&inImg_f32[0], - width, - height, - numChannels); + OCIO::PackedImageDesc inImgDesc((void *)&inImg_f32[0], width, height, numChannels); - CustomMeasure m("Process the complete image (in place) but pixel per pixel:\t", iterations); + CustomMeasure m( + "Process the complete image (in place) but pixel per pixel:\t", + iterations); - for(unsigned iter=0; itergetSearchPath() << std::endl; } - catch(...) + catch (...) { std::cerr << "Error loading the config file: '" << env << "'"; exit(1); @@ -109,7 +110,7 @@ int main(int argc, const char **argv) const char * ext = strrchr(filepath.c_str(), '.'); if (ext) { - std::string requestedExt(ext+1); + std::string requestedExt(ext + 1); std::transform(requestedExt.begin(), requestedExt.end(), requestedExt.begin(), ::tolower); for (int i = 0; i < OCIO::GroupTransform::GetNumWriteFormats(); ++i) { @@ -148,16 +149,19 @@ int main(int argc, const char **argv) if (!inputColorSpace.empty() || (!display.empty() && !view.empty())) { const char * env = OCIO::GetEnvVariable("OCIO"); - if(env && *env) + if (env && *env) { if (verbose) { std::cout << std::endl; - std::string inputStr = !inputColorSpace.empty() ? inputColorSpace : "(" + display + ", " + view + ")"; - std::string outputStr = !outputColorSpace.empty() ? outputColorSpace : "(" + display + ", " + view + ")"; - std::cout << "Processing from '" - << inputStr << "' to '" - << outputStr << "'" << std::endl; + std::string inputStr = !inputColorSpace.empty() + ? inputColorSpace + : "(" + display + ", " + view + ")"; + std::string outputStr = !outputColorSpace.empty() + ? outputColorSpace + : "(" + display + ", " + view + ")"; + std::cout << "Processing from '" << inputStr << "' to '" << outputStr << "'" + << std::endl; } } else @@ -167,7 +171,7 @@ int main(int argc, const char **argv) exit(1); } - OCIO::ConstConfigRcPtr config = OCIO::Config::CreateFromEnv(); + OCIO::ConstConfigRcPtr config = OCIO::Config::CreateFromEnv(); if (verbose) { @@ -190,17 +194,18 @@ int main(int argc, const char **argv) useInvertview = !display.empty() && !view.empty() && !outputColorSpace.empty(); // Errors validation - std::string msg; - if (!((useColorspaces && !useDisplayview && !useInvertview) || - (useDisplayview && !useColorspaces && !useInvertview) || - (useInvertview && !useColorspaces && !useDisplayview))) + std::string msg; + if (!((useColorspaces && !useDisplayview && !useInvertview) + || (useDisplayview && !useColorspaces && !useInvertview) + || (useInvertview && !useColorspaces && !useDisplayview))) { std::cerr << std::endl; - std::cerr << "Any combinations of --colorspaces, --view or --invertview is invalid." << std::endl; + std::cerr << "Any combinations of --colorspaces, --view or --invertview is invalid." + << std::endl; exit(1); - } + } - // Processing colorspaces option + // Processing colorspaces option if (useColorspaces) { // colorspaces to colorspaces @@ -208,7 +213,8 @@ int main(int argc, const char **argv) // validate output arguments if (!outputColorSpace.empty()) { - processor = config->getProcessor(inputColorSpace.c_str(), outputColorSpace.c_str()); + processor + = config->getProcessor(inputColorSpace.c_str(), outputColorSpace.c_str()); } else { @@ -216,7 +222,7 @@ int main(int argc, const char **argv) std::cerr << "Missing output color spaces for --colorspaces." << std::endl; exit(1); } - } + } // Processing view option else if (useDisplayview) { @@ -225,10 +231,11 @@ int main(int argc, const char **argv) // validate output arguments if (!display.empty() && !view.empty()) { - processor = config->getProcessor(inputColorSpace.c_str(), - display.c_str(), - view.c_str(), - OCIO::TRANSFORM_DIR_FORWARD); + processor = config->getProcessor( + inputColorSpace.c_str(), + display.c_str(), + view.c_str(), + OCIO::TRANSFORM_DIR_FORWARD); } else { @@ -245,10 +252,11 @@ int main(int argc, const char **argv) // validate output arguments if (!outputColorSpace.empty()) { - processor = config->getProcessor(outputColorSpace.c_str(), - display.c_str(), - view.c_str(), - OCIO::TRANSFORM_DIR_INVERSE); + processor = config->getProcessor( + outputColorSpace.c_str(), + display.c_str(), + view.c_str(), + OCIO::TRANSFORM_DIR_INVERSE); } else { @@ -275,16 +283,17 @@ int main(int argc, const char **argv) else { std::cerr << std::endl; - std::cerr << "Colorspaces or (display,view) pair must be specified as source." << std::endl; + std::cerr << "Colorspaces or (display,view) pair must be specified as source." + << std::endl; exit(1); } } - catch(OCIO::Exception & exception) + catch (OCIO::Exception & exception) { std::cerr << "OCIO Error: " << exception.what() << std::endl; exit(1); } - catch(...) + catch (...) { std::cerr << "Unknown OCIO error encountered." << std::endl; exit(1); diff --git a/src/apputils/argparse.cpp b/src/apputils/argparse.cpp index d3dfd542a9..55a3762dd9 100644 --- a/src/apputils/argparse.cpp +++ b/src/apputils/argparse.cpp @@ -29,103 +29,113 @@ (This is the Modified BSD License) */ - -#include -#include +#include #include +#include +#include #include +#include #include -#include #include -#include -#include "strutil.h" #include "argparse.h" +#include "strutil.h" -class ArgOption { +class ArgOption +{ public: - typedef int (*callback_t) (int, const char**); + typedef int (*callback_t)(int, const char **); ArgOption() = delete; - explicit ArgOption (const char *str); - ArgOption(const ArgOption &) = delete; + explicit ArgOption(const char * str); + ArgOption(const ArgOption &) = delete; ArgOption & operator=(const ArgOption &) = delete; - ~ArgOption () = default; + ~ArgOption() = default; - int initialize (); + int initialize(); - int parameter_count () const { return m_count; } + int parameter_count() const { return m_count; } const std::string & name() const { return m_flag; } const std::string & fmt() const { return m_format; } - bool is_flag () const { return m_type == Flag; } - bool is_sublist () const { return m_type == Sublist; } - bool is_regular () const { return m_type == Regular; } + bool is_flag() const { return m_type == Flag; } + bool is_sublist() const { return m_type == Sublist; } + bool is_regular() const { return m_type == Regular; } - void add_parameter (int i, void *p); + void add_parameter(int i, void * p); - void set_parameter (int i, const char *argv); + void set_parameter(int i, const char * argv); - void add_argument (const char *argv); - int invoke_callback () const; + void add_argument(const char * argv); + int invoke_callback() const; - int invoke_callback (int argc, const char **argv) const { - return m_callback ? m_callback (argc, argv) : 0; + int invoke_callback(int argc, const char ** argv) const + { + return m_callback ? m_callback(argc, argv) : 0; } - void set_callback (callback_t cb) { m_callback = cb; } + void set_callback(callback_t cb) { m_callback = cb; } - void found_on_command_line () { m_repetitions++; } - int parsed_count () const { return m_repetitions; } + void found_on_command_line() { m_repetitions++; } + int parsed_count() const { return m_repetitions; } - void description (const char *d) { m_descript = d; } + void description(const char * d) { m_descript = d; } const std::string & description() const { return m_descript; } private: - enum OptionType { None, Regular, Flag, Sublist }; - - std::string m_format; // original format string - std::string m_flag; // just the -flag_foo part - std::string m_code; // parameter types, eg "df" + enum OptionType + { + None, + Regular, + Flag, + Sublist + }; + + std::string m_format; // original format string + std::string m_flag; // just the -flag_foo part + std::string m_code; // parameter types, eg "df" std::string m_descript; - OptionType m_type; - int m_count; // number of parameters - std::vector m_param; // pointers to app data vars + OptionType m_type; + int m_count; // number of parameters + std::vector m_param; // pointers to app data vars callback_t m_callback; - int m_repetitions; // number of times on cmd line + int m_repetitions; // number of times on cmd line std::vector m_argv; }; - - // Constructor. Does not do any parsing or error checking. // Make sure to call initialize() right after construction. -ArgOption::ArgOption (const char *str) - : m_format(str), m_type(None), m_count(0), - m_callback(NULL), m_repetitions(0) +ArgOption::ArgOption(const char * str) + : m_format(str) + , m_type(None) + , m_count(0) + , m_callback(NULL) + , m_repetitions(0) { } - - // Parses the format string ("-option %s %d %f") to extract the // flag ("-option") and create a code string ("sdf"). After the // code string is created, the param list of void* pointers is // allocated to hold the argument variable pointers. -int -ArgOption::initialize() +int ArgOption::initialize() { size_t n; - const char *s; - - if (m_format.empty() || m_format == "%*") { - m_type = Sublist; - m_count = 1; // sublist callback function pointer - m_code = "*"; - m_flag = ""; - } else if (m_format == "") { - } else { + const char * s; + + if (m_format.empty() || m_format == "%*") + { + m_type = Sublist; + m_count = 1; // sublist callback function pointer + m_code = "*"; + m_flag = ""; + } + else if (m_format == "") + { + } + else + { // extract the flag name s = &m_format[0]; assert(*s == '-'); @@ -135,51 +145,58 @@ ArgOption::initialize() if (*s == '-') s++; - while (isalnum(*s) || *s == '_' || *s == '-') s++; + while (isalnum(*s) || *s == '_' || *s == '-') + s++; - if (! *s) { - m_flag = m_format; - m_type = Flag; + if (!*s) + { + m_flag = m_format; + m_type = Flag; m_count = 1; - m_code = "b"; - } else { + m_code = "b"; + } + else + { n = s - (&m_format[0]); - m_flag.assign (m_format.begin(), m_format.begin()+n); + m_flag.assign(m_format.begin(), m_format.begin() + n); // Parse the scanf-like parameters m_type = Regular; - n = (m_format.length() - n) / 2; // conservative estimate - m_code.clear (); + n = (m_format.length() - n) / 2; // conservative estimate + m_code.clear(); - while (*s != '\0') { - if (*s == '%') { + while (*s != '\0') + { + if (*s == '%') + { s++; assert(*s != '\0'); - m_count++; // adding another parameter - - switch (*s) { - case 'd': // 32bit int - case 'g': // float - case 'f': // float - case 'F': // double - case 's': // string - case 'L': // vector - assert (m_type == Regular); - m_code += *s; - break; - - case '*': - assert(m_count == 1); - m_type = Sublist; - break; - - default: - std::cerr << "Programmer error: Unknown option "; - std::cerr << "type string \"" << *s << "\"" << "\n"; - abort(); + m_count++; // adding another parameter + + switch (*s) + { + case 'd': // 32bit int + case 'g': // float + case 'f': // float + case 'F': // double + case 's': // string + case 'L': // vector + assert(m_type == Regular); + m_code += *s; + break; + + case '*': + assert(m_count == 1); + m_type = Sublist; + break; + + default: + std::cerr << "Programmer error: Unknown option "; + std::cerr << "type string \"" << *s << "\"" << "\n"; + abort(); } } @@ -189,126 +206,110 @@ ArgOption::initialize() } // Allocate space for the parameter pointers and initialize to NULL - m_param.resize (m_count, NULL); + m_param.resize(m_count, NULL); return 0; } - - // Stores the pointer to an argument in the param list and // initializes flag options to FALSE. // FIXME -- there is no such initialization. Bug? -void -ArgOption::add_parameter (int i, void *p) +void ArgOption::add_parameter(int i, void * p) { - assert (i >= 0 && i < m_count); + assert(i >= 0 && i < m_count); m_param[i] = p; } - - // Given a string from argv, set the associated option parameter // at index i using the format conversion code in the code string. -void -ArgOption::set_parameter (int i, const char *argv) +void ArgOption::set_parameter(int i, const char * argv) { assert(i < m_count); static const std::string nullStr; - switch (m_code[i]) { - case 'd': - *(int *)m_param[i] = argv ? atoi(argv) : 0; - break; + switch (m_code[i]) + { + case 'd': + *(int *)m_param[i] = argv ? atoi(argv) : 0; + break; - case 'f': - case 'g': - *(float *)m_param[i] = argv ? (float)atof(argv) : 0.0f; - break; + case 'f': + case 'g': + *(float *)m_param[i] = argv ? (float)atof(argv) : 0.0f; + break; - case 'F': - *(double *)m_param[i] = argv ? atof(argv) : 0.; - break; + case 'F': + *(double *)m_param[i] = argv ? atof(argv) : 0.; + break; - case 's': - *(std::string *)m_param[i] = argv ? argv : nullStr; - break; + case 's': + *(std::string *)m_param[i] = argv ? argv : nullStr; + break; - case 'S': - *(std::string *)m_param[i] = argv ? argv : nullStr; - break; + case 'S': + *(std::string *)m_param[i] = argv ? argv : nullStr; + break; - case 'L': - ((std::vector *)m_param[i])->push_back (argv); - break; + case 'L': + ((std::vector *)m_param[i])->push_back(argv); + break; - case 'b': - *(bool *)m_param[i] = true; - break; + case 'b': + *(bool *)m_param[i] = true; + break; - case '*': - default: - abort(); + case '*': + default: + abort(); } } - - // Call the sublist callback if any arguments have been parsed -int -ArgOption::invoke_callback () const +int ArgOption::invoke_callback() const { - assert (m_count == 1); + assert(m_count == 1); - int argc = (int) m_argv.size(); + int argc = (int)m_argv.size(); if (argc == 0) return 0; // Convert the argv's to char*[] - const char **myargv = (const char **) alloca (argc * sizeof(const char *)); - for (int i = 0; i < argc; ++i) + const char ** myargv = (const char **)alloca(argc * sizeof(const char *)); + for (int i = 0; i < argc; ++i) myargv[i] = m_argv[i].c_str(); - return invoke_callback (argc, myargv); + return invoke_callback(argc, myargv); } - - // Add an argument to this sublist option -void -ArgOption::add_argument (const char *argv) +void ArgOption::add_argument(const char * argv) { - m_argv.push_back (argv); + m_argv.push_back(argv); } - - - - -ArgParse::ArgParse () - : m_argc(0), m_argv(nullptr), m_global(nullptr) +ArgParse::ArgParse() + : m_argc(0) + , m_argv(nullptr) + , m_global(nullptr) { } - - -ArgParse::ArgParse (int argc, const char **argv) - : m_argc(argc), m_argv(argv), m_global(nullptr) +ArgParse::ArgParse(int argc, const char ** argv) + : m_argc(argc) + , m_argv(argv) + , m_global(nullptr) { } - - ArgParse::~ArgParse() { - for (unsigned int i=0; ifound_on_command_line(); - if (option->is_flag()) { + if (option->is_flag()) + { option->set_parameter(0, NULL); - } else { - assert (option->is_regular()); - for (int j = 0; j < option->parameter_count(); j++) { - if (j+i+1 >= m_argc) { - error ("Missing parameter %d from option " - "\"%s\"", j+1, option->name().c_str()); + } + else + { + assert(option->is_regular()); + for (int j = 0; j < option->parameter_count(); j++) + { + if (j + i + 1 >= m_argc) + { + error( + "Missing parameter %d from option " + "\"%s\"", + j + 1, + option->name().c_str()); return -1; } - option->set_parameter (j, m_argv[i+j+1]); + option->set_parameter(j, m_argv[i + j + 1]); } i += option->parameter_count(); } - } else { + } + else + { // not an option nor an option parameter, glob onto global list if (m_global) - m_global->invoke_callback (1, m_argv+i); - else { - error ("Argument \"%s\" does not have an associated " - "option", m_argv[i]); + m_global->invoke_callback(1, m_argv + i); + else + { + error( + "Argument \"%s\" does not have an associated " + "option", + m_argv[i]); return -1; } } @@ -362,8 +377,6 @@ ArgParse::parse (int xargc, const char **xargv) return 0; } - - // Primary entry point. This function accepts a set of format strings // and variable pointers. Each string contains an option name and a // scanf-like format string to enumerate the arguments of that option @@ -372,157 +385,150 @@ ArgParse::parse (int xargc, const char **xargv) // strings and arguments are parsed to create a list of ArgOption objects. // After all ArgOptions are created, the command line is parsed and // the sublist option callbacks are invoked. -int -ArgParse::options (const char *intro, ...) +int ArgParse::options(const char * intro, ...) { va_list ap; - va_start (ap, intro); + va_start(ap, intro); m_intro = intro; - for (const char *cur = va_arg(ap, char *); cur; cur = va_arg(ap, char *)) { - if (find_option (cur) && - strcmp(cur, "")) { - error ("Option \"%s\" is multiply defined", cur); + for (const char * cur = va_arg(ap, char *); cur; cur = va_arg(ap, char *)) + { + if (find_option(cur) && strcmp(cur, "")) + { + error("Option \"%s\" is multiply defined", cur); return -1; } // Build a new option and then parse the values - ArgOption *option = new ArgOption (cur); - if (option->initialize() < 0) { + ArgOption * option = new ArgOption(cur); + if (option->initialize() < 0) + { return -1; } - if (cur[0] == '\0' || - (cur[0] == '%' && cur[1] == '*' && cur[2] == '\0')) { + if (cur[0] == '\0' || (cur[0] == '%' && cur[1] == '*' && cur[2] == '\0')) + { // set default global option m_global = option; } // Grab any parameters and store them with this option - for (int i = 0; i < option->parameter_count(); i++) { - void *p = va_arg (ap, void *); - if (p == NULL) { - error ("Missing argument parameter for \"%s\"", - option->name().c_str()); + for (int i = 0; i < option->parameter_count(); i++) + { + void * p = va_arg(ap, void *); + if (p == NULL) + { + error("Missing argument parameter for \"%s\"", option->name().c_str()); return -1; } - option->add_parameter (i, p); + option->add_parameter(i, p); if (option == m_global) - option->set_callback ((ArgOption::callback_t)p); + option->set_callback((ArgOption::callback_t)p); } // Last argument is description - option->description ((const char *) va_arg (ap, const char *)); + option->description((const char *)va_arg(ap, const char *)); m_option.push_back(option); } - va_end (ap); + va_end(ap); return 0; } - - // Find an option by name in the option vector -ArgOption * -ArgParse::find_option (const char *name) +ArgOption * ArgParse::find_option(const char * name) { - for (std::vector::const_iterator i = m_option.begin(); - i != m_option.end(); i++) { - const char *opt = (*i)->name().c_str(); - if (! strcmp(name, opt)) + for (std::vector::const_iterator i = m_option.begin(); i != m_option.end(); i++) + { + const char * opt = (*i)->name().c_str(); + if (!strcmp(name, opt)) return *i; // Match even if the user mixes up one dash or two if (name[0] == '-' && name[1] == '-' && opt[0] == '-' && opt[1] != '-') - if (! strcmp (name+1, opt)) + if (!strcmp(name + 1, opt)) return *i; if (name[0] == '-' && name[1] != '-' && opt[0] == '-' && opt[1] == '-') - if (! strcmp (name, opt+1)) + if (!strcmp(name, opt + 1)) return *i; } return NULL; } - - -int -ArgParse::found (const char *option_name) +int ArgParse::found(const char * option_name) { - ArgOption *option = find_option(option_name); - if (option == NULL) return 0; + ArgOption * option = find_option(option_name); + if (option == NULL) + return 0; return option->parsed_count(); } - - -void -ArgParse::error (const char *format, ...) +void ArgParse::error(const char * format, ...) { va_list ap; - va_start (ap, format); - m_errmessage = Strutil::vformat (format, ap); - va_end (ap); + va_start(ap, format); + m_errmessage = Strutil::vformat(format, ap); + va_end(ap); } -std::string -ArgParse::geterror () const +std::string ArgParse::geterror() const { std::string e = m_errmessage; - m_errmessage.clear (); + m_errmessage.clear(); return e; } - -void -ArgParse::usage () const +void ArgParse::usage() const { const size_t longline = 40; std::cout << m_intro << '\n'; size_t maxlen = 0; - for (unsigned int i=0; ifmt().length(); + for (unsigned int i = 0; i < m_option.size(); ++i) + { + ArgOption * opt = m_option[i]; + size_t fmtlen = opt->fmt().length(); // Option lists > 40 chars will be split into multiple lines if (fmtlen < longline) - maxlen = std::max (maxlen, fmtlen); + maxlen = std::max(maxlen, fmtlen); } - for (unsigned int i=0; idescription().length()) { + for (unsigned int i = 0; i < m_option.size(); ++i) + { + ArgOption * opt = m_option[i]; + if (opt->description().length()) + { size_t fmtlen = opt->fmt().length(); if (opt->fmt() == "") std::cout << opt->description() << '\n'; else if (fmtlen < longline) - std::cout << " " << opt->fmt() - << std::string (maxlen + 2 - fmtlen, ' ') + std::cout << " " << opt->fmt() << std::string(maxlen + 2 - fmtlen, ' ') << opt->description() << '\n'; else - std::cout << " " << opt->fmt() << "\n " - << std::string (maxlen + 2, ' ') + std::cout << " " << opt->fmt() << "\n " << std::string(maxlen + 2, ' ') << opt->description() << '\n'; } } } - - -std::string -ArgParse::command_line () const +std::string ArgParse::command_line() const { std::string s; - for (int i = 0; i < m_argc; ++i) { - if (strchr (m_argv[i], ' ')) { + for (int i = 0; i < m_argc; ++i) + { + if (strchr(m_argv[i], ' ')) + { s += '\"'; s += m_argv[i]; s += '\"'; - } else { + } + else + { s += m_argv[i]; } - if (i < m_argc-1) + if (i < m_argc - 1) s += ' '; } return s; diff --git a/src/apputils/argparse.h b/src/apputils/argparse.h index 2bf03a43c6..f12c3bef4d 100644 --- a/src/apputils/argparse.h +++ b/src/apputils/argparse.h @@ -29,28 +29,24 @@ (This is the Modified BSD License) */ - /// \file /// \brief Simple parsing of program command-line arguments. - #ifndef INCLUDED_OCIO_ARGPARSE_H #define INCLUDED_OCIO_ARGPARSE_H #include #include -#ifndef OPENCOLORIO_PRINTF_ARGS /* See comments in strutil.h */ -# ifndef __GNUC__ -# define __attribute__(x) -# endif -# define OPENCOLORIO_PRINTF_ARGS(fmtarg_pos, vararg_pos) \ - __attribute__ ((format (printf, fmtarg_pos, vararg_pos) )) +#ifndef OPENCOLORIO_PRINTF_ARGS /* See comments in strutil.h */ +#ifndef __GNUC__ +#define __attribute__(x) +#endif +#define OPENCOLORIO_PRINTF_ARGS(fmtarg_pos, vararg_pos) \ + __attribute__((format(printf, fmtarg_pos, vararg_pos))) #endif -class ArgOption; // Forward declaration - - +class ArgOption; // Forward declaration ///////////////////////////////////////////////////////////////////////////// /// @@ -69,7 +65,7 @@ class ArgOption; // Forward declaration /// filenames.push_back (argv[i]); /// return 0; /// } -/// +/// /// ... /// /// ArgParse ap; @@ -103,7 +99,7 @@ class ArgOption; // Forward declaration /// - \%F - 64bit float (double) /// - \%s - std::string /// - \%L - std::vector (takes 1 arg, appends to list) -/// - \%* - catch all non-options and pass individually as an (argc,argv) +/// - \%* - catch all non-options and pass individually as an (argc,argv) /// sublist to a callback, each immediately after it's found /// /// There are several special format tokens: @@ -119,14 +115,14 @@ class ArgOption; // Forward declaration /// ///////////////////////////////////////////////////////////////////////////// - -class ArgParse { +class ArgParse +{ public: - ArgParse (); - ArgParse (const ArgParse & ) = delete; - ArgParse & operator= (const ArgParse & ) = delete; - ArgParse (int argc, const char **argv); - ~ArgParse (); + ArgParse(); + ArgParse(const ArgParse &) = delete; + ArgParse & operator=(const ArgParse &) = delete; + ArgParse(int argc, const char ** argv); + ~ArgParse(); /// Declare the command line options. After the introductory /// message, parameters are a set of format strings and variable @@ -135,41 +131,41 @@ class ArgParse { /// (eg. "-option %d %f %s"). The format string is followed by a /// list of pointers to the argument variables, just like scanf. A /// NULL terminates the list. - int options (const char *intro, ...); + int options(const char * intro, ...); /// With the options already set up, parse the command line. /// Return 0 if ok, -1 if it's a malformed command line. - int parse (int argc, const char **argv); + int parse(int argc, const char ** argv); /// Return any error messages generated during the course of parse() /// (and clear any error flags). If no error has occurred since the /// last time geterror() was called, it will return an empty string. - std::string geterror () const; + std::string geterror() const; /// Deprecated /// - std::string error_message () const { return geterror (); } + std::string error_message() const { return geterror(); } /// Print the usage message to stdout. The usage message is /// generated and formatted automatically based on the command and /// description arguments passed to parse(). - void usage () const; + void usage() const; /// Return the entire command-line as one string. /// - std::string command_line () const; + std::string command_line() const; private: - int m_argc; // a copy of the command line argc - const char **m_argv; // a copy of the command line argv - mutable std::string m_errmessage; // error message - ArgOption *m_global; // option for extra cmd line arguments + int m_argc; // a copy of the command line argc + const char ** m_argv; // a copy of the command line argv + mutable std::string m_errmessage; // error message + ArgOption * m_global; // option for extra cmd line arguments std::string m_intro; std::vector m_option; - ArgOption *find_option(const char *name); - void error (const char *format, ...) OPENCOLORIO_PRINTF_ARGS(2,3); - int found (const char *option); // number of times option was parsed + ArgOption * find_option(const char * name); + void error(const char * format, ...) OPENCOLORIO_PRINTF_ARGS(2, 3); + int found(const char * option); // number of times option was parsed }; #endif // INCLUDED_OCIO_ARGPARSE_H diff --git a/src/apputils/logGuard.cpp b/src/apputils/logGuard.cpp index 87a31c2651..4c69cb61b9 100644 --- a/src/apputils/logGuard.cpp +++ b/src/apputils/logGuard.cpp @@ -10,7 +10,7 @@ void CustomLoggingFunction(const char * message) } LogGuard::LogGuard() - : m_logLevel(OCIO::GetLoggingLevel()) + : m_logLevel(OCIO::GetLoggingLevel()) { OCIO::SetLoggingLevel(OCIO::LOGGING_LEVEL_DEBUG); OCIO::SetLoggingFunction(&CustomLoggingFunction); diff --git a/src/apputils/logGuard.h b/src/apputils/logGuard.h index 6ca968a0af..967f65a016 100644 --- a/src/apputils/logGuard.h +++ b/src/apputils/logGuard.h @@ -13,7 +13,7 @@ class LogGuard { public: LogGuard(); - LogGuard(const LogGuard &) = delete; + LogGuard(const LogGuard &) = delete; LogGuard & operator=(const LogGuard &) = delete; ~LogGuard(); diff --git a/src/apputils/measure.h b/src/apputils/measure.h index 3273a4935f..cbbddd24a7 100644 --- a/src/apputils/measure.h +++ b/src/apputils/measure.h @@ -4,34 +4,32 @@ #ifndef INCLUDED_OCIO_MEASURE_H #define INCLUDED_OCIO_MEASURE_H - #include -#include -#include #include - +#include +#include // Utility to measure time in ms. class Measure { public: - Measure() = delete; + Measure() = delete; Measure(const Measure &) = delete; explicit Measure(const char * explanation) - : m_explanations(explanation) + : m_explanations(explanation) { } explicit Measure(const char * explanation, unsigned iterations) - : m_explanations(explanation) - , m_iterations(iterations) + : m_explanations(explanation) + , m_iterations(iterations) { } ~Measure() { - if(m_started) + if (m_started) { pause(); } @@ -40,21 +38,21 @@ class Measure void resume() { - if(m_started) + if (m_started) { throw std::runtime_error("Measure already started."); } m_started = true; - m_start = std::chrono::high_resolution_clock::now(); + m_start = std::chrono::high_resolution_clock::now(); } void pause() { std::chrono::high_resolution_clock::time_point end - = std::chrono::high_resolution_clock::now(); + = std::chrono::high_resolution_clock::now(); - if(m_started) + if (m_started) { const std::chrono::duration duration = end - m_start; @@ -67,14 +65,13 @@ class Measure m_started = false; } - + void print() const noexcept { std::cout << "\n" << m_explanations << "\n" - << " Processing took: " - << (m_duration.count() / float(m_iterations)) - << " ms" << std::endl; + << " Processing took: " << (m_duration.count() / float(m_iterations)) << " ms" + << std::endl; } private: @@ -84,8 +81,7 @@ class Measure bool m_started = false; std::chrono::high_resolution_clock::time_point m_start; - std::chrono::duration m_duration { 0 }; + std::chrono::duration m_duration{0}; }; - #endif // INCLUDED_OCIO_MEASURE_H diff --git a/src/apputils/strutil.cpp b/src/apputils/strutil.cpp index 747596f2ec..5d30e9039e 100644 --- a/src/apputils/strutil.cpp +++ b/src/apputils/strutil.cpp @@ -28,57 +28,55 @@ (This is the Modified BSD License) */ - -#include +#include #include #include -#include #include -#include +#include +#include #include "strutil.h" - - -std::string -Strutil::vformat (const char *fmt, va_list ap) +std::string Strutil::vformat(const char * fmt, va_list ap) { // Allocate a buffer on the stack that's big enough for us almost // all the time. Be prepared to allocate dynamically if it doesn't fit. size_t size = 1024; char stackbuf[1024]; std::vector dynamicbuf; - char *buf = &stackbuf[0]; + char * buf = &stackbuf[0]; - while (1) { + while (1) + { // Try to vsnprintf into our buffer. va_list apsave; #ifdef va_copy - va_copy (apsave, ap); + va_copy(apsave, ap); #else apsave = ap; #endif - int needed = vsnprintf (buf, size, fmt, ap); - va_end (ap); + int needed = vsnprintf(buf, size, fmt, ap); + va_end(ap); // NB. C99 (which modern Linux and OS X follow) says vsnprintf // failure returns the length it would have needed. But older // glibc and current Windows return -1 for failure, i.e., not // telling us how much was needed. - if (needed < (int)size && needed >= 0) { + if (needed < (int)size && needed >= 0) + { // It fit fine so we're done. - return std::string (buf, (size_t) needed); + return std::string(buf, (size_t)needed); } // vsnprintf reported that it wanted to write more characters // than we allotted. So try again using a dynamic buffer. This // doesn't happen very often if we chose our initial size well. - size = (needed > 0) ? (needed+1) : (size*2); - dynamicbuf.resize (size); + size = (needed > 0) ? (needed + 1) : (size * 2); + dynamicbuf.resize(size); buf = &dynamicbuf[0]; #ifdef va_copy - va_copy (ap, apsave); + va_copy(ap, apsave); #else ap = apsave; #endif diff --git a/src/apputils/strutil.h b/src/apputils/strutil.h index bb6fd87600..21a322cd4b 100644 --- a/src/apputils/strutil.h +++ b/src/apputils/strutil.h @@ -28,44 +28,38 @@ (This is the Modified BSD License) */ - ///////////////////////////////////////////////////////////////////////// /// @file strutil.h /// /// @brief String-related utilities, all in namespace Strutil. ///////////////////////////////////////////////////////////////////////// - - #ifndef INCLUDED_OCIO_STRUTIL_H #define INCLUDED_OCIO_STRUTIL_H #include -#include #include #include - +#include #ifndef OPENCOLORIO_PRINTF_ARGS -# ifndef __GNUC__ -# define __attribute__(x) -# endif - // Enable printf-like warnings with gcc by attaching - // OPENIMAGEIO_PRINTF_ARGS to printf-like functions. Eg: - // - // void foo (const char* fmt, ...) OPENCOLORIO_PRINTF_ARGS(1,2); - // - // The arguments specify the positions of the format string and the - // beginning of the varargs parameter list respectively. - // - // For member functions with arguments like the example above, you need - // OPENCOLORIO_PRINTF_ARGS(2,3) instead. (gcc includes the implicit this - // pointer when it counts member function arguments.) -# define OPENCOLORIO_PRINTF_ARGS(fmtarg_pos, vararg_pos) \ - __attribute__ ((format (printf, fmtarg_pos, vararg_pos) )) +#ifndef __GNUC__ +#define __attribute__(x) +#endif +// Enable printf-like warnings with gcc by attaching +// OPENIMAGEIO_PRINTF_ARGS to printf-like functions. Eg: +// +// void foo (const char* fmt, ...) OPENCOLORIO_PRINTF_ARGS(1,2); +// +// The arguments specify the positions of the format string and the +// beginning of the varargs parameter list respectively. +// +// For member functions with arguments like the example above, you need +// OPENCOLORIO_PRINTF_ARGS(2,3) instead. (gcc includes the implicit this +// pointer when it counts member function arguments.) +#define OPENCOLORIO_PRINTF_ARGS(fmtarg_pos, vararg_pos) \ + __attribute__((format(printf, fmtarg_pos, vararg_pos))) #endif - - /// @namespace Strutil /// @@ -75,10 +69,8 @@ namespace Strutil /// Return a std::string formatted from printf-like arguments -- passed /// already as a va_list. -std::string vformat (const char *fmt, va_list ap) - OPENCOLORIO_PRINTF_ARGS(1,0); - -} // namespace Strutil +std::string vformat(const char * fmt, va_list ap) OPENCOLORIO_PRINTF_ARGS(1, 0); +} // namespace Strutil #endif // INCLUDED_OCIO_STRUTIL_H diff --git a/src/bindings/java/JNIBaker.cpp b/src/bindings/java/JNIBaker.cpp index c07afbdcdc..80ef4c9cc1 100644 --- a/src/bindings/java/JNIBaker.cpp +++ b/src/bindings/java/JNIBaker.cpp @@ -1,38 +1,41 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. -#include #include +#include +#include "JNIUtil.h" #include "OpenColorIO/OpenColorIO.h" #include "OpenColorIOJNI.h" -#include "JNIUtil.h" using namespace OCIO_NAMESPACE; -JNIEXPORT void JNICALL -Java_org_OpenColorIO_Baker_dispose(JNIEnv * env, jobject self) +JNIEXPORT void JNICALL Java_org_OpenColorIO_Baker_dispose(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() DisposeJOCIO(env, self); OCIO_JNITRY_EXIT() } -JNIEXPORT jobject JNICALL -Java_org_OpenColorIO_Baker_Create(JNIEnv * env, jobject self) +JNIEXPORT jobject JNICALL Java_org_OpenColorIO_Baker_Create(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - return BuildJObject(env, self, - env->FindClass("org/OpenColorIO/Baker"), Baker::Create()); + return BuildJObject( + env, + self, + env->FindClass("org/OpenColorIO/Baker"), + Baker::Create()); OCIO_JNITRY_EXIT(NULL) } -JNIEXPORT jobject JNICALL -Java_org_OpenColorIO_Baker_createEditableCopy(JNIEnv * env, jobject self) +JNIEXPORT jobject JNICALL Java_org_OpenColorIO_Baker_createEditableCopy(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() ConstBakerRcPtr bake = GetConstJOCIO(env, self); - return BuildJObject(env, self, - env->FindClass("org/OpenColorIO/Baker"), bake->createEditableCopy()); + return BuildJObject( + env, + self, + env->FindClass("org/OpenColorIO/Baker"), + bake->createEditableCopy()); OCIO_JNITRY_EXIT(NULL) } @@ -40,19 +43,21 @@ JNIEXPORT void JNICALL Java_org_OpenColorIO_Baker_setConfig(JNIEnv * env, jobject self, jobject config) { OCIO_JNITRY_ENTER() - BakerRcPtr bake = GetEditableJOCIO(env, self); + BakerRcPtr bake = GetEditableJOCIO(env, self); ConstConfigRcPtr cfg = GetConstJOCIO(env, config); bake->setConfig(cfg); OCIO_JNITRY_EXIT() } -JNIEXPORT jobject JNICALL -Java_org_OpenColorIO_Baker_getConfig(JNIEnv * env, jobject self) +JNIEXPORT jobject JNICALL Java_org_OpenColorIO_Baker_getConfig(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() ConstBakerRcPtr bake = GetConstJOCIO(env, self); - return BuildJConstObject(env, self, - env->FindClass("org/OpenColorIO/Config"), bake->getConfig()); + return BuildJConstObject( + env, + self, + env->FindClass("org/OpenColorIO/Config"), + bake->getConfig()); OCIO_JNITRY_EXIT(NULL) } @@ -65,8 +70,7 @@ Java_org_OpenColorIO_Baker_setFormat(JNIEnv * env, jobject self, jstring formatN OCIO_JNITRY_EXIT() } -JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_Baker_getFormat(JNIEnv * env, jobject self) +JNIEXPORT jstring JNICALL Java_org_OpenColorIO_Baker_getFormat(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() ConstBakerRcPtr bake = GetConstJOCIO(env, self); @@ -74,8 +78,7 @@ Java_org_OpenColorIO_Baker_getFormat(JNIEnv * env, jobject self) OCIO_JNITRY_EXIT(NULL) } -JNIEXPORT void JNICALL -Java_org_OpenColorIO_Baker_setType(JNIEnv * env, jobject self, jstring type) +JNIEXPORT void JNICALL Java_org_OpenColorIO_Baker_setType(JNIEnv * env, jobject self, jstring type) { OCIO_JNITRY_ENTER() BakerRcPtr bake = GetEditableJOCIO(env, self); @@ -83,8 +86,7 @@ Java_org_OpenColorIO_Baker_setType(JNIEnv * env, jobject self, jstring type) OCIO_JNITRY_EXIT() } -JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_Baker_getType(JNIEnv * env, jobject self) +JNIEXPORT jstring JNICALL Java_org_OpenColorIO_Baker_getType(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() ConstBakerRcPtr bake = GetConstJOCIO(env, self); @@ -101,8 +103,7 @@ Java_org_OpenColorIO_Baker_setMetadata(JNIEnv * env, jobject self, jstring metad OCIO_JNITRY_EXIT() } -JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_Baker_getMetadata(JNIEnv * env, jobject self) +JNIEXPORT jstring JNICALL Java_org_OpenColorIO_Baker_getMetadata(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() ConstBakerRcPtr bake = GetConstJOCIO(env, self); @@ -119,8 +120,7 @@ Java_org_OpenColorIO_Baker_setInputSpace(JNIEnv * env, jobject self, jstring inp OCIO_JNITRY_EXIT() } -JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_Baker_getInputSpace(JNIEnv * env, jobject self) +JNIEXPORT jstring JNICALL Java_org_OpenColorIO_Baker_getInputSpace(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() ConstBakerRcPtr bake = GetConstJOCIO(env, self); @@ -137,8 +137,7 @@ Java_org_OpenColorIO_Baker_setShaperSpace(JNIEnv * env, jobject self, jstring sh OCIO_JNITRY_EXIT() } -JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_Baker_getShaperSpace(JNIEnv * env, jobject self) +JNIEXPORT jstring JNICALL Java_org_OpenColorIO_Baker_getShaperSpace(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() ConstBakerRcPtr bake = GetConstJOCIO(env, self); @@ -155,8 +154,7 @@ Java_org_OpenColorIO_Baker_setLooks(JNIEnv * env, jobject self, jstring looks) OCIO_JNITRY_EXIT() } -JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_Baker_getLooks(JNIEnv * env, jobject self) +JNIEXPORT jstring JNICALL Java_org_OpenColorIO_Baker_getLooks(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() ConstBakerRcPtr bake = GetConstJOCIO(env, self); @@ -173,8 +171,7 @@ Java_org_OpenColorIO_Baker_setTargetSpace(JNIEnv * env, jobject self, jstring ta OCIO_JNITRY_EXIT() } -JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_Baker_getTargetSpace(JNIEnv * env, jobject self) +JNIEXPORT jstring JNICALL Java_org_OpenColorIO_Baker_getTargetSpace(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() ConstBakerRcPtr bake = GetConstJOCIO(env, self); @@ -191,8 +188,7 @@ Java_org_OpenColorIO_Baker_setShaperSize(JNIEnv * env, jobject self, jint shaper OCIO_JNITRY_EXIT() } -JNIEXPORT jint JNICALL -Java_org_OpenColorIO_Baker_getShaperSize(JNIEnv * env, jobject self) +JNIEXPORT jint JNICALL Java_org_OpenColorIO_Baker_getShaperSize(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() ConstBakerRcPtr bake = GetConstJOCIO(env, self); @@ -209,8 +205,7 @@ Java_org_OpenColorIO_Baker_setCubeSize(JNIEnv * env, jobject self, jint cubesize OCIO_JNITRY_EXIT() } -JNIEXPORT jint JNICALL -Java_org_OpenColorIO_Baker_getCubeSize(JNIEnv * env, jobject self) +JNIEXPORT jint JNICALL Java_org_OpenColorIO_Baker_getCubeSize(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() ConstBakerRcPtr bake = GetConstJOCIO(env, self); @@ -218,8 +213,7 @@ Java_org_OpenColorIO_Baker_getCubeSize(JNIEnv * env, jobject self) OCIO_JNITRY_EXIT(0) } -JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_Baker_bake(JNIEnv * env, jobject self) +JNIEXPORT jstring JNICALL Java_org_OpenColorIO_Baker_bake(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() ConstBakerRcPtr bake = GetConstJOCIO(env, self); @@ -229,8 +223,7 @@ Java_org_OpenColorIO_Baker_bake(JNIEnv * env, jobject self) OCIO_JNITRY_EXIT(NULL) } -JNIEXPORT jint JNICALL -Java_org_OpenColorIO_Baker_getNumFormats(JNIEnv * env, jobject self) +JNIEXPORT jint JNICALL Java_org_OpenColorIO_Baker_getNumFormats(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() ConstBakerRcPtr bake = GetConstJOCIO(env, self); diff --git a/src/bindings/java/JNIColorSpace.cpp b/src/bindings/java/JNIColorSpace.cpp index 423da186cc..e6243cec08 100644 --- a/src/bindings/java/JNIColorSpace.cpp +++ b/src/bindings/java/JNIColorSpace.cpp @@ -1,29 +1,30 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. -#include #include +#include #include +#include "JNIUtil.h" #include "OpenColorIO/OpenColorIO.h" #include "OpenColorIOJNI.h" -#include "JNIUtil.h" using namespace OCIO_NAMESPACE; -JNIEXPORT void JNICALL -Java_org_OpenColorIO_ColorSpace_dispose(JNIEnv * env, jobject self) +JNIEXPORT void JNICALL Java_org_OpenColorIO_ColorSpace_dispose(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() DisposeJOCIO(env, self); OCIO_JNITRY_EXIT() } -JNIEXPORT jobject JNICALL -Java_org_OpenColorIO_ColorSpace_Create(JNIEnv * env, jobject self) +JNIEXPORT jobject JNICALL Java_org_OpenColorIO_ColorSpace_Create(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - return BuildJObject(env, self, - env->FindClass("org/OpenColorIO/ColorSpace"), ColorSpace::Create()); + return BuildJObject( + env, + self, + env->FindClass("org/OpenColorIO/ColorSpace"), + ColorSpace::Create()); OCIO_JNITRY_EXIT(NULL) } @@ -32,13 +33,15 @@ Java_org_OpenColorIO_ColorSpace_createEditableCopy(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() ConstColorSpaceRcPtr col = GetConstJOCIO(env, self); - return BuildJObject(env, self, - env->FindClass("org/OpenColorIO/ColorSpace"), col->createEditableCopy()); + return BuildJObject( + env, + self, + env->FindClass("org/OpenColorIO/ColorSpace"), + col->createEditableCopy()); OCIO_JNITRY_EXIT(NULL) } -JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_ColorSpace_getName(JNIEnv * env, jobject self) +JNIEXPORT jstring JNICALL Java_org_OpenColorIO_ColorSpace_getName(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() ConstColorSpaceRcPtr col = GetConstJOCIO(env, self); @@ -55,8 +58,7 @@ Java_org_OpenColorIO_ColorSpace_setName(JNIEnv * env, jobject self, jstring name OCIO_JNITRY_EXIT() } -JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_ColorSpace_getFamily(JNIEnv * env, jobject self) +JNIEXPORT jstring JNICALL Java_org_OpenColorIO_ColorSpace_getFamily(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() ConstColorSpaceRcPtr col = GetConstJOCIO(env, self); @@ -91,8 +93,7 @@ Java_org_OpenColorIO_ColorSpace_setEqualityGroup(JNIEnv * env, jobject self, jst OCIO_JNITRY_EXIT() } -JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_ColorSpace_getDescription(JNIEnv * env, jobject self) +JNIEXPORT jstring JNICALL Java_org_OpenColorIO_ColorSpace_getDescription(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() ConstColorSpaceRcPtr col = GetConstJOCIO(env, self); @@ -109,8 +110,7 @@ Java_org_OpenColorIO_ColorSpace_setDescription(JNIEnv * env, jobject self, jstri OCIO_JNITRY_EXIT() } -JNIEXPORT jobject JNICALL -Java_org_OpenColorIO_ColorSpace_getBitDepth(JNIEnv * env, jobject self) +JNIEXPORT jobject JNICALL Java_org_OpenColorIO_ColorSpace_getBitDepth(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() ConstColorSpaceRcPtr col = GetConstJOCIO(env, self); @@ -127,8 +127,7 @@ Java_org_OpenColorIO_ColorSpace_setBitDepth(JNIEnv * env, jobject self, jobject OCIO_JNITRY_EXIT() } -JNIEXPORT jboolean JNICALL -Java_org_OpenColorIO_ColorSpace_isData(JNIEnv * env, jobject self) +JNIEXPORT jboolean JNICALL Java_org_OpenColorIO_ColorSpace_isData(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() ConstColorSpaceRcPtr col = GetConstJOCIO(env, self); @@ -145,8 +144,7 @@ Java_org_OpenColorIO_ColorSpace_setIsData(JNIEnv * env, jobject self, jboolean i OCIO_JNITRY_EXIT() } -JNIEXPORT jobject JNICALL -Java_org_OpenColorIO_ColorSpace_getAllocation(JNIEnv * env, jobject self) +JNIEXPORT jobject JNICALL Java_org_OpenColorIO_ColorSpace_getAllocation(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() ConstColorSpaceRcPtr col = GetConstJOCIO(env, self); @@ -181,8 +179,11 @@ Java_org_OpenColorIO_ColorSpace_getAllocationVars(JNIEnv * env, jobject self, jf OCIO_JNITRY_EXIT() } -JNIEXPORT void JNICALL -Java_org_OpenColorIO_ColorSpace_setAllocationVars(JNIEnv * env, jobject self, jint numvars, jfloatArray vars) +JNIEXPORT void JNICALL Java_org_OpenColorIO_ColorSpace_setAllocationVars( + JNIEnv * env, + jobject self, + jint numvars, + jfloatArray vars) { OCIO_JNITRY_ENTER() ColorSpaceRcPtr col = GetEditableJOCIO(env, self); @@ -195,19 +196,25 @@ Java_org_OpenColorIO_ColorSpace_getTransform(JNIEnv * env, jobject self, jobject { OCIO_JNITRY_ENTER() ConstColorSpaceRcPtr col = GetConstJOCIO(env, self); - ColorSpaceDirection cd = GetJEnum(env, dir); - ConstTransformRcPtr tr = col->getTransform(cd); - return BuildJConstObject(env, self, - env->FindClass(GetOCIOTClass(tr)), tr); + ColorSpaceDirection cd = GetJEnum(env, dir); + ConstTransformRcPtr tr = col->getTransform(cd); + return BuildJConstObject( + env, + self, + env->FindClass(GetOCIOTClass(tr)), + tr); OCIO_JNITRY_EXIT(NULL) } -JNIEXPORT void JNICALL -Java_org_OpenColorIO_ColorSpace_setTransform(JNIEnv * env, jobject self, jobject transform, jobject dir) +JNIEXPORT void JNICALL Java_org_OpenColorIO_ColorSpace_setTransform( + JNIEnv * env, + jobject self, + jobject transform, + jobject dir) { OCIO_JNITRY_ENTER() - ColorSpaceRcPtr col = GetEditableJOCIO(env, self); - ColorSpaceDirection cd = GetJEnum(env, dir); + ColorSpaceRcPtr col = GetEditableJOCIO(env, self); + ColorSpaceDirection cd = GetJEnum(env, dir); ConstTransformRcPtr tran = GetConstJOCIO(env, transform); col->setTransform(tran, cd); OCIO_JNITRY_EXIT() diff --git a/src/bindings/java/JNIConfig.cpp b/src/bindings/java/JNIConfig.cpp index b474974bfc..33b39df06f 100644 --- a/src/bindings/java/JNIConfig.cpp +++ b/src/bindings/java/JNIConfig.cpp @@ -1,38 +1,41 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. -#include #include +#include #include +#include "JNIUtil.h" #include "OpenColorIO/OpenColorIO.h" #include "OpenColorIOJNI.h" -#include "JNIUtil.h" using namespace OCIO_NAMESPACE; -JNIEXPORT void JNICALL -Java_org_OpenColorIO_Config_dispose(JNIEnv * env, jobject self) +JNIEXPORT void JNICALL Java_org_OpenColorIO_Config_dispose(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() DisposeJOCIO(env, self); OCIO_JNITRY_EXIT() } -JNIEXPORT jobject JNICALL -Java_org_OpenColorIO_Config_Create(JNIEnv * env, jobject self) +JNIEXPORT jobject JNICALL Java_org_OpenColorIO_Config_Create(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - return BuildJObject(env, self, - env->FindClass("org/OpenColorIO/Config"), Config::Create()); + return BuildJObject( + env, + self, + env->FindClass("org/OpenColorIO/Config"), + Config::Create()); OCIO_JNITRY_EXIT(NULL) } -JNIEXPORT jobject JNICALL -Java_org_OpenColorIO_Config_CreateFromEnv(JNIEnv * env, jobject self) +JNIEXPORT jobject JNICALL Java_org_OpenColorIO_Config_CreateFromEnv(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - return BuildJConstObject(env, self, - env->FindClass("org/OpenColorIO/Config"), Config::CreateFromEnv()); + return BuildJConstObject( + env, + self, + env->FindClass("org/OpenColorIO/Config"), + Config::CreateFromEnv()); OCIO_JNITRY_EXIT(NULL) } @@ -40,9 +43,11 @@ JNIEXPORT jobject JNICALL Java_org_OpenColorIO_Config_CreateFromFile(JNIEnv * env, jobject self, jstring filename) { OCIO_JNITRY_ENTER() - return BuildJConstObject(env, self, - env->FindClass("org/OpenColorIO/Config"), - Config::CreateFromFile(GetJStringValue(env, filename)())); + return BuildJConstObject( + env, + self, + env->FindClass("org/OpenColorIO/Config"), + Config::CreateFromFile(GetJStringValue(env, filename)())); OCIO_JNITRY_EXIT(NULL) } @@ -52,23 +57,27 @@ Java_org_OpenColorIO_Config_CreateFromStream(JNIEnv * env, jobject self, jstring OCIO_JNITRY_ENTER() std::istringstream is; is.str(std::string(GetJStringValue(env, istream)())); - return BuildJConstObject(env, self, - env->FindClass("org/OpenColorIO/Config"), Config::CreateFromStream(is)); + return BuildJConstObject( + env, + self, + env->FindClass("org/OpenColorIO/Config"), + Config::CreateFromStream(is)); OCIO_JNITRY_EXIT(NULL) } -JNIEXPORT jobject JNICALL -Java_org_OpenColorIO_Config_createEditableCopy(JNIEnv * env, jobject self) +JNIEXPORT jobject JNICALL Java_org_OpenColorIO_Config_createEditableCopy(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() ConstConfigRcPtr cfg = GetConstJOCIO(env, self); - return BuildJObject(env, self, - env->FindClass("org/OpenColorIO/Config"), cfg->createEditableCopy()); + return BuildJObject( + env, + self, + env->FindClass("org/OpenColorIO/Config"), + cfg->createEditableCopy()); OCIO_JNITRY_EXIT(NULL) } -JNIEXPORT void JNICALL -Java_org_OpenColorIO_Config_validate(JNIEnv * env, jobject self) +JNIEXPORT void JNICALL Java_org_OpenColorIO_Config_validate(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() ConstConfigRcPtr cfg = GetConstJOCIO(env, self); @@ -76,8 +85,7 @@ Java_org_OpenColorIO_Config_validate(JNIEnv * env, jobject self) OCIO_JNITRY_EXIT() } -JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_Config_getDescription(JNIEnv * env, jobject self) +JNIEXPORT jstring JNICALL Java_org_OpenColorIO_Config_getDescription(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() ConstConfigRcPtr cfg = GetConstJOCIO(env, self); @@ -94,8 +102,7 @@ Java_org_OpenColorIO_Config_setDescription(JNIEnv * env, jobject self, jstring d OCIO_JNITRY_EXIT() } -JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_Config_serialize(JNIEnv * env, jobject self) +JNIEXPORT jstring JNICALL Java_org_OpenColorIO_Config_serialize(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() ConstConfigRcPtr cfg = GetConstJOCIO(env, self); @@ -105,8 +112,7 @@ Java_org_OpenColorIO_Config_serialize(JNIEnv * env, jobject self) OCIO_JNITRY_EXIT(NULL) } -JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_Config_getCacheID__(JNIEnv * env, jobject self) +JNIEXPORT jstring JNICALL Java_org_OpenColorIO_Config_getCacheID__(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() ConstConfigRcPtr cfg = GetConstJOCIO(env, self); @@ -114,28 +120,35 @@ Java_org_OpenColorIO_Config_getCacheID__(JNIEnv * env, jobject self) OCIO_JNITRY_EXIT(NULL) } -JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_Config_getCacheID__Lorg_OpenColorIO_Context_2(JNIEnv * env, jobject self, jobject context) +JNIEXPORT jstring JNICALL Java_org_OpenColorIO_Config_getCacheID__Lorg_OpenColorIO_Context_2( + JNIEnv * env, + jobject self, + jobject context) { OCIO_JNITRY_ENTER() - ConstConfigRcPtr cfg = GetConstJOCIO(env, self); + ConstConfigRcPtr cfg = GetConstJOCIO(env, self); ConstContextRcPtr con = GetConstJOCIO(env, context); return env->NewStringUTF(cfg->getCacheID(con)); OCIO_JNITRY_EXIT(NULL) } -JNIEXPORT jobject JNICALL -Java_org_OpenColorIO_Config_getCurrentContext(JNIEnv * env, jobject self) +JNIEXPORT jobject JNICALL Java_org_OpenColorIO_Config_getCurrentContext(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() ConstConfigRcPtr cfg = GetConstJOCIO(env, self); - return BuildJConstObject(env, self, - env->FindClass("org/OpenColorIO/Context"), cfg->getCurrentContext()); + return BuildJConstObject( + env, + self, + env->FindClass("org/OpenColorIO/Context"), + cfg->getCurrentContext()); OCIO_JNITRY_EXIT(NULL) } -JNIEXPORT void JNICALL -Java_org_OpenColorIO_Config_addEnvironmentVar(JNIEnv * env, jobject self, jstring name, jstring defaultValue) +JNIEXPORT void JNICALL Java_org_OpenColorIO_Config_addEnvironmentVar( + JNIEnv * env, + jobject self, + jstring name, + jstring defaultValue) { OCIO_JNITRY_ENTER() ConfigRcPtr cfg = GetEditableJOCIO(env, self); @@ -143,8 +156,7 @@ Java_org_OpenColorIO_Config_addEnvironmentVar(JNIEnv * env, jobject self, jstrin OCIO_JNITRY_EXIT() } -JNIEXPORT jint JNICALL -Java_org_OpenColorIO_Config_getNumEnvironmentVars(JNIEnv * env, jobject self) +JNIEXPORT jint JNICALL Java_org_OpenColorIO_Config_getNumEnvironmentVars(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() ConstConfigRcPtr cfg = GetConstJOCIO(env, self); @@ -170,8 +182,7 @@ Java_org_OpenColorIO_Config_getEnvironmentVarDefault(JNIEnv * env, jobject self, OCIO_JNITRY_EXIT(NULL) } -JNIEXPORT void JNICALL -Java_org_OpenColorIO_Config_clearEnvironmentVars(JNIEnv * env, jobject self) +JNIEXPORT void JNICALL Java_org_OpenColorIO_Config_clearEnvironmentVars(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() ConfigRcPtr cfg = GetEditableJOCIO(env, self); @@ -179,8 +190,7 @@ Java_org_OpenColorIO_Config_clearEnvironmentVars(JNIEnv * env, jobject self) OCIO_JNITRY_EXIT() } -JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_Config_getSearchPath(JNIEnv * env, jobject self) +JNIEXPORT jstring JNICALL Java_org_OpenColorIO_Config_getSearchPath(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() ConstConfigRcPtr cfg = GetConstJOCIO(env, self); @@ -197,8 +207,7 @@ Java_org_OpenColorIO_Config_setSearchPath(JNIEnv * env, jobject self, jstring pa OCIO_JNITRY_EXIT() } -JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_Config_getWorkingDir(JNIEnv * env, jobject self) +JNIEXPORT jstring JNICALL Java_org_OpenColorIO_Config_getWorkingDir(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() ConstConfigRcPtr cfg = GetConstJOCIO(env, self); @@ -215,8 +224,7 @@ Java_org_OpenColorIO_Config_setWorkingDir(JNIEnv * env, jobject self, jstring di OCIO_JNITRY_EXIT() } -JNIEXPORT jint JNICALL -Java_org_OpenColorIO_Config_getNumColorSpaces(JNIEnv * env, jobject self) +JNIEXPORT jint JNICALL Java_org_OpenColorIO_Config_getNumColorSpaces(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() ConstConfigRcPtr cfg = GetConstJOCIO(env, self); @@ -238,9 +246,11 @@ Java_org_OpenColorIO_Config_getColorSpace(JNIEnv * env, jobject self, jstring na { OCIO_JNITRY_ENTER() ConstConfigRcPtr cfg = GetConstJOCIO(env, self); - return BuildJConstObject(env, self, - env->FindClass("org/OpenColorIO/ColorSpace"), - cfg->getColorSpace(GetJStringValue(env, name)())); + return BuildJConstObject( + env, + self, + env->FindClass("org/OpenColorIO/ColorSpace"), + cfg->getColorSpace(GetJStringValue(env, name)())); OCIO_JNITRY_EXIT(NULL) } @@ -257,14 +267,13 @@ JNIEXPORT void JNICALL Java_org_OpenColorIO_Config_addColorSpace(JNIEnv * env, jobject self, jobject cs) { OCIO_JNITRY_ENTER() - ConfigRcPtr cfg = GetEditableJOCIO(env, self); + ConfigRcPtr cfg = GetEditableJOCIO(env, self); ConstColorSpaceRcPtr space = GetConstJOCIO(env, cs); cfg->addColorSpace(space); OCIO_JNITRY_EXIT() } -JNIEXPORT void JNICALL -Java_org_OpenColorIO_Config_clearColorSpaces(JNIEnv * env, jobject self) +JNIEXPORT void JNICALL Java_org_OpenColorIO_Config_clearColorSpaces(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() ConfigRcPtr cfg = GetEditableJOCIO(env, self); @@ -299,8 +308,11 @@ Java_org_OpenColorIO_Config_setStrictParsingEnabled(JNIEnv * env, jobject self, OCIO_JNITRY_EXIT() } -JNIEXPORT void JNICALL -Java_org_OpenColorIO_Config_setRole(JNIEnv * env, jobject self, jstring role, jstring colorSpaceName) +JNIEXPORT void JNICALL Java_org_OpenColorIO_Config_setRole( + JNIEnv * env, + jobject self, + jstring role, + jstring colorSpaceName) { OCIO_JNITRY_ENTER() ConfigRcPtr cfg = GetEditableJOCIO(env, self); @@ -308,8 +320,7 @@ Java_org_OpenColorIO_Config_setRole(JNIEnv * env, jobject self, jstring role, js OCIO_JNITRY_EXIT() } -JNIEXPORT jint JNICALL -Java_org_OpenColorIO_Config_getNumRoles(JNIEnv * env, jobject self) +JNIEXPORT jint JNICALL Java_org_OpenColorIO_Config_getNumRoles(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() ConstConfigRcPtr cfg = GetConstJOCIO(env, self); @@ -335,8 +346,7 @@ Java_org_OpenColorIO_Config_getRoleName(JNIEnv * env, jobject self, jint index) OCIO_JNITRY_EXIT(NULL) } -JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_Config_getDefaultDisplay(JNIEnv * env, jobject self) +JNIEXPORT jstring JNICALL Java_org_OpenColorIO_Config_getDefaultDisplay(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() ConstConfigRcPtr cfg = GetConstJOCIO(env, self); @@ -344,8 +354,7 @@ Java_org_OpenColorIO_Config_getDefaultDisplay(JNIEnv * env, jobject self) OCIO_JNITRY_EXIT(NULL) } -JNIEXPORT jint JNICALL -Java_org_OpenColorIO_Config_getNumDisplays(JNIEnv * env, jobject self) +JNIEXPORT jint JNICALL Java_org_OpenColorIO_Config_getNumDisplays(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() ConstConfigRcPtr cfg = GetConstJOCIO(env, self); @@ -389,30 +398,38 @@ Java_org_OpenColorIO_Config_getView(JNIEnv * env, jobject self, jstring display, OCIO_JNITRY_EXIT(NULL) } -JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_Config_getDisplayColorSpaceName(JNIEnv * env, jobject self, jstring display, jstring view) +JNIEXPORT jstring JNICALL Java_org_OpenColorIO_Config_getDisplayColorSpaceName( + JNIEnv * env, + jobject self, + jstring display, + jstring view) { OCIO_JNITRY_ENTER() ConstConfigRcPtr cfg = GetConstJOCIO(env, self); - return env->NewStringUTF(cfg->getDisplayColorSpaceName(GetJStringValue(env, display)(), - GetJStringValue(env, view)())); + return env->NewStringUTF(cfg->getDisplayColorSpaceName( + GetJStringValue(env, display)(), + GetJStringValue(env, view)())); OCIO_JNITRY_EXIT(NULL) } -JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_Config_getDisplayLooks(JNIEnv * env, jobject self, jstring display, jstring view) +JNIEXPORT jstring JNICALL Java_org_OpenColorIO_Config_getDisplayLooks( + JNIEnv * env, + jobject self, + jstring display, + jstring view) { OCIO_JNITRY_ENTER() ConstConfigRcPtr cfg = GetConstJOCIO(env, self); - return env->NewStringUTF(cfg->getDisplayLooks(GetJStringValue(env, display)(), - GetJStringValue(env, view)())); + return env->NewStringUTF( + cfg->getDisplayLooks(GetJStringValue(env, display)(), GetJStringValue(env, view)())); OCIO_JNITRY_EXIT(NULL) } // TODO: seems that 4 string params causes a memory error in the JNI layer? /* JNIEXPORT void JNICALL -Java_org_OpenColorIO_Config_addDisplay(JNIEnv * env, jobject self, jstring display, jstring view, jstring colorSpaceName, jstring looks) +Java_org_OpenColorIO_Config_addDisplay(JNIEnv * env, jobject self, jstring display, jstring view, +jstring colorSpaceName, jstring looks) { OCIO_JNITRY_ENTER() ConfigRcPtr cfg = GetEditableJOCIO(env, self); @@ -425,8 +442,7 @@ Java_org_OpenColorIO_Config_addDisplay(JNIEnv * env, jobject self, jstring displ } */ -JNIEXPORT void JNICALL -Java_org_OpenColorIO_Config_clearDisplays(JNIEnv * env, jobject self) +JNIEXPORT void JNICALL Java_org_OpenColorIO_Config_clearDisplays(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() ConfigRcPtr cfg = GetEditableJOCIO(env, self); @@ -443,8 +459,7 @@ Java_org_OpenColorIO_Config_setActiveDisplays(JNIEnv * env, jobject self, jstrin OCIO_JNITRY_EXIT() } -JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_Config_getActiveDisplays(JNIEnv * env, jobject self) +JNIEXPORT jstring JNICALL Java_org_OpenColorIO_Config_getActiveDisplays(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() ConstConfigRcPtr cfg = GetConstJOCIO(env, self); @@ -461,8 +476,7 @@ Java_org_OpenColorIO_Config_setActiveViews(JNIEnv * env, jobject self, jstring v OCIO_JNITRY_EXIT() } -JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_Config_getActiveViews(JNIEnv * env, jobject self) +JNIEXPORT jstring JNICALL Java_org_OpenColorIO_Config_getActiveViews(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() ConstConfigRcPtr cfg = GetConstJOCIO(env, self); @@ -493,13 +507,15 @@ Java_org_OpenColorIO_Config_getLook(JNIEnv * env, jobject self, jstring name) { OCIO_JNITRY_ENTER() ConstConfigRcPtr cfg = GetConstJOCIO(env, self); - return BuildJConstObject(env, self, - env->FindClass("org/OpenColorIO/Look"), cfg->getLook(GetJStringValue(env, name)())); + return BuildJConstObject( + env, + self, + env->FindClass("org/OpenColorIO/Look"), + cfg->getLook(GetJStringValue(env, name)())); OCIO_JNITRY_EXIT(NULL) } -JNIEXPORT jint JNICALL -Java_org_OpenColorIO_Config_getNumLooks(JNIEnv * env, jobject self) +JNIEXPORT jint JNICALL Java_org_OpenColorIO_Config_getNumLooks(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() ConstConfigRcPtr cfg = GetConstJOCIO(env, self); @@ -516,18 +532,16 @@ Java_org_OpenColorIO_Config_getLookNameByIndex(JNIEnv * env, jobject self, jint OCIO_JNITRY_EXIT(NULL) } -JNIEXPORT void JNICALL -Java_org_OpenColorIO_Config_addLook(JNIEnv * env, jobject self, jobject look) +JNIEXPORT void JNICALL Java_org_OpenColorIO_Config_addLook(JNIEnv * env, jobject self, jobject look) { OCIO_JNITRY_ENTER() - ConfigRcPtr cfg = GetEditableJOCIO(env, self); + ConfigRcPtr cfg = GetEditableJOCIO(env, self); ConstLookRcPtr lok = GetConstJOCIO(env, look); cfg->addLook(lok); OCIO_JNITRY_EXIT() } -JNIEXPORT void JNICALL -Java_org_OpenColorIO_Config_clearLooks(JNIEnv * env, jobject self) +JNIEXPORT void JNICALL Java_org_OpenColorIO_Config_clearLooks(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() ConfigRcPtr cfg = GetEditableJOCIO(env, self); @@ -536,92 +550,137 @@ Java_org_OpenColorIO_Config_clearLooks(JNIEnv * env, jobject self) } JNIEXPORT jobject JNICALL -Java_org_OpenColorIO_Config_getProcessor__Lorg_OpenColorIO_Context_2Lorg_OpenColorIO_ColorSpace_2Lorg_OpenColorIO_ColorSpace_2 - (JNIEnv * env, jobject self, jobject context, jobject srcColorSpace, jobject dstColorSpace) +Java_org_OpenColorIO_Config_getProcessor__Lorg_OpenColorIO_Context_2Lorg_OpenColorIO_ColorSpace_2Lorg_OpenColorIO_ColorSpace_2( + JNIEnv * env, + jobject self, + jobject context, + jobject srcColorSpace, + jobject dstColorSpace) { OCIO_JNITRY_ENTER() - ConstConfigRcPtr cfg = GetConstJOCIO(env, self); + ConstConfigRcPtr cfg = GetConstJOCIO(env, self); ConstContextRcPtr con = GetConstJOCIO(env, context); - ConstColorSpaceRcPtr src = GetConstJOCIO(env, srcColorSpace); - ConstColorSpaceRcPtr dst = GetConstJOCIO(env, dstColorSpace); - return BuildJConstObject(env, self, - env->FindClass("org/OpenColorIO/Processor"), cfg->getProcessor(con, src, dst)); + ConstColorSpaceRcPtr src + = GetConstJOCIO(env, srcColorSpace); + ConstColorSpaceRcPtr dst + = GetConstJOCIO(env, dstColorSpace); + return BuildJConstObject( + env, + self, + env->FindClass("org/OpenColorIO/Processor"), + cfg->getProcessor(con, src, dst)); OCIO_JNITRY_EXIT(NULL) } JNIEXPORT jobject JNICALL -Java_org_OpenColorIO_Config_getProcessor__Lorg_OpenColorIO_ColorSpace_2Lorg_OpenColorIO_ColorSpace_2 - (JNIEnv * env, jobject self, jobject srcColorSpace, jobject dstColorSpace) +Java_org_OpenColorIO_Config_getProcessor__Lorg_OpenColorIO_ColorSpace_2Lorg_OpenColorIO_ColorSpace_2( + JNIEnv * env, + jobject self, + jobject srcColorSpace, + jobject dstColorSpace) { OCIO_JNITRY_ENTER() ConstConfigRcPtr cfg = GetConstJOCIO(env, self); - ConstColorSpaceRcPtr src = GetConstJOCIO(env, srcColorSpace); - ConstColorSpaceRcPtr dst = GetConstJOCIO(env, dstColorSpace); - return BuildJConstObject(env, self, - env->FindClass("org/OpenColorIO/Processor"), cfg->getProcessor(src, dst)); + ConstColorSpaceRcPtr src + = GetConstJOCIO(env, srcColorSpace); + ConstColorSpaceRcPtr dst + = GetConstJOCIO(env, dstColorSpace); + return BuildJConstObject( + env, + self, + env->FindClass("org/OpenColorIO/Processor"), + cfg->getProcessor(src, dst)); OCIO_JNITRY_EXIT(NULL) } JNIEXPORT jobject JNICALL -Java_org_OpenColorIO_Config_getProcessor__Ljava_lang_String_2Ljava_lang_String_2 - (JNIEnv * env, jobject self, jstring srcName, jstring dstName) +Java_org_OpenColorIO_Config_getProcessor__Ljava_lang_String_2Ljava_lang_String_2( + JNIEnv * env, + jobject self, + jstring srcName, + jstring dstName) { OCIO_JNITRY_ENTER() ConstConfigRcPtr cfg = GetConstJOCIO(env, self); - return BuildJConstObject(env, self, - env->FindClass("org/OpenColorIO/Processor"), cfg->getProcessor( - GetJStringValue(env, srcName)(), GetJStringValue(env, dstName)())); + return BuildJConstObject( + env, + self, + env->FindClass("org/OpenColorIO/Processor"), + cfg->getProcessor(GetJStringValue(env, srcName)(), GetJStringValue(env, dstName)())); OCIO_JNITRY_EXIT(NULL) } JNIEXPORT jobject JNICALL -Java_org_OpenColorIO_Config_getProcessor__Lorg_OpenColorIO_Context_2Ljava_lang_String_2Ljava_lang_String_2 - (JNIEnv * env, jobject self, jobject context, jstring srcName, jstring dstName) +Java_org_OpenColorIO_Config_getProcessor__Lorg_OpenColorIO_Context_2Ljava_lang_String_2Ljava_lang_String_2( + JNIEnv * env, + jobject self, + jobject context, + jstring srcName, + jstring dstName) { OCIO_JNITRY_ENTER() ConstContextRcPtr con = GetConstJOCIO(env, context); - ConstConfigRcPtr cfg = GetConstJOCIO(env, self); - return BuildJConstObject(env, self, - env->FindClass("org/OpenColorIO/Processor"), cfg->getProcessor(con, - GetJStringValue(env, srcName)(), GetJStringValue(env, dstName)())); + ConstConfigRcPtr cfg = GetConstJOCIO(env, self); + return BuildJConstObject( + env, + self, + env->FindClass("org/OpenColorIO/Processor"), + cfg->getProcessor(con, GetJStringValue(env, srcName)(), GetJStringValue(env, dstName)())); OCIO_JNITRY_EXIT(NULL) } -JNIEXPORT jobject JNICALL -Java_org_OpenColorIO_Config_getProcessor__Lorg_OpenColorIO_Transform_2 - (JNIEnv * env, jobject self, jobject transform) +JNIEXPORT jobject JNICALL Java_org_OpenColorIO_Config_getProcessor__Lorg_OpenColorIO_Transform_2( + JNIEnv * env, + jobject self, + jobject transform) { OCIO_JNITRY_ENTER() - ConstConfigRcPtr cfg = GetConstJOCIO(env, self); + ConstConfigRcPtr cfg = GetConstJOCIO(env, self); ConstTransformRcPtr tran = GetConstJOCIO(env, transform); - return BuildJConstObject(env, self, - env->FindClass("org/OpenColorIO/Processor"), cfg->getProcessor(tran)); + return BuildJConstObject( + env, + self, + env->FindClass("org/OpenColorIO/Processor"), + cfg->getProcessor(tran)); OCIO_JNITRY_EXIT(NULL) } JNIEXPORT jobject JNICALL -Java_org_OpenColorIO_Config_getProcessor__Lorg_OpenColorIO_Transform_2Lorg_OpenColorIO_TransformDirection_2 - (JNIEnv * env, jobject self, jobject transform, jobject direction) +Java_org_OpenColorIO_Config_getProcessor__Lorg_OpenColorIO_Transform_2Lorg_OpenColorIO_TransformDirection_2( + JNIEnv * env, + jobject self, + jobject transform, + jobject direction) { OCIO_JNITRY_ENTER() - ConstConfigRcPtr cfg = GetConstJOCIO(env, self); + ConstConfigRcPtr cfg = GetConstJOCIO(env, self); ConstTransformRcPtr tran = GetConstJOCIO(env, transform); - TransformDirection dir = GetJEnum(env, direction); - return BuildJConstObject(env, self, - env->FindClass("org/OpenColorIO/Processor"), cfg->getProcessor(tran, dir)); + TransformDirection dir = GetJEnum(env, direction); + return BuildJConstObject( + env, + self, + env->FindClass("org/OpenColorIO/Processor"), + cfg->getProcessor(tran, dir)); OCIO_JNITRY_EXIT(NULL) } JNIEXPORT jobject JNICALL -Java_org_OpenColorIO_Config_getProcessor__Lorg_OpenColorIO_Context_2Lorg_OpenColorIO_Transform_2Lorg_OpenColorIO_TransformDirection_2 - (JNIEnv * env, jobject self, jobject context, jobject transform, jobject direction) +Java_org_OpenColorIO_Config_getProcessor__Lorg_OpenColorIO_Context_2Lorg_OpenColorIO_Transform_2Lorg_OpenColorIO_TransformDirection_2( + JNIEnv * env, + jobject self, + jobject context, + jobject transform, + jobject direction) { OCIO_JNITRY_ENTER() - ConstConfigRcPtr cfg = GetConstJOCIO(env, self); - ConstContextRcPtr con = GetConstJOCIO(env, context); + ConstConfigRcPtr cfg = GetConstJOCIO(env, self); + ConstContextRcPtr con = GetConstJOCIO(env, context); ConstTransformRcPtr tran = GetConstJOCIO(env, transform); - TransformDirection dir = GetJEnum(env, direction); - return BuildJConstObject(env, self, - env->FindClass("org/OpenColorIO/Processor"), cfg->getProcessor(con, tran, dir)); + TransformDirection dir = GetJEnum(env, direction); + return BuildJConstObject( + env, + self, + env->FindClass("org/OpenColorIO/Processor"), + cfg->getProcessor(con, tran, dir)); OCIO_JNITRY_EXIT(NULL) } diff --git a/src/bindings/java/JNIContext.cpp b/src/bindings/java/JNIContext.cpp index 9d2d255276..59786141f2 100644 --- a/src/bindings/java/JNIContext.cpp +++ b/src/bindings/java/JNIContext.cpp @@ -1,28 +1,29 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. -#include #include +#include +#include "JNIUtil.h" #include "OpenColorIO/OpenColorIO.h" #include "OpenColorIOJNI.h" -#include "JNIUtil.h" using namespace OCIO_NAMESPACE; -JNIEXPORT void JNICALL -Java_org_OpenColorIO_Context_dispose(JNIEnv * env, jobject self) +JNIEXPORT void JNICALL Java_org_OpenColorIO_Context_dispose(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() DisposeJOCIO(env, self); OCIO_JNITRY_EXIT() } -JNIEXPORT jobject JNICALL -Java_org_OpenColorIO_Context_Create(JNIEnv * env, jobject self) +JNIEXPORT jobject JNICALL Java_org_OpenColorIO_Context_Create(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - return BuildJObject(env, self, - env->FindClass("org/OpenColorIO/Context"), Context::Create()); + return BuildJObject( + env, + self, + env->FindClass("org/OpenColorIO/Context"), + Context::Create()); OCIO_JNITRY_EXIT(NULL) } @@ -31,13 +32,15 @@ Java_org_OpenColorIO_Context_createEditableCopy(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() ConstContextRcPtr con = GetConstJOCIO(env, self); - return BuildJObject(env, self, - env->FindClass("org/OpenColorIO/Context"), con->createEditableCopy()); + return BuildJObject( + env, + self, + env->FindClass("org/OpenColorIO/Context"), + con->createEditableCopy()); OCIO_JNITRY_EXIT(NULL) } -JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_Context_getCacheID(JNIEnv * env, jobject self) +JNIEXPORT jstring JNICALL Java_org_OpenColorIO_Context_getCacheID(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() ConstContextRcPtr con = GetConstJOCIO(env, self); @@ -54,8 +57,7 @@ Java_org_OpenColorIO_Context_setSearchPath(JNIEnv * env, jobject self, jstring p OCIO_JNITRY_EXIT() } -JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_Context_getSearchPath(JNIEnv * env, jobject self) +JNIEXPORT jstring JNICALL Java_org_OpenColorIO_Context_getSearchPath(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() ConstContextRcPtr con = GetConstJOCIO(env, self); @@ -72,8 +74,7 @@ Java_org_OpenColorIO_Context_setWorkingDir(JNIEnv * env, jobject self, jstring d OCIO_JNITRY_EXIT() } -JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_Context_getWorkingDir(JNIEnv * env, jobject self) +JNIEXPORT jstring JNICALL Java_org_OpenColorIO_Context_getWorkingDir(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() ConstContextRcPtr con = GetConstJOCIO(env, self); @@ -99,8 +100,7 @@ Java_org_OpenColorIO_Context_getStringVar(JNIEnv * env, jobject self, jstring na OCIO_JNITRY_EXIT(NULL) } -JNIEXPORT jint JNICALL -Java_org_OpenColorIO_Context_getNumStringVars(JNIEnv * env, jobject self) +JNIEXPORT jint JNICALL Java_org_OpenColorIO_Context_getNumStringVars(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() ConstContextRcPtr con = GetConstJOCIO(env, self); @@ -117,8 +117,7 @@ Java_org_OpenColorIO_Context_getStringVarNameByIndex(JNIEnv * env, jobject self, OCIO_JNITRY_EXIT(NULL) } -JNIEXPORT void JNICALL -Java_org_OpenColorIO_Context_clearStringVars(JNIEnv * env, jobject self) +JNIEXPORT void JNICALL Java_org_OpenColorIO_Context_clearStringVars(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() ContextRcPtr con = GetEditableJOCIO(env, self); @@ -127,7 +126,8 @@ Java_org_OpenColorIO_Context_clearStringVars(JNIEnv * env, jobject self) } JNIEXPORT void JNICALL -Java_org_OpenColorIO_Context_setEnvironmentMode(JNIEnv * env, jobject self, jobject mode) { +Java_org_OpenColorIO_Context_setEnvironmentMode(JNIEnv * env, jobject self, jobject mode) +{ OCIO_JNITRY_ENTER() ContextRcPtr con = GetEditableJOCIO(env, self); con->setEnvironmentMode(GetJEnum(env, mode)); @@ -143,8 +143,7 @@ Java_org_OpenColorIO_Context_getEnvironmentMode(JNIEnv * env, jobject self) OCIO_JNITRY_EXIT(NULL) } -JNIEXPORT void JNICALL -Java_org_OpenColorIO_Context_loadEnvironment(JNIEnv * env, jobject self) +JNIEXPORT void JNICALL Java_org_OpenColorIO_Context_loadEnvironment(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() ContextRcPtr con = GetEditableJOCIO(env, self); diff --git a/src/bindings/java/JNIGlobals.cpp b/src/bindings/java/JNIGlobals.cpp index 81eb39bfe4..9c63cf8c38 100644 --- a/src/bindings/java/JNIGlobals.cpp +++ b/src/bindings/java/JNIGlobals.cpp @@ -1,18 +1,17 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. +#include "JNIUtil.h" #include "OpenColorIO/OpenColorIO.h" #include "OpenColorIOJNI.h" -#include "JNIUtil.h" using namespace OCIO_NAMESPACE; -JNIEXPORT void JNICALL -Java_org_OpenColorIO_Globals_create(JNIEnv * env, jobject self) +JNIEXPORT void JNICALL Java_org_OpenColorIO_Globals_create(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() jfieldID fid; jclass wclass = env->GetObjectClass(self); - fid = env->GetFieldID(wclass, "ROLE_DEFAULT", "Ljava/lang/String;"); + fid = env->GetFieldID(wclass, "ROLE_DEFAULT", "Ljava/lang/String;"); env->SetObjectField(self, fid, env->NewStringUTF(ROLE_DEFAULT)); fid = env->GetFieldID(wclass, "ROLE_REFERENCE", "Ljava/lang/String;"); env->SetObjectField(self, fid, env->NewStringUTF(ROLE_REFERENCE)); @@ -33,32 +32,28 @@ Java_org_OpenColorIO_Globals_create(JNIEnv * env, jobject self) OCIO_JNITRY_EXIT() } -JNIEXPORT void JNICALL -Java_org_OpenColorIO_Globals_ClearAllCaches(JNIEnv * env, jobject) +JNIEXPORT void JNICALL Java_org_OpenColorIO_Globals_ClearAllCaches(JNIEnv * env, jobject) { OCIO_JNITRY_ENTER() ClearAllCaches(); OCIO_JNITRY_EXIT() } -JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_Globals_GetVersion(JNIEnv * env, jobject) +JNIEXPORT jstring JNICALL Java_org_OpenColorIO_Globals_GetVersion(JNIEnv * env, jobject) { OCIO_JNITRY_ENTER() return env->NewStringUTF(GetVersion()); OCIO_JNITRY_EXIT(NULL) } -JNIEXPORT jint JNICALL -Java_org_OpenColorIO_Globals_GetVersionHex(JNIEnv * env, jobject) +JNIEXPORT jint JNICALL Java_org_OpenColorIO_Globals_GetVersionHex(JNIEnv * env, jobject) { OCIO_JNITRY_ENTER() return (jint)GetVersionHex(); OCIO_JNITRY_EXIT(-1) } -JNIEXPORT jobject JNICALL -Java_org_OpenColorIO_Globals_GetLoggingLevel(JNIEnv * env, jobject) +JNIEXPORT jobject JNICALL Java_org_OpenColorIO_Globals_GetLoggingLevel(JNIEnv * env, jobject) { OCIO_JNITRY_ENTER() return BuildJEnum(env, "org/OpenColorIO/LoggingLevel", GetLoggingLevel()); @@ -73,12 +68,14 @@ Java_org_OpenColorIO_Globals_SetLoggingLevel(JNIEnv * env, jobject, jobject leve OCIO_JNITRY_EXIT() } -JNIEXPORT jobject JNICALL -Java_org_OpenColorIO_Globals_GetCurrentConfig(JNIEnv * env, jobject self) +JNIEXPORT jobject JNICALL Java_org_OpenColorIO_Globals_GetCurrentConfig(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - jobject obj = BuildJConstObject(env, self, - env->FindClass("org/OpenColorIO/Config"), GetCurrentConfig()); + jobject obj = BuildJConstObject( + env, + self, + env->FindClass("org/OpenColorIO/Config"), + GetCurrentConfig()); return obj; OCIO_JNITRY_EXIT(NULL) } @@ -112,12 +109,10 @@ Java_org_OpenColorIO_Globals_BoolFromString(JNIEnv * env, jobject, jstring s) // LoggingLevel -JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_LoggingLevel_toString(JNIEnv * env, jobject self) +JNIEXPORT jstring JNICALL Java_org_OpenColorIO_LoggingLevel_toString(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - return env->NewStringUTF( - LoggingLevelToString(GetJEnum(env, self))); + return env->NewStringUTF(LoggingLevelToString(GetJEnum(env, self))); OCIO_JNITRY_EXIT(NULL) } @@ -125,8 +120,7 @@ JNIEXPORT jboolean JNICALL Java_org_OpenColorIO_LoggingLevel_equals(JNIEnv * env, jobject self, jobject obj) { OCIO_JNITRY_ENTER() - return GetJEnum(env, self) - == GetJEnum(env, obj); + return GetJEnum(env, self) == GetJEnum(env, obj); OCIO_JNITRY_EXIT(false) } @@ -134,8 +128,7 @@ JNIEXPORT jstring JNICALL Java_org_OpenColorIO_Globals_LoggingLevelToString(JNIEnv * env, jobject, jobject level) { OCIO_JNITRY_ENTER() - return env->NewStringUTF( - LoggingLevelToString(GetJEnum(env, level))); + return env->NewStringUTF(LoggingLevelToString(GetJEnum(env, level))); OCIO_JNITRY_EXIT(NULL) } @@ -143,8 +136,10 @@ JNIEXPORT jobject JNICALL Java_org_OpenColorIO_Globals_LoggingLevelFromString(JNIEnv * env, jobject, jstring s) { OCIO_JNITRY_ENTER() - return BuildJEnum(env, "org/OpenColorIO/LoggingLevel", - LoggingLevelFromString(GetJStringValue(env, s)())); + return BuildJEnum( + env, + "org/OpenColorIO/LoggingLevel", + LoggingLevelFromString(GetJStringValue(env, s)())); OCIO_JNITRY_EXIT(NULL) } @@ -154,8 +149,7 @@ JNIEXPORT jstring JNICALL Java_org_OpenColorIO_TransformDirection_toString(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - return env->NewStringUTF( - TransformDirectionToString(GetJEnum(env, self))); + return env->NewStringUTF(TransformDirectionToString(GetJEnum(env, self))); OCIO_JNITRY_EXIT(NULL) } @@ -163,264 +157,285 @@ JNIEXPORT jboolean JNICALL Java_org_OpenColorIO_TransformDirection_equals(JNIEnv * env, jobject self, jobject obj) { OCIO_JNITRY_ENTER() - return GetJEnum(env, self) - == GetJEnum(env, obj); + return GetJEnum(env, self) == GetJEnum(env, obj); OCIO_JNITRY_EXIT(false) } JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_Globals_TransformDirectionToString(JNIEnv * env, jobject, - jobject dir) +Java_org_OpenColorIO_Globals_TransformDirectionToString(JNIEnv * env, jobject, jobject dir) { OCIO_JNITRY_ENTER() - return env->NewStringUTF( - TransformDirectionToString(GetJEnum(env, dir))); + return env->NewStringUTF(TransformDirectionToString(GetJEnum(env, dir))); OCIO_JNITRY_EXIT(NULL) } JNIEXPORT jobject JNICALL -Java_org_OpenColorIO_Globals_TransformDirectionFromString(JNIEnv * env, jobject, - jstring s) +Java_org_OpenColorIO_Globals_TransformDirectionFromString(JNIEnv * env, jobject, jstring s) { OCIO_JNITRY_ENTER() - return BuildJEnum(env, "org/OpenColorIO/TransformDirection", - TransformDirectionFromString(GetJStringValue(env, s)())); + return BuildJEnum( + env, + "org/OpenColorIO/TransformDirection", + TransformDirectionFromString(GetJStringValue(env, s)())); OCIO_JNITRY_EXIT(NULL) } JNIEXPORT jobject JNICALL -Java_org_OpenColorIO_Globals_GetInverseTransformDirection(JNIEnv * env, jobject, - jobject dir) { +Java_org_OpenColorIO_Globals_GetInverseTransformDirection(JNIEnv * env, jobject, jobject dir) +{ OCIO_JNITRY_ENTER() - return BuildJEnum(env, "org/OpenColorIO/TransformDirection", - GetInverseTransformDirection(GetJEnum(env, dir))); + return BuildJEnum( + env, + "org/OpenColorIO/TransformDirection", + GetInverseTransformDirection(GetJEnum(env, dir))); OCIO_JNITRY_EXIT(NULL) } -JNIEXPORT jobject JNICALL -Java_org_OpenColorIO_Globals_CombineTransformDirections(JNIEnv * env, jobject, - jobject d1, jobject d2) { +JNIEXPORT jobject JNICALL Java_org_OpenColorIO_Globals_CombineTransformDirections( + JNIEnv * env, + jobject, + jobject d1, + jobject d2) +{ OCIO_JNITRY_ENTER() - return BuildJEnum(env, "org/OpenColorIO/TransformDirection", - CombineTransformDirections(GetJEnum(env, d1), - GetJEnum(env, d2))); + return BuildJEnum( + env, + "org/OpenColorIO/TransformDirection", + CombineTransformDirections( + GetJEnum(env, d1), + GetJEnum(env, d2))); OCIO_JNITRY_EXIT(NULL) } // ColorSpaceDirection JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_ColorSpaceDirection_toString(JNIEnv * env, jobject self) { +Java_org_OpenColorIO_ColorSpaceDirection_toString(JNIEnv * env, jobject self) +{ OCIO_JNITRY_ENTER() - return env->NewStringUTF( - ColorSpaceDirectionToString(GetJEnum(env, self))); + return env->NewStringUTF(ColorSpaceDirectionToString(GetJEnum(env, self))); OCIO_JNITRY_EXIT(NULL) } JNIEXPORT jboolean JNICALL -Java_org_OpenColorIO_ColorSpaceDirection_equals(JNIEnv * env, jobject self, jobject obj) { +Java_org_OpenColorIO_ColorSpaceDirection_equals(JNIEnv * env, jobject self, jobject obj) +{ OCIO_JNITRY_ENTER() - return GetJEnum(env, self) - == GetJEnum(env, obj); + return GetJEnum(env, self) == GetJEnum(env, obj); OCIO_JNITRY_EXIT(false) } JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_Globals_ColorSpaceDirectionToString(JNIEnv * env, jobject, jobject dir) { +Java_org_OpenColorIO_Globals_ColorSpaceDirectionToString(JNIEnv * env, jobject, jobject dir) +{ OCIO_JNITRY_ENTER() - return env->NewStringUTF( - ColorSpaceDirectionToString(GetJEnum(env, dir))); + return env->NewStringUTF(ColorSpaceDirectionToString(GetJEnum(env, dir))); OCIO_JNITRY_EXIT(NULL) } JNIEXPORT jobject JNICALL -Java_org_OpenColorIO_Globals_ColorSpaceDirectionFromString(JNIEnv * env, jobject, jstring s) { +Java_org_OpenColorIO_Globals_ColorSpaceDirectionFromString(JNIEnv * env, jobject, jstring s) +{ OCIO_JNITRY_ENTER() - return BuildJEnum(env, "org/OpenColorIO/ColorSpaceDirection", - ColorSpaceDirectionFromString(GetJStringValue(env, s)())); + return BuildJEnum( + env, + "org/OpenColorIO/ColorSpaceDirection", + ColorSpaceDirectionFromString(GetJStringValue(env, s)())); OCIO_JNITRY_EXIT(NULL) } // BitDepth -JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_BitDepth_toString(JNIEnv * env, jobject self) { +JNIEXPORT jstring JNICALL Java_org_OpenColorIO_BitDepth_toString(JNIEnv * env, jobject self) +{ OCIO_JNITRY_ENTER() - return env->NewStringUTF( - BitDepthToString(GetJEnum(env, self))); + return env->NewStringUTF(BitDepthToString(GetJEnum(env, self))); OCIO_JNITRY_EXIT(NULL) } JNIEXPORT jboolean JNICALL -Java_org_OpenColorIO_BitDepth_equals(JNIEnv * env, jobject self, jobject obj) { +Java_org_OpenColorIO_BitDepth_equals(JNIEnv * env, jobject self, jobject obj) +{ OCIO_JNITRY_ENTER() - return GetJEnum(env, self) - == GetJEnum(env, obj); + return GetJEnum(env, self) == GetJEnum(env, obj); OCIO_JNITRY_EXIT(false) } JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_Globals_BitDepthToString(JNIEnv * env, jobject, jobject bitDepth) { +Java_org_OpenColorIO_Globals_BitDepthToString(JNIEnv * env, jobject, jobject bitDepth) +{ OCIO_JNITRY_ENTER() - return env->NewStringUTF( - BitDepthToString(GetJEnum(env, bitDepth))); + return env->NewStringUTF(BitDepthToString(GetJEnum(env, bitDepth))); OCIO_JNITRY_EXIT(NULL) } JNIEXPORT jobject JNICALL -Java_org_OpenColorIO_Globals_BitDepthFromString(JNIEnv * env, jobject, jstring s) { +Java_org_OpenColorIO_Globals_BitDepthFromString(JNIEnv * env, jobject, jstring s) +{ OCIO_JNITRY_ENTER() - return BuildJEnum(env, "org/OpenColorIO/BitDepth", - BitDepthFromString(GetJStringValue(env, s)())); + return BuildJEnum( + env, + "org/OpenColorIO/BitDepth", + BitDepthFromString(GetJStringValue(env, s)())); OCIO_JNITRY_EXIT(NULL) } JNIEXPORT jboolean JNICALL -Java_org_OpenColorIO_Globals_BitDepthIsFloat(JNIEnv * env, jobject, jobject bitDepth) { +Java_org_OpenColorIO_Globals_BitDepthIsFloat(JNIEnv * env, jobject, jobject bitDepth) +{ OCIO_JNITRY_ENTER() return (jboolean)BitDepthIsFloat(GetJEnum(env, bitDepth)); OCIO_JNITRY_EXIT(false) } JNIEXPORT jint JNICALL -Java_org_OpenColorIO_Globals_BitDepthToInt(JNIEnv * env, jobject, jobject bitDepth) { +Java_org_OpenColorIO_Globals_BitDepthToInt(JNIEnv * env, jobject, jobject bitDepth) +{ OCIO_JNITRY_ENTER() - return (jint) BitDepthToInt(GetJEnum(env, bitDepth)); + return (jint)BitDepthToInt(GetJEnum(env, bitDepth)); OCIO_JNITRY_EXIT(-1) } // Allocation -JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_Allocation_toString(JNIEnv * env, jobject self) { +JNIEXPORT jstring JNICALL Java_org_OpenColorIO_Allocation_toString(JNIEnv * env, jobject self) +{ OCIO_JNITRY_ENTER() - return env->NewStringUTF( - AllocationToString(GetJEnum(env, self))); + return env->NewStringUTF(AllocationToString(GetJEnum(env, self))); OCIO_JNITRY_EXIT(NULL) } JNIEXPORT jboolean JNICALL -Java_org_OpenColorIO_Allocation_equals(JNIEnv * env, jobject self, jobject obj) { +Java_org_OpenColorIO_Allocation_equals(JNIEnv * env, jobject self, jobject obj) +{ OCIO_JNITRY_ENTER() - return GetJEnum(env, self) - == GetJEnum(env, obj); + return GetJEnum(env, self) == GetJEnum(env, obj); OCIO_JNITRY_EXIT(false) } JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_Globals_AllocationToString(JNIEnv * env, jobject, jobject allocation) { +Java_org_OpenColorIO_Globals_AllocationToString(JNIEnv * env, jobject, jobject allocation) +{ OCIO_JNITRY_ENTER() - return env->NewStringUTF( - AllocationToString(GetJEnum(env, allocation))); + return env->NewStringUTF(AllocationToString(GetJEnum(env, allocation))); OCIO_JNITRY_EXIT(NULL) } JNIEXPORT jobject JNICALL -Java_org_OpenColorIO_Globals_AllocationFromString(JNIEnv * env, jobject, jstring s) { +Java_org_OpenColorIO_Globals_AllocationFromString(JNIEnv * env, jobject, jstring s) +{ OCIO_JNITRY_ENTER() - return BuildJEnum(env, "org/OpenColorIO/Allocation", - AllocationFromString(GetJStringValue(env, s)())); + return BuildJEnum( + env, + "org/OpenColorIO/Allocation", + AllocationFromString(GetJStringValue(env, s)())); OCIO_JNITRY_EXIT(NULL) } // Interpolation -JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_Interpolation_toString(JNIEnv * env, jobject self) { +JNIEXPORT jstring JNICALL Java_org_OpenColorIO_Interpolation_toString(JNIEnv * env, jobject self) +{ OCIO_JNITRY_ENTER() - return env->NewStringUTF( - InterpolationToString(GetJEnum(env, self))); + return env->NewStringUTF(InterpolationToString(GetJEnum(env, self))); OCIO_JNITRY_EXIT(NULL) } JNIEXPORT jboolean JNICALL -Java_org_OpenColorIO_Interpolation_equals(JNIEnv * env, jobject self, jobject obj) { +Java_org_OpenColorIO_Interpolation_equals(JNIEnv * env, jobject self, jobject obj) +{ OCIO_JNITRY_ENTER() - return GetJEnum(env, self) - == GetJEnum(env, obj); + return GetJEnum(env, self) == GetJEnum(env, obj); OCIO_JNITRY_EXIT(false) } JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_Globals_InterpolationToString(JNIEnv * env, jobject, jobject interp) { +Java_org_OpenColorIO_Globals_InterpolationToString(JNIEnv * env, jobject, jobject interp) +{ OCIO_JNITRY_ENTER() - return env->NewStringUTF( - InterpolationToString(GetJEnum(env, interp))); + return env->NewStringUTF(InterpolationToString(GetJEnum(env, interp))); OCIO_JNITRY_EXIT(NULL) } JNIEXPORT jobject JNICALL -Java_org_OpenColorIO_Globals_InterpolationFromString(JNIEnv * env, jobject, jstring s) { +Java_org_OpenColorIO_Globals_InterpolationFromString(JNIEnv * env, jobject, jstring s) +{ OCIO_JNITRY_ENTER() - return BuildJEnum(env, "org/OpenColorIO/Interpolation", - InterpolationFromString(GetJStringValue(env, s)())); + return BuildJEnum( + env, + "org/OpenColorIO/Interpolation", + InterpolationFromString(GetJStringValue(env, s)())); OCIO_JNITRY_EXIT(NULL) } // GpuLanguage -JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_GpuLanguage_toString(JNIEnv * env, jobject self) { +JNIEXPORT jstring JNICALL Java_org_OpenColorIO_GpuLanguage_toString(JNIEnv * env, jobject self) +{ OCIO_JNITRY_ENTER() - return env->NewStringUTF( - GpuLanguageToString(GetJEnum(env, self))); + return env->NewStringUTF(GpuLanguageToString(GetJEnum(env, self))); OCIO_JNITRY_EXIT(NULL) } JNIEXPORT jboolean JNICALL -Java_org_OpenColorIO_GpuLanguage_equals(JNIEnv * env, jobject self, jobject obj) { +Java_org_OpenColorIO_GpuLanguage_equals(JNIEnv * env, jobject self, jobject obj) +{ OCIO_JNITRY_ENTER() - return GetJEnum(env, self) - == GetJEnum(env, obj); + return GetJEnum(env, self) == GetJEnum(env, obj); OCIO_JNITRY_EXIT(false) } JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_Globals_GpuLanguageToString(JNIEnv * env, jobject, jobject language) { +Java_org_OpenColorIO_Globals_GpuLanguageToString(JNIEnv * env, jobject, jobject language) +{ OCIO_JNITRY_ENTER() - return env->NewStringUTF( - GpuLanguageToString(GetJEnum(env, language))); + return env->NewStringUTF(GpuLanguageToString(GetJEnum(env, language))); OCIO_JNITRY_EXIT(NULL) } JNIEXPORT jobject JNICALL -Java_org_OpenColorIO_Globals_GpuLanguageFromString(JNIEnv * env, jobject, jstring s) { +Java_org_OpenColorIO_Globals_GpuLanguageFromString(JNIEnv * env, jobject, jstring s) +{ OCIO_JNITRY_ENTER() - return BuildJEnum(env, "org/OpenColorIO/GpuLanguage", - GpuLanguageFromString(GetJStringValue(env, s)())); + return BuildJEnum( + env, + "org/OpenColorIO/GpuLanguage", + GpuLanguageFromString(GetJStringValue(env, s)())); OCIO_JNITRY_EXIT(NULL) } // EnvironmentMode -JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_EnvironmentMode_toString(JNIEnv * env, jobject self) { +JNIEXPORT jstring JNICALL Java_org_OpenColorIO_EnvironmentMode_toString(JNIEnv * env, jobject self) +{ OCIO_JNITRY_ENTER() - return env->NewStringUTF( - EnvironmentModeToString(GetJEnum(env, self))); + return env->NewStringUTF(EnvironmentModeToString(GetJEnum(env, self))); OCIO_JNITRY_EXIT(NULL) } JNIEXPORT jboolean JNICALL -Java_org_OpenColorIO_EnvironmentMode_equals(JNIEnv * env, jobject self, jobject obj) { +Java_org_OpenColorIO_EnvironmentMode_equals(JNIEnv * env, jobject self, jobject obj) +{ OCIO_JNITRY_ENTER() - return GetJEnum(env, self) - == GetJEnum(env, obj); + return GetJEnum(env, self) == GetJEnum(env, obj); OCIO_JNITRY_EXIT(false) } JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_Globals_EnvironmentModeToString(JNIEnv * env, jobject, jobject mode) { +Java_org_OpenColorIO_Globals_EnvironmentModeToString(JNIEnv * env, jobject, jobject mode) +{ OCIO_JNITRY_ENTER() - return env->NewStringUTF( - EnvironmentModeToString(GetJEnum(env, mode))); + return env->NewStringUTF(EnvironmentModeToString(GetJEnum(env, mode))); OCIO_JNITRY_EXIT(NULL) } JNIEXPORT jobject JNICALL -Java_org_OpenColorIO_Globals_EnvironmentModeFromString(JNIEnv * env, jobject, jstring s) { +Java_org_OpenColorIO_Globals_EnvironmentModeFromString(JNIEnv * env, jobject, jstring s) +{ OCIO_JNITRY_ENTER() - return BuildJEnum(env, "org/OpenColorIO/EnvironmentMode", - EnvironmentModeFromString(GetJStringValue(env, s)())); + return BuildJEnum( + env, + "org/OpenColorIO/EnvironmentMode", + EnvironmentModeFromString(GetJStringValue(env, s)())); OCIO_JNITRY_EXIT(NULL) } diff --git a/src/bindings/java/JNIGpuShaderDesc.cpp b/src/bindings/java/JNIGpuShaderDesc.cpp index 3ceedf3be1..8429dc6f8e 100644 --- a/src/bindings/java/JNIGpuShaderDesc.cpp +++ b/src/bindings/java/JNIGpuShaderDesc.cpp @@ -1,66 +1,69 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. -#include #include +#include +#include "JNIUtil.h" #include "OpenColorIO/OpenColorIO.h" #include "OpenColorIOJNI.h" -#include "JNIUtil.h" using namespace OCIO_NAMESPACE; namespace { -void GpuShaderDesc_deleter(GpuShaderDesc* d) +void GpuShaderDesc_deleter(GpuShaderDesc * d) { delete d; } -}; // end anon namespace +}; // namespace -JNIEXPORT void JNICALL -Java_org_OpenColorIO_GpuShaderDesc_create(JNIEnv * env, jobject self) { +JNIEXPORT void JNICALL Java_org_OpenColorIO_GpuShaderDesc_create(JNIEnv * env, jobject self) +{ OCIO_JNITRY_ENTER() GpuShaderDescJNI * jnistruct = new GpuShaderDescJNI(); - jnistruct->back_ptr = env->NewGlobalRef(self); - jnistruct->constcppobj = new ConstGpuShaderDescRcPtr(); - jnistruct->cppobj = new GpuShaderDescRcPtr(); - *jnistruct->cppobj = GpuShaderDescRcPtr(new GpuShaderDesc(), &GpuShaderDesc_deleter); - jnistruct->isconst = false; - jclass wclass = env->GetObjectClass(self); - jfieldID fid = env->GetFieldID(wclass, "m_impl", "J"); + jnistruct->back_ptr = env->NewGlobalRef(self); + jnistruct->constcppobj = new ConstGpuShaderDescRcPtr(); + jnistruct->cppobj = new GpuShaderDescRcPtr(); + *jnistruct->cppobj = GpuShaderDescRcPtr(new GpuShaderDesc(), &GpuShaderDesc_deleter); + jnistruct->isconst = false; + jclass wclass = env->GetObjectClass(self); + jfieldID fid = env->GetFieldID(wclass, "m_impl", "J"); env->SetLongField(self, fid, (jlong)jnistruct); OCIO_JNITRY_EXIT() } -JNIEXPORT void JNICALL -Java_org_OpenColorIO_GpuShaderDesc_dispose(JNIEnv * env, jobject self) { +JNIEXPORT void JNICALL Java_org_OpenColorIO_GpuShaderDesc_dispose(JNIEnv * env, jobject self) +{ OCIO_JNITRY_ENTER() DisposeJOCIO(env, self); OCIO_JNITRY_EXIT() } JNIEXPORT void JNICALL -Java_org_OpenColorIO_GpuShaderDesc_setLanguage(JNIEnv * env, jobject self, jobject lang) { +Java_org_OpenColorIO_GpuShaderDesc_setLanguage(JNIEnv * env, jobject self, jobject lang) +{ OCIO_JNITRY_ENTER() GpuShaderDescRcPtr ptr = GetEditableJOCIO(env, self); ptr->setLanguage(GetJEnum(env, lang)); OCIO_JNITRY_EXIT() } -JNIEXPORT jobject JNICALL -Java_org_OpenColorIO_GpuShaderDesc_getLanguage(JNIEnv * env, jobject self) { +JNIEXPORT jobject JNICALL Java_org_OpenColorIO_GpuShaderDesc_getLanguage(JNIEnv * env, jobject self) +{ OCIO_JNITRY_ENTER() - ConstGpuShaderDescRcPtr ptr = GetConstJOCIO(env, self); + ConstGpuShaderDescRcPtr ptr + = GetConstJOCIO(env, self); return BuildJEnum(env, "org/OpenColorIO/GpuLanguage", ptr->getLanguage()); OCIO_JNITRY_EXIT(NULL) } JNIEXPORT void JNICALL -Java_org_OpenColorIO_GpuShaderDesc_setFunctionName(JNIEnv * env, jobject self, jstring name) { +Java_org_OpenColorIO_GpuShaderDesc_setFunctionName(JNIEnv * env, jobject self, jstring name) +{ OCIO_JNITRY_ENTER() - const char *_name = env->GetStringUTFChars(name, 0); + const char * _name = env->GetStringUTFChars(name, 0); GpuShaderDescRcPtr ptr = GetEditableJOCIO(env, self); ptr->setFunctionName(_name); env->ReleaseStringUTFChars(name, _name); @@ -68,15 +71,18 @@ Java_org_OpenColorIO_GpuShaderDesc_setFunctionName(JNIEnv * env, jobject self, j } JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_GpuShaderDesc_getFunctionName(JNIEnv * env, jobject self) { +Java_org_OpenColorIO_GpuShaderDesc_getFunctionName(JNIEnv * env, jobject self) +{ OCIO_JNITRY_ENTER() - ConstGpuShaderDescRcPtr ptr = GetConstJOCIO(env, self); + ConstGpuShaderDescRcPtr ptr + = GetConstJOCIO(env, self); return env->NewStringUTF(ptr->getFunctionName()); OCIO_JNITRY_EXIT(NULL) } JNIEXPORT void JNICALL -Java_org_OpenColorIO_GpuShaderDesc_setLut3DEdgeLen(JNIEnv * env, jobject self, jint len) { +Java_org_OpenColorIO_GpuShaderDesc_setLut3DEdgeLen(JNIEnv * env, jobject self, jint len) +{ OCIO_JNITRY_ENTER() GpuShaderDescRcPtr ptr = GetEditableJOCIO(env, self); ptr->setLut3DEdgeLen((int)len); @@ -84,17 +90,20 @@ Java_org_OpenColorIO_GpuShaderDesc_setLut3DEdgeLen(JNIEnv * env, jobject self, j } JNIEXPORT jint JNICALL -Java_org_OpenColorIO_GpuShaderDesc_getLut3DEdgeLen(JNIEnv * env, jobject self) { +Java_org_OpenColorIO_GpuShaderDesc_getLut3DEdgeLen(JNIEnv * env, jobject self) +{ OCIO_JNITRY_ENTER() - ConstGpuShaderDescRcPtr ptr = GetConstJOCIO(env, self); + ConstGpuShaderDescRcPtr ptr + = GetConstJOCIO(env, self); return (jint)ptr->getLut3DEdgeLen(); OCIO_JNITRY_EXIT(0) } -JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_GpuShaderDesc_getCacheID(JNIEnv * env, jobject self) { +JNIEXPORT jstring JNICALL Java_org_OpenColorIO_GpuShaderDesc_getCacheID(JNIEnv * env, jobject self) +{ OCIO_JNITRY_ENTER() - ConstGpuShaderDescRcPtr ptr = GetConstJOCIO(env, self); + ConstGpuShaderDescRcPtr ptr + = GetConstJOCIO(env, self); return env->NewStringUTF(ptr->getCacheID()); OCIO_JNITRY_EXIT(NULL) } diff --git a/src/bindings/java/JNIImageDesc.cpp b/src/bindings/java/JNIImageDesc.cpp index 69b74959a9..1bbfc293ab 100644 --- a/src/bindings/java/JNIImageDesc.cpp +++ b/src/bindings/java/JNIImageDesc.cpp @@ -1,14 +1,14 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. +#include "JNIUtil.h" #include "OpenColorIO/OpenColorIO.h" #include "OpenColorIOJNI.h" -#include "JNIUtil.h" using namespace OCIO_NAMESPACE; namespace { -void ImageDesc_deleter(ImageDesc* d) +void ImageDesc_deleter(ImageDesc * d) { delete d; } @@ -18,86 +18,102 @@ void ImageDesc_dispose(JNIEnv * env, jobject self) DisposeJOCIO(env, self); } -}; // end anon namespace +}; // namespace // PackedImageDesc -JNIEXPORT void JNICALL -Java_org_OpenColorIO_PackedImageDesc_create__Ljava_nio_FloatBuffer_2JJJ(JNIEnv * env, - jobject self, jobject data, jlong width, jlong height, jlong numChannels) +JNIEXPORT void JNICALL Java_org_OpenColorIO_PackedImageDesc_create__Ljava_nio_FloatBuffer_2JJJ( + JNIEnv * env, + jobject self, + jobject data, + jlong width, + jlong height, + jlong numChannels) { OCIO_JNITRY_ENTER() - float* _data = GetJFloatBuffer(env, data, width * height * numChannels); - if(!_data) throw Exception("Could not find direct buffer address for data"); + float * _data = GetJFloatBuffer(env, data, width * height * numChannels); + if (!_data) + throw Exception("Could not find direct buffer address for data"); ImageDescJNI * jnistruct = new ImageDescJNI(); - jnistruct->back_ptr = env->NewGlobalRef(self); - jnistruct->constcppobj = new ConstImageDescRcPtr(); - jnistruct->cppobj = new ImageDescRcPtr(); - *jnistruct->cppobj = ImageDescRcPtr(new PackedImageDesc(_data, (long)width, - (long)height, (long)numChannels), &ImageDesc_deleter); + jnistruct->back_ptr = env->NewGlobalRef(self); + jnistruct->constcppobj = new ConstImageDescRcPtr(); + jnistruct->cppobj = new ImageDescRcPtr(); + *jnistruct->cppobj = ImageDescRcPtr( + new PackedImageDesc(_data, (long)width, (long)height, (long)numChannels), + &ImageDesc_deleter); jnistruct->isconst = false; - jclass wclass = env->GetObjectClass(self); - jfieldID fid = env->GetFieldID(wclass, "m_impl", "J"); + jclass wclass = env->GetObjectClass(self); + jfieldID fid = env->GetFieldID(wclass, "m_impl", "J"); env->SetLongField(self, fid, (jlong)jnistruct); OCIO_JNITRY_EXIT() } -JNIEXPORT void JNICALL -Java_org_OpenColorIO_PackedImageDesc_create__Ljava_nio_FloatBuffer_2JJJJJJ(JNIEnv * env, - jobject self, jobject data, jlong width, jlong height, jlong numChannels, - jlong chanStrideBytes, jlong xStrideBytes, jlong yStrideBytes) +JNIEXPORT void JNICALL Java_org_OpenColorIO_PackedImageDesc_create__Ljava_nio_FloatBuffer_2JJJJJJ( + JNIEnv * env, + jobject self, + jobject data, + jlong width, + jlong height, + jlong numChannels, + jlong chanStrideBytes, + jlong xStrideBytes, + jlong yStrideBytes) { OCIO_JNITRY_ENTER() - float* _data = GetJFloatBuffer(env, data, width * height * numChannels); - if(!_data) throw Exception("Could not find direct buffer address for data"); + float * _data = GetJFloatBuffer(env, data, width * height * numChannels); + if (!_data) + throw Exception("Could not find direct buffer address for data"); ImageDescJNI * jnistruct = new ImageDescJNI(); - jnistruct->back_ptr = env->NewGlobalRef(self); - jnistruct->constcppobj = new ConstImageDescRcPtr(); - jnistruct->cppobj = new ImageDescRcPtr(); - *jnistruct->cppobj = ImageDescRcPtr(new PackedImageDesc(_data, (long)width, - (long)height, (long)numChannels, (long)chanStrideBytes, (long) xStrideBytes, - (long)yStrideBytes), &ImageDesc_deleter); + jnistruct->back_ptr = env->NewGlobalRef(self); + jnistruct->constcppobj = new ConstImageDescRcPtr(); + jnistruct->cppobj = new ImageDescRcPtr(); + *jnistruct->cppobj = ImageDescRcPtr( + new PackedImageDesc( + _data, + (long)width, + (long)height, + (long)numChannels, + (long)chanStrideBytes, + (long)xStrideBytes, + (long)yStrideBytes), + &ImageDesc_deleter); jnistruct->isconst = false; - jclass wclass = env->GetObjectClass(self); - jfieldID fid = env->GetFieldID(wclass, "m_impl", "J"); + jclass wclass = env->GetObjectClass(self); + jfieldID fid = env->GetFieldID(wclass, "m_impl", "J"); env->SetLongField(self, fid, (jlong)jnistruct); OCIO_JNITRY_EXIT() } -JNIEXPORT void JNICALL -Java_org_OpenColorIO_PackedImageDesc_dispose(JNIEnv * env, jobject self) +JNIEXPORT void JNICALL Java_org_OpenColorIO_PackedImageDesc_dispose(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() ImageDesc_dispose(env, self); OCIO_JNITRY_EXIT() } -JNIEXPORT jobject JNICALL -Java_org_OpenColorIO_PackedImageDesc_getData(JNIEnv * env, jobject self) +JNIEXPORT jobject JNICALL Java_org_OpenColorIO_PackedImageDesc_getData(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - ConstImageDescRcPtr img = GetConstJOCIO(env, self); + ConstImageDescRcPtr img = GetConstJOCIO(env, self); ConstPackedImageDescRcPtr ptr = DynamicPtrCast(img); - int size = ptr->getWidth() * ptr->getHeight() * ptr->getNumChannels(); + int size = ptr->getWidth() * ptr->getHeight() * ptr->getNumChannels(); return NewJFloatBuffer(env, ptr->getData(), size); OCIO_JNITRY_EXIT(NULL) } -JNIEXPORT jlong JNICALL -Java_org_OpenColorIO_PackedImageDesc_getWidth(JNIEnv * env, jobject self) +JNIEXPORT jlong JNICALL Java_org_OpenColorIO_PackedImageDesc_getWidth(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - ConstImageDescRcPtr img = GetConstJOCIO(env, self); + ConstImageDescRcPtr img = GetConstJOCIO(env, self); ConstPackedImageDescRcPtr ptr = DynamicPtrCast(img); return (jlong)ptr->getWidth(); OCIO_JNITRY_EXIT(0) } -JNIEXPORT jlong JNICALL -Java_org_OpenColorIO_PackedImageDesc_getHeight(JNIEnv * env, jobject self) +JNIEXPORT jlong JNICALL Java_org_OpenColorIO_PackedImageDesc_getHeight(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - ConstImageDescRcPtr img = GetConstJOCIO(env, self); + ConstImageDescRcPtr img = GetConstJOCIO(env, self); ConstPackedImageDescRcPtr ptr = DynamicPtrCast(img); return (jlong)ptr->getHeight(); OCIO_JNITRY_EXIT(0) @@ -107,7 +123,7 @@ JNIEXPORT jlong JNICALL Java_org_OpenColorIO_PackedImageDesc_getNumChannels(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - ConstImageDescRcPtr img = GetConstJOCIO(env, self); + ConstImageDescRcPtr img = GetConstJOCIO(env, self); ConstPackedImageDescRcPtr ptr = DynamicPtrCast(img); return (jlong)ptr->getNumChannels(); OCIO_JNITRY_EXIT(0) @@ -117,7 +133,7 @@ JNIEXPORT jlong JNICALL Java_org_OpenColorIO_PackedImageDesc_getChanStrideBytes(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - ConstImageDescRcPtr img = GetConstJOCIO(env, self); + ConstImageDescRcPtr img = GetConstJOCIO(env, self); ConstPackedImageDescRcPtr ptr = DynamicPtrCast(img); return (jlong)ptr->getChanStrideBytes(); OCIO_JNITRY_EXIT(0) @@ -127,7 +143,7 @@ JNIEXPORT jlong JNICALL Java_org_OpenColorIO_PackedImageDesc_getXStrideBytes(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - ConstImageDescRcPtr img = GetConstJOCIO(env, self); + ConstImageDescRcPtr img = GetConstJOCIO(env, self); ConstPackedImageDescRcPtr ptr = DynamicPtrCast(img); return (jlong)ptr->getXStrideBytes(); OCIO_JNITRY_EXIT(0) @@ -137,7 +153,7 @@ JNIEXPORT jlong JNICALL Java_org_OpenColorIO_PackedImageDesc_getYStrideBytes(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - ConstImageDescRcPtr img = GetConstJOCIO(env, self); + ConstImageDescRcPtr img = GetConstJOCIO(env, self); ConstPackedImageDescRcPtr ptr = DynamicPtrCast(img); return (jlong)ptr->getYStrideBytes(); OCIO_JNITRY_EXIT(0) @@ -145,8 +161,7 @@ Java_org_OpenColorIO_PackedImageDesc_getYStrideBytes(JNIEnv * env, jobject self) // PlanarImageDesc -JNIEXPORT void JNICALL -Java_org_OpenColorIO_PlanarImageDesc_dispose(JNIEnv * env, jobject self) +JNIEXPORT void JNICALL Java_org_OpenColorIO_PlanarImageDesc_dispose(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() ImageDesc_dispose(env, self); @@ -154,120 +169,144 @@ Java_org_OpenColorIO_PlanarImageDesc_dispose(JNIEnv * env, jobject self) } JNIEXPORT void JNICALL -Java_org_OpenColorIO_PlanarImageDesc_create__Ljava_nio_FloatBuffer_2Ljava_nio_FloatBuffer_2Ljava_nio_FloatBuffer_2Ljava_nio_FloatBuffer_2JJ - (JNIEnv * env, jobject self, jobject rData, jobject gData, jobject bData, - jobject aData, jlong width, jlong height) +Java_org_OpenColorIO_PlanarImageDesc_create__Ljava_nio_FloatBuffer_2Ljava_nio_FloatBuffer_2Ljava_nio_FloatBuffer_2Ljava_nio_FloatBuffer_2JJ( + JNIEnv * env, + jobject self, + jobject rData, + jobject gData, + jobject bData, + jobject aData, + jlong width, + jlong height) { OCIO_JNITRY_ENTER() - int32_t size = width * height; - float* _rdata = GetJFloatBuffer(env, rData, size); - if(!_rdata) throw Exception("Could not find direct buffer address for rData"); - float* _gdata = GetJFloatBuffer(env, gData, size); - if(!_gdata) throw Exception("Could not find direct buffer address for gData"); - float* _bdata = GetJFloatBuffer(env, bData, size); - if(!_bdata) throw Exception("Could not find direct buffer address for bData"); - float* _adata = GetJFloatBuffer(env, aData, size); - if(!_adata) throw Exception("Could not find direct buffer address for aData"); + int32_t size = width * height; + float * _rdata = GetJFloatBuffer(env, rData, size); + if (!_rdata) + throw Exception("Could not find direct buffer address for rData"); + float * _gdata = GetJFloatBuffer(env, gData, size); + if (!_gdata) + throw Exception("Could not find direct buffer address for gData"); + float * _bdata = GetJFloatBuffer(env, bData, size); + if (!_bdata) + throw Exception("Could not find direct buffer address for bData"); + float * _adata = GetJFloatBuffer(env, aData, size); + if (!_adata) + throw Exception("Could not find direct buffer address for aData"); ImageDescJNI * jnistruct = new ImageDescJNI(); - jnistruct->back_ptr = env->NewGlobalRef(self); - jnistruct->constcppobj = new ConstImageDescRcPtr(); - jnistruct->cppobj = new ImageDescRcPtr(); - *jnistruct->cppobj = ImageDescRcPtr(new PlanarImageDesc(_rdata, _gdata, - _bdata, _adata, (long)width, (long)height), &ImageDesc_deleter); + jnistruct->back_ptr = env->NewGlobalRef(self); + jnistruct->constcppobj = new ConstImageDescRcPtr(); + jnistruct->cppobj = new ImageDescRcPtr(); + *jnistruct->cppobj = ImageDescRcPtr( + new PlanarImageDesc(_rdata, _gdata, _bdata, _adata, (long)width, (long)height), + &ImageDesc_deleter); jnistruct->isconst = false; - jclass wclass = env->GetObjectClass(self); - jfieldID fid = env->GetFieldID(wclass, "m_impl", "J"); + jclass wclass = env->GetObjectClass(self); + jfieldID fid = env->GetFieldID(wclass, "m_impl", "J"); env->SetLongField(self, fid, (jlong)jnistruct); OCIO_JNITRY_EXIT() } -JNIEXPORT void -JNICALL Java_org_OpenColorIO_PlanarImageDesc_create__Ljava_nio_FloatBuffer_2Ljava_nio_FloatBuffer_2Ljava_nio_FloatBuffer_2Ljava_nio_FloatBuffer_2JJJ - (JNIEnv * env, jobject self, jobject rData, jobject gData, jobject bData, - jobject aData, jlong width, jlong height, jlong yStrideBytes) +JNIEXPORT void JNICALL +Java_org_OpenColorIO_PlanarImageDesc_create__Ljava_nio_FloatBuffer_2Ljava_nio_FloatBuffer_2Ljava_nio_FloatBuffer_2Ljava_nio_FloatBuffer_2JJJ( + JNIEnv * env, + jobject self, + jobject rData, + jobject gData, + jobject bData, + jobject aData, + jlong width, + jlong height, + jlong yStrideBytes) { OCIO_JNITRY_ENTER() - int32_t size = width * height; - float* _rdata = GetJFloatBuffer(env, rData, size); - if(!_rdata) throw Exception("Could not find direct buffer address for rData"); - float* _gdata = GetJFloatBuffer(env, gData, size); - if(!_gdata) throw Exception("Could not find direct buffer address for gData"); - float* _bdata = GetJFloatBuffer(env, bData, size); - if(!_bdata) throw Exception("Could not find direct buffer address for bData"); - float* _adata = GetJFloatBuffer(env, aData, size); - if(!_adata) throw Exception("Could not find direct buffer address for aData"); + int32_t size = width * height; + float * _rdata = GetJFloatBuffer(env, rData, size); + if (!_rdata) + throw Exception("Could not find direct buffer address for rData"); + float * _gdata = GetJFloatBuffer(env, gData, size); + if (!_gdata) + throw Exception("Could not find direct buffer address for gData"); + float * _bdata = GetJFloatBuffer(env, bData, size); + if (!_bdata) + throw Exception("Could not find direct buffer address for bData"); + float * _adata = GetJFloatBuffer(env, aData, size); + if (!_adata) + throw Exception("Could not find direct buffer address for aData"); ImageDescJNI * jnistruct = new ImageDescJNI(); - jnistruct->back_ptr = env->NewGlobalRef(self); - jnistruct->constcppobj = new ConstImageDescRcPtr(); - jnistruct->cppobj = new ImageDescRcPtr(); - *jnistruct->cppobj = ImageDescRcPtr(new PlanarImageDesc(_rdata, _gdata, _bdata, - _adata, (long)width, (long)height, (long)yStrideBytes), &ImageDesc_deleter); + jnistruct->back_ptr = env->NewGlobalRef(self); + jnistruct->constcppobj = new ConstImageDescRcPtr(); + jnistruct->cppobj = new ImageDescRcPtr(); + *jnistruct->cppobj = ImageDescRcPtr( + new PlanarImageDesc( + _rdata, + _gdata, + _bdata, + _adata, + (long)width, + (long)height, + (long)yStrideBytes), + &ImageDesc_deleter); jnistruct->isconst = false; - jclass wclass = env->GetObjectClass(self); - jfieldID fid = env->GetFieldID(wclass, "m_impl", "J"); + jclass wclass = env->GetObjectClass(self); + jfieldID fid = env->GetFieldID(wclass, "m_impl", "J"); env->SetLongField(self, fid, (jlong)jnistruct); OCIO_JNITRY_EXIT() } -JNIEXPORT jobject JNICALL -Java_org_OpenColorIO_PlanarImageDesc_getRData(JNIEnv * env, jobject self) +JNIEXPORT jobject JNICALL Java_org_OpenColorIO_PlanarImageDesc_getRData(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - ConstImageDescRcPtr img = GetConstJOCIO(env, self); + ConstImageDescRcPtr img = GetConstJOCIO(env, self); ConstPlanarImageDescRcPtr ptr = DynamicPtrCast(img); - int size = ptr->getWidth() * ptr->getHeight(); + int size = ptr->getWidth() * ptr->getHeight(); return NewJFloatBuffer(env, ptr->getRData(), size); OCIO_JNITRY_EXIT(NULL) } -JNIEXPORT jobject JNICALL -Java_org_OpenColorIO_PlanarImageDesc_getGData(JNIEnv * env, jobject self) +JNIEXPORT jobject JNICALL Java_org_OpenColorIO_PlanarImageDesc_getGData(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - ConstImageDescRcPtr img = GetConstJOCIO(env, self); + ConstImageDescRcPtr img = GetConstJOCIO(env, self); ConstPlanarImageDescRcPtr ptr = DynamicPtrCast(img); - int size = ptr->getWidth() * ptr->getHeight(); + int size = ptr->getWidth() * ptr->getHeight(); return NewJFloatBuffer(env, ptr->getGData(), size); OCIO_JNITRY_EXIT(NULL) } -JNIEXPORT jobject JNICALL -Java_org_OpenColorIO_PlanarImageDesc_getBData(JNIEnv * env, jobject self) +JNIEXPORT jobject JNICALL Java_org_OpenColorIO_PlanarImageDesc_getBData(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - ConstImageDescRcPtr img = GetConstJOCIO(env, self); + ConstImageDescRcPtr img = GetConstJOCIO(env, self); ConstPlanarImageDescRcPtr ptr = DynamicPtrCast(img); - int size = ptr->getWidth() * ptr->getHeight(); + int size = ptr->getWidth() * ptr->getHeight(); return NewJFloatBuffer(env, ptr->getBData(), size); OCIO_JNITRY_EXIT(NULL) } -JNIEXPORT jobject JNICALL -Java_org_OpenColorIO_PlanarImageDesc_getAData(JNIEnv * env, jobject self) +JNIEXPORT jobject JNICALL Java_org_OpenColorIO_PlanarImageDesc_getAData(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - ConstImageDescRcPtr img = GetConstJOCIO(env, self); + ConstImageDescRcPtr img = GetConstJOCIO(env, self); ConstPlanarImageDescRcPtr ptr = DynamicPtrCast(img); - int size = ptr->getWidth() * ptr->getHeight(); + int size = ptr->getWidth() * ptr->getHeight(); return NewJFloatBuffer(env, ptr->getAData(), size); OCIO_JNITRY_EXIT(NULL) } -JNIEXPORT jlong JNICALL -Java_org_OpenColorIO_PlanarImageDesc_getWidth(JNIEnv * env, jobject self) +JNIEXPORT jlong JNICALL Java_org_OpenColorIO_PlanarImageDesc_getWidth(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - ConstImageDescRcPtr img = GetConstJOCIO(env, self); + ConstImageDescRcPtr img = GetConstJOCIO(env, self); ConstPlanarImageDescRcPtr ptr = DynamicPtrCast(img); return (jlong)ptr->getWidth(); OCIO_JNITRY_EXIT(0) } -JNIEXPORT jlong JNICALL -Java_org_OpenColorIO_PlanarImageDesc_getHeight(JNIEnv * env, jobject self) +JNIEXPORT jlong JNICALL Java_org_OpenColorIO_PlanarImageDesc_getHeight(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - ConstImageDescRcPtr img = GetConstJOCIO(env, self); + ConstImageDescRcPtr img = GetConstJOCIO(env, self); ConstPlanarImageDescRcPtr ptr = DynamicPtrCast(img); return (jlong)ptr->getHeight(); OCIO_JNITRY_EXIT(0) @@ -277,7 +316,7 @@ JNIEXPORT jlong JNICALL Java_org_OpenColorIO_PlanarImageDesc_getYStrideBytes(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - ConstImageDescRcPtr img = GetConstJOCIO(env, self); + ConstImageDescRcPtr img = GetConstJOCIO(env, self); ConstPlanarImageDescRcPtr ptr = DynamicPtrCast(img); return (jlong)ptr->getYStrideBytes(); OCIO_JNITRY_EXIT(0) diff --git a/src/bindings/java/JNILook.cpp b/src/bindings/java/JNILook.cpp index fc76c6692e..62e9a90ea0 100644 --- a/src/bindings/java/JNILook.cpp +++ b/src/bindings/java/JNILook.cpp @@ -1,34 +1,34 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. -#include #include +#include #include +#include "JNIUtil.h" #include "OpenColorIO/OpenColorIO.h" #include "OpenColorIOJNI.h" -#include "JNIUtil.h" using namespace OCIO_NAMESPACE; -JNIEXPORT void JNICALL -Java_org_OpenColorIO_Look_dispose(JNIEnv * env, jobject self) +JNIEXPORT void JNICALL Java_org_OpenColorIO_Look_dispose(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() DisposeJOCIO(env, self); OCIO_JNITRY_EXIT() } -JNIEXPORT jobject JNICALL -Java_org_OpenColorIO_Look_Create(JNIEnv * env, jobject self) +JNIEXPORT jobject JNICALL Java_org_OpenColorIO_Look_Create(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - return BuildJObject(env, self, - env->FindClass("org/OpenColorIO/Look"), Look::Create()); + return BuildJObject( + env, + self, + env->FindClass("org/OpenColorIO/Look"), + Look::Create()); OCIO_JNITRY_EXIT(NULL) } -JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_Look_getName(JNIEnv * env, jobject self) +JNIEXPORT jstring JNICALL Java_org_OpenColorIO_Look_getName(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() ConstLookRcPtr lok = GetConstJOCIO(env, self); @@ -36,8 +36,7 @@ Java_org_OpenColorIO_Look_getName(JNIEnv * env, jobject self) OCIO_JNITRY_EXIT(NULL) } -JNIEXPORT void JNICALL -Java_org_OpenColorIO_Look_setName(JNIEnv * env, jobject self, jstring name) +JNIEXPORT void JNICALL Java_org_OpenColorIO_Look_setName(JNIEnv * env, jobject self, jstring name) { OCIO_JNITRY_ENTER() LookRcPtr lok = GetEditableJOCIO(env, self); @@ -45,8 +44,7 @@ Java_org_OpenColorIO_Look_setName(JNIEnv * env, jobject self, jstring name) OCIO_JNITRY_EXIT() } -JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_Look_getProcessSpace(JNIEnv * env, jobject self) +JNIEXPORT jstring JNICALL Java_org_OpenColorIO_Look_getProcessSpace(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() ConstLookRcPtr lok = GetConstJOCIO(env, self); @@ -63,8 +61,7 @@ Java_org_OpenColorIO_Look_setProcessSpace(JNIEnv * env, jobject self, jstring pr OCIO_JNITRY_EXIT() } -JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_Look_getDescription(JNIEnv * env, jobject self) +JNIEXPORT jstring JNICALL Java_org_OpenColorIO_Look_getDescription(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() ConstLookRcPtr lok = GetConstJOCIO(env, self); @@ -81,14 +78,16 @@ Java_org_OpenColorIO_Look_setDescription(JNIEnv * env, jobject self, jstring pro OCIO_JNITRY_EXIT() } -JNIEXPORT jobject JNICALL -Java_org_OpenColorIO_Look_getTransform(JNIEnv * env, jobject self) +JNIEXPORT jobject JNICALL Java_org_OpenColorIO_Look_getTransform(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - ConstLookRcPtr lok = GetConstJOCIO(env, self); + ConstLookRcPtr lok = GetConstJOCIO(env, self); ConstTransformRcPtr tr = lok->getTransform(); - return BuildJConstObject(env, self, - env->FindClass(GetOCIOTClass(tr)), tr); + return BuildJConstObject( + env, + self, + env->FindClass(GetOCIOTClass(tr)), + tr); OCIO_JNITRY_EXIT(NULL) } @@ -96,20 +95,22 @@ JNIEXPORT void JNICALL Java_org_OpenColorIO_Look_setTransform(JNIEnv * env, jobject self, jobject transform) { OCIO_JNITRY_ENTER() - LookRcPtr lok = GetEditableJOCIO(env, self); + LookRcPtr lok = GetEditableJOCIO(env, self); ConstTransformRcPtr tran = GetConstJOCIO(env, transform); lok->setTransform(tran); OCIO_JNITRY_EXIT() } -JNIEXPORT jobject JNICALL -Java_org_OpenColorIO_Look_getInverseTransform(JNIEnv * env, jobject self) +JNIEXPORT jobject JNICALL Java_org_OpenColorIO_Look_getInverseTransform(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - ConstLookRcPtr lok = GetConstJOCIO(env, self); + ConstLookRcPtr lok = GetConstJOCIO(env, self); ConstTransformRcPtr tr = lok->getInverseTransform(); - return BuildJConstObject(env, self, - env->FindClass(GetOCIOTClass(tr)), tr); + return BuildJConstObject( + env, + self, + env->FindClass(GetOCIOTClass(tr)), + tr); OCIO_JNITRY_EXIT(NULL) } @@ -117,7 +118,7 @@ JNIEXPORT void JNICALL Java_org_OpenColorIO_Look_setInverseTransform(JNIEnv * env, jobject self, jobject transform) { OCIO_JNITRY_ENTER() - LookRcPtr lok = GetEditableJOCIO(env, self); + LookRcPtr lok = GetEditableJOCIO(env, self); ConstTransformRcPtr tran = GetConstJOCIO(env, transform); lok->setInverseTransform(tran); OCIO_JNITRY_EXIT() diff --git a/src/bindings/java/JNIProcessor.cpp b/src/bindings/java/JNIProcessor.cpp index 1e6b456da5..cd05374a81 100644 --- a/src/bindings/java/JNIProcessor.cpp +++ b/src/bindings/java/JNIProcessor.cpp @@ -1,26 +1,29 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. -#include #include +#include #include +#include "JNIUtil.h" #include "OpenColorIO/OpenColorIO.h" #include "OpenColorIOJNI.h" -#include "JNIUtil.h" using namespace OCIO_NAMESPACE; -JNIEXPORT jobject JNICALL -Java_org_OpenColorIO_Processor_Create(JNIEnv * env, jobject self) { +JNIEXPORT jobject JNICALL Java_org_OpenColorIO_Processor_Create(JNIEnv * env, jobject self) +{ OCIO_JNITRY_ENTER() - jobject obj = BuildJConstObject(env, self, - env->FindClass("org/OpenColorIO/Processor"), Processor::Create()); + jobject obj = BuildJConstObject( + env, + self, + env->FindClass("org/OpenColorIO/Processor"), + Processor::Create()); return obj; OCIO_JNITRY_EXIT(NULL) } -JNIEXPORT jboolean JNICALL -Java_org_OpenColorIO_Processor_isNoOp(JNIEnv * env, jobject self) { +JNIEXPORT jboolean JNICALL Java_org_OpenColorIO_Processor_isNoOp(JNIEnv * env, jobject self) +{ OCIO_JNITRY_ENTER() ConstProcessorRcPtr ptr = GetConstJOCIO(env, self); return (jboolean)ptr->isNoOp(); @@ -28,24 +31,26 @@ Java_org_OpenColorIO_Processor_isNoOp(JNIEnv * env, jobject self) { } JNIEXPORT jboolean JNICALL -Java_org_OpenColorIO_Processor_hasChannelCrosstalk(JNIEnv * env, jobject self) { +Java_org_OpenColorIO_Processor_hasChannelCrosstalk(JNIEnv * env, jobject self) +{ OCIO_JNITRY_ENTER() ConstProcessorRcPtr ptr = GetConstJOCIO(env, self); return (jboolean)ptr->hasChannelCrosstalk(); OCIO_JNITRY_EXIT(false) } -JNIEXPORT void JNICALL -Java_org_OpenColorIO_Processor_apply(JNIEnv * env, jobject self, jobject img) { +JNIEXPORT void JNICALL Java_org_OpenColorIO_Processor_apply(JNIEnv * env, jobject self, jobject img) +{ OCIO_JNITRY_ENTER() ConstProcessorRcPtr ptr = GetConstJOCIO(env, self); - ImageDescRcPtr _img = GetEditableJOCIO(env, img); + ImageDescRcPtr _img = GetEditableJOCIO(env, img); ptr->apply(*_img.get()); OCIO_JNITRY_EXIT() } JNIEXPORT void JNICALL -Java_org_OpenColorIO_Processor_applyRGB(JNIEnv * env, jobject self, jfloatArray pixel) { +Java_org_OpenColorIO_Processor_applyRGB(JNIEnv * env, jobject self, jfloatArray pixel) +{ OCIO_JNITRY_ENTER() ConstProcessorRcPtr ptr = GetConstJOCIO(env, self); ptr->applyRGB(GetJFloatArrayValue(env, pixel, "pixel", 3)()); @@ -53,15 +58,16 @@ Java_org_OpenColorIO_Processor_applyRGB(JNIEnv * env, jobject self, jfloatArray } JNIEXPORT void JNICALL -Java_org_OpenColorIO_Processor_applyRGBA(JNIEnv * env, jobject self, jfloatArray pixel) { +Java_org_OpenColorIO_Processor_applyRGBA(JNIEnv * env, jobject self, jfloatArray pixel) +{ OCIO_JNITRY_ENTER() ConstProcessorRcPtr ptr = GetConstJOCIO(env, self); ptr->applyRGBA(GetJFloatArrayValue(env, pixel, "pixel", 4)()); OCIO_JNITRY_EXIT() } -JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_Processor_getCpuCacheID(JNIEnv * env, jobject self) { +JNIEXPORT jstring JNICALL Java_org_OpenColorIO_Processor_getCpuCacheID(JNIEnv * env, jobject self) +{ OCIO_JNITRY_ENTER() ConstProcessorRcPtr ptr = GetConstJOCIO(env, self); return env->NewStringUTF(ptr->getCpuCacheID()); @@ -69,40 +75,53 @@ Java_org_OpenColorIO_Processor_getCpuCacheID(JNIEnv * env, jobject self) { } JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_Processor_getGpuShaderText(JNIEnv * env, jobject self, jobject shaderDesc) { +Java_org_OpenColorIO_Processor_getGpuShaderText(JNIEnv * env, jobject self, jobject shaderDesc) +{ OCIO_JNITRY_ENTER() ConstProcessorRcPtr ptr = GetConstJOCIO(env, self); - ConstGpuShaderDescRcPtr desc = GetConstJOCIO(env, shaderDesc); + ConstGpuShaderDescRcPtr desc + = GetConstJOCIO(env, shaderDesc); return env->NewStringUTF(ptr->getGpuShaderText(*desc.get())); OCIO_JNITRY_EXIT(NULL) } -JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_Processor_getGpuShaderTextCacheID(JNIEnv * env, jobject self, jobject shaderDesc) { +JNIEXPORT jstring JNICALL Java_org_OpenColorIO_Processor_getGpuShaderTextCacheID( + JNIEnv * env, + jobject self, + jobject shaderDesc) +{ OCIO_JNITRY_ENTER() ConstProcessorRcPtr ptr = GetConstJOCIO(env, self); - ConstGpuShaderDescRcPtr desc = GetConstJOCIO(env, shaderDesc); + ConstGpuShaderDescRcPtr desc + = GetConstJOCIO(env, shaderDesc); return env->NewStringUTF(ptr->getGpuShaderTextCacheID(*desc.get())); OCIO_JNITRY_EXIT(NULL) } -JNIEXPORT void JNICALL -Java_org_OpenColorIO_Processor_getGpuLut3D(JNIEnv * env, jobject self, jobject lut3d, jobject shaderDesc) { +JNIEXPORT void JNICALL Java_org_OpenColorIO_Processor_getGpuLut3D( + JNIEnv * env, + jobject self, + jobject lut3d, + jobject shaderDesc) +{ OCIO_JNITRY_ENTER() ConstProcessorRcPtr ptr = GetConstJOCIO(env, self); - ConstGpuShaderDescRcPtr desc = GetConstJOCIO(env, shaderDesc); - int len = desc->getLut3DEdgeLen(); - int size = 3*len*len*len; - float* _lut3d = GetJFloatBuffer(env, lut3d, size); + ConstGpuShaderDescRcPtr desc + = GetConstJOCIO(env, shaderDesc); + int len = desc->getLut3DEdgeLen(); + int size = 3 * len * len * len; + float * _lut3d = GetJFloatBuffer(env, lut3d, size); ptr->getGpuLut3D(_lut3d, *desc.get()); OCIO_JNITRY_EXIT() } JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_Processor_getGpuLut3DCacheID(JNIEnv * env, jobject self, jobject shaderDesc) { +Java_org_OpenColorIO_Processor_getGpuLut3DCacheID(JNIEnv * env, jobject self, jobject shaderDesc) +{ OCIO_JNITRY_ENTER() ConstProcessorRcPtr ptr = GetConstJOCIO(env, self); - ConstGpuShaderDescRcPtr desc = GetConstJOCIO(env, shaderDesc); + ConstGpuShaderDescRcPtr desc + = GetConstJOCIO(env, shaderDesc); return env->NewStringUTF(ptr->getGpuLut3DCacheID(*desc.get())); OCIO_JNITRY_EXIT(NULL) } diff --git a/src/bindings/java/JNITransforms.cpp b/src/bindings/java/JNITransforms.cpp index 0828ef4cc8..b46769f2ce 100644 --- a/src/bindings/java/JNITransforms.cpp +++ b/src/bindings/java/JNITransforms.cpp @@ -1,15 +1,14 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. +#include "JNIUtil.h" #include "OpenColorIO/OpenColorIO.h" #include "OpenColorIOJNI.h" -#include "JNIUtil.h" using namespace OCIO_NAMESPACE; // Transform -JNIEXPORT void JNICALL -Java_org_OpenColorIO_Transform_dispose(JNIEnv * env, jobject self) +JNIEXPORT void JNICALL Java_org_OpenColorIO_Transform_dispose(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() DisposeJOCIO(env, self); @@ -21,13 +20,15 @@ Java_org_OpenColorIO_Transform_createEditableCopy(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() ConstTransformRcPtr ctran = GetConstJOCIO(env, self); - return BuildJObject(env, self, - env->FindClass(GetOCIOTClass(ctran)), ctran->createEditableCopy()); + return BuildJObject( + env, + self, + env->FindClass(GetOCIOTClass(ctran)), + ctran->createEditableCopy()); OCIO_JNITRY_EXIT(NULL) } -JNIEXPORT jobject JNICALL -Java_org_OpenColorIO_Transform_getDirection(JNIEnv * env, jobject self) +JNIEXPORT jobject JNICALL Java_org_OpenColorIO_Transform_getDirection(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() ConstTransformRcPtr ptr = GetConstJOCIO(env, self); @@ -50,8 +51,11 @@ JNIEXPORT jobject JNICALL Java_org_OpenColorIO_AllocationTransform_Create(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - return BuildJObject(env, self, - env->FindClass("org/OpenColorIO/AllocationTransform"), AllocationTransform::Create()); + return BuildJObject( + env, + self, + env->FindClass("org/OpenColorIO/AllocationTransform"), + AllocationTransform::Create()); OCIO_JNITRY_EXIT(NULL) } @@ -59,16 +63,20 @@ JNIEXPORT jobject JNICALL Java_org_OpenColorIO_AllocationTransform_getAllocation(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - ConstAllocationTransformRcPtr alctran = GetConstJOCIO(env, self); + ConstAllocationTransformRcPtr alctran + = GetConstJOCIO(env, self); return BuildJEnum(env, "org/OpenColorIO/Allocation", alctran->getAllocation()); OCIO_JNITRY_EXIT(NULL) } -JNIEXPORT void JNICALL -Java_org_OpenColorIO_AllocationTransform_setAllocation(JNIEnv * env, jobject self, jobject allocation) +JNIEXPORT void JNICALL Java_org_OpenColorIO_AllocationTransform_setAllocation( + JNIEnv * env, + jobject self, + jobject allocation) { OCIO_JNITRY_ENTER() - AllocationTransformRcPtr alctran = GetEditableJOCIO(env, self); + AllocationTransformRcPtr alctran + = GetEditableJOCIO(env, self); alctran->setAllocation(GetJEnum(env, allocation)); OCIO_JNITRY_EXIT() } @@ -77,7 +85,8 @@ JNIEXPORT jint JNICALL Java_org_OpenColorIO_AllocationTransform_getNumVars(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - ConstAllocationTransformRcPtr alctran = GetConstJOCIO(env, self); + ConstAllocationTransformRcPtr alctran + = GetConstJOCIO(env, self); return (jint)alctran->getNumVars(); OCIO_JNITRY_EXIT(0) } @@ -86,38 +95,50 @@ JNIEXPORT void JNICALL Java_org_OpenColorIO_AllocationTransform_getVars(JNIEnv * env, jobject self, jfloatArray vars) { OCIO_JNITRY_ENTER() - ConstAllocationTransformRcPtr alctran = GetConstJOCIO(env, self); + ConstAllocationTransformRcPtr alctran + = GetConstJOCIO(env, self); alctran->getVars(SetJFloatArrayValue(env, vars, "vars", alctran->getNumVars())()); OCIO_JNITRY_EXIT() } -JNIEXPORT void JNICALL -Java_org_OpenColorIO_AllocationTransform_setVars(JNIEnv * env, jobject self, jint numvars, jfloatArray vars) +JNIEXPORT void JNICALL Java_org_OpenColorIO_AllocationTransform_setVars( + JNIEnv * env, + jobject self, + jint numvars, + jfloatArray vars) { OCIO_JNITRY_ENTER() - AllocationTransformRcPtr alctran = GetEditableJOCIO(env, self); + AllocationTransformRcPtr alctran + = GetEditableJOCIO(env, self); alctran->setVars((int)numvars, GetJFloatArrayValue(env, vars, "vars", numvars)()); OCIO_JNITRY_EXIT() } // CDLTransform -JNIEXPORT jobject JNICALL -Java_org_OpenColorIO_CDLTransform_Create(JNIEnv * env, jobject self) +JNIEXPORT jobject JNICALL Java_org_OpenColorIO_CDLTransform_Create(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - return BuildJObject(env, self, - env->FindClass("org/OpenColorIO/CDLTransform"), CDLTransform::Create()); + return BuildJObject( + env, + self, + env->FindClass("org/OpenColorIO/CDLTransform"), + CDLTransform::Create()); OCIO_JNITRY_EXIT(NULL) } -JNIEXPORT jobject JNICALL -Java_org_OpenColorIO_CDLTransform_CreateFromFile(JNIEnv * env, jobject self, jstring src, jstring cccid) +JNIEXPORT jobject JNICALL Java_org_OpenColorIO_CDLTransform_CreateFromFile( + JNIEnv * env, + jobject self, + jstring src, + jstring cccid) { OCIO_JNITRY_ENTER() - return BuildJObject(env, self, - env->FindClass("org/OpenColorIO/CDLTransform"), - CDLTransform::CreateFromFile(GetJStringValue(env, src)(), GetJStringValue(env, cccid)())); + return BuildJObject( + env, + self, + env->FindClass("org/OpenColorIO/CDLTransform"), + CDLTransform::CreateFromFile(GetJStringValue(env, src)(), GetJStringValue(env, cccid)())); OCIO_JNITRY_EXIT(NULL) } @@ -131,11 +152,11 @@ Java_org_OpenColorIO_CDLTransform_equals(JNIEnv * env, jobject self, jobject obj OCIO_JNITRY_EXIT(false) } -JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_CDLTransform_getXML(JNIEnv * env, jobject self) +JNIEXPORT jstring JNICALL Java_org_OpenColorIO_CDLTransform_getXML(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - ConstCDLTransformRcPtr cdltran = GetConstJOCIO(env, self); + ConstCDLTransformRcPtr cdltran + = GetConstJOCIO(env, self); return env->NewStringUTF(cdltran->getXML()); OCIO_JNITRY_EXIT(NULL) } @@ -162,7 +183,8 @@ JNIEXPORT void JNICALL Java_org_OpenColorIO_CDLTransform_getSlope(JNIEnv * env, jobject self, jfloatArray rgb) { OCIO_JNITRY_ENTER() - ConstCDLTransformRcPtr cdltran = GetConstJOCIO(env, self); + ConstCDLTransformRcPtr cdltran + = GetConstJOCIO(env, self); cdltran->getSlope(SetJFloatArrayValue(env, rgb, "rgb", 3)()); OCIO_JNITRY_EXIT() } @@ -180,7 +202,8 @@ JNIEXPORT void JNICALL Java_org_OpenColorIO_CDLTransform_getOffset(JNIEnv * env, jobject self, jfloatArray rgb) { OCIO_JNITRY_ENTER() - ConstCDLTransformRcPtr cdltran = GetConstJOCIO(env, self); + ConstCDLTransformRcPtr cdltran + = GetConstJOCIO(env, self); cdltran->getOffset(SetJFloatArrayValue(env, rgb, "rgb", 3)()); OCIO_JNITRY_EXIT() } @@ -198,7 +221,8 @@ JNIEXPORT void JNICALL Java_org_OpenColorIO_CDLTransform_getPower(JNIEnv * env, jobject self, jfloatArray rgb) { OCIO_JNITRY_ENTER() - ConstCDLTransformRcPtr cdltran = GetConstJOCIO(env, self); + ConstCDLTransformRcPtr cdltran + = GetConstJOCIO(env, self); cdltran->getPower(SetJFloatArrayValue(env, rgb, "rgb", 3)()); OCIO_JNITRY_EXIT() } @@ -216,7 +240,8 @@ JNIEXPORT void JNICALL Java_org_OpenColorIO_CDLTransform_getSOP(JNIEnv * env, jobject self, jfloatArray vec9) { OCIO_JNITRY_ENTER() - ConstCDLTransformRcPtr cdltran = GetConstJOCIO(env, self); + ConstCDLTransformRcPtr cdltran + = GetConstJOCIO(env, self); cdltran->getSOP(SetJFloatArrayValue(env, vec9, "vec9", 9)()); OCIO_JNITRY_EXIT() } @@ -230,11 +255,11 @@ Java_org_OpenColorIO_CDLTransform_setSat(JNIEnv * env, jobject self, jfloat sat) OCIO_JNITRY_EXIT() } -JNIEXPORT jfloat JNICALL -Java_org_OpenColorIO_CDLTransform_getSat(JNIEnv * env, jobject self) +JNIEXPORT jfloat JNICALL Java_org_OpenColorIO_CDLTransform_getSat(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - ConstCDLTransformRcPtr cdltran = GetConstJOCIO(env, self); + ConstCDLTransformRcPtr cdltran + = GetConstJOCIO(env, self); return (jfloat)cdltran->getSat(); OCIO_JNITRY_EXIT(1.f) } @@ -243,7 +268,8 @@ JNIEXPORT void JNICALL Java_org_OpenColorIO_CDLTransform_getSatLumaCoefs(JNIEnv * env, jobject self, jfloatArray rgb) { OCIO_JNITRY_ENTER() - ConstCDLTransformRcPtr cdltran = GetConstJOCIO(env, self); + ConstCDLTransformRcPtr cdltran + = GetConstJOCIO(env, self); cdltran->getSatLumaCoefs(SetJFloatArrayValue(env, rgb, "rgb", 3)()); OCIO_JNITRY_EXIT() } @@ -257,11 +283,11 @@ Java_org_OpenColorIO_CDLTransform_setID(JNIEnv * env, jobject self, jstring id) OCIO_JNITRY_EXIT() } -JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_CDLTransform_getID(JNIEnv * env, jobject self) +JNIEXPORT jstring JNICALL Java_org_OpenColorIO_CDLTransform_getID(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - ConstCDLTransformRcPtr cdltran = GetConstJOCIO(env, self); + ConstCDLTransformRcPtr cdltran + = GetConstJOCIO(env, self); return env->NewStringUTF(cdltran->getID()); OCIO_JNITRY_EXIT(NULL) } @@ -279,7 +305,8 @@ JNIEXPORT jstring JNICALL Java_org_OpenColorIO_CDLTransform_getDescription(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - ConstCDLTransformRcPtr cdltran = GetConstJOCIO(env, self); + ConstCDLTransformRcPtr cdltran + = GetConstJOCIO(env, self); return env->NewStringUTF(cdltran->getDescription()); OCIO_JNITRY_EXIT(NULL) } @@ -290,8 +317,11 @@ JNIEXPORT jobject JNICALL Java_org_OpenColorIO_ColorSpaceTransform_Create(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - return BuildJObject(env, self, - env->FindClass("org/OpenColorIO/ColorSpaceTransform"), ColorSpaceTransform::Create()); + return BuildJObject( + env, + self, + env->FindClass("org/OpenColorIO/ColorSpaceTransform"), + ColorSpaceTransform::Create()); OCIO_JNITRY_EXIT(NULL) } @@ -299,7 +329,8 @@ JNIEXPORT jstring JNICALL Java_org_OpenColorIO_ColorSpaceTransform_getSrc(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - ConstColorSpaceTransformRcPtr coltran = GetConstJOCIO(env, self); + ConstColorSpaceTransformRcPtr coltran + = GetConstJOCIO(env, self); return env->NewStringUTF(coltran->getSrc()); OCIO_JNITRY_EXIT(NULL) } @@ -308,7 +339,8 @@ JNIEXPORT void JNICALL Java_org_OpenColorIO_ColorSpaceTransform_setSrc(JNIEnv * env, jobject self, jstring src) { OCIO_JNITRY_ENTER() - ColorSpaceTransformRcPtr coltran = GetEditableJOCIO(env, self); + ColorSpaceTransformRcPtr coltran + = GetEditableJOCIO(env, self); coltran->setSrc(GetJStringValue(env, src)()); OCIO_JNITRY_EXIT() } @@ -317,7 +349,8 @@ JNIEXPORT jstring JNICALL Java_org_OpenColorIO_ColorSpaceTransform_getDst(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - ConstColorSpaceTransformRcPtr coltran = GetConstJOCIO(env, self); + ConstColorSpaceTransformRcPtr coltran + = GetConstJOCIO(env, self); return env->NewStringUTF(coltran->getDst()); OCIO_JNITRY_EXIT(NULL) } @@ -326,27 +359,33 @@ JNIEXPORT void JNICALL Java_org_OpenColorIO_ColorSpaceTransform_setDst(JNIEnv * env, jobject self, jstring dst) { OCIO_JNITRY_ENTER() - ColorSpaceTransformRcPtr coltran = GetEditableJOCIO(env, self); + ColorSpaceTransformRcPtr coltran + = GetEditableJOCIO(env, self); coltran->setDst(GetJStringValue(env, dst)()); OCIO_JNITRY_EXIT() } // DisplayTransform -JNIEXPORT jobject JNICALL -Java_org_OpenColorIO_DisplayTransform_Create(JNIEnv * env, jobject self) +JNIEXPORT jobject JNICALL Java_org_OpenColorIO_DisplayTransform_Create(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - return BuildJObject(env, self, - env->FindClass("org/OpenColorIO/DisplayTransform"), DisplayTransform::Create()); + return BuildJObject( + env, + self, + env->FindClass("org/OpenColorIO/DisplayTransform"), + DisplayTransform::Create()); OCIO_JNITRY_EXIT(NULL) } -JNIEXPORT void JNICALL -Java_org_OpenColorIO_DisplayTransform_setInputColorSpaceName(JNIEnv * env, jobject self, jstring name) +JNIEXPORT void JNICALL Java_org_OpenColorIO_DisplayTransform_setInputColorSpaceName( + JNIEnv * env, + jobject self, + jstring name) { OCIO_JNITRY_ENTER() - DisplayTransformRcPtr dtran = GetEditableJOCIO(env, self); + DisplayTransformRcPtr dtran + = GetEditableJOCIO(env, self); dtran->setInputColorSpaceName(GetJStringValue(env, name)()); OCIO_JNITRY_EXIT() } @@ -355,7 +394,8 @@ JNIEXPORT jstring JNICALL Java_org_OpenColorIO_DisplayTransform_getInputColorSpaceName(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - ConstDisplayTransformRcPtr dtran = GetConstJOCIO(env, self); + ConstDisplayTransformRcPtr dtran + = GetConstJOCIO(env, self); return env->NewStringUTF(dtran->getInputColorSpaceName()); OCIO_JNITRY_EXIT(NULL) } @@ -364,7 +404,8 @@ JNIEXPORT void JNICALL Java_org_OpenColorIO_DisplayTransform_setLinearCC(JNIEnv * env, jobject self, jobject cc) { OCIO_JNITRY_ENTER() - DisplayTransformRcPtr dtran = GetEditableJOCIO(env, self); + DisplayTransformRcPtr dtran + = GetEditableJOCIO(env, self); ConstTransformRcPtr ptr = GetConstJOCIO(env, cc); dtran->setLinearCC(ptr); OCIO_JNITRY_EXIT() @@ -374,10 +415,14 @@ JNIEXPORT jobject JNICALL Java_org_OpenColorIO_DisplayTransform_getLinearCC(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - ConstDisplayTransformRcPtr dtran = GetConstJOCIO(env, self); + ConstDisplayTransformRcPtr dtran + = GetConstJOCIO(env, self); ConstTransformRcPtr cctran = dtran->getLinearCC(); - return BuildJObject(env, self, - env->FindClass(GetOCIOTClass(cctran)), cctran->createEditableCopy()); + return BuildJObject( + env, + self, + env->FindClass(GetOCIOTClass(cctran)), + cctran->createEditableCopy()); OCIO_JNITRY_EXIT(NULL) } @@ -385,7 +430,8 @@ JNIEXPORT void JNICALL Java_org_OpenColorIO_DisplayTransform_setColorTimingCC(JNIEnv * env, jobject self, jobject cc) { OCIO_JNITRY_ENTER() - DisplayTransformRcPtr dtran = GetEditableJOCIO(env, self); + DisplayTransformRcPtr dtran + = GetEditableJOCIO(env, self); ConstTransformRcPtr ptr = GetConstJOCIO(env, cc); dtran->setColorTimingCC(ptr); OCIO_JNITRY_EXIT() @@ -395,10 +441,14 @@ JNIEXPORT jobject JNICALL Java_org_OpenColorIO_DisplayTransform_getColorTimingCC(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - ConstDisplayTransformRcPtr dtran = GetConstJOCIO(env, self); + ConstDisplayTransformRcPtr dtran + = GetConstJOCIO(env, self); ConstTransformRcPtr cctran = dtran->getColorTimingCC(); - return BuildJObject(env, self, - env->FindClass(GetOCIOTClass(cctran)), cctran->createEditableCopy()); + return BuildJObject( + env, + self, + env->FindClass(GetOCIOTClass(cctran)), + cctran->createEditableCopy()); OCIO_JNITRY_EXIT(NULL) } @@ -406,7 +456,8 @@ JNIEXPORT void JNICALL Java_org_OpenColorIO_DisplayTransform_setChannelView(JNIEnv * env, jobject self, jobject transform) { OCIO_JNITRY_ENTER() - DisplayTransformRcPtr dtran = GetEditableJOCIO(env, self); + DisplayTransformRcPtr dtran + = GetEditableJOCIO(env, self); ConstTransformRcPtr ptr = GetConstJOCIO(env, transform); dtran->setChannelView(ptr); OCIO_JNITRY_EXIT() @@ -416,10 +467,14 @@ JNIEXPORT jobject JNICALL Java_org_OpenColorIO_DisplayTransform_getChannelView(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - ConstDisplayTransformRcPtr dtran = GetConstJOCIO(env, self); + ConstDisplayTransformRcPtr dtran + = GetConstJOCIO(env, self); ConstTransformRcPtr cvtran = dtran->getChannelView(); - return BuildJObject(env, self, - env->FindClass(GetOCIOTClass(cvtran)), cvtran->createEditableCopy()); + return BuildJObject( + env, + self, + env->FindClass(GetOCIOTClass(cvtran)), + cvtran->createEditableCopy()); OCIO_JNITRY_EXIT(NULL) } @@ -427,7 +482,8 @@ JNIEXPORT void JNICALL Java_org_OpenColorIO_DisplayTransform_setDisplay(JNIEnv * env, jobject self, jstring display) { OCIO_JNITRY_ENTER() - DisplayTransformRcPtr dtran = GetEditableJOCIO(env, self); + DisplayTransformRcPtr dtran + = GetEditableJOCIO(env, self); dtran->setDisplay(GetJStringValue(env, display)()); OCIO_JNITRY_EXIT() } @@ -436,7 +492,8 @@ JNIEXPORT jstring JNICALL Java_org_OpenColorIO_DisplayTransform_getDisplay(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - ConstDisplayTransformRcPtr dtran = GetConstJOCIO(env, self); + ConstDisplayTransformRcPtr dtran + = GetConstJOCIO(env, self); return env->NewStringUTF(dtran->getDisplay()); OCIO_JNITRY_EXIT(NULL) } @@ -445,16 +502,17 @@ JNIEXPORT void JNICALL Java_org_OpenColorIO_DisplayTransform_setView(JNIEnv * env, jobject self, jstring view) { OCIO_JNITRY_ENTER() - DisplayTransformRcPtr dtran = GetEditableJOCIO(env, self); + DisplayTransformRcPtr dtran + = GetEditableJOCIO(env, self); dtran->setView(GetJStringValue(env, view)()); OCIO_JNITRY_EXIT() } -JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_DisplayTransform_getView(JNIEnv * env, jobject self) +JNIEXPORT jstring JNICALL Java_org_OpenColorIO_DisplayTransform_getView(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - ConstDisplayTransformRcPtr dtran = GetConstJOCIO(env, self); + ConstDisplayTransformRcPtr dtran + = GetConstJOCIO(env, self); return env->NewStringUTF(dtran->getView()); OCIO_JNITRY_EXIT(NULL) } @@ -463,7 +521,8 @@ JNIEXPORT void JNICALL Java_org_OpenColorIO_DisplayTransform_setDisplayCC(JNIEnv * env, jobject self, jobject cc) { OCIO_JNITRY_ENTER() - DisplayTransformRcPtr dtran = GetEditableJOCIO(env, self); + DisplayTransformRcPtr dtran + = GetEditableJOCIO(env, self); ConstTransformRcPtr ptr = GetConstJOCIO(env, cc); dtran->setDisplayCC(ptr); OCIO_JNITRY_EXIT() @@ -473,10 +532,14 @@ JNIEXPORT jobject JNICALL Java_org_OpenColorIO_DisplayTransform_getDisplayCC(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - ConstDisplayTransformRcPtr dtran = GetConstJOCIO(env, self); + ConstDisplayTransformRcPtr dtran + = GetConstJOCIO(env, self); ConstTransformRcPtr cctran = dtran->getDisplayCC(); - return BuildJObject(env, self, - env->FindClass(GetOCIOTClass(cctran)), cctran->createEditableCopy()); + return BuildJObject( + env, + self, + env->FindClass(GetOCIOTClass(cctran)), + cctran->createEditableCopy()); OCIO_JNITRY_EXIT(NULL) } @@ -484,7 +547,8 @@ JNIEXPORT void JNICALL Java_org_OpenColorIO_DisplayTransform_setLooksOverride(JNIEnv * env, jobject self, jstring looks) { OCIO_JNITRY_ENTER() - DisplayTransformRcPtr dtran = GetEditableJOCIO(env, self); + DisplayTransformRcPtr dtran + = GetEditableJOCIO(env, self); dtran->setLooksOverride(GetJStringValue(env, looks)()); OCIO_JNITRY_EXIT() } @@ -493,16 +557,20 @@ JNIEXPORT jstring JNICALL Java_org_OpenColorIO_DisplayTransform_getLooksOverride(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - ConstDisplayTransformRcPtr dtran = GetConstJOCIO(env, self); + ConstDisplayTransformRcPtr dtran + = GetConstJOCIO(env, self); return env->NewStringUTF(dtran->getLooksOverride()); OCIO_JNITRY_EXIT(NULL) } -JNIEXPORT void JNICALL -Java_org_OpenColorIO_DisplayTransform_setLooksOverrideEnabled(JNIEnv * env, jobject self, jboolean enabled) +JNIEXPORT void JNICALL Java_org_OpenColorIO_DisplayTransform_setLooksOverrideEnabled( + JNIEnv * env, + jobject self, + jboolean enabled) { OCIO_JNITRY_ENTER() - DisplayTransformRcPtr dtran = GetEditableJOCIO(env, self); + DisplayTransformRcPtr dtran + = GetEditableJOCIO(env, self); dtran->setLooksOverrideEnabled((bool)enabled); OCIO_JNITRY_EXIT() } @@ -511,19 +579,22 @@ JNIEXPORT jboolean JNICALL Java_org_OpenColorIO_DisplayTransform_getLooksOverrideEnabled(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - ConstDisplayTransformRcPtr dtran = GetConstJOCIO(env, self); + ConstDisplayTransformRcPtr dtran + = GetConstJOCIO(env, self); return (jboolean)dtran->getLooksOverrideEnabled(); OCIO_JNITRY_EXIT(false) } // ExponentTransform -JNIEXPORT jobject JNICALL -Java_org_OpenColorIO_ExponentTransform_Create(JNIEnv * env, jobject self) +JNIEXPORT jobject JNICALL Java_org_OpenColorIO_ExponentTransform_Create(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - return BuildJObject(env, self, - env->FindClass("org/OpenColorIO/ExponentTransform"), ExponentTransform::Create()); + return BuildJObject( + env, + self, + env->FindClass("org/OpenColorIO/ExponentTransform"), + ExponentTransform::Create()); OCIO_JNITRY_EXIT(NULL) } @@ -531,7 +602,8 @@ JNIEXPORT void JNICALL Java_org_OpenColorIO_ExponentTransform_setValue(JNIEnv * env, jobject self, jfloatArray vec4) { OCIO_JNITRY_ENTER() - ExponentTransformRcPtr exptran = GetEditableJOCIO(env, self); + ExponentTransformRcPtr exptran + = GetEditableJOCIO(env, self); exptran->setValue(GetJFloatArrayValue(env, vec4, "vec4", 4)()); OCIO_JNITRY_EXIT() } @@ -540,27 +612,30 @@ JNIEXPORT void JNICALL Java_org_OpenColorIO_ExponentTransform_getValue(JNIEnv * env, jobject self, jfloatArray vec4) { OCIO_JNITRY_ENTER() - ConstExponentTransformRcPtr exptran = GetConstJOCIO(env, self); + ConstExponentTransformRcPtr exptran + = GetConstJOCIO(env, self); exptran->getValue(SetJFloatArrayValue(env, vec4, "vec4", 4)()); OCIO_JNITRY_EXIT() } // FileTransform -JNIEXPORT jobject JNICALL -Java_org_OpenColorIO_FileTransform_Create(JNIEnv * env, jobject self) +JNIEXPORT jobject JNICALL Java_org_OpenColorIO_FileTransform_Create(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - return BuildJObject(env, self, - env->FindClass("org/OpenColorIO/FileTransform"), FileTransform::Create()); + return BuildJObject( + env, + self, + env->FindClass("org/OpenColorIO/FileTransform"), + FileTransform::Create()); OCIO_JNITRY_EXIT(NULL) } -JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_FileTransform_getSrc(JNIEnv * env, jobject self) +JNIEXPORT jstring JNICALL Java_org_OpenColorIO_FileTransform_getSrc(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - ConstFileTransformRcPtr filetran = GetConstJOCIO(env, self); + ConstFileTransformRcPtr filetran + = GetConstJOCIO(env, self); return env->NewStringUTF(filetran->getSrc()); OCIO_JNITRY_EXIT(NULL) } @@ -574,11 +649,11 @@ Java_org_OpenColorIO_FileTransform_setSrc(JNIEnv * env, jobject self, jstring sr OCIO_JNITRY_EXIT() } -JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_FileTransform_getCCCId(JNIEnv * env, jobject self) +JNIEXPORT jstring JNICALL Java_org_OpenColorIO_FileTransform_getCCCId(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - ConstFileTransformRcPtr filetran = GetConstJOCIO(env, self); + ConstFileTransformRcPtr filetran + = GetConstJOCIO(env, self); return env->NewStringUTF(filetran->getCCCId()); OCIO_JNITRY_EXIT(NULL) } @@ -596,7 +671,8 @@ JNIEXPORT jobject JNICALL Java_org_OpenColorIO_FileTransform_getInterpolation(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - ConstFileTransformRcPtr filetran = GetConstJOCIO(env, self); + ConstFileTransformRcPtr filetran + = GetConstJOCIO(env, self); return BuildJEnum(env, "org/OpenColorIO/Interpolation", filetran->getInterpolation()); OCIO_JNITRY_EXIT(NULL) } @@ -610,11 +686,11 @@ Java_org_OpenColorIO_FileTransform_setInterpolation(JNIEnv * env, jobject self, OCIO_JNITRY_EXIT() } -JNIEXPORT jint JNICALL -Java_org_OpenColorIO_FileTransform_getNumFormats(JNIEnv * env, jobject self) +JNIEXPORT jint JNICALL Java_org_OpenColorIO_FileTransform_getNumFormats(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - ConstFileTransformRcPtr filetran = GetConstJOCIO(env, self); + ConstFileTransformRcPtr filetran + = GetConstJOCIO(env, self); return (jint)filetran->getNumFormats(); OCIO_JNITRY_EXIT(0) } @@ -623,7 +699,8 @@ JNIEXPORT jstring JNICALL Java_org_OpenColorIO_FileTransform_getFormatNameByIndex(JNIEnv * env, jobject self, jint index) { OCIO_JNITRY_ENTER() - ConstFileTransformRcPtr filetran = GetConstJOCIO(env, self); + ConstFileTransformRcPtr filetran + = GetConstJOCIO(env, self); return env->NewStringUTF(filetran->getFormatNameByIndex((int)index)); OCIO_JNITRY_EXIT(NULL) } @@ -632,19 +709,22 @@ JNIEXPORT jstring JNICALL Java_org_OpenColorIO_FileTransform_getFormatExtensionByIndex(JNIEnv * env, jobject self, jint index) { OCIO_JNITRY_ENTER() - ConstFileTransformRcPtr filetran = GetConstJOCIO(env, self); + ConstFileTransformRcPtr filetran + = GetConstJOCIO(env, self); return env->NewStringUTF(filetran->getFormatExtensionByIndex((int)index)); OCIO_JNITRY_EXIT(NULL) } // GroupTransform -JNIEXPORT jobject JNICALL -Java_org_OpenColorIO_GroupTransform_Create(JNIEnv * env, jobject self) +JNIEXPORT jobject JNICALL Java_org_OpenColorIO_GroupTransform_Create(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - return BuildJObject(env, self, - env->FindClass("org/OpenColorIO/GroupTransform"), GroupTransform::Create()); + return BuildJObject( + env, + self, + env->FindClass("org/OpenColorIO/GroupTransform"), + GroupTransform::Create()); OCIO_JNITRY_EXIT(NULL) } @@ -652,18 +732,22 @@ JNIEXPORT jobject JNICALL Java_org_OpenColorIO_GroupTransform_getTransform(JNIEnv * env, jobject self, jint index) { OCIO_JNITRY_ENTER() - ConstGroupTransformRcPtr gtran = GetConstJOCIO(env, self); + ConstGroupTransformRcPtr gtran + = GetConstJOCIO(env, self); ConstTransformRcPtr ctran = gtran->getTransform((int)index); - return BuildJObject(env, self, - env->FindClass(GetOCIOTClass(ctran)), ctran->createEditableCopy()); + return BuildJObject( + env, + self, + env->FindClass(GetOCIOTClass(ctran)), + ctran->createEditableCopy()); OCIO_JNITRY_EXIT(NULL) } -JNIEXPORT jint JNICALL -Java_org_OpenColorIO_GroupTransform_size(JNIEnv * env, jobject self) +JNIEXPORT jint JNICALL Java_org_OpenColorIO_GroupTransform_size(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - ConstGroupTransformRcPtr gtran = GetConstJOCIO(env, self); + ConstGroupTransformRcPtr gtran + = GetConstJOCIO(env, self); return (jint)gtran->size(); OCIO_JNITRY_EXIT(0) } @@ -673,13 +757,12 @@ Java_org_OpenColorIO_GroupTransform_push_1back(JNIEnv * env, jobject self, jobje { OCIO_JNITRY_ENTER() GroupTransformRcPtr gtran = GetEditableJOCIO(env, self); - ConstTransformRcPtr ptr = GetConstJOCIO(env, transform); + ConstTransformRcPtr ptr = GetConstJOCIO(env, transform); gtran->push_back(ptr); OCIO_JNITRY_EXIT() } -JNIEXPORT void JNICALL -Java_org_OpenColorIO_GroupTransform_clear(JNIEnv * env, jobject self) +JNIEXPORT void JNICALL Java_org_OpenColorIO_GroupTransform_clear(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() GroupTransformRcPtr gtran = GetEditableJOCIO(env, self); @@ -687,23 +770,25 @@ Java_org_OpenColorIO_GroupTransform_clear(JNIEnv * env, jobject self) OCIO_JNITRY_EXIT() } -JNIEXPORT jboolean JNICALL -Java_org_OpenColorIO_GroupTransform_empty(JNIEnv * env, jobject self) +JNIEXPORT jboolean JNICALL Java_org_OpenColorIO_GroupTransform_empty(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - ConstGroupTransformRcPtr gtran = GetConstJOCIO(env, self); + ConstGroupTransformRcPtr gtran + = GetConstJOCIO(env, self); return (jboolean)gtran->empty(); OCIO_JNITRY_EXIT(false) } // LogTransform -JNIEXPORT jobject JNICALL -Java_org_OpenColorIO_LogTransform_Create(JNIEnv * env, jobject self) +JNIEXPORT jobject JNICALL Java_org_OpenColorIO_LogTransform_Create(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - return BuildJObject(env, self, - env->FindClass("org/OpenColorIO/LogTransform"), LogTransform::Create()); + return BuildJObject( + env, + self, + env->FindClass("org/OpenColorIO/LogTransform"), + LogTransform::Create()); OCIO_JNITRY_EXIT(NULL) } @@ -716,31 +801,33 @@ Java_org_OpenColorIO_LogTransform_setBase(JNIEnv * env, jobject self, jfloat val OCIO_JNITRY_EXIT() } -JNIEXPORT jfloat JNICALL -Java_org_OpenColorIO_LogTransform_getBase(JNIEnv * env, jobject self) +JNIEXPORT jfloat JNICALL Java_org_OpenColorIO_LogTransform_getBase(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - ConstLogTransformRcPtr ltran = GetConstJOCIO(env, self); + ConstLogTransformRcPtr ltran + = GetConstJOCIO(env, self); return (jfloat)ltran->getBase(); OCIO_JNITRY_EXIT(0.f) } // LookTransform -JNIEXPORT jobject JNICALL -Java_org_OpenColorIO_LookTransform_Create(JNIEnv * env, jobject self) +JNIEXPORT jobject JNICALL Java_org_OpenColorIO_LookTransform_Create(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - return BuildJObject(env, self, - env->FindClass("org/OpenColorIO/LookTransform"), LookTransform::Create()); + return BuildJObject( + env, + self, + env->FindClass("org/OpenColorIO/LookTransform"), + LookTransform::Create()); OCIO_JNITRY_EXIT(NULL) } -JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_LookTransform_getSrc(JNIEnv * env, jobject self) +JNIEXPORT jstring JNICALL Java_org_OpenColorIO_LookTransform_getSrc(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - ConstLookTransformRcPtr lktran = GetConstJOCIO(env, self); + ConstLookTransformRcPtr lktran + = GetConstJOCIO(env, self); return env->NewStringUTF(lktran->getSrc()); OCIO_JNITRY_EXIT(NULL) } @@ -754,11 +841,11 @@ Java_org_OpenColorIO_LookTransform_setSrc(JNIEnv * env, jobject self, jstring sr OCIO_JNITRY_EXIT() } -JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_LookTransform_getDst(JNIEnv * env, jobject self) +JNIEXPORT jstring JNICALL Java_org_OpenColorIO_LookTransform_getDst(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - ConstLookTransformRcPtr lktran = GetConstJOCIO(env, self); + ConstLookTransformRcPtr lktran + = GetConstJOCIO(env, self); return env->NewStringUTF(lktran->getDst()); OCIO_JNITRY_EXIT(NULL) } @@ -781,23 +868,25 @@ Java_org_OpenColorIO_LookTransform_setLooks(JNIEnv * env, jobject self, jstring OCIO_JNITRY_EXIT() } -JNIEXPORT jstring JNICALL -Java_org_OpenColorIO_LookTransform_getLooks(JNIEnv * env, jobject self) +JNIEXPORT jstring JNICALL Java_org_OpenColorIO_LookTransform_getLooks(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - ConstLookTransformRcPtr lktran = GetConstJOCIO(env, self); + ConstLookTransformRcPtr lktran + = GetConstJOCIO(env, self); return env->NewStringUTF(lktran->getLooks()); OCIO_JNITRY_EXIT(NULL) } // MatrixTransform -JNIEXPORT jobject JNICALL -Java_org_OpenColorIO_MatrixTransform_Create(JNIEnv * env, jobject self) +JNIEXPORT jobject JNICALL Java_org_OpenColorIO_MatrixTransform_Create(JNIEnv * env, jobject self) { OCIO_JNITRY_ENTER() - return BuildJObject(env, self, - env->FindClass("org/OpenColorIO/MatrixTransform"), MatrixTransform::Create()); + return BuildJObject( + env, + self, + env->FindClass("org/OpenColorIO/MatrixTransform"), + MatrixTransform::Create()); OCIO_JNITRY_EXIT(NULL) } @@ -805,29 +894,41 @@ JNIEXPORT jboolean JNICALL Java_org_OpenColorIO_MatrixTransform_equals(JNIEnv * env, jobject self, jobject obj) { OCIO_JNITRY_ENTER() - ConstMatrixTransformRcPtr left = GetConstJOCIO(env, self); - ConstMatrixTransformRcPtr right = GetConstJOCIO(env, obj); + ConstMatrixTransformRcPtr left + = GetConstJOCIO(env, self); + ConstMatrixTransformRcPtr right + = GetConstJOCIO(env, obj); return (jboolean)left->equals(*right.get()); OCIO_JNITRY_EXIT(false) } -JNIEXPORT void JNICALL -Java_org_OpenColorIO_MatrixTransform_setValue(JNIEnv * env, jobject self, jfloatArray m44, jfloatArray offset4) +JNIEXPORT void JNICALL Java_org_OpenColorIO_MatrixTransform_setValue( + JNIEnv * env, + jobject self, + jfloatArray m44, + jfloatArray offset4) { OCIO_JNITRY_ENTER() - MatrixTransformRcPtr mtran = GetEditableJOCIO(env, self); - mtran->setValue(GetJFloatArrayValue(env, m44, "m44", 16)(), - GetJFloatArrayValue(env, offset4, "offset4", 4)()); + MatrixTransformRcPtr mtran + = GetEditableJOCIO(env, self); + mtran->setValue( + GetJFloatArrayValue(env, m44, "m44", 16)(), + GetJFloatArrayValue(env, offset4, "offset4", 4)()); OCIO_JNITRY_EXIT() } -JNIEXPORT void JNICALL -Java_org_OpenColorIO_MatrixTransform_getValue(JNIEnv * env, jobject self, jfloatArray m44, jfloatArray offset4) +JNIEXPORT void JNICALL Java_org_OpenColorIO_MatrixTransform_getValue( + JNIEnv * env, + jobject self, + jfloatArray m44, + jfloatArray offset4) { OCIO_JNITRY_ENTER() - ConstMatrixTransformRcPtr mtran = GetConstJOCIO(env, self); - mtran->getValue(SetJFloatArrayValue(env, m44, "m44", 16)(), - SetJFloatArrayValue(env, offset4, "offset4", 4)()); + ConstMatrixTransformRcPtr mtran + = GetConstJOCIO(env, self); + mtran->getValue( + SetJFloatArrayValue(env, m44, "m44", 16)(), + SetJFloatArrayValue(env, offset4, "offset4", 4)()); OCIO_JNITRY_EXIT() } @@ -835,7 +936,8 @@ JNIEXPORT void JNICALL Java_org_OpenColorIO_MatrixTransform_setMatrix(JNIEnv * env, jobject self, jfloatArray m44) { OCIO_JNITRY_ENTER() - MatrixTransformRcPtr mtran = GetEditableJOCIO(env, self); + MatrixTransformRcPtr mtran + = GetEditableJOCIO(env, self); mtran->setMatrix(GetJFloatArrayValue(env, m44, "m44", 16)()); OCIO_JNITRY_EXIT() } @@ -844,7 +946,8 @@ JNIEXPORT void JNICALL Java_org_OpenColorIO_MatrixTransform_getMatrix(JNIEnv * env, jobject self, jfloatArray m44) { OCIO_JNITRY_ENTER() - ConstMatrixTransformRcPtr mtran = GetConstJOCIO(env, self); + ConstMatrixTransformRcPtr mtran + = GetConstJOCIO(env, self); mtran->getMatrix(SetJFloatArrayValue(env, m44, "m44", 16)()); OCIO_JNITRY_EXIT() } @@ -853,7 +956,8 @@ JNIEXPORT void JNICALL Java_org_OpenColorIO_MatrixTransform_setOffset(JNIEnv * env, jobject self, jfloatArray offset4) { OCIO_JNITRY_ENTER() - MatrixTransformRcPtr mtran = GetEditableJOCIO(env, self); + MatrixTransformRcPtr mtran + = GetEditableJOCIO(env, self); mtran->setOffset(GetJFloatArrayValue(env, offset4, "offset4", 4)()); OCIO_JNITRY_EXIT() } @@ -862,74 +966,101 @@ JNIEXPORT void JNICALL Java_org_OpenColorIO_MatrixTransform_getOffset(JNIEnv * env, jobject self, jfloatArray offset4) { OCIO_JNITRY_ENTER() - ConstMatrixTransformRcPtr mtran = GetConstJOCIO(env, self); + ConstMatrixTransformRcPtr mtran + = GetConstJOCIO(env, self); mtran->getOffset(SetJFloatArrayValue(env, offset4, "offset4", 4)()); OCIO_JNITRY_EXIT() } -JNIEXPORT void JNICALL -Java_org_OpenColorIO_MatrixTransform_Fit(JNIEnv * env, jobject self, - jfloatArray m44, jfloatArray offset4, jfloatArray oldmin4, - jfloatArray oldmax4, jfloatArray newmin4, jfloatArray newmax4) -{ - OCIO_JNITRY_ENTER() - ConstMatrixTransformRcPtr mtran = GetConstJOCIO(env, self); - mtran->Fit(GetJFloatArrayValue(env, m44, "m44", 16)(), - GetJFloatArrayValue(env, offset4, "offset4", 4)(), - GetJFloatArrayValue(env, oldmin4, "oldmin4", 4)(), - GetJFloatArrayValue(env, oldmax4, "oldmax4", 4)(), - GetJFloatArrayValue(env, newmin4, "newmin4", 4)(), - GetJFloatArrayValue(env, newmax4, "newmax4", 4)()); +JNIEXPORT void JNICALL Java_org_OpenColorIO_MatrixTransform_Fit( + JNIEnv * env, + jobject self, + jfloatArray m44, + jfloatArray offset4, + jfloatArray oldmin4, + jfloatArray oldmax4, + jfloatArray newmin4, + jfloatArray newmax4) +{ + OCIO_JNITRY_ENTER() + ConstMatrixTransformRcPtr mtran + = GetConstJOCIO(env, self); + mtran->Fit( + GetJFloatArrayValue(env, m44, "m44", 16)(), + GetJFloatArrayValue(env, offset4, "offset4", 4)(), + GetJFloatArrayValue(env, oldmin4, "oldmin4", 4)(), + GetJFloatArrayValue(env, oldmax4, "oldmax4", 4)(), + GetJFloatArrayValue(env, newmin4, "newmin4", 4)(), + GetJFloatArrayValue(env, newmax4, "newmax4", 4)()); OCIO_JNITRY_EXIT() } -JNIEXPORT void JNICALL -Java_org_OpenColorIO_MatrixTransform_Identity(JNIEnv * env, jobject self, - jfloatArray m44, jfloatArray offset4) +JNIEXPORT void JNICALL Java_org_OpenColorIO_MatrixTransform_Identity( + JNIEnv * env, + jobject self, + jfloatArray m44, + jfloatArray offset4) { OCIO_JNITRY_ENTER() - ConstMatrixTransformRcPtr mtran = GetConstJOCIO(env, self); - mtran->Identity(GetJFloatArrayValue(env, m44, "m44", 16)(), - GetJFloatArrayValue(env, offset4, "offset4", 4)()); + ConstMatrixTransformRcPtr mtran + = GetConstJOCIO(env, self); + mtran->Identity( + GetJFloatArrayValue(env, m44, "m44", 16)(), + GetJFloatArrayValue(env, offset4, "offset4", 4)()); OCIO_JNITRY_EXIT() } -JNIEXPORT void JNICALL -Java_org_OpenColorIO_MatrixTransform_Sat(JNIEnv * env, jobject self, - jfloatArray m44, jfloatArray offset4, jfloat sat, +JNIEXPORT void JNICALL Java_org_OpenColorIO_MatrixTransform_Sat( + JNIEnv * env, + jobject self, + jfloatArray m44, + jfloatArray offset4, + jfloat sat, jfloatArray lumaCoef3) { OCIO_JNITRY_ENTER() - ConstMatrixTransformRcPtr mtran = GetConstJOCIO(env, self); - mtran->Sat(GetJFloatArrayValue(env, m44, "m44", 16)(), - GetJFloatArrayValue(env, offset4, "offset4", 4)(), - (float)sat, - GetJFloatArrayValue(env, lumaCoef3, "lumaCoef3", 3)()); + ConstMatrixTransformRcPtr mtran + = GetConstJOCIO(env, self); + mtran->Sat( + GetJFloatArrayValue(env, m44, "m44", 16)(), + GetJFloatArrayValue(env, offset4, "offset4", 4)(), + (float)sat, + GetJFloatArrayValue(env, lumaCoef3, "lumaCoef3", 3)()); OCIO_JNITRY_EXIT() } -JNIEXPORT void JNICALL -Java_org_OpenColorIO_MatrixTransform_Scale(JNIEnv * env, jobject self, - jfloatArray m44, jfloatArray offset4, jfloatArray scale4) +JNIEXPORT void JNICALL Java_org_OpenColorIO_MatrixTransform_Scale( + JNIEnv * env, + jobject self, + jfloatArray m44, + jfloatArray offset4, + jfloatArray scale4) { OCIO_JNITRY_ENTER() - ConstMatrixTransformRcPtr mtran = GetConstJOCIO(env, self); - mtran->Scale(GetJFloatArrayValue(env, m44, "m44", 16)(), - GetJFloatArrayValue(env, offset4, "offset4", 4)(), - GetJFloatArrayValue(env, scale4, "scale4", 4)()); + ConstMatrixTransformRcPtr mtran + = GetConstJOCIO(env, self); + mtran->Scale( + GetJFloatArrayValue(env, m44, "m44", 16)(), + GetJFloatArrayValue(env, offset4, "offset4", 4)(), + GetJFloatArrayValue(env, scale4, "scale4", 4)()); OCIO_JNITRY_EXIT() } -JNIEXPORT void JNICALL -Java_org_OpenColorIO_MatrixTransform_View(JNIEnv * env, jobject self, - jfloatArray m44, jfloatArray offset4, jintArray channelHot4, +JNIEXPORT void JNICALL Java_org_OpenColorIO_MatrixTransform_View( + JNIEnv * env, + jobject self, + jfloatArray m44, + jfloatArray offset4, + jintArray channelHot4, jfloatArray lumaCoef3) { OCIO_JNITRY_ENTER() - ConstMatrixTransformRcPtr mtran = GetConstJOCIO(env, self); - mtran->View(GetJFloatArrayValue(env, m44, "m44", 16)(), - GetJFloatArrayValue(env, offset4, "offset4", 4)(), - GetJIntArrayValue(env, channelHot4, "channelHot4", 4)(), - GetJFloatArrayValue(env, lumaCoef3, "lumaCoef3", 3)()); + ConstMatrixTransformRcPtr mtran + = GetConstJOCIO(env, self); + mtran->View( + GetJFloatArrayValue(env, m44, "m44", 16)(), + GetJFloatArrayValue(env, offset4, "offset4", 4)(), + GetJIntArrayValue(env, channelHot4, "channelHot4", 4)(), + GetJFloatArrayValue(env, lumaCoef3, "lumaCoef3", 3)()); OCIO_JNITRY_EXIT() } diff --git a/src/bindings/java/JNIUtil.cpp b/src/bindings/java/JNIUtil.cpp index eae5fbe2a2..a82ab52d21 100644 --- a/src/bindings/java/JNIUtil.cpp +++ b/src/bindings/java/JNIUtil.cpp @@ -8,55 +8,65 @@ namespace OCIO_NAMESPACE { -jobject NewJFloatBuffer(JNIEnv * env, float* ptr, int32_t len) { +jobject NewJFloatBuffer(JNIEnv * env, float * ptr, int32_t len) +{ jobject byte_buf = env->NewDirectByteBuffer(ptr, len * sizeof(float)); - jmethodID mid = env->GetMethodID(env->GetObjectClass(byte_buf), - "asFloatBuffer", "()Ljava/nio/FloatBuffer;"); - if (mid == 0) throw Exception("Could not find asFloatBuffer() method"); + jmethodID mid = env->GetMethodID( + env->GetObjectClass(byte_buf), + "asFloatBuffer", + "()Ljava/nio/FloatBuffer;"); + if (mid == 0) + throw Exception("Could not find asFloatBuffer() method"); return env->CallObjectMethod(byte_buf, mid); } -float* GetJFloatBuffer(JNIEnv * env, jobject buffer, int32_t len) { +float * GetJFloatBuffer(JNIEnv * env, jobject buffer, int32_t len) +{ jmethodID mid = env->GetMethodID(env->GetObjectClass(buffer), "isDirect", "()Z"); - if (mid == 0) throw Exception("Could not find isDirect() method"); - if(!env->CallBooleanMethod(buffer, mid)) { + if (mid == 0) + throw Exception("Could not find isDirect() method"); + if (!env->CallBooleanMethod(buffer, mid)) + { std::ostringstream err; err << "the FloatBuffer object is not 'direct' it needs to be created "; err << "from a ByteBuffer.allocateDirect(..).asFloatBuffer() call."; throw Exception(err.str().c_str()); } - if(env->GetDirectBufferCapacity(buffer) != len) { + if (env->GetDirectBufferCapacity(buffer) != len) + { std::ostringstream err; err << "the FloatBuffer object is not allocated correctly it needs to "; err << "of size " << len << " but is "; err << env->GetDirectBufferCapacity(buffer) << "."; throw Exception(err.str().c_str()); } - return (float*)env->GetDirectBufferAddress(buffer); + return (float *)env->GetDirectBufferAddress(buffer); } -const char* GetOCIOTClass(ConstTransformRcPtr tran) { - if(ConstAllocationTransformRcPtr at = DynamicPtrCast(tran)) +const char * GetOCIOTClass(ConstTransformRcPtr tran) +{ + if (ConstAllocationTransformRcPtr at = DynamicPtrCast(tran)) return "org/OpenColorIO/AllocationTransform"; - else if(ConstCDLTransformRcPtr ct = DynamicPtrCast(tran)) + else if (ConstCDLTransformRcPtr ct = DynamicPtrCast(tran)) return "org/OpenColorIO/CDLTransform"; - else if(ConstColorSpaceTransformRcPtr cst = DynamicPtrCast(tran)) + else if (ConstColorSpaceTransformRcPtr cst = DynamicPtrCast(tran)) return "org/OpenColorIO/ColorSpaceTransform"; - else if(ConstDisplayTransformRcPtr dt = DynamicPtrCast(tran)) + else if (ConstDisplayTransformRcPtr dt = DynamicPtrCast(tran)) return "org/OpenColorIO/DisplayTransform"; - else if(ConstExponentTransformRcPtr et = DynamicPtrCast(tran)) + else if (ConstExponentTransformRcPtr et = DynamicPtrCast(tran)) return "org/OpenColorIO/ExponentTransform"; - else if(ConstFileTransformRcPtr ft = DynamicPtrCast(tran)) + else if (ConstFileTransformRcPtr ft = DynamicPtrCast(tran)) return "org/OpenColorIO/FileTransform"; - else if(ConstGroupTransformRcPtr gt = DynamicPtrCast(tran)) + else if (ConstGroupTransformRcPtr gt = DynamicPtrCast(tran)) return "org/OpenColorIO/GroupTransform"; - else if(ConstLogTransformRcPtr lt = DynamicPtrCast(tran)) + else if (ConstLogTransformRcPtr lt = DynamicPtrCast(tran)) return "org/OpenColorIO/LogTransform"; - else if(ConstLookTransformRcPtr lkt = DynamicPtrCast(tran)) + else if (ConstLookTransformRcPtr lkt = DynamicPtrCast(tran)) return "org/OpenColorIO/LookTransform"; - else if(ConstMatrixTransformRcPtr mt = DynamicPtrCast(tran)) + else if (ConstMatrixTransformRcPtr mt = DynamicPtrCast(tran)) return "org/OpenColorIO/MatrixTransform"; - else return "org/OpenColorIO/Transform"; + else + return "org/OpenColorIO/Transform"; } void JNI_Handle_Exception(JNIEnv * env) @@ -77,7 +87,7 @@ void JNI_Handle_Exception(JNIEnv * env) env->ThrowNew(je, e.what()); env->DeleteLocalRef(je); } - catch (std::exception& e) + catch (std::exception & e) { jclass je = env->FindClass("java/lang/Exception"); env->ThrowNew(je, e.what()); diff --git a/src/bindings/java/JNIUtil.h b/src/bindings/java/JNIUtil.h index d6b75ed1a4..739cfdb2c8 100644 --- a/src/bindings/java/JNIUtil.h +++ b/src/bindings/java/JNIUtil.h @@ -4,15 +4,14 @@ #ifndef INCLUDED_OCIO_JNIUTIL_H #define INCLUDED_OCIO_JNIUTIL_H +#include "OpenColorIOJNI.h" #include #include -#include "OpenColorIOJNI.h" namespace OCIO_NAMESPACE { -template -struct JObject +template struct JObject { jobject back_ptr; C * constcppobj; @@ -29,58 +28,58 @@ typedef OCIO_SHARED_PTR PackedImageDescRcPtr; typedef OCIO_SHARED_PTR ConstPlanarImageDescRcPtr; typedef OCIO_SHARED_PTR PlanarImageDescRcPtr; -typedef JObject ConfigJNI; -typedef JObject ContextJNI; -typedef JObject ProcessorJNI; -typedef JObject ColorSpaceJNI; -typedef JObject LookJNI; -typedef JObject BakerJNI; -typedef JObject GpuShaderDescJNI; -typedef JObject ImageDescJNI; -typedef JObject TransformJNI; -typedef JObject AllocationTransformJNI; -typedef JObject CDLTransformJNI; -typedef JObject ColorSpaceTransformJNI; -typedef JObject DisplayTransformJNI; -typedef JObject ExponentTransformJNI; -typedef JObject FileTransformJNI; -typedef JObject GroupTransformJNI; -typedef JObject LogTransformJNI; -typedef JObject LookTransformJNI; -typedef JObject MatrixTransformJNI; - -template +typedef JObject ConfigJNI; +typedef JObject ContextJNI; +typedef JObject ProcessorJNI; +typedef JObject ColorSpaceJNI; +typedef JObject LookJNI; +typedef JObject BakerJNI; +typedef JObject GpuShaderDescJNI; +typedef JObject ImageDescJNI; +typedef JObject TransformJNI; +typedef JObject AllocationTransformJNI; +typedef JObject CDLTransformJNI; +typedef JObject ColorSpaceTransformJNI; +typedef JObject DisplayTransformJNI; +typedef JObject ExponentTransformJNI; +typedef JObject FileTransformJNI; +typedef JObject GroupTransformJNI; +typedef JObject LogTransformJNI; +typedef JObject LookTransformJNI; +typedef JObject MatrixTransformJNI; + +template inline jobject BuildJConstObject(JNIEnv * env, jobject self, jclass cls, T ptr) { - S * jnistruct = new S (); - jnistruct->back_ptr = env->NewGlobalRef(self); - jnistruct->constcppobj = new T (); + S * jnistruct = new S(); + jnistruct->back_ptr = env->NewGlobalRef(self); + jnistruct->constcppobj = new T(); *jnistruct->constcppobj = ptr; - jnistruct->isconst = true; - jmethodID mid = env->GetMethodID(cls, "", "(J)V"); + jnistruct->isconst = true; + jmethodID mid = env->GetMethodID(cls, "", "(J)V"); return env->NewObject(cls, mid, (jlong)jnistruct); } -template +template inline jobject BuildJObject(JNIEnv * env, jobject self, jclass cls, T ptr) { - S * jnistruct = new S (); + S * jnistruct = new S(); jnistruct->back_ptr = env->NewGlobalRef(self); - jnistruct->cppobj = new T (); - *jnistruct->cppobj = ptr; - jnistruct->isconst = false; - jmethodID mid = env->GetMethodID(cls, "", "(J)V"); + jnistruct->cppobj = new T(); + *jnistruct->cppobj = ptr; + jnistruct->isconst = false; + jmethodID mid = env->GetMethodID(cls, "", "(J)V"); return env->NewObject(cls, mid, (jlong)jnistruct); } -template -inline void DisposeJOCIO(JNIEnv * env, jobject self) +template inline void DisposeJOCIO(JNIEnv * env, jobject self) { jclass wclass = env->GetObjectClass(self); - jfieldID fid = env->GetFieldID(wclass, "m_impl", "J"); - jlong m_impl = env->GetLongField(self, fid); - if(m_impl == 0) return; // nothing to do - S * jni = reinterpret_cast (m_impl); + jfieldID fid = env->GetFieldID(wclass, "m_impl", "J"); + jlong m_impl = env->GetLongField(self, fid); + if (m_impl == 0) + return; // nothing to do + S * jni = reinterpret_cast(m_impl); delete jni->constcppobj; delete jni->cppobj; env->DeleteGlobalRef(jni->back_ptr); @@ -89,61 +88,65 @@ inline void DisposeJOCIO(JNIEnv * env, jobject self) return; } -template -inline T GetConstJOCIO(JNIEnv * env, jobject self) +template inline T GetConstJOCIO(JNIEnv * env, jobject self) { jclass wclass = env->GetObjectClass(self); - jfieldID fid = env->GetFieldID(wclass, "m_impl", "J"); - jlong m_impl = env->GetLongField(self, fid); - if(m_impl == 0) { + jfieldID fid = env->GetFieldID(wclass, "m_impl", "J"); + jlong m_impl = env->GetLongField(self, fid); + if (m_impl == 0) + { throw Exception("Java object doesn't point to a OCIO object"); } - S * jni = reinterpret_cast (m_impl); - if(jni->isconst && jni->constcppobj) { + S * jni = reinterpret_cast(m_impl); + if (jni->isconst && jni->constcppobj) + { return *jni->constcppobj; } - if(!jni->isconst && jni->cppobj) { + if (!jni->isconst && jni->cppobj) + { return *jni->cppobj; } throw Exception("Could not get a const OCIO object"); } -template -inline T GetEditableJOCIO(JNIEnv * env, jobject self) +template inline T GetEditableJOCIO(JNIEnv * env, jobject self) { jclass wclass = env->GetObjectClass(self); - jfieldID fid = env->GetFieldID(wclass, "m_impl", "J"); - jlong m_impl = env->GetLongField(self, fid); - if(m_impl == 0) { + jfieldID fid = env->GetFieldID(wclass, "m_impl", "J"); + jlong m_impl = env->GetLongField(self, fid); + if (m_impl == 0) + { throw Exception("Java object doesn't point to a OCIO object"); } - S * jni = reinterpret_cast (m_impl); - if(!jni->isconst && jni->cppobj) { + S * jni = reinterpret_cast(m_impl); + if (!jni->isconst && jni->cppobj) + { return *jni->cppobj; } throw Exception("Could not get an editable OCIO object"); } -template -inline T GetJEnum(JNIEnv * env, jobject j_enum) +template inline T GetJEnum(JNIEnv * env, jobject j_enum) { - jclass cls = env->GetObjectClass(j_enum); + jclass cls = env->GetObjectClass(j_enum); jfieldID fid = env->GetFieldID(cls, "m_enum", "I"); return (T)env->GetIntField(j_enum, fid); } -template -inline jobject BuildJEnum(JNIEnv * env, const char* ociotype, T val) +template inline jobject BuildJEnum(JNIEnv * env, const char * ociotype, T val) { - jclass cls = env->FindClass(ociotype); + jclass cls = env->FindClass(ociotype); jmethodID mid = env->GetMethodID(cls, "", "(I)V"); return env->NewObject(cls, mid, (int)val); } -template -inline void CheckArrayLength(JNIEnv * env, const char* name, T ptr, int32_t length) { - if(ptr == NULL) return; - if(env->GetArrayLength(ptr) < length) { +template +inline void CheckArrayLength(JNIEnv * env, const char * name, T ptr, int32_t length) +{ + if (ptr == NULL) + return; + if (env->GetArrayLength(ptr) < length) + { std::ostringstream err; err << name << " needs to have " << length; err << " elements but found only " << env->GetArrayLength(ptr); @@ -154,45 +157,51 @@ inline void CheckArrayLength(JNIEnv * env, const char* name, T ptr, int32_t leng class GetJFloatArrayValue { public: - GetJFloatArrayValue(JNIEnv* env, jfloatArray val, const char* name, int32_t len) { + GetJFloatArrayValue(JNIEnv * env, jfloatArray val, const char * name, int32_t len) + { CheckArrayLength(env, name, val, len); m_env = env; m_val = val; - if(val != NULL) m_ptr = env->GetFloatArrayElements(val, JNI_FALSE); + if (val != NULL) + m_ptr = env->GetFloatArrayElements(val, JNI_FALSE); } - ~GetJFloatArrayValue() { - if(m_val != NULL) m_env->ReleaseFloatArrayElements(m_val, m_ptr, JNI_FALSE); + ~GetJFloatArrayValue() + { + if (m_val != NULL) + m_env->ReleaseFloatArrayElements(m_val, m_ptr, JNI_FALSE); m_val = NULL; m_ptr = NULL; } - jfloat* operator() () { - return m_ptr; - } + jfloat * operator()() { return m_ptr; } + private: - JNIEnv* m_env; - jfloat* m_ptr; + JNIEnv * m_env; + jfloat * m_ptr; jfloatArray m_val; }; class SetJFloatArrayValue { public: - SetJFloatArrayValue(JNIEnv* env, jfloatArray val, const char* name, int32_t len) { + SetJFloatArrayValue(JNIEnv * env, jfloatArray val, const char * name, int32_t len) + { CheckArrayLength(env, name, val, len); m_env = env; m_val = val; - if(val != NULL) m_tmp.resize(len); + if (val != NULL) + m_tmp.resize(len); } - ~SetJFloatArrayValue() { - if(m_val != NULL) m_env->SetFloatArrayRegion(m_val, 0, m_tmp.size(), &m_tmp[0]); + ~SetJFloatArrayValue() + { + if (m_val != NULL) + m_env->SetFloatArrayRegion(m_val, 0, m_tmp.size(), &m_tmp[0]); m_val = NULL; m_tmp.clear(); } - float* operator() () { - return &m_tmp[0]; - } + float * operator()() { return &m_tmp[0]; } + private: - JNIEnv* m_env; + JNIEnv * m_env; std::vector m_tmp; jfloatArray m_val; }; @@ -200,55 +209,69 @@ class SetJFloatArrayValue class GetJIntArrayValue { public: - GetJIntArrayValue(JNIEnv* env, jintArray val, const char* name, int32_t len) { + GetJIntArrayValue(JNIEnv * env, jintArray val, const char * name, int32_t len) + { CheckArrayLength(env, name, val, len); m_env = env; m_val = val; - if(val != NULL) m_ptr = env->GetIntArrayElements(val, JNI_FALSE); + if (val != NULL) + m_ptr = env->GetIntArrayElements(val, JNI_FALSE); } - ~GetJIntArrayValue() { - if(m_val != NULL) m_env->ReleaseIntArrayElements(m_val, m_ptr, JNI_FALSE); + ~GetJIntArrayValue() + { + if (m_val != NULL) + m_env->ReleaseIntArrayElements(m_val, m_ptr, JNI_FALSE); m_val = NULL; m_ptr = NULL; } - jint* operator() () { - return m_ptr; - } + jint * operator()() { return m_ptr; } + private: - JNIEnv* m_env; - jint* m_ptr; + JNIEnv * m_env; + jint * m_ptr; jintArray m_val; }; class GetJStringValue { public: - GetJStringValue(JNIEnv* env, jstring val) { + GetJStringValue(JNIEnv * env, jstring val) + { m_env = env; m_val = val; - if(val != NULL) m_tmp = env->GetStringUTFChars(m_val, 0); + if (val != NULL) + m_tmp = env->GetStringUTFChars(m_val, 0); } - ~GetJStringValue() { - if(m_val != NULL) m_env->ReleaseStringUTFChars(m_val, m_tmp); + ~GetJStringValue() + { + if (m_val != NULL) + m_env->ReleaseStringUTFChars(m_val, m_tmp); m_val = NULL; m_tmp = NULL; } - const char* operator() () { - return m_tmp; - } + const char * operator()() { return m_tmp; } + private: - JNIEnv* m_env; - const char* m_tmp; + JNIEnv * m_env; + const char * m_tmp; jstring m_val; }; -jobject NewJFloatBuffer(JNIEnv * env, float* ptr, int32_t len); -float* GetJFloatBuffer(JNIEnv * env, jobject buffer, int32_t len); -const char* GetOCIOTClass(ConstTransformRcPtr tran); +jobject NewJFloatBuffer(JNIEnv * env, float * ptr, int32_t len); +float * GetJFloatBuffer(JNIEnv * env, jobject buffer, int32_t len); +const char * GetOCIOTClass(ConstTransformRcPtr tran); void JNI_Handle_Exception(JNIEnv * env); -#define OCIO_JNITRY_ENTER() try { -#define OCIO_JNITRY_EXIT(ret) } catch(...) { JNI_Handle_Exception(env); return ret; } +#define OCIO_JNITRY_ENTER() \ + try \ + { +#define OCIO_JNITRY_EXIT(ret) \ + } \ + catch (...) \ + { \ + JNI_Handle_Exception(env); \ + return ret; \ + } } // namespace OCIO_NAMESPACE diff --git a/src/bindings/python/PyBaker.cpp b/src/bindings/python/PyBaker.cpp index f3c2439415..ac569ecf66 100644 --- a/src/bindings/python/PyBaker.cpp +++ b/src/bindings/python/PyBaker.cpp @@ -26,31 +26,27 @@ void bindPyBaker(py::module & m) { BakerRcPtr DEFAULT = Baker::Create(); - auto clsBaker = - py::class_( - m.attr("Baker")); - - auto clsFormatIterator = - py::class_( - clsBaker, "FormatIterator", - R"doc( + auto clsBaker = py::class_(m.attr("Baker")); + + auto clsFormatIterator = py::class_( + clsBaker, + "FormatIterator", + R"doc( Iterator on LUT baker Formats. Each item is a tuple containing format name and format extension. )doc"); - clsBaker - .def(py::init(&Baker::Create), - DOC(Baker, Create)) - .def(py::init([](const ConfigRcPtr & config, - const std::string & format, - const std::string & inputSpace, - const std::string & targetSpace, - const std::string & looks, - int cubeSize, - const std::string & shaperSpace, - int shaperSize) - { + clsBaker.def(py::init(&Baker::Create), DOC(Baker, Create)) + .def( + py::init([](const ConfigRcPtr & config, + const std::string & format, + const std::string & inputSpace, + const std::string & targetSpace, + const std::string & looks, + int cubeSize, + const std::string & shaperSpace, + int shaperSize) { BakerRcPtr p = Baker::Create(); p->setConfig(config); p->setFormat(format.c_str()); @@ -58,82 +54,73 @@ Each item is a tuple containing format name and format extension. p->setTargetSpace(targetSpace.c_str()); p->setCubeSize(cubeSize); p->setShaperSize(shaperSize); - if (!looks.empty()) { p->setLooks(looks.c_str()); } - if (!shaperSpace.empty()) { p->setShaperSpace(shaperSpace.c_str()); } + if (!looks.empty()) + { + p->setLooks(looks.c_str()); + } + if (!shaperSpace.empty()) + { + p->setShaperSpace(shaperSpace.c_str()); + } return p; - }), - "config"_a, - "format"_a, - "inputSpace"_a, - "targetSpace"_a, - "looks"_a = DEFAULT->getLooks(), - "cubeSize"_a = DEFAULT->getCubeSize(), - "shaperSpace"_a = DEFAULT->getShaperSpace(), - "shaperSize"_a = DEFAULT->getShaperSize(), - DOC(Baker, Create)) - - .def("__deepcopy__", [](const ConstBakerRcPtr & self, py::dict) - { - return self->createEditableCopy(); - }, + }), + "config"_a, + "format"_a, + "inputSpace"_a, + "targetSpace"_a, + "looks"_a = DEFAULT->getLooks(), + "cubeSize"_a = DEFAULT->getCubeSize(), + "shaperSpace"_a = DEFAULT->getShaperSpace(), + "shaperSize"_a = DEFAULT->getShaperSize(), + DOC(Baker, Create)) + + .def( + "__deepcopy__", + [](const ConstBakerRcPtr & self, py::dict) { return self->createEditableCopy(); }, "memo"_a) - .def_static("getFormats", []() - { - return FormatIterator(nullptr); - }) - - .def("getConfig", &Baker::getConfig, - DOC(Baker, getConfig)) - .def("setConfig", &Baker::setConfig, "config"_a, - DOC(Baker, setConfig)) - .def("getFormat", &Baker::getFormat, - DOC(Baker, getFormat)) - .def("setFormat", &Baker::setFormat, "formatName"_a, - DOC(Baker, setFormat)) - .def("getFormatMetadata", - (FormatMetadata & (Baker::*)()) &Baker::getFormatMetadata, - py::return_value_policy::reference_internal, - DOC(Baker, getFormatMetadata)) - .def("getInputSpace", &Baker::getInputSpace, - DOC(Baker, getInputSpace)) - .def("setInputSpace", &Baker::setInputSpace, "inputSpace"_a, - DOC(Baker, setInputSpace)) - .def("getShaperSpace", &Baker::getShaperSpace, - DOC(Baker, getShaperSpace)) - .def("setShaperSpace", &Baker::setShaperSpace, "shaperSpace"_a, - DOC(Baker, setShaperSpace)) - .def("getLooks", &Baker::getLooks, - DOC(Baker, getLooks)) - .def("setLooks", &Baker::setLooks, "looks"_a, - DOC(Baker, setLooks)) - .def("getDisplay", &Baker::getDisplay, - DOC(Baker, getDisplay)) - .def("getView", &Baker::getView, - DOC(Baker, getView)) - .def("setDisplayView", &Baker::setDisplayView, "display"_a, "view"_a, - DOC(Baker, setDisplayView)) - .def("getTargetSpace", &Baker::getTargetSpace, - DOC(Baker, getTargetSpace)) - .def("setTargetSpace", &Baker::setTargetSpace, "targetSpace"_a, - DOC(Baker, setTargetSpace)) - .def("getShaperSize", &Baker::getShaperSize, - DOC(Baker, getShaperSize)) - .def("setShaperSize", &Baker::setShaperSize, "shaperSize"_a, - DOC(Baker, setShaperSize)) - .def("getCubeSize", &Baker::getCubeSize, - DOC(Baker, getCubeSize)) - .def("setCubeSize", &Baker::setCubeSize, "cubeSize"_a, - DOC(Baker, setCubeSize)) - .def("bake", [](BakerRcPtr & self, const std::string & fileName) - { + .def_static("getFormats", []() { return FormatIterator(nullptr); }) + + .def("getConfig", &Baker::getConfig, DOC(Baker, getConfig)) + .def("setConfig", &Baker::setConfig, "config"_a, DOC(Baker, setConfig)) + .def("getFormat", &Baker::getFormat, DOC(Baker, getFormat)) + .def("setFormat", &Baker::setFormat, "formatName"_a, DOC(Baker, setFormat)) + .def( + "getFormatMetadata", + (FormatMetadata & (Baker::*)()) & Baker::getFormatMetadata, + py::return_value_policy::reference_internal, + DOC(Baker, getFormatMetadata)) + .def("getInputSpace", &Baker::getInputSpace, DOC(Baker, getInputSpace)) + .def("setInputSpace", &Baker::setInputSpace, "inputSpace"_a, DOC(Baker, setInputSpace)) + .def("getShaperSpace", &Baker::getShaperSpace, DOC(Baker, getShaperSpace)) + .def("setShaperSpace", &Baker::setShaperSpace, "shaperSpace"_a, DOC(Baker, setShaperSpace)) + .def("getLooks", &Baker::getLooks, DOC(Baker, getLooks)) + .def("setLooks", &Baker::setLooks, "looks"_a, DOC(Baker, setLooks)) + .def("getDisplay", &Baker::getDisplay, DOC(Baker, getDisplay)) + .def("getView", &Baker::getView, DOC(Baker, getView)) + .def( + "setDisplayView", + &Baker::setDisplayView, + "display"_a, + "view"_a, + DOC(Baker, setDisplayView)) + .def("getTargetSpace", &Baker::getTargetSpace, DOC(Baker, getTargetSpace)) + .def("setTargetSpace", &Baker::setTargetSpace, "targetSpace"_a, DOC(Baker, setTargetSpace)) + .def("getShaperSize", &Baker::getShaperSize, DOC(Baker, getShaperSize)) + .def("setShaperSize", &Baker::setShaperSize, "shaperSize"_a, DOC(Baker, setShaperSize)) + .def("getCubeSize", &Baker::getCubeSize, DOC(Baker, getCubeSize)) + .def("setCubeSize", &Baker::setCubeSize, "cubeSize"_a, DOC(Baker, setCubeSize)) + .def( + "bake", + [](BakerRcPtr & self, const std::string & fileName) { std::ofstream f(fileName.c_str()); self->bake(f); f.close(); - }, - "fileName"_a) - .def("bake", [](BakerRcPtr & self) - { + }, + "fileName"_a) + .def( + "bake", + [](BakerRcPtr & self) { std::ostringstream os; self->bake(os); return os.str(); @@ -142,22 +129,21 @@ Each item is a tuple containing format name and format extension. clsFormatIterator .def("__len__", [](FormatIterator & /* it */) { return Baker::getNumFormats(); }) - .def("__getitem__", [](FormatIterator & it, int i) - { + .def( + "__getitem__", + [](FormatIterator & it, int i) { it.checkIndex(i, Baker::getNumFormats()); - return py::make_tuple(Baker::getFormatNameByIndex(i), - Baker::getFormatExtensionByIndex(i)); - }) - .def("__iter__", [](FormatIterator & it) -> FormatIterator & - { - return it; + return py::make_tuple( + Baker::getFormatNameByIndex(i), + Baker::getFormatExtensionByIndex(i)); }) - .def("__next__", [](FormatIterator & it) - { - int i = it.nextIndex(Baker::getNumFormats()); - return py::make_tuple(Baker::getFormatNameByIndex(i), - Baker::getFormatExtensionByIndex(i)); - }); + .def("__iter__", [](FormatIterator & it) -> FormatIterator & { return it; }) + .def("__next__", [](FormatIterator & it) { + int i = it.nextIndex(Baker::getNumFormats()); + return py::make_tuple( + Baker::getFormatNameByIndex(i), + Baker::getFormatExtensionByIndex(i)); + }); } } // namespace OCIO_NAMESPACE diff --git a/src/bindings/python/PyBuiltinConfigRegistry.cpp b/src/bindings/python/PyBuiltinConfigRegistry.cpp index eba6dec198..fa9673d36f 100644 --- a/src/bindings/python/PyBuiltinConfigRegistry.cpp +++ b/src/bindings/python/PyBuiltinConfigRegistry.cpp @@ -13,44 +13,42 @@ enum BuiltinConfigRegistryIterator IT_BUILTIN_CONFIG }; using BuiltinConfigNameIterator = PyIterator; -using BuiltinConfigIterator = PyIterator; +using BuiltinConfigIterator = PyIterator; void bindPyBuiltinConfigRegistry(py::module & m) { - auto clsBuiltinConfigRegistry = - py::class_(m.attr("BuiltinConfigRegistry")); + auto clsBuiltinConfigRegistry + = py::class_(m.attr("BuiltinConfigRegistry")); - auto clsBuiltinConfigNameIterator = - py::class_( - clsBuiltinConfigRegistry, "BuiltinConfigNameIterator"); + auto clsBuiltinConfigNameIterator = py::class_( + clsBuiltinConfigRegistry, + "BuiltinConfigNameIterator"); - auto clsBuiltinConfigIterator= - py::class_( - clsBuiltinConfigRegistry, "BuiltinConfigIterator"); + auto clsBuiltinConfigIterator + = py::class_(clsBuiltinConfigRegistry, "BuiltinConfigIterator"); - clsBuiltinConfigRegistry - .def(py::init<>(), DOC(BuiltinConfigRegistry, Get)) - .def("__iter__", [](PyBuiltinConfigRegistry & self) - { - return BuiltinConfigNameIterator(self); - }, - DOC(BuiltinConfigRegistry, getBuiltinConfigName)) - .def("__len__", [](PyBuiltinConfigRegistry & self) - { - return self.getNumBuiltinConfigs(); - }, + clsBuiltinConfigRegistry.def(py::init<>(), DOC(BuiltinConfigRegistry, Get)) + .def( + "__iter__", + [](PyBuiltinConfigRegistry & self) { return BuiltinConfigNameIterator(self); }, + DOC(BuiltinConfigRegistry, getBuiltinConfigName)) + .def( + "__len__", + [](PyBuiltinConfigRegistry & self) { return self.getNumBuiltinConfigs(); }, DOC(BuiltinConfigRegistry, getNumBuiltinConfigs)) - .def("__getitem__", [](PyBuiltinConfigRegistry & self, const std::string & name) - { + .def( + "__getitem__", + [](PyBuiltinConfigRegistry & self, const std::string & name) { return self.getBuiltinConfigByName(name.c_str()); }, DOC(BuiltinConfigRegistry, getBuiltinConfigByName)) - .def("__contains__", [](PyBuiltinConfigRegistry & self, const std::string & name) - { + .def( + "__contains__", + [](PyBuiltinConfigRegistry & self, const std::string & name) { for (size_t i = 0; i < self.getNumBuiltinConfigs(); i++) { if (StringUtils::Compare( - std::string(self.getBuiltinConfigName(i)), + std::string(self.getBuiltinConfigName(i)), std::string(name))) { return true; @@ -58,51 +56,52 @@ void bindPyBuiltinConfigRegistry(py::module & m) } return false; }) - .def("getBuiltinConfigs", [](PyBuiltinConfigRegistry & self) - { - return BuiltinConfigIterator(self); - }) - .def("getDefaultBuiltinConfigName", [](PyBuiltinConfigRegistry & self) - { - return self.getDefaultBuiltinConfigName(); - }, + .def( + "getBuiltinConfigs", + [](PyBuiltinConfigRegistry & self) { return BuiltinConfigIterator(self); }) + .def( + "getDefaultBuiltinConfigName", + [](PyBuiltinConfigRegistry & self) { return self.getDefaultBuiltinConfigName(); }, DOC(BuiltinConfigRegistry, getDefaultBuiltinConfigName)); - clsBuiltinConfigIterator .def("__len__", [](BuiltinConfigIterator & it) { return it.m_obj.getNumBuiltinConfigs(); }) - .def("__getitem__", [](BuiltinConfigIterator & it, int i) - { - return py::make_tuple(it.m_obj.getBuiltinConfigName(i), - it.m_obj.getBuiltinConfigUIName(i), - it.m_obj.isBuiltinConfigRecommended(i), - StringUtils::Compare( - std::string(it.m_obj.getBuiltinConfigName(i)), - std::string(it.m_obj.getDefaultBuiltinConfigName()))); + .def( + "__getitem__", + [](BuiltinConfigIterator & it, int i) { + return py::make_tuple( + it.m_obj.getBuiltinConfigName(i), + it.m_obj.getBuiltinConfigUIName(i), + it.m_obj.isBuiltinConfigRecommended(i), + StringUtils::Compare( + std::string(it.m_obj.getBuiltinConfigName(i)), + std::string(it.m_obj.getDefaultBuiltinConfigName()))); }) .def("__iter__", [](BuiltinConfigIterator & it) -> BuiltinConfigIterator & { return it; }) - .def("__next__", [](BuiltinConfigIterator & it) - { - int i = it.nextIndex((int)it.m_obj.getNumBuiltinConfigs()); - return py::make_tuple(it.m_obj.getBuiltinConfigName(i), - it.m_obj.getBuiltinConfigUIName(i), - it.m_obj.isBuiltinConfigRecommended(i), - StringUtils::Compare( - std::string(it.m_obj.getBuiltinConfigName(i)), - std::string(it.m_obj.getDefaultBuiltinConfigName()))); - }); + .def("__next__", [](BuiltinConfigIterator & it) { + int i = it.nextIndex((int)it.m_obj.getNumBuiltinConfigs()); + return py::make_tuple( + it.m_obj.getBuiltinConfigName(i), + it.m_obj.getBuiltinConfigUIName(i), + it.m_obj.isBuiltinConfigRecommended(i), + StringUtils::Compare( + std::string(it.m_obj.getBuiltinConfigName(i)), + std::string(it.m_obj.getDefaultBuiltinConfigName()))); + }); clsBuiltinConfigNameIterator - .def("__len__", [](BuiltinConfigNameIterator & it) { return it.m_obj.getNumBuiltinConfigs(); }) - .def("__getitem__", [](BuiltinConfigNameIterator & it, int i) - { - return it.m_obj.getBuiltinConfigName(i); - }) - .def("__iter__", [](BuiltinConfigNameIterator & it) -> BuiltinConfigNameIterator & { return it; }) - .def("__next__", [](BuiltinConfigNameIterator & it) - { - int i = it.nextIndex((int)it.m_obj.getNumBuiltinConfigs()); - return it.m_obj.getBuiltinConfigName(i); - }); + .def( + "__len__", + [](BuiltinConfigNameIterator & it) { return it.m_obj.getNumBuiltinConfigs(); }) + .def( + "__getitem__", + [](BuiltinConfigNameIterator & it, int i) { return it.m_obj.getBuiltinConfigName(i); }) + .def( + "__iter__", + [](BuiltinConfigNameIterator & it) -> BuiltinConfigNameIterator & { return it; }) + .def("__next__", [](BuiltinConfigNameIterator & it) { + int i = it.nextIndex((int)it.m_obj.getNumBuiltinConfigs()); + return it.m_obj.getBuiltinConfigName(i); + }); } -} \ No newline at end of file +} // namespace OCIO_NAMESPACE \ No newline at end of file diff --git a/src/bindings/python/PyBuiltinConfigRegistry.h b/src/bindings/python/PyBuiltinConfigRegistry.h index 4e937b3f1e..11c800f635 100644 --- a/src/bindings/python/PyBuiltinConfigRegistry.h +++ b/src/bindings/python/PyBuiltinConfigRegistry.h @@ -13,7 +13,7 @@ namespace OCIO_NAMESPACE class OCIOHIDDEN PyBuiltinConfigRegistry { public: - PyBuiltinConfigRegistry() = default; + PyBuiltinConfigRegistry() = default; ~PyBuiltinConfigRegistry() = default; size_t getNumBuiltinConfigs() const noexcept diff --git a/src/bindings/python/PyBuiltinTransformRegistry.cpp b/src/bindings/python/PyBuiltinTransformRegistry.cpp index c1fc3bad5d..fa06baea7a 100644 --- a/src/bindings/python/PyBuiltinTransformRegistry.cpp +++ b/src/bindings/python/PyBuiltinTransformRegistry.cpp @@ -7,7 +7,7 @@ namespace OCIO_NAMESPACE { -namespace +namespace { enum BuiltinTransformRegistryIterator @@ -17,36 +17,35 @@ enum BuiltinTransformRegistryIterator }; using BuiltinStyleIterator = PyIterator; -using BuiltinIterator = PyIterator; +using BuiltinIterator = PyIterator; } // namespace void bindPyBuiltinTransformRegistry(py::module & m) { - auto clsBuiltinTransformRegistry = - py::class_( - m.attr("BuiltinTransformRegistry")); + auto clsBuiltinTransformRegistry + = py::class_(m.attr("BuiltinTransformRegistry")); - auto clsBuiltinStyleIterator = - py::class_( - clsBuiltinTransformRegistry, "BuiltinStyleIterator"); + auto clsBuiltinStyleIterator + = py::class_(clsBuiltinTransformRegistry, "BuiltinStyleIterator"); - auto clsBuiltinIterator = - py::class_( - clsBuiltinTransformRegistry, "BuiltinIterator"); + auto clsBuiltinIterator + = py::class_(clsBuiltinTransformRegistry, "BuiltinIterator"); clsBuiltinTransformRegistry .def(py::init<>(), DOC(BuiltinTransformRegistry, Get)) - .def("__iter__", [](PyBuiltinTransformRegistry & self) - { - return BuiltinStyleIterator(self); - }, - DOC(BuiltinTransformRegistry, getBuiltinStyle)) - .def("__len__", [](PyBuiltinTransformRegistry & self) { return self.getNumBuiltins(); }, - DOC(BuiltinTransformRegistry, getNumBuiltins)) - .def("__getitem__", [](PyBuiltinTransformRegistry & self, const std::string & style) - { + .def( + "__iter__", + [](PyBuiltinTransformRegistry & self) { return BuiltinStyleIterator(self); }, + DOC(BuiltinTransformRegistry, getBuiltinStyle)) + .def( + "__len__", + [](PyBuiltinTransformRegistry & self) { return self.getNumBuiltins(); }, + DOC(BuiltinTransformRegistry, getNumBuiltins)) + .def( + "__getitem__", + [](PyBuiltinTransformRegistry & self, const std::string & style) { for (size_t i = 0; i < self.getNumBuiltins(); i++) { const char * thisStyle = self.getBuiltinStyle(i); @@ -55,14 +54,15 @@ void bindPyBuiltinTransformRegistry(py::module & m) return self.getBuiltinDescription(i); } } - + std::ostringstream os; os << "'" << style << "'"; throw py::key_error(os.str().c_str()); }, - DOC(BuiltinTransformRegistry, getBuiltinDescription)) - .def("__contains__", [](PyBuiltinTransformRegistry & self, const std::string & style) - { + DOC(BuiltinTransformRegistry, getBuiltinDescription)) + .def( + "__contains__", + [](PyBuiltinTransformRegistry & self, const std::string & style) { for (size_t i = 0; i < self.getNumBuiltins(); i++) { const char * thisStyle = self.getBuiltinStyle(i); @@ -74,40 +74,39 @@ void bindPyBuiltinTransformRegistry(py::module & m) return false; }) - .def("getBuiltins", [](PyBuiltinTransformRegistry & self) - { - return BuiltinIterator(self); - }); + .def("getBuiltins", [](PyBuiltinTransformRegistry & self) { + return BuiltinIterator(self); + }); clsBuiltinStyleIterator .def("__len__", [](BuiltinStyleIterator & it) { return it.m_obj.getNumBuiltins(); }) - .def("__getitem__", [](BuiltinStyleIterator & it, int i) - { + .def( + "__getitem__", + [](BuiltinStyleIterator & it, int i) { // BuiltinTransformRegistry provides index check with exception return it.m_obj.getBuiltinStyle(i); }) .def("__iter__", [](BuiltinStyleIterator & it) -> BuiltinStyleIterator & { return it; }) - .def("__next__", [](BuiltinStyleIterator & it) - { - int i = it.nextIndex((int)it.m_obj.getNumBuiltins()); - return it.m_obj.getBuiltinStyle(i); - }); + .def("__next__", [](BuiltinStyleIterator & it) { + int i = it.nextIndex((int)it.m_obj.getNumBuiltins()); + return it.m_obj.getBuiltinStyle(i); + }); clsBuiltinIterator .def("__len__", [](BuiltinIterator & it) { return it.m_obj.getNumBuiltins(); }) - .def("__getitem__", [](BuiltinIterator & it, int i) - { + .def( + "__getitem__", + [](BuiltinIterator & it, int i) { // BuiltinTransformRegistry provides index check with exception - return py::make_tuple(it.m_obj.getBuiltinStyle(i), - it.m_obj.getBuiltinDescription(i)); + return py::make_tuple( + it.m_obj.getBuiltinStyle(i), + it.m_obj.getBuiltinDescription(i)); }) .def("__iter__", [](BuiltinIterator & it) -> BuiltinIterator & { return it; }) - .def("__next__", [](BuiltinIterator & it) - { - int i = it.nextIndex((int)it.m_obj.getNumBuiltins()); - return py::make_tuple(it.m_obj.getBuiltinStyle(i), - it.m_obj.getBuiltinDescription(i)); - }); + .def("__next__", [](BuiltinIterator & it) { + int i = it.nextIndex((int)it.m_obj.getNumBuiltins()); + return py::make_tuple(it.m_obj.getBuiltinStyle(i), it.m_obj.getBuiltinDescription(i)); + }); } } // namespace OCIO_NAMESPACE diff --git a/src/bindings/python/PyBuiltinTransformRegistry.h b/src/bindings/python/PyBuiltinTransformRegistry.h index 55be013bfa..73926f81ba 100644 --- a/src/bindings/python/PyBuiltinTransformRegistry.h +++ b/src/bindings/python/PyBuiltinTransformRegistry.h @@ -13,7 +13,7 @@ namespace OCIO_NAMESPACE class OCIOHIDDEN PyBuiltinTransformRegistry { public: - PyBuiltinTransformRegistry() = default; + PyBuiltinTransformRegistry() = default; ~PyBuiltinTransformRegistry() = default; size_t getNumBuiltins() const noexcept diff --git a/src/bindings/python/PyCPUProcessor.cpp b/src/bindings/python/PyCPUProcessor.cpp index 84b91427bf..4c3f16ec4c 100644 --- a/src/bindings/python/PyCPUProcessor.cpp +++ b/src/bindings/python/PyCPUProcessor.cpp @@ -5,52 +5,56 @@ #include #include "PyDynamicProperty.h" +#include "PyImageDesc.h" #include "PyOpenColorIO.h" #include "PyUtils.h" -#include "PyImageDesc.h" namespace OCIO_NAMESPACE { void bindPyCPUProcessor(py::module & m) { - auto clsCPUProcessor = - py::class_( - m.attr("CPUProcessor")) - - .def("isNoOp", &CPUProcessor::isNoOp, - DOC(CPUProcessor, isNoOp)) - .def("isIdentity", &CPUProcessor::isIdentity, - DOC(CPUProcessor, isIdentity)) - .def("hasChannelCrosstalk", &CPUProcessor::hasChannelCrosstalk, - DOC(CPUProcessor, hasChannelCrosstalk)) - .def("getCacheID", &CPUProcessor::getCacheID, - DOC(CPUProcessor, getCacheID)) - .def("getInputBitDepth", &CPUProcessor::getInputBitDepth, - DOC(CPUProcessor, getInputBitDepth)) - .def("getOutputBitDepth", &CPUProcessor::getOutputBitDepth, - DOC(CPUProcessor, getOutputBitDepth)) - .def("getDynamicProperty", [](CPUProcessorRcPtr & self, DynamicPropertyType type) - { - return PyDynamicProperty(self->getDynamicProperty(type)); - }, - "type"_a, - DOC(CPUProcessor, getDynamicProperty)) - .def("hasDynamicProperty", - (bool (CPUProcessor::*)(DynamicPropertyType) const noexcept) - &CPUProcessor::hasDynamicProperty, - "type"_a, - DOC(CPUProcessor, hasDynamicProperty)) - .def("isDynamic", &CPUProcessor::isDynamic, - DOC(CPUProcessor, isDynamic)) - - .def("apply", [](CPUProcessorRcPtr & self, PyImageDesc & imgDesc) - { - self->apply((*imgDesc.m_img)); - }, - "imgDesc"_a, - py::call_guard(), - R"doc( + auto clsCPUProcessor + = py::class_(m.attr("CPUProcessor")) + + .def("isNoOp", &CPUProcessor::isNoOp, DOC(CPUProcessor, isNoOp)) + .def("isIdentity", &CPUProcessor::isIdentity, DOC(CPUProcessor, isIdentity)) + .def( + "hasChannelCrosstalk", + &CPUProcessor::hasChannelCrosstalk, + DOC(CPUProcessor, hasChannelCrosstalk)) + .def("getCacheID", &CPUProcessor::getCacheID, DOC(CPUProcessor, getCacheID)) + .def( + "getInputBitDepth", + &CPUProcessor::getInputBitDepth, + DOC(CPUProcessor, getInputBitDepth)) + .def( + "getOutputBitDepth", + &CPUProcessor::getOutputBitDepth, + DOC(CPUProcessor, getOutputBitDepth)) + .def( + "getDynamicProperty", + [](CPUProcessorRcPtr & self, DynamicPropertyType type) { + return PyDynamicProperty(self->getDynamicProperty(type)); + }, + "type"_a, + DOC(CPUProcessor, getDynamicProperty)) + .def( + "hasDynamicProperty", + (bool(CPUProcessor::*)(DynamicPropertyType) const noexcept) + & CPUProcessor::hasDynamicProperty, + "type"_a, + DOC(CPUProcessor, hasDynamicProperty)) + .def("isDynamic", &CPUProcessor::isDynamic, DOC(CPUProcessor, isDynamic)) + + .def( + "apply", + [](CPUProcessorRcPtr & self, PyImageDesc & imgDesc) { + self->apply((*imgDesc.m_img)); + }, + "imgDesc"_a, + py::call_guard(), + R"doc( Apply to an image with any kind of channel ordering while respecting the input and output bit-depths. Image values are modified in place. @@ -66,15 +70,15 @@ the input and output bit-depths. Image values are modified in place. ``ImageDesc`` on the C++ side so avoid the copy. )doc") - .def("apply", [](CPUProcessorRcPtr & self, - PyImageDesc & srcImgDesc, - PyImageDesc & dstImgDesc) - { - self->apply((*srcImgDesc.m_img), (*dstImgDesc.m_img)); - }, - "srcImgDesc"_a, "dstImgDesc"_a, - py::call_guard(), - R"doc( + .def( + "apply", + [](CPUProcessorRcPtr & self, PyImageDesc & srcImgDesc, PyImageDesc & dstImgDesc) { + self->apply((*srcImgDesc.m_img), (*dstImgDesc.m_img)); + }, + "srcImgDesc"_a, + "dstImgDesc"_a, + py::call_guard(), + R"doc( Apply to an image with any kind of channel ordering while respecting the input and output bit-depths. Modified srcImgDesc image values are written to the dstImgDesc image, leaving srcImgDesc unchanged. @@ -91,34 +95,37 @@ written to the dstImgDesc image, leaving srcImgDesc unchanged. ``ImageDesc`` on the C++ side so avoid the copy. )doc") - .def("applyRGB", [](CPUProcessorRcPtr & self, py::buffer & data) - { - py::buffer_info info = data.request(); - checkBufferDivisible(info, 3); - - // Interpret as single row of RGB pixels - BitDepth bitDepth = getBufferBitDepth(info); - - py::gil_scoped_release release; - - long numChannels = 3; - long width = (long)info.size / numChannels; - long height = 1; - ptrdiff_t chanStrideBytes = (ptrdiff_t)info.itemsize; - ptrdiff_t xStrideBytes = chanStrideBytes * numChannels; - ptrdiff_t yStrideBytes = xStrideBytes * width; - - PackedImageDesc img(info.ptr, - width, height, - numChannels, - bitDepth, - chanStrideBytes, - xStrideBytes, - yStrideBytes); - self->apply(img); - }, - "data"_a, - R"doc( + .def( + "applyRGB", + [](CPUProcessorRcPtr & self, py::buffer & data) { + py::buffer_info info = data.request(); + checkBufferDivisible(info, 3); + + // Interpret as single row of RGB pixels + BitDepth bitDepth = getBufferBitDepth(info); + + py::gil_scoped_release release; + + long numChannels = 3; + long width = (long)info.size / numChannels; + long height = 1; + ptrdiff_t chanStrideBytes = (ptrdiff_t)info.itemsize; + ptrdiff_t xStrideBytes = chanStrideBytes * numChannels; + ptrdiff_t yStrideBytes = xStrideBytes * width; + + PackedImageDesc img( + info.ptr, + width, + height, + numChannels, + bitDepth, + chanStrideBytes, + xStrideBytes, + yStrideBytes); + self->apply(img); + }, + "data"_a, + R"doc( Apply to a packed RGB array adhering to the Python buffer protocol. This will typically be a NumPy array. Input and output bit-depths are respected but must match. Any array size or shape is supported as long @@ -133,22 +140,23 @@ modified in place. concurrently. )doc") - .def("applyRGB", [](CPUProcessorRcPtr & self, std::vector & data) - { - checkVectorDivisible(data, 3); - - long numChannels = 3; - long width = (long)data.size() / numChannels; - long height = 1; - - PackedImageDesc img(&data[0], width, height, numChannels); - self->apply(img); - - return data; - }, - "data"_a, - py::call_guard(), - R"doc( + .def( + "applyRGB", + [](CPUProcessorRcPtr & self, std::vector & data) { + checkVectorDivisible(data, 3); + + long numChannels = 3; + long width = (long)data.size() / numChannels; + long height = 1; + + PackedImageDesc img(&data[0], width, height, numChannels); + self->apply(img); + + return data; + }, + "data"_a, + py::call_guard(), + R"doc( Apply to a packed RGB list of float values. Any size is supported as long as the list length is divisible by 3. A new list with processed float values is returned, leaving the input list unchanged. @@ -166,34 +174,37 @@ float values is returned, leaving the input list unchanged. modified in place. )doc") - .def("applyRGBA", [](CPUProcessorRcPtr & self, py::buffer & data) - { - py::buffer_info info = data.request(); - checkBufferDivisible(info, 4); - - // Interpret as single row of RGBA pixels - BitDepth bitDepth = getBufferBitDepth(info); - - py::gil_scoped_release release; - - long numChannels = 4; - long width = (long)info.size / numChannels; - long height = 1; - ptrdiff_t chanStrideBytes = (ptrdiff_t)info.itemsize; - ptrdiff_t xStrideBytes = chanStrideBytes * numChannels; - ptrdiff_t yStrideBytes = xStrideBytes * width; - - PackedImageDesc img(info.ptr, - width, height, - numChannels, - bitDepth, - chanStrideBytes, - xStrideBytes, - yStrideBytes); - self->apply(img); - }, - "data"_a, - R"doc( + .def( + "applyRGBA", + [](CPUProcessorRcPtr & self, py::buffer & data) { + py::buffer_info info = data.request(); + checkBufferDivisible(info, 4); + + // Interpret as single row of RGBA pixels + BitDepth bitDepth = getBufferBitDepth(info); + + py::gil_scoped_release release; + + long numChannels = 4; + long width = (long)info.size / numChannels; + long height = 1; + ptrdiff_t chanStrideBytes = (ptrdiff_t)info.itemsize; + ptrdiff_t xStrideBytes = chanStrideBytes * numChannels; + ptrdiff_t yStrideBytes = xStrideBytes * width; + + PackedImageDesc img( + info.ptr, + width, + height, + numChannels, + bitDepth, + chanStrideBytes, + xStrideBytes, + yStrideBytes); + self->apply(img); + }, + "data"_a, + R"doc( Apply to a packed RGBA array adhering to the Python buffer protocol. This will typically be a NumPy array. Input and output bit-depths are respected but must match. Any array size or shape is supported as long @@ -208,22 +219,23 @@ modified in place. concurrently. )doc") - .def("applyRGBA", [](CPUProcessorRcPtr & self, std::vector & data) - { - checkVectorDivisible(data, 4); - - long numChannels = 4; - long width = (long)data.size() / numChannels; - long height = 1; - - PackedImageDesc img(&data[0], width, height, numChannels); - self->apply(img); - - return data; - }, - "data"_a, - py::call_guard(), - R"doc( + .def( + "applyRGBA", + [](CPUProcessorRcPtr & self, std::vector & data) { + checkVectorDivisible(data, 4); + + long numChannels = 4; + long width = (long)data.size() / numChannels; + long height = 1; + + PackedImageDesc img(&data[0], width, height, numChannels); + self->apply(img); + + return data; + }, + "data"_a, + py::call_guard(), + R"doc( Apply to a packed RGBA list of float values. Any size is supported as long as the list length is divisible by 4. A new list with processed float values is returned, leaving the input list unchanged. diff --git a/src/bindings/python/PyColorSpace.cpp b/src/bindings/python/PyColorSpace.cpp index ee72784f8b..319d150dd9 100644 --- a/src/bindings/python/PyColorSpace.cpp +++ b/src/bindings/python/PyColorSpace.cpp @@ -7,7 +7,7 @@ namespace OCIO_NAMESPACE { -namespace +namespace { enum ColorSpaceIterator @@ -17,16 +17,18 @@ enum ColorSpaceIterator }; using ColorSpaceCategoryIterator = PyIterator; -using ColorSpaceAliasIterator = PyIterator; +using ColorSpaceAliasIterator = PyIterator; -std::vector getAllocationVarsStdVec(const ColorSpaceRcPtr & p) { +std::vector getAllocationVarsStdVec(const ColorSpaceRcPtr & p) +{ std::vector vars; vars.resize(p->getAllocationNumVars()); p->getAllocationVars(vars.data()); return vars; } -std::vector getCategoriesStdVec(const ColorSpaceRcPtr & p) { +std::vector getCategoriesStdVec(const ColorSpaceRcPtr & p) +{ std::vector categories; categories.reserve(p->getNumCategories()); for (int i = 0; i < p->getNumCategories(); i++) @@ -53,45 +55,36 @@ void bindPyColorSpace(py::module & m) { ColorSpaceRcPtr DEFAULT = ColorSpace::Create(); - auto clsColorSpace = - py::class_( - m.attr("ColorSpace")); + auto clsColorSpace = py::class_(m.attr("ColorSpace")); - auto clsColorSpaceCategoryIterator = - py::class_( - clsColorSpace, "ColorSpaceCategoryIterator"); + auto clsColorSpaceCategoryIterator + = py::class_(clsColorSpace, "ColorSpaceCategoryIterator"); - auto clsColorSpacAliasIterator = - py::class_( - clsColorSpace, "ColorSpaceAliasIterator"); + auto clsColorSpacAliasIterator + = py::class_(clsColorSpace, "ColorSpaceAliasIterator"); - clsColorSpace - .def(py::init([]() - { - return ColorSpace::Create(); - }), - DOC(ColorSpace, Create)) - .def(py::init([](ReferenceSpaceType referenceSpace) - { - return ColorSpace::Create(referenceSpace); - }), - "referenceSpace"_a, - DOC(ColorSpace, Create, 2)) - .def(py::init([](ReferenceSpaceType referenceSpace, - const std::string & name, - const std::vector & aliases, - const std::string & family, - const std::string & encoding, - const std::string & equalityGroup, - const std::string & description, - BitDepth bitDepth, - bool isData, - Allocation allocation, - const std::vector & allocationVars, - const TransformRcPtr & toReference, - const TransformRcPtr & fromReference, - const std::vector & categories) - { + clsColorSpace.def(py::init([]() { return ColorSpace::Create(); }), DOC(ColorSpace, Create)) + .def( + py::init([](ReferenceSpaceType referenceSpace) { + return ColorSpace::Create(referenceSpace); + }), + "referenceSpace"_a, + DOC(ColorSpace, Create, 2)) + .def( + py::init([](ReferenceSpaceType referenceSpace, + const std::string & name, + const std::vector & aliases, + const std::string & family, + const std::string & encoding, + const std::string & equalityGroup, + const std::string & description, + BitDepth bitDepth, + bool isData, + Allocation allocation, + const std::vector & allocationVars, + const TransformRcPtr & toReference, + const TransformRcPtr & fromReference, + const std::vector & categories) { ColorSpaceRcPtr p = ColorSpace::Create(referenceSpace); if (!aliases.empty()) { @@ -102,11 +95,26 @@ void bindPyColorSpace(py::module & m) } } // Setting the name will remove alias named the same, so set name after. - if (!name.empty()) { p->setName(name.c_str()); } - if (!family.empty()) { p->setFamily(family.c_str()); } - if (!encoding.empty()) { p->setEncoding(encoding.c_str()); } - if (!equalityGroup.empty()) { p->setEqualityGroup(equalityGroup.c_str()); } - if (!description.empty()) { p->setDescription(description.c_str()); } + if (!name.empty()) + { + p->setName(name.c_str()); + } + if (!family.empty()) + { + p->setFamily(family.c_str()); + } + if (!encoding.empty()) + { + p->setEncoding(encoding.c_str()); + } + if (!equalityGroup.empty()) + { + p->setEqualityGroup(equalityGroup.c_str()); + } + if (!description.empty()) + { + p->setDescription(description.c_str()); + } p->setBitDepth(bitDepth); p->setIsData(isData); p->setAllocation(allocation); @@ -119,12 +127,12 @@ void bindPyColorSpace(py::module & m) p->setAllocationVars((int)allocationVars.size(), allocationVars.data()); } if (toReference) - { - p->setTransform(toReference, COLORSPACE_DIR_TO_REFERENCE); + { + p->setTransform(toReference, COLORSPACE_DIR_TO_REFERENCE); } - if (fromReference) - { - p->setTransform(fromReference, COLORSPACE_DIR_FROM_REFERENCE); + if (fromReference) + { + p->setTransform(fromReference, COLORSPACE_DIR_FROM_REFERENCE); } if (!categories.empty()) { @@ -135,157 +143,151 @@ void bindPyColorSpace(py::module & m) } } return p; - }), - "referenceSpace"_a = DEFAULT->getReferenceSpaceType(), - "name"_a.none(false) = DEFAULT->getName(), - "aliases"_a = getAliasesStdVec(DEFAULT), - "family"_a.none(false) = DEFAULT->getFamily(), - "encoding"_a.none(false) = DEFAULT->getEncoding(), - "equalityGroup"_a.none(false) = DEFAULT->getEqualityGroup(), - "description"_a.none(false) = DEFAULT->getDescription(), - "bitDepth"_a = DEFAULT->getBitDepth(), - "isData"_a = DEFAULT->isData(), - "allocation"_a = DEFAULT->getAllocation(), - "allocationVars"_a = getAllocationVarsStdVec(DEFAULT), - "toReference"_a = DEFAULT->getTransform(COLORSPACE_DIR_TO_REFERENCE), - "fromReference"_a = DEFAULT->getTransform(COLORSPACE_DIR_FROM_REFERENCE), - "categories"_a = getCategoriesStdVec(DEFAULT), - DOC(ColorSpace, Create, 2)) + }), + "referenceSpace"_a = DEFAULT->getReferenceSpaceType(), + "name"_a.none(false) = DEFAULT->getName(), + "aliases"_a = getAliasesStdVec(DEFAULT), + "family"_a.none(false) = DEFAULT->getFamily(), + "encoding"_a.none(false) = DEFAULT->getEncoding(), + "equalityGroup"_a.none(false) = DEFAULT->getEqualityGroup(), + "description"_a.none(false) = DEFAULT->getDescription(), + "bitDepth"_a = DEFAULT->getBitDepth(), + "isData"_a = DEFAULT->isData(), + "allocation"_a = DEFAULT->getAllocation(), + "allocationVars"_a = getAllocationVarsStdVec(DEFAULT), + "toReference"_a = DEFAULT->getTransform(COLORSPACE_DIR_TO_REFERENCE), + "fromReference"_a = DEFAULT->getTransform(COLORSPACE_DIR_FROM_REFERENCE), + "categories"_a = getCategoriesStdVec(DEFAULT), + DOC(ColorSpace, Create, 2)) - .def("__deepcopy__", [](const ConstColorSpaceRcPtr & self, py::dict) - { - return self->createEditableCopy(); - }, + .def( + "__deepcopy__", + [](const ConstColorSpaceRcPtr & self, py::dict) { return self->createEditableCopy(); }, "memo"_a) - .def("getName", &ColorSpace::getName, - DOC(ColorSpace, getName)) - .def("setName", &ColorSpace::setName, "name"_a.none(false), - DOC(ColorSpace, setName)) + .def("getName", &ColorSpace::getName, DOC(ColorSpace, getName)) + .def("setName", &ColorSpace::setName, "name"_a.none(false), DOC(ColorSpace, setName)) // Aliases. - .def("addAlias", &ColorSpace::addAlias, "alias"_a.none(false), - DOC(ColorSpace, addAlias)) - .def("removeAlias", &ColorSpace::removeAlias, "alias"_a.none(false), - DOC(ColorSpace, removeAlias)) - .def("getAliases", [](ColorSpaceRcPtr & self) - { - return ColorSpaceAliasIterator(self); - }) - .def("clearAliases", &ColorSpace::clearAliases, - DOC(ColorSpace, clearAliases)) + .def("addAlias", &ColorSpace::addAlias, "alias"_a.none(false), DOC(ColorSpace, addAlias)) + .def( + "removeAlias", + &ColorSpace::removeAlias, + "alias"_a.none(false), + DOC(ColorSpace, removeAlias)) + .def("getAliases", [](ColorSpaceRcPtr & self) { return ColorSpaceAliasIterator(self); }) + .def("clearAliases", &ColorSpace::clearAliases, DOC(ColorSpace, clearAliases)) - .def("getFamily", &ColorSpace::getFamily, - DOC(ColorSpace, getFamily)) - .def("setFamily", &ColorSpace::setFamily, "family"_a, - DOC(ColorSpace, setFamily)) - .def("getEncoding", &ColorSpace::getEncoding, - DOC(ColorSpace, getEncoding)) - .def("setEncoding", &ColorSpace::setEncoding, "encoding"_a, - DOC(ColorSpace, setEncoding)) - .def("getEqualityGroup", &ColorSpace::getEqualityGroup, - DOC(ColorSpace, getEqualityGroup)) - .def("setEqualityGroup", &ColorSpace::setEqualityGroup, "equalityGroup"_a, - DOC(ColorSpace, setEqualityGroup)) - .def("getDescription", &ColorSpace::getDescription, - DOC(ColorSpace, getDescription)) - .def("setDescription", &ColorSpace::setDescription, "description"_a, - DOC(ColorSpace, setDescription)) - .def("getBitDepth", &ColorSpace::getBitDepth, - DOC(ColorSpace, getBitDepth)) - .def("setBitDepth", &ColorSpace::setBitDepth, "bitDepth"_a, - DOC(ColorSpace, setBitDepth)) + .def("getFamily", &ColorSpace::getFamily, DOC(ColorSpace, getFamily)) + .def("setFamily", &ColorSpace::setFamily, "family"_a, DOC(ColorSpace, setFamily)) + .def("getEncoding", &ColorSpace::getEncoding, DOC(ColorSpace, getEncoding)) + .def("setEncoding", &ColorSpace::setEncoding, "encoding"_a, DOC(ColorSpace, setEncoding)) + .def("getEqualityGroup", &ColorSpace::getEqualityGroup, DOC(ColorSpace, getEqualityGroup)) + .def( + "setEqualityGroup", + &ColorSpace::setEqualityGroup, + "equalityGroup"_a, + DOC(ColorSpace, setEqualityGroup)) + .def("getDescription", &ColorSpace::getDescription, DOC(ColorSpace, getDescription)) + .def( + "setDescription", + &ColorSpace::setDescription, + "description"_a, + DOC(ColorSpace, setDescription)) + .def("getBitDepth", &ColorSpace::getBitDepth, DOC(ColorSpace, getBitDepth)) + .def("setBitDepth", &ColorSpace::setBitDepth, "bitDepth"_a, DOC(ColorSpace, setBitDepth)) // Categories - .def("hasCategory", &ColorSpace::hasCategory, "category"_a, - DOC(ColorSpace, hasCategory)) - .def("addCategory", &ColorSpace::addCategory, "category"_a, - DOC(ColorSpace, addCategory)) - .def("removeCategory", &ColorSpace::removeCategory, "category"_a, - DOC(ColorSpace, removeCategory)) - .def("getCategories", [](ColorSpaceRcPtr & self) - { - return ColorSpaceCategoryIterator(self); - }) - .def("clearCategories", &ColorSpace::clearCategories, - DOC(ColorSpace, clearCategories)) + .def("hasCategory", &ColorSpace::hasCategory, "category"_a, DOC(ColorSpace, hasCategory)) + .def("addCategory", &ColorSpace::addCategory, "category"_a, DOC(ColorSpace, addCategory)) + .def( + "removeCategory", + &ColorSpace::removeCategory, + "category"_a, + DOC(ColorSpace, removeCategory)) + .def( + "getCategories", + [](ColorSpaceRcPtr & self) { return ColorSpaceCategoryIterator(self); }) + .def("clearCategories", &ColorSpace::clearCategories, DOC(ColorSpace, clearCategories)) // Data - .def("isData", &ColorSpace::isData, - DOC(ColorSpace, isData)) - .def("setIsData", &ColorSpace::setIsData, "isData"_a, - DOC(ColorSpace, setIsData)) - .def("getReferenceSpaceType", &ColorSpace::getReferenceSpaceType, - DOC(ColorSpace, getReferenceSpaceType)) + .def("isData", &ColorSpace::isData, DOC(ColorSpace, isData)) + .def("setIsData", &ColorSpace::setIsData, "isData"_a, DOC(ColorSpace, setIsData)) + .def( + "getReferenceSpaceType", + &ColorSpace::getReferenceSpaceType, + DOC(ColorSpace, getReferenceSpaceType)) // Allocation - .def("getAllocation", &ColorSpace::getAllocation, - DOC(ColorSpace, getAllocation)) - .def("setAllocation", &ColorSpace::setAllocation, "allocation"_a, - DOC(ColorSpace, setAllocation)) - .def("getAllocationVars", [](ColorSpaceRcPtr & self) - { - return getAllocationVarsStdVec(self); - }) - .def("setAllocationVars", [](ColorSpaceRcPtr self, const std::vector & vars) - { + .def("getAllocation", &ColorSpace::getAllocation, DOC(ColorSpace, getAllocation)) + .def( + "setAllocation", + &ColorSpace::setAllocation, + "allocation"_a, + DOC(ColorSpace, setAllocation)) + .def( + "getAllocationVars", + [](ColorSpaceRcPtr & self) { return getAllocationVarsStdVec(self); }) + .def( + "setAllocationVars", + [](ColorSpaceRcPtr self, const std::vector & vars) { if (vars.size() < 2 || vars.size() > 3) { throw Exception("vars must be a float array, size 2 or 3"); } self->setAllocationVars((int)vars.size(), vars.data()); - }, - "vars"_a, - DOC(ColorSpace, setAllocationVars)) + }, + "vars"_a, + DOC(ColorSpace, setAllocationVars)) // Transform - .def("getTransform", &ColorSpace::getTransform, "direction"_a, - DOC(ColorSpace, getTransform)) - .def("setTransform", &ColorSpace::setTransform, "transform"_a, "direction"_a, - DOC(ColorSpace, setTransform)); + .def( + "getTransform", + &ColorSpace::getTransform, + "direction"_a, + DOC(ColorSpace, getTransform)) + .def( + "setTransform", + &ColorSpace::setTransform, + "transform"_a, + "direction"_a, + DOC(ColorSpace, setTransform)); defRepr(clsColorSpace); clsColorSpaceCategoryIterator - .def("__len__", [](ColorSpaceCategoryIterator & it) - { - return it.m_obj->getNumCategories(); - }) - .def("__getitem__", [](ColorSpaceCategoryIterator & it, int i) - { + .def( + "__len__", + [](ColorSpaceCategoryIterator & it) { return it.m_obj->getNumCategories(); }) + .def( + "__getitem__", + [](ColorSpaceCategoryIterator & it, int i) { it.checkIndex(i, it.m_obj->getNumCategories()); return it.m_obj->getCategory(i); }) - .def("__iter__", [](ColorSpaceCategoryIterator & it) -> ColorSpaceCategoryIterator & - { - return it; - }) - .def("__next__", [](ColorSpaceCategoryIterator & it) - { - int i = it.nextIndex(it.m_obj->getNumCategories()); - return it.m_obj->getCategory(i); - }); + .def( + "__iter__", + [](ColorSpaceCategoryIterator & it) -> ColorSpaceCategoryIterator & { return it; }) + .def("__next__", [](ColorSpaceCategoryIterator & it) { + int i = it.nextIndex(it.m_obj->getNumCategories()); + return it.m_obj->getCategory(i); + }); clsColorSpacAliasIterator - .def("__len__", [](ColorSpaceAliasIterator & it) - { - return it.m_obj->getNumAliases(); - }) - .def("__getitem__", [](ColorSpaceAliasIterator & it, int i) - { + .def("__len__", [](ColorSpaceAliasIterator & it) { return it.m_obj->getNumAliases(); }) + .def( + "__getitem__", + [](ColorSpaceAliasIterator & it, int i) { it.checkIndex(i, (int)it.m_obj->getNumAliases()); return it.m_obj->getAlias(i); }) - .def("__iter__", [](ColorSpaceAliasIterator & it) -> ColorSpaceAliasIterator & - { - return it; - }) - .def("__next__", [](ColorSpaceAliasIterator & it) - { - int i = it.nextIndex((int)it.m_obj->getNumAliases()); - return it.m_obj->getAlias(i); - }); - + .def( + "__iter__", + [](ColorSpaceAliasIterator & it) -> ColorSpaceAliasIterator & { return it; }) + .def("__next__", [](ColorSpaceAliasIterator & it) { + int i = it.nextIndex((int)it.m_obj->getNumAliases()); + return it.m_obj->getAlias(i); + }); } } // namespace OCIO_NAMESPACE diff --git a/src/bindings/python/PyColorSpaceSet.cpp b/src/bindings/python/PyColorSpaceSet.cpp index d6c4831e23..db0b80077c 100644 --- a/src/bindings/python/PyColorSpaceSet.cpp +++ b/src/bindings/python/PyColorSpaceSet.cpp @@ -24,108 +24,123 @@ void bindPyColorSpaceSet(py::module & m) { ColorSpaceSetRcPtr DEFAULT = ColorSpaceSet::Create(); - auto clsColorSpaceSet = - py::class_( - m.attr("ColorSpaceSet")); + auto clsColorSpaceSet = py::class_(m.attr("ColorSpaceSet")); - auto clsColorSpaceNameIterator = - py::class_( - clsColorSpaceSet, "ColorSpaceNameIterator"); + auto clsColorSpaceNameIterator + = py::class_(clsColorSpaceSet, "ColorSpaceNameIterator"); - auto clsColorSpaceIterator = - py::class_( - clsColorSpaceSet, "ColorSpaceIterator"); + auto clsColorSpaceIterator + = py::class_(clsColorSpaceSet, "ColorSpaceIterator"); clsColorSpaceSet - .def(py::init(&ColorSpaceSet::Create), - DOC(ColorSpaceSet, Create)) + .def(py::init(&ColorSpaceSet::Create), DOC(ColorSpaceSet, Create)) - .def("__deepcopy__", [](const ConstColorSpaceSetRcPtr & self, py::dict) - { + .def( + "__deepcopy__", + [](const ConstColorSpaceSetRcPtr & self, py::dict) { return self->createEditableCopy(); }, "memo"_a) - .def("__eq__", &ColorSpaceSet::operator==, py::is_operator(), - DOC(ColorSpaceSet, operator, eq)) - .def("__ne__", &ColorSpaceSet::operator!=, py::is_operator(), - DOC(ColorSpaceSet, operator, ne)) - - .def("__sub__", [](ConstColorSpaceSetRcPtr & self, ConstColorSpaceSetRcPtr & rcss) - { - return self - rcss; - }, - py::is_operator(), - DOC(PyOpenColorIO, ConstColorSpaceSetRcPtr, operator, sub)) - .def("__or__", [](ConstColorSpaceSetRcPtr & self, ConstColorSpaceSetRcPtr & rcss) - { - return self || rcss; - }, - py::is_operator(), - DOC(PyOpenColorIO, ConstColorSpaceSetRcPtr, operator, lor)) - .def("__and__", [](ConstColorSpaceSetRcPtr & self, ConstColorSpaceSetRcPtr & rcss) - { - return self && rcss; - }, - py::is_operator(), - DOC(PyOpenColorIO, ConstColorSpaceSetRcPtr, operator, land)) - - .def("getColorSpaceNames", [](ColorSpaceSetRcPtr & self) - { - return ColorSpaceNameIterator(self); - }) - .def("getColorSpaces", [](ColorSpaceSetRcPtr & self) - { - return ColorSpaceIterator(self); - }) - .def("getColorSpace", &ColorSpaceSet::getColorSpace, "name"_a, - DOC(ColorSpaceSet, getColorSpace)) - .def("hasColorSpace", &ColorSpaceSet::hasColorSpace, "name"_a, - DOC(ColorSpaceSet, hasColorSpace)) - .def("addColorSpace", &ColorSpaceSet::addColorSpace, "colorSpace"_a, - DOC(ColorSpaceSet, addColorSpace)) - .def("addColorSpaces", &ColorSpaceSet::addColorSpaces, "colorSpaces"_a, - DOC(ColorSpaceSet, addColorSpaces)) - .def("removeColorSpace", &ColorSpaceSet::removeColorSpace, "colorSpace"_a, - DOC(ColorSpaceSet, removeColorSpace)) - .def("removeColorSpaces", &ColorSpaceSet::removeColorSpaces, "colorSpaces"_a, - DOC(ColorSpaceSet, removeColorSpaces)) - .def("clearColorSpaces", &ColorSpaceSet::clearColorSpaces, - DOC(ColorSpaceSet, clearColorSpaces)); + .def( + "__eq__", + &ColorSpaceSet::operator==, + py::is_operator(), + DOC(ColorSpaceSet, operator, eq)) + .def( + "__ne__", + &ColorSpaceSet::operator!=, + py::is_operator(), + DOC(ColorSpaceSet, operator, ne)) + + .def( + "__sub__", + [](ConstColorSpaceSetRcPtr & self, ConstColorSpaceSetRcPtr & rcss) { + return self - rcss; + }, + py::is_operator(), + DOC(PyOpenColorIO, ConstColorSpaceSetRcPtr, operator, sub)) + .def( + "__or__", + [](ConstColorSpaceSetRcPtr & self, ConstColorSpaceSetRcPtr & rcss) { + return self || rcss; + }, + py::is_operator(), + DOC(PyOpenColorIO, ConstColorSpaceSetRcPtr, operator, lor)) + .def( + "__and__", + [](ConstColorSpaceSetRcPtr & self, ConstColorSpaceSetRcPtr & rcss) { + return self && rcss; + }, + py::is_operator(), + DOC(PyOpenColorIO, ConstColorSpaceSetRcPtr, operator, land)) + + .def( + "getColorSpaceNames", + [](ColorSpaceSetRcPtr & self) { return ColorSpaceNameIterator(self); }) + .def("getColorSpaces", [](ColorSpaceSetRcPtr & self) { return ColorSpaceIterator(self); }) + .def( + "getColorSpace", + &ColorSpaceSet::getColorSpace, + "name"_a, + DOC(ColorSpaceSet, getColorSpace)) + .def( + "hasColorSpace", + &ColorSpaceSet::hasColorSpace, + "name"_a, + DOC(ColorSpaceSet, hasColorSpace)) + .def( + "addColorSpace", + &ColorSpaceSet::addColorSpace, + "colorSpace"_a, + DOC(ColorSpaceSet, addColorSpace)) + .def( + "addColorSpaces", + &ColorSpaceSet::addColorSpaces, + "colorSpaces"_a, + DOC(ColorSpaceSet, addColorSpaces)) + .def( + "removeColorSpace", + &ColorSpaceSet::removeColorSpace, + "colorSpace"_a, + DOC(ColorSpaceSet, removeColorSpace)) + .def( + "removeColorSpaces", + &ColorSpaceSet::removeColorSpaces, + "colorSpaces"_a, + DOC(ColorSpaceSet, removeColorSpaces)) + .def( + "clearColorSpaces", + &ColorSpaceSet::clearColorSpaces, + DOC(ColorSpaceSet, clearColorSpaces)); clsColorSpaceNameIterator - .def("__len__", [](ColorSpaceNameIterator & it) - { - return it.m_obj->getNumColorSpaces(); - }) - .def("__getitem__", [](ColorSpaceNameIterator & it, int i) - { + .def("__len__", [](ColorSpaceNameIterator & it) { return it.m_obj->getNumColorSpaces(); }) + .def( + "__getitem__", + [](ColorSpaceNameIterator & it, int i) { it.checkIndex(i, it.m_obj->getNumColorSpaces()); return it.m_obj->getColorSpaceNameByIndex(i); }) - .def("__iter__", [](ColorSpaceNameIterator & it) -> ColorSpaceNameIterator & - { - return it; - }) - .def("__next__", [](ColorSpaceNameIterator & it) - { - int i = it.nextIndex(it.m_obj->getNumColorSpaces()); - return it.m_obj->getColorSpaceNameByIndex(i); - }); + .def("__iter__", [](ColorSpaceNameIterator & it) -> ColorSpaceNameIterator & { return it; }) + .def("__next__", [](ColorSpaceNameIterator & it) { + int i = it.nextIndex(it.m_obj->getNumColorSpaces()); + return it.m_obj->getColorSpaceNameByIndex(i); + }); clsColorSpaceIterator .def("__len__", [](ColorSpaceIterator & it) { return it.m_obj->getNumColorSpaces(); }) - .def("__getitem__", [](ColorSpaceIterator & it, int i) - { + .def( + "__getitem__", + [](ColorSpaceIterator & it, int i) { it.checkIndex(i, it.m_obj->getNumColorSpaces()); return it.m_obj->getColorSpaceByIndex(i); }) .def("__iter__", [](ColorSpaceIterator & it) -> ColorSpaceIterator & { return it; }) - .def("__next__", [](ColorSpaceIterator & it) - { - int i = it.nextIndex(it.m_obj->getNumColorSpaces()); - return it.m_obj->getColorSpaceByIndex(i); - }); + .def("__next__", [](ColorSpaceIterator & it) { + int i = it.nextIndex(it.m_obj->getNumColorSpaces()); + return it.m_obj->getColorSpaceByIndex(i); + }); } } // namespace OCIO_NAMESPACE diff --git a/src/bindings/python/PyConfig.cpp b/src/bindings/python/PyConfig.cpp index 675f7155ca..981d1d5d3f 100644 --- a/src/bindings/python/PyConfig.cpp +++ b/src/bindings/python/PyConfig.cpp @@ -39,38 +39,33 @@ enum ConfigIterator IT_VIRTUAL_DISPLAY_VIEW, }; -using EnvironmentVarNameIterator = PyIterator; -using SearchPathIterator = PyIterator; -using ColorSpaceNameIterator = PyIterator; -using ColorSpaceIterator = PyIterator; -using ActiveColorSpaceNameIterator = PyIterator; -using ActiveColorSpaceIterator = PyIterator; -using RoleNameIterator = PyIterator; -using RoleColorSpaceIterator = PyIterator; -using DisplayIterator = PyIterator; -using DisplayAllIterator = PyIterator; -using SharedViewIterator = PyIterator; -using VirtualViewIterator = PyIterator; -using ViewIterator = PyIterator; -using ViewForColorSpaceIterator = PyIterator; -using ViewForViewTypeIterator = PyIterator; -using LookNameIterator = PyIterator; -using LookIterator = PyIterator; -using ViewTransformNameIterator = PyIterator; -using ViewTransformIterator = PyIterator; -using NamedTransformNameIterator = PyIterator; -using NamedTransformIterator = PyIterator; +using EnvironmentVarNameIterator = PyIterator; +using SearchPathIterator = PyIterator; +using ColorSpaceNameIterator + = PyIterator; +using ColorSpaceIterator + = PyIterator; +using ActiveColorSpaceNameIterator = PyIterator; +using ActiveColorSpaceIterator = PyIterator; +using RoleNameIterator = PyIterator; +using RoleColorSpaceIterator = PyIterator; +using DisplayIterator = PyIterator; +using DisplayAllIterator = PyIterator; +using SharedViewIterator = PyIterator; +using VirtualViewIterator = PyIterator; +using ViewIterator = PyIterator; +using ViewForColorSpaceIterator + = PyIterator; +using ViewForViewTypeIterator + = PyIterator; +using LookNameIterator = PyIterator; +using LookIterator = PyIterator; +using ViewTransformNameIterator = PyIterator; +using ViewTransformIterator = PyIterator; +using NamedTransformNameIterator + = PyIterator; +using NamedTransformIterator + = PyIterator; using ActiveNamedTransformNameIterator = PyIterator; using ActiveNamedTransformIterator = PyIterator; @@ -78,1311 +73,1470 @@ using ActiveNamedTransformIterator = PyIterator( - m.attr("Config")); + auto clsConfig = py::class_(m.attr("Config")); - auto clsEnvironmentVarNameIterator = - py::class_( - clsConfig, "EnvironmentVarNameIterator"); + auto clsEnvironmentVarNameIterator + = py::class_(clsConfig, "EnvironmentVarNameIterator"); - auto clsSearchPathIterator = - py::class_( - clsConfig, "SearchPathIterator"); + auto clsSearchPathIterator = py::class_(clsConfig, "SearchPathIterator"); - auto clsColorSpaceNameIterator = - py::class_( - clsConfig, "ColorSpaceNameIterator"); + auto clsColorSpaceNameIterator + = py::class_(clsConfig, "ColorSpaceNameIterator"); - auto clsColorSpaceIterator = - py::class_( - clsConfig, "ColorSpaceIterator"); + auto clsColorSpaceIterator = py::class_(clsConfig, "ColorSpaceIterator"); - auto clsActiveColorSpaceNameIterator = - py::class_( - clsConfig, "ActiveColorSpaceNameIterator"); + auto clsActiveColorSpaceNameIterator + = py::class_(clsConfig, "ActiveColorSpaceNameIterator"); - auto clsActiveColorSpaceIterator = - py::class_( - clsConfig, "ActiveColorSpaceIterator"); + auto clsActiveColorSpaceIterator + = py::class_(clsConfig, "ActiveColorSpaceIterator"); - auto clsRoleNameIterator = - py::class_( - clsConfig, "RoleNameIterator"); + auto clsRoleNameIterator = py::class_(clsConfig, "RoleNameIterator"); - auto clsRoleColorSpaceIterator = - py::class_( - clsConfig, "RoleColorSpaceIterator"); + auto clsRoleColorSpaceIterator + = py::class_(clsConfig, "RoleColorSpaceIterator"); - auto clsDisplayIterator = - py::class_( - clsConfig, "DisplayIterator"); + auto clsDisplayIterator = py::class_(clsConfig, "DisplayIterator"); - auto clsDisplayAllIterator = - py::class_( - clsConfig, "DisplayAllIterator"); + auto clsDisplayAllIterator = py::class_(clsConfig, "DisplayAllIterator"); - auto clsSharedViewIterator = - py::class_( - clsConfig, "SharedViewIterator"); + auto clsSharedViewIterator = py::class_(clsConfig, "SharedViewIterator"); - auto clsVirtualViewIterator = - py::class_( - clsConfig, "VirtualViewIterator"); + auto clsVirtualViewIterator = py::class_(clsConfig, "VirtualViewIterator"); - auto clsViewIterator = - py::class_( - clsConfig, "ViewIterator"); + auto clsViewIterator = py::class_(clsConfig, "ViewIterator"); - auto clsViewForColorSpaceIterator = - py::class_( - clsConfig, "ViewForColorSpaceIterator"); + auto clsViewForColorSpaceIterator + = py::class_(clsConfig, "ViewForColorSpaceIterator"); - auto clsViewForViewTypeIterator = - py::class_( - clsConfig, "ViewForViewTypeIterator"); + auto clsViewForViewTypeIterator + = py::class_(clsConfig, "ViewForViewTypeIterator"); - auto clsLookNameIterator = - py::class_( - clsConfig, "LookNameIterator"); + auto clsLookNameIterator = py::class_(clsConfig, "LookNameIterator"); - auto clsLookIterator = - py::class_( - clsConfig, "LookIterator"); + auto clsLookIterator = py::class_(clsConfig, "LookIterator"); - auto clsViewTransformNameIterator = - py::class_( - clsConfig, "ViewTransformNameIterator"); + auto clsViewTransformNameIterator + = py::class_(clsConfig, "ViewTransformNameIterator"); - auto clsViewTransformIterator = - py::class_( - clsConfig, "ViewTransformIterator"); + auto clsViewTransformIterator + = py::class_(clsConfig, "ViewTransformIterator"); - auto clsNamedTransformNameIterator = - py::class_( - clsConfig, "NamedTransformNameIterator"); + auto clsNamedTransformNameIterator + = py::class_(clsConfig, "NamedTransformNameIterator"); - auto clsNamedTransformIterator = - py::class_( - clsConfig, "NamedTransformIterator"); + auto clsNamedTransformIterator + = py::class_(clsConfig, "NamedTransformIterator"); - auto clsActiveNamedTransformNameIterator = - py::class_( - clsConfig, "ActiveNamedTransformNameIterator"); + auto clsActiveNamedTransformNameIterator = py::class_( + clsConfig, + "ActiveNamedTransformNameIterator"); - auto clsActiveNamedTransformIterator = - py::class_( - clsConfig, "ActiveNamedTransformIterator"); + auto clsActiveNamedTransformIterator + = py::class_(clsConfig, "ActiveNamedTransformIterator"); clsConfig - .def(py::init(&Config::Create), - DOC(Config, Create)) + .def(py::init(&Config::Create), DOC(Config, Create)) - .def("__deepcopy__", [](const ConstConfigRcPtr & self, py::dict) - { - return self->createEditableCopy(); - }, + .def( + "__deepcopy__", + [](const ConstConfigRcPtr & self, py::dict) { return self->createEditableCopy(); }, "memo"_a) - .def_static("CreateRaw", &Config::CreateRaw, - DOC(Config, CreateRaw)) - .def_static("CreateFromEnv", &Config::CreateFromEnv, - DOC(Config, CreateFromEnv)) - .def_static("CreateFromFile", &Config::CreateFromFile, "fileName"_a, - DOC(Config, CreateFromFile)) - .def_static("CreateFromStream", [](const std::string & str) - { + .def_static("CreateRaw", &Config::CreateRaw, DOC(Config, CreateRaw)) + .def_static("CreateFromEnv", &Config::CreateFromEnv, DOC(Config, CreateFromEnv)) + .def_static( + "CreateFromFile", + &Config::CreateFromFile, + "fileName"_a, + DOC(Config, CreateFromFile)) + .def_static( + "CreateFromStream", + [](const std::string & str) { std::istringstream is(str); return Config::CreateFromStream(is); - }, - "str"_a, - DOC(Config, CreateFromStream)) - - .def_static("CreateFromBuiltinConfig", &Config::CreateFromBuiltinConfig, - DOC(Config, CreateFromBuiltinConfig)) - .def_static("CreateFromConfigIOProxy", &Config::CreateFromConfigIOProxy, - DOC(Config, CreateFromConfigIOProxy)) - .def("getMajorVersion", &Config::getMajorVersion, - DOC(Config, getMajorVersion)) - .def("setMajorVersion", &Config::setMajorVersion, "major"_a, - DOC(Config, setMajorVersion)) - .def("getMinorVersion", &Config::getMinorVersion, - DOC(Config, getMinorVersion)) - .def("setMinorVersion", &Config::setMinorVersion, "minor"_a, - DOC(Config, setMinorVersion)) - .def("setVersion", &Config::setVersion, "major"_a, "minor"_a, - DOC(Config, setVersion)) - .def("upgradeToLatestVersion", &Config::upgradeToLatestVersion, - DOC(Config, upgradeToLatestVersion)) - .def("validate", &Config::validate, - DOC(Config, validate)) - .def("getName", &Config::getName, - DOC(Config, getName)) - .def("setName", &Config::setName, "name"_a.none(false), - DOC(Config, setName)) - .def("getFamilySeparator", &Config::getFamilySeparator, - DOC(Config, getFamilySeparator)) - .def("setFamilySeparator", &Config::setFamilySeparator, "separator"_a, - DOC(Config, setFamilySeparator)) - .def("getDescription", &Config::getDescription, - DOC(Config, getDescription)) - .def("setDescription", &Config::setDescription, "description"_a, - DOC(Config, setDescription)) - .def("serialize", [](ConfigRcPtr & self, const std::string & fileName) - { + }, + "str"_a, + DOC(Config, CreateFromStream)) + + .def_static( + "CreateFromBuiltinConfig", + &Config::CreateFromBuiltinConfig, + DOC(Config, CreateFromBuiltinConfig)) + .def_static( + "CreateFromConfigIOProxy", + &Config::CreateFromConfigIOProxy, + DOC(Config, CreateFromConfigIOProxy)) + .def("getMajorVersion", &Config::getMajorVersion, DOC(Config, getMajorVersion)) + .def("setMajorVersion", &Config::setMajorVersion, "major"_a, DOC(Config, setMajorVersion)) + .def("getMinorVersion", &Config::getMinorVersion, DOC(Config, getMinorVersion)) + .def("setMinorVersion", &Config::setMinorVersion, "minor"_a, DOC(Config, setMinorVersion)) + .def("setVersion", &Config::setVersion, "major"_a, "minor"_a, DOC(Config, setVersion)) + .def( + "upgradeToLatestVersion", + &Config::upgradeToLatestVersion, + DOC(Config, upgradeToLatestVersion)) + .def("validate", &Config::validate, DOC(Config, validate)) + .def("getName", &Config::getName, DOC(Config, getName)) + .def("setName", &Config::setName, "name"_a.none(false), DOC(Config, setName)) + .def("getFamilySeparator", &Config::getFamilySeparator, DOC(Config, getFamilySeparator)) + .def( + "setFamilySeparator", + &Config::setFamilySeparator, + "separator"_a, + DOC(Config, setFamilySeparator)) + .def("getDescription", &Config::getDescription, DOC(Config, getDescription)) + .def( + "setDescription", + &Config::setDescription, + "description"_a, + DOC(Config, setDescription)) + .def( + "serialize", + [](ConfigRcPtr & self, const std::string & fileName) { std::ofstream f(fileName.c_str()); self->serialize(f); f.close(); - }, - "fileName"_a) - .def("serialize", [](ConfigRcPtr & self) - { + }, + "fileName"_a) + .def( + "serialize", + [](ConfigRcPtr & self) { std::ostringstream os; self->serialize(os); return os.str(); - }, - DOC(Config, serialize)) - .def("getCacheID", (const char * (Config::*)() const) &Config::getCacheID, - DOC(Config, getCacheID)) - .def("getCacheID", - (const char * (Config::*)(const ConstContextRcPtr &) const) &Config::getCacheID, - "context"_a, - DOC(Config, getCacheID)) + }, + DOC(Config, serialize)) + .def( + "getCacheID", + (const char * (Config::*)() const) & Config::getCacheID, + DOC(Config, getCacheID)) + .def( + "getCacheID", + (const char * (Config::*)(const ConstContextRcPtr &) const) & Config::getCacheID, + "context"_a, + DOC(Config, getCacheID)) // Resources - .def("getCurrentContext", &Config::getCurrentContext, - DOC(Config, getCurrentContext)) - .def("addEnvironmentVar", &Config::addEnvironmentVar, "name"_a, "defaultValue"_a, - DOC(Config, addEnvironmentVar)) - .def("getEnvironmentVarNames", [](ConfigRcPtr & self) - { - return EnvironmentVarNameIterator(self); - }) - .def("getEnvironmentVarDefault", &Config::getEnvironmentVarDefault, "name"_a, - DOC(Config, getEnvironmentVarDefault)) - .def("clearEnvironmentVars", &Config::clearEnvironmentVars, - DOC(Config, clearEnvironmentVars)) - .def("setEnvironmentMode", &Config::setEnvironmentMode, "mode"_a, - DOC(Config, setEnvironmentMode)) - .def("getEnvironmentMode", &Config::getEnvironmentMode, - DOC(Config, getEnvironmentMode)) - .def("loadEnvironment", &Config::loadEnvironment, - DOC(Config, loadEnvironment)) - .def("getSearchPath", (const char * (Config::*)() const) &Config::getSearchPath, - DOC(Config, getSearchPath)) - .def("setSearchPath", &Config::setSearchPath, "path"_a, - DOC(Config, setSearchPath)) - .def("getSearchPaths", [](ConfigRcPtr & self) - { - return SearchPathIterator(self); - }) - .def("clearSearchPaths", &Config::clearSearchPaths, - DOC(Config, clearSearchPaths)) - .def("addSearchPath", &Config::addSearchPath, "path"_a, - DOC(Config, addSearchPath)) - .def("getWorkingDir", &Config::getWorkingDir, - DOC(Config, getWorkingDir)) - .def("setWorkingDir", &Config::setWorkingDir, "dirName"_a, - DOC(Config, setWorkingDir)) + .def("getCurrentContext", &Config::getCurrentContext, DOC(Config, getCurrentContext)) + .def( + "addEnvironmentVar", + &Config::addEnvironmentVar, + "name"_a, + "defaultValue"_a, + DOC(Config, addEnvironmentVar)) + .def( + "getEnvironmentVarNames", + [](ConfigRcPtr & self) { return EnvironmentVarNameIterator(self); }) + .def( + "getEnvironmentVarDefault", + &Config::getEnvironmentVarDefault, + "name"_a, + DOC(Config, getEnvironmentVarDefault)) + .def( + "clearEnvironmentVars", + &Config::clearEnvironmentVars, + DOC(Config, clearEnvironmentVars)) + .def( + "setEnvironmentMode", + &Config::setEnvironmentMode, + "mode"_a, + DOC(Config, setEnvironmentMode)) + .def("getEnvironmentMode", &Config::getEnvironmentMode, DOC(Config, getEnvironmentMode)) + .def("loadEnvironment", &Config::loadEnvironment, DOC(Config, loadEnvironment)) + .def( + "getSearchPath", + (const char * (Config::*)() const) & Config::getSearchPath, + DOC(Config, getSearchPath)) + .def("setSearchPath", &Config::setSearchPath, "path"_a, DOC(Config, setSearchPath)) + .def("getSearchPaths", [](ConfigRcPtr & self) { return SearchPathIterator(self); }) + .def("clearSearchPaths", &Config::clearSearchPaths, DOC(Config, clearSearchPaths)) + .def("addSearchPath", &Config::addSearchPath, "path"_a, DOC(Config, addSearchPath)) + .def("getWorkingDir", &Config::getWorkingDir, DOC(Config, getWorkingDir)) + .def("setWorkingDir", &Config::setWorkingDir, "dirName"_a, DOC(Config, setWorkingDir)) // ColorSpaces - .def("getColorSpaces", &Config::getColorSpaces, "category"_a, - DOC(Config, getColorSpaces)) - .def("getColorSpace", &Config::getColorSpace, "name"_a, - DOC(Config, getColorSpace)) - .def("getColorSpaceNames", [](ConfigRcPtr & self, - SearchReferenceSpaceType searchReferenceType, - ColorSpaceVisibility visibility) - { + .def("getColorSpaces", &Config::getColorSpaces, "category"_a, DOC(Config, getColorSpaces)) + .def("getColorSpace", &Config::getColorSpace, "name"_a, DOC(Config, getColorSpace)) + .def( + "getColorSpaceNames", + [](ConfigRcPtr & self, + SearchReferenceSpaceType searchReferenceType, + ColorSpaceVisibility visibility) { return ColorSpaceNameIterator(self, searchReferenceType, visibility); }, - "searchReferenceType"_a, "visibility"_a) - .def("getColorSpaces", [](ConfigRcPtr & self, - SearchReferenceSpaceType searchReferenceType, - ColorSpaceVisibility visibility) - { + "searchReferenceType"_a, + "visibility"_a) + .def( + "getColorSpaces", + [](ConfigRcPtr & self, + SearchReferenceSpaceType searchReferenceType, + ColorSpaceVisibility visibility) { return ColorSpaceIterator(self, searchReferenceType, visibility); }, - "searchReferenceType"_a, "visibility"_a) - .def("getColorSpaceNames", [](ConfigRcPtr & self) - { - return ActiveColorSpaceNameIterator(self); - }) - .def("getColorSpaces", [](ConfigRcPtr & self) - { - return ActiveColorSpaceIterator(self); - }) - .def("getCanonicalName", &Config::getCanonicalName, "name"_a, - DOC(Config, getCanonicalName)) - .def("addColorSpace", &Config::addColorSpace, "colorSpace"_a, - DOC(Config, addColorSpace)) - .def("removeColorSpace", &Config::removeColorSpace, "name"_a, - DOC(Config, removeColorSpace)) - .def("isColorSpaceLinear", &Config::isColorSpaceLinear, "colorSpace"_a, "referenceSpaceType"_a, - DOC(Config, isColorSpaceLinear)) - .def("isColorSpaceUsed", &Config::isColorSpaceUsed, "name"_a, - DOC(Config, isColorSpaceUsed)) - .def("clearColorSpaces", &Config::clearColorSpaces, - DOC(Config, clearColorSpaces)) - .def("parseColorSpaceFromString", &Config::parseColorSpaceFromString, "str"_a, - DOC(Config, parseColorSpaceFromString)) - .def("isStrictParsingEnabled", &Config::isStrictParsingEnabled, - DOC(Config, isStrictParsingEnabled)) - .def("setStrictParsingEnabled", &Config::setStrictParsingEnabled, "enabled"_a, - DOC(Config, setStrictParsingEnabled)) - .def("setInactiveColorSpaces", &Config::setInactiveColorSpaces, "inactiveColorSpaces"_a, - DOC(Config, setInactiveColorSpaces)) - .def("getInactiveColorSpaces", &Config::getInactiveColorSpaces, - DOC(Config, getInactiveColorSpaces)) - .def("isInactiveColorSpace", &Config::isInactiveColorSpace, "colorspace"_a, - DOC(Config, isInactiveColorSpace)) - .def_static("IdentifyBuiltinColorSpace", [](const ConstConfigRcPtr & srcConfig, - const ConstConfigRcPtr & builtinConfig, - const char * builtinColorSpaceName) - { - return Config::IdentifyBuiltinColorSpace(srcConfig, - builtinConfig, - builtinColorSpaceName); + "searchReferenceType"_a, + "visibility"_a) + .def( + "getColorSpaceNames", + [](ConfigRcPtr & self) { return ActiveColorSpaceNameIterator(self); }) + .def("getColorSpaces", [](ConfigRcPtr & self) { return ActiveColorSpaceIterator(self); }) + .def("getCanonicalName", &Config::getCanonicalName, "name"_a, DOC(Config, getCanonicalName)) + .def("addColorSpace", &Config::addColorSpace, "colorSpace"_a, DOC(Config, addColorSpace)) + .def("removeColorSpace", &Config::removeColorSpace, "name"_a, DOC(Config, removeColorSpace)) + .def( + "isColorSpaceLinear", + &Config::isColorSpaceLinear, + "colorSpace"_a, + "referenceSpaceType"_a, + DOC(Config, isColorSpaceLinear)) + .def("isColorSpaceUsed", &Config::isColorSpaceUsed, "name"_a, DOC(Config, isColorSpaceUsed)) + .def("clearColorSpaces", &Config::clearColorSpaces, DOC(Config, clearColorSpaces)) + .def( + "parseColorSpaceFromString", + &Config::parseColorSpaceFromString, + "str"_a, + DOC(Config, parseColorSpaceFromString)) + .def( + "isStrictParsingEnabled", + &Config::isStrictParsingEnabled, + DOC(Config, isStrictParsingEnabled)) + .def( + "setStrictParsingEnabled", + &Config::setStrictParsingEnabled, + "enabled"_a, + DOC(Config, setStrictParsingEnabled)) + .def( + "setInactiveColorSpaces", + &Config::setInactiveColorSpaces, + "inactiveColorSpaces"_a, + DOC(Config, setInactiveColorSpaces)) + .def( + "getInactiveColorSpaces", + &Config::getInactiveColorSpaces, + DOC(Config, getInactiveColorSpaces)) + .def( + "isInactiveColorSpace", + &Config::isInactiveColorSpace, + "colorspace"_a, + DOC(Config, isInactiveColorSpace)) + .def_static( + "IdentifyBuiltinColorSpace", + [](const ConstConfigRcPtr & srcConfig, + const ConstConfigRcPtr & builtinConfig, + const char * builtinColorSpaceName) { + return Config::IdentifyBuiltinColorSpace( + srcConfig, + builtinConfig, + builtinColorSpaceName); }, - "srcConfig"_a, "builtinConfig"_a, "builtinColorSpaceName"_a, - DOC(Config, IdentifyBuiltinColorSpace)) - - .def_static("IdentifyInterchangeSpace", [](const ConstConfigRcPtr & srcConfig, - const char * srcColorSpaceName, - const ConstConfigRcPtr & builtinConfig, - const char * builtinColorSpaceName) - { - const char * srcInterchangePtr = nullptr; + "srcConfig"_a, + "builtinConfig"_a, + "builtinColorSpaceName"_a, + DOC(Config, IdentifyBuiltinColorSpace)) + + .def_static( + "IdentifyInterchangeSpace", + [](const ConstConfigRcPtr & srcConfig, + const char * srcColorSpaceName, + const ConstConfigRcPtr & builtinConfig, + const char * builtinColorSpaceName) { + const char * srcInterchangePtr = nullptr; const char * builtinInterchangePtr = nullptr; - Config::IdentifyInterchangeSpace(&srcInterchangePtr, - &builtinInterchangePtr, - srcConfig, - srcColorSpaceName, - builtinConfig, - builtinColorSpaceName); + Config::IdentifyInterchangeSpace( + &srcInterchangePtr, + &builtinInterchangePtr, + srcConfig, + srcColorSpaceName, + builtinConfig, + builtinColorSpaceName); // Return the tuple by value which copies the strings values. - return std::make_tuple(std::string(srcInterchangePtr), std::string(builtinInterchangePtr)); + return std::make_tuple( + std::string(srcInterchangePtr), + std::string(builtinInterchangePtr)); }, - "srcConfig"_a, "srcColorSpaceName"_a, "builtinConfig"_a, "builtinColorSpaceName"_a, - DOC(Config, IdentifyInterchangeSpace)) + "srcConfig"_a, + "srcColorSpaceName"_a, + "builtinConfig"_a, + "builtinColorSpaceName"_a, + DOC(Config, IdentifyInterchangeSpace)) // Roles - .def("setRole", &Config::setRole, "role"_a, "colorSpaceName"_a, - DOC(Config, setRole)) - .def("hasRole", &Config::hasRole, "role"_a, - DOC(Config, hasRole)) - .def("getRoleNames", [](ConfigRcPtr & self) - { - return RoleNameIterator(self); - }) - .def("getRoles", [](ConfigRcPtr & self) - { - return RoleColorSpaceIterator(self); - }) - .def("getRoleColorSpace", - (const char * (Config::*)(const char *) const) &Config::getRoleColorSpace, - "roleName"_a, - DOC(Config, getRoleColorSpace)) + .def("setRole", &Config::setRole, "role"_a, "colorSpaceName"_a, DOC(Config, setRole)) + .def("hasRole", &Config::hasRole, "role"_a, DOC(Config, hasRole)) + .def("getRoleNames", [](ConfigRcPtr & self) { return RoleNameIterator(self); }) + .def("getRoles", [](ConfigRcPtr & self) { return RoleColorSpaceIterator(self); }) + .def( + "getRoleColorSpace", + (const char * (Config::*)(const char *) const) & Config::getRoleColorSpace, + "roleName"_a, + DOC(Config, getRoleColorSpace)) // Display/View Registration - .def("addSharedView", - (void (Config::*)(const char *, - const char *, - const char *, - const char *, - const char *, - const char *)) &Config::addSharedView, - "view"_a, "viewTransformName"_a, "colorSpaceName"_a, - "looks"_a = "", - "ruleName"_a = "", - "description"_a = "", - DOC(Config, addSharedView)) - .def("removeSharedView", &Config::removeSharedView, "view"_a, - DOC(Config, removeSharedView)) - .def("getSharedViews", [](ConfigRcPtr & self) - { - return SharedViewIterator(self); - }) - .def("getDefaultDisplay", &Config::getDefaultDisplay, - DOC(Config, getDefaultDisplay)) - .def("getDisplays", [](ConfigRcPtr & self) - { - return DisplayIterator(self); - }) - .def("getDisplaysAll", [](ConfigRcPtr & self) - { - return DisplayAllIterator(self); - }) - .def("getDefaultView", - (const char * (Config::*)(const char *) const) - &Config::getDefaultView, "display"_a, - DOC(Config, getDefaultView)) - .def("getDefaultView", - (const char * (Config::*)(const char *, const char *) const) - &Config::getDefaultView, "display"_a, "colorSpacename"_a, - DOC(Config, getDefaultView)) - .def("getViews", [](ConfigRcPtr & self, const std::string & display) - { - return ViewIterator(self, display); - }, - "display"_a) - .def("getViews", [](ConfigRcPtr & self, ViewType type, const std::string & display) - { - return ViewForViewTypeIterator(self, type, display); - }, - "type"_a, "display"_a) - .def("getViews", [](ConfigRcPtr & self, - const std::string & display, - const std::string & colorSpaceName) - { - return ViewForColorSpaceIterator(self, display, colorSpaceName); - }, - "display"_a, "colorSpaceName"_a) - .def("getDisplayViewTransformName", &Config::getDisplayViewTransformName, - "display"_a, "view"_a, - DOC(Config, getDisplayViewTransformName)) - .def("getDisplayViewColorSpaceName", &Config::getDisplayViewColorSpaceName, - "display"_a, "view"_a, - DOC(Config, getDisplayViewColorSpaceName)) - .def("getDisplayViewLooks", &Config::getDisplayViewLooks, "display"_a, "view"_a, - DOC(Config, getDisplayViewLooks)) - .def("getDisplayViewRule", &Config::getDisplayViewRule, "display"_a, "view"_a, - DOC(Config, getDisplayViewRule)) - .def("getDisplayViewDescription", &Config::getDisplayViewDescription, - "display"_a, "view"_a, - DOC(Config, getDisplayViewDescription)) - .def("addDisplayView", - (void (Config::*)(const char *, const char *, const char *, const char *)) - &Config::addDisplayView, - "display"_a, "view"_a, "colorSpaceName"_a, - "looks"_a = "", - DOC(Config, addDisplayView)) - .def("addDisplayView", - (void (Config::*)(const char *, - const char *, - const char *, - const char *, - const char *, - const char *, - const char *)) &Config::addDisplayView, - "display"_a, "view"_a, "viewTransform"_a, "displayColorSpaceName"_a, - "looks"_a = "", - "ruleName"_a = "", - "description"_a = "", - DOC(Config, addDisplayView)) - .def("addDisplaySharedView", &Config::addDisplaySharedView, "display"_a, "view"_a, - DOC(Config, addDisplaySharedView)) - .def("removeDisplayView", &Config::removeDisplayView, "display"_a, "view"_a, - DOC(Config, removeDisplayView)) - .def("clearDisplays", &Config::clearDisplays, - DOC(Config, clearDisplays)) + .def( + "addSharedView", + (void(Config::*)( + const char *, + const char *, + const char *, + const char *, + const char *, + const char *)) + & Config::addSharedView, + "view"_a, + "viewTransformName"_a, + "colorSpaceName"_a, + "looks"_a = "", + "ruleName"_a = "", + "description"_a = "", + DOC(Config, addSharedView)) + .def("removeSharedView", &Config::removeSharedView, "view"_a, DOC(Config, removeSharedView)) + .def("getSharedViews", [](ConfigRcPtr & self) { return SharedViewIterator(self); }) + .def("getDefaultDisplay", &Config::getDefaultDisplay, DOC(Config, getDefaultDisplay)) + .def("getDisplays", [](ConfigRcPtr & self) { return DisplayIterator(self); }) + .def("getDisplaysAll", [](ConfigRcPtr & self) { return DisplayAllIterator(self); }) + .def( + "getDefaultView", + (const char * (Config::*)(const char *) const) & Config::getDefaultView, + "display"_a, + DOC(Config, getDefaultView)) + .def( + "getDefaultView", + (const char * (Config::*)(const char *, const char *) const) & Config::getDefaultView, + "display"_a, + "colorSpacename"_a, + DOC(Config, getDefaultView)) + .def( + "getViews", + [](ConfigRcPtr & self, const std::string & display) { + return ViewIterator(self, display); + }, + "display"_a) + .def( + "getViews", + [](ConfigRcPtr & self, ViewType type, const std::string & display) { + return ViewForViewTypeIterator(self, type, display); + }, + "type"_a, + "display"_a) + .def( + "getViews", + [](ConfigRcPtr & self, + const std::string & display, + const std::string & colorSpaceName) { + return ViewForColorSpaceIterator(self, display, colorSpaceName); + }, + "display"_a, + "colorSpaceName"_a) + .def( + "getDisplayViewTransformName", + &Config::getDisplayViewTransformName, + "display"_a, + "view"_a, + DOC(Config, getDisplayViewTransformName)) + .def( + "getDisplayViewColorSpaceName", + &Config::getDisplayViewColorSpaceName, + "display"_a, + "view"_a, + DOC(Config, getDisplayViewColorSpaceName)) + .def( + "getDisplayViewLooks", + &Config::getDisplayViewLooks, + "display"_a, + "view"_a, + DOC(Config, getDisplayViewLooks)) + .def( + "getDisplayViewRule", + &Config::getDisplayViewRule, + "display"_a, + "view"_a, + DOC(Config, getDisplayViewRule)) + .def( + "getDisplayViewDescription", + &Config::getDisplayViewDescription, + "display"_a, + "view"_a, + DOC(Config, getDisplayViewDescription)) + .def( + "addDisplayView", + (void(Config::*)(const char *, const char *, const char *, const char *)) + & Config::addDisplayView, + "display"_a, + "view"_a, + "colorSpaceName"_a, + "looks"_a = "", + DOC(Config, addDisplayView)) + .def( + "addDisplayView", + (void(Config::*)( + const char *, + const char *, + const char *, + const char *, + const char *, + const char *, + const char *)) + & Config::addDisplayView, + "display"_a, + "view"_a, + "viewTransform"_a, + "displayColorSpaceName"_a, + "looks"_a = "", + "ruleName"_a = "", + "description"_a = "", + DOC(Config, addDisplayView)) + .def( + "addDisplaySharedView", + &Config::addDisplaySharedView, + "display"_a, + "view"_a, + DOC(Config, addDisplaySharedView)) + .def( + "removeDisplayView", + &Config::removeDisplayView, + "display"_a, + "view"_a, + DOC(Config, removeDisplayView)) + .def("clearDisplays", &Config::clearDisplays, DOC(Config, clearDisplays)) // Virtual Display - .def("addVirtualDisplayView", &Config::addVirtualDisplayView, - "view"_a, "viewTransformName"_a, "colorSpaceName"_a, - "looks"_a = "", - "ruleName"_a = "", - "description"_a = "", - DOC(Config, addVirtualDisplayView)) - .def("addVirtualDisplaySharedView", &Config::addVirtualDisplaySharedView, "sharedView"_a, - DOC(Config, addVirtualDisplaySharedView)) - .def("getVirtualDisplayViews", [](ConfigRcPtr & self, ViewType type) - { - return VirtualViewIterator(self, type); - }, - "display"_a) - .def("getVirtualDisplayViewTransformName", &Config::getVirtualDisplayViewTransformName, - "view"_a, - DOC(Config, getVirtualDisplayViewTransformName)) - .def("getVirtualDisplayViewColorSpaceName", &Config::getVirtualDisplayViewColorSpaceName, - "view"_a, - DOC(Config, getVirtualDisplayViewColorSpaceName)) - .def("getVirtualDisplayViewLooks", &Config::getVirtualDisplayViewLooks, "view"_a, - DOC(Config, getVirtualDisplayViewLooks)) - .def("getVirtualDisplayViewRule", &Config::getVirtualDisplayViewRule, "view"_a, - DOC(Config, getVirtualDisplayViewRule)) - .def("getVirtualDisplayViewDescription", &Config::getVirtualDisplayViewDescription, - "view"_a, - DOC(Config, getVirtualDisplayViewDescription)) - .def("removeVirtualDisplayView", &Config::removeVirtualDisplayView, "view"_a, - DOC(Config, removeVirtualDisplayView)) - .def("clearVirtualDisplay", &Config::clearVirtualDisplay, - DOC(Config, clearVirtualDisplay)) - .def("instantiateDisplayFromMonitorName", &Config::instantiateDisplayFromMonitorName, - "monitorName"_a, - DOC(Config, instantiateDisplayFromMonitorName)) - .def("instantiateDisplayFromICCProfile", &Config::instantiateDisplayFromICCProfile, - "ICCProfileFilepath"_a, - DOC(Config, instantiateDisplayFromICCProfile)) - .def("isDisplayTemporary", [](ConfigRcPtr & self, const std::string & display) -> bool - { - for (int i = 0; i < self->getNumDisplaysAll(); i++) - { - std::string other(self->getDisplayAll(i)); - if (StringUtils::Compare(display, other)) - { - return self->isDisplayTemporary(i); - } - } - return false; - }, - "display"_a) + .def( + "addVirtualDisplayView", + &Config::addVirtualDisplayView, + "view"_a, + "viewTransformName"_a, + "colorSpaceName"_a, + "looks"_a = "", + "ruleName"_a = "", + "description"_a = "", + DOC(Config, addVirtualDisplayView)) + .def( + "addVirtualDisplaySharedView", + &Config::addVirtualDisplaySharedView, + "sharedView"_a, + DOC(Config, addVirtualDisplaySharedView)) + .def( + "getVirtualDisplayViews", + [](ConfigRcPtr & self, ViewType type) { return VirtualViewIterator(self, type); }, + "display"_a) + .def( + "getVirtualDisplayViewTransformName", + &Config::getVirtualDisplayViewTransformName, + "view"_a, + DOC(Config, getVirtualDisplayViewTransformName)) + .def( + "getVirtualDisplayViewColorSpaceName", + &Config::getVirtualDisplayViewColorSpaceName, + "view"_a, + DOC(Config, getVirtualDisplayViewColorSpaceName)) + .def( + "getVirtualDisplayViewLooks", + &Config::getVirtualDisplayViewLooks, + "view"_a, + DOC(Config, getVirtualDisplayViewLooks)) + .def( + "getVirtualDisplayViewRule", + &Config::getVirtualDisplayViewRule, + "view"_a, + DOC(Config, getVirtualDisplayViewRule)) + .def( + "getVirtualDisplayViewDescription", + &Config::getVirtualDisplayViewDescription, + "view"_a, + DOC(Config, getVirtualDisplayViewDescription)) + .def( + "removeVirtualDisplayView", + &Config::removeVirtualDisplayView, + "view"_a, + DOC(Config, removeVirtualDisplayView)) + .def("clearVirtualDisplay", &Config::clearVirtualDisplay, DOC(Config, clearVirtualDisplay)) + .def( + "instantiateDisplayFromMonitorName", + &Config::instantiateDisplayFromMonitorName, + "monitorName"_a, + DOC(Config, instantiateDisplayFromMonitorName)) + .def( + "instantiateDisplayFromICCProfile", + &Config::instantiateDisplayFromICCProfile, + "ICCProfileFilepath"_a, + DOC(Config, instantiateDisplayFromICCProfile)) + .def( + "isDisplayTemporary", + [](ConfigRcPtr & self, const std::string & display) -> bool { + for (int i = 0; i < self->getNumDisplaysAll(); i++) + { + std::string other(self->getDisplayAll(i)); + if (StringUtils::Compare(display, other)) + { + return self->isDisplayTemporary(i); + } + } + return false; + }, + "display"_a) // Active Displays and Views - .def("setActiveDisplays", &Config::setActiveDisplays, "displays"_a, - DOC(Config, setActiveDisplays)) - .def("getActiveDisplays", &Config::getActiveDisplays, - DOC(Config, getActiveDisplays)) - .def("setActiveViews", &Config::setActiveViews, "views"_a, - DOC(Config, setActiveViews)) - .def("getActiveViews", &Config::getActiveViews, - DOC(Config, getActiveViews)) + .def( + "setActiveDisplays", + &Config::setActiveDisplays, + "displays"_a, + DOC(Config, setActiveDisplays)) + .def("getActiveDisplays", &Config::getActiveDisplays, DOC(Config, getActiveDisplays)) + .def("setActiveViews", &Config::setActiveViews, "views"_a, DOC(Config, setActiveViews)) + .def("getActiveViews", &Config::getActiveViews, DOC(Config, getActiveViews)) // Luma - .def("getDefaultLumaCoefs", [](ConfigRcPtr & self) - { + .def( + "getDefaultLumaCoefs", + [](ConfigRcPtr & self) { std::array rgb; self->getDefaultLumaCoefs(rgb.data()); return rgb; - }, - DOC(Config, getDefaultLumaCoefs)) - .def("setDefaultLumaCoefs", [](ConfigRcPtr & self, const std::array & rgb) - { + }, + DOC(Config, getDefaultLumaCoefs)) + .def( + "setDefaultLumaCoefs", + [](ConfigRcPtr & self, const std::array & rgb) { self->setDefaultLumaCoefs(rgb.data()); - }, - "rgb"_a, - DOC(Config, setDefaultLumaCoefs)) + }, + "rgb"_a, + DOC(Config, setDefaultLumaCoefs)) // Look - .def("getLook", &Config::getLook, "name"_a, - DOC(Config, getLook)) - .def("getLookNames", [](ConfigRcPtr & self) - { - return LookNameIterator(self); - }) - .def("getLooks", [](ConfigRcPtr & self) - { - return LookIterator(self); - }) - .def("addLook", &Config::addLook, "look"_a, - DOC(Config, addLook)) - .def("clearLooks", &Config::clearLooks, - DOC(Config, clearLooks)) + .def("getLook", &Config::getLook, "name"_a, DOC(Config, getLook)) + .def("getLookNames", [](ConfigRcPtr & self) { return LookNameIterator(self); }) + .def("getLooks", [](ConfigRcPtr & self) { return LookIterator(self); }) + .def("addLook", &Config::addLook, "look"_a, DOC(Config, addLook)) + .def("clearLooks", &Config::clearLooks, DOC(Config, clearLooks)) // View Transforms - .def("getViewTransform", &Config::getViewTransform, "name"_a, - DOC(Config, getViewTransform)) - .def("getViewTransformNames", [](ConfigRcPtr & self) - { - return ViewTransformNameIterator(self); - }) - .def("getViewTransforms", [](ConfigRcPtr & self) - { - return ViewTransformIterator(self); - }) - .def("addViewTransform", &Config::addViewTransform, "viewTransform"_a, - DOC(Config, addViewTransform)) - .def("getDefaultSceneToDisplayViewTransform", - &Config::getDefaultSceneToDisplayViewTransform, - DOC(Config, getDefaultSceneToDisplayViewTransform)) - .def("getDefaultViewTransformName", + .def("getViewTransform", &Config::getViewTransform, "name"_a, DOC(Config, getViewTransform)) + .def( + "getViewTransformNames", + [](ConfigRcPtr & self) { return ViewTransformNameIterator(self); }) + .def("getViewTransforms", [](ConfigRcPtr & self) { return ViewTransformIterator(self); }) + .def( + "addViewTransform", + &Config::addViewTransform, + "viewTransform"_a, + DOC(Config, addViewTransform)) + .def( + "getDefaultSceneToDisplayViewTransform", + &Config::getDefaultSceneToDisplayViewTransform, + DOC(Config, getDefaultSceneToDisplayViewTransform)) + .def( + "getDefaultViewTransformName", &Config::getDefaultViewTransformName, DOC(Config, getDefaultViewTransformName)) - .def("setDefaultViewTransformName", - &Config::setDefaultViewTransformName, "name"_a.none(false), + .def( + "setDefaultViewTransformName", + &Config::setDefaultViewTransformName, + "name"_a.none(false), DOC(Config, setDefaultViewTransformName)) - .def("clearViewTransforms", &Config::clearViewTransforms, - DOC(Config, clearViewTransforms)) + .def("clearViewTransforms", &Config::clearViewTransforms, DOC(Config, clearViewTransforms)) // Named Transforms .def("getNamedTransform", &Config::getNamedTransform, "name"_a) - .def("getNamedTransformNames", [](ConfigRcPtr & self, - NamedTransformVisibility visibility) - { + .def( + "getNamedTransformNames", + [](ConfigRcPtr & self, NamedTransformVisibility visibility) { return NamedTransformNameIterator(self, visibility); - }, "visibility"_a) - .def("getNamedTransforms", [](ConfigRcPtr & self, - NamedTransformVisibility visibility) - { + }, + "visibility"_a) + .def( + "getNamedTransforms", + [](ConfigRcPtr & self, NamedTransformVisibility visibility) { return NamedTransformIterator(self, visibility); - }, "visibility"_a) - - .def("getNamedTransformNames", [](ConfigRcPtr & self) - { - return ActiveNamedTransformNameIterator(self); - }) - .def("getNamedTransforms", [](ConfigRcPtr & self) - { - return ActiveNamedTransformIterator(self); - }) + }, + "visibility"_a) + + .def( + "getNamedTransformNames", + [](ConfigRcPtr & self) { return ActiveNamedTransformNameIterator(self); }) + .def( + "getNamedTransforms", + [](ConfigRcPtr & self) { return ActiveNamedTransformIterator(self); }) .def("addNamedTransform", &Config::addNamedTransform, "namedTransform"_a) .def("clearNamedTransforms", &Config::clearNamedTransforms) // Viewing Rules - .def("getViewingRules", &Config::getViewingRules, - DOC(Config, getViewingRules)) - .def("setViewingRules", &Config::setViewingRules, "ViewingRules"_a, - DOC(Config, setViewingRules)) + .def("getViewingRules", &Config::getViewingRules, DOC(Config, getViewingRules)) + .def( + "setViewingRules", + &Config::setViewingRules, + "ViewingRules"_a, + DOC(Config, setViewingRules)) // File Rules - .def("getFileRules", &Config::getFileRules, - DOC(Config, getFileRules)) - .def("setFileRules", &Config::setFileRules, "fileRules"_a, - DOC(Config, setFileRules)) - .def("getColorSpaceFromFilepath", - [](ConfigRcPtr & self, const std::string & filePath) - { - size_t ruleIndex = 0; + .def("getFileRules", &Config::getFileRules, DOC(Config, getFileRules)) + .def("setFileRules", &Config::setFileRules, "fileRules"_a, DOC(Config, setFileRules)) + .def( + "getColorSpaceFromFilepath", + [](ConfigRcPtr & self, const std::string & filePath) { + size_t ruleIndex = 0; std::string csName = self->getColorSpaceFromFilepath(filePath.c_str(), ruleIndex); return py::make_tuple(csName, ruleIndex); - }, "filePath"_a, + }, + "filePath"_a, DOC(Config, getColorSpaceFromFilepath)) - .def("filepathOnlyMatchesDefaultRule", &Config::filepathOnlyMatchesDefaultRule, - "filePath"_a, - DOC(Config, filepathOnlyMatchesDefaultRule)) + .def( + "filepathOnlyMatchesDefaultRule", + &Config::filepathOnlyMatchesDefaultRule, + "filePath"_a, + DOC(Config, filepathOnlyMatchesDefaultRule)) // Processors - .def("getProcessor", - (ConstProcessorRcPtr (Config::*)(const ConstColorSpaceRcPtr &, - const ConstColorSpaceRcPtr &) const) - &Config::getProcessor, - "srcColorSpace"_a, "dstColorSpace"_a, - DOC(Config, getProcessor)) - .def("getProcessor", - (ConstProcessorRcPtr (Config::*)(const ConstContextRcPtr &, - const ConstColorSpaceRcPtr &, - const ConstColorSpaceRcPtr &) const) - &Config::getProcessor, - "context"_a, "srcColorSpace"_a, "dstColorSpace"_a, - DOC(Config, getProcessor, 2)) - .def("getProcessor", - (ConstProcessorRcPtr (Config::*)(const char *, const char *) const) - &Config::getProcessor, - "srcColorSpaceName"_a, "dstColorSpaceName"_a, - DOC(Config, getProcessor, 3)) - .def("getProcessor", - (ConstProcessorRcPtr (Config::*)(const ConstContextRcPtr &, - const char *, - const char *) const) - &Config::getProcessor, - "context"_a, "srcColorSpaceName"_a, "dstColorSpaceName"_a, - DOC(Config, getProcessor, 4)) - .def("getProcessor", - (ConstProcessorRcPtr (Config::*)(const char *, - const char *, - const char *, - TransformDirection) const) - &Config::getProcessor, - "srcColorSpaceName"_a, "display"_a, "view"_a, "direction"_a, - DOC(Config, getProcessor, 5)) - .def("getProcessor", - (ConstProcessorRcPtr (Config::*)(const ConstContextRcPtr &, - const char *, - const char *, - const char *, - TransformDirection) const) - &Config::getProcessor, - "context"_a, "srcColorSpaceName"_a, "display"_a, "view"_a, "direction"_a, - DOC(Config, getProcessor, 6)) - .def("getProcessor", - (ConstProcessorRcPtr (Config::*)(const ConstNamedTransformRcPtr &, - TransformDirection) const) - &Config::getProcessor, - "namedTransform"_a, "direction"_a, - DOC(Config, getProcessor, 7)) - .def("getProcessor", - (ConstProcessorRcPtr (Config::*)(const ConstContextRcPtr &, - const ConstNamedTransformRcPtr &, - TransformDirection) const) - &Config::getProcessor, - "context"_a, "namedTransform"_a, "direction"_a, - DOC(Config, getProcessor, 8)) - .def("getProcessor", - (ConstProcessorRcPtr (Config::*)(const char *, - TransformDirection) const) - &Config::getProcessor, - "namedTransformName"_a, "direction"_a, - DOC(Config, getProcessor, 9)) - .def("getProcessor", - (ConstProcessorRcPtr (Config::*)(const ConstContextRcPtr &, - const char *, - TransformDirection) const) - &Config::getProcessor, - "context"_a, "namedTransformName"_a, "direction"_a, - DOC(Config, getProcessor, 10)) - .def("getProcessor", - (ConstProcessorRcPtr (Config::*)(const ConstTransformRcPtr &) const) - &Config::getProcessor, - "transform"_a, - DOC(Config, getProcessor, 11)) - .def("getProcessor", - (ConstProcessorRcPtr (Config::*)(const ConstTransformRcPtr &, - TransformDirection) const) - &Config::getProcessor, - "transform"_a, "direction"_a, - DOC(Config, getProcessor, 12)) - .def("getProcessor", - (ConstProcessorRcPtr (Config::*)(const ConstContextRcPtr &, - const ConstTransformRcPtr &, - TransformDirection) const) - &Config::getProcessor, - "context"_a, "transform"_a, "direction"_a, - DOC(Config, getProcessor, 13)) - .def_static("GetProcessorToBuiltinColorSpace", [](const ConstConfigRcPtr & srcConfig, - const char * srcColorSpaceName, - const char * builtinColorSpaceName) - { - return Config::GetProcessorToBuiltinColorSpace(srcConfig, - srcColorSpaceName, - builtinColorSpaceName); + .def( + "getProcessor", + (ConstProcessorRcPtr( + Config::*)(const ConstColorSpaceRcPtr &, const ConstColorSpaceRcPtr &) const) + & Config::getProcessor, + "srcColorSpace"_a, + "dstColorSpace"_a, + DOC(Config, getProcessor)) + .def( + "getProcessor", + (ConstProcessorRcPtr(Config::*)( + const ConstContextRcPtr &, + const ConstColorSpaceRcPtr &, + const ConstColorSpaceRcPtr &) const) + & Config::getProcessor, + "context"_a, + "srcColorSpace"_a, + "dstColorSpace"_a, + DOC(Config, getProcessor, 2)) + .def( + "getProcessor", + (ConstProcessorRcPtr(Config::*)(const char *, const char *) const) + & Config::getProcessor, + "srcColorSpaceName"_a, + "dstColorSpaceName"_a, + DOC(Config, getProcessor, 3)) + .def( + "getProcessor", + (ConstProcessorRcPtr(Config::*)(const ConstContextRcPtr &, const char *, const char *) + const) + & Config::getProcessor, + "context"_a, + "srcColorSpaceName"_a, + "dstColorSpaceName"_a, + DOC(Config, getProcessor, 4)) + .def( + "getProcessor", + (ConstProcessorRcPtr( + Config::*)(const char *, const char *, const char *, TransformDirection) const) + & Config::getProcessor, + "srcColorSpaceName"_a, + "display"_a, + "view"_a, + "direction"_a, + DOC(Config, getProcessor, 5)) + .def( + "getProcessor", + (ConstProcessorRcPtr(Config::*)( + const ConstContextRcPtr &, + const char *, + const char *, + const char *, + TransformDirection) const) + & Config::getProcessor, + "context"_a, + "srcColorSpaceName"_a, + "display"_a, + "view"_a, + "direction"_a, + DOC(Config, getProcessor, 6)) + .def( + "getProcessor", + (ConstProcessorRcPtr(Config::*)(const ConstNamedTransformRcPtr &, TransformDirection) + const) + & Config::getProcessor, + "namedTransform"_a, + "direction"_a, + DOC(Config, getProcessor, 7)) + .def( + "getProcessor", + (ConstProcessorRcPtr(Config::*)( + const ConstContextRcPtr &, + const ConstNamedTransformRcPtr &, + TransformDirection) const) + & Config::getProcessor, + "context"_a, + "namedTransform"_a, + "direction"_a, + DOC(Config, getProcessor, 8)) + .def( + "getProcessor", + (ConstProcessorRcPtr(Config::*)(const char *, TransformDirection) const) + & Config::getProcessor, + "namedTransformName"_a, + "direction"_a, + DOC(Config, getProcessor, 9)) + .def( + "getProcessor", + (ConstProcessorRcPtr( + Config::*)(const ConstContextRcPtr &, const char *, TransformDirection) const) + & Config::getProcessor, + "context"_a, + "namedTransformName"_a, + "direction"_a, + DOC(Config, getProcessor, 10)) + .def( + "getProcessor", + (ConstProcessorRcPtr(Config::*)(const ConstTransformRcPtr &) const) + & Config::getProcessor, + "transform"_a, + DOC(Config, getProcessor, 11)) + .def( + "getProcessor", + (ConstProcessorRcPtr(Config::*)(const ConstTransformRcPtr &, TransformDirection) const) + & Config::getProcessor, + "transform"_a, + "direction"_a, + DOC(Config, getProcessor, 12)) + .def( + "getProcessor", + (ConstProcessorRcPtr(Config::*)( + const ConstContextRcPtr &, + const ConstTransformRcPtr &, + TransformDirection) const) + & Config::getProcessor, + "context"_a, + "transform"_a, + "direction"_a, + DOC(Config, getProcessor, 13)) + .def_static( + "GetProcessorToBuiltinColorSpace", + [](const ConstConfigRcPtr & srcConfig, + const char * srcColorSpaceName, + const char * builtinColorSpaceName) { + return Config::GetProcessorToBuiltinColorSpace( + srcConfig, + srcColorSpaceName, + builtinColorSpaceName); }, - "srcConfig"_a, "srcColorSpaceName"_a, "builtinColorSpaceName"_a, - DOC(Config, GetProcessorToBuiltinColorSpace)) - .def_static("GetProcessorFromBuiltinColorSpace", [](const char * builtinColorSpaceName, - ConstConfigRcPtr srcConfig, - const char * srcColorSpaceName) - { - return Config::GetProcessorFromBuiltinColorSpace(builtinColorSpaceName, - srcConfig, - srcColorSpaceName); + "srcConfig"_a, + "srcColorSpaceName"_a, + "builtinColorSpaceName"_a, + DOC(Config, GetProcessorToBuiltinColorSpace)) + .def_static( + "GetProcessorFromBuiltinColorSpace", + [](const char * builtinColorSpaceName, + ConstConfigRcPtr srcConfig, + const char * srcColorSpaceName) { + return Config::GetProcessorFromBuiltinColorSpace( + builtinColorSpaceName, + srcConfig, + srcColorSpaceName); }, - "builtinColorSpaceName"_a, "srcConfig"_a, "srcColorSpaceName"_a, - DOC(Config, GetProcessorFromBuiltinColorSpace)) - .def_static("GetProcessorFromConfigs", [](const ConstConfigRcPtr & srcConfig, - const char * srcColorSpaceName, - const ConstConfigRcPtr & dstConfig, - const char * dstColorSpaceName) - { - return Config::GetProcessorFromConfigs(srcConfig, srcColorSpaceName, - dstConfig, dstColorSpaceName); + "builtinColorSpaceName"_a, + "srcConfig"_a, + "srcColorSpaceName"_a, + DOC(Config, GetProcessorFromBuiltinColorSpace)) + .def_static( + "GetProcessorFromConfigs", + [](const ConstConfigRcPtr & srcConfig, + const char * srcColorSpaceName, + const ConstConfigRcPtr & dstConfig, + const char * dstColorSpaceName) { + return Config::GetProcessorFromConfigs( + srcConfig, + srcColorSpaceName, + dstConfig, + dstColorSpaceName); }, - "srcConfig"_a, "srcColorSpaceName"_a, "dstConfig"_a, "dstColorSpaceName"_a, - DOC(Config, GetProcessorFromConfigs)) - .def_static("GetProcessorFromConfigs", [](const ConstContextRcPtr & srcContext, - const ConstConfigRcPtr & srcConfig, - const char * srcColorSpaceName, - const ConstContextRcPtr & dstContext, - const ConstConfigRcPtr & dstConfig, - const char * dstColorSpaceName) - { - return Config::GetProcessorFromConfigs(srcContext, srcConfig, srcColorSpaceName, - dstContext, dstConfig, dstColorSpaceName); + "srcConfig"_a, + "srcColorSpaceName"_a, + "dstConfig"_a, + "dstColorSpaceName"_a, + DOC(Config, GetProcessorFromConfigs)) + .def_static( + "GetProcessorFromConfigs", + [](const ConstContextRcPtr & srcContext, + const ConstConfigRcPtr & srcConfig, + const char * srcColorSpaceName, + const ConstContextRcPtr & dstContext, + const ConstConfigRcPtr & dstConfig, + const char * dstColorSpaceName) { + return Config::GetProcessorFromConfigs( + srcContext, + srcConfig, + srcColorSpaceName, + dstContext, + dstConfig, + dstColorSpaceName); }, - "srcContext"_a, "srcConfig"_a, "srcColorSpaceName"_a, - "dstContext"_a, "dstConfig"_a, "dstColorSpaceName"_a, - DOC(Config, GetProcessorFromConfigs, 2)) - .def_static("GetProcessorFromConfigs", [](const ConstConfigRcPtr & srcConfig, - const char * srcColorSpaceName, - const char * srcInterchangeName, - const ConstConfigRcPtr & dstConfig, - const char * dstColorSpaceName, - const char * dstInterchangeName) - { - return Config::GetProcessorFromConfigs(srcConfig, - srcColorSpaceName, - srcInterchangeName, - dstConfig, - dstColorSpaceName, - dstInterchangeName); - }, - "srcConfig"_a, "srcColorSpaceName"_a, "srcInterchangeName"_a, - "dstConfig"_a, "dstColorSpaceName"_a, "dstInterchangeName"_a, - DOC(Config, GetProcessorFromConfigs, 3)) - .def_static("GetProcessorFromConfigs", [](const ConstContextRcPtr & srcContext, - const ConstConfigRcPtr & srcConfig, - const char * srcColorSpaceName, - const char * srcInterchangeName, - const ConstContextRcPtr & dstContext, - const ConstConfigRcPtr & dstConfig, - const char * dstColorSpaceName, - const char * dstInterchangeName) - { - return Config::GetProcessorFromConfigs(srcContext, - srcConfig, - srcColorSpaceName, - srcInterchangeName, - dstContext, - dstConfig, - dstColorSpaceName, - dstInterchangeName); - }, - "srcContext"_a, "srcConfig"_a, "srcColorSpaceName"_a, "srcInterchangeName"_a, - "dstContext"_a, "dstConfig"_a, "dstColorSpaceName"_a, "dstInterchangeName"_a, - DOC(Config, GetProcessorFromConfigs, 4)) - .def_static("GetProcessorFromConfigs", [](const ConstConfigRcPtr & srcConfig, - const char * srcColorSpaceName, - const ConstConfigRcPtr & dstConfig, - const char * dstDisplay, - const char * dstView, - TransformDirection direction) - { - return Config::GetProcessorFromConfigs(srcConfig, srcColorSpaceName, - dstConfig, dstDisplay, dstView, direction); + "srcContext"_a, + "srcConfig"_a, + "srcColorSpaceName"_a, + "dstContext"_a, + "dstConfig"_a, + "dstColorSpaceName"_a, + DOC(Config, GetProcessorFromConfigs, 2)) + .def_static( + "GetProcessorFromConfigs", + [](const ConstConfigRcPtr & srcConfig, + const char * srcColorSpaceName, + const char * srcInterchangeName, + const ConstConfigRcPtr & dstConfig, + const char * dstColorSpaceName, + const char * dstInterchangeName) { + return Config::GetProcessorFromConfigs( + srcConfig, + srcColorSpaceName, + srcInterchangeName, + dstConfig, + dstColorSpaceName, + dstInterchangeName); }, - "srcConfig"_a, "srcColorSpaceName"_a, "dstConfig"_a, "dstDisplay"_a, "dstView"_a, "direction"_a, - DOC(Config, GetProcessorFromConfigs, 5)) - .def_static("GetProcessorFromConfigs", [](const ConstContextRcPtr & srcContext, - const ConstConfigRcPtr & srcConfig, - const char * srcColorSpaceName, - const ConstContextRcPtr & dstContext, - const ConstConfigRcPtr & dstConfig, - const char * dstDisplay, - const char * dstView, - TransformDirection direction) - { - return Config::GetProcessorFromConfigs(srcContext, srcConfig, srcColorSpaceName, - dstContext, dstConfig, dstDisplay, dstView, direction); + "srcConfig"_a, + "srcColorSpaceName"_a, + "srcInterchangeName"_a, + "dstConfig"_a, + "dstColorSpaceName"_a, + "dstInterchangeName"_a, + DOC(Config, GetProcessorFromConfigs, 3)) + .def_static( + "GetProcessorFromConfigs", + [](const ConstContextRcPtr & srcContext, + const ConstConfigRcPtr & srcConfig, + const char * srcColorSpaceName, + const char * srcInterchangeName, + const ConstContextRcPtr & dstContext, + const ConstConfigRcPtr & dstConfig, + const char * dstColorSpaceName, + const char * dstInterchangeName) { + return Config::GetProcessorFromConfigs( + srcContext, + srcConfig, + srcColorSpaceName, + srcInterchangeName, + dstContext, + dstConfig, + dstColorSpaceName, + dstInterchangeName); }, - "srcContext"_a, "srcConfig"_a, "srcColorSpaceName"_a, - "dstContext"_a, "dstConfig"_a, "dstView"_a, "dstDisplay"_a, "direction"_a, - DOC(Config, GetProcessorFromConfigs, 6)) - .def_static("GetProcessorFromConfigs", [](const ConstConfigRcPtr & srcConfig, - const char * srcColorSpaceName, - const char * srcInterchangeName, - const ConstConfigRcPtr & dstConfig, - const char * dstDisplay, - const char * dstView, - const char * dstInterchangeName, - TransformDirection direction) - { - return Config::GetProcessorFromConfigs(srcConfig, - srcColorSpaceName, - srcInterchangeName, - dstConfig, - dstDisplay, - dstView, - dstInterchangeName, - direction); + "srcContext"_a, + "srcConfig"_a, + "srcColorSpaceName"_a, + "srcInterchangeName"_a, + "dstContext"_a, + "dstConfig"_a, + "dstColorSpaceName"_a, + "dstInterchangeName"_a, + DOC(Config, GetProcessorFromConfigs, 4)) + .def_static( + "GetProcessorFromConfigs", + [](const ConstConfigRcPtr & srcConfig, + const char * srcColorSpaceName, + const ConstConfigRcPtr & dstConfig, + const char * dstDisplay, + const char * dstView, + TransformDirection direction) { + return Config::GetProcessorFromConfigs( + srcConfig, + srcColorSpaceName, + dstConfig, + dstDisplay, + dstView, + direction); }, - "srcConfig"_a, "srcColorSpaceName"_a, "srcInterchangeName"_a, - "dstConfig"_a, "dstDisplay"_a, "dstView"_a, "dstInterchangeName"_a, "direction"_a, - DOC(Config, GetProcessorFromConfigs, 7)) - .def_static("GetProcessorFromConfigs", [](const ConstContextRcPtr & srcContext, - const ConstConfigRcPtr & srcConfig, - const char * srcColorSpaceName, - const char * srcInterchangeName, - const ConstContextRcPtr & dstContext, - const ConstConfigRcPtr & dstConfig, - const char * dstDisplay, - const char * dstView, - const char * dstInterchangeName, - TransformDirection direction) - { - return Config::GetProcessorFromConfigs(srcContext, - srcConfig, - srcColorSpaceName, - srcInterchangeName, - dstContext, - dstConfig, - dstDisplay, - dstView, - dstInterchangeName, - direction); + "srcConfig"_a, + "srcColorSpaceName"_a, + "dstConfig"_a, + "dstDisplay"_a, + "dstView"_a, + "direction"_a, + DOC(Config, GetProcessorFromConfigs, 5)) + .def_static( + "GetProcessorFromConfigs", + [](const ConstContextRcPtr & srcContext, + const ConstConfigRcPtr & srcConfig, + const char * srcColorSpaceName, + const ConstContextRcPtr & dstContext, + const ConstConfigRcPtr & dstConfig, + const char * dstDisplay, + const char * dstView, + TransformDirection direction) { + return Config::GetProcessorFromConfigs( + srcContext, + srcConfig, + srcColorSpaceName, + dstContext, + dstConfig, + dstDisplay, + dstView, + direction); + }, + "srcContext"_a, + "srcConfig"_a, + "srcColorSpaceName"_a, + "dstContext"_a, + "dstConfig"_a, + "dstView"_a, + "dstDisplay"_a, + "direction"_a, + DOC(Config, GetProcessorFromConfigs, 6)) + .def_static( + "GetProcessorFromConfigs", + [](const ConstConfigRcPtr & srcConfig, + const char * srcColorSpaceName, + const char * srcInterchangeName, + const ConstConfigRcPtr & dstConfig, + const char * dstDisplay, + const char * dstView, + const char * dstInterchangeName, + TransformDirection direction) { + return Config::GetProcessorFromConfigs( + srcConfig, + srcColorSpaceName, + srcInterchangeName, + dstConfig, + dstDisplay, + dstView, + dstInterchangeName, + direction); + }, + "srcConfig"_a, + "srcColorSpaceName"_a, + "srcInterchangeName"_a, + "dstConfig"_a, + "dstDisplay"_a, + "dstView"_a, + "dstInterchangeName"_a, + "direction"_a, + DOC(Config, GetProcessorFromConfigs, 7)) + .def_static( + "GetProcessorFromConfigs", + [](const ConstContextRcPtr & srcContext, + const ConstConfigRcPtr & srcConfig, + const char * srcColorSpaceName, + const char * srcInterchangeName, + const ConstContextRcPtr & dstContext, + const ConstConfigRcPtr & dstConfig, + const char * dstDisplay, + const char * dstView, + const char * dstInterchangeName, + TransformDirection direction) { + return Config::GetProcessorFromConfigs( + srcContext, + srcConfig, + srcColorSpaceName, + srcInterchangeName, + dstContext, + dstConfig, + dstDisplay, + dstView, + dstInterchangeName, + direction); }, - "srcContext"_a, "srcConfig"_a, "srcColorSpaceName"_a, "srcInterchangeName"_a, - "dstContext"_a, "dstConfig"_a, "dstDisplay"_a, "dstView"_a, "dstInterchangeName"_a, "direction"_a, - DOC(Config, GetProcessorFromConfigs, 8)) - .def("setProcessorCacheFlags", &Config::setProcessorCacheFlags, "flags"_a, - DOC(Config, setProcessorCacheFlags)) - .def("clearProcessorCache", &Config::clearProcessorCache, - DOC(Config, setProcessorCacheFlags)) + "srcContext"_a, + "srcConfig"_a, + "srcColorSpaceName"_a, + "srcInterchangeName"_a, + "dstContext"_a, + "dstConfig"_a, + "dstDisplay"_a, + "dstView"_a, + "dstInterchangeName"_a, + "direction"_a, + DOC(Config, GetProcessorFromConfigs, 8)) + .def( + "setProcessorCacheFlags", + &Config::setProcessorCacheFlags, + "flags"_a, + DOC(Config, setProcessorCacheFlags)) + .def( + "clearProcessorCache", + &Config::clearProcessorCache, + DOC(Config, setProcessorCacheFlags)) // Archiving .def("isArchivable", &Config::isArchivable, DOC(Config, isArchivable)) - .def("archive", [](ConfigRcPtr & self, const char * filepath) - { + .def( + "archive", + [](ConfigRcPtr & self, const char * filepath) { std::ofstream f(filepath, std::ofstream::out | std::ofstream::binary); self->archive(f); - f.close(); - }, + f.close(); + }, DOC(Config, archive)) // Conversion to string - .def("__str__", [](ConfigRcPtr & self) - { + .def( + "__str__", + [](ConfigRcPtr & self) { std::ostringstream os; os << (*self); return os.str(); }) - .def("__repr__", [](ConfigRcPtr & self) - { - std::ostringstream os; - os << ""; - return os.str(); - }); + .def("__repr__", [](ConfigRcPtr & self) { + std::ostringstream os; + os << ""; + return os.str(); + }); clsEnvironmentVarNameIterator - .def("__len__", [](EnvironmentVarNameIterator & it) - { - return it.m_obj->getNumEnvironmentVars(); - }) - .def("__getitem__", [](EnvironmentVarNameIterator & it, int i) - { + .def( + "__len__", + [](EnvironmentVarNameIterator & it) { return it.m_obj->getNumEnvironmentVars(); }) + .def( + "__getitem__", + [](EnvironmentVarNameIterator & it, int i) { it.checkIndex(i, it.m_obj->getNumEnvironmentVars()); return it.m_obj->getEnvironmentVarNameByIndex(i); }) - .def("__iter__", [](EnvironmentVarNameIterator & it) -> EnvironmentVarNameIterator & - { - return it; - }) - .def("__next__", [](EnvironmentVarNameIterator & it) - { - int i = it.nextIndex(it.m_obj->getNumEnvironmentVars()); - return it.m_obj->getEnvironmentVarNameByIndex(i); - }); + .def( + "__iter__", + [](EnvironmentVarNameIterator & it) -> EnvironmentVarNameIterator & { return it; }) + .def("__next__", [](EnvironmentVarNameIterator & it) { + int i = it.nextIndex(it.m_obj->getNumEnvironmentVars()); + return it.m_obj->getEnvironmentVarNameByIndex(i); + }); clsSearchPathIterator - .def("__len__", [](SearchPathIterator & it) - { - return it.m_obj->getNumSearchPaths(); - }) - .def("__getitem__", [](SearchPathIterator & it, int i) - { + .def("__len__", [](SearchPathIterator & it) { return it.m_obj->getNumSearchPaths(); }) + .def( + "__getitem__", + [](SearchPathIterator & it, int i) { it.checkIndex(i, it.m_obj->getNumSearchPaths()); return it.m_obj->getSearchPath(i); }) .def("__iter__", [](SearchPathIterator & it) -> SearchPathIterator & { return it; }) - .def("__next__", [](SearchPathIterator & it) - { - int i = it.nextIndex(it.m_obj->getNumSearchPaths()); - return it.m_obj->getSearchPath(i); - }); + .def("__next__", [](SearchPathIterator & it) { + int i = it.nextIndex(it.m_obj->getNumSearchPaths()); + return it.m_obj->getSearchPath(i); + }); clsColorSpaceNameIterator - .def("__len__", [](ColorSpaceNameIterator & it) - { - return it.m_obj->getNumColorSpaces(std::get<0>(it.m_args), std::get<1>(it.m_args)); - }) - .def("__getitem__", [](ColorSpaceNameIterator & it, int i) - { - it.checkIndex(i, it.m_obj->getNumColorSpaces(std::get<0>(it.m_args), - std::get<1>(it.m_args))); - return it.m_obj->getColorSpaceNameByIndex(std::get<0>(it.m_args), - std::get<1>(it.m_args), - i); + .def( + "__len__", + [](ColorSpaceNameIterator & it) { + return it.m_obj->getNumColorSpaces(std::get<0>(it.m_args), std::get<1>(it.m_args)); }) - .def("__iter__", [](ColorSpaceNameIterator & it) -> ColorSpaceNameIterator & - { - return it; + .def( + "__getitem__", + [](ColorSpaceNameIterator & it, int i) { + it.checkIndex( + i, + it.m_obj->getNumColorSpaces(std::get<0>(it.m_args), std::get<1>(it.m_args))); + return it.m_obj->getColorSpaceNameByIndex( + std::get<0>(it.m_args), + std::get<1>(it.m_args), + i); }) - .def("__next__", [](ColorSpaceNameIterator & it) - { - int i = it.nextIndex(it.m_obj->getNumColorSpaces(std::get<0>(it.m_args), - std::get<1>(it.m_args))); - return it.m_obj->getColorSpaceNameByIndex(std::get<0>(it.m_args), - std::get<1>(it.m_args), - i); - }); + .def("__iter__", [](ColorSpaceNameIterator & it) -> ColorSpaceNameIterator & { return it; }) + .def("__next__", [](ColorSpaceNameIterator & it) { + int i = it.nextIndex( + it.m_obj->getNumColorSpaces(std::get<0>(it.m_args), std::get<1>(it.m_args))); + return it.m_obj->getColorSpaceNameByIndex( + std::get<0>(it.m_args), + std::get<1>(it.m_args), + i); + }); clsColorSpaceIterator - .def("__len__", [](ColorSpaceIterator & it) - { - return it.m_obj->getNumColorSpaces(std::get<0>(it.m_args), std::get<1>(it.m_args)); + .def( + "__len__", + [](ColorSpaceIterator & it) { + return it.m_obj->getNumColorSpaces(std::get<0>(it.m_args), std::get<1>(it.m_args)); }) - .def("__getitem__", [](ColorSpaceIterator & it, int i) - { - it.checkIndex(i, it.m_obj->getNumColorSpaces(std::get<0>(it.m_args), - std::get<1>(it.m_args))); - const char * name = it.m_obj->getColorSpaceNameByIndex(std::get<0>(it.m_args), - std::get<1>(it.m_args), - i); + .def( + "__getitem__", + [](ColorSpaceIterator & it, int i) { + it.checkIndex( + i, + it.m_obj->getNumColorSpaces(std::get<0>(it.m_args), std::get<1>(it.m_args))); + const char * name = it.m_obj->getColorSpaceNameByIndex( + std::get<0>(it.m_args), + std::get<1>(it.m_args), + i); return it.m_obj->getColorSpace(name); }) .def("__iter__", [](ColorSpaceIterator & it) -> ColorSpaceIterator & { return it; }) - .def("__next__", [](ColorSpaceIterator & it) - { - int i = it.nextIndex(it.m_obj->getNumColorSpaces(std::get<0>(it.m_args), - std::get<1>(it.m_args))); - const char * name = it.m_obj->getColorSpaceNameByIndex(std::get<0>(it.m_args), - std::get<1>(it.m_args), - i); - return it.m_obj->getColorSpace(name); - }); + .def("__next__", [](ColorSpaceIterator & it) { + int i = it.nextIndex( + it.m_obj->getNumColorSpaces(std::get<0>(it.m_args), std::get<1>(it.m_args))); + const char * name = it.m_obj->getColorSpaceNameByIndex( + std::get<0>(it.m_args), + std::get<1>(it.m_args), + i); + return it.m_obj->getColorSpace(name); + }); clsActiveColorSpaceNameIterator - .def("__len__", [](ActiveColorSpaceNameIterator & it) - { - return it.m_obj->getNumColorSpaces(); - }) - .def("__getitem__", [](ActiveColorSpaceNameIterator & it, int i) - { + .def( + "__len__", + [](ActiveColorSpaceNameIterator & it) { return it.m_obj->getNumColorSpaces(); }) + .def( + "__getitem__", + [](ActiveColorSpaceNameIterator & it, int i) { it.checkIndex(i, it.m_obj->getNumColorSpaces()); return it.m_obj->getColorSpaceNameByIndex(i); }) - .def("__iter__", [](ActiveColorSpaceNameIterator & it) -> ActiveColorSpaceNameIterator & - { - return it; - }) - .def("__next__", [](ActiveColorSpaceNameIterator & it) - { - int i = it.nextIndex(it.m_obj->getNumColorSpaces()); - return it.m_obj->getColorSpaceNameByIndex(i); - }); + .def( + "__iter__", + [](ActiveColorSpaceNameIterator & it) -> ActiveColorSpaceNameIterator & { return it; }) + .def("__next__", [](ActiveColorSpaceNameIterator & it) { + int i = it.nextIndex(it.m_obj->getNumColorSpaces()); + return it.m_obj->getColorSpaceNameByIndex(i); + }); clsActiveColorSpaceIterator - .def("__len__", [](ActiveColorSpaceIterator & it) - { - return it.m_obj->getNumColorSpaces(); - }) - .def("__getitem__", [](ActiveColorSpaceIterator & it, int i) - { + .def("__len__", [](ActiveColorSpaceIterator & it) { return it.m_obj->getNumColorSpaces(); }) + .def( + "__getitem__", + [](ActiveColorSpaceIterator & it, int i) { it.checkIndex(i, it.m_obj->getNumColorSpaces()); const char * name = it.m_obj->getColorSpaceNameByIndex(i); return it.m_obj->getColorSpace(name); }) - .def("__iter__", [](ActiveColorSpaceIterator & it) -> ActiveColorSpaceIterator & - { - return it; - }) - .def("__next__", [](ActiveColorSpaceIterator & it) - { - int i = it.nextIndex(it.m_obj->getNumColorSpaces()); - const char * name = it.m_obj->getColorSpaceNameByIndex(i); - return it.m_obj->getColorSpace(name); - }); + .def( + "__iter__", + [](ActiveColorSpaceIterator & it) -> ActiveColorSpaceIterator & { return it; }) + .def("__next__", [](ActiveColorSpaceIterator & it) { + int i = it.nextIndex(it.m_obj->getNumColorSpaces()); + const char * name = it.m_obj->getColorSpaceNameByIndex(i); + return it.m_obj->getColorSpace(name); + }); clsRoleNameIterator .def("__len__", [](RoleNameIterator & it) { return it.m_obj->getNumRoles(); }) - .def("__getitem__", [](RoleNameIterator & it, int i) - { + .def( + "__getitem__", + [](RoleNameIterator & it, int i) { it.checkIndex(i, it.m_obj->getNumRoles()); return it.m_obj->getRoleName(i); }) .def("__iter__", [](RoleNameIterator & it) -> RoleNameIterator & { return it; }) - .def("__next__", [](RoleNameIterator & it) - { - int i = it.nextIndex(it.m_obj->getNumRoles()); - return it.m_obj->getRoleName(i); - }); + .def("__next__", [](RoleNameIterator & it) { + int i = it.nextIndex(it.m_obj->getNumRoles()); + return it.m_obj->getRoleName(i); + }); clsRoleColorSpaceIterator .def("__len__", [](RoleColorSpaceIterator & it) { return it.m_obj->getNumRoles(); }) - .def("__getitem__", [](RoleColorSpaceIterator & it, int i) - { + .def( + "__getitem__", + [](RoleColorSpaceIterator & it, int i) { it.checkIndex(i, it.m_obj->getNumRoles()); - return py::make_tuple(it.m_obj->getRoleName(i), - it.m_obj->getRoleColorSpace(i)); + return py::make_tuple(it.m_obj->getRoleName(i), it.m_obj->getRoleColorSpace(i)); }) - .def("__iter__", [](RoleColorSpaceIterator & it) -> RoleColorSpaceIterator & - { - return it; - }) - .def("__next__", [](RoleColorSpaceIterator & it) - { - int i = it.nextIndex(it.m_obj->getNumRoles()); - return py::make_tuple(it.m_obj->getRoleName(i), - it.m_obj->getRoleColorSpace(i)); - }); + .def("__iter__", [](RoleColorSpaceIterator & it) -> RoleColorSpaceIterator & { return it; }) + .def("__next__", [](RoleColorSpaceIterator & it) { + int i = it.nextIndex(it.m_obj->getNumRoles()); + return py::make_tuple(it.m_obj->getRoleName(i), it.m_obj->getRoleColorSpace(i)); + }); clsDisplayIterator .def("__len__", [](DisplayIterator & it) { return it.m_obj->getNumDisplays(); }) - .def("__getitem__", [](DisplayIterator & it, int i) - { + .def( + "__getitem__", + [](DisplayIterator & it, int i) { it.checkIndex(i, it.m_obj->getNumDisplays()); return it.m_obj->getDisplay(i); }) .def("__iter__", [](DisplayIterator & it) -> DisplayIterator & { return it; }) - .def("__next__", [](DisplayIterator & it) - { - int i = it.nextIndex(it.m_obj->getNumDisplays()); - return it.m_obj->getDisplay(i); - }); + .def("__next__", [](DisplayIterator & it) { + int i = it.nextIndex(it.m_obj->getNumDisplays()); + return it.m_obj->getDisplay(i); + }); clsDisplayAllIterator .def("__len__", [](DisplayAllIterator & it) { return it.m_obj->getNumDisplaysAll(); }) - .def("__getitem__", [](DisplayAllIterator & it, int i) - { + .def( + "__getitem__", + [](DisplayAllIterator & it, int i) { it.checkIndex(i, it.m_obj->getNumDisplaysAll()); return it.m_obj->getDisplayAll(i); }) .def("__iter__", [](DisplayAllIterator & it) -> DisplayAllIterator & { return it; }) - .def("__next__", [](DisplayAllIterator & it) - { - int i = it.nextIndex(it.m_obj->getNumDisplaysAll()); - return it.m_obj->getDisplayAll(i); - }); + .def("__next__", [](DisplayAllIterator & it) { + int i = it.nextIndex(it.m_obj->getNumDisplaysAll()); + return it.m_obj->getDisplayAll(i); + }); clsSharedViewIterator - .def("__len__", [](SharedViewIterator & it) { return it.m_obj->getNumViews(VIEW_SHARED, - nullptr); }) - .def("__getitem__", [](SharedViewIterator & it, int i) - { + .def( + "__len__", + [](SharedViewIterator & it) { return it.m_obj->getNumViews(VIEW_SHARED, nullptr); }) + .def( + "__getitem__", + [](SharedViewIterator & it, int i) { it.checkIndex(i, it.m_obj->getNumViews(VIEW_SHARED, nullptr)); return it.m_obj->getView(VIEW_SHARED, nullptr, i); }) .def("__iter__", [](SharedViewIterator & it) -> SharedViewIterator & { return it; }) - .def("__next__", [](SharedViewIterator & it) - { - int i = it.nextIndex(it.m_obj->getNumViews(VIEW_SHARED, nullptr)); - return it.m_obj->getView(VIEW_SHARED, nullptr, i); - }); + .def("__next__", [](SharedViewIterator & it) { + int i = it.nextIndex(it.m_obj->getNumViews(VIEW_SHARED, nullptr)); + return it.m_obj->getView(VIEW_SHARED, nullptr, i); + }); clsVirtualViewIterator - .def("__len__", [](VirtualViewIterator & it) - { - return it.m_obj->getVirtualDisplayNumViews(std::get<0>(it.m_args)); + .def( + "__len__", + [](VirtualViewIterator & it) { + return it.m_obj->getVirtualDisplayNumViews(std::get<0>(it.m_args)); }) - .def("__getitem__", [](VirtualViewIterator & it, int i) - { + .def( + "__getitem__", + [](VirtualViewIterator & it, int i) { it.checkIndex(i, it.m_obj->getVirtualDisplayNumViews(std::get<0>(it.m_args))); return it.m_obj->getVirtualDisplayView(std::get<0>(it.m_args), i); }) .def("__iter__", [](VirtualViewIterator & it) -> VirtualViewIterator & { return it; }) - .def("__next__", [](VirtualViewIterator & it) - { - int i = it.nextIndex(it.m_obj->getVirtualDisplayNumViews(std::get<0>(it.m_args))); - return it.m_obj->getVirtualDisplayView(std::get<0>(it.m_args), i); - }); + .def("__next__", [](VirtualViewIterator & it) { + int i = it.nextIndex(it.m_obj->getVirtualDisplayNumViews(std::get<0>(it.m_args))); + return it.m_obj->getVirtualDisplayView(std::get<0>(it.m_args), i); + }); clsViewIterator - .def("__len__", [](ViewIterator & it) - { return it.m_obj->getNumViews(std::get<0>(it.m_args).c_str()); }) - .def("__getitem__", [](ViewIterator & it, int i) - { + .def( + "__len__", + [](ViewIterator & it) { return it.m_obj->getNumViews(std::get<0>(it.m_args).c_str()); }) + .def( + "__getitem__", + [](ViewIterator & it, int i) { it.checkIndex(i, it.m_obj->getNumViews(std::get<0>(it.m_args).c_str())); return it.m_obj->getView(std::get<0>(it.m_args).c_str(), i); }) .def("__iter__", [](ViewIterator & it) -> ViewIterator & { return it; }) - .def("__next__", [](ViewIterator & it) - { - int i = it.nextIndex(it.m_obj->getNumViews(std::get<0>(it.m_args).c_str())); - return it.m_obj->getView(std::get<0>(it.m_args).c_str(), i); - }); + .def("__next__", [](ViewIterator & it) { + int i = it.nextIndex(it.m_obj->getNumViews(std::get<0>(it.m_args).c_str())); + return it.m_obj->getView(std::get<0>(it.m_args).c_str(), i); + }); clsViewForColorSpaceIterator - .def("__len__", [](ViewForColorSpaceIterator & it) - { return it.m_obj->getNumViews(std::get<0>(it.m_args).c_str(), - std::get<1>(it.m_args).c_str()); }) - .def("__getitem__", [](ViewForColorSpaceIterator & it, int i) - { - it.checkIndex(i, it.m_obj->getNumViews(std::get<0>(it.m_args).c_str(), - std::get<1>(it.m_args).c_str())); - return it.m_obj->getView(std::get<0>(it.m_args).c_str(), - std::get<1>(it.m_args).c_str(), i); + .def( + "__len__", + [](ViewForColorSpaceIterator & it) { + return it.m_obj->getNumViews( + std::get<0>(it.m_args).c_str(), + std::get<1>(it.m_args).c_str()); }) - .def("__iter__", [](ViewForColorSpaceIterator & it) -> ViewForColorSpaceIterator & - { - return it; + .def( + "__getitem__", + [](ViewForColorSpaceIterator & it, int i) { + it.checkIndex( + i, + it.m_obj->getNumViews( + std::get<0>(it.m_args).c_str(), + std::get<1>(it.m_args).c_str())); + return it.m_obj->getView( + std::get<0>(it.m_args).c_str(), + std::get<1>(it.m_args).c_str(), + i); }) - .def("__next__", [](ViewForColorSpaceIterator & it) - { - int i = it.nextIndex(it.m_obj->getNumViews(std::get<0>(it.m_args).c_str(), - std::get<1>(it.m_args).c_str())); - return it.m_obj->getView(std::get<0>(it.m_args).c_str(), - std::get<1>(it.m_args).c_str(), i); - }); + .def( + "__iter__", + [](ViewForColorSpaceIterator & it) -> ViewForColorSpaceIterator & { return it; }) + .def("__next__", [](ViewForColorSpaceIterator & it) { + int i = it.nextIndex(it.m_obj->getNumViews( + std::get<0>(it.m_args).c_str(), + std::get<1>(it.m_args).c_str())); + return it.m_obj->getView( + std::get<0>(it.m_args).c_str(), + std::get<1>(it.m_args).c_str(), + i); + }); clsViewForViewTypeIterator - .def("__len__", [](ViewForViewTypeIterator & it) - { return it.m_obj->getNumViews(std::get<0>(it.m_args), - std::get<1>(it.m_args).c_str()); }) - .def("__getitem__", [](ViewForViewTypeIterator & it, int i) - { - it.checkIndex(i, it.m_obj->getNumViews(std::get<0>(it.m_args), - std::get<1>(it.m_args).c_str())); - return it.m_obj->getView(std::get<0>(it.m_args), - std::get<1>(it.m_args).c_str(), i); + .def( + "__len__", + [](ViewForViewTypeIterator & it) { + return it.m_obj->getNumViews( + std::get<0>(it.m_args), + std::get<1>(it.m_args).c_str()); }) - .def("__iter__", [](ViewForViewTypeIterator & it) -> ViewForViewTypeIterator & - { - return it; + .def( + "__getitem__", + [](ViewForViewTypeIterator & it, int i) { + it.checkIndex( + i, + it.m_obj->getNumViews(std::get<0>(it.m_args), std::get<1>(it.m_args).c_str())); + return it.m_obj->getView(std::get<0>(it.m_args), std::get<1>(it.m_args).c_str(), i); }) - .def("__next__", [](ViewForViewTypeIterator & it) - { - int i = it.nextIndex(it.m_obj->getNumViews(std::get<0>(it.m_args), - std::get<1>(it.m_args).c_str())); - return it.m_obj->getView(std::get<0>(it.m_args), - std::get<1>(it.m_args).c_str(), i); - }); + .def( + "__iter__", + [](ViewForViewTypeIterator & it) -> ViewForViewTypeIterator & { return it; }) + .def("__next__", [](ViewForViewTypeIterator & it) { + int i = it.nextIndex( + it.m_obj->getNumViews(std::get<0>(it.m_args), std::get<1>(it.m_args).c_str())); + return it.m_obj->getView(std::get<0>(it.m_args), std::get<1>(it.m_args).c_str(), i); + }); clsLookNameIterator .def("__len__", [](LookNameIterator & it) { return it.m_obj->getNumLooks(); }) - .def("__getitem__", [](LookNameIterator & it, int i) - { + .def( + "__getitem__", + [](LookNameIterator & it, int i) { it.checkIndex(i, it.m_obj->getNumLooks()); return it.m_obj->getLookNameByIndex(i); }) .def("__iter__", [](LookNameIterator & it) -> LookNameIterator & { return it; }) - .def("__next__", [](LookNameIterator & it) - { - int i = it.nextIndex(it.m_obj->getNumLooks()); - return it.m_obj->getLookNameByIndex(i); - }); - - clsLookIterator - .def("__len__", [](LookIterator & it) { return it.m_obj->getNumLooks(); }) - .def("__getitem__", [](LookIterator & it, int i) - { + .def("__next__", [](LookNameIterator & it) { + int i = it.nextIndex(it.m_obj->getNumLooks()); + return it.m_obj->getLookNameByIndex(i); + }); + + clsLookIterator.def("__len__", [](LookIterator & it) { return it.m_obj->getNumLooks(); }) + .def( + "__getitem__", + [](LookIterator & it, int i) { it.checkIndex(i, it.m_obj->getNumLooks()); const char * name = it.m_obj->getLookNameByIndex(i); return it.m_obj->getLook(name); }) .def("__iter__", [](LookIterator & it) -> LookIterator & { return it; }) - .def("__next__", [](LookIterator & it) - { - int i = it.nextIndex(it.m_obj->getNumLooks()); - const char * name = it.m_obj->getLookNameByIndex(i); - return it.m_obj->getLook(name); - }); + .def("__next__", [](LookIterator & it) { + int i = it.nextIndex(it.m_obj->getNumLooks()); + const char * name = it.m_obj->getLookNameByIndex(i); + return it.m_obj->getLook(name); + }); clsViewTransformNameIterator - .def("__len__", [](ViewTransformNameIterator & it) - { - return it.m_obj->getNumViewTransforms(); - }) - .def("__getitem__", [](ViewTransformNameIterator & it, int i) - { + .def( + "__len__", + [](ViewTransformNameIterator & it) { return it.m_obj->getNumViewTransforms(); }) + .def( + "__getitem__", + [](ViewTransformNameIterator & it, int i) { it.checkIndex(i, it.m_obj->getNumViewTransforms()); return it.m_obj->getViewTransformNameByIndex(i); }) - .def("__iter__", [](ViewTransformNameIterator & it) -> ViewTransformNameIterator & - { - return it; - }) - .def("__next__", [](ViewTransformNameIterator & it) - { - int i = it.nextIndex(it.m_obj->getNumViewTransforms()); - return it.m_obj->getViewTransformNameByIndex(i); - }); + .def( + "__iter__", + [](ViewTransformNameIterator & it) -> ViewTransformNameIterator & { return it; }) + .def("__next__", [](ViewTransformNameIterator & it) { + int i = it.nextIndex(it.m_obj->getNumViewTransforms()); + return it.m_obj->getViewTransformNameByIndex(i); + }); clsViewTransformIterator - .def("__len__", [](ViewTransformIterator & it) - { - return it.m_obj->getNumViewTransforms(); - }) - .def("__getitem__", [](ViewTransformIterator & it, int i) - { + .def("__len__", [](ViewTransformIterator & it) { return it.m_obj->getNumViewTransforms(); }) + .def( + "__getitem__", + [](ViewTransformIterator & it, int i) { it.checkIndex(i, it.m_obj->getNumViewTransforms()); const char * name = it.m_obj->getViewTransformNameByIndex(i); return it.m_obj->getViewTransform(name); }) - .def("__iter__", [](ViewTransformIterator & it) -> ViewTransformIterator & - { - return it; - }) - .def("__next__", [](ViewTransformIterator & it) - { - int i = it.nextIndex(it.m_obj->getNumViewTransforms()); - const char * name = it.m_obj->getViewTransformNameByIndex(i); - return it.m_obj->getViewTransform(name); - }); + .def("__iter__", [](ViewTransformIterator & it) -> ViewTransformIterator & { return it; }) + .def("__next__", [](ViewTransformIterator & it) { + int i = it.nextIndex(it.m_obj->getNumViewTransforms()); + const char * name = it.m_obj->getViewTransformNameByIndex(i); + return it.m_obj->getViewTransform(name); + }); clsNamedTransformNameIterator - .def("__len__", [](NamedTransformNameIterator & it) - { + .def( + "__len__", + [](NamedTransformNameIterator & it) { return it.m_obj->getNumNamedTransforms(std::get<0>(it.m_args)); }) - .def("__getitem__", [](NamedTransformNameIterator & it, int i) - { + .def( + "__getitem__", + [](NamedTransformNameIterator & it, int i) { it.checkIndex(i, it.m_obj->getNumNamedTransforms(std::get<0>(it.m_args))); return it.m_obj->getNamedTransformNameByIndex(std::get<0>(it.m_args), i); }) - .def("__iter__", [](NamedTransformNameIterator & it) -> NamedTransformNameIterator & - { - return it; - }) - .def("__next__", [](NamedTransformNameIterator & it) - { - int i = it.nextIndex(it.m_obj->getNumNamedTransforms(std::get<0>(it.m_args))); - return it.m_obj->getNamedTransformNameByIndex(std::get<0>(it.m_args), i); - }); + .def( + "__iter__", + [](NamedTransformNameIterator & it) -> NamedTransformNameIterator & { return it; }) + .def("__next__", [](NamedTransformNameIterator & it) { + int i = it.nextIndex(it.m_obj->getNumNamedTransforms(std::get<0>(it.m_args))); + return it.m_obj->getNamedTransformNameByIndex(std::get<0>(it.m_args), i); + }); clsNamedTransformIterator - .def("__len__", [](NamedTransformIterator & it) - { + .def( + "__len__", + [](NamedTransformIterator & it) { return it.m_obj->getNumNamedTransforms(std::get<0>(it.m_args)); }) - .def("__getitem__", [](NamedTransformIterator & it, int i) - { + .def( + "__getitem__", + [](NamedTransformIterator & it, int i) { it.checkIndex(i, it.m_obj->getNumNamedTransforms(std::get<0>(it.m_args))); - const char * name = it.m_obj->getNamedTransformNameByIndex(std::get<0>(it.m_args), i); + const char * name + = it.m_obj->getNamedTransformNameByIndex(std::get<0>(it.m_args), i); return it.m_obj->getNamedTransform(name); }) - .def("__iter__", [](NamedTransformIterator & it) -> NamedTransformIterator & - { - return it; - }) - .def("__next__", [](NamedTransformIterator & it) - { - int i = it.nextIndex(it.m_obj->getNumNamedTransforms(std::get<0>(it.m_args))); - const char * name = it.m_obj->getNamedTransformNameByIndex(std::get<0>(it.m_args), i); - return it.m_obj->getNamedTransform(name); - }); + .def("__iter__", [](NamedTransformIterator & it) -> NamedTransformIterator & { return it; }) + .def("__next__", [](NamedTransformIterator & it) { + int i = it.nextIndex(it.m_obj->getNumNamedTransforms(std::get<0>(it.m_args))); + const char * name = it.m_obj->getNamedTransformNameByIndex(std::get<0>(it.m_args), i); + return it.m_obj->getNamedTransform(name); + }); clsActiveNamedTransformNameIterator - .def("__len__", [](ActiveNamedTransformNameIterator & it) - { - return it.m_obj->getNumNamedTransforms(); - }) - .def("__getitem__", [](ActiveNamedTransformNameIterator & it, int i) - { + .def( + "__len__", + [](ActiveNamedTransformNameIterator & it) { return it.m_obj->getNumNamedTransforms(); }) + .def( + "__getitem__", + [](ActiveNamedTransformNameIterator & it, int i) { it.checkIndex(i, (int)it.m_obj->getNumNamedTransforms()); return it.m_obj->getNamedTransformNameByIndex(i); }) - .def("__iter__", [](ActiveNamedTransformNameIterator & it) -> ActiveNamedTransformNameIterator & - { + .def( + "__iter__", + [](ActiveNamedTransformNameIterator & it) -> ActiveNamedTransformNameIterator & { return it; }) - .def("__next__", [](ActiveNamedTransformNameIterator & it) - { - int i = it.nextIndex((int)it.m_obj->getNumNamedTransforms()); - return it.m_obj->getNamedTransformNameByIndex(i); - }); + .def("__next__", [](ActiveNamedTransformNameIterator & it) { + int i = it.nextIndex((int)it.m_obj->getNumNamedTransforms()); + return it.m_obj->getNamedTransformNameByIndex(i); + }); clsActiveNamedTransformIterator - .def("__len__", [](ActiveNamedTransformIterator & it) - { - return it.m_obj->getNumNamedTransforms(); - }) - .def("__getitem__", [](ActiveNamedTransformIterator & it, int i) - { + .def( + "__len__", + [](ActiveNamedTransformIterator & it) { return it.m_obj->getNumNamedTransforms(); }) + .def( + "__getitem__", + [](ActiveNamedTransformIterator & it, int i) { it.checkIndex(i, (int)it.m_obj->getNumNamedTransforms()); const char * name = it.m_obj->getNamedTransformNameByIndex(i); return it.m_obj->getNamedTransform(name); }) - .def("__iter__", [](ActiveNamedTransformIterator & it) -> ActiveNamedTransformIterator & - { - return it; - }) - .def("__next__", [](ActiveNamedTransformIterator & it) - { - int i = it.nextIndex((int)it.m_obj->getNumNamedTransforms()); - const char * name = it.m_obj->getNamedTransformNameByIndex(i); - return it.m_obj->getNamedTransform(name); - }); + .def( + "__iter__", + [](ActiveNamedTransformIterator & it) -> ActiveNamedTransformIterator & { return it; }) + .def("__next__", [](ActiveNamedTransformIterator & it) { + int i = it.nextIndex((int)it.m_obj->getNumNamedTransforms()); + const char * name = it.m_obj->getNamedTransformNameByIndex(i); + return it.m_obj->getNamedTransform(name); + }); - m.def("GetCurrentConfig", &GetCurrentConfig, - DOC(PyOpenColorIO, GetCurrentConfig)); - m.def("SetCurrentConfig", &SetCurrentConfig, "config"_a, - DOC(PyOpenColorIO, SetCurrentConfig)); + m.def("GetCurrentConfig", &GetCurrentConfig, DOC(PyOpenColorIO, GetCurrentConfig)); + m.def("SetCurrentConfig", &SetCurrentConfig, "config"_a, DOC(PyOpenColorIO, SetCurrentConfig)); - m.def("ExtractOCIOZArchive", &ExtractOCIOZArchive, - DOC(PyOpenColorIO, ExtractOCIOZArchive)); + m.def("ExtractOCIOZArchive", &ExtractOCIOZArchive, DOC(PyOpenColorIO, ExtractOCIOZArchive)); - m.def("ResolveConfigPath", &ResolveConfigPath, - DOC(PyOpenColorIO, ResolveConfigPath)); + m.def("ResolveConfigPath", &ResolveConfigPath, DOC(PyOpenColorIO, ResolveConfigPath)); } } // namespace OCIO_NAMESPACE diff --git a/src/bindings/python/PyConfigIOProxy.cpp b/src/bindings/python/PyConfigIOProxy.cpp index 2c9aac83fd..3e0e50b7d2 100644 --- a/src/bindings/python/PyConfigIOProxy.cpp +++ b/src/bindings/python/PyConfigIOProxy.cpp @@ -7,9 +7,9 @@ #include "PyOpenColorIO.h" #include "PyUtils.h" +#include #include #include -#include PYBIND11_MAKE_OPAQUE(std::vector); @@ -22,29 +22,29 @@ struct PyConfigIOProxy : ConfigIOProxy std::vector getLutData(const char * filepath) const override { PYBIND11_OVERRIDE_PURE( - std::vector, // Return type. - ConfigIOProxy, // Parent class. - getLutData, // Name of function in C++ (must match Python name). - filepath // Argument. + std::vector, // Return type. + ConfigIOProxy, // Parent class. + getLutData, // Name of function in C++ (must match Python name). + filepath // Argument. ); } std::string getConfigData() const override { PYBIND11_OVERRIDE_PURE( - std::string, // Return type. - ConfigIOProxy, // Parent class. - getConfigData, // Name of function in C++ (must match Python name). + std::string, // Return type. + ConfigIOProxy, // Parent class. + getConfigData, // Name of function in C++ (must match Python name). ); } std::string getFastLutFileHash(const char * filepath) const override { PYBIND11_OVERRIDE_PURE( - std::string, // Return type. - ConfigIOProxy, // Parent class. - getFastLutFileHash, // Name of function in C++ (must match Python name). - filepath // Argument. + std::string, // Return type. + ConfigIOProxy, // Parent class. + getFastLutFileHash, // Name of function in C++ (must match Python name). + filepath // Argument. ); } }; @@ -62,4 +62,4 @@ void bindPyConfigIOProxy(py::module & m) .def("getFastLutFileHash", &ConfigIOProxy::getFastLutFileHash); } -} \ No newline at end of file +} // namespace OCIO_NAMESPACE \ No newline at end of file diff --git a/src/bindings/python/PyContext.cpp b/src/bindings/python/PyContext.cpp index 132f52a718..b46b8b5882 100644 --- a/src/bindings/python/PyContext.cpp +++ b/src/bindings/python/PyContext.cpp @@ -8,7 +8,7 @@ namespace OCIO_NAMESPACE { -namespace +namespace { enum ContextIterator @@ -37,7 +37,7 @@ std::map getStringVarsStdMap(const ContextRcPtr & p) std::map stringVars; for (int i = 0; i < p->getNumStringVars(); i++) { - const char * name = p->getStringVarNameByIndex(i); + const char * name = p->getStringVarNameByIndex(i); stringVars[std::string(name)] = std::string(p->getStringVar(name)); } return stringVars; @@ -49,33 +49,27 @@ void bindPyContext(py::module & m) { ContextRcPtr DEFAULT = Context::Create(); - auto clsContext = - py::class_( - m.attr("Context")); - - auto clsStringVarNameIterator = - py::class_( - clsContext, "StringVarNameIterator"); - - auto clsStringVarIterator = - py::class_( - clsContext, "StringVarIterator"); - - auto clsSearchPathIterator = - py::class_( - clsContext, "SearchPathIterator"); - - clsContext - .def(py::init(&Context::Create), - DOC(Context, Create)) - .def(py::init([](const std::string & workingDir, - const std::vector & searchPaths, - const std::map stringVars, - EnvironmentMode environmentMode) - { + auto clsContext = py::class_(m.attr("Context")); + + auto clsStringVarNameIterator + = py::class_(clsContext, "StringVarNameIterator"); + + auto clsStringVarIterator = py::class_(clsContext, "StringVarIterator"); + + auto clsSearchPathIterator = py::class_(clsContext, "SearchPathIterator"); + + clsContext.def(py::init(&Context::Create), DOC(Context, Create)) + .def( + py::init([](const std::string & workingDir, + const std::vector & searchPaths, + const std::map stringVars, + EnvironmentMode environmentMode) { ContextRcPtr p = Context::Create(); - if (!workingDir.empty()) { p->setWorkingDir(workingDir.c_str()); } - + if (!workingDir.empty()) + { + p->setWorkingDir(workingDir.c_str()); + } + if (!searchPaths.empty()) { for (const auto & path : searchPaths) @@ -86,7 +80,7 @@ void bindPyContext(py::module & m) if (!stringVars.empty()) { - for (const auto & var: stringVars) + for (const auto & var : stringVars) { p->setStringVar(var.first.c_str(), var.second.c_str()); } @@ -94,27 +88,23 @@ void bindPyContext(py::module & m) p->setEnvironmentMode(environmentMode); return p; - }), - "workingDir"_a = DEFAULT->getWorkingDir(), - "searchPaths"_a = getSearchPathsStdVec(DEFAULT), - "stringVars"_a = getStringVarsStdMap(DEFAULT), - "environmentMode"_a = DEFAULT->getEnvironmentMode(), - DOC(Context, Create)) - - .def("__deepcopy__", [](const ConstContextRcPtr & self, py::dict) - { - return self->createEditableCopy(); - }, + }), + "workingDir"_a = DEFAULT->getWorkingDir(), + "searchPaths"_a = getSearchPathsStdVec(DEFAULT), + "stringVars"_a = getStringVarsStdMap(DEFAULT), + "environmentMode"_a = DEFAULT->getEnvironmentMode(), + DOC(Context, Create)) + + .def( + "__deepcopy__", + [](const ConstContextRcPtr & self, py::dict) { return self->createEditableCopy(); }, "memo"_a) - .def("__iter__", [](ContextRcPtr & self) - { - return StringVarNameIterator(self); - }) - .def("__len__", &Context::getNumStringVars, - DOC(Context, getNumStringVars)) - .def("__getitem__", [](ContextRcPtr & self, const std::string & name) -> const char * - { + .def("__iter__", [](ContextRcPtr & self) { return StringVarNameIterator(self); }) + .def("__len__", &Context::getNumStringVars, DOC(Context, getNumStringVars)) + .def( + "__getitem__", + [](ContextRcPtr & self, const std::string & name) -> const char * { for (int i = 0; i < self->getNumStringVars(); i++) { const char * varName = self->getStringVarNameByIndex(i); @@ -123,17 +113,17 @@ void bindPyContext(py::module & m) return self->getStringVar(name.c_str()); } } - + std::ostringstream os; os << "'" << name << "'"; throw py::key_error(os.str().c_str()); }, - "name"_a, - DOC(Context, getStringVar)) - .def("__setitem__", &Context::setStringVar, "name"_a, "value"_a, - DOC(Context, setStringVar)) - .def("__contains__", [](ContextRcPtr & self, const std::string & name) -> bool - { + "name"_a, + DOC(Context, getStringVar)) + .def("__setitem__", &Context::setStringVar, "name"_a, "value"_a, DOC(Context, setStringVar)) + .def( + "__contains__", + [](ContextRcPtr & self, const std::string & name) -> bool { for (int i = 0; i < self->getNumStringVars(); i++) { const char * varName = self->getStringVarNameByIndex(i); @@ -146,105 +136,96 @@ void bindPyContext(py::module & m) }, "name"_a) - .def("getCacheID", &Context::getCacheID, - DOC(Context, getCacheID)) - .def("getSearchPath", (const char * (Context::*)() const) &Context::getSearchPath, - DOC(Context, getSearchPath)) - .def("setSearchPath", &Context::setSearchPath, "path"_a, - DOC(Context, setSearchPath)) - .def("getSearchPaths", [](ContextRcPtr & self) - { - return SearchPathIterator(self); - }) - .def("clearSearchPaths", &Context::clearSearchPaths, - DOC(Context, clearSearchPaths)) - .def("addSearchPath", &Context::addSearchPath, "path"_a, - DOC(Context, addSearchPath)) - .def("getWorkingDir", &Context::getWorkingDir, - DOC(Context, getWorkingDir)) - .def("setWorkingDir", &Context::setWorkingDir, "dirName"_a, - DOC(Context, setWorkingDir)) - .def("getStringVars", [](ContextRcPtr & self) - { - return StringVarIterator(self); - }) - .def("clearStringVars", &Context::clearStringVars, - DOC(Context, clearStringVars)) - .def("getEnvironmentMode", &Context::getEnvironmentMode, - DOC(Context, getEnvironmentMode)) - .def("setEnvironmentMode", &Context::setEnvironmentMode, "mode"_a, - DOC(Context, setEnvironmentMode)) - .def("loadEnvironment", &Context::loadEnvironment, - DOC(Context, loadEnvironment)) - .def("resolveStringVar", - (const char * (Context::*)(const char *) const noexcept) - &Context::resolveStringVar, - "string"_a, - DOC(Context, resolveStringVar)) - .def("resolveStringVar", - (const char * (Context::*)(const char *, ContextRcPtr &) const noexcept) - &Context::resolveStringVar, - "string"_a, "usedContextVars"_a, - DOC(Context, resolveStringVar, 2)) - .def("resolveFileLocation", - (const char * (Context::*)(const char *) const) - &Context::resolveFileLocation, - "filename"_a, - DOC(Context, resolveFileLocation)) - .def("resolveFileLocation", - (const char * (Context::*)(const char *, ContextRcPtr &) const) - &Context::resolveFileLocation, - "filename"_a, "usedContextVars"_a, - DOC(Context, resolveFileLocation, 2)); + .def("getCacheID", &Context::getCacheID, DOC(Context, getCacheID)) + .def( + "getSearchPath", + (const char * (Context::*)() const) & Context::getSearchPath, + DOC(Context, getSearchPath)) + .def("setSearchPath", &Context::setSearchPath, "path"_a, DOC(Context, setSearchPath)) + .def("getSearchPaths", [](ContextRcPtr & self) { return SearchPathIterator(self); }) + .def("clearSearchPaths", &Context::clearSearchPaths, DOC(Context, clearSearchPaths)) + .def("addSearchPath", &Context::addSearchPath, "path"_a, DOC(Context, addSearchPath)) + .def("getWorkingDir", &Context::getWorkingDir, DOC(Context, getWorkingDir)) + .def("setWorkingDir", &Context::setWorkingDir, "dirName"_a, DOC(Context, setWorkingDir)) + .def("getStringVars", [](ContextRcPtr & self) { return StringVarIterator(self); }) + .def("clearStringVars", &Context::clearStringVars, DOC(Context, clearStringVars)) + .def("getEnvironmentMode", &Context::getEnvironmentMode, DOC(Context, getEnvironmentMode)) + .def( + "setEnvironmentMode", + &Context::setEnvironmentMode, + "mode"_a, + DOC(Context, setEnvironmentMode)) + .def("loadEnvironment", &Context::loadEnvironment, DOC(Context, loadEnvironment)) + .def( + "resolveStringVar", + (const char * (Context::*)(const char *) const noexcept) & Context::resolveStringVar, + "string"_a, + DOC(Context, resolveStringVar)) + .def( + "resolveStringVar", + (const char * (Context::*)(const char *, ContextRcPtr &) const noexcept) + & Context::resolveStringVar, + "string"_a, + "usedContextVars"_a, + DOC(Context, resolveStringVar, 2)) + .def( + "resolveFileLocation", + (const char * (Context::*)(const char *) const) & Context::resolveFileLocation, + "filename"_a, + DOC(Context, resolveFileLocation)) + .def( + "resolveFileLocation", + (const char * (Context::*)(const char *, ContextRcPtr &) const) + & Context::resolveFileLocation, + "filename"_a, + "usedContextVars"_a, + DOC(Context, resolveFileLocation, 2)); defRepr(clsContext); clsStringVarNameIterator - .def("__len__", [](StringVarNameIterator & it) - { - return it.m_obj->getNumStringVars(); - }) - .def("__getitem__", [](StringVarNameIterator & it, int i) - { + .def("__len__", [](StringVarNameIterator & it) { return it.m_obj->getNumStringVars(); }) + .def( + "__getitem__", + [](StringVarNameIterator & it, int i) { it.checkIndex(i, it.m_obj->getNumStringVars()); return it.m_obj->getStringVarNameByIndex(i); }) .def("__iter__", [](StringVarNameIterator & it) -> StringVarNameIterator & { return it; }) - .def("__next__", [](StringVarNameIterator & it) - { - int i = it.nextIndex(it.m_obj->getNumStringVars()); - return it.m_obj->getStringVarNameByIndex(i); - }); + .def("__next__", [](StringVarNameIterator & it) { + int i = it.nextIndex(it.m_obj->getNumStringVars()); + return it.m_obj->getStringVarNameByIndex(i); + }); clsStringVarIterator .def("__len__", [](StringVarIterator & it) { return it.m_obj->getNumStringVars(); }) - .def("__getitem__", [](StringVarIterator & it, int i) - { + .def( + "__getitem__", + [](StringVarIterator & it, int i) { it.checkIndex(i, it.m_obj->getNumStringVars()); const char * name = it.m_obj->getStringVarNameByIndex(i); return py::make_tuple(name, it.m_obj->getStringVar(name)); }) .def("__iter__", [](StringVarIterator & it) -> StringVarIterator & { return it; }) - .def("__next__", [](StringVarIterator & it) - { - int i = it.nextIndex(it.m_obj->getNumStringVars()); - const char * name = it.m_obj->getStringVarNameByIndex(i); - return py::make_tuple(name, it.m_obj->getStringVar(name)); - }); + .def("__next__", [](StringVarIterator & it) { + int i = it.nextIndex(it.m_obj->getNumStringVars()); + const char * name = it.m_obj->getStringVarNameByIndex(i); + return py::make_tuple(name, it.m_obj->getStringVar(name)); + }); clsSearchPathIterator .def("__len__", [](SearchPathIterator & it) { return it.m_obj->getNumSearchPaths(); }) - .def("__getitem__", [](SearchPathIterator & it, int i) - { + .def( + "__getitem__", + [](SearchPathIterator & it, int i) { it.checkIndex(i, it.m_obj->getNumSearchPaths()); return it.m_obj->getSearchPath(i); }) .def("__iter__", [](SearchPathIterator & it) -> SearchPathIterator & { return it; }) - .def("__next__", [](SearchPathIterator & it) - { - int i = it.nextIndex(it.m_obj->getNumSearchPaths()); - return it.m_obj->getSearchPath(i); - }); + .def("__next__", [](SearchPathIterator & it) { + int i = it.nextIndex(it.m_obj->getNumSearchPaths()); + return it.m_obj->getSearchPath(i); + }); } } // namespace OCIO_NAMESPACE diff --git a/src/bindings/python/PyDynamicProperty.cpp b/src/bindings/python/PyDynamicProperty.cpp index c163161eac..cea682e099 100644 --- a/src/bindings/python/PyDynamicProperty.cpp +++ b/src/bindings/python/PyDynamicProperty.cpp @@ -9,28 +9,43 @@ namespace OCIO_NAMESPACE void bindPyDynamicProperty(py::module & m) { - auto clsDynamicProperty = - py::class_( - m.attr("DynamicProperty")) + auto clsDynamicProperty + = py::class_(m.attr("DynamicProperty")) - .def("getType", &PyDynamicProperty::getType, - DOC(DynamicProperty, getType)) - .def("getDouble", &PyDynamicProperty::getDouble, - DOC(DynamicPropertyValue, AsDouble)) - .def("setDouble", &PyDynamicProperty::setDouble, "val"_a, - DOC(DynamicPropertyValue, AsDouble)) - .def("getGradingPrimary", &PyDynamicProperty::getGradingPrimary, - DOC(DynamicPropertyValue, AsGradingPrimary)) - .def("setGradingPrimary", &PyDynamicProperty::setGradingPrimary, "val"_a, - DOC(DynamicPropertyValue, AsGradingPrimary)) - .def("getGradingRGBCurve", &PyDynamicProperty::getGradingRGBCurve, - DOC(DynamicPropertyValue, AsGradingRGBCurve)) - .def("setGradingRGBCurve", &PyDynamicProperty::setGradingRGBCurve, "val"_a, - DOC(DynamicPropertyValue, AsGradingRGBCurve)) - .def("getGradingTone", &PyDynamicProperty::getGradingTone, - DOC(DynamicPropertyValue, AsGradingTone)) - .def("setGradingTone", &PyDynamicProperty::setGradingTone, "val"_a, - DOC(DynamicPropertyValue, AsGradingTone)); + .def("getType", &PyDynamicProperty::getType, DOC(DynamicProperty, getType)) + .def("getDouble", &PyDynamicProperty::getDouble, DOC(DynamicPropertyValue, AsDouble)) + .def( + "setDouble", + &PyDynamicProperty::setDouble, + "val"_a, + DOC(DynamicPropertyValue, AsDouble)) + .def( + "getGradingPrimary", + &PyDynamicProperty::getGradingPrimary, + DOC(DynamicPropertyValue, AsGradingPrimary)) + .def( + "setGradingPrimary", + &PyDynamicProperty::setGradingPrimary, + "val"_a, + DOC(DynamicPropertyValue, AsGradingPrimary)) + .def( + "getGradingRGBCurve", + &PyDynamicProperty::getGradingRGBCurve, + DOC(DynamicPropertyValue, AsGradingRGBCurve)) + .def( + "setGradingRGBCurve", + &PyDynamicProperty::setGradingRGBCurve, + "val"_a, + DOC(DynamicPropertyValue, AsGradingRGBCurve)) + .def( + "getGradingTone", + &PyDynamicProperty::getGradingTone, + DOC(DynamicPropertyValue, AsGradingTone)) + .def( + "setGradingTone", + &PyDynamicProperty::setGradingTone, + "val"_a, + DOC(DynamicPropertyValue, AsGradingTone)); } } // namespace OCIO_NAMESPACE diff --git a/src/bindings/python/PyDynamicProperty.h b/src/bindings/python/PyDynamicProperty.h index 3180ed6a54..9b87689a62 100644 --- a/src/bindings/python/PyDynamicProperty.h +++ b/src/bindings/python/PyDynamicProperty.h @@ -19,10 +19,7 @@ struct OCIOHIDDEN PyDynamicProperty virtual ~PyDynamicProperty() = default; - DynamicPropertyType getType() const - { - return m_prop->getType(); - } + DynamicPropertyType getType() const { return m_prop->getType(); } double getDouble() { diff --git a/src/bindings/python/PyFileRules.cpp b/src/bindings/python/PyFileRules.cpp index b735474260..6cbd41f1fe 100644 --- a/src/bindings/python/PyFileRules.cpp +++ b/src/bindings/python/PyFileRules.cpp @@ -9,74 +9,131 @@ namespace OCIO_NAMESPACE void bindPyFileRules(py::module & m) { - auto clsFileRules = - py::class_( - m.attr("FileRules")) + auto clsFileRules + = py::class_(m.attr("FileRules")) - .def(py::init(&FileRules::Create), - DOC(FileRules, Create)) + .def(py::init(&FileRules::Create), DOC(FileRules, Create)) - .def("__deepcopy__", [](const ConstFileRulesRcPtr & self, py::dict) - { - return self->createEditableCopy(); - }, - "memo"_a) + .def( + "__deepcopy__", + [](const ConstFileRulesRcPtr & self, py::dict) { + return self->createEditableCopy(); + }, + "memo"_a) - .def("getNumEntries", &FileRules::getNumEntries, - DOC(FileRules, getNumEntries)) - .def("getIndexForRule", &FileRules::getIndexForRule, "ruleName"_a, - DOC(FileRules, getIndexForRule)) - .def("getName", &FileRules::getName, "ruleIndex"_a, - DOC(FileRules, getName)) - .def("getPattern", &FileRules::getPattern, "ruleIndex"_a, - DOC(FileRules, getPattern)) - .def("setPattern", &FileRules::setPattern, "ruleIndex"_a, "pattern"_a, - DOC(FileRules, setPattern)) - .def("getExtension", &FileRules::getExtension, "ruleIndex"_a, - DOC(FileRules, getExtension)) - .def("setExtension", &FileRules::setExtension, "ruleIndex"_a, "extension"_a, - DOC(FileRules, setExtension)) - .def("getRegex", &FileRules::getRegex, "ruleIndex"_a, - DOC(FileRules, getRegex)) - .def("setRegex", &FileRules::setRegex, "ruleIndex"_a, "regex"_a, - DOC(FileRules, setRegex)) - .def("getColorSpace", &FileRules::getColorSpace, "ruleIndex"_a, - DOC(FileRules, getColorSpace)) - .def("setColorSpace", &FileRules::setColorSpace, "ruleIndex"_a, "colorSpace"_a, - DOC(FileRules, setColorSpace)) - .def("getNumCustomKeys", &FileRules::getNumCustomKeys, "ruleIndex"_a, - DOC(FileRules, getNumCustomKeys)) - .def("getCustomKeyName", &FileRules::getCustomKeyName, "ruleIndex"_a, "key"_a, - DOC(FileRules, getCustomKeyName)) - .def("getCustomKeyValue", &FileRules::getCustomKeyValue, "ruleIndex"_a, "key"_a, - DOC(FileRules, getCustomKeyValue)) - .def("setCustomKey", &FileRules::setCustomKey, "ruleIndex"_a, "key"_a, "value"_a, - DOC(FileRules, setCustomKey)) - .def("insertRule", - (void (FileRules::*)(size_t, const char *, const char *, const char *, const char *)) - &FileRules::insertRule, - "ruleIndex"_a, "name"_a, "colorSpace"_a, "pattern"_a, "extension"_a, - DOC(FileRules, insertRule)) - .def("insertRule", - (void (FileRules::*)(size_t, const char *, const char *, const char *)) - &FileRules::insertRule, - "ruleIndex"_a, "name"_a, "colorSpace"_a, "regex"_a, - DOC(FileRules, insertRule, 2)) - .def("insertPathSearchRule", &FileRules::insertPathSearchRule, "ruleIndex"_a, - DOC(FileRules, insertPathSearchRule)) - .def("setDefaultRuleColorSpace", &FileRules::setDefaultRuleColorSpace, "colorSpace"_a, - DOC(FileRules, setDefaultRuleColorSpace)) - .def("removeRule", &FileRules::removeRule, "ruleIndex"_a, - DOC(FileRules, removeRule)) - .def("increaseRulePriority", &FileRules::increaseRulePriority, "ruleIndex"_a, - DOC(FileRules, increaseRulePriority)) - .def("decreaseRulePriority", &FileRules::decreaseRulePriority, "ruleIndex"_a, - DOC(FileRules, decreaseRulePriority)) - .def("isDefault", &FileRules::isDefault, DOC(FileRules, isDefault)); + .def("getNumEntries", &FileRules::getNumEntries, DOC(FileRules, getNumEntries)) + .def( + "getIndexForRule", + &FileRules::getIndexForRule, + "ruleName"_a, + DOC(FileRules, getIndexForRule)) + .def("getName", &FileRules::getName, "ruleIndex"_a, DOC(FileRules, getName)) + .def("getPattern", &FileRules::getPattern, "ruleIndex"_a, DOC(FileRules, getPattern)) + .def( + "setPattern", + &FileRules::setPattern, + "ruleIndex"_a, + "pattern"_a, + DOC(FileRules, setPattern)) + .def( + "getExtension", + &FileRules::getExtension, + "ruleIndex"_a, + DOC(FileRules, getExtension)) + .def( + "setExtension", + &FileRules::setExtension, + "ruleIndex"_a, + "extension"_a, + DOC(FileRules, setExtension)) + .def("getRegex", &FileRules::getRegex, "ruleIndex"_a, DOC(FileRules, getRegex)) + .def( + "setRegex", + &FileRules::setRegex, + "ruleIndex"_a, + "regex"_a, + DOC(FileRules, setRegex)) + .def( + "getColorSpace", + &FileRules::getColorSpace, + "ruleIndex"_a, + DOC(FileRules, getColorSpace)) + .def( + "setColorSpace", + &FileRules::setColorSpace, + "ruleIndex"_a, + "colorSpace"_a, + DOC(FileRules, setColorSpace)) + .def( + "getNumCustomKeys", + &FileRules::getNumCustomKeys, + "ruleIndex"_a, + DOC(FileRules, getNumCustomKeys)) + .def( + "getCustomKeyName", + &FileRules::getCustomKeyName, + "ruleIndex"_a, + "key"_a, + DOC(FileRules, getCustomKeyName)) + .def( + "getCustomKeyValue", + &FileRules::getCustomKeyValue, + "ruleIndex"_a, + "key"_a, + DOC(FileRules, getCustomKeyValue)) + .def( + "setCustomKey", + &FileRules::setCustomKey, + "ruleIndex"_a, + "key"_a, + "value"_a, + DOC(FileRules, setCustomKey)) + .def( + "insertRule", + (void( + FileRules::*)(size_t, const char *, const char *, const char *, const char *)) + & FileRules::insertRule, + "ruleIndex"_a, + "name"_a, + "colorSpace"_a, + "pattern"_a, + "extension"_a, + DOC(FileRules, insertRule)) + .def( + "insertRule", + (void(FileRules::*)(size_t, const char *, const char *, const char *)) + & FileRules::insertRule, + "ruleIndex"_a, + "name"_a, + "colorSpace"_a, + "regex"_a, + DOC(FileRules, insertRule, 2)) + .def( + "insertPathSearchRule", + &FileRules::insertPathSearchRule, + "ruleIndex"_a, + DOC(FileRules, insertPathSearchRule)) + .def( + "setDefaultRuleColorSpace", + &FileRules::setDefaultRuleColorSpace, + "colorSpace"_a, + DOC(FileRules, setDefaultRuleColorSpace)) + .def("removeRule", &FileRules::removeRule, "ruleIndex"_a, DOC(FileRules, removeRule)) + .def( + "increaseRulePriority", + &FileRules::increaseRulePriority, + "ruleIndex"_a, + DOC(FileRules, increaseRulePriority)) + .def( + "decreaseRulePriority", + &FileRules::decreaseRulePriority, + "ruleIndex"_a, + DOC(FileRules, decreaseRulePriority)) + .def("isDefault", &FileRules::isDefault, DOC(FileRules, isDefault)); defRepr(clsFileRules); - m.attr("DEFAULT_RULE_NAME") = FileRules::DefaultRuleName; + m.attr("DEFAULT_RULE_NAME") = FileRules::DefaultRuleName; m.attr("FILE_PATH_SEARCH_RULE_NAME") = FileRules::FilePathSearchRuleName; } diff --git a/src/bindings/python/PyFormatMetadata.cpp b/src/bindings/python/PyFormatMetadata.cpp index af82122d28..5d7b6983bd 100644 --- a/src/bindings/python/PyFormatMetadata.cpp +++ b/src/bindings/python/PyFormatMetadata.cpp @@ -31,35 +31,26 @@ using ChildElementIterator = PyIterator void bindPyFormatMetadata(py::module & m) { - auto clsFormatMetadata = - py::class_( - m.attr("FormatMetadata")); + auto clsFormatMetadata = py::class_(m.attr("FormatMetadata")); - auto clsAttributeNameIterator = - py::class_( - clsFormatMetadata, "AttributeNameIterator"); + auto clsAttributeNameIterator + = py::class_(clsFormatMetadata, "AttributeNameIterator"); - auto clsAttributeIterator = - py::class_( - clsFormatMetadata, "AttributeIterator"); + auto clsAttributeIterator + = py::class_(clsFormatMetadata, "AttributeIterator"); - auto clsConstChildElementIterator = - py::class_( - clsFormatMetadata, "ConstChildElementIterator"); + auto clsConstChildElementIterator + = py::class_(clsFormatMetadata, "ConstChildElementIterator"); - auto clsChildElementIterator = - py::class_( - clsFormatMetadata, "ChildElementIterator"); + auto clsChildElementIterator + = py::class_(clsFormatMetadata, "ChildElementIterator"); clsFormatMetadata - .def("__iter__", [](const FormatMetadata & self) - { - return AttributeNameIterator(self); - }) - .def("__len__", &FormatMetadata::getNumAttributes, - DOC(FormatMetadata, getNumAttributes)) - .def("__getitem__", [](const FormatMetadata & self, const std::string & name) - { + .def("__iter__", [](const FormatMetadata & self) { return AttributeNameIterator(self); }) + .def("__len__", &FormatMetadata::getNumAttributes, DOC(FormatMetadata, getNumAttributes)) + .def( + "__getitem__", + [](const FormatMetadata & self, const std::string & name) { for (int i = 0; i < self.getNumAttributes(); i++) { const char * attrName = self.getAttributeName(i); @@ -73,12 +64,17 @@ void bindPyFormatMetadata(py::module & m) os << " '" << name << "'"; throw py::key_error(os.str()); }, - "name"_a.none(false), - DOC(FormatMetadata, getAttributeValue)) - .def("__setitem__", &FormatMetadata::addAttribute, "name"_a.none(false), "value"_a.none(false), - DOC(FormatMetadata, addAttribute)) - .def("__contains__", [](const FormatMetadata & self, const std::string & name) -> bool - { + "name"_a.none(false), + DOC(FormatMetadata, getAttributeValue)) + .def( + "__setitem__", + &FormatMetadata::addAttribute, + "name"_a.none(false), + "value"_a.none(false), + DOC(FormatMetadata, addAttribute)) + .def( + "__contains__", + [](const FormatMetadata & self, const std::string & name) -> bool { for (int i = 0; i < self.getNumAttributes(); i++) { const char * attrName = self.getAttributeName(i); @@ -89,114 +85,115 @@ void bindPyFormatMetadata(py::module & m) } return false; }, - "name"_a.none(false)) - .def("__repr__", [](const FormatMetadata & self) - { + "name"_a.none(false)) + .def( + "__repr__", + [](const FormatMetadata & self) { std::ostringstream oss; oss << self; return oss.str(); }) - .def("getElementName", &FormatMetadata::getElementName, - DOC(FormatMetadata, getElementName)) - .def("setElementName", &FormatMetadata::setElementName, "name"_a.none(false), - DOC(FormatMetadata, setElementName)) - .def("getElementValue", &FormatMetadata::getElementValue, - DOC(FormatMetadata, getElementValue)) - .def("setElementValue", &FormatMetadata::setElementValue, "value"_a.none(false), - DOC(FormatMetadata, setElementValue)) - .def("getAttributes", [](const FormatMetadata & self) - { - return AttributeIterator(self); - }) - .def("getChildElements", [](FormatMetadata & self) - { - return ChildElementIterator(self); - }) - .def("addChildElement", &FormatMetadata::addChildElement, - "name"_a.none(false), "value"_a.none(false), - DOC(FormatMetadata, addChildElement)) - .def("getName", &FormatMetadata::getName, - DOC(FormatMetadata, getName)) - .def("setName", &FormatMetadata::setName, "name"_a.none(false), - DOC(FormatMetadata, setName)) - .def("getID", &FormatMetadata::getID, - DOC(FormatMetadata, getID)) - .def("setID", &FormatMetadata::setID, "id"_a.none(false), - DOC(FormatMetadata, setID)) - .def("clear", &FormatMetadata::clear, - DOC(FormatMetadata, clear)); + .def("getElementName", &FormatMetadata::getElementName, DOC(FormatMetadata, getElementName)) + .def( + "setElementName", + &FormatMetadata::setElementName, + "name"_a.none(false), + DOC(FormatMetadata, setElementName)) + .def( + "getElementValue", + &FormatMetadata::getElementValue, + DOC(FormatMetadata, getElementValue)) + .def( + "setElementValue", + &FormatMetadata::setElementValue, + "value"_a.none(false), + DOC(FormatMetadata, setElementValue)) + .def("getAttributes", [](const FormatMetadata & self) { return AttributeIterator(self); }) + .def("getChildElements", [](FormatMetadata & self) { return ChildElementIterator(self); }) + .def( + "addChildElement", + &FormatMetadata::addChildElement, + "name"_a.none(false), + "value"_a.none(false), + DOC(FormatMetadata, addChildElement)) + .def("getName", &FormatMetadata::getName, DOC(FormatMetadata, getName)) + .def( + "setName", + &FormatMetadata::setName, + "name"_a.none(false), + DOC(FormatMetadata, setName)) + .def("getID", &FormatMetadata::getID, DOC(FormatMetadata, getID)) + .def("setID", &FormatMetadata::setID, "id"_a.none(false), DOC(FormatMetadata, setID)) + .def("clear", &FormatMetadata::clear, DOC(FormatMetadata, clear)); clsAttributeNameIterator .def("__len__", [](AttributeNameIterator & it) { return it.m_obj.getNumAttributes(); }) - .def("__getitem__", [](AttributeNameIterator & it, int i) - { + .def( + "__getitem__", + [](AttributeNameIterator & it, int i) { it.checkIndex(i, it.m_obj.getNumAttributes()); return it.m_obj.getAttributeName(i); }) .def("__iter__", [](AttributeNameIterator & it) -> AttributeNameIterator & { return it; }) - .def("__next__", [](AttributeNameIterator & it) - { - int i = it.nextIndex(it.m_obj.getNumAttributes()); - return it.m_obj.getAttributeName(i); - }); + .def("__next__", [](AttributeNameIterator & it) { + int i = it.nextIndex(it.m_obj.getNumAttributes()); + return it.m_obj.getAttributeName(i); + }); clsAttributeIterator .def("__len__", [](AttributeIterator & it) { return it.m_obj.getNumAttributes(); }) - .def("__getitem__", [](AttributeIterator & it, int i) - { + .def( + "__getitem__", + [](AttributeIterator & it, int i) { it.checkIndex(i, it.m_obj.getNumAttributes()); - return py::make_tuple(it.m_obj.getAttributeName(i), - it.m_obj.getAttributeValue(i)); + return py::make_tuple(it.m_obj.getAttributeName(i), it.m_obj.getAttributeValue(i)); }) .def("__iter__", [](AttributeIterator & it) -> AttributeIterator & { return it; }) - .def("__next__", [](AttributeIterator & it) - { - int i = it.nextIndex(it.m_obj.getNumAttributes()); - return py::make_tuple(it.m_obj.getAttributeName(i), - it.m_obj.getAttributeValue(i)); - }); + .def("__next__", [](AttributeIterator & it) { + int i = it.nextIndex(it.m_obj.getNumAttributes()); + return py::make_tuple(it.m_obj.getAttributeName(i), it.m_obj.getAttributeValue(i)); + }); clsConstChildElementIterator - .def("__len__", [](ConstChildElementIterator & it) - { - return it.m_obj.getNumChildrenElements(); - }) - .def("__getitem__", [](ConstChildElementIterator & it, int i) -> const FormatMetadata & - { + .def( + "__len__", + [](ConstChildElementIterator & it) { return it.m_obj.getNumChildrenElements(); }) + .def( + "__getitem__", + [](ConstChildElementIterator & it, int i) -> const FormatMetadata & { // FormatMetadata provides index check with exception return it.m_obj.getChildElement(i); - }, - py::return_value_policy::reference_internal) - .def("__iter__", [](ConstChildElementIterator & it) -> ConstChildElementIterator & - { - return it; - }) - .def("__next__", [](ConstChildElementIterator & it) -> const FormatMetadata & - { + }, + py::return_value_policy::reference_internal) + .def( + "__iter__", + [](ConstChildElementIterator & it) -> ConstChildElementIterator & { return it; }) + .def( + "__next__", + [](ConstChildElementIterator & it) -> const FormatMetadata & { int i = it.nextIndex(it.m_obj.getNumChildrenElements()); return it.m_obj.getChildElement(i); - }, - py::return_value_policy::reference_internal); + }, + py::return_value_policy::reference_internal); clsChildElementIterator - .def("__len__", [](ChildElementIterator & it) - { - return it.m_obj.getNumChildrenElements(); - }) - .def("__getitem__", [](ChildElementIterator & it, int i) -> FormatMetadata & - { + .def("__len__", [](ChildElementIterator & it) { return it.m_obj.getNumChildrenElements(); }) + .def( + "__getitem__", + [](ChildElementIterator & it, int i) -> FormatMetadata & { // FormatMetadata provides index check with exception return it.m_obj.getChildElement(i); - }, - py::return_value_policy::reference_internal) + }, + py::return_value_policy::reference_internal) .def("__iter__", [](ChildElementIterator & it) -> ChildElementIterator & { return it; }) - .def("__next__", [](ChildElementIterator & it) -> FormatMetadata & - { + .def( + "__next__", + [](ChildElementIterator & it) -> FormatMetadata & { int i = it.nextIndex(it.m_obj.getNumChildrenElements()); return it.m_obj.getChildElement(i); - }, - py::return_value_policy::reference_internal); + }, + py::return_value_policy::reference_internal); } } // namespace OCIO_NAMESPACE diff --git a/src/bindings/python/PyGPUProcessor.cpp b/src/bindings/python/PyGPUProcessor.cpp index 01986eb1c7..bb320182ad 100644 --- a/src/bindings/python/PyGPUProcessor.cpp +++ b/src/bindings/python/PyGPUProcessor.cpp @@ -8,21 +8,21 @@ namespace OCIO_NAMESPACE void bindPyGPUProcessor(py::module & m) { - auto clsGPUProcessor = - py::class_( - m.attr("GPUProcessor")) + auto clsGPUProcessor + = py::class_(m.attr("GPUProcessor")) - .def("isNoOp", &GPUProcessor::isNoOp, - DOC(GPUProcessor, isNoOp)) - .def("hasChannelCrosstalk", &GPUProcessor::hasChannelCrosstalk, - DOC(GPUProcessor, hasChannelCrosstalk)) - .def("getCacheID", &GPUProcessor::getCacheID, - DOC(GPUProcessor, getCacheID)) - .def("extractGpuShaderInfo", - (void (GPUProcessor::*)(GpuShaderDescRcPtr &) const) - &GPUProcessor::extractGpuShaderInfo, - "shaderDesc"_a, - DOC(GPUProcessor, extractGpuShaderInfo)); + .def("isNoOp", &GPUProcessor::isNoOp, DOC(GPUProcessor, isNoOp)) + .def( + "hasChannelCrosstalk", + &GPUProcessor::hasChannelCrosstalk, + DOC(GPUProcessor, hasChannelCrosstalk)) + .def("getCacheID", &GPUProcessor::getCacheID, DOC(GPUProcessor, getCacheID)) + .def( + "extractGpuShaderInfo", + (void(GPUProcessor::*)(GpuShaderDescRcPtr &) const) + & GPUProcessor::extractGpuShaderInfo, + "shaderDesc"_a, + DOC(GPUProcessor, extractGpuShaderInfo)); } } // namespace OCIO_NAMESPACE diff --git a/src/bindings/python/PyGpuShaderCreator.cpp b/src/bindings/python/PyGpuShaderCreator.cpp index c133cb3efd..061a4669a4 100644 --- a/src/bindings/python/PyGpuShaderCreator.cpp +++ b/src/bindings/python/PyGpuShaderCreator.cpp @@ -1,8 +1,8 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. -#include "PyDynamicProperty.h" #include "PyGpuShaderCreator.h" +#include "PyDynamicProperty.h" namespace OCIO_NAMESPACE { @@ -21,128 +21,163 @@ using DynamicPropertyIterator = PyIterator( - m.attr("GpuShaderCreator")); - - auto enumTextureType = - py::enum_( - clsGpuShaderCreator, "TextureType", - DOC(GpuShaderCreator, TextureType)); - - auto enumTextureDimensions = - py::enum_( - clsGpuShaderCreator, "TextureDimensions", - DOC(GpuShaderCreator, TextureDimensions)); - - auto clsDynamicPropertyIterator = - py::class_( - clsGpuShaderCreator, "DynamicPropertyIterator"); - - clsGpuShaderCreator - .def("clone", &GpuShaderCreator::clone, - DOC(GpuShaderCreator, clone)) - .def("getUniqueID", &GpuShaderCreator::getUniqueID, - DOC(GpuShaderCreator, getUniqueID)) - .def("setUniqueID", &GpuShaderCreator::setUniqueID, "uid"_a, - DOC(GpuShaderCreator, setUniqueID)) - .def("getLanguage", &GpuShaderCreator::getLanguage, - DOC(GpuShaderCreator, getLanguage)) - .def("setLanguage", &GpuShaderCreator::setLanguage, "language"_a, - DOC(GpuShaderCreator, setLanguage)) - .def("getFunctionName", &GpuShaderCreator::getFunctionName, - DOC(GpuShaderCreator, getFunctionName)) - .def("setFunctionName", &GpuShaderCreator::setFunctionName, "name"_a, - DOC(GpuShaderCreator, setFunctionName)) - .def("getPixelName", &GpuShaderCreator::getPixelName, - DOC(GpuShaderCreator, getPixelName)) - .def("setPixelName", &GpuShaderCreator::setPixelName, "name"_a, - DOC(GpuShaderCreator, setPixelName)) - .def("getResourcePrefix", &GpuShaderCreator::getResourcePrefix, - DOC(GpuShaderCreator, getResourcePrefix)) - .def("setResourcePrefix", &GpuShaderCreator::setResourcePrefix, "prefix"_a, - DOC(GpuShaderCreator, setResourcePrefix)) - .def("getCacheID", &GpuShaderCreator::getCacheID, - DOC(GpuShaderCreator, getCacheID)) - .def("begin", &GpuShaderCreator::begin, "uid"_a, - DOC(GpuShaderCreator, begin)) - .def("end", &GpuShaderCreator::end, - DOC(GpuShaderCreator, end)) - .def("getTextureMaxWidth", &GpuShaderCreator::getTextureMaxWidth, - DOC(GpuShaderCreator, getTextureMaxWidth)) - .def("setTextureMaxWidth", &GpuShaderCreator::setTextureMaxWidth, "maxWidth"_a, - DOC(GpuShaderCreator, setTextureMaxWidth)) - .def("setAllowTexture1D", &GpuShaderCreator::setAllowTexture1D, "allowed"_a, + auto clsGpuShaderCreator + = py::class_(m.attr("GpuShaderCreator")); + + auto enumTextureType = py::enum_( + clsGpuShaderCreator, + "TextureType", + DOC(GpuShaderCreator, TextureType)); + + auto enumTextureDimensions = py::enum_( + clsGpuShaderCreator, + "TextureDimensions", + DOC(GpuShaderCreator, TextureDimensions)); + + auto clsDynamicPropertyIterator + = py::class_(clsGpuShaderCreator, "DynamicPropertyIterator"); + + clsGpuShaderCreator.def("clone", &GpuShaderCreator::clone, DOC(GpuShaderCreator, clone)) + .def("getUniqueID", &GpuShaderCreator::getUniqueID, DOC(GpuShaderCreator, getUniqueID)) + .def( + "setUniqueID", + &GpuShaderCreator::setUniqueID, + "uid"_a, + DOC(GpuShaderCreator, setUniqueID)) + .def("getLanguage", &GpuShaderCreator::getLanguage, DOC(GpuShaderCreator, getLanguage)) + .def( + "setLanguage", + &GpuShaderCreator::setLanguage, + "language"_a, + DOC(GpuShaderCreator, setLanguage)) + .def( + "getFunctionName", + &GpuShaderCreator::getFunctionName, + DOC(GpuShaderCreator, getFunctionName)) + .def( + "setFunctionName", + &GpuShaderCreator::setFunctionName, + "name"_a, + DOC(GpuShaderCreator, setFunctionName)) + .def("getPixelName", &GpuShaderCreator::getPixelName, DOC(GpuShaderCreator, getPixelName)) + .def( + "setPixelName", + &GpuShaderCreator::setPixelName, + "name"_a, + DOC(GpuShaderCreator, setPixelName)) + .def( + "getResourcePrefix", + &GpuShaderCreator::getResourcePrefix, + DOC(GpuShaderCreator, getResourcePrefix)) + .def( + "setResourcePrefix", + &GpuShaderCreator::setResourcePrefix, + "prefix"_a, + DOC(GpuShaderCreator, setResourcePrefix)) + .def("getCacheID", &GpuShaderCreator::getCacheID, DOC(GpuShaderCreator, getCacheID)) + .def("begin", &GpuShaderCreator::begin, "uid"_a, DOC(GpuShaderCreator, begin)) + .def("end", &GpuShaderCreator::end, DOC(GpuShaderCreator, end)) + .def( + "getTextureMaxWidth", + &GpuShaderCreator::getTextureMaxWidth, + DOC(GpuShaderCreator, getTextureMaxWidth)) + .def( + "setTextureMaxWidth", + &GpuShaderCreator::setTextureMaxWidth, + "maxWidth"_a, + DOC(GpuShaderCreator, setTextureMaxWidth)) + .def( + "setAllowTexture1D", + &GpuShaderCreator::setAllowTexture1D, + "allowed"_a, DOC(GpuShaderCreator, setAllowTexture1D)) - .def("getAllowTexture1D", &GpuShaderCreator::getAllowTexture1D, - DOC(GpuShaderCreator, getAllowTexture1D)) - .def("getNextResourceIndex", &GpuShaderCreator::getNextResourceIndex, + .def( + "getAllowTexture1D", + &GpuShaderCreator::getAllowTexture1D, + DOC(GpuShaderCreator, getAllowTexture1D)) + .def( + "getNextResourceIndex", + &GpuShaderCreator::getNextResourceIndex, DOC(GpuShaderCreator, getNextResourceIndex)) // Dynamic properties. - .def("hasDynamicProperty", &GpuShaderCreator::hasDynamicProperty, "type"_a, - DOC(GpuShaderCreator, hasDynamicProperty)) - .def("getDynamicProperty", [](GpuShaderCreatorRcPtr & self, DynamicPropertyType type) - { + .def( + "hasDynamicProperty", + &GpuShaderCreator::hasDynamicProperty, + "type"_a, + DOC(GpuShaderCreator, hasDynamicProperty)) + .def( + "getDynamicProperty", + [](GpuShaderCreatorRcPtr & self, DynamicPropertyType type) { return PyDynamicProperty(self->getDynamicProperty(type)); - }, - "type"_a, - DOC(GpuShaderCreator, getDynamicProperty)) - .def("getDynamicProperties", [](GpuShaderCreatorRcPtr & self) - { - return DynamicPropertyIterator(self); - }) + }, + "type"_a, + DOC(GpuShaderCreator, getDynamicProperty)) + .def( + "getDynamicProperties", + [](GpuShaderCreatorRcPtr & self) { return DynamicPropertyIterator(self); }) // Methods to specialize parts of a OCIO shader program - .def("addToDeclareShaderCode", &GpuShaderCreator::addToDeclareShaderCode, "shaderCode"_a, - DOC(GpuShaderCreator, addToDeclareShaderCode)) - .def("addToHelperShaderCode", &GpuShaderCreator::addToHelperShaderCode, "shaderCode"_a, - DOC(GpuShaderCreator, addToHelperShaderCode)) - .def("addToFunctionHeaderShaderCode", - &GpuShaderCreator::addToFunctionHeaderShaderCode, - "shaderCode"_a, - DOC(GpuShaderCreator, addToFunctionHeaderShaderCode)) - .def("addToFunctionShaderCode", &GpuShaderCreator::addToFunctionShaderCode, "shaderCode"_a, - DOC(GpuShaderCreator, addToFunctionShaderCode)) - .def("addToFunctionFooterShaderCode", - &GpuShaderCreator::addToFunctionFooterShaderCode, - "shaderCode"_a, - DOC(GpuShaderCreator, addToFunctionFooterShaderCode)) - .def("createShaderText", &GpuShaderCreator::createShaderText, - "shaderDeclarations"_a, "shaderHelperMethods"_a, "shaderFunctionHeader"_a, - "shaderFunctionBody"_a, "shaderFunctionFooter"_a, - DOC(GpuShaderCreator, createShaderText)) - .def("finalize", &GpuShaderCreator::finalize, - DOC(GpuShaderCreator, finalize)); - - enumTextureType - .value("TEXTURE_RED_CHANNEL", GpuShaderCreator::TEXTURE_RED_CHANNEL) + .def( + "addToDeclareShaderCode", + &GpuShaderCreator::addToDeclareShaderCode, + "shaderCode"_a, + DOC(GpuShaderCreator, addToDeclareShaderCode)) + .def( + "addToHelperShaderCode", + &GpuShaderCreator::addToHelperShaderCode, + "shaderCode"_a, + DOC(GpuShaderCreator, addToHelperShaderCode)) + .def( + "addToFunctionHeaderShaderCode", + &GpuShaderCreator::addToFunctionHeaderShaderCode, + "shaderCode"_a, + DOC(GpuShaderCreator, addToFunctionHeaderShaderCode)) + .def( + "addToFunctionShaderCode", + &GpuShaderCreator::addToFunctionShaderCode, + "shaderCode"_a, + DOC(GpuShaderCreator, addToFunctionShaderCode)) + .def( + "addToFunctionFooterShaderCode", + &GpuShaderCreator::addToFunctionFooterShaderCode, + "shaderCode"_a, + DOC(GpuShaderCreator, addToFunctionFooterShaderCode)) + .def( + "createShaderText", + &GpuShaderCreator::createShaderText, + "shaderDeclarations"_a, + "shaderHelperMethods"_a, + "shaderFunctionHeader"_a, + "shaderFunctionBody"_a, + "shaderFunctionFooter"_a, + DOC(GpuShaderCreator, createShaderText)) + .def("finalize", &GpuShaderCreator::finalize, DOC(GpuShaderCreator, finalize)); + + enumTextureType.value("TEXTURE_RED_CHANNEL", GpuShaderCreator::TEXTURE_RED_CHANNEL) .value("TEXTURE_RGB_CHANNEL", GpuShaderCreator::TEXTURE_RGB_CHANNEL) .export_values(); - enumTextureDimensions - .value("TEXTURE_1D", GpuShaderCreator::TEXTURE_1D) + enumTextureDimensions.value("TEXTURE_1D", GpuShaderCreator::TEXTURE_1D) .value("TEXTURE_2D", GpuShaderCreator::TEXTURE_2D) .export_values(); clsDynamicPropertyIterator - .def("__len__", [](DynamicPropertyIterator & it) - { - return it.m_obj->getNumDynamicProperties(); - }) - .def("__getitem__", [](DynamicPropertyIterator & it, int i) - { + .def( + "__len__", + [](DynamicPropertyIterator & it) { return it.m_obj->getNumDynamicProperties(); }) + .def( + "__getitem__", + [](DynamicPropertyIterator & it, int i) { return PyDynamicProperty(it.m_obj->getDynamicProperty(i)); }) - .def("__iter__", [](DynamicPropertyIterator & it) -> DynamicPropertyIterator & - { - return it; - }) - .def("__next__", [](DynamicPropertyIterator & it) - { - int i = it.nextIndex(it.m_obj->getNumDynamicProperties()); - return PyDynamicProperty(it.m_obj->getDynamicProperty(i)); - }); + .def( + "__iter__", + [](DynamicPropertyIterator & it) -> DynamicPropertyIterator & { return it; }) + .def("__next__", [](DynamicPropertyIterator & it) { + int i = it.nextIndex(it.m_obj->getNumDynamicProperties()); + return PyDynamicProperty(it.m_obj->getDynamicProperty(i)); + }); // Subclasses bindPyGpuShaderDesc(m); diff --git a/src/bindings/python/PyGpuShaderDesc.cpp b/src/bindings/python/PyGpuShaderDesc.cpp index 24bb82412a..ed938887ba 100644 --- a/src/bindings/python/PyGpuShaderDesc.cpp +++ b/src/bindings/python/PyGpuShaderDesc.cpp @@ -16,9 +16,9 @@ enum GpuShaderDescIterator IT_UNIFORM }; -using TextureIterator = PyIterator; -using Texture3DIterator = PyIterator; -using UniformIterator = PyIterator; +using TextureIterator = PyIterator; +using Texture3DIterator = PyIterator; +using UniformIterator = PyIterator; struct Texture { @@ -49,75 +49,73 @@ void bindPyGpuShaderDesc(py::module & m) { GpuShaderDescRcPtr DEFAULT = GpuShaderDesc::CreateShaderDesc(); - auto clsGpuShaderDesc = - py::class_( - m.attr("GpuShaderDesc")); + auto clsGpuShaderDesc + = py::class_(m.attr("GpuShaderDesc")); - auto clsUniformData = - py::class_( - clsGpuShaderDesc, "UniformData"); + auto clsUniformData = py::class_(clsGpuShaderDesc, "UniformData"); - auto clsUniformIterator = - py::class_( - clsGpuShaderDesc, "UniformIterator"); + auto clsUniformIterator = py::class_(clsGpuShaderDesc, "UniformIterator"); - auto clsTexture = - py::class_( - clsGpuShaderDesc, "Texture"); + auto clsTexture = py::class_(clsGpuShaderDesc, "Texture"); - auto clsTextureIterator = - py::class_( - clsGpuShaderDesc, "TextureIterator"); + auto clsTextureIterator = py::class_(clsGpuShaderDesc, "TextureIterator"); - auto clsTexture3D = - py::class_( - clsGpuShaderDesc, "Texture3D"); + auto clsTexture3D = py::class_(clsGpuShaderDesc, "Texture3D"); - auto clsTexture3DIterator = - py::class_( - clsGpuShaderDesc, "Texture3DIterator"); + auto clsTexture3DIterator + = py::class_(clsGpuShaderDesc, "Texture3DIterator"); clsGpuShaderDesc - .def_static("CreateShaderDesc", [](GpuLanguage lang, - const std::string & functionName, - const std::string & pixelName, - const std::string & resourcePrefix, - const std::string & uid) - { + .def_static( + "CreateShaderDesc", + [](GpuLanguage lang, + const std::string & functionName, + const std::string & pixelName, + const std::string & resourcePrefix, + const std::string & uid) { GpuShaderDescRcPtr p = GpuShaderDesc::CreateShaderDesc(); p->setLanguage(lang); - if (!functionName.empty()) { p->setFunctionName(functionName.c_str()); } - if (!pixelName.empty()) { p->setPixelName(pixelName.c_str()); } - if (!resourcePrefix.empty()) { p->setResourcePrefix(resourcePrefix.c_str()); } - if (!uid.empty()) { p->setUniqueID(uid.c_str()); } + if (!functionName.empty()) + { + p->setFunctionName(functionName.c_str()); + } + if (!pixelName.empty()) + { + p->setPixelName(pixelName.c_str()); + } + if (!resourcePrefix.empty()) + { + p->setResourcePrefix(resourcePrefix.c_str()); + } + if (!uid.empty()) + { + p->setUniqueID(uid.c_str()); + } return p; - }, - "language"_a = DEFAULT->getLanguage(), - "functionName"_a = DEFAULT->getFunctionName(), - "pixelName"_a = DEFAULT->getPixelName(), - "resourcePrefix"_a = DEFAULT->getResourcePrefix(), - "uid"_a = DEFAULT->getUniqueID(), - DOC(GpuShaderDesc, CreateShaderDesc)) - - .def("clone", &GpuShaderDesc::clone, - DOC(GpuShaderDesc, clone)) - .def("getShaderText", &GpuShaderDesc::getShaderText, - DOC(GpuShaderDesc, getShaderText)) - .def("getUniforms", [](GpuShaderDescRcPtr & self) - { - return UniformIterator(self); - }) + }, + "language"_a = DEFAULT->getLanguage(), + "functionName"_a = DEFAULT->getFunctionName(), + "pixelName"_a = DEFAULT->getPixelName(), + "resourcePrefix"_a = DEFAULT->getResourcePrefix(), + "uid"_a = DEFAULT->getUniqueID(), + DOC(GpuShaderDesc, CreateShaderDesc)) + + .def("clone", &GpuShaderDesc::clone, DOC(GpuShaderDesc, clone)) + .def("getShaderText", &GpuShaderDesc::getShaderText, DOC(GpuShaderDesc, getShaderText)) + .def("getUniforms", [](GpuShaderDescRcPtr & self) { return UniformIterator(self); }) // 1D lut related methods - .def("addTexture", [](GpuShaderDescRcPtr & self, - const std::string & textureName, - const std::string & samplerName, - unsigned width, unsigned height, - GpuShaderDesc::TextureType channel, - GpuShaderDesc::TextureDimensions dimensions, - Interpolation interpolation, - const py::buffer & values) - { + .def( + "addTexture", + [](GpuShaderDescRcPtr & self, + const std::string & textureName, + const std::string & samplerName, + unsigned width, + unsigned height, + GpuShaderDesc::TextureType channel, + GpuShaderDesc::TextureDimensions dimensions, + Interpolation interpolation, + const py::buffer & values) { py::buffer_info info = values.request(); py::ssize_t numChannels; @@ -134,157 +132,155 @@ void bindPyGpuShaderDesc(py::module & m) } checkBufferType(info, py::dtype("float32")); - checkBufferSize(info, width*height*numChannels); + checkBufferSize(info, width * height * numChannels); py::gil_scoped_release release; - self->addTexture(textureName.c_str(), - samplerName.c_str(), - width, height, - channel, - dimensions, - interpolation, - static_cast(info.ptr)); + self->addTexture( + textureName.c_str(), + samplerName.c_str(), + width, + height, + channel, + dimensions, + interpolation, + static_cast(info.ptr)); }, - "textureName"_a, "samplerName"_a, "width"_a, "height"_a, "channel"_a, "dimensions"_a, - "interpolation"_a, "values"_a, - DOC(GpuShaderCreator, addTexture)) - - .def("getTextures", [](GpuShaderDescRcPtr & self) - { - return TextureIterator(self); - }) + "textureName"_a, + "samplerName"_a, + "width"_a, + "height"_a, + "channel"_a, + "dimensions"_a, + "interpolation"_a, + "values"_a, + DOC(GpuShaderCreator, addTexture)) + + .def("getTextures", [](GpuShaderDescRcPtr & self) { return TextureIterator(self); }) // 3D lut related methods - .def("add3DTexture", [](GpuShaderDescRcPtr & self, - const std::string & textureName, - const std::string & samplerName, - unsigned edgelen, - Interpolation interpolation, - const py::buffer & values) - { + .def( + "add3DTexture", + [](GpuShaderDescRcPtr & self, + const std::string & textureName, + const std::string & samplerName, + unsigned edgelen, + Interpolation interpolation, + const py::buffer & values) { py::buffer_info info = values.request(); checkBufferType(info, py::dtype("float32")); - checkBufferSize(info, edgelen*edgelen*edgelen*3); + checkBufferSize(info, edgelen * edgelen * edgelen * 3); py::gil_scoped_release release; - self->add3DTexture(textureName.c_str(), - samplerName.c_str(), - edgelen, - interpolation, - static_cast(info.ptr)); + self->add3DTexture( + textureName.c_str(), + samplerName.c_str(), + edgelen, + interpolation, + static_cast(info.ptr)); }, - "textureName"_a, "samplerName"_a, "edgeLen"_a, "interpolation"_a, "values"_a, - DOC(GpuShaderCreator, add3DTexture)) - .def("get3DTextures", [](GpuShaderDescRcPtr & self) - { - return Texture3DIterator(self); - }); - - clsUniformData - .def(py::init<>()) + "textureName"_a, + "samplerName"_a, + "edgeLen"_a, + "interpolation"_a, + "values"_a, + DOC(GpuShaderCreator, add3DTexture)) + .def("get3DTextures", [](GpuShaderDescRcPtr & self) { return Texture3DIterator(self); }); + + clsUniformData.def(py::init<>()) .def(py::init(), "data"_a) - + .def_readwrite("type", &GpuShaderDesc::UniformData::m_type) - - .def("getDouble", [](GpuShaderDesc::UniformData & self) -> double - { - return self.m_getDouble(); - }) - .def("getBool", [](GpuShaderDesc::UniformData & self) -> bool - { - return self.m_getBool(); - }) - .def("getFloat3", [](GpuShaderDesc::UniformData & self) -> Float3 - { - return self.m_getFloat3(); - }) - .def("getVectorFloat", [](GpuShaderDesc::UniformData & self) -> py::array - { - return py::array(py::dtype("float32"), - { self.m_vectorFloat.m_getSize() }, - { sizeof(float) }, - self.m_vectorFloat.m_getVector()); + + .def( + "getDouble", + [](GpuShaderDesc::UniformData & self) -> double { return self.m_getDouble(); }) + .def("getBool", [](GpuShaderDesc::UniformData & self) -> bool { return self.m_getBool(); }) + .def( + "getFloat3", + [](GpuShaderDesc::UniformData & self) -> Float3 { return self.m_getFloat3(); }) + .def( + "getVectorFloat", + [](GpuShaderDesc::UniformData & self) -> py::array { + return py::array( + py::dtype("float32"), + {self.m_vectorFloat.m_getSize()}, + {sizeof(float)}, + self.m_vectorFloat.m_getVector()); }) - .def("getVectorInt", [](GpuShaderDesc::UniformData & self) -> py::array - { - return py::array(py::dtype("intc"), - { self.m_vectorInt.m_getSize() }, - { sizeof(int) }, - self.m_vectorInt.m_getVector()); - }); + .def("getVectorInt", [](GpuShaderDesc::UniformData & self) -> py::array { + return py::array( + py::dtype("intc"), + {self.m_vectorInt.m_getSize()}, + {sizeof(int)}, + self.m_vectorInt.m_getVector()); + }); clsUniformIterator - .def("__len__", [](UniformIterator & it) - { - return it.m_obj->getNumUniforms(); - }) - .def("__getitem__", [](UniformIterator & it, int i) - { + .def("__len__", [](UniformIterator & it) { return it.m_obj->getNumUniforms(); }) + .def( + "__getitem__", + [](UniformIterator & it, int i) { // GpuShaderDesc provides index check with exception GpuShaderDesc::UniformData data; const char * name = it.m_obj->getUniform(i, data); return py::make_tuple(name, data); }) - .def("__iter__", [](UniformIterator & it) -> UniformIterator & - { - return it; - }) - .def("__next__", [](UniformIterator & it) - { - int i = it.nextIndex(it.m_obj->getNumUniforms()); + .def("__iter__", [](UniformIterator & it) -> UniformIterator & { return it; }) + .def("__next__", [](UniformIterator & it) { + int i = it.nextIndex(it.m_obj->getNumUniforms()); - GpuShaderDesc::UniformData data; - const char * name = it.m_obj->getUniform(i, data); + GpuShaderDesc::UniformData data; + const char * name = it.m_obj->getUniform(i, data); - return py::make_tuple(name, data); - }); + return py::make_tuple(name, data); + }); - clsTexture - .def_readonly("textureName", &Texture::m_textureName) + clsTexture.def_readonly("textureName", &Texture::m_textureName) .def_readonly("samplerName", &Texture::m_samplerName) .def_readonly("width", &Texture::m_width) .def_readonly("height", &Texture::m_height) .def_readonly("channel", &Texture::m_channel) .def_readonly("dimensions", &Texture::m_dimensions) .def_readonly("interpolation", &Texture::m_interpolation) - .def("getValues", [](Texture & self) - { + .def( + "getValues", + [](Texture & self) { py::gil_scoped_release release; - + const float * values; self.m_shaderDesc->getTextureValues(self.m_index, values); - + py::ssize_t numChannels; switch (self.m_channel) { - case GpuShaderDesc::TEXTURE_RED_CHANNEL: - numChannels = 1; - break; - case GpuShaderDesc::TEXTURE_RGB_CHANNEL: - numChannels = 3; - break; - default: - throw Exception("Error: Unsupported texture type"); + case GpuShaderDesc::TEXTURE_RED_CHANNEL: + numChannels = 1; + break; + case GpuShaderDesc::TEXTURE_RGB_CHANNEL: + numChannels = 3; + break; + default: + throw Exception("Error: Unsupported texture type"); } - + py::gil_scoped_acquire acquire; - - return py::array(py::dtype("float32"), - { self.m_height * self.m_width * numChannels }, - { sizeof(float) }, - values); - }, DOC(GpuShaderDesc, getTextureValues)); + + return py::array( + py::dtype("float32"), + {self.m_height * self.m_width * numChannels}, + {sizeof(float)}, + values); + }, + DOC(GpuShaderDesc, getTextureValues)); clsTextureIterator - .def("__len__", [](TextureIterator & it) - { - return it.m_obj->getNumTextures(); - }) - .def("__getitem__", [](TextureIterator & it, int i) -> Texture - { + .def("__len__", [](TextureIterator & it) { return it.m_obj->getNumTextures(); }) + .def( + "__getitem__", + [](TextureIterator & it, int i) -> Texture { // GpuShaderDesc provides index check with exception const char * textureName = nullptr; const char * samplerName = nullptr; @@ -292,60 +288,86 @@ void bindPyGpuShaderDesc(py::module & m) GpuShaderDesc::TextureType channel; GpuShaderDesc::TextureDimensions dimensions; Interpolation interpolation; - it.m_obj->getTexture(i, textureName, samplerName, width, height, channel, dimensions, - interpolation); - - return { textureName, samplerName, width, height, channel, dimensions, interpolation, - it.m_obj, i}; - }) - .def("__iter__", [](TextureIterator & it) -> TextureIterator & - { - return it; + it.m_obj->getTexture( + i, + textureName, + samplerName, + width, + height, + channel, + dimensions, + interpolation); + + return { + textureName, + samplerName, + width, + height, + channel, + dimensions, + interpolation, + it.m_obj, + i}; }) - .def("__next__", [](TextureIterator & it) -> Texture - { - int i = it.nextIndex(it.m_obj->getNumTextures()); - - const char * textureName = nullptr; - const char * samplerName = nullptr; - unsigned width, height; - GpuShaderDesc::TextureType channel; - GpuShaderDesc::TextureDimensions dimensions; - Interpolation interpolation; - it.m_obj->getTexture(i, textureName, samplerName, width, height, channel, dimensions, - interpolation); - - return { textureName, samplerName, width, height, channel, dimensions, interpolation, - it.m_obj, i}; - }); - - clsTexture3D - .def_readonly("textureName", &Texture3D::m_textureName) + .def("__iter__", [](TextureIterator & it) -> TextureIterator & { return it; }) + .def("__next__", [](TextureIterator & it) -> Texture { + int i = it.nextIndex(it.m_obj->getNumTextures()); + + const char * textureName = nullptr; + const char * samplerName = nullptr; + unsigned width, height; + GpuShaderDesc::TextureType channel; + GpuShaderDesc::TextureDimensions dimensions; + Interpolation interpolation; + it.m_obj->getTexture( + i, + textureName, + samplerName, + width, + height, + channel, + dimensions, + interpolation); + + return { + textureName, + samplerName, + width, + height, + channel, + dimensions, + interpolation, + it.m_obj, + i}; + }); + + clsTexture3D.def_readonly("textureName", &Texture3D::m_textureName) .def_readonly("samplerName", &Texture3D::m_samplerName) .def_readonly("edgeLen", &Texture3D::m_edgelen) .def_readonly("interpolation", &Texture3D::m_interpolation) - .def("getValues", [](Texture3D & self) - { + .def( + "getValues", + [](Texture3D & self) { py::gil_scoped_release release; - + const float * values; self.m_shaderDesc->get3DTextureValues(self.m_index, values); - + py::gil_scoped_acquire acquire; - - return py::array(py::dtype("float32"), - { self.m_edgelen * self.m_edgelen * self.m_edgelen * 3 }, - { sizeof(float) }, - values); - }, DOC(GpuShaderDesc, get3DTextureValues)); + + return py::array( + py::dtype("float32"), + {self.m_edgelen * self.m_edgelen * self.m_edgelen * 3}, + {sizeof(float)}, + values); + }, + DOC(GpuShaderDesc, get3DTextureValues)); clsTexture3DIterator - .def("__len__", [](Texture3DIterator & it) - { - return it.m_obj->getNum3DTextures(); - }) - .def("__getitem__", [](Texture3DIterator & it, int i) -> Texture3D - { + .def("__len__", [](Texture3DIterator & it) { return it.m_obj->getNum3DTextures(); }) + .def( + "__getitem__", + [](Texture3DIterator & it, int i) -> Texture3D { // GpuShaderDesc provides index check with exception const char * textureName = nullptr; const char * samplerName = nullptr; @@ -353,24 +375,20 @@ void bindPyGpuShaderDesc(py::module & m) Interpolation interpolation; it.m_obj->get3DTexture(i, textureName, samplerName, edgelen, interpolation); - return { textureName, samplerName, edgelen, interpolation, it.m_obj, i }; - }) - .def("__iter__", [](Texture3DIterator & it) -> Texture3DIterator & - { - return it; + return {textureName, samplerName, edgelen, interpolation, it.m_obj, i}; }) - .def("__next__", [](Texture3DIterator & it) -> Texture3D - { - int i = it.nextIndex(it.m_obj->getNum3DTextures()); - - const char * textureName = nullptr; - const char * samplerName = nullptr; - unsigned edgelen; - Interpolation interpolation; - it.m_obj->get3DTexture(i, textureName, samplerName, edgelen, interpolation); - - return { textureName, samplerName, edgelen, interpolation, it.m_obj, i }; - }); + .def("__iter__", [](Texture3DIterator & it) -> Texture3DIterator & { return it; }) + .def("__next__", [](Texture3DIterator & it) -> Texture3D { + int i = it.nextIndex(it.m_obj->getNum3DTextures()); + + const char * textureName = nullptr; + const char * samplerName = nullptr; + unsigned edgelen; + Interpolation interpolation; + it.m_obj->get3DTexture(i, textureName, samplerName, edgelen, interpolation); + + return {textureName, samplerName, edgelen, interpolation, it.m_obj, i}; + }); } } // namespace OCIO_NAMESPACE diff --git a/src/bindings/python/PyGradingData.cpp b/src/bindings/python/PyGradingData.cpp index 815da41140..cdf88224a4 100644 --- a/src/bindings/python/PyGradingData.cpp +++ b/src/bindings/python/PyGradingData.cpp @@ -8,7 +8,7 @@ namespace OCIO_NAMESPACE { - + namespace { @@ -33,222 +33,197 @@ void CopyGradingBSpline(GradingBSplineCurveRcPtr to, const ConstGradingBSplineCu void bindPyGradingData(py::module & m) { - GradingRGBCurveRcPtr DEFAULT_RGB_CURVE = GradingRGBCurve::Create(GRADING_LOG); + GradingRGBCurveRcPtr DEFAULT_RGB_CURVE = GradingRGBCurve::Create(GRADING_LOG); GradingControlPoint DEFAULT_CONTROL_POINT = GradingControlPoint(); - auto clsGradingRGBM = - py::class_( - m.attr("GradingRGBM")); + auto clsGradingRGBM = py::class_(m.attr("GradingRGBM")); - auto clsGradingPrimary = - py::class_( - m.attr("GradingPrimary")); + auto clsGradingPrimary = py::class_(m.attr("GradingPrimary")); - auto clsGradingRGBMSW = - py::class_( - m.attr("GradingRGBMSW")); + auto clsGradingRGBMSW = py::class_(m.attr("GradingRGBMSW")); - auto clsGradingTone = - py::class_( - m.attr("GradingTone")); + auto clsGradingTone = py::class_(m.attr("GradingTone")); - auto clsGradingControlPoint = - py::class_( - m.attr("GradingControlPoint")); + auto clsGradingControlPoint = py::class_(m.attr("GradingControlPoint")); - auto clsGradingBSplineCurve = - py::class_( + auto clsGradingBSplineCurve + = py::class_( m.attr("GradingBSplineCurve")); - auto clsGradingControlPointIterator = - py::class_( - clsGradingBSplineCurve, "GradingControlPointIterator"); - - auto clsGradingRGBCurve = - py::class_( - m.attr("GradingRGBCurve")); - - clsGradingRGBM - .def(py::init<>(), - DOC(GradingRGBM, GradingRGBM)) - .def(py::init(), - "red"_a, "green"_a, "blue"_a, "master"_a, - DOC(GradingRGBM, GradingRGBM, 2)) - - .def("__eq__", [](const GradingRGBM &self, const GradingRGBM &other) - { - return self == other; - }, py::is_operator()) - .def("__ne__", [](const GradingRGBM &self, const GradingRGBM &other) - { - return self != other; - }, py::is_operator()) - - .def_readwrite("red", &GradingRGBM::m_red, - DOC(GradingRGBM, m_red)) - .def_readwrite("green", &GradingRGBM::m_green, - DOC(GradingRGBM, m_green)) - .def_readwrite("blue", &GradingRGBM::m_blue, - DOC(GradingRGBM, m_blue)) - .def_readwrite("master", &GradingRGBM::m_master, - DOC(GradingRGBM, m_master)); + auto clsGradingControlPointIterator = py::class_( + clsGradingBSplineCurve, + "GradingControlPointIterator"); + + auto clsGradingRGBCurve + = py::class_(m.attr("GradingRGBCurve")); + + clsGradingRGBM.def(py::init<>(), DOC(GradingRGBM, GradingRGBM)) + .def( + py::init(), + "red"_a, + "green"_a, + "blue"_a, + "master"_a, + DOC(GradingRGBM, GradingRGBM, 2)) + + .def( + "__eq__", + [](const GradingRGBM & self, const GradingRGBM & other) { return self == other; }, + py::is_operator()) + .def( + "__ne__", + [](const GradingRGBM & self, const GradingRGBM & other) { return self != other; }, + py::is_operator()) + + .def_readwrite("red", &GradingRGBM::m_red, DOC(GradingRGBM, m_red)) + .def_readwrite("green", &GradingRGBM::m_green, DOC(GradingRGBM, m_green)) + .def_readwrite("blue", &GradingRGBM::m_blue, DOC(GradingRGBM, m_blue)) + .def_readwrite("master", &GradingRGBM::m_master, DOC(GradingRGBM, m_master)); defRepr(clsGradingRGBM); clsGradingPrimary - .def(py::init(), - DOC(GradingPrimary, GradingPrimary)) - - .def("__eq__", [](const GradingPrimary &self, const GradingPrimary &other) - { - return self == other; - }, py::is_operator()) - .def("__ne__", [](const GradingPrimary &self, const GradingPrimary &other) - { - return self != other; - }, py::is_operator()) - - .def("validate", &GradingPrimary::validate, - DOC(GradingPrimary, validate)) - - .def_readwrite("brightness", &GradingPrimary::m_brightness, - DOC(GradingPrimary, m_brightness)) - .def_readwrite("contrast", &GradingPrimary::m_contrast, - DOC(GradingPrimary, m_contrast)) - .def_readwrite("gamma", &GradingPrimary::m_gamma, - DOC(GradingPrimary, m_gamma)) - .def_readwrite("offset", &GradingPrimary::m_offset, - DOC(GradingPrimary, m_offset)) - .def_readwrite("exposure", &GradingPrimary::m_exposure, - DOC(GradingPrimary, m_exposure)) - .def_readwrite("lift", &GradingPrimary::m_lift, - DOC(GradingPrimary, m_lift)) - .def_readwrite("gain", &GradingPrimary::m_gain, - DOC(GradingPrimary, m_gain)) - .def_readwrite("pivot", &GradingPrimary::m_pivot, - DOC(GradingPrimary, m_pivot)) - .def_readwrite("saturation", &GradingPrimary::m_saturation, - DOC(GradingPrimary, m_saturation)) - .def_readwrite("clampWhite", &GradingPrimary::m_clampWhite, - DOC(GradingPrimary, m_clampWhite)) - .def_readwrite("clampBlack", &GradingPrimary::m_clampBlack, - DOC(GradingPrimary, m_clampBlack)) - .def_readwrite("pivotWhite", &GradingPrimary::m_pivotWhite, - DOC(GradingPrimary, m_pivotWhite)) - .def_readwrite("pivotBlack", &GradingPrimary::m_pivotBlack, - DOC(GradingPrimary, m_pivotBlack)) - - .def_property_readonly_static("NoClampBlack", [](py::object /* self */) - { - return GradingPrimary::NoClampBlack(); - }, - DOC(GradingPrimary, m_brightness)) - .def_property_readonly_static("NoClampWhite", [](py::object /* self */) - { - return GradingPrimary::NoClampWhite(); - }, - DOC(GradingPrimary, m_brightness)); + .def(py::init(), DOC(GradingPrimary, GradingPrimary)) + + .def( + "__eq__", + [](const GradingPrimary & self, const GradingPrimary & other) { return self == other; }, + py::is_operator()) + .def( + "__ne__", + [](const GradingPrimary & self, const GradingPrimary & other) { return self != other; }, + py::is_operator()) + + .def("validate", &GradingPrimary::validate, DOC(GradingPrimary, validate)) + + .def_readwrite( + "brightness", + &GradingPrimary::m_brightness, + DOC(GradingPrimary, m_brightness)) + .def_readwrite("contrast", &GradingPrimary::m_contrast, DOC(GradingPrimary, m_contrast)) + .def_readwrite("gamma", &GradingPrimary::m_gamma, DOC(GradingPrimary, m_gamma)) + .def_readwrite("offset", &GradingPrimary::m_offset, DOC(GradingPrimary, m_offset)) + .def_readwrite("exposure", &GradingPrimary::m_exposure, DOC(GradingPrimary, m_exposure)) + .def_readwrite("lift", &GradingPrimary::m_lift, DOC(GradingPrimary, m_lift)) + .def_readwrite("gain", &GradingPrimary::m_gain, DOC(GradingPrimary, m_gain)) + .def_readwrite("pivot", &GradingPrimary::m_pivot, DOC(GradingPrimary, m_pivot)) + .def_readwrite( + "saturation", + &GradingPrimary::m_saturation, + DOC(GradingPrimary, m_saturation)) + .def_readwrite( + "clampWhite", + &GradingPrimary::m_clampWhite, + DOC(GradingPrimary, m_clampWhite)) + .def_readwrite( + "clampBlack", + &GradingPrimary::m_clampBlack, + DOC(GradingPrimary, m_clampBlack)) + .def_readwrite( + "pivotWhite", + &GradingPrimary::m_pivotWhite, + DOC(GradingPrimary, m_pivotWhite)) + .def_readwrite( + "pivotBlack", + &GradingPrimary::m_pivotBlack, + DOC(GradingPrimary, m_pivotBlack)) + + .def_property_readonly_static( + "NoClampBlack", + [](py::object /* self */) { return GradingPrimary::NoClampBlack(); }, + DOC(GradingPrimary, m_brightness)) + .def_property_readonly_static( + "NoClampWhite", + [](py::object /* self */) { return GradingPrimary::NoClampWhite(); }, + DOC(GradingPrimary, m_brightness)); defRepr(clsGradingPrimary); - clsGradingRGBMSW - .def(py::init<>(), - DOC(GradingRGBMSW, GradingRGBMSW)) - .def(py::init(), - "red"_a, "green"_a, "blue"_a, "master"_a, "start"_a, "width"_a, - DOC(GradingRGBMSW, GradingRGBMSW, 2)) - .def(py::init(), - "start"_a, "width"_a, - DOC(GradingRGBMSW, GradingRGBMSW, 3)) - - .def("__eq__", [](const GradingRGBMSW &self, const GradingRGBMSW &other) - { - return self == other; - }, py::is_operator()) - .def("__ne__", [](const GradingRGBMSW &self, const GradingRGBMSW &other) - { - return self != other; - }, py::is_operator()) - - .def_readwrite("red", &GradingRGBMSW::m_red, - DOC(GradingRGBMSW, m_red)) - .def_readwrite("green", &GradingRGBMSW::m_green, - DOC(GradingRGBMSW, m_green)) - .def_readwrite("blue", &GradingRGBMSW::m_blue, - DOC(GradingRGBMSW, m_blue)) - .def_readwrite("master", &GradingRGBMSW::m_master, - DOC(GradingRGBMSW, m_master)) - .def_readwrite("start", &GradingRGBMSW::m_start, - DOC(GradingRGBMSW, m_start)) - .def_readwrite("width", &GradingRGBMSW::m_width, - DOC(GradingRGBMSW, m_width)); + clsGradingRGBMSW.def(py::init<>(), DOC(GradingRGBMSW, GradingRGBMSW)) + .def( + py::init(), + "red"_a, + "green"_a, + "blue"_a, + "master"_a, + "start"_a, + "width"_a, + DOC(GradingRGBMSW, GradingRGBMSW, 2)) + .def(py::init(), "start"_a, "width"_a, DOC(GradingRGBMSW, GradingRGBMSW, 3)) + + .def( + "__eq__", + [](const GradingRGBMSW & self, const GradingRGBMSW & other) { return self == other; }, + py::is_operator()) + .def( + "__ne__", + [](const GradingRGBMSW & self, const GradingRGBMSW & other) { return self != other; }, + py::is_operator()) + + .def_readwrite("red", &GradingRGBMSW::m_red, DOC(GradingRGBMSW, m_red)) + .def_readwrite("green", &GradingRGBMSW::m_green, DOC(GradingRGBMSW, m_green)) + .def_readwrite("blue", &GradingRGBMSW::m_blue, DOC(GradingRGBMSW, m_blue)) + .def_readwrite("master", &GradingRGBMSW::m_master, DOC(GradingRGBMSW, m_master)) + .def_readwrite("start", &GradingRGBMSW::m_start, DOC(GradingRGBMSW, m_start)) + .def_readwrite("width", &GradingRGBMSW::m_width, DOC(GradingRGBMSW, m_width)); defRepr(clsGradingRGBMSW); clsGradingTone - .def(py::init(), - DOC(GradingTone, GradingTone)) - - .def("validate", &GradingTone::validate, - DOC(GradingTone, validate)) - - .def("__eq__", [](const GradingTone &self, const GradingTone &other) - { - return self == other; - }, py::is_operator()) - .def("__ne__", [](const GradingTone &self, const GradingTone &other) - { - return self != other; - }, py::is_operator()) - - .def_readwrite("blacks", &GradingTone::m_blacks, - DOC(GradingTone, m_blacks)) - .def_readwrite("whites", &GradingTone::m_whites, - DOC(GradingTone, m_whites)) - .def_readwrite("shadows", &GradingTone::m_shadows, - DOC(GradingTone, m_shadows)) - .def_readwrite("highlights", &GradingTone::m_highlights, - DOC(GradingTone, m_highlights)) - .def_readwrite("midtones", &GradingTone::m_midtones, - DOC(GradingTone, m_midtones)) - .def_readwrite("scontrast", &GradingTone::m_scontrast, - DOC(GradingTone, m_scontrast)); + .def(py::init(), DOC(GradingTone, GradingTone)) + + .def("validate", &GradingTone::validate, DOC(GradingTone, validate)) + + .def( + "__eq__", + [](const GradingTone & self, const GradingTone & other) { return self == other; }, + py::is_operator()) + .def( + "__ne__", + [](const GradingTone & self, const GradingTone & other) { return self != other; }, + py::is_operator()) + + .def_readwrite("blacks", &GradingTone::m_blacks, DOC(GradingTone, m_blacks)) + .def_readwrite("whites", &GradingTone::m_whites, DOC(GradingTone, m_whites)) + .def_readwrite("shadows", &GradingTone::m_shadows, DOC(GradingTone, m_shadows)) + .def_readwrite("highlights", &GradingTone::m_highlights, DOC(GradingTone, m_highlights)) + .def_readwrite("midtones", &GradingTone::m_midtones, DOC(GradingTone, m_midtones)) + .def_readwrite("scontrast", &GradingTone::m_scontrast, DOC(GradingTone, m_scontrast)); defRepr(clsGradingTone); - clsGradingControlPoint - .def(py::init<>(), - DOC(GradingControlPoint, GradingControlPoint)) - .def(py::init(), - "x"_a = DEFAULT_CONTROL_POINT.m_x, - "y"_a = DEFAULT_CONTROL_POINT.m_y, - DOC(GradingControlPoint, GradingControlPoint, 2)) + clsGradingControlPoint.def(py::init<>(), DOC(GradingControlPoint, GradingControlPoint)) + .def( + py::init(), + "x"_a = DEFAULT_CONTROL_POINT.m_x, + "y"_a = DEFAULT_CONTROL_POINT.m_y, + DOC(GradingControlPoint, GradingControlPoint, 2)) - .def("__eq__", [](const GradingControlPoint &self, const GradingControlPoint &other) - { + .def( + "__eq__", + [](const GradingControlPoint & self, const GradingControlPoint & other) { return self == other; - }, py::is_operator()) - .def("__ne__", [](const GradingControlPoint &self, const GradingControlPoint &other) - { + }, + py::is_operator()) + .def( + "__ne__", + [](const GradingControlPoint & self, const GradingControlPoint & other) { return self != other; - }, py::is_operator()) + }, + py::is_operator()) - .def_readwrite("x", &GradingControlPoint::m_x, - DOC(GradingControlPoint, m_x)) - .def_readwrite("y", &GradingControlPoint::m_y, - DOC(GradingControlPoint, m_y)); + .def_readwrite("x", &GradingControlPoint::m_x, DOC(GradingControlPoint, m_x)) + .def_readwrite("y", &GradingControlPoint::m_y, DOC(GradingControlPoint, m_y)); defRepr(clsGradingControlPoint); clsGradingBSplineCurve - .def(py::init([](size_t size) - { - return GradingBSplineCurve::Create(size); - }), - "size"_a, - DOC(GradingBSplineCurve, Create)) - .def(py::init([](const std::vector & values) - { + .def( + py::init([](size_t size) { return GradingBSplineCurve::Create(size); }), + "size"_a, + DOC(GradingBSplineCurve, Create)) + .def( + py::init([](const std::vector & values) { const auto size = values.size(); if (size < 4) { @@ -268,121 +243,107 @@ void bindPyGradingData(py::module & m) } return c; }), - DOC(GradingBSplineCurve, Create, 2)) + DOC(GradingBSplineCurve, Create, 2)) - .def("__eq__", [](const GradingBSplineCurve &self, const GradingBSplineCurve &other) - { + .def( + "__eq__", + [](const GradingBSplineCurve & self, const GradingBSplineCurve & other) { return self == other; - }, py::is_operator()) - .def("__ne__", [](const GradingBSplineCurve &self, const GradingBSplineCurve &other) - { + }, + py::is_operator()) + .def( + "__ne__", + [](const GradingBSplineCurve & self, const GradingBSplineCurve & other) { return self != other; - }, py::is_operator()) - - .def("validate", &GradingBSplineCurve::validate, - DOC(GradingBSplineCurve, validate)) - .def("setNumControlPoints", &GradingBSplineCurve::setNumControlPoints, "size"_a, - DOC(GradingBSplineCurve, setNumControlPoints)) - .def("getControlPoints", [](GradingBSplineCurveRcPtr & self) - { - return GradingControlPointIterator(self); - }); + }, + py::is_operator()) + + .def("validate", &GradingBSplineCurve::validate, DOC(GradingBSplineCurve, validate)) + .def( + "setNumControlPoints", + &GradingBSplineCurve::setNumControlPoints, + "size"_a, + DOC(GradingBSplineCurve, setNumControlPoints)) + .def("getControlPoints", [](GradingBSplineCurveRcPtr & self) { + return GradingControlPointIterator(self); + }); defRepr(clsGradingBSplineCurve); clsGradingControlPointIterator - .def("__len__", [](GradingControlPointIterator & it) - { - return it.m_obj->getNumControlPoints(); - }) - .def("__getitem__", [](GradingControlPointIterator & it, int i) - { - return it.m_obj->getControlPoint(i); - }) - .def("__setitem__", [](GradingControlPointIterator & it, - int i, - const GradingControlPoint & cpt) - { + .def( + "__len__", + [](GradingControlPointIterator & it) { return it.m_obj->getNumControlPoints(); }) + .def( + "__getitem__", + [](GradingControlPointIterator & it, int i) { return it.m_obj->getControlPoint(i); }) + .def( + "__setitem__", + [](GradingControlPointIterator & it, int i, const GradingControlPoint & cpt) { it.m_obj->getControlPoint(i) = cpt; }) - .def("__iter__", [](GradingControlPointIterator & it) -> GradingControlPointIterator & - { - return it; - }) - .def("__next__", [](GradingControlPointIterator & it) - { - int numPt = static_cast(it.m_obj->getNumControlPoints()); - size_t i = static_cast(it.nextIndex(numPt)); - return it.m_obj->getControlPoint(i); - }); + .def( + "__iter__", + [](GradingControlPointIterator & it) -> GradingControlPointIterator & { return it; }) + .def("__next__", [](GradingControlPointIterator & it) { + int numPt = static_cast(it.m_obj->getNumControlPoints()); + size_t i = static_cast(it.nextIndex(numPt)); + return it.m_obj->getControlPoint(i); + }); clsGradingRGBCurve - .def(py::init([](GradingStyle style) - { - return GradingRGBCurve::Create(style); - }), - "style"_a, - DOC(GradingRGBCurve, GradingRGBCurve)) - .def(py::init([](const GradingBSplineCurveRcPtr & red, - const GradingBSplineCurveRcPtr & green, - const GradingBSplineCurveRcPtr & blue, - const GradingBSplineCurveRcPtr & master) - { + .def( + py::init([](GradingStyle style) { return GradingRGBCurve::Create(style); }), + "style"_a, + DOC(GradingRGBCurve, GradingRGBCurve)) + .def( + py::init([](const GradingBSplineCurveRcPtr & red, + const GradingBSplineCurveRcPtr & green, + const GradingBSplineCurveRcPtr & blue, + const GradingBSplineCurveRcPtr & master) { return GradingRGBCurve::Create(red, green, blue, master); }), - "red"_a = DEFAULT_RGB_CURVE->getCurve(RGB_RED), - "green"_a = DEFAULT_RGB_CURVE->getCurve(RGB_GREEN), - "blue"_a = DEFAULT_RGB_CURVE->getCurve(RGB_BLUE), - "master"_a = DEFAULT_RGB_CURVE->getCurve(RGB_MASTER), - DOC(GradingRGBCurve, GradingRGBCurve, 2)) - - .def("__eq__", [](const GradingRGBCurve &self, const GradingRGBCurve &other) - { + "red"_a = DEFAULT_RGB_CURVE->getCurve(RGB_RED), + "green"_a = DEFAULT_RGB_CURVE->getCurve(RGB_GREEN), + "blue"_a = DEFAULT_RGB_CURVE->getCurve(RGB_BLUE), + "master"_a = DEFAULT_RGB_CURVE->getCurve(RGB_MASTER), + DOC(GradingRGBCurve, GradingRGBCurve, 2)) + + .def( + "__eq__", + [](const GradingRGBCurve & self, const GradingRGBCurve & other) { return self == other; - }, py::is_operator()) - .def("__ne__", [](const GradingRGBCurve &self, const GradingRGBCurve &other) - { + }, + py::is_operator()) + .def( + "__ne__", + [](const GradingRGBCurve & self, const GradingRGBCurve & other) { return self != other; - }, py::is_operator()) - - .def_property("red", - [](const GradingRGBCurveRcPtr & rgbCurve) - { - return rgbCurve->getCurve(RGB_RED); }, - [](const GradingRGBCurveRcPtr & rgbCurve, - const GradingBSplineCurveRcPtr & red) - { + py::is_operator()) + + .def_property( + "red", + [](const GradingRGBCurveRcPtr & rgbCurve) { return rgbCurve->getCurve(RGB_RED); }, + [](const GradingRGBCurveRcPtr & rgbCurve, const GradingBSplineCurveRcPtr & red) { CopyGradingBSpline(rgbCurve->getCurve(RGB_RED), red); }) - .def_property("green", - [](const GradingRGBCurveRcPtr & rgbCurve) - { - return rgbCurve->getCurve(RGB_GREEN); - }, - [](const GradingRGBCurveRcPtr & rgbCurve, - const GradingBSplineCurveRcPtr & green) - { + .def_property( + "green", + [](const GradingRGBCurveRcPtr & rgbCurve) { return rgbCurve->getCurve(RGB_GREEN); }, + [](const GradingRGBCurveRcPtr & rgbCurve, const GradingBSplineCurveRcPtr & green) { CopyGradingBSpline(rgbCurve->getCurve(RGB_GREEN), green); }) - .def_property("blue", - [](const GradingRGBCurveRcPtr & rgbCurve) - { - return rgbCurve->getCurve(RGB_BLUE); - }, - [](const GradingRGBCurveRcPtr & rgbCurve, - const GradingBSplineCurveRcPtr & blue) - { + .def_property( + "blue", + [](const GradingRGBCurveRcPtr & rgbCurve) { return rgbCurve->getCurve(RGB_BLUE); }, + [](const GradingRGBCurveRcPtr & rgbCurve, const GradingBSplineCurveRcPtr & blue) { CopyGradingBSpline(rgbCurve->getCurve(RGB_BLUE), blue); }) - .def_property("master", - [](const GradingRGBCurveRcPtr & rgbCurve) - { - return rgbCurve->getCurve(RGB_MASTER); - }, - [](const GradingRGBCurveRcPtr & rgbCurve, - const GradingBSplineCurveRcPtr & master) - { + .def_property( + "master", + [](const GradingRGBCurveRcPtr & rgbCurve) { return rgbCurve->getCurve(RGB_MASTER); }, + [](const GradingRGBCurveRcPtr & rgbCurve, const GradingBSplineCurveRcPtr & master) { CopyGradingBSpline(rgbCurve->getCurve(RGB_MASTER), master); }); diff --git a/src/bindings/python/PyImageDesc.cpp b/src/bindings/python/PyImageDesc.cpp index ff762b1ffd..737f145d0c 100644 --- a/src/bindings/python/PyImageDesc.cpp +++ b/src/bindings/python/PyImageDesc.cpp @@ -10,34 +10,32 @@ void bindPyImageDesc(py::module & m) { m.attr("AutoStride") = AutoStride; - auto clsImageDesc = - py::class_( - m.attr("ImageDesc")) - - .def(py::init<>(), - DOC(ImageDesc, ImageDesc)) - - .def("__repr__", [](const PyImageDesc & self) - { - std::ostringstream os; - os << self.m_img; - return os.str(); - }) - - .def("getBitDepth", &PyImageDesc::getBitDepth, - DOC(ImageDesc, getBitDepth)) - .def("getWidth", &PyImageDesc::getWidth, - DOC(ImageDesc, getWidth)) - .def("getHeight", &PyImageDesc::getHeight, - DOC(ImageDesc, getHeight)) - .def("getXStrideBytes", &PyImageDesc::getXStrideBytes, - DOC(ImageDesc, getXStrideBytes)) - .def("getYStrideBytes", &PyImageDesc::getYStrideBytes, - DOC(ImageDesc, getYStrideBytes)) - .def("isRGBAPacked", &PyImageDesc::isRGBAPacked, - DOC(ImageDesc, isRGBAPacked)) - .def("isFloat", &PyImageDesc::isFloat, - DOC(ImageDesc, isFloat)); + auto clsImageDesc + = py::class_(m.attr("ImageDesc")) + + .def(py::init<>(), DOC(ImageDesc, ImageDesc)) + + .def( + "__repr__", + [](const PyImageDesc & self) { + std::ostringstream os; + os << self.m_img; + return os.str(); + }) + + .def("getBitDepth", &PyImageDesc::getBitDepth, DOC(ImageDesc, getBitDepth)) + .def("getWidth", &PyImageDesc::getWidth, DOC(ImageDesc, getWidth)) + .def("getHeight", &PyImageDesc::getHeight, DOC(ImageDesc, getHeight)) + .def( + "getXStrideBytes", + &PyImageDesc::getXStrideBytes, + DOC(ImageDesc, getXStrideBytes)) + .def( + "getYStrideBytes", + &PyImageDesc::getYStrideBytes, + DOC(ImageDesc, getYStrideBytes)) + .def("isRGBAPacked", &PyImageDesc::isRGBAPacked, DOC(ImageDesc, isRGBAPacked)) + .def("isFloat", &PyImageDesc::isFloat, DOC(ImageDesc, isFloat)); // Subclasses bindPyPackedImageDesc(m); diff --git a/src/bindings/python/PyImageDesc.h b/src/bindings/python/PyImageDesc.h index eb6ca80a42..c3459a0079 100644 --- a/src/bindings/python/PyImageDesc.h +++ b/src/bindings/python/PyImageDesc.h @@ -13,9 +13,9 @@ namespace OCIO_NAMESPACE using PackedImageDescRcPtr = OCIO_SHARED_PTR; using PlanarImageDescRcPtr = OCIO_SHARED_PTR; -// ImageDesc does NOT claim ownership of its pixels or copy image data. This is problematic in -// Python when image data passed to the constructor only exists in the function call's scope. -// The py::buffer is garbage collected immediately following initialization, leaving a dangling +// ImageDesc does NOT claim ownership of its pixels or copy image data. This is problematic in +// Python when image data passed to the constructor only exists in the function call's scope. +// The py::buffer is garbage collected immediately following initialization, leaving a dangling // pointer in the ImageDesc. Consider this scenario: // // >>> img1 = OCIO.PackedImageDesc(np.array(0.18, ...), ...) @@ -27,12 +27,12 @@ using PlanarImageDescRcPtr = OCIO_SHARED_PTR; // >>> img1.getData() // np.array(0.05, ...) # img1 and img2 are pointing to the same memory // -// To get around this, ImageDesc and its subclasses are wrapped in a container struct which owns +// To get around this, ImageDesc and its subclasses are wrapped in a container struct which owns // persistent copies of the initializing py::buffer object(s). struct OCIOHIDDEN PyImageDesc { - PyImageDesc() = default; + PyImageDesc() = default; virtual ~PyImageDesc() = default; virtual BitDepth getBitDepth() const noexcept { return m_img->getBitDepth(); } @@ -46,14 +46,13 @@ struct OCIOHIDDEN PyImageDesc ImageDescRcPtr m_img; private: - PyImageDesc(const PyImageDesc &) = delete; - PyImageDesc & operator= (const PyImageDesc &) = delete; + PyImageDesc(const PyImageDesc &) = delete; + PyImageDesc & operator=(const PyImageDesc &) = delete; }; -template -struct OCIOHIDDEN PyImageDescImpl : public PyImageDesc +template struct OCIOHIDDEN PyImageDescImpl : public PyImageDesc { - PyImageDescImpl() = default; + PyImageDescImpl() = default; virtual ~PyImageDescImpl() = default; OCIO_SHARED_PTR getImg() const { return OCIO_DYNAMIC_POINTER_CAST(m_img); } @@ -61,8 +60,8 @@ struct OCIOHIDDEN PyImageDescImpl : public PyImageDesc py::buffer m_data[N]; private: - PyImageDescImpl(const PyImageDescImpl &) = delete; - PyImageDescImpl & operator= (const PyImageDescImpl &) = delete; + PyImageDescImpl(const PyImageDescImpl &) = delete; + PyImageDescImpl & operator=(const PyImageDescImpl &) = delete; }; using PyPackedImageDesc = PyImageDescImpl; diff --git a/src/bindings/python/PyLook.cpp b/src/bindings/python/PyLook.cpp index 05fc2814af..5c92d3a00e 100644 --- a/src/bindings/python/PyLook.cpp +++ b/src/bindings/python/PyLook.cpp @@ -11,59 +11,76 @@ void bindPyLook(py::module & m) { LookRcPtr DEFAULT = Look::Create(); - auto clsLook = - py::class_( - m.attr("Look")) + auto clsLook + = py::class_(m.attr("Look")) - .def(py::init(&Look::Create), - DOC(Look, Create)) - .def(py::init([](const std::string & name, - const std::string & processSpace, - const TransformRcPtr & transform, - const TransformRcPtr & inverseTransform, - const std::string & description) - { - LookRcPtr p = Look::Create(); - if (!name.empty()) { p->setName(name.c_str()); } - if (!processSpace.empty()) { p->setProcessSpace(processSpace.c_str()); } - if (transform) { p->setTransform(transform); } - if (inverseTransform) { p->setInverseTransform(inverseTransform); } - if (!description.empty()) { p->setDescription(description.c_str()); } - return p; - }), - "name"_a = DEFAULT->getName(), - "processSpace"_a = DEFAULT->getProcessSpace(), - "transform"_a = DEFAULT->getTransform(), - "inverseTransform"_a = DEFAULT->getInverseTransform(), - "description"_a = DEFAULT->getDescription(), - DOC(Look, Create)) + .def(py::init(&Look::Create), DOC(Look, Create)) + .def( + py::init([](const std::string & name, + const std::string & processSpace, + const TransformRcPtr & transform, + const TransformRcPtr & inverseTransform, + const std::string & description) { + LookRcPtr p = Look::Create(); + if (!name.empty()) + { + p->setName(name.c_str()); + } + if (!processSpace.empty()) + { + p->setProcessSpace(processSpace.c_str()); + } + if (transform) + { + p->setTransform(transform); + } + if (inverseTransform) + { + p->setInverseTransform(inverseTransform); + } + if (!description.empty()) + { + p->setDescription(description.c_str()); + } + return p; + }), + "name"_a = DEFAULT->getName(), + "processSpace"_a = DEFAULT->getProcessSpace(), + "transform"_a = DEFAULT->getTransform(), + "inverseTransform"_a = DEFAULT->getInverseTransform(), + "description"_a = DEFAULT->getDescription(), + DOC(Look, Create)) - .def("__deepcopy__", [](const ConstLookRcPtr & self, py::dict) - { - return self->createEditableCopy(); - }, - "memo"_a) + .def( + "__deepcopy__", + [](const ConstLookRcPtr & self, py::dict) { return self->createEditableCopy(); }, + "memo"_a) - .def("getName", &Look::getName, - DOC(Look, getName)) - .def("setName", &Look::setName, "name"_a.none(false), - DOC(Look, setName)) - .def("getProcessSpace", &Look::getProcessSpace, - DOC(Look, getProcessSpace)) - .def("setProcessSpace", &Look::setProcessSpace, "processSpace"_a.none(false), - DOC(Look, setProcessSpace)) - .def("getTransform", &Look::getTransform, - DOC(Look, getTransform)) - .def("setTransform", &Look::setTransform, "transform"_a, - DOC(Look, setTransform)) - .def("getInverseTransform", &Look::getInverseTransform, - DOC(Look, getInverseTransform)) - .def("setInverseTransform", &Look::setInverseTransform, "transform"_a, - DOC(Look, setInverseTransform)) - .def("getDescription", &Look::getDescription, - DOC(Look, getDescription)) - .def("setDescription", &Look::setDescription, "description"_a.none(false), - DOC(Look, setDescription)); + .def("getName", &Look::getName, DOC(Look, getName)) + .def("setName", &Look::setName, "name"_a.none(false), DOC(Look, setName)) + .def("getProcessSpace", &Look::getProcessSpace, DOC(Look, getProcessSpace)) + .def( + "setProcessSpace", + &Look::setProcessSpace, + "processSpace"_a.none(false), + DOC(Look, setProcessSpace)) + .def("getTransform", &Look::getTransform, DOC(Look, getTransform)) + .def("setTransform", &Look::setTransform, "transform"_a, DOC(Look, setTransform)) + .def( + "getInverseTransform", + &Look::getInverseTransform, + DOC(Look, getInverseTransform)) + .def( + "setInverseTransform", + &Look::setInverseTransform, + "transform"_a, + DOC(Look, setInverseTransform)) + .def("getDescription", &Look::getDescription, DOC(Look, getDescription)) + .def( + "setDescription", + &Look::setDescription, + "description"_a.none(false), + DOC(Look, setDescription)); defRepr(clsLook); } diff --git a/src/bindings/python/PyNamedTransform.cpp b/src/bindings/python/PyNamedTransform.cpp index 963bdf41d6..d9b966b84a 100644 --- a/src/bindings/python/PyNamedTransform.cpp +++ b/src/bindings/python/PyNamedTransform.cpp @@ -15,11 +15,10 @@ enum NamedTransformIterator IT_NAMED_TRANSFORM_ALIAS }; -using NamedTransformCategoryIterator = PyIterator; +using NamedTransformCategoryIterator + = PyIterator; -using NamedTransformAliasIterator = PyIterator; +using NamedTransformAliasIterator = PyIterator; std::vector getCategoriesStdVec(const NamedTransformRcPtr & p) { @@ -47,28 +46,26 @@ void bindPyNamedTransform(py::module & m) { NamedTransformRcPtr DEFAULT = NamedTransform::Create(); - auto clsNamedTransform = - py::class_( - m.attr("NamedTransform")); + auto clsNamedTransform + = py::class_(m.attr("NamedTransform")); - auto clsNamedTransformCategoryIterator = - py::class_( - clsNamedTransform, "NamedTransformCategoryIterator"); + auto clsNamedTransformCategoryIterator = py::class_( + clsNamedTransform, + "NamedTransformCategoryIterator"); - auto clsNamedTransformAliasIterator = - py::class_( - clsNamedTransform, "NamedTransformAliasIterator"); + auto clsNamedTransformAliasIterator + = py::class_(clsNamedTransform, "NamedTransformAliasIterator"); clsNamedTransform .def(py::init([]() { return NamedTransform::Create(); }), DOC(NamedTransform, Create)) - .def(py::init([](const std::string & name, - const std::vector & aliases, - const std::string & family, - const std::string & description, - const ConstTransformRcPtr & forwardTransform, - const ConstTransformRcPtr & inverseTransform, - const std::vector & categories) - { + .def( + py::init([](const std::string & name, + const std::vector & aliases, + const std::string & family, + const std::string & description, + const ConstTransformRcPtr & forwardTransform, + const ConstTransformRcPtr & inverseTransform, + const std::vector & categories) { NamedTransformRcPtr p = NamedTransform::Create(); if (!aliases.empty()) { @@ -109,116 +106,145 @@ void bindPyNamedTransform(py::module & m) } return p; }), - "name"_a.none(false) = "", - "aliases"_a = getAliasesStdVec(DEFAULT), - "family"_a.none(false) = "", - "description"_a.none(false) = "", - "forwardTransform"_a = ConstTransformRcPtr(), - "inverseTransform"_a = ConstTransformRcPtr(), - "categories"_a = getCategoriesStdVec(DEFAULT), - DOC(NamedTransform, Create)) - - .def("__deepcopy__", [](const ConstNamedTransformRcPtr & self, py::dict) - { + "name"_a.none(false) = "", + "aliases"_a = getAliasesStdVec(DEFAULT), + "family"_a.none(false) = "", + "description"_a.none(false) = "", + "forwardTransform"_a = ConstTransformRcPtr(), + "inverseTransform"_a = ConstTransformRcPtr(), + "categories"_a = getCategoriesStdVec(DEFAULT), + DOC(NamedTransform, Create)) + + .def( + "__deepcopy__", + [](const ConstNamedTransformRcPtr & self, py::dict) { return self->createEditableCopy(); }, "memo"_a) - .def("getName", &NamedTransform::getName, - DOC(NamedTransform, getName)) - .def("setName", &NamedTransform::setName, "name"_a.none(false), - DOC(NamedTransform, setName)) + .def("getName", &NamedTransform::getName, DOC(NamedTransform, getName)) + .def( + "setName", + &NamedTransform::setName, + "name"_a.none(false), + DOC(NamedTransform, setName)) // Aliases. - .def("addAlias", &NamedTransform::addAlias, "alias"_a.none(false), - DOC(NamedTransform, addAlias)) - .def("removeAlias", &NamedTransform::removeAlias, "alias"_a.none(false), - DOC(NamedTransform, removeAlias)) - .def("getAliases", [](NamedTransformRcPtr & self) - { - return NamedTransformAliasIterator(self); - }) - .def("clearAliases", &NamedTransform::clearAliases, - DOC(NamedTransform, clearAliases)) - - .def("getFamily", &NamedTransform::getFamily, - DOC(NamedTransform, getFamily)) - .def("setFamily", &NamedTransform::setFamily, "family"_a.none(false), - DOC(NamedTransform, setFamily)) - .def("getDescription", &NamedTransform::getDescription, - DOC(NamedTransform, getDescription)) - .def("setDescription", &NamedTransform::setDescription, "description"_a.none(false), - DOC(NamedTransform, setDescription)) - .def("getEncoding", &NamedTransform::getEncoding, - DOC(NamedTransform, getEncoding)) - .def("setEncoding", &NamedTransform::setEncoding, "encoding"_a.none(false), - DOC(NamedTransform, setEncoding)) + .def( + "addAlias", + &NamedTransform::addAlias, + "alias"_a.none(false), + DOC(NamedTransform, addAlias)) + .def( + "removeAlias", + &NamedTransform::removeAlias, + "alias"_a.none(false), + DOC(NamedTransform, removeAlias)) + .def( + "getAliases", + [](NamedTransformRcPtr & self) { return NamedTransformAliasIterator(self); }) + .def("clearAliases", &NamedTransform::clearAliases, DOC(NamedTransform, clearAliases)) + + .def("getFamily", &NamedTransform::getFamily, DOC(NamedTransform, getFamily)) + .def( + "setFamily", + &NamedTransform::setFamily, + "family"_a.none(false), + DOC(NamedTransform, setFamily)) + .def("getDescription", &NamedTransform::getDescription, DOC(NamedTransform, getDescription)) + .def( + "setDescription", + &NamedTransform::setDescription, + "description"_a.none(false), + DOC(NamedTransform, setDescription)) + .def("getEncoding", &NamedTransform::getEncoding, DOC(NamedTransform, getEncoding)) + .def( + "setEncoding", + &NamedTransform::setEncoding, + "encoding"_a.none(false), + DOC(NamedTransform, setEncoding)) // Transform - .def("getTransform", &NamedTransform::getTransform, "direction"_a, - DOC(NamedTransform, getTransform)) - .def("setTransform", &NamedTransform::setTransform, "transform"_a, "direction"_a, - DOC(NamedTransform, setTransform)) - - .def_static("GetTransform", &NamedTransform::GetTransform, "transform"_a, "direction"_a, - DOC(NamedTransform, GetTransform)) + .def( + "getTransform", + &NamedTransform::getTransform, + "direction"_a, + DOC(NamedTransform, getTransform)) + .def( + "setTransform", + &NamedTransform::setTransform, + "transform"_a, + "direction"_a, + DOC(NamedTransform, setTransform)) + + .def_static( + "GetTransform", + &NamedTransform::GetTransform, + "transform"_a, + "direction"_a, + DOC(NamedTransform, GetTransform)) // Categories - .def("hasCategory", &NamedTransform::hasCategory, "category"_a, - DOC(NamedTransform, hasCategory)) - .def("addCategory", &NamedTransform::addCategory, "category"_a, - DOC(NamedTransform, addCategory)) - .def("removeCategory", &NamedTransform::removeCategory, "category"_a, - DOC(NamedTransform, removeCategory)) - .def("getCategories", [](NamedTransformRcPtr & self) - { - return NamedTransformCategoryIterator(self); - }) - .def("clearCategories", &NamedTransform::clearCategories, - DOC(NamedTransform, clearCategories)); + .def( + "hasCategory", + &NamedTransform::hasCategory, + "category"_a, + DOC(NamedTransform, hasCategory)) + .def( + "addCategory", + &NamedTransform::addCategory, + "category"_a, + DOC(NamedTransform, addCategory)) + .def( + "removeCategory", + &NamedTransform::removeCategory, + "category"_a, + DOC(NamedTransform, removeCategory)) + .def( + "getCategories", + [](NamedTransformRcPtr & self) { return NamedTransformCategoryIterator(self); }) + .def( + "clearCategories", + &NamedTransform::clearCategories, + DOC(NamedTransform, clearCategories)); defRepr(clsNamedTransform); clsNamedTransformCategoryIterator - .def("__len__", [](NamedTransformCategoryIterator & it) - { - return it.m_obj->getNumCategories(); - }) - .def("__getitem__", [](NamedTransformCategoryIterator & it, int i) - { + .def( + "__len__", + [](NamedTransformCategoryIterator & it) { return it.m_obj->getNumCategories(); }) + .def( + "__getitem__", + [](NamedTransformCategoryIterator & it, int i) { it.checkIndex(i, it.m_obj->getNumCategories()); return it.m_obj->getCategory(i); }) - .def("__iter__", [](NamedTransformCategoryIterator & it) -> NamedTransformCategoryIterator & - { + .def( + "__iter__", + [](NamedTransformCategoryIterator & it) -> NamedTransformCategoryIterator & { return it; }) - .def("__next__", [](NamedTransformCategoryIterator & it) - { - int i = it.nextIndex(it.m_obj->getNumCategories()); - return it.m_obj->getCategory(i); - }); + .def("__next__", [](NamedTransformCategoryIterator & it) { + int i = it.nextIndex(it.m_obj->getNumCategories()); + return it.m_obj->getCategory(i); + }); clsNamedTransformAliasIterator - .def("__len__", [](NamedTransformAliasIterator & it) - { - return it.m_obj->getNumAliases(); - }) - .def("__getitem__", [](NamedTransformAliasIterator & it, int i) - { + .def("__len__", [](NamedTransformAliasIterator & it) { return it.m_obj->getNumAliases(); }) + .def( + "__getitem__", + [](NamedTransformAliasIterator & it, int i) { it.checkIndex(i, (int)it.m_obj->getNumAliases()); return it.m_obj->getAlias(i); }) - .def("__iter__", [](NamedTransformAliasIterator & it) -> NamedTransformAliasIterator & - { - return it; - }) - .def("__next__", [](NamedTransformAliasIterator & it) - { - int i = it.nextIndex((int)it.m_obj->getNumAliases()); - return it.m_obj->getAlias(i); - }); - + .def( + "__iter__", + [](NamedTransformAliasIterator & it) -> NamedTransformAliasIterator & { return it; }) + .def("__next__", [](NamedTransformAliasIterator & it) { + int i = it.nextIndex((int)it.m_obj->getNumAliases()); + return it.m_obj->getAlias(i); + }); } } // namespace OCIO_NAMESPACE diff --git a/src/bindings/python/PyOpenColorIO.cpp b/src/bindings/python/PyOpenColorIO.cpp index 7adda36bb3..6b462ea177 100644 --- a/src/bindings/python/PyOpenColorIO.cpp +++ b/src/bindings/python/PyOpenColorIO.cpp @@ -14,17 +14,14 @@ PYBIND11_MODULE(PyOpenColorIO, m) bindPyTypes(m); // Exceptions - auto clsException = - py::register_exception( - m, "Exception"); - - auto clsExceptionMissingFile = - py::register_exception( - m, "ExceptionMissingFile"); + auto clsException = py::register_exception(m, "Exception"); + + auto clsExceptionMissingFile + = py::register_exception(m, "ExceptionMissingFile"); #if PY_VERSION_MAJOR >= 3 // __doc__ is not writable after class creation in Python 2 - clsException.doc() = DOC(Exception); + clsException.doc() = DOC(Exception); clsExceptionMissingFile.doc() = DOC(ExceptionMissingFile); #endif @@ -34,38 +31,49 @@ PYBIND11_MODULE(PyOpenColorIO, m) m.attr("__license__") = "SPDX-License-Identifier: BSD-3-Clause"; m.attr("__copyright__") = "Copyright Contributors to the OpenColorIO Project"; m.attr("__version__") = OCIO_VERSION_FULL_STR; - m.attr("__status__") = std::string(OCIO_VERSION_STATUS_STR).empty() ? "Production" : OCIO_VERSION_STATUS_STR; - m.attr("__doc__") = "OpenColorIO (OCIO) is a complete color management solution geared towards motion picture production"; + m.attr("__status__") + = std::string(OCIO_VERSION_STATUS_STR).empty() ? "Production" : OCIO_VERSION_STATUS_STR; + m.attr("__doc__") = "OpenColorIO (OCIO) is a complete color management solution geared towards " + "motion picture production"; // Global functions - m.def("ClearAllCaches", &ClearAllCaches, - DOC(PyOpenColorIO, ClearAllCaches)); - m.def("GetVersion", &GetVersion, - DOC(PyOpenColorIO, GetVersion)); - m.def("GetVersionHex", &GetVersionHex, - DOC(PyOpenColorIO, GetVersionHex)); - m.def("GetLoggingLevel", &GetLoggingLevel, - DOC(PyOpenColorIO, GetLoggingLevel)); - m.def("SetLoggingLevel", &SetLoggingLevel, "level"_a, - DOC(PyOpenColorIO, SetLoggingLevel)); - m.def("SetLoggingFunction", &SetLoggingFunction, "logFunction"_a, - DOC(PyOpenColorIO, SetLoggingFunction)); - m.def("ResetToDefaultLoggingFunction", &ResetToDefaultLoggingFunction, - DOC(PyOpenColorIO, ResetToDefaultLoggingFunction)); - m.def("LogMessage", &LogMessage, "level"_a, "message"_a, - DOC(PyOpenColorIO, LogMessage)); - m.def("SetComputeHashFunction", &SetComputeHashFunction, "hashFunction"_a, - DOC(PyOpenColorIO, SetComputeHashFunction)); - m.def("ResetComputeHashFunction", &ResetComputeHashFunction, - DOC(PyOpenColorIO, ResetComputeHashFunction)); - m.def("GetEnvVariable", &GetEnvVariable, "name"_a, - DOC(PyOpenColorIO, GetEnvVariable)); - m.def("SetEnvVariable", &SetEnvVariable, "name"_a, "value"_a, - DOC(PyOpenColorIO, SetEnvVariable)); - m.def("UnsetEnvVariable", &UnsetEnvVariable, "name"_a, - DOC(PyOpenColorIO, UnsetEnvVariable)); - m.def("IsEnvVariablePresent", &IsEnvVariablePresent, "name"_a, - DOC(PyOpenColorIO, IsEnvVariablePresent)); + m.def("ClearAllCaches", &ClearAllCaches, DOC(PyOpenColorIO, ClearAllCaches)); + m.def("GetVersion", &GetVersion, DOC(PyOpenColorIO, GetVersion)); + m.def("GetVersionHex", &GetVersionHex, DOC(PyOpenColorIO, GetVersionHex)); + m.def("GetLoggingLevel", &GetLoggingLevel, DOC(PyOpenColorIO, GetLoggingLevel)); + m.def("SetLoggingLevel", &SetLoggingLevel, "level"_a, DOC(PyOpenColorIO, SetLoggingLevel)); + m.def( + "SetLoggingFunction", + &SetLoggingFunction, + "logFunction"_a, + DOC(PyOpenColorIO, SetLoggingFunction)); + m.def( + "ResetToDefaultLoggingFunction", + &ResetToDefaultLoggingFunction, + DOC(PyOpenColorIO, ResetToDefaultLoggingFunction)); + m.def("LogMessage", &LogMessage, "level"_a, "message"_a, DOC(PyOpenColorIO, LogMessage)); + m.def( + "SetComputeHashFunction", + &SetComputeHashFunction, + "hashFunction"_a, + DOC(PyOpenColorIO, SetComputeHashFunction)); + m.def( + "ResetComputeHashFunction", + &ResetComputeHashFunction, + DOC(PyOpenColorIO, ResetComputeHashFunction)); + m.def("GetEnvVariable", &GetEnvVariable, "name"_a, DOC(PyOpenColorIO, GetEnvVariable)); + m.def( + "SetEnvVariable", + &SetEnvVariable, + "name"_a, + "value"_a, + DOC(PyOpenColorIO, SetEnvVariable)); + m.def("UnsetEnvVariable", &UnsetEnvVariable, "name"_a, DOC(PyOpenColorIO, UnsetEnvVariable)); + m.def( + "IsEnvVariablePresent", + &IsEnvVariablePresent, + "name"_a, + DOC(PyOpenColorIO, IsEnvVariablePresent)); // OpenColorIO bindPyBaker(m); diff --git a/src/bindings/python/PyOpenColorIO.h b/src/bindings/python/PyOpenColorIO.h index a803c540e3..d80b792c39 100644 --- a/src/bindings/python/PyOpenColorIO.h +++ b/src/bindings/python/PyOpenColorIO.h @@ -4,10 +4,10 @@ #ifndef INCLUDED_OCIO_PYOPENCOLORIO_H #define INCLUDED_OCIO_PYOPENCOLORIO_H -#include #include #include #include +#include #include #include @@ -62,26 +62,27 @@ void bindPyMixingHelpers(py::module & m); } // namespace OCIO_NAMESPACE -// Transform polymorphism is not detected by pybind11 outright. Custom automatic downcasting +// Transform polymorphism is not detected by pybind11 outright. Custom automatic downcasting // is needed to return Transform subclass types from the OCIO API. See: // https://pybind11.readthedocs.io/en/stable/advanced/classes.html#custom-automatic-downcasters namespace OCIO = OCIO_NAMESPACE; -namespace pybind11 +namespace pybind11 { -template<> -struct polymorphic_type_hook { - static const void *get(const OCIO::ImageDesc *const src, const std::type_info*& type) { +template <> struct polymorphic_type_hook +{ + static const void * get(const OCIO::ImageDesc * const src, const std::type_info *& type) + { // Note: src may be nullptr if (src) { - if(dynamic_cast(src)) + if (dynamic_cast(src)) { type = &typeid(OCIO::PackedImageDesc); } - else if(dynamic_cast(src)) + else if (dynamic_cast(src)) { type = &typeid(OCIO::PlanarImageDesc); } @@ -90,13 +91,14 @@ struct polymorphic_type_hook { } }; -template<> -struct polymorphic_type_hook { - static const void *get(const OCIO::GpuShaderCreator *const src, const std::type_info*& type) { +template <> struct polymorphic_type_hook +{ + static const void * get(const OCIO::GpuShaderCreator * const src, const std::type_info *& type) + { // Note: src may be nullptr if (src) { - if(dynamic_cast(src)) + if (dynamic_cast(src)) { type = &typeid(OCIO::GpuShaderDesc); } @@ -105,97 +107,98 @@ struct polymorphic_type_hook { } }; -template<> -struct polymorphic_type_hook { - static const void *get(const OCIO::Transform *const src, const std::type_info*& type) { +template <> struct polymorphic_type_hook +{ + static const void * get(const OCIO::Transform * const src, const std::type_info *& type) + { // Note: src may be nullptr if (src) { - if(dynamic_cast(src)) + if (dynamic_cast(src)) { type = &typeid(OCIO::AllocationTransform); } - if(dynamic_cast(src)) + if (dynamic_cast(src)) { type = &typeid(OCIO::BuiltinTransform); } - else if(dynamic_cast(src)) + else if (dynamic_cast(src)) { type = &typeid(OCIO::CDLTransform); } - else if(dynamic_cast(src)) + else if (dynamic_cast(src)) { type = &typeid(OCIO::ColorSpaceTransform); } - else if(dynamic_cast(src)) + else if (dynamic_cast(src)) { type = &typeid(OCIO::DisplayViewTransform); } - else if(dynamic_cast(src)) + else if (dynamic_cast(src)) { type = &typeid(OCIO::ExponentTransform); } - else if(dynamic_cast(src)) + else if (dynamic_cast(src)) { type = &typeid(OCIO::ExponentWithLinearTransform); } - else if(dynamic_cast(src)) + else if (dynamic_cast(src)) { type = &typeid(OCIO::ExposureContrastTransform); } - else if(dynamic_cast(src)) + else if (dynamic_cast(src)) { type = &typeid(OCIO::FileTransform); } - else if(dynamic_cast(src)) + else if (dynamic_cast(src)) { type = &typeid(OCIO::FixedFunctionTransform); } - else if (dynamic_cast(src)) + else if (dynamic_cast(src)) { type = &typeid(OCIO::GradingPrimaryTransform); } - else if (dynamic_cast(src)) + else if (dynamic_cast(src)) { type = &typeid(OCIO::GradingRGBCurveTransform); } - if(dynamic_cast(src)) + if (dynamic_cast(src)) { type = &typeid(OCIO::GradingToneTransform); } - else if(dynamic_cast(src)) + else if (dynamic_cast(src)) { type = &typeid(OCIO::GroupTransform); } - else if(dynamic_cast(src)) + else if (dynamic_cast(src)) { type = &typeid(OCIO::LogAffineTransform); } - else if(dynamic_cast(src)) + else if (dynamic_cast(src)) { type = &typeid(OCIO::LogCameraTransform); } - else if(dynamic_cast(src)) + else if (dynamic_cast(src)) { type = &typeid(OCIO::LogTransform); } - else if(dynamic_cast(src)) + else if (dynamic_cast(src)) { type = &typeid(OCIO::LookTransform); } - else if(dynamic_cast(src)) + else if (dynamic_cast(src)) { type = &typeid(OCIO::Lut1DTransform); } - else if(dynamic_cast(src)) + else if (dynamic_cast(src)) { type = &typeid(OCIO::Lut3DTransform); } - else if(dynamic_cast(src)) + else if (dynamic_cast(src)) { type = &typeid(OCIO::MatrixTransform); } - else if(dynamic_cast(src)) + else if (dynamic_cast(src)) { type = &typeid(OCIO::RangeTransform); } diff --git a/src/bindings/python/PyPackedImageDesc.cpp b/src/bindings/python/PyPackedImageDesc.cpp index 0b3e6a4e24..6b8a59cd76 100644 --- a/src/bindings/python/PyPackedImageDesc.cpp +++ b/src/bindings/python/PyPackedImageDesc.cpp @@ -8,121 +8,148 @@ namespace OCIO_NAMESPACE void bindPyPackedImageDesc(py::module & m) { - auto clsPackedImageDesc = - py::class_( - m.attr("PackedImageDesc")) - - .def(py::init([](py::buffer & data, long width, long height, long numChannels) - { - PyPackedImageDesc * p = new PyPackedImageDesc(); - p->m_data[0] = data; - - py::buffer_info info = p->m_data[0].request(); - checkBufferType(info, py::dtype("float32")); - checkBufferSize(info, width*height*numChannels); - - p->m_img = std::make_shared(info.ptr, width, height, numChannels); - - return p; - }), - "data"_a, "width"_a, "height"_a, "numChannels"_a, - DOC(PackedImageDesc, PackedImageDesc)) - .def(py::init([](py::buffer & data, - long width, long height, - long numChannels, - BitDepth bitDepth, - ptrdiff_t chanStrideBytes, - ptrdiff_t xStrideBytes, - ptrdiff_t yStrideBytes) - { - PyPackedImageDesc * p = new PyPackedImageDesc(); - p->m_data[0] = data; - - py::buffer_info info = p->m_data[0].request(); - checkBufferType(info, bitDepth); - checkBufferSize(info, width*height*numChannels); - - p->m_img = std::make_shared(info.ptr, - width, height, - numChannels, - bitDepth, - chanStrideBytes, - xStrideBytes, - yStrideBytes); - return p; - }), - "data"_a, "width"_a, "height"_a, "numChannels"_a, "bitDepth"_a, "chanStrideBytes"_a, - "xStrideBytes"_a, "yStrideBytes"_a, - DOC(PackedImageDesc, PackedImageDesc, 2)) - .def(py::init([](py::buffer & data, - long width, long height, - ChannelOrdering chanOrder) - { - PyPackedImageDesc * p = new PyPackedImageDesc(); - p->m_data[0] = data; - - py::buffer_info info = p->m_data[0].request(); - checkBufferType(info, py::dtype("float32")); - checkBufferSize(info, width*height*chanOrderToNumChannels(chanOrder)); - - p->m_img = std::make_shared(info.ptr, width, height, chanOrder); - - return p; - }), - "data"_a, "width"_a, "height"_a, "chanOrder"_a, - DOC(PackedImageDesc, PackedImageDesc, 3)) - .def(py::init([](py::buffer & data, - long width, long height, - ChannelOrdering chanOrder, - BitDepth bitDepth, - ptrdiff_t chanStrideBytes, - ptrdiff_t xStrideBytes, - ptrdiff_t yStrideBytes) - { - PyPackedImageDesc * p = new PyPackedImageDesc(); - p->m_data[0] = data; - - py::buffer_info info = p->m_data[0].request(); - checkBufferType(info, bitDepth); - checkBufferSize(info, width*height*chanOrderToNumChannels(chanOrder)); - - p->m_img = std::make_shared(info.ptr, - width, height, - chanOrder, - bitDepth, - chanStrideBytes, - xStrideBytes, - yStrideBytes); - return p; - }), - "data"_a, "width"_a, "height"_a, "chanOrder"_a, "bitDepth"_a, "chanStrideBytes"_a, - "xStrideBytes"_a, "yStrideBytes"_a, - DOC(PackedImageDesc, PackedImageDesc, 4)) - - .def("getData", [](const PyPackedImageDesc & self) - { - PackedImageDescRcPtr p = self.getImg(); - return py::array(bitDepthToDtype(p->getBitDepth()), - { p->getHeight() * p->getWidth() * p->getNumChannels() }, - { p->getChanStrideBytes() }, - p->getData()); - }, - DOC(PackedImageDesc, getData)) - .def("getChannelOrder", [](const PyPackedImageDesc & self) - { - return self.getImg()->getChannelOrder(); - }, - DOC(PackedImageDesc, getChannelOrder)) - .def("getNumChannels", [](const PyPackedImageDesc & self) - { - return self.getImg()->getNumChannels(); - }, - DOC(PackedImageDesc, getNumChannels)) - .def("getChanStrideBytes", [](const PyPackedImageDesc & self) - { - return self.getImg()->getChanStrideBytes(); - }, - DOC(PackedImageDesc, getChanStrideBytes)); + auto clsPackedImageDesc + = py::class_(m.attr("PackedImageDesc")) + + .def( + py::init([](py::buffer & data, long width, long height, long numChannels) { + PyPackedImageDesc * p = new PyPackedImageDesc(); + p->m_data[0] = data; + + py::buffer_info info = p->m_data[0].request(); + checkBufferType(info, py::dtype("float32")); + checkBufferSize(info, width * height * numChannels); + + p->m_img + = std::make_shared(info.ptr, width, height, numChannels); + + return p; + }), + "data"_a, + "width"_a, + "height"_a, + "numChannels"_a, + DOC(PackedImageDesc, PackedImageDesc)) + .def( + py::init([](py::buffer & data, + long width, + long height, + long numChannels, + BitDepth bitDepth, + ptrdiff_t chanStrideBytes, + ptrdiff_t xStrideBytes, + ptrdiff_t yStrideBytes) { + PyPackedImageDesc * p = new PyPackedImageDesc(); + p->m_data[0] = data; + + py::buffer_info info = p->m_data[0].request(); + checkBufferType(info, bitDepth); + checkBufferSize(info, width * height * numChannels); + + p->m_img = std::make_shared( + info.ptr, + width, + height, + numChannels, + bitDepth, + chanStrideBytes, + xStrideBytes, + yStrideBytes); + return p; + }), + "data"_a, + "width"_a, + "height"_a, + "numChannels"_a, + "bitDepth"_a, + "chanStrideBytes"_a, + "xStrideBytes"_a, + "yStrideBytes"_a, + DOC(PackedImageDesc, PackedImageDesc, 2)) + .def( + py::init([](py::buffer & data, + long width, + long height, + ChannelOrdering chanOrder) { + PyPackedImageDesc * p = new PyPackedImageDesc(); + p->m_data[0] = data; + + py::buffer_info info = p->m_data[0].request(); + checkBufferType(info, py::dtype("float32")); + checkBufferSize(info, width * height * chanOrderToNumChannels(chanOrder)); + + p->m_img + = std::make_shared(info.ptr, width, height, chanOrder); + + return p; + }), + "data"_a, + "width"_a, + "height"_a, + "chanOrder"_a, + DOC(PackedImageDesc, PackedImageDesc, 3)) + .def( + py::init([](py::buffer & data, + long width, + long height, + ChannelOrdering chanOrder, + BitDepth bitDepth, + ptrdiff_t chanStrideBytes, + ptrdiff_t xStrideBytes, + ptrdiff_t yStrideBytes) { + PyPackedImageDesc * p = new PyPackedImageDesc(); + p->m_data[0] = data; + + py::buffer_info info = p->m_data[0].request(); + checkBufferType(info, bitDepth); + checkBufferSize(info, width * height * chanOrderToNumChannels(chanOrder)); + + p->m_img = std::make_shared( + info.ptr, + width, + height, + chanOrder, + bitDepth, + chanStrideBytes, + xStrideBytes, + yStrideBytes); + return p; + }), + "data"_a, + "width"_a, + "height"_a, + "chanOrder"_a, + "bitDepth"_a, + "chanStrideBytes"_a, + "xStrideBytes"_a, + "yStrideBytes"_a, + DOC(PackedImageDesc, PackedImageDesc, 4)) + + .def( + "getData", + [](const PyPackedImageDesc & self) { + PackedImageDescRcPtr p = self.getImg(); + return py::array( + bitDepthToDtype(p->getBitDepth()), + {p->getHeight() * p->getWidth() * p->getNumChannels()}, + {p->getChanStrideBytes()}, + p->getData()); + }, + DOC(PackedImageDesc, getData)) + .def( + "getChannelOrder", + [](const PyPackedImageDesc & self) { return self.getImg()->getChannelOrder(); }, + DOC(PackedImageDesc, getChannelOrder)) + .def( + "getNumChannels", + [](const PyPackedImageDesc & self) { return self.getImg()->getNumChannels(); }, + DOC(PackedImageDesc, getNumChannels)) + .def( + "getChanStrideBytes", + [](const PyPackedImageDesc & self) { + return self.getImg()->getChanStrideBytes(); + }, + DOC(PackedImageDesc, getChanStrideBytes)); } } // namespace OCIO_NAMESPACE diff --git a/src/bindings/python/PyPlanarImageDesc.cpp b/src/bindings/python/PyPlanarImageDesc.cpp index 3b264b9340..6a5e7f0d9a 100644 --- a/src/bindings/python/PyPlanarImageDesc.cpp +++ b/src/bindings/python/PyPlanarImageDesc.cpp @@ -6,7 +6,7 @@ namespace OCIO_NAMESPACE { -namespace +namespace { void * getBufferData(py::buffer & data, py::dtype dtype, long size) @@ -21,172 +21,209 @@ void * getBufferData(py::buffer & data, py::dtype dtype, long size) void bindPyPlanarImageDesc(py::module & m) { - auto clsPlanarImageDesc = - py::class_( - m.attr("PlanarImageDesc")) - - .def(py::init([](py::buffer & rData, - py::buffer & gData, - py::buffer & bData, - long width, long height) - { - PyPlanarImageDesc * p = new PyPlanarImageDesc(); - - py::gil_scoped_release release; - p->m_data[0] = rData; - p->m_data[1] = gData; - p->m_data[2] = bData; - long size = width * height; - py::gil_scoped_acquire acquire; - - py::dtype type("float32"); - - p->m_img = std::make_shared( - getBufferData(p->m_data[0], type, size), - getBufferData(p->m_data[1], type, size), - getBufferData(p->m_data[2], type, size), - nullptr, - width, height); - - return p; - }), - "rData"_a, "gData"_a, "bData"_a, "width"_a, "height"_a, - DOC(PlanarImageDesc, PlanarImageDesc)) - .def(py::init([](py::buffer & rData, - py::buffer & gData, - py::buffer & bData, - py::buffer & aData, - long width, long height) - { - PyPlanarImageDesc * p = new PyPlanarImageDesc(); - - py::gil_scoped_release release; - p->m_data[0] = rData; - p->m_data[1] = gData; - p->m_data[2] = bData; - p->m_data[3] = aData; - long size = width * height; - py::gil_scoped_acquire acquire; - - py::dtype type("float32"); - - p->m_img = std::make_shared( - getBufferData(p->m_data[0], type, size), - getBufferData(p->m_data[1], type, size), - getBufferData(p->m_data[2], type, size), - getBufferData(p->m_data[3], type, size), - width, height); - return p; - }), - "rData"_a, "gData"_a, "bData"_a, "aData"_a, "width"_a, "height"_a, - DOC(PlanarImageDesc, PlanarImageDesc, 2)) - .def(py::init([](py::buffer & rData, - py::buffer & gData, - py::buffer & bData, - long width, long height, - BitDepth bitDepth, - ptrdiff_t xStrideBytes, - ptrdiff_t yStrideBytes) - { - PyPlanarImageDesc * p = new PyPlanarImageDesc(); - - py::gil_scoped_release release; - p->m_data[0] = rData; - p->m_data[1] = gData; - p->m_data[2] = bData; - long size = width * height; - py::gil_scoped_acquire acquire; - - py::dtype type = bitDepthToDtype(bitDepth); - - p->m_img = std::make_shared( - getBufferData(p->m_data[0], type, size), - getBufferData(p->m_data[1], type, size), - getBufferData(p->m_data[2], type, size), - nullptr, - width, height, - bitDepth, - xStrideBytes, - yStrideBytes); - - return p; - }), - "rData"_a, "gData"_a, "bData"_a, "width"_a, "height"_a, "bitDepth"_a, - "xStrideBytes"_a, "yStrideBytes"_a, - DOC(PlanarImageDesc, PlanarImageDesc, 3)) - .def(py::init([](py::buffer & rData, - py::buffer & gData, - py::buffer & bData, - py::buffer & aData, - long width, long height, - BitDepth bitDepth, - ptrdiff_t xStrideBytes, - ptrdiff_t yStrideBytes) - { - PyPlanarImageDesc * p = new PyPlanarImageDesc(); - - py::gil_scoped_release release; - p->m_data[0] = rData; - p->m_data[1] = gData; - p->m_data[2] = bData; - p->m_data[3] = aData; - long size = width * height; - py::gil_scoped_acquire acquire; - - py::dtype type = bitDepthToDtype(bitDepth); - - p->m_img = std::make_shared( - getBufferData(p->m_data[0], type, size), - getBufferData(p->m_data[1], type, size), - getBufferData(p->m_data[2], type, size), - getBufferData(p->m_data[3], type, size), - width, height, - bitDepth, - xStrideBytes, - yStrideBytes); - - return p; - }), - "rData"_a, "gData"_a, "bData"_a, "aData"_a, "width"_a, "height"_a, "bitDepth"_a, - "xStrideBytes"_a, "yStrideBytes"_a, - DOC(PlanarImageDesc, PlanarImageDesc, 4)) - - .def("getRData", [](const PyPlanarImageDesc & self) - { - PlanarImageDescRcPtr p = self.getImg(); - return py::array(bitDepthToDtype(p->getBitDepth()), - { p->getHeight() * p->getWidth() }, - { bitDepthToBytes(p->getBitDepth()) }, - p->getRData()); - }, - DOC(PlanarImageDesc, getRData)) - .def("getGData", [](const PyPlanarImageDesc & self) - { - PlanarImageDescRcPtr p = self.getImg(); - return py::array(bitDepthToDtype(p->getBitDepth()), - { p->getHeight() * p->getWidth() }, - { bitDepthToBytes(p->getBitDepth()) }, - p->getGData()); - }, - DOC(PlanarImageDesc, getGData)) - .def("getBData", [](const PyPlanarImageDesc & self) - { - PlanarImageDescRcPtr p = self.getImg(); - return py::array(bitDepthToDtype(p->getBitDepth()), - { p->getHeight() * p->getWidth() }, - { bitDepthToBytes(p->getBitDepth()) }, - p->getBData()); - }, - DOC(PlanarImageDesc, getBData)) - .def("getAData", [](const PyPlanarImageDesc & self) - { - PlanarImageDescRcPtr p = self.getImg(); - return py::array(bitDepthToDtype(p->getBitDepth()), - { p->getHeight() * p->getWidth() }, - { bitDepthToBytes(p->getBitDepth()) }, - p->getAData()); - }, - DOC(PlanarImageDesc, getAData)); + auto clsPlanarImageDesc + = py::class_(m.attr("PlanarImageDesc")) + + .def( + py::init([](py::buffer & rData, + py::buffer & gData, + py::buffer & bData, + long width, + long height) { + PyPlanarImageDesc * p = new PyPlanarImageDesc(); + + py::gil_scoped_release release; + p->m_data[0] = rData; + p->m_data[1] = gData; + p->m_data[2] = bData; + long size = width * height; + py::gil_scoped_acquire acquire; + + py::dtype type("float32"); + + p->m_img = std::make_shared( + getBufferData(p->m_data[0], type, size), + getBufferData(p->m_data[1], type, size), + getBufferData(p->m_data[2], type, size), + nullptr, + width, + height); + + return p; + }), + "rData"_a, + "gData"_a, + "bData"_a, + "width"_a, + "height"_a, + DOC(PlanarImageDesc, PlanarImageDesc)) + .def( + py::init([](py::buffer & rData, + py::buffer & gData, + py::buffer & bData, + py::buffer & aData, + long width, + long height) { + PyPlanarImageDesc * p = new PyPlanarImageDesc(); + + py::gil_scoped_release release; + p->m_data[0] = rData; + p->m_data[1] = gData; + p->m_data[2] = bData; + p->m_data[3] = aData; + long size = width * height; + py::gil_scoped_acquire acquire; + + py::dtype type("float32"); + + p->m_img = std::make_shared( + getBufferData(p->m_data[0], type, size), + getBufferData(p->m_data[1], type, size), + getBufferData(p->m_data[2], type, size), + getBufferData(p->m_data[3], type, size), + width, + height); + return p; + }), + "rData"_a, + "gData"_a, + "bData"_a, + "aData"_a, + "width"_a, + "height"_a, + DOC(PlanarImageDesc, PlanarImageDesc, 2)) + .def( + py::init([](py::buffer & rData, + py::buffer & gData, + py::buffer & bData, + long width, + long height, + BitDepth bitDepth, + ptrdiff_t xStrideBytes, + ptrdiff_t yStrideBytes) { + PyPlanarImageDesc * p = new PyPlanarImageDesc(); + + py::gil_scoped_release release; + p->m_data[0] = rData; + p->m_data[1] = gData; + p->m_data[2] = bData; + long size = width * height; + py::gil_scoped_acquire acquire; + + py::dtype type = bitDepthToDtype(bitDepth); + + p->m_img = std::make_shared( + getBufferData(p->m_data[0], type, size), + getBufferData(p->m_data[1], type, size), + getBufferData(p->m_data[2], type, size), + nullptr, + width, + height, + bitDepth, + xStrideBytes, + yStrideBytes); + + return p; + }), + "rData"_a, + "gData"_a, + "bData"_a, + "width"_a, + "height"_a, + "bitDepth"_a, + "xStrideBytes"_a, + "yStrideBytes"_a, + DOC(PlanarImageDesc, PlanarImageDesc, 3)) + .def( + py::init([](py::buffer & rData, + py::buffer & gData, + py::buffer & bData, + py::buffer & aData, + long width, + long height, + BitDepth bitDepth, + ptrdiff_t xStrideBytes, + ptrdiff_t yStrideBytes) { + PyPlanarImageDesc * p = new PyPlanarImageDesc(); + + py::gil_scoped_release release; + p->m_data[0] = rData; + p->m_data[1] = gData; + p->m_data[2] = bData; + p->m_data[3] = aData; + long size = width * height; + py::gil_scoped_acquire acquire; + + py::dtype type = bitDepthToDtype(bitDepth); + + p->m_img = std::make_shared( + getBufferData(p->m_data[0], type, size), + getBufferData(p->m_data[1], type, size), + getBufferData(p->m_data[2], type, size), + getBufferData(p->m_data[3], type, size), + width, + height, + bitDepth, + xStrideBytes, + yStrideBytes); + + return p; + }), + "rData"_a, + "gData"_a, + "bData"_a, + "aData"_a, + "width"_a, + "height"_a, + "bitDepth"_a, + "xStrideBytes"_a, + "yStrideBytes"_a, + DOC(PlanarImageDesc, PlanarImageDesc, 4)) + + .def( + "getRData", + [](const PyPlanarImageDesc & self) { + PlanarImageDescRcPtr p = self.getImg(); + return py::array( + bitDepthToDtype(p->getBitDepth()), + {p->getHeight() * p->getWidth()}, + {bitDepthToBytes(p->getBitDepth())}, + p->getRData()); + }, + DOC(PlanarImageDesc, getRData)) + .def( + "getGData", + [](const PyPlanarImageDesc & self) { + PlanarImageDescRcPtr p = self.getImg(); + return py::array( + bitDepthToDtype(p->getBitDepth()), + {p->getHeight() * p->getWidth()}, + {bitDepthToBytes(p->getBitDepth())}, + p->getGData()); + }, + DOC(PlanarImageDesc, getGData)) + .def( + "getBData", + [](const PyPlanarImageDesc & self) { + PlanarImageDescRcPtr p = self.getImg(); + return py::array( + bitDepthToDtype(p->getBitDepth()), + {p->getHeight() * p->getWidth()}, + {bitDepthToBytes(p->getBitDepth())}, + p->getBData()); + }, + DOC(PlanarImageDesc, getBData)) + .def( + "getAData", + [](const PyPlanarImageDesc & self) { + PlanarImageDescRcPtr p = self.getImg(); + return py::array( + bitDepthToDtype(p->getBitDepth()), + {p->getHeight() * p->getWidth()}, + {bitDepthToBytes(p->getBitDepth())}, + p->getAData()); + }, + DOC(PlanarImageDesc, getAData)); } } // namespace OCIO_NAMESPACE diff --git a/src/bindings/python/PyProcessor.cpp b/src/bindings/python/PyProcessor.cpp index 2071ccc784..8a737dfe2a 100644 --- a/src/bindings/python/PyProcessor.cpp +++ b/src/bindings/python/PyProcessor.cpp @@ -22,98 +22,117 @@ using TransformFormatMetadataIterator = PyIterator( - m.attr("Processor")); + auto clsProcessor = py::class_(m.attr("Processor")); - auto clsTransformFormatMetadataIterator = - py::class_( - clsProcessor, "TransformFormatMetadataIterator"); + auto clsTransformFormatMetadataIterator = py::class_( + clsProcessor, + "TransformFormatMetadataIterator"); - clsProcessor - .def("isNoOp", &Processor::isNoOp, - DOC(Processor, isNoOp)) - .def("hasChannelCrosstalk", &Processor::hasChannelCrosstalk, - DOC(Processor, hasChannelCrosstalk)) - .def("getCacheID", &Processor::getCacheID, - DOC(Processor, getCacheID)) - .def("getProcessorMetadata", &Processor::getProcessorMetadata, - DOC(Processor, getProcessorMetadata)) - .def("getFormatMetadata", &Processor::getFormatMetadata, - py::return_value_policy::reference_internal, - DOC(Processor, getFormatMetadata)) - .def("getTransformFormatMetadata", [](ProcessorRcPtr & self) - { - return TransformFormatMetadataIterator(self); - }) - .def("createGroupTransform", &Processor::createGroupTransform, - DOC(Processor, createGroupTransform)) - .def("getDynamicProperty", [](ProcessorRcPtr & self, DynamicPropertyType type) - { + clsProcessor.def("isNoOp", &Processor::isNoOp, DOC(Processor, isNoOp)) + .def( + "hasChannelCrosstalk", + &Processor::hasChannelCrosstalk, + DOC(Processor, hasChannelCrosstalk)) + .def("getCacheID", &Processor::getCacheID, DOC(Processor, getCacheID)) + .def( + "getProcessorMetadata", + &Processor::getProcessorMetadata, + DOC(Processor, getProcessorMetadata)) + .def( + "getFormatMetadata", + &Processor::getFormatMetadata, + py::return_value_policy::reference_internal, + DOC(Processor, getFormatMetadata)) + .def( + "getTransformFormatMetadata", + [](ProcessorRcPtr & self) { return TransformFormatMetadataIterator(self); }) + .def( + "createGroupTransform", + &Processor::createGroupTransform, + DOC(Processor, createGroupTransform)) + .def( + "getDynamicProperty", + [](ProcessorRcPtr & self, DynamicPropertyType type) { return PyDynamicProperty(self->getDynamicProperty(type)); }, "type"_a, - DOC(Processor, getDynamicProperty)) - .def("hasDynamicProperty", - (bool (Processor::*)(DynamicPropertyType) const noexcept) - &Processor::hasDynamicProperty, - "type"_a, - DOC(Processor, hasDynamicProperty)) - .def("isDynamic", &Processor::isDynamic, - DOC(Processor, isDynamic)) - .def("getOptimizedProcessor", - (ConstProcessorRcPtr(Processor::*)(OptimizationFlags) const) - &Processor::getOptimizedProcessor, "oFlags"_a, - DOC(Processor, getOptimizedProcessor)) - .def("getOptimizedProcessor", - (ConstProcessorRcPtr(Processor::*)(BitDepth, BitDepth, OptimizationFlags) const) - &Processor::getOptimizedProcessor, - "inBitDepth"_a, "outBitDepth"_a, "oFlags"_a, - DOC(Processor, getOptimizedProcessor)) + DOC(Processor, getDynamicProperty)) + .def( + "hasDynamicProperty", + (bool(Processor::*)(DynamicPropertyType) const noexcept) + & Processor::hasDynamicProperty, + "type"_a, + DOC(Processor, hasDynamicProperty)) + .def("isDynamic", &Processor::isDynamic, DOC(Processor, isDynamic)) + .def( + "getOptimizedProcessor", + (ConstProcessorRcPtr(Processor::*)(OptimizationFlags) const) + & Processor::getOptimizedProcessor, + "oFlags"_a, + DOC(Processor, getOptimizedProcessor)) + .def( + "getOptimizedProcessor", + (ConstProcessorRcPtr(Processor::*)(BitDepth, BitDepth, OptimizationFlags) const) + & Processor::getOptimizedProcessor, + "inBitDepth"_a, + "outBitDepth"_a, + "oFlags"_a, + DOC(Processor, getOptimizedProcessor)) // GPU Renderer - .def("getDefaultGPUProcessor", &Processor::getDefaultGPUProcessor, - DOC(Processor, getDefaultGPUProcessor)) - .def("getOptimizedGPUProcessor", &Processor::getOptimizedGPUProcessor, "oFlags"_a, - DOC(Processor, getOptimizedGPUProcessor)) + .def( + "getDefaultGPUProcessor", + &Processor::getDefaultGPUProcessor, + DOC(Processor, getDefaultGPUProcessor)) + .def( + "getOptimizedGPUProcessor", + &Processor::getOptimizedGPUProcessor, + "oFlags"_a, + DOC(Processor, getOptimizedGPUProcessor)) // CPU Renderer - .def("getDefaultCPUProcessor", &Processor::getDefaultCPUProcessor, - DOC(Processor, getDefaultCPUProcessor)) - .def("getOptimizedCPUProcessor", - (ConstCPUProcessorRcPtr (Processor::*)(OptimizationFlags) const) - &Processor::getOptimizedCPUProcessor, - "oFlags"_a, - DOC(Processor, getOptimizedCPUProcessor)) - .def("getOptimizedCPUProcessor", - (ConstCPUProcessorRcPtr (Processor::*)(BitDepth, BitDepth, OptimizationFlags) const) - &Processor::getOptimizedCPUProcessor, - "inBitDepth"_a, "outBitDepth"_a, "oFlags"_a, - DOC(Processor, getOptimizedCPUProcessor)); + .def( + "getDefaultCPUProcessor", + &Processor::getDefaultCPUProcessor, + DOC(Processor, getDefaultCPUProcessor)) + .def( + "getOptimizedCPUProcessor", + (ConstCPUProcessorRcPtr(Processor::*)(OptimizationFlags) const) + & Processor::getOptimizedCPUProcessor, + "oFlags"_a, + DOC(Processor, getOptimizedCPUProcessor)) + .def( + "getOptimizedCPUProcessor", + (ConstCPUProcessorRcPtr(Processor::*)(BitDepth, BitDepth, OptimizationFlags) const) + & Processor::getOptimizedCPUProcessor, + "inBitDepth"_a, + "outBitDepth"_a, + "oFlags"_a, + DOC(Processor, getOptimizedCPUProcessor)); clsTransformFormatMetadataIterator - .def("__len__", [](TransformFormatMetadataIterator & it) - { - return it.m_obj->getNumTransforms(); - }) - .def("__getitem__", - [](TransformFormatMetadataIterator & it, int i) -> const FormatMetadata & - { + .def( + "__len__", + [](TransformFormatMetadataIterator & it) { return it.m_obj->getNumTransforms(); }) + .def( + "__getitem__", + [](TransformFormatMetadataIterator & it, int i) -> const FormatMetadata & { it.checkIndex(i, it.m_obj->getNumTransforms()); return it.m_obj->getTransformFormatMetadata(i); - }, - py::return_value_policy::reference_internal) - .def("__iter__", - [](TransformFormatMetadataIterator & it) -> TransformFormatMetadataIterator & - { - return it; + }, + py::return_value_policy::reference_internal) + .def( + "__iter__", + [](TransformFormatMetadataIterator & it) -> TransformFormatMetadataIterator & { + return it; }) - .def("__next__", [](TransformFormatMetadataIterator & it) -> const FormatMetadata & - { + .def( + "__next__", + [](TransformFormatMetadataIterator & it) -> const FormatMetadata & { int i = it.nextIndex(it.m_obj->getNumTransforms()); return it.m_obj->getTransformFormatMetadata(i); - }, - py::return_value_policy::reference_internal); + }, + py::return_value_policy::reference_internal); } } // namespace OCIO_NAMESPACE diff --git a/src/bindings/python/PyProcessorMetadata.cpp b/src/bindings/python/PyProcessorMetadata.cpp index 736790f2da..14ff04cf94 100644 --- a/src/bindings/python/PyProcessorMetadata.cpp +++ b/src/bindings/python/PyProcessorMetadata.cpp @@ -25,62 +25,46 @@ using LookIterator = PyIterator; void bindPyProcessorMetadata(py::module & m) { - auto clsProcessorMetadata = - py::class_( - m.attr("ProcessorMetadata")); + auto clsProcessorMetadata + = py::class_(m.attr("ProcessorMetadata")); - auto clsFileIterator = - py::class_( - clsProcessorMetadata, "FileIterator"); + auto clsFileIterator = py::class_(clsProcessorMetadata, "FileIterator"); - auto clsLookIterator = - py::class_( - clsProcessorMetadata, "LookIterator"); + auto clsLookIterator = py::class_(clsProcessorMetadata, "LookIterator"); clsProcessorMetadata - .def(py::init(&ProcessorMetadata::Create), - DOC(ProcessorMetadata, Create)) + .def(py::init(&ProcessorMetadata::Create), DOC(ProcessorMetadata, Create)) - .def("getFiles", [](ProcessorMetadataRcPtr & self) - { - return FileIterator(self); - }) - .def("getLooks", [](ProcessorMetadataRcPtr & self) - { - return LookIterator(self); - }) - .def("addFile", &ProcessorMetadata::addFile, "fileName"_a, - DOC(ProcessorMetadata, addFile)) - .def("addLook", &ProcessorMetadata::addLook, "look"_a, - DOC(ProcessorMetadata, addLook)); + .def("getFiles", [](ProcessorMetadataRcPtr & self) { return FileIterator(self); }) + .def("getLooks", [](ProcessorMetadataRcPtr & self) { return LookIterator(self); }) + .def("addFile", &ProcessorMetadata::addFile, "fileName"_a, DOC(ProcessorMetadata, addFile)) + .def("addLook", &ProcessorMetadata::addLook, "look"_a, DOC(ProcessorMetadata, addLook)); - clsFileIterator - .def("__len__", [](FileIterator & it) { return it.m_obj->getNumFiles(); }) - .def("__getitem__", [](FileIterator & it, int i) - { + clsFileIterator.def("__len__", [](FileIterator & it) { return it.m_obj->getNumFiles(); }) + .def( + "__getitem__", + [](FileIterator & it, int i) { it.checkIndex(i, it.m_obj->getNumFiles()); return it.m_obj->getFile(i); }) .def("__iter__", [](FileIterator & it) -> FileIterator & { return it; }) - .def("__next__", [](FileIterator & it) - { - int i = it.nextIndex(it.m_obj->getNumFiles()); - return it.m_obj->getFile(i); - }); + .def("__next__", [](FileIterator & it) { + int i = it.nextIndex(it.m_obj->getNumFiles()); + return it.m_obj->getFile(i); + }); - clsLookIterator - .def("__len__", [](LookIterator & it) { return it.m_obj->getNumLooks(); }) - .def("__getitem__", [](LookIterator & it, int i) - { + clsLookIterator.def("__len__", [](LookIterator & it) { return it.m_obj->getNumLooks(); }) + .def( + "__getitem__", + [](LookIterator & it, int i) { it.checkIndex(i, it.m_obj->getNumLooks()); return it.m_obj->getLook(i); }) .def("__iter__", [](LookIterator & it) -> LookIterator & { return it; }) - .def("__next__", [](LookIterator & it) - { - int i = it.nextIndex(it.m_obj->getNumLooks()); - return it.m_obj->getLook(i); - }); + .def("__next__", [](LookIterator & it) { + int i = it.nextIndex(it.m_obj->getNumLooks()); + return it.m_obj->getLook(i); + }); } } // namespace OCIO_NAMESPACE diff --git a/src/bindings/python/PySystemMonitors.cpp b/src/bindings/python/PySystemMonitors.cpp index 36720b243e..e60c4cba13 100644 --- a/src/bindings/python/PySystemMonitors.cpp +++ b/src/bindings/python/PySystemMonitors.cpp @@ -7,7 +7,7 @@ namespace OCIO_NAMESPACE { -namespace +namespace { enum SystemMonitorsIterator @@ -21,38 +21,28 @@ using MonitorIterator = PyIterator; void bindPySystemMonitors(py::module & m) { - auto clsSystemMonitors = - py::class_( - m.attr("SystemMonitors")); + auto clsSystemMonitors = py::class_(m.attr("SystemMonitors")); - auto clsMonitorIterator = - py::class_( - clsSystemMonitors, "MonitorIterator"); + auto clsMonitorIterator = py::class_(clsSystemMonitors, "MonitorIterator"); clsSystemMonitors - .def(py::init<>(), - DOC(SystemMonitors, SystemMonitors)) + .def(py::init<>(), DOC(SystemMonitors, SystemMonitors)) - .def("getMonitors", [](PySystemMonitors & self) - { - return MonitorIterator(self); - }); + .def("getMonitors", [](PySystemMonitors & self) { return MonitorIterator(self); }); clsMonitorIterator .def("__len__", [](MonitorIterator & it) { return it.m_obj.getNumMonitors(); }) - .def("__getitem__", [](MonitorIterator & it, int i) - { + .def( + "__getitem__", + [](MonitorIterator & it, int i) { // SystemMonitors provides index check with exception. - return py::make_tuple(it.m_obj.getMonitorName(i), - it.m_obj.getProfileFilepath(i)); + return py::make_tuple(it.m_obj.getMonitorName(i), it.m_obj.getProfileFilepath(i)); }) .def("__iter__", [](MonitorIterator & it) -> MonitorIterator & { return it; }) - .def("__next__", [](MonitorIterator & it) - { - const int i = it.nextIndex((int)it.m_obj.getNumMonitors()); - return py::make_tuple(it.m_obj.getMonitorName(i), - it.m_obj.getProfileFilepath(i)); - }); + .def("__next__", [](MonitorIterator & it) { + const int i = it.nextIndex((int)it.m_obj.getNumMonitors()); + return py::make_tuple(it.m_obj.getMonitorName(i), it.m_obj.getProfileFilepath(i)); + }); } } // namespace OCIO_NAMESPACE diff --git a/src/bindings/python/PySystemMonitors.h b/src/bindings/python/PySystemMonitors.h index 5e47a20db9..ef2648852b 100644 --- a/src/bindings/python/PySystemMonitors.h +++ b/src/bindings/python/PySystemMonitors.h @@ -13,13 +13,10 @@ namespace OCIO_NAMESPACE class OCIOHIDDEN PySystemMonitors { public: - PySystemMonitors() = default; + PySystemMonitors() = default; ~PySystemMonitors() = default; - size_t getNumMonitors() const noexcept - { - return SystemMonitors::Get()->getNumMonitors(); - } + size_t getNumMonitors() const noexcept { return SystemMonitors::Get()->getNumMonitors(); } const char * getMonitorName(size_t idx) const { diff --git a/src/bindings/python/PyTransform.cpp b/src/bindings/python/PyTransform.cpp index 997bf984ec..b1bb61b414 100644 --- a/src/bindings/python/PyTransform.cpp +++ b/src/bindings/python/PyTransform.cpp @@ -7,26 +7,29 @@ namespace OCIO_NAMESPACE { void bindPyTransform(py::module & m) -{ +{ // Base class - auto clsTransform = - py::class_( - m.attr("Transform")) - - .def("__deepcopy__", [](const ConstTransformRcPtr & self, py::dict) - { - return self->createEditableCopy(); - }, - "memo"_a) - - .def("validate", &Transform::validate, - DOC(Transform, validate)) - .def("getTransformType", &Transform::getTransformType, - DOC(Transform, getTransformType)) - .def("getDirection", &Transform::getDirection, - DOC(Transform, getDirection)) - .def("setDirection", &Transform::setDirection, "direction"_a, - DOC(Transform, setDirection)); + auto clsTransform + = py::class_(m.attr("Transform")) + + .def( + "__deepcopy__", + [](const ConstTransformRcPtr & self, py::dict) { + return self->createEditableCopy(); + }, + "memo"_a) + + .def("validate", &Transform::validate, DOC(Transform, validate)) + .def( + "getTransformType", + &Transform::getTransformType, + DOC(Transform, getTransformType)) + .def("getDirection", &Transform::getDirection, DOC(Transform, getDirection)) + .def( + "setDirection", + &Transform::setDirection, + "direction"_a, + DOC(Transform, setDirection)); defRepr(clsTransform); diff --git a/src/bindings/python/PyTransform.h b/src/bindings/python/PyTransform.h index 817c3a6b49..704931934c 100644 --- a/src/bindings/python/PyTransform.h +++ b/src/bindings/python/PyTransform.h @@ -11,7 +11,7 @@ namespace OCIO_NAMESPACE { - + // Subclasses void bindPyAllocationTransform(py::module & m); void bindPyBuiltinTransform(py::module & m); diff --git a/src/bindings/python/PyTypes.cpp b/src/bindings/python/PyTypes.cpp index 760d715587..83e17a4752 100644 --- a/src/bindings/python/PyTypes.cpp +++ b/src/bindings/python/PyTypes.cpp @@ -1,12 +1,12 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. -#include "PyOpenColorIO.h" -#include "PyImageDesc.h" -#include "PySystemMonitors.h" #include "PyBuiltinConfigRegistry.h" #include "PyBuiltinTransformRegistry.h" #include "PyDynamicProperty.h" +#include "PyImageDesc.h" +#include "PyOpenColorIO.h" +#include "PySystemMonitors.h" namespace OCIO_NAMESPACE { @@ -14,876 +14,1117 @@ namespace OCIO_NAMESPACE void bindPyTypes(py::module & m) { // OpenColorIO - py::class_( - m, "Baker", - DOC(Baker)); + py::class_(m, "Baker", DOC(Baker)); - py::class_( - m, "BuiltinConfigRegistry", - DOC(BuiltinConfigRegistry)); + py::class_(m, "BuiltinConfigRegistry", DOC(BuiltinConfigRegistry)); - py::class_( - m, "ColorSpace", - DOC(ColorSpace)); + py::class_(m, "ColorSpace", DOC(ColorSpace)); py::class_( - m, "ColorSpaceSet", + m, + "ColorSpaceSet", DOC(ColorSpaceSet)); - py::class_( - m, "Config", - DOC(Config)); + py::class_(m, "Config", DOC(Config)); - py::class_( - m, "Context", - DOC(Context)); + py::class_(m, "Context", DOC(Context)); - py::class_( - m, "CPUProcessor", - DOC(CPUProcessor)); + py::class_(m, "CPUProcessor", DOC(CPUProcessor)); - py::class_( - m, "FileRules", - DOC(FileRules)); + py::class_(m, "FileRules", DOC(FileRules)); - py::class_( - m, "GPUProcessor", - DOC(GPUProcessor)); + py::class_(m, "GPUProcessor", DOC(GPUProcessor)); py::class_( - m, "GpuShaderCreator", + m, + "GpuShaderCreator", DOC(GpuShaderCreator)); py::class_( - m, "GpuShaderDesc", + m, + "GpuShaderDesc", DOC(GpuShaderDesc)); - py::class_( - m, "ImageDesc", - DOC(ImageDesc)); + py::class_(m, "ImageDesc", DOC(ImageDesc)); py::class_( - m, "PackedImageDesc", - DOC(PackedImageDesc)); + m, + "PackedImageDesc", + DOC(PackedImageDesc)); py::class_( - m, "PlanarImageDesc", + m, + "PlanarImageDesc", DOC(PlanarImageDesc)); - py::class_( - m, "Look", - DOC(Look)); + py::class_(m, "Look", DOC(Look)); py::class_( - m, "NamedTransform", + m, + "NamedTransform", DOC(NamedTransform)); - py::class_( - m, "Processor", - DOC(Processor)); + py::class_(m, "Processor", DOC(Processor)); py::class_( - m, "ProcessorMetadata", + m, + "ProcessorMetadata", DOC(ProcessorMetadata)); - py::class_( - m, "SystemMonitors", - DOC(SystemMonitors)); + py::class_(m, "SystemMonitors", DOC(SystemMonitors)); - py::class_( - m, "ViewingRules", - DOC(ViewingRules)); + py::class_(m, "ViewingRules", DOC(ViewingRules)); py::class_( - m, "ViewTransform", + m, + "ViewTransform", DOC(ViewTransform)); // OpenColorIOTransforms py::class_( - m, "BuiltinTransformRegistry", + m, + "BuiltinTransformRegistry", DOC(BuiltinTransformRegistry)); - py::class_( - m, "DynamicProperty", - DOC(DynamicProperty)); + py::class_(m, "DynamicProperty", DOC(DynamicProperty)); - py::class_( - m, "FormatMetadata", - DOC(FormatMetadata)); + py::class_(m, "FormatMetadata", DOC(FormatMetadata)); - py::class_( - m, "GradingRGBM", - DOC(GradingRGBM)); + py::class_(m, "GradingRGBM", DOC(GradingRGBM)); - py::class_( - m, "GradingPrimary", - DOC(GradingPrimary)); + py::class_(m, "GradingPrimary", DOC(GradingPrimary)); - py::class_( - m, "GradingRGBMSW", - DOC(GradingRGBMSW)); + py::class_(m, "GradingRGBMSW", DOC(GradingRGBMSW)); - py::class_( - m, "GradingTone", - DOC(GradingTone)); + py::class_(m, "GradingTone", DOC(GradingTone)); - py::class_( - m, "GradingControlPoint", - DOC(GradingControlPoint)); + py::class_(m, "GradingControlPoint", DOC(GradingControlPoint)); py::class_( - m, "GradingBSplineCurve", + m, + "GradingBSplineCurve", DOC(GradingBSplineCurve)); py::class_( - m, "GradingRGBCurve", + m, + "GradingRGBCurve", DOC(GradingRGBCurve)); - py::class_( - m, "Transform", - DOC(Transform)); + py::class_(m, "Transform", DOC(Transform)); - py::class_( - m, "AllocationTransform", + py::class_( + m, + "AllocationTransform", DOC(AllocationTransform)); py::class_( - m, "BuiltinTransform", + m, + "BuiltinTransform", DOC(BuiltinTransform)); py::class_( - m, "CDLTransform", + m, + "CDLTransform", DOC(CDLTransform)); - py::class_( - m, "ColorSpaceTransform", + py::class_( + m, + "ColorSpaceTransform", DOC(ColorSpaceTransform)); - py::class_( - m, "DisplayViewTransform", + py::class_( + m, + "DisplayViewTransform", DOC(DisplayViewTransform)); py::class_( - m, "ExponentTransform", + m, + "ExponentTransform", DOC(ExponentTransform)); - py::class_( - m, "ExponentWithLinearTransform", - DOC(ExponentWithLinearTransform)); + py::class_< + ExponentWithLinearTransform, + ExponentWithLinearTransformRcPtr /* holder */, + Transform /* base */>(m, "ExponentWithLinearTransform", DOC(ExponentWithLinearTransform)); - py::class_( - m, "ExposureContrastTransform", - DOC(ExposureContrastTransform)); + py::class_< + ExposureContrastTransform, + ExposureContrastTransformRcPtr /* holder */, + Transform /* base */>(m, "ExposureContrastTransform", DOC(ExposureContrastTransform)); py::class_( - m, "FileTransform", + m, + "FileTransform", DOC(FileTransform)); - py::class_( - m, "FixedFunctionTransform", - DOC(FixedFunctionTransform)); - - py::class_( - m, "GradingPrimaryTransform", - DOC(GradingPrimaryTransform)); - - py::class_( - m, "GradingRGBCurveTransform", - DOC(GradingRGBCurveTransform)); - - py::class_( - m, "GradingToneTransform", + py::class_< + FixedFunctionTransform, + FixedFunctionTransformRcPtr /* holder */, + Transform /* base */>(m, "FixedFunctionTransform", DOC(FixedFunctionTransform)); + + py::class_< + GradingPrimaryTransform, + GradingPrimaryTransformRcPtr /* holder */, + Transform /* base */>(m, "GradingPrimaryTransform", DOC(GradingPrimaryTransform)); + + py::class_< + GradingRGBCurveTransform, + GradingRGBCurveTransformRcPtr /* holder */, + Transform /* base */>(m, "GradingRGBCurveTransform", DOC(GradingRGBCurveTransform)); + + py::class_( + m, + "GradingToneTransform", DOC(GradingToneTransform)); py::class_( - m, "GroupTransform", + m, + "GroupTransform", DOC(GroupTransform)); py::class_( - m, "LogAffineTransform", + m, + "LogAffineTransform", DOC(LogAffineTransform)); py::class_( - m, "LogCameraTransform", + m, + "LogCameraTransform", DOC(LogCameraTransform)); py::class_( - m, "LogTransform", + m, + "LogTransform", DOC(LogTransform)); py::class_( - m, "LookTransform", + m, + "LookTransform", DOC(LookTransform)); py::class_( - m, "Lut1DTransform", + m, + "Lut1DTransform", DOC(Lut1DTransform)); py::class_( - m, "Lut3DTransform", + m, + "Lut3DTransform", DOC(Lut3DTransform)); py::class_( - m, "MatrixTransform", + m, + "MatrixTransform", DOC(MatrixTransform)); py::class_( - m, "RangeTransform", + m, + "RangeTransform", DOC(RangeTransform)); // OpenColorIOAppHelpers py::class_( - m, "ColorSpaceMenuParameters", + m, + "ColorSpaceMenuParameters", DOC(ColorSpaceMenuParameters)); py::class_( - m, "ColorSpaceMenuHelper", + m, + "ColorSpaceMenuHelper", DOC(ColorSpaceMenuHelper)); py::class_( - m, "LegacyViewingPipeline", + m, + "LegacyViewingPipeline", DOC(LegacyViewingPipeline)); - py::class_( - m, "MixingSlider", - DOC(MixingSlider)); + py::class_(m, "MixingSlider", DOC(MixingSlider)); py::class_( - m, "MixingColorSpaceManager", + m, + "MixingColorSpaceManager", DOC(MixingColorSpaceManager)); // Enums - py::enum_( - m, "LoggingLevel", py::arithmetic(), - DOC(PyOpenColorIO, LoggingLevel)) - - .value("LOGGING_LEVEL_NONE", LOGGING_LEVEL_NONE, - DOC(PyOpenColorIO, LoggingLevel, LOGGING_LEVEL_NONE)) - .value("LOGGING_LEVEL_WARNING", LOGGING_LEVEL_WARNING, - DOC(PyOpenColorIO, LoggingLevel, LOGGING_LEVEL_WARNING)) - .value("LOGGING_LEVEL_INFO", LOGGING_LEVEL_INFO, - DOC(PyOpenColorIO, LoggingLevel, LOGGING_LEVEL_INFO)) - .value("LOGGING_LEVEL_DEBUG", LOGGING_LEVEL_DEBUG, - DOC(PyOpenColorIO, LoggingLevel, LOGGING_LEVEL_DEBUG)) - .value("LOGGING_LEVEL_UNKNOWN", LOGGING_LEVEL_UNKNOWN, - DOC(PyOpenColorIO, LoggingLevel, LOGGING_LEVEL_UNKNOWN)) + py::enum_(m, "LoggingLevel", py::arithmetic(), DOC(PyOpenColorIO, LoggingLevel)) + + .value( + "LOGGING_LEVEL_NONE", + LOGGING_LEVEL_NONE, + DOC(PyOpenColorIO, LoggingLevel, LOGGING_LEVEL_NONE)) + .value( + "LOGGING_LEVEL_WARNING", + LOGGING_LEVEL_WARNING, + DOC(PyOpenColorIO, LoggingLevel, LOGGING_LEVEL_WARNING)) + .value( + "LOGGING_LEVEL_INFO", + LOGGING_LEVEL_INFO, + DOC(PyOpenColorIO, LoggingLevel, LOGGING_LEVEL_INFO)) + .value( + "LOGGING_LEVEL_DEBUG", + LOGGING_LEVEL_DEBUG, + DOC(PyOpenColorIO, LoggingLevel, LOGGING_LEVEL_DEBUG)) + .value( + "LOGGING_LEVEL_UNKNOWN", + LOGGING_LEVEL_UNKNOWN, + DOC(PyOpenColorIO, LoggingLevel, LOGGING_LEVEL_UNKNOWN)) .export_values(); - py::enum_( - m, "ReferenceSpaceType", - DOC(PyOpenColorIO, ReferenceSpaceType)) + py::enum_(m, "ReferenceSpaceType", DOC(PyOpenColorIO, ReferenceSpaceType)) - .value("REFERENCE_SPACE_SCENE", REFERENCE_SPACE_SCENE, - DOC(PyOpenColorIO, ReferenceSpaceType, REFERENCE_SPACE_SCENE)) - .value("REFERENCE_SPACE_DISPLAY", REFERENCE_SPACE_DISPLAY, - DOC(PyOpenColorIO, ReferenceSpaceType, REFERENCE_SPACE_DISPLAY)) + .value( + "REFERENCE_SPACE_SCENE", + REFERENCE_SPACE_SCENE, + DOC(PyOpenColorIO, ReferenceSpaceType, REFERENCE_SPACE_SCENE)) + .value( + "REFERENCE_SPACE_DISPLAY", + REFERENCE_SPACE_DISPLAY, + DOC(PyOpenColorIO, ReferenceSpaceType, REFERENCE_SPACE_DISPLAY)) .export_values(); py::enum_( - m, "SearchReferenceSpaceType", + m, + "SearchReferenceSpaceType", DOC(PyOpenColorIO, SearchReferenceSpaceType)) - .value("SEARCH_REFERENCE_SPACE_SCENE", SEARCH_REFERENCE_SPACE_SCENE, - DOC(PyOpenColorIO, SearchReferenceSpaceType, SEARCH_REFERENCE_SPACE_SCENE)) - .value("SEARCH_REFERENCE_SPACE_DISPLAY", SEARCH_REFERENCE_SPACE_DISPLAY, - DOC(PyOpenColorIO, SearchReferenceSpaceType, SEARCH_REFERENCE_SPACE_DISPLAY)) - .value("SEARCH_REFERENCE_SPACE_ALL", SEARCH_REFERENCE_SPACE_ALL, - DOC(PyOpenColorIO, SearchReferenceSpaceType, SEARCH_REFERENCE_SPACE_ALL)) + .value( + "SEARCH_REFERENCE_SPACE_SCENE", + SEARCH_REFERENCE_SPACE_SCENE, + DOC(PyOpenColorIO, SearchReferenceSpaceType, SEARCH_REFERENCE_SPACE_SCENE)) + .value( + "SEARCH_REFERENCE_SPACE_DISPLAY", + SEARCH_REFERENCE_SPACE_DISPLAY, + DOC(PyOpenColorIO, SearchReferenceSpaceType, SEARCH_REFERENCE_SPACE_DISPLAY)) + .value( + "SEARCH_REFERENCE_SPACE_ALL", + SEARCH_REFERENCE_SPACE_ALL, + DOC(PyOpenColorIO, SearchReferenceSpaceType, SEARCH_REFERENCE_SPACE_ALL)) .export_values(); py::enum_( - m, "NamedTransformVisibility", + m, + "NamedTransformVisibility", DOC(PyOpenColorIO, NamedTransformVisibility)) - .value("NAMEDTRANSFORM_ACTIVE", NAMEDTRANSFORM_ACTIVE, - DOC(PyOpenColorIO, NamedTransformVisibility, NAMEDTRANSFORM_ACTIVE)) - .value("NAMEDTRANSFORM_INACTIVE", NAMEDTRANSFORM_INACTIVE, - DOC(PyOpenColorIO, NamedTransformVisibility, NAMEDTRANSFORM_INACTIVE)) - .value("NAMEDTRANSFORM_ALL", NAMEDTRANSFORM_ALL, - DOC(PyOpenColorIO, NamedTransformVisibility, NAMEDTRANSFORM_ALL)) + .value( + "NAMEDTRANSFORM_ACTIVE", + NAMEDTRANSFORM_ACTIVE, + DOC(PyOpenColorIO, NamedTransformVisibility, NAMEDTRANSFORM_ACTIVE)) + .value( + "NAMEDTRANSFORM_INACTIVE", + NAMEDTRANSFORM_INACTIVE, + DOC(PyOpenColorIO, NamedTransformVisibility, NAMEDTRANSFORM_INACTIVE)) + .value( + "NAMEDTRANSFORM_ALL", + NAMEDTRANSFORM_ALL, + DOC(PyOpenColorIO, NamedTransformVisibility, NAMEDTRANSFORM_ALL)) .export_values(); py::enum_( - m, "ColorSpaceVisibility", + m, + "ColorSpaceVisibility", DOC(PyOpenColorIO, ColorSpaceVisibility)) - .value("COLORSPACE_ACTIVE", COLORSPACE_ACTIVE, - DOC(PyOpenColorIO, ColorSpaceVisibility, COLORSPACE_ACTIVE)) - .value("COLORSPACE_INACTIVE", COLORSPACE_INACTIVE, - DOC(PyOpenColorIO, ColorSpaceVisibility, COLORSPACE_INACTIVE)) - .value("COLORSPACE_ALL", COLORSPACE_ALL, - DOC(PyOpenColorIO, ColorSpaceVisibility, COLORSPACE_ALL)) + .value( + "COLORSPACE_ACTIVE", + COLORSPACE_ACTIVE, + DOC(PyOpenColorIO, ColorSpaceVisibility, COLORSPACE_ACTIVE)) + .value( + "COLORSPACE_INACTIVE", + COLORSPACE_INACTIVE, + DOC(PyOpenColorIO, ColorSpaceVisibility, COLORSPACE_INACTIVE)) + .value( + "COLORSPACE_ALL", + COLORSPACE_ALL, + DOC(PyOpenColorIO, ColorSpaceVisibility, COLORSPACE_ALL)) .export_values(); - py::enum_( - m, "ViewType", - DOC(PyOpenColorIO, ViewType)) + py::enum_(m, "ViewType", DOC(PyOpenColorIO, ViewType)) - .value("VIEW_SHARED", VIEW_SHARED, - DOC(PyOpenColorIO, ViewType, VIEW_SHARED)) - .value("VIEW_DISPLAY_DEFINED", VIEW_DISPLAY_DEFINED, - DOC(PyOpenColorIO, ViewType, VIEW_DISPLAY_DEFINED)) + .value("VIEW_SHARED", VIEW_SHARED, DOC(PyOpenColorIO, ViewType, VIEW_SHARED)) + .value( + "VIEW_DISPLAY_DEFINED", + VIEW_DISPLAY_DEFINED, + DOC(PyOpenColorIO, ViewType, VIEW_DISPLAY_DEFINED)) .export_values(); py::enum_( - m, "ColorSpaceDirection", + m, + "ColorSpaceDirection", DOC(PyOpenColorIO, ColorSpaceDirection)) - .value("COLORSPACE_DIR_TO_REFERENCE", COLORSPACE_DIR_TO_REFERENCE, - DOC(PyOpenColorIO, ColorSpaceDirection, COLORSPACE_DIR_TO_REFERENCE)) - .value("COLORSPACE_DIR_FROM_REFERENCE", COLORSPACE_DIR_FROM_REFERENCE, - DOC(PyOpenColorIO, ColorSpaceDirection, COLORSPACE_DIR_FROM_REFERENCE)) + .value( + "COLORSPACE_DIR_TO_REFERENCE", + COLORSPACE_DIR_TO_REFERENCE, + DOC(PyOpenColorIO, ColorSpaceDirection, COLORSPACE_DIR_TO_REFERENCE)) + .value( + "COLORSPACE_DIR_FROM_REFERENCE", + COLORSPACE_DIR_FROM_REFERENCE, + DOC(PyOpenColorIO, ColorSpaceDirection, COLORSPACE_DIR_FROM_REFERENCE)) .export_values(); py::enum_( - m, "ViewTransformDirection", + m, + "ViewTransformDirection", DOC(PyOpenColorIO, ViewTransformDirection)) - .value("VIEWTRANSFORM_DIR_TO_REFERENCE", VIEWTRANSFORM_DIR_TO_REFERENCE, - DOC(PyOpenColorIO, ViewTransformDirection, VIEWTRANSFORM_DIR_TO_REFERENCE)) - .value("VIEWTRANSFORM_DIR_FROM_REFERENCE", VIEWTRANSFORM_DIR_FROM_REFERENCE, - DOC(PyOpenColorIO, ViewTransformDirection, VIEWTRANSFORM_DIR_FROM_REFERENCE)) + .value( + "VIEWTRANSFORM_DIR_TO_REFERENCE", + VIEWTRANSFORM_DIR_TO_REFERENCE, + DOC(PyOpenColorIO, ViewTransformDirection, VIEWTRANSFORM_DIR_TO_REFERENCE)) + .value( + "VIEWTRANSFORM_DIR_FROM_REFERENCE", + VIEWTRANSFORM_DIR_FROM_REFERENCE, + DOC(PyOpenColorIO, ViewTransformDirection, VIEWTRANSFORM_DIR_FROM_REFERENCE)) .export_values(); - py::enum_( - m, "TransformDirection", - DOC(PyOpenColorIO, TransformDirection)) + py::enum_(m, "TransformDirection", DOC(PyOpenColorIO, TransformDirection)) - .value("TRANSFORM_DIR_FORWARD", TRANSFORM_DIR_FORWARD, - DOC(PyOpenColorIO, TransformDirection, TRANSFORM_DIR_FORWARD)) - .value("TRANSFORM_DIR_INVERSE", TRANSFORM_DIR_INVERSE, - DOC(PyOpenColorIO, TransformDirection, TRANSFORM_DIR_INVERSE)) + .value( + "TRANSFORM_DIR_FORWARD", + TRANSFORM_DIR_FORWARD, + DOC(PyOpenColorIO, TransformDirection, TRANSFORM_DIR_FORWARD)) + .value( + "TRANSFORM_DIR_INVERSE", + TRANSFORM_DIR_INVERSE, + DOC(PyOpenColorIO, TransformDirection, TRANSFORM_DIR_INVERSE)) .export_values(); - py::enum_( - m, "TransformType", - DOC(PyOpenColorIO, TransformType)) - - .value("TRANSFORM_TYPE_ALLOCATION", TRANSFORM_TYPE_ALLOCATION, - DOC(PyOpenColorIO, TransformType, TRANSFORM_TYPE_ALLOCATION)) - .value("TRANSFORM_TYPE_BUILTIN", TRANSFORM_TYPE_BUILTIN, - DOC(PyOpenColorIO, TransformType, TRANSFORM_TYPE_BUILTIN)) - .value("TRANSFORM_TYPE_CDL", TRANSFORM_TYPE_CDL, - DOC(PyOpenColorIO, TransformType, TRANSFORM_TYPE_CDL)) - .value("TRANSFORM_TYPE_COLORSPACE", TRANSFORM_TYPE_COLORSPACE, - DOC(PyOpenColorIO, TransformType, TRANSFORM_TYPE_COLORSPACE)) - .value("TRANSFORM_TYPE_DISPLAY_VIEW", TRANSFORM_TYPE_DISPLAY_VIEW, - DOC(PyOpenColorIO, TransformType, TRANSFORM_TYPE_DISPLAY_VIEW)) - .value("TRANSFORM_TYPE_EXPONENT", TRANSFORM_TYPE_EXPONENT, - DOC(PyOpenColorIO, TransformType, TRANSFORM_TYPE_EXPONENT)) - .value("TRANSFORM_TYPE_EXPONENT_WITH_LINEAR", TRANSFORM_TYPE_EXPONENT_WITH_LINEAR, - DOC(PyOpenColorIO, TransformType, TRANSFORM_TYPE_EXPONENT_WITH_LINEAR)) - .value("TRANSFORM_TYPE_EXPOSURE_CONTRAST", TRANSFORM_TYPE_EXPOSURE_CONTRAST, - DOC(PyOpenColorIO, TransformType, TRANSFORM_TYPE_EXPOSURE_CONTRAST)) - .value("TRANSFORM_TYPE_FILE", TRANSFORM_TYPE_FILE, - DOC(PyOpenColorIO, TransformType, TRANSFORM_TYPE_FILE)) - .value("TRANSFORM_TYPE_FIXED_FUNCTION", TRANSFORM_TYPE_FIXED_FUNCTION, - DOC(PyOpenColorIO, TransformType, TRANSFORM_TYPE_FIXED_FUNCTION)) - .value("TRANSFORM_TYPE_GRADING_PRIMARY", TRANSFORM_TYPE_GRADING_PRIMARY, - DOC(PyOpenColorIO, TransformType, TRANSFORM_TYPE_GRADING_PRIMARY)) - .value("TRANSFORM_TYPE_GRADING_RGB_CURVE", TRANSFORM_TYPE_GRADING_RGB_CURVE, - DOC(PyOpenColorIO, TransformType, TRANSFORM_TYPE_GRADING_RGB_CURVE)) - .value("TRANSFORM_TYPE_GRADING_TONE", TRANSFORM_TYPE_GRADING_TONE, - DOC(PyOpenColorIO, TransformType, TRANSFORM_TYPE_GRADING_TONE)) - .value("TRANSFORM_TYPE_GROUP", TRANSFORM_TYPE_GROUP, - DOC(PyOpenColorIO, TransformType, TRANSFORM_TYPE_GROUP)) - .value("TRANSFORM_TYPE_LOG_AFFINE", TRANSFORM_TYPE_LOG_AFFINE, - DOC(PyOpenColorIO, TransformType, TRANSFORM_TYPE_LOG_AFFINE)) - .value("TRANSFORM_TYPE_LOG_CAMERA", TRANSFORM_TYPE_LOG_CAMERA, - DOC(PyOpenColorIO, TransformType, TRANSFORM_TYPE_LOG_CAMERA)) - .value("TRANSFORM_TYPE_LOG", TRANSFORM_TYPE_LOG, - DOC(PyOpenColorIO, TransformType, TRANSFORM_TYPE_LOG)) - .value("TRANSFORM_TYPE_LOOK", TRANSFORM_TYPE_LOOK, - DOC(PyOpenColorIO, TransformType, TRANSFORM_TYPE_LOOK)) - .value("TRANSFORM_TYPE_LUT1D", TRANSFORM_TYPE_LUT1D, - DOC(PyOpenColorIO, TransformType, TRANSFORM_TYPE_LUT1D)) - .value("TRANSFORM_TYPE_LUT3D", TRANSFORM_TYPE_LUT3D, - DOC(PyOpenColorIO, TransformType, TRANSFORM_TYPE_LUT3D)) - .value("TRANSFORM_TYPE_MATRIX", TRANSFORM_TYPE_MATRIX, - DOC(PyOpenColorIO, TransformType, TRANSFORM_TYPE_MATRIX)) - .value("TRANSFORM_TYPE_RANGE", TRANSFORM_TYPE_RANGE, - DOC(PyOpenColorIO, TransformType, TRANSFORM_TYPE_RANGE)) + py::enum_(m, "TransformType", DOC(PyOpenColorIO, TransformType)) + + .value( + "TRANSFORM_TYPE_ALLOCATION", + TRANSFORM_TYPE_ALLOCATION, + DOC(PyOpenColorIO, TransformType, TRANSFORM_TYPE_ALLOCATION)) + .value( + "TRANSFORM_TYPE_BUILTIN", + TRANSFORM_TYPE_BUILTIN, + DOC(PyOpenColorIO, TransformType, TRANSFORM_TYPE_BUILTIN)) + .value( + "TRANSFORM_TYPE_CDL", + TRANSFORM_TYPE_CDL, + DOC(PyOpenColorIO, TransformType, TRANSFORM_TYPE_CDL)) + .value( + "TRANSFORM_TYPE_COLORSPACE", + TRANSFORM_TYPE_COLORSPACE, + DOC(PyOpenColorIO, TransformType, TRANSFORM_TYPE_COLORSPACE)) + .value( + "TRANSFORM_TYPE_DISPLAY_VIEW", + TRANSFORM_TYPE_DISPLAY_VIEW, + DOC(PyOpenColorIO, TransformType, TRANSFORM_TYPE_DISPLAY_VIEW)) + .value( + "TRANSFORM_TYPE_EXPONENT", + TRANSFORM_TYPE_EXPONENT, + DOC(PyOpenColorIO, TransformType, TRANSFORM_TYPE_EXPONENT)) + .value( + "TRANSFORM_TYPE_EXPONENT_WITH_LINEAR", + TRANSFORM_TYPE_EXPONENT_WITH_LINEAR, + DOC(PyOpenColorIO, TransformType, TRANSFORM_TYPE_EXPONENT_WITH_LINEAR)) + .value( + "TRANSFORM_TYPE_EXPOSURE_CONTRAST", + TRANSFORM_TYPE_EXPOSURE_CONTRAST, + DOC(PyOpenColorIO, TransformType, TRANSFORM_TYPE_EXPOSURE_CONTRAST)) + .value( + "TRANSFORM_TYPE_FILE", + TRANSFORM_TYPE_FILE, + DOC(PyOpenColorIO, TransformType, TRANSFORM_TYPE_FILE)) + .value( + "TRANSFORM_TYPE_FIXED_FUNCTION", + TRANSFORM_TYPE_FIXED_FUNCTION, + DOC(PyOpenColorIO, TransformType, TRANSFORM_TYPE_FIXED_FUNCTION)) + .value( + "TRANSFORM_TYPE_GRADING_PRIMARY", + TRANSFORM_TYPE_GRADING_PRIMARY, + DOC(PyOpenColorIO, TransformType, TRANSFORM_TYPE_GRADING_PRIMARY)) + .value( + "TRANSFORM_TYPE_GRADING_RGB_CURVE", + TRANSFORM_TYPE_GRADING_RGB_CURVE, + DOC(PyOpenColorIO, TransformType, TRANSFORM_TYPE_GRADING_RGB_CURVE)) + .value( + "TRANSFORM_TYPE_GRADING_TONE", + TRANSFORM_TYPE_GRADING_TONE, + DOC(PyOpenColorIO, TransformType, TRANSFORM_TYPE_GRADING_TONE)) + .value( + "TRANSFORM_TYPE_GROUP", + TRANSFORM_TYPE_GROUP, + DOC(PyOpenColorIO, TransformType, TRANSFORM_TYPE_GROUP)) + .value( + "TRANSFORM_TYPE_LOG_AFFINE", + TRANSFORM_TYPE_LOG_AFFINE, + DOC(PyOpenColorIO, TransformType, TRANSFORM_TYPE_LOG_AFFINE)) + .value( + "TRANSFORM_TYPE_LOG_CAMERA", + TRANSFORM_TYPE_LOG_CAMERA, + DOC(PyOpenColorIO, TransformType, TRANSFORM_TYPE_LOG_CAMERA)) + .value( + "TRANSFORM_TYPE_LOG", + TRANSFORM_TYPE_LOG, + DOC(PyOpenColorIO, TransformType, TRANSFORM_TYPE_LOG)) + .value( + "TRANSFORM_TYPE_LOOK", + TRANSFORM_TYPE_LOOK, + DOC(PyOpenColorIO, TransformType, TRANSFORM_TYPE_LOOK)) + .value( + "TRANSFORM_TYPE_LUT1D", + TRANSFORM_TYPE_LUT1D, + DOC(PyOpenColorIO, TransformType, TRANSFORM_TYPE_LUT1D)) + .value( + "TRANSFORM_TYPE_LUT3D", + TRANSFORM_TYPE_LUT3D, + DOC(PyOpenColorIO, TransformType, TRANSFORM_TYPE_LUT3D)) + .value( + "TRANSFORM_TYPE_MATRIX", + TRANSFORM_TYPE_MATRIX, + DOC(PyOpenColorIO, TransformType, TRANSFORM_TYPE_MATRIX)) + .value( + "TRANSFORM_TYPE_RANGE", + TRANSFORM_TYPE_RANGE, + DOC(PyOpenColorIO, TransformType, TRANSFORM_TYPE_RANGE)) .export_values(); - py::enum_( - m, "Interpolation", - DOC(PyOpenColorIO, Interpolation)) - - .value("INTERP_UNKNOWN", INTERP_UNKNOWN, - DOC(PyOpenColorIO, Interpolation, INTERP_UNKNOWN)) - .value("INTERP_NEAREST", INTERP_NEAREST, - DOC(PyOpenColorIO, Interpolation, INTERP_NEAREST)) - .value("INTERP_LINEAR", INTERP_LINEAR, - DOC(PyOpenColorIO, Interpolation, INTERP_LINEAR)) - .value("INTERP_TETRAHEDRAL", INTERP_TETRAHEDRAL, - DOC(PyOpenColorIO, Interpolation, INTERP_TETRAHEDRAL)) - .value("INTERP_CUBIC", INTERP_CUBIC, - DOC(PyOpenColorIO, Interpolation, INTERP_CUBIC)) - .value("INTERP_DEFAULT", INTERP_DEFAULT, - DOC(PyOpenColorIO, Interpolation, INTERP_DEFAULT)) - .value("INTERP_BEST", INTERP_BEST, - DOC(PyOpenColorIO, Interpolation, INTERP_BEST)) + py::enum_(m, "Interpolation", DOC(PyOpenColorIO, Interpolation)) + + .value("INTERP_UNKNOWN", INTERP_UNKNOWN, DOC(PyOpenColorIO, Interpolation, INTERP_UNKNOWN)) + .value("INTERP_NEAREST", INTERP_NEAREST, DOC(PyOpenColorIO, Interpolation, INTERP_NEAREST)) + .value("INTERP_LINEAR", INTERP_LINEAR, DOC(PyOpenColorIO, Interpolation, INTERP_LINEAR)) + .value( + "INTERP_TETRAHEDRAL", + INTERP_TETRAHEDRAL, + DOC(PyOpenColorIO, Interpolation, INTERP_TETRAHEDRAL)) + .value("INTERP_CUBIC", INTERP_CUBIC, DOC(PyOpenColorIO, Interpolation, INTERP_CUBIC)) + .value("INTERP_DEFAULT", INTERP_DEFAULT, DOC(PyOpenColorIO, Interpolation, INTERP_DEFAULT)) + .value("INTERP_BEST", INTERP_BEST, DOC(PyOpenColorIO, Interpolation, INTERP_BEST)) .export_values(); - py::enum_( - m, "BitDepth", py::arithmetic(), - DOC(PyOpenColorIO, BitDepth)) - - .value("BIT_DEPTH_UNKNOWN", BIT_DEPTH_UNKNOWN, - DOC(PyOpenColorIO, BitDepth, BIT_DEPTH_UNKNOWN)) - .value("BIT_DEPTH_UINT8", BIT_DEPTH_UINT8, - DOC(PyOpenColorIO, BitDepth, BIT_DEPTH_UINT8)) - .value("BIT_DEPTH_UINT10", BIT_DEPTH_UINT10, - DOC(PyOpenColorIO, BitDepth, BIT_DEPTH_UINT10)) - .value("BIT_DEPTH_UINT12", BIT_DEPTH_UINT12, - DOC(PyOpenColorIO, BitDepth, BIT_DEPTH_UINT12)) - .value("BIT_DEPTH_UINT14", BIT_DEPTH_UINT14, - DOC(PyOpenColorIO, BitDepth, BIT_DEPTH_UINT14)) - .value("BIT_DEPTH_UINT16", BIT_DEPTH_UINT16, - DOC(PyOpenColorIO, BitDepth, BIT_DEPTH_UINT16)) - .value("BIT_DEPTH_UINT32", BIT_DEPTH_UINT32, - DOC(PyOpenColorIO, BitDepth, BIT_DEPTH_UINT32)) - .value("BIT_DEPTH_F16", BIT_DEPTH_F16, - DOC(PyOpenColorIO, BitDepth, BIT_DEPTH_F16)) - .value("BIT_DEPTH_F32", BIT_DEPTH_F32, - DOC(PyOpenColorIO, BitDepth, BIT_DEPTH_F32)) + py::enum_(m, "BitDepth", py::arithmetic(), DOC(PyOpenColorIO, BitDepth)) + + .value( + "BIT_DEPTH_UNKNOWN", + BIT_DEPTH_UNKNOWN, + DOC(PyOpenColorIO, BitDepth, BIT_DEPTH_UNKNOWN)) + .value("BIT_DEPTH_UINT8", BIT_DEPTH_UINT8, DOC(PyOpenColorIO, BitDepth, BIT_DEPTH_UINT8)) + .value("BIT_DEPTH_UINT10", BIT_DEPTH_UINT10, DOC(PyOpenColorIO, BitDepth, BIT_DEPTH_UINT10)) + .value("BIT_DEPTH_UINT12", BIT_DEPTH_UINT12, DOC(PyOpenColorIO, BitDepth, BIT_DEPTH_UINT12)) + .value("BIT_DEPTH_UINT14", BIT_DEPTH_UINT14, DOC(PyOpenColorIO, BitDepth, BIT_DEPTH_UINT14)) + .value("BIT_DEPTH_UINT16", BIT_DEPTH_UINT16, DOC(PyOpenColorIO, BitDepth, BIT_DEPTH_UINT16)) + .value("BIT_DEPTH_UINT32", BIT_DEPTH_UINT32, DOC(PyOpenColorIO, BitDepth, BIT_DEPTH_UINT32)) + .value("BIT_DEPTH_F16", BIT_DEPTH_F16, DOC(PyOpenColorIO, BitDepth, BIT_DEPTH_F16)) + .value("BIT_DEPTH_F32", BIT_DEPTH_F32, DOC(PyOpenColorIO, BitDepth, BIT_DEPTH_F32)) .export_values(); - py::enum_( - m, "Lut1DHueAdjust", - DOC(PyOpenColorIO, Lut1DHueAdjust)) + py::enum_(m, "Lut1DHueAdjust", DOC(PyOpenColorIO, Lut1DHueAdjust)) - .value("HUE_NONE", HUE_NONE, - DOC(PyOpenColorIO, Lut1DHueAdjust, HUE_NONE)) - .value("HUE_DW3", HUE_DW3, - DOC(PyOpenColorIO, Lut1DHueAdjust, HUE_DW3)) - .value("HUE_WYPN", HUE_WYPN, - DOC(PyOpenColorIO, Lut1DHueAdjust, HUE_WYPN)) + .value("HUE_NONE", HUE_NONE, DOC(PyOpenColorIO, Lut1DHueAdjust, HUE_NONE)) + .value("HUE_DW3", HUE_DW3, DOC(PyOpenColorIO, Lut1DHueAdjust, HUE_DW3)) + .value("HUE_WYPN", HUE_WYPN, DOC(PyOpenColorIO, Lut1DHueAdjust, HUE_WYPN)) .export_values(); - py::enum_( - m, "ChannelOrdering", - DOC(PyOpenColorIO, ChannelOrdering)) - - .value("CHANNEL_ORDERING_RGBA", CHANNEL_ORDERING_RGBA, - DOC(PyOpenColorIO, ChannelOrdering, CHANNEL_ORDERING_RGBA)) - .value("CHANNEL_ORDERING_BGRA", CHANNEL_ORDERING_BGRA, - DOC(PyOpenColorIO, ChannelOrdering, CHANNEL_ORDERING_BGRA)) - .value("CHANNEL_ORDERING_ABGR", CHANNEL_ORDERING_ABGR, - DOC(PyOpenColorIO, ChannelOrdering, CHANNEL_ORDERING_ABGR)) - .value("CHANNEL_ORDERING_RGB", CHANNEL_ORDERING_RGB, - DOC(PyOpenColorIO, ChannelOrdering, CHANNEL_ORDERING_RGB)) - .value("CHANNEL_ORDERING_BGR", CHANNEL_ORDERING_BGR, - DOC(PyOpenColorIO, ChannelOrdering, CHANNEL_ORDERING_BGR)) + py::enum_(m, "ChannelOrdering", DOC(PyOpenColorIO, ChannelOrdering)) + + .value( + "CHANNEL_ORDERING_RGBA", + CHANNEL_ORDERING_RGBA, + DOC(PyOpenColorIO, ChannelOrdering, CHANNEL_ORDERING_RGBA)) + .value( + "CHANNEL_ORDERING_BGRA", + CHANNEL_ORDERING_BGRA, + DOC(PyOpenColorIO, ChannelOrdering, CHANNEL_ORDERING_BGRA)) + .value( + "CHANNEL_ORDERING_ABGR", + CHANNEL_ORDERING_ABGR, + DOC(PyOpenColorIO, ChannelOrdering, CHANNEL_ORDERING_ABGR)) + .value( + "CHANNEL_ORDERING_RGB", + CHANNEL_ORDERING_RGB, + DOC(PyOpenColorIO, ChannelOrdering, CHANNEL_ORDERING_RGB)) + .value( + "CHANNEL_ORDERING_BGR", + CHANNEL_ORDERING_BGR, + DOC(PyOpenColorIO, ChannelOrdering, CHANNEL_ORDERING_BGR)) .export_values(); - py::enum_( - m, "Allocation", - DOC(PyOpenColorIO, Allocation)) - - .value("ALLOCATION_UNKNOWN", ALLOCATION_UNKNOWN, - DOC(PyOpenColorIO, Allocation, ALLOCATION_UNKNOWN)) - .value("ALLOCATION_UNIFORM", ALLOCATION_UNIFORM, - DOC(PyOpenColorIO, Allocation, ALLOCATION_UNIFORM)) - .value("ALLOCATION_LG2", ALLOCATION_LG2, - DOC(PyOpenColorIO, Allocation, ALLOCATION_LG2)) + py::enum_(m, "Allocation", DOC(PyOpenColorIO, Allocation)) + + .value( + "ALLOCATION_UNKNOWN", + ALLOCATION_UNKNOWN, + DOC(PyOpenColorIO, Allocation, ALLOCATION_UNKNOWN)) + .value( + "ALLOCATION_UNIFORM", + ALLOCATION_UNIFORM, + DOC(PyOpenColorIO, Allocation, ALLOCATION_UNIFORM)) + .value("ALLOCATION_LG2", ALLOCATION_LG2, DOC(PyOpenColorIO, Allocation, ALLOCATION_LG2)) .export_values(); - py::enum_( - m, "GpuLanguage", - DOC(PyOpenColorIO, GpuLanguage)) - - .value("GPU_LANGUAGE_CG", GPU_LANGUAGE_CG, - DOC(PyOpenColorIO, GpuLanguage, GPU_LANGUAGE_CG)) - .value("GPU_LANGUAGE_GLSL_1_2", GPU_LANGUAGE_GLSL_1_2, - DOC(PyOpenColorIO, GpuLanguage, GPU_LANGUAGE_GLSL_1_2)) - .value("GPU_LANGUAGE_GLSL_1_3", GPU_LANGUAGE_GLSL_1_3, - DOC(PyOpenColorIO, GpuLanguage, GPU_LANGUAGE_GLSL_1_3)) - .value("GPU_LANGUAGE_GLSL_4_0", GPU_LANGUAGE_GLSL_4_0, - DOC(PyOpenColorIO, GpuLanguage, GPU_LANGUAGE_GLSL_4_0)) - .value("GPU_LANGUAGE_GLSL_ES_1_0", GPU_LANGUAGE_GLSL_ES_1_0, - DOC(PyOpenColorIO, GpuLanguage, GPU_LANGUAGE_GLSL_ES_1_0)) - .value("GPU_LANGUAGE_GLSL_ES_3_0", GPU_LANGUAGE_GLSL_ES_3_0, - DOC(PyOpenColorIO, GpuLanguage, GPU_LANGUAGE_GLSL_ES_3_0)) - .value("GPU_LANGUAGE_HLSL_DX11", GPU_LANGUAGE_HLSL_DX11, - DOC(PyOpenColorIO, GpuLanguage, GPU_LANGUAGE_HLSL_DX11)) - .value("GPU_LANGUAGE_MSL_2_0", GPU_LANGUAGE_MSL_2_0, - DOC(PyOpenColorIO, GpuLanguage, GPU_LANGUAGE_MSL_2_0)) - .value("LANGUAGE_OSL_1", LANGUAGE_OSL_1, - DOC(PyOpenColorIO, GpuLanguage, LANGUAGE_OSL_1)) + py::enum_(m, "GpuLanguage", DOC(PyOpenColorIO, GpuLanguage)) + + .value("GPU_LANGUAGE_CG", GPU_LANGUAGE_CG, DOC(PyOpenColorIO, GpuLanguage, GPU_LANGUAGE_CG)) + .value( + "GPU_LANGUAGE_GLSL_1_2", + GPU_LANGUAGE_GLSL_1_2, + DOC(PyOpenColorIO, GpuLanguage, GPU_LANGUAGE_GLSL_1_2)) + .value( + "GPU_LANGUAGE_GLSL_1_3", + GPU_LANGUAGE_GLSL_1_3, + DOC(PyOpenColorIO, GpuLanguage, GPU_LANGUAGE_GLSL_1_3)) + .value( + "GPU_LANGUAGE_GLSL_4_0", + GPU_LANGUAGE_GLSL_4_0, + DOC(PyOpenColorIO, GpuLanguage, GPU_LANGUAGE_GLSL_4_0)) + .value( + "GPU_LANGUAGE_GLSL_ES_1_0", + GPU_LANGUAGE_GLSL_ES_1_0, + DOC(PyOpenColorIO, GpuLanguage, GPU_LANGUAGE_GLSL_ES_1_0)) + .value( + "GPU_LANGUAGE_GLSL_ES_3_0", + GPU_LANGUAGE_GLSL_ES_3_0, + DOC(PyOpenColorIO, GpuLanguage, GPU_LANGUAGE_GLSL_ES_3_0)) + .value( + "GPU_LANGUAGE_HLSL_DX11", + GPU_LANGUAGE_HLSL_DX11, + DOC(PyOpenColorIO, GpuLanguage, GPU_LANGUAGE_HLSL_DX11)) + .value( + "GPU_LANGUAGE_MSL_2_0", + GPU_LANGUAGE_MSL_2_0, + DOC(PyOpenColorIO, GpuLanguage, GPU_LANGUAGE_MSL_2_0)) + .value("LANGUAGE_OSL_1", LANGUAGE_OSL_1, DOC(PyOpenColorIO, GpuLanguage, LANGUAGE_OSL_1)) .export_values(); - py::enum_( - m, "EnvironmentMode", - DOC(PyOpenColorIO, EnvironmentMode)) - - .value("ENV_ENVIRONMENT_UNKNOWN", ENV_ENVIRONMENT_UNKNOWN, - DOC(PyOpenColorIO, EnvironmentMode, ENV_ENVIRONMENT_UNKNOWN)) - .value("ENV_ENVIRONMENT_LOAD_PREDEFINED", ENV_ENVIRONMENT_LOAD_PREDEFINED, - DOC(PyOpenColorIO, EnvironmentMode, ENV_ENVIRONMENT_LOAD_PREDEFINED)) - .value("ENV_ENVIRONMENT_LOAD_ALL", ENV_ENVIRONMENT_LOAD_ALL, - DOC(PyOpenColorIO, EnvironmentMode, ENV_ENVIRONMENT_LOAD_ALL)) + py::enum_(m, "EnvironmentMode", DOC(PyOpenColorIO, EnvironmentMode)) + + .value( + "ENV_ENVIRONMENT_UNKNOWN", + ENV_ENVIRONMENT_UNKNOWN, + DOC(PyOpenColorIO, EnvironmentMode, ENV_ENVIRONMENT_UNKNOWN)) + .value( + "ENV_ENVIRONMENT_LOAD_PREDEFINED", + ENV_ENVIRONMENT_LOAD_PREDEFINED, + DOC(PyOpenColorIO, EnvironmentMode, ENV_ENVIRONMENT_LOAD_PREDEFINED)) + .value( + "ENV_ENVIRONMENT_LOAD_ALL", + ENV_ENVIRONMENT_LOAD_ALL, + DOC(PyOpenColorIO, EnvironmentMode, ENV_ENVIRONMENT_LOAD_ALL)) .export_values(); - py::enum_( - m, "RangeStyle", - DOC(PyOpenColorIO, RangeStyle)) + py::enum_(m, "RangeStyle", DOC(PyOpenColorIO, RangeStyle)) - .value("RANGE_NO_CLAMP", RANGE_NO_CLAMP, - DOC(PyOpenColorIO, RangeStyle, RANGE_NO_CLAMP)) - .value("RANGE_CLAMP", RANGE_CLAMP, - DOC(PyOpenColorIO, RangeStyle, RANGE_CLAMP)) + .value("RANGE_NO_CLAMP", RANGE_NO_CLAMP, DOC(PyOpenColorIO, RangeStyle, RANGE_NO_CLAMP)) + .value("RANGE_CLAMP", RANGE_CLAMP, DOC(PyOpenColorIO, RangeStyle, RANGE_CLAMP)) .export_values(); - py::enum_( - m, "FixedFunctionStyle", - DOC(PyOpenColorIO, FixedFunctionStyle)) - - .value("FIXED_FUNCTION_ACES_RED_MOD_03", FIXED_FUNCTION_ACES_RED_MOD_03, - DOC(PyOpenColorIO, FixedFunctionStyle, FIXED_FUNCTION_ACES_RED_MOD_03)) - .value("FIXED_FUNCTION_ACES_RED_MOD_10", FIXED_FUNCTION_ACES_RED_MOD_10, - DOC(PyOpenColorIO, FixedFunctionStyle, FIXED_FUNCTION_ACES_RED_MOD_10)) - .value("FIXED_FUNCTION_ACES_GLOW_03", FIXED_FUNCTION_ACES_GLOW_03, - DOC(PyOpenColorIO, FixedFunctionStyle, FIXED_FUNCTION_ACES_GLOW_03)) - .value("FIXED_FUNCTION_ACES_GLOW_10", FIXED_FUNCTION_ACES_GLOW_10, - DOC(PyOpenColorIO, FixedFunctionStyle, FIXED_FUNCTION_ACES_GLOW_10)) - .value("FIXED_FUNCTION_ACES_DARK_TO_DIM_10", FIXED_FUNCTION_ACES_DARK_TO_DIM_10, - DOC(PyOpenColorIO, FixedFunctionStyle, FIXED_FUNCTION_ACES_DARK_TO_DIM_10)) - .value("FIXED_FUNCTION_REC2100_SURROUND", FIXED_FUNCTION_REC2100_SURROUND, - DOC(PyOpenColorIO, FixedFunctionStyle, FIXED_FUNCTION_REC2100_SURROUND)) - .value("FIXED_FUNCTION_RGB_TO_HSV", FIXED_FUNCTION_RGB_TO_HSV, - DOC(PyOpenColorIO, FixedFunctionStyle, FIXED_FUNCTION_RGB_TO_HSV)) - .value("FIXED_FUNCTION_XYZ_TO_xyY", FIXED_FUNCTION_XYZ_TO_xyY, - DOC(PyOpenColorIO, FixedFunctionStyle, FIXED_FUNCTION_XYZ_TO_xyY)) - .value("FIXED_FUNCTION_XYZ_TO_uvY", FIXED_FUNCTION_XYZ_TO_uvY, - DOC(PyOpenColorIO, FixedFunctionStyle, FIXED_FUNCTION_XYZ_TO_uvY)) - .value("FIXED_FUNCTION_XYZ_TO_LUV", FIXED_FUNCTION_XYZ_TO_LUV, - DOC(PyOpenColorIO, FixedFunctionStyle, FIXED_FUNCTION_XYZ_TO_LUV)) - .value("FIXED_FUNCTION_ACES_GAMUTMAP_02", FIXED_FUNCTION_ACES_GAMUTMAP_02, - DOC(PyOpenColorIO, FixedFunctionStyle, FIXED_FUNCTION_ACES_GAMUTMAP_02)) - .value("FIXED_FUNCTION_ACES_GAMUTMAP_07", FIXED_FUNCTION_ACES_GAMUTMAP_07, - DOC(PyOpenColorIO, FixedFunctionStyle, FIXED_FUNCTION_ACES_GAMUTMAP_07)) - .value("FIXED_FUNCTION_ACES_GAMUT_COMP_13", FIXED_FUNCTION_ACES_GAMUT_COMP_13, - DOC(PyOpenColorIO, FixedFunctionStyle, FIXED_FUNCTION_ACES_GAMUT_COMP_13)) + py::enum_(m, "FixedFunctionStyle", DOC(PyOpenColorIO, FixedFunctionStyle)) + + .value( + "FIXED_FUNCTION_ACES_RED_MOD_03", + FIXED_FUNCTION_ACES_RED_MOD_03, + DOC(PyOpenColorIO, FixedFunctionStyle, FIXED_FUNCTION_ACES_RED_MOD_03)) + .value( + "FIXED_FUNCTION_ACES_RED_MOD_10", + FIXED_FUNCTION_ACES_RED_MOD_10, + DOC(PyOpenColorIO, FixedFunctionStyle, FIXED_FUNCTION_ACES_RED_MOD_10)) + .value( + "FIXED_FUNCTION_ACES_GLOW_03", + FIXED_FUNCTION_ACES_GLOW_03, + DOC(PyOpenColorIO, FixedFunctionStyle, FIXED_FUNCTION_ACES_GLOW_03)) + .value( + "FIXED_FUNCTION_ACES_GLOW_10", + FIXED_FUNCTION_ACES_GLOW_10, + DOC(PyOpenColorIO, FixedFunctionStyle, FIXED_FUNCTION_ACES_GLOW_10)) + .value( + "FIXED_FUNCTION_ACES_DARK_TO_DIM_10", + FIXED_FUNCTION_ACES_DARK_TO_DIM_10, + DOC(PyOpenColorIO, FixedFunctionStyle, FIXED_FUNCTION_ACES_DARK_TO_DIM_10)) + .value( + "FIXED_FUNCTION_REC2100_SURROUND", + FIXED_FUNCTION_REC2100_SURROUND, + DOC(PyOpenColorIO, FixedFunctionStyle, FIXED_FUNCTION_REC2100_SURROUND)) + .value( + "FIXED_FUNCTION_RGB_TO_HSV", + FIXED_FUNCTION_RGB_TO_HSV, + DOC(PyOpenColorIO, FixedFunctionStyle, FIXED_FUNCTION_RGB_TO_HSV)) + .value( + "FIXED_FUNCTION_XYZ_TO_xyY", + FIXED_FUNCTION_XYZ_TO_xyY, + DOC(PyOpenColorIO, FixedFunctionStyle, FIXED_FUNCTION_XYZ_TO_xyY)) + .value( + "FIXED_FUNCTION_XYZ_TO_uvY", + FIXED_FUNCTION_XYZ_TO_uvY, + DOC(PyOpenColorIO, FixedFunctionStyle, FIXED_FUNCTION_XYZ_TO_uvY)) + .value( + "FIXED_FUNCTION_XYZ_TO_LUV", + FIXED_FUNCTION_XYZ_TO_LUV, + DOC(PyOpenColorIO, FixedFunctionStyle, FIXED_FUNCTION_XYZ_TO_LUV)) + .value( + "FIXED_FUNCTION_ACES_GAMUTMAP_02", + FIXED_FUNCTION_ACES_GAMUTMAP_02, + DOC(PyOpenColorIO, FixedFunctionStyle, FIXED_FUNCTION_ACES_GAMUTMAP_02)) + .value( + "FIXED_FUNCTION_ACES_GAMUTMAP_07", + FIXED_FUNCTION_ACES_GAMUTMAP_07, + DOC(PyOpenColorIO, FixedFunctionStyle, FIXED_FUNCTION_ACES_GAMUTMAP_07)) + .value( + "FIXED_FUNCTION_ACES_GAMUT_COMP_13", + FIXED_FUNCTION_ACES_GAMUT_COMP_13, + DOC(PyOpenColorIO, FixedFunctionStyle, FIXED_FUNCTION_ACES_GAMUT_COMP_13)) .export_values(); py::enum_( - m, "ExposureContrastStyle", + m, + "ExposureContrastStyle", DOC(PyOpenColorIO, ExposureContrastStyle)) - .value("EXPOSURE_CONTRAST_LINEAR", EXPOSURE_CONTRAST_LINEAR, - DOC(PyOpenColorIO, ExposureContrastStyle, EXPOSURE_CONTRAST_LINEAR)) - .value("EXPOSURE_CONTRAST_VIDEO", EXPOSURE_CONTRAST_VIDEO, - DOC(PyOpenColorIO, ExposureContrastStyle, EXPOSURE_CONTRAST_VIDEO)) - .value("EXPOSURE_CONTRAST_LOGARITHMIC", EXPOSURE_CONTRAST_LOGARITHMIC, - DOC(PyOpenColorIO, ExposureContrastStyle, EXPOSURE_CONTRAST_LOGARITHMIC)) + .value( + "EXPOSURE_CONTRAST_LINEAR", + EXPOSURE_CONTRAST_LINEAR, + DOC(PyOpenColorIO, ExposureContrastStyle, EXPOSURE_CONTRAST_LINEAR)) + .value( + "EXPOSURE_CONTRAST_VIDEO", + EXPOSURE_CONTRAST_VIDEO, + DOC(PyOpenColorIO, ExposureContrastStyle, EXPOSURE_CONTRAST_VIDEO)) + .value( + "EXPOSURE_CONTRAST_LOGARITHMIC", + EXPOSURE_CONTRAST_LOGARITHMIC, + DOC(PyOpenColorIO, ExposureContrastStyle, EXPOSURE_CONTRAST_LOGARITHMIC)) .export_values(); - py::enum_( - m, "CDLStyle", - DOC(PyOpenColorIO, LoggingLevel)) + py::enum_(m, "CDLStyle", DOC(PyOpenColorIO, LoggingLevel)) - .value("CDL_ASC", CDL_ASC, - DOC(PyOpenColorIO, CDLStyle, CDL_ASC)) - .value("CDL_NO_CLAMP", CDL_NO_CLAMP, - DOC(PyOpenColorIO, CDLStyle, CDL_NO_CLAMP)) - .value("CDL_TRANSFORM_DEFAULT", CDL_TRANSFORM_DEFAULT, - DOC(PyOpenColorIO, CDLStyle, CDL_TRANSFORM_DEFAULT)) + .value("CDL_ASC", CDL_ASC, DOC(PyOpenColorIO, CDLStyle, CDL_ASC)) + .value("CDL_NO_CLAMP", CDL_NO_CLAMP, DOC(PyOpenColorIO, CDLStyle, CDL_NO_CLAMP)) + .value( + "CDL_TRANSFORM_DEFAULT", + CDL_TRANSFORM_DEFAULT, + DOC(PyOpenColorIO, CDLStyle, CDL_TRANSFORM_DEFAULT)) .export_values(); - py::enum_( - m, "NegativeStyle", - DOC(PyOpenColorIO, NegativeStyle)) - - .value("NEGATIVE_CLAMP", NEGATIVE_CLAMP, - DOC(PyOpenColorIO, NegativeStyle, NEGATIVE_CLAMP)) - .value("NEGATIVE_MIRROR", NEGATIVE_MIRROR, - DOC(PyOpenColorIO, NegativeStyle, NEGATIVE_MIRROR)) - .value("NEGATIVE_PASS_THRU", NEGATIVE_PASS_THRU, - DOC(PyOpenColorIO, NegativeStyle, NEGATIVE_PASS_THRU)) - .value("NEGATIVE_LINEAR", NEGATIVE_LINEAR, - DOC(PyOpenColorIO, NegativeStyle, NEGATIVE_LINEAR)) + py::enum_(m, "NegativeStyle", DOC(PyOpenColorIO, NegativeStyle)) + + .value("NEGATIVE_CLAMP", NEGATIVE_CLAMP, DOC(PyOpenColorIO, NegativeStyle, NEGATIVE_CLAMP)) + .value( + "NEGATIVE_MIRROR", + NEGATIVE_MIRROR, + DOC(PyOpenColorIO, NegativeStyle, NEGATIVE_MIRROR)) + .value( + "NEGATIVE_PASS_THRU", + NEGATIVE_PASS_THRU, + DOC(PyOpenColorIO, NegativeStyle, NEGATIVE_PASS_THRU)) + .value( + "NEGATIVE_LINEAR", + NEGATIVE_LINEAR, + DOC(PyOpenColorIO, NegativeStyle, NEGATIVE_LINEAR)) .export_values(); - py::enum_( - m, "GradingStyle", - DOC(PyOpenColorIO, GradingStyle)) + py::enum_(m, "GradingStyle", DOC(PyOpenColorIO, GradingStyle)) - .value("GRADING_LOG", GRADING_LOG, - DOC(PyOpenColorIO, GradingStyle, GRADING_LOG)) - .value("GRADING_LIN", GRADING_LIN, - DOC(PyOpenColorIO, GradingStyle, GRADING_LIN)) - .value("GRADING_VIDEO", GRADING_VIDEO, - DOC(PyOpenColorIO, GradingStyle, GRADING_VIDEO)) + .value("GRADING_LOG", GRADING_LOG, DOC(PyOpenColorIO, GradingStyle, GRADING_LOG)) + .value("GRADING_LIN", GRADING_LIN, DOC(PyOpenColorIO, GradingStyle, GRADING_LIN)) + .value("GRADING_VIDEO", GRADING_VIDEO, DOC(PyOpenColorIO, GradingStyle, GRADING_VIDEO)) .export_values(); py::enum_( - m, "DynamicPropertyType", + m, + "DynamicPropertyType", DOC(PyOpenColorIO, DynamicPropertyType)) - .value("DYNAMIC_PROPERTY_EXPOSURE", DYNAMIC_PROPERTY_EXPOSURE, - DOC(PyOpenColorIO, DynamicPropertyType, DYNAMIC_PROPERTY_EXPOSURE)) - .value("DYNAMIC_PROPERTY_CONTRAST", DYNAMIC_PROPERTY_CONTRAST, - DOC(PyOpenColorIO, DynamicPropertyType, DYNAMIC_PROPERTY_CONTRAST)) - .value("DYNAMIC_PROPERTY_GAMMA", DYNAMIC_PROPERTY_GAMMA, - DOC(PyOpenColorIO, DynamicPropertyType, DYNAMIC_PROPERTY_GAMMA)) - .value("DYNAMIC_PROPERTY_GRADING_PRIMARY", DYNAMIC_PROPERTY_GRADING_PRIMARY, - DOC(PyOpenColorIO, DynamicPropertyType, DYNAMIC_PROPERTY_GRADING_PRIMARY)) - .value("DYNAMIC_PROPERTY_GRADING_RGBCURVE", DYNAMIC_PROPERTY_GRADING_RGBCURVE, - DOC(PyOpenColorIO, DynamicPropertyType, DYNAMIC_PROPERTY_GRADING_RGBCURVE)) - .value("DYNAMIC_PROPERTY_GRADING_TONE", DYNAMIC_PROPERTY_GRADING_TONE, - DOC(PyOpenColorIO, DynamicPropertyType, DYNAMIC_PROPERTY_GRADING_TONE)) + .value( + "DYNAMIC_PROPERTY_EXPOSURE", + DYNAMIC_PROPERTY_EXPOSURE, + DOC(PyOpenColorIO, DynamicPropertyType, DYNAMIC_PROPERTY_EXPOSURE)) + .value( + "DYNAMIC_PROPERTY_CONTRAST", + DYNAMIC_PROPERTY_CONTRAST, + DOC(PyOpenColorIO, DynamicPropertyType, DYNAMIC_PROPERTY_CONTRAST)) + .value( + "DYNAMIC_PROPERTY_GAMMA", + DYNAMIC_PROPERTY_GAMMA, + DOC(PyOpenColorIO, DynamicPropertyType, DYNAMIC_PROPERTY_GAMMA)) + .value( + "DYNAMIC_PROPERTY_GRADING_PRIMARY", + DYNAMIC_PROPERTY_GRADING_PRIMARY, + DOC(PyOpenColorIO, DynamicPropertyType, DYNAMIC_PROPERTY_GRADING_PRIMARY)) + .value( + "DYNAMIC_PROPERTY_GRADING_RGBCURVE", + DYNAMIC_PROPERTY_GRADING_RGBCURVE, + DOC(PyOpenColorIO, DynamicPropertyType, DYNAMIC_PROPERTY_GRADING_RGBCURVE)) + .value( + "DYNAMIC_PROPERTY_GRADING_TONE", + DYNAMIC_PROPERTY_GRADING_TONE, + DOC(PyOpenColorIO, DynamicPropertyType, DYNAMIC_PROPERTY_GRADING_TONE)) .export_values(); - py::enum_( - m, "RGBCurveType", - DOC(PyOpenColorIO, RGBCurveType)) - - .value("RGB_RED", RGB_RED, - DOC(PyOpenColorIO, RGBCurveType, RGB_RED)) - .value("RGB_GREEN", RGB_GREEN, - DOC(PyOpenColorIO, RGBCurveType, RGB_GREEN)) - .value("RGB_BLUE", RGB_BLUE, - DOC(PyOpenColorIO, RGBCurveType, RGB_BLUE)) - .value("RGB_MASTER", RGB_MASTER, - DOC(PyOpenColorIO, RGBCurveType, RGB_MASTER)) - .value("RGB_NUM_CURVES", RGB_NUM_CURVES, - DOC(PyOpenColorIO, RGBCurveType, RGB_NUM_CURVES)) + py::enum_(m, "RGBCurveType", DOC(PyOpenColorIO, RGBCurveType)) + + .value("RGB_RED", RGB_RED, DOC(PyOpenColorIO, RGBCurveType, RGB_RED)) + .value("RGB_GREEN", RGB_GREEN, DOC(PyOpenColorIO, RGBCurveType, RGB_GREEN)) + .value("RGB_BLUE", RGB_BLUE, DOC(PyOpenColorIO, RGBCurveType, RGB_BLUE)) + .value("RGB_MASTER", RGB_MASTER, DOC(PyOpenColorIO, RGBCurveType, RGB_MASTER)) + .value("RGB_NUM_CURVES", RGB_NUM_CURVES, DOC(PyOpenColorIO, RGBCurveType, RGB_NUM_CURVES)) .export_values(); - py::enum_( - m, "UniformDataType", - DOC(PyOpenColorIO, UniformDataType)) - - .value("UNIFORM_DOUBLE", UNIFORM_DOUBLE, - DOC(PyOpenColorIO, UniformDataType, UNIFORM_DOUBLE)) - .value("UNIFORM_BOOL", UNIFORM_BOOL, - DOC(PyOpenColorIO, UniformDataType, UNIFORM_BOOL)) - .value("UNIFORM_FLOAT3", UNIFORM_FLOAT3, - DOC(PyOpenColorIO, UniformDataType, UNIFORM_FLOAT3)) - .value("UNIFORM_VECTOR_FLOAT", UNIFORM_VECTOR_FLOAT, - DOC(PyOpenColorIO, UniformDataType, UNIFORM_VECTOR_FLOAT)) - .value("UNIFORM_VECTOR_INT", UNIFORM_VECTOR_INT, - DOC(PyOpenColorIO, UniformDataType, UNIFORM_VECTOR_INT)) - .value("UNIFORM_UNKNOWN", UNIFORM_UNKNOWN, - DOC(PyOpenColorIO, UniformDataType, UNIFORM_UNKNOWN)) + py::enum_(m, "UniformDataType", DOC(PyOpenColorIO, UniformDataType)) + + .value( + "UNIFORM_DOUBLE", + UNIFORM_DOUBLE, + DOC(PyOpenColorIO, UniformDataType, UNIFORM_DOUBLE)) + .value("UNIFORM_BOOL", UNIFORM_BOOL, DOC(PyOpenColorIO, UniformDataType, UNIFORM_BOOL)) + .value( + "UNIFORM_FLOAT3", + UNIFORM_FLOAT3, + DOC(PyOpenColorIO, UniformDataType, UNIFORM_FLOAT3)) + .value( + "UNIFORM_VECTOR_FLOAT", + UNIFORM_VECTOR_FLOAT, + DOC(PyOpenColorIO, UniformDataType, UNIFORM_VECTOR_FLOAT)) + .value( + "UNIFORM_VECTOR_INT", + UNIFORM_VECTOR_INT, + DOC(PyOpenColorIO, UniformDataType, UNIFORM_VECTOR_INT)) + .value( + "UNIFORM_UNKNOWN", + UNIFORM_UNKNOWN, + DOC(PyOpenColorIO, UniformDataType, UNIFORM_UNKNOWN)) .export_values(); py::enum_( - m, "OptimizationFlags", py::arithmetic(), + m, + "OptimizationFlags", + py::arithmetic(), DOC(PyOpenColorIO, OptimizationFlags)) - .value("OPTIMIZATION_NONE", OPTIMIZATION_NONE, - DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_NONE)) - .value("OPTIMIZATION_IDENTITY", OPTIMIZATION_IDENTITY, - DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_IDENTITY)) - .value("OPTIMIZATION_IDENTITY_GAMMA", OPTIMIZATION_IDENTITY_GAMMA, - DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_IDENTITY_GAMMA)) - .value("OPTIMIZATION_PAIR_IDENTITY_CDL", OPTIMIZATION_PAIR_IDENTITY_CDL, - DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_PAIR_IDENTITY_CDL)) - .value("OPTIMIZATION_PAIR_IDENTITY_EXPOSURE_CONTRAST", - OPTIMIZATION_PAIR_IDENTITY_EXPOSURE_CONTRAST, - DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_PAIR_IDENTITY_EXPOSURE_CONTRAST)) - .value("OPTIMIZATION_PAIR_IDENTITY_FIXED_FUNCTION", - OPTIMIZATION_PAIR_IDENTITY_FIXED_FUNCTION, - DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_PAIR_IDENTITY_FIXED_FUNCTION)) - .value("OPTIMIZATION_PAIR_IDENTITY_GAMMA", OPTIMIZATION_PAIR_IDENTITY_GAMMA, - DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_PAIR_IDENTITY_GAMMA)) - .value("OPTIMIZATION_PAIR_IDENTITY_LUT1D", OPTIMIZATION_PAIR_IDENTITY_LUT1D, - DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_PAIR_IDENTITY_LUT1D)) - .value("OPTIMIZATION_PAIR_IDENTITY_LUT3D", OPTIMIZATION_PAIR_IDENTITY_LUT3D, - DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_PAIR_IDENTITY_LUT3D)) - .value("OPTIMIZATION_PAIR_IDENTITY_LOG", OPTIMIZATION_PAIR_IDENTITY_LOG, - DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_PAIR_IDENTITY_LOG)) - .value("OPTIMIZATION_PAIR_IDENTITY_GRADING", OPTIMIZATION_PAIR_IDENTITY_GRADING, - DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_PAIR_IDENTITY_GRADING)) - .value("OPTIMIZATION_COMP_EXPONENT", OPTIMIZATION_COMP_EXPONENT, - DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_COMP_EXPONENT)) - .value("OPTIMIZATION_COMP_GAMMA", OPTIMIZATION_COMP_GAMMA, - DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_COMP_GAMMA)) - .value("OPTIMIZATION_COMP_MATRIX", OPTIMIZATION_COMP_MATRIX, - DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_COMP_MATRIX)) - .value("OPTIMIZATION_COMP_LUT1D", OPTIMIZATION_COMP_LUT1D, - DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_COMP_LUT1D)) - .value("OPTIMIZATION_COMP_LUT3D", OPTIMIZATION_COMP_LUT3D, - DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_COMP_LUT3D)) - .value("OPTIMIZATION_COMP_RANGE", OPTIMIZATION_COMP_RANGE, - DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_COMP_RANGE)) - .value("OPTIMIZATION_COMP_SEPARABLE_PREFIX", OPTIMIZATION_COMP_SEPARABLE_PREFIX, - DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_COMP_SEPARABLE_PREFIX)) - .value("OPTIMIZATION_LUT_INV_FAST", OPTIMIZATION_LUT_INV_FAST, - DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_LUT_INV_FAST)) - .value("OPTIMIZATION_FAST_LOG_EXP_POW", OPTIMIZATION_FAST_LOG_EXP_POW, - DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_FAST_LOG_EXP_POW)) - .value("OPTIMIZATION_SIMPLIFY_OPS", OPTIMIZATION_SIMPLIFY_OPS, - DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_SIMPLIFY_OPS)) - .value("OPTIMIZATION_NO_DYNAMIC_PROPERTIES", OPTIMIZATION_NO_DYNAMIC_PROPERTIES, - DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_NO_DYNAMIC_PROPERTIES)) - .value("OPTIMIZATION_ALL", OPTIMIZATION_ALL, - DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_ALL)) - .value("OPTIMIZATION_LOSSLESS", OPTIMIZATION_LOSSLESS, - DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_LOSSLESS)) - .value("OPTIMIZATION_VERY_GOOD", OPTIMIZATION_VERY_GOOD, - DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_VERY_GOOD)) - .value("OPTIMIZATION_GOOD", OPTIMIZATION_GOOD, - DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_GOOD)) - .value("OPTIMIZATION_DRAFT", OPTIMIZATION_DRAFT, - DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_DRAFT)) - .value("OPTIMIZATION_DEFAULT", OPTIMIZATION_DEFAULT, - DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_DEFAULT)) + .value( + "OPTIMIZATION_NONE", + OPTIMIZATION_NONE, + DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_NONE)) + .value( + "OPTIMIZATION_IDENTITY", + OPTIMIZATION_IDENTITY, + DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_IDENTITY)) + .value( + "OPTIMIZATION_IDENTITY_GAMMA", + OPTIMIZATION_IDENTITY_GAMMA, + DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_IDENTITY_GAMMA)) + .value( + "OPTIMIZATION_PAIR_IDENTITY_CDL", + OPTIMIZATION_PAIR_IDENTITY_CDL, + DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_PAIR_IDENTITY_CDL)) + .value( + "OPTIMIZATION_PAIR_IDENTITY_EXPOSURE_CONTRAST", + OPTIMIZATION_PAIR_IDENTITY_EXPOSURE_CONTRAST, + DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_PAIR_IDENTITY_EXPOSURE_CONTRAST)) + .value( + "OPTIMIZATION_PAIR_IDENTITY_FIXED_FUNCTION", + OPTIMIZATION_PAIR_IDENTITY_FIXED_FUNCTION, + DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_PAIR_IDENTITY_FIXED_FUNCTION)) + .value( + "OPTIMIZATION_PAIR_IDENTITY_GAMMA", + OPTIMIZATION_PAIR_IDENTITY_GAMMA, + DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_PAIR_IDENTITY_GAMMA)) + .value( + "OPTIMIZATION_PAIR_IDENTITY_LUT1D", + OPTIMIZATION_PAIR_IDENTITY_LUT1D, + DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_PAIR_IDENTITY_LUT1D)) + .value( + "OPTIMIZATION_PAIR_IDENTITY_LUT3D", + OPTIMIZATION_PAIR_IDENTITY_LUT3D, + DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_PAIR_IDENTITY_LUT3D)) + .value( + "OPTIMIZATION_PAIR_IDENTITY_LOG", + OPTIMIZATION_PAIR_IDENTITY_LOG, + DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_PAIR_IDENTITY_LOG)) + .value( + "OPTIMIZATION_PAIR_IDENTITY_GRADING", + OPTIMIZATION_PAIR_IDENTITY_GRADING, + DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_PAIR_IDENTITY_GRADING)) + .value( + "OPTIMIZATION_COMP_EXPONENT", + OPTIMIZATION_COMP_EXPONENT, + DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_COMP_EXPONENT)) + .value( + "OPTIMIZATION_COMP_GAMMA", + OPTIMIZATION_COMP_GAMMA, + DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_COMP_GAMMA)) + .value( + "OPTIMIZATION_COMP_MATRIX", + OPTIMIZATION_COMP_MATRIX, + DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_COMP_MATRIX)) + .value( + "OPTIMIZATION_COMP_LUT1D", + OPTIMIZATION_COMP_LUT1D, + DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_COMP_LUT1D)) + .value( + "OPTIMIZATION_COMP_LUT3D", + OPTIMIZATION_COMP_LUT3D, + DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_COMP_LUT3D)) + .value( + "OPTIMIZATION_COMP_RANGE", + OPTIMIZATION_COMP_RANGE, + DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_COMP_RANGE)) + .value( + "OPTIMIZATION_COMP_SEPARABLE_PREFIX", + OPTIMIZATION_COMP_SEPARABLE_PREFIX, + DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_COMP_SEPARABLE_PREFIX)) + .value( + "OPTIMIZATION_LUT_INV_FAST", + OPTIMIZATION_LUT_INV_FAST, + DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_LUT_INV_FAST)) + .value( + "OPTIMIZATION_FAST_LOG_EXP_POW", + OPTIMIZATION_FAST_LOG_EXP_POW, + DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_FAST_LOG_EXP_POW)) + .value( + "OPTIMIZATION_SIMPLIFY_OPS", + OPTIMIZATION_SIMPLIFY_OPS, + DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_SIMPLIFY_OPS)) + .value( + "OPTIMIZATION_NO_DYNAMIC_PROPERTIES", + OPTIMIZATION_NO_DYNAMIC_PROPERTIES, + DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_NO_DYNAMIC_PROPERTIES)) + .value( + "OPTIMIZATION_ALL", + OPTIMIZATION_ALL, + DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_ALL)) + .value( + "OPTIMIZATION_LOSSLESS", + OPTIMIZATION_LOSSLESS, + DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_LOSSLESS)) + .value( + "OPTIMIZATION_VERY_GOOD", + OPTIMIZATION_VERY_GOOD, + DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_VERY_GOOD)) + .value( + "OPTIMIZATION_GOOD", + OPTIMIZATION_GOOD, + DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_GOOD)) + .value( + "OPTIMIZATION_DRAFT", + OPTIMIZATION_DRAFT, + DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_DRAFT)) + .value( + "OPTIMIZATION_DEFAULT", + OPTIMIZATION_DEFAULT, + DOC(PyOpenColorIO, OptimizationFlags, OPTIMIZATION_DEFAULT)) .export_values(); py::enum_( - m, "ProcessorCacheFlags", + m, + "ProcessorCacheFlags", DOC(PyOpenColorIO, ProcessorCacheFlags)) - .value("PROCESSOR_CACHE_OFF", PROCESSOR_CACHE_OFF, - DOC(PyOpenColorIO, ProcessorCacheFlags, PROCESSOR_CACHE_OFF)) - .value("PROCESSOR_CACHE_ENABLED", PROCESSOR_CACHE_ENABLED, - DOC(PyOpenColorIO, ProcessorCacheFlags, PROCESSOR_CACHE_ENABLED)) - .value("PROCESSOR_CACHE_SHARE_DYN_PROPERTIES", PROCESSOR_CACHE_SHARE_DYN_PROPERTIES, - DOC(PyOpenColorIO, ProcessorCacheFlags, PROCESSOR_CACHE_SHARE_DYN_PROPERTIES)) - .value("PROCESSOR_CACHE_DEFAULT", PROCESSOR_CACHE_DEFAULT, - DOC(PyOpenColorIO, ProcessorCacheFlags, PROCESSOR_CACHE_DEFAULT)) + .value( + "PROCESSOR_CACHE_OFF", + PROCESSOR_CACHE_OFF, + DOC(PyOpenColorIO, ProcessorCacheFlags, PROCESSOR_CACHE_OFF)) + .value( + "PROCESSOR_CACHE_ENABLED", + PROCESSOR_CACHE_ENABLED, + DOC(PyOpenColorIO, ProcessorCacheFlags, PROCESSOR_CACHE_ENABLED)) + .value( + "PROCESSOR_CACHE_SHARE_DYN_PROPERTIES", + PROCESSOR_CACHE_SHARE_DYN_PROPERTIES, + DOC(PyOpenColorIO, ProcessorCacheFlags, PROCESSOR_CACHE_SHARE_DYN_PROPERTIES)) + .value( + "PROCESSOR_CACHE_DEFAULT", + PROCESSOR_CACHE_DEFAULT, + DOC(PyOpenColorIO, ProcessorCacheFlags, PROCESSOR_CACHE_DEFAULT)) .export_values(); // Conversion - m.def("BoolToString", &BoolToString, "value"_a, - DOC(PyOpenColorIO, BoolToString)); - m.def("BoolFromString", &BoolFromString, "str"_a, - DOC(PyOpenColorIO, BoolFromString)); - - m.def("LoggingLevelToString", &LoggingLevelToString, "level"_a, - DOC(PyOpenColorIO, LoggingLevelToString)); - m.def("LoggingLevelFromString", &LoggingLevelFromString, "str"_a, - DOC(PyOpenColorIO, LoggingLevelFromString)); - - m.def("TransformDirectionToString", &TransformDirectionToString, "direction"_a, - DOC(PyOpenColorIO, TransformDirectionToString)); - m.def("TransformDirectionFromString", &TransformDirectionFromString, "str"_a, - DOC(PyOpenColorIO, TransformDirectionFromString)); - - m.def("GetInverseTransformDirection", &GetInverseTransformDirection, "direction"_a, - DOC(PyOpenColorIO, GetInverseTransformDirection)); - m.def("CombineTransformDirections", &CombineTransformDirections, "direction1"_a, "direction2"_a, - DOC(PyOpenColorIO, CombineTransformDirections)); - - m.def("BitDepthToString", &BitDepthToString, "bitDepth"_a, - DOC(PyOpenColorIO, BitDepthToString)); - m.def("BitDepthFromString", &BitDepthFromString, "str"_a, - DOC(PyOpenColorIO, BitDepthFromString)); - m.def("BitDepthIsFloat", &BitDepthIsFloat, "bitDepth"_a, - DOC(PyOpenColorIO, BitDepthIsFloat)); - m.def("BitDepthToInt", &BitDepthToInt, "bitDepth"_a, - DOC(PyOpenColorIO, BitDepthToInt)); - - m.def("AllocationToString", &AllocationToString, "allocation"_a, - DOC(PyOpenColorIO, AllocationToString)); - m.def("AllocationFromString", &AllocationFromString, "str"_a, - DOC(PyOpenColorIO, AllocationFromString)); - - m.def("InterpolationToString", &InterpolationToString, "interpolation"_a, - DOC(PyOpenColorIO, InterpolationToString)); - m.def("InterpolationFromString", &InterpolationFromString, "str"_a, - DOC(PyOpenColorIO, InterpolationFromString)); - - m.def("GpuLanguageToString", &GpuLanguageToString, "language"_a, - DOC(PyOpenColorIO, GpuLanguageToString)); - m.def("GpuLanguageFromString", &GpuLanguageFromString, "str"_a, - DOC(PyOpenColorIO, GpuLanguageFromString)); - - m.def("EnvironmentModeToString", &EnvironmentModeToString, "mode"_a, - DOC(PyOpenColorIO, EnvironmentModeToString)); - m.def("EnvironmentModeFromString", &EnvironmentModeFromString, "str"_a, - DOC(PyOpenColorIO, EnvironmentModeFromString)); - - m.def("CDLStyleToString", &CDLStyleToString, "style"_a, - DOC(PyOpenColorIO, CDLStyleToString)); - m.def("CDLStyleFromString", &CDLStyleFromString, "str"_a, - DOC(PyOpenColorIO, CDLStyleFromString)); - - m.def("RangeStyleToString", &RangeStyleToString, "style"_a, - DOC(PyOpenColorIO, RangeStyleToString)); - m.def("RangeStyleFromString", &RangeStyleFromString, "str"_a, - DOC(PyOpenColorIO, RangeStyleFromString)); - - m.def("FixedFunctionStyleToString", &FixedFunctionStyleToString, "style"_a, - DOC(PyOpenColorIO, FixedFunctionStyleToString)); - m.def("FixedFunctionStyleFromString", &FixedFunctionStyleFromString, "str"_a, - DOC(PyOpenColorIO, FixedFunctionStyleFromString)); - - m.def("GradingStyleToString", &GradingStyleToString, "style"_a, - DOC(PyOpenColorIO, GradingStyleToString)); - m.def("GradingStyleFromString", &GradingStyleFromString, "str"_a, - DOC(PyOpenColorIO, GradingStyleFromString)); - - m.def("ExposureContrastStyleToString", &ExposureContrastStyleToString, "style"_a, - DOC(PyOpenColorIO, ExposureContrastStyleToString)); - m.def("ExposureContrastStyleFromString", &ExposureContrastStyleFromString, "str"_a, - DOC(PyOpenColorIO, ExposureContrastStyleFromString)); - - m.def("NegativeStyleToString", &NegativeStyleToString, "style"_a, - DOC(PyOpenColorIO, NegativeStyleToString)); - m.def("NegativeStyleFromString", &NegativeStyleFromString, "str"_a, - DOC(PyOpenColorIO, NegativeStyleFromString)); + m.def("BoolToString", &BoolToString, "value"_a, DOC(PyOpenColorIO, BoolToString)); + m.def("BoolFromString", &BoolFromString, "str"_a, DOC(PyOpenColorIO, BoolFromString)); + + m.def( + "LoggingLevelToString", + &LoggingLevelToString, + "level"_a, + DOC(PyOpenColorIO, LoggingLevelToString)); + m.def( + "LoggingLevelFromString", + &LoggingLevelFromString, + "str"_a, + DOC(PyOpenColorIO, LoggingLevelFromString)); + + m.def( + "TransformDirectionToString", + &TransformDirectionToString, + "direction"_a, + DOC(PyOpenColorIO, TransformDirectionToString)); + m.def( + "TransformDirectionFromString", + &TransformDirectionFromString, + "str"_a, + DOC(PyOpenColorIO, TransformDirectionFromString)); + + m.def( + "GetInverseTransformDirection", + &GetInverseTransformDirection, + "direction"_a, + DOC(PyOpenColorIO, GetInverseTransformDirection)); + m.def( + "CombineTransformDirections", + &CombineTransformDirections, + "direction1"_a, + "direction2"_a, + DOC(PyOpenColorIO, CombineTransformDirections)); + + m.def( + "BitDepthToString", + &BitDepthToString, + "bitDepth"_a, + DOC(PyOpenColorIO, BitDepthToString)); + m.def( + "BitDepthFromString", + &BitDepthFromString, + "str"_a, + DOC(PyOpenColorIO, BitDepthFromString)); + m.def("BitDepthIsFloat", &BitDepthIsFloat, "bitDepth"_a, DOC(PyOpenColorIO, BitDepthIsFloat)); + m.def("BitDepthToInt", &BitDepthToInt, "bitDepth"_a, DOC(PyOpenColorIO, BitDepthToInt)); + + m.def( + "AllocationToString", + &AllocationToString, + "allocation"_a, + DOC(PyOpenColorIO, AllocationToString)); + m.def( + "AllocationFromString", + &AllocationFromString, + "str"_a, + DOC(PyOpenColorIO, AllocationFromString)); + + m.def( + "InterpolationToString", + &InterpolationToString, + "interpolation"_a, + DOC(PyOpenColorIO, InterpolationToString)); + m.def( + "InterpolationFromString", + &InterpolationFromString, + "str"_a, + DOC(PyOpenColorIO, InterpolationFromString)); + + m.def( + "GpuLanguageToString", + &GpuLanguageToString, + "language"_a, + DOC(PyOpenColorIO, GpuLanguageToString)); + m.def( + "GpuLanguageFromString", + &GpuLanguageFromString, + "str"_a, + DOC(PyOpenColorIO, GpuLanguageFromString)); + + m.def( + "EnvironmentModeToString", + &EnvironmentModeToString, + "mode"_a, + DOC(PyOpenColorIO, EnvironmentModeToString)); + m.def( + "EnvironmentModeFromString", + &EnvironmentModeFromString, + "str"_a, + DOC(PyOpenColorIO, EnvironmentModeFromString)); + + m.def("CDLStyleToString", &CDLStyleToString, "style"_a, DOC(PyOpenColorIO, CDLStyleToString)); + m.def( + "CDLStyleFromString", + &CDLStyleFromString, + "str"_a, + DOC(PyOpenColorIO, CDLStyleFromString)); + + m.def( + "RangeStyleToString", + &RangeStyleToString, + "style"_a, + DOC(PyOpenColorIO, RangeStyleToString)); + m.def( + "RangeStyleFromString", + &RangeStyleFromString, + "str"_a, + DOC(PyOpenColorIO, RangeStyleFromString)); + + m.def( + "FixedFunctionStyleToString", + &FixedFunctionStyleToString, + "style"_a, + DOC(PyOpenColorIO, FixedFunctionStyleToString)); + m.def( + "FixedFunctionStyleFromString", + &FixedFunctionStyleFromString, + "str"_a, + DOC(PyOpenColorIO, FixedFunctionStyleFromString)); + + m.def( + "GradingStyleToString", + &GradingStyleToString, + "style"_a, + DOC(PyOpenColorIO, GradingStyleToString)); + m.def( + "GradingStyleFromString", + &GradingStyleFromString, + "str"_a, + DOC(PyOpenColorIO, GradingStyleFromString)); + + m.def( + "ExposureContrastStyleToString", + &ExposureContrastStyleToString, + "style"_a, + DOC(PyOpenColorIO, ExposureContrastStyleToString)); + m.def( + "ExposureContrastStyleFromString", + &ExposureContrastStyleFromString, + "str"_a, + DOC(PyOpenColorIO, ExposureContrastStyleFromString)); + + m.def( + "NegativeStyleToString", + &NegativeStyleToString, + "style"_a, + DOC(PyOpenColorIO, NegativeStyleToString)); + m.def( + "NegativeStyleFromString", + &NegativeStyleFromString, + "str"_a, + DOC(PyOpenColorIO, NegativeStyleFromString)); // Env. variables - m.attr("OCIO_CONFIG_ENVVAR") = OCIO_CONFIG_ENVVAR; - m.attr("OCIO_ACTIVE_DISPLAYS_ENVVAR") = OCIO_ACTIVE_DISPLAYS_ENVVAR; - m.attr("OCIO_ACTIVE_VIEWS_ENVVAR") = OCIO_ACTIVE_VIEWS_ENVVAR; + m.attr("OCIO_CONFIG_ENVVAR") = OCIO_CONFIG_ENVVAR; + m.attr("OCIO_ACTIVE_DISPLAYS_ENVVAR") = OCIO_ACTIVE_DISPLAYS_ENVVAR; + m.attr("OCIO_ACTIVE_VIEWS_ENVVAR") = OCIO_ACTIVE_VIEWS_ENVVAR; m.attr("OCIO_INACTIVE_COLORSPACES_ENVVAR") = OCIO_INACTIVE_COLORSPACES_ENVVAR; - m.attr("OCIO_OPTIMIZATION_FLAGS_ENVVAR") = OCIO_OPTIMIZATION_FLAGS_ENVVAR; - m.attr("OCIO_USER_CATEGORIES_ENVVAR") = OCIO_USER_CATEGORIES_ENVVAR; + m.attr("OCIO_OPTIMIZATION_FLAGS_ENVVAR") = OCIO_OPTIMIZATION_FLAGS_ENVVAR; + m.attr("OCIO_USER_CATEGORIES_ENVVAR") = OCIO_USER_CATEGORIES_ENVVAR; // Roles - m.attr("ROLE_DEFAULT") = ROLE_DEFAULT; - m.attr("ROLE_REFERENCE") = ROLE_REFERENCE; - m.attr("ROLE_DATA") = ROLE_DATA; - m.attr("ROLE_COLOR_PICKING") = ROLE_COLOR_PICKING; - m.attr("ROLE_SCENE_LINEAR") = ROLE_SCENE_LINEAR; - m.attr("ROLE_COMPOSITING_LOG") = ROLE_COMPOSITING_LOG; - m.attr("ROLE_COLOR_TIMING") = ROLE_COLOR_TIMING; - m.attr("ROLE_TEXTURE_PAINT") = ROLE_TEXTURE_PAINT; - m.attr("ROLE_MATTE_PAINT") = ROLE_MATTE_PAINT; - m.attr("ROLE_RENDERING") = ROLE_RENDERING; - m.attr("ROLE_INTERCHANGE_SCENE") = ROLE_INTERCHANGE_SCENE; + m.attr("ROLE_DEFAULT") = ROLE_DEFAULT; + m.attr("ROLE_REFERENCE") = ROLE_REFERENCE; + m.attr("ROLE_DATA") = ROLE_DATA; + m.attr("ROLE_COLOR_PICKING") = ROLE_COLOR_PICKING; + m.attr("ROLE_SCENE_LINEAR") = ROLE_SCENE_LINEAR; + m.attr("ROLE_COMPOSITING_LOG") = ROLE_COMPOSITING_LOG; + m.attr("ROLE_COLOR_TIMING") = ROLE_COLOR_TIMING; + m.attr("ROLE_TEXTURE_PAINT") = ROLE_TEXTURE_PAINT; + m.attr("ROLE_MATTE_PAINT") = ROLE_MATTE_PAINT; + m.attr("ROLE_RENDERING") = ROLE_RENDERING; + m.attr("ROLE_INTERCHANGE_SCENE") = ROLE_INTERCHANGE_SCENE; m.attr("ROLE_INTERCHANGE_DISPLAY") = ROLE_INTERCHANGE_DISPLAY; // Shared View m.attr("OCIO_VIEW_USE_DISPLAY_NAME") = OCIO_VIEW_USE_DISPLAY_NAME; // FormatMetadata - m.attr("METADATA_DESCRIPTION") = METADATA_DESCRIPTION; - m.attr("METADATA_INFO") = METADATA_INFO; - m.attr("METADATA_INPUT_DESCRIPTOR") = METADATA_INPUT_DESCRIPTOR; + m.attr("METADATA_DESCRIPTION") = METADATA_DESCRIPTION; + m.attr("METADATA_INFO") = METADATA_INFO; + m.attr("METADATA_INPUT_DESCRIPTOR") = METADATA_INPUT_DESCRIPTOR; m.attr("METADATA_OUTPUT_DESCRIPTOR") = METADATA_OUTPUT_DESCRIPTOR; - m.attr("METADATA_NAME") = METADATA_NAME; - m.attr("METADATA_ID") = METADATA_ID; + m.attr("METADATA_NAME") = METADATA_NAME; + m.attr("METADATA_ID") = METADATA_ID; // Caches - m.attr("OCIO_DISABLE_ALL_CACHES") = OCIO_DISABLE_ALL_CACHES; + m.attr("OCIO_DISABLE_ALL_CACHES") = OCIO_DISABLE_ALL_CACHES; m.attr("OCIO_DISABLE_PROCESSOR_CACHES") = OCIO_DISABLE_PROCESSOR_CACHES; - m.attr("OCIO_DISABLE_CACHE_FALLBACK") = OCIO_DISABLE_CACHE_FALLBACK; + m.attr("OCIO_DISABLE_CACHE_FALLBACK") = OCIO_DISABLE_CACHE_FALLBACK; - m.attr("OCIO_CONFIG_DEFAULT_NAME") = OCIO_CONFIG_DEFAULT_NAME; + m.attr("OCIO_CONFIG_DEFAULT_NAME") = OCIO_CONFIG_DEFAULT_NAME; m.attr("OCIO_CONFIG_DEFAULT_FILE_EXT") = OCIO_CONFIG_DEFAULT_FILE_EXT; m.attr("OCIO_CONFIG_ARCHIVE_FILE_EXT") = OCIO_CONFIG_ARCHIVE_FILE_EXT; diff --git a/src/bindings/python/PyUtils.cpp b/src/bindings/python/PyUtils.cpp index 23be750685..1f54d9437f 100644 --- a/src/bindings/python/PyUtils.cpp +++ b/src/bindings/python/PyUtils.cpp @@ -9,7 +9,7 @@ namespace OCIO_NAMESPACE { -namespace +namespace { // Reference: @@ -17,9 +17,9 @@ namespace // https://docs.python.org/3.7/c-api/arg.html#numbers // https://numpy.org/devdocs/user/basics.types.html -const std::vector UINT_FORMATS = { "B", "H", "I", "L", "Q", "N" }; -const std::vector INT_FORMATS = { "b", "h", "i", "l", "q", "n" }; -const std::vector FLOAT_FORMATS = { "e", "f", "d", "g", "Ze", "Zf", "Zd", "Zg" }; +const std::vector UINT_FORMATS = {"B", "H", "I", "L", "Q", "N"}; +const std::vector INT_FORMATS = {"b", "h", "i", "l", "q", "n"}; +const std::vector FLOAT_FORMATS = {"e", "f", "d", "g", "Ze", "Zf", "Zd", "Zg"}; } // namespace @@ -27,25 +27,23 @@ std::string formatCodeToDtypeName(const std::string & format, py::ssize_t numBit { std::ostringstream os; - if (std::find(std::begin(FLOAT_FORMATS), - std::end(FLOAT_FORMATS), - format) != std::end(FLOAT_FORMATS)) + if (std::find(std::begin(FLOAT_FORMATS), std::end(FLOAT_FORMATS), format) + != std::end(FLOAT_FORMATS)) { os << "float" << numBits; } - else if (std::find(std::begin(UINT_FORMATS), - std::end(UINT_FORMATS), - format) != std::end(UINT_FORMATS)) + else if ( + std::find(std::begin(UINT_FORMATS), std::end(UINT_FORMATS), format) + != std::end(UINT_FORMATS)) { os << "uint" << numBits; } - else if (std::find(std::begin(INT_FORMATS), - std::end(INT_FORMATS), - format) != std::end(INT_FORMATS)) + else if ( + std::find(std::begin(INT_FORMATS), std::end(INT_FORMATS), format) != std::end(INT_FORMATS)) { os << "int" << numBits; } - else + else { os << "'" << format << "' (" << numBits << "-bit)"; } @@ -57,7 +55,7 @@ py::dtype bitDepthToDtype(BitDepth bitDepth) { std::string name, err; - switch(bitDepth) + switch (bitDepth) { case BIT_DEPTH_UINT8: name = "uint8"; @@ -89,7 +87,7 @@ py::ssize_t bitDepthToBytes(BitDepth bitDepth) { std::string name, err; - switch(bitDepth) + switch (bitDepth) { case BIT_DEPTH_UINT8: return 1; @@ -130,9 +128,9 @@ std::string getBufferShapeStr(const py::buffer_info & info) { std::ostringstream os; os << "("; - for (size_t i = 0; i < info.shape.size(); i++) + for (size_t i = 0; i < info.shape.size(); i++) { - os << info.shape[i] << (i < info.shape.size()-1 ? ", " : "" ); + os << info.shape[i] << (i < info.shape.size() - 1 ? ", " : ""); } os << ")"; return os.str(); @@ -141,8 +139,8 @@ std::string getBufferShapeStr(const py::buffer_info & info) BitDepth getBufferBitDepth(const py::buffer_info & info) { BitDepth bitDepth; - - std::string dtName = formatCodeToDtypeName(info.format, info.itemsize*8); + + std::string dtName = formatCodeToDtypeName(info.format, info.itemsize * 8); if (dtName == "float32") bitDepth = BIT_DEPTH_F32; @@ -152,7 +150,7 @@ BitDepth getBufferBitDepth(const py::buffer_info & info) bitDepth = BIT_DEPTH_UINT16; else if (dtName == "uint8") bitDepth = BIT_DEPTH_UINT8; - else + else { std::ostringstream os; os << "Unsupported data type: " << dtName; @@ -168,8 +166,8 @@ void checkBufferType(const py::buffer_info & info, const py::dtype & dt) { std::ostringstream os; os << "Incompatible buffer format: expected "; - os << formatCodeToDtypeName(std::string(1, dt.kind()), dt.itemsize()*8); - os << ", but received " << formatCodeToDtypeName(info.format, info.itemsize*8); + os << formatCodeToDtypeName(std::string(1, dt.kind()), dt.itemsize() * 8); + os << ", but received " << formatCodeToDtypeName(info.format, info.itemsize * 8); throw std::runtime_error(os.str().c_str()); } } @@ -205,7 +203,7 @@ unsigned long getBufferLut3DGridSize(const py::buffer_info & info) { checkBufferDivisible(info, 3); - unsigned long gs = 2; + unsigned long gs = 2; unsigned long size = (info.size >= 0 ? static_cast(info.size) : 0); if (info.ndim == 1) @@ -217,7 +215,7 @@ unsigned long getBufferLut3DGridSize(const py::buffer_info & info) gs = (info.size >= 0 ? static_cast(info.shape[0]) : 0); } - if (gs*gs*gs * 3 != size) + if (gs * gs * gs * 3 != size) { std::ostringstream os; os << "Incompatible buffer dimensions: failed to calculate grid size from shape "; diff --git a/src/bindings/python/PyUtils.h b/src/bindings/python/PyUtils.h index f5d39ee911..6899659ec5 100644 --- a/src/bindings/python/PyUtils.h +++ b/src/bindings/python/PyUtils.h @@ -14,47 +14,53 @@ namespace OCIO_NAMESPACE { // Define __repr__ implementation compatible with *most* OCIO classes -template -void defRepr(py::class_, EXTRA ...> & cls) +template +void defRepr(py::class_, EXTRA...> & cls) { - cls.def("__repr__", [](OCIO_SHARED_PTR & self) - { - std::ostringstream os; - os << (*self); - return os.str(); - }); + cls.def("__repr__", [](OCIO_SHARED_PTR & self) { + std::ostringstream os; + os << (*self); + return os.str(); + }); } -template -void defRepr(py::class_ & cls) +template void defRepr(py::class_ & cls) { - cls.def("__repr__", [](T & self) - { - std::ostringstream os; - os << self; - return os.str(); - }); + cls.def("__repr__", [](T & self) { + std::ostringstream os; + os << self; + return os.str(); + }); } // Standard interface for Python iterator mechanics -template -struct PyIterator +template struct PyIterator { - PyIterator(T obj, ARGS ... args) : m_obj(obj), m_args(args ...) {} + PyIterator(T obj, ARGS... args) + : m_obj(obj) + , m_args(args...) + { + } int nextIndex(int num) { - if (m_i >= num) { throw py::stop_iteration(); } + if (m_i >= num) + { + throw py::stop_iteration(); + } return m_i++; } void checkIndex(int i, int num) { - if (i >= num) { throw py::index_error("Iterator index out of range"); } + if (i >= num) + { + throw py::index_error("Iterator index out of range"); + } } T m_obj; - std::tuple m_args; + std::tuple m_args; private: int m_i = 0; diff --git a/src/bindings/python/PyViewTransform.cpp b/src/bindings/python/PyViewTransform.cpp index 267a30f9f6..b07a42453f 100644 --- a/src/bindings/python/PyViewTransform.cpp +++ b/src/bindings/python/PyViewTransform.cpp @@ -6,7 +6,7 @@ namespace OCIO_NAMESPACE { -namespace +namespace { enum ViewTransformIterator @@ -14,10 +14,10 @@ enum ViewTransformIterator IT_VIEW_TRANSFORM_CATEGORY = 0 }; -using ViewTransformCategoryIterator = PyIterator; +using ViewTransformCategoryIterator = PyIterator; -std::vector getCategoriesStdVec(const ViewTransformRcPtr & p) { +std::vector getCategoriesStdVec(const ViewTransformRcPtr & p) +{ std::vector categories; categories.reserve(p->getNumCategories()); for (int i = 0; i < p->getNumCategories(); i++) @@ -33,40 +33,47 @@ void bindPyViewTransform(py::module & m) { ViewTransformRcPtr DEFAULT = ViewTransform::Create(REFERENCE_SPACE_SCENE); - auto clsViewTransform = - py::class_( - m.attr("ViewTransform")); + auto clsViewTransform = py::class_(m.attr("ViewTransform")); - auto clsViewTransformCategoryIterator = - py::class_( - clsViewTransform, "ViewTransformCategoryIterator"); + auto clsViewTransformCategoryIterator = py::class_( + clsViewTransform, + "ViewTransformCategoryIterator"); clsViewTransform - .def(py::init([](ReferenceSpaceType referenceSpace) - { - return ViewTransform::Create(referenceSpace); - }), - "referenceSpace"_a, - DOC(ViewTransform, Create)) - .def(py::init([](ReferenceSpaceType referenceSpace, - const std::string & name, - const std::string & family, - const std::string & description, - const TransformRcPtr & toReference, - const TransformRcPtr & fromReference, - const std::vector & categories) - { + .def( + py::init([](ReferenceSpaceType referenceSpace) { + return ViewTransform::Create(referenceSpace); + }), + "referenceSpace"_a, + DOC(ViewTransform, Create)) + .def( + py::init([](ReferenceSpaceType referenceSpace, + const std::string & name, + const std::string & family, + const std::string & description, + const TransformRcPtr & toReference, + const TransformRcPtr & fromReference, + const std::vector & categories) { ViewTransformRcPtr p = ViewTransform::Create(referenceSpace); - if (!name.empty()) { p->setName(name.c_str()); } - if (!family.empty()) { p->setFamily(family.c_str()); } - if (!description.empty()) { p->setDescription(description.c_str()); } + if (!name.empty()) + { + p->setName(name.c_str()); + } + if (!family.empty()) + { + p->setFamily(family.c_str()); + } + if (!description.empty()) + { + p->setDescription(description.c_str()); + } if (toReference) - { - p->setTransform(toReference, VIEWTRANSFORM_DIR_TO_REFERENCE); + { + p->setTransform(toReference, VIEWTRANSFORM_DIR_TO_REFERENCE); } - if (fromReference) - { - p->setTransform(fromReference, VIEWTRANSFORM_DIR_FROM_REFERENCE); + if (fromReference) + { + p->setTransform(fromReference, VIEWTRANSFORM_DIR_FROM_REFERENCE); } if (!categories.empty()) { @@ -77,74 +84,92 @@ void bindPyViewTransform(py::module & m) } } return p; - }), - "referenceSpace"_a = DEFAULT->getReferenceSpaceType(), - "name"_a = DEFAULT->getName(), - "family"_a = DEFAULT->getFamily(), - "description"_a = DEFAULT->getDescription(), - "toReference"_a = DEFAULT->getTransform(VIEWTRANSFORM_DIR_TO_REFERENCE), - "fromReference"_a = DEFAULT->getTransform(VIEWTRANSFORM_DIR_FROM_REFERENCE), - "categories"_a = getCategoriesStdVec(DEFAULT), - DOC(ViewTransform, Create)) + }), + "referenceSpace"_a = DEFAULT->getReferenceSpaceType(), + "name"_a = DEFAULT->getName(), + "family"_a = DEFAULT->getFamily(), + "description"_a = DEFAULT->getDescription(), + "toReference"_a = DEFAULT->getTransform(VIEWTRANSFORM_DIR_TO_REFERENCE), + "fromReference"_a = DEFAULT->getTransform(VIEWTRANSFORM_DIR_FROM_REFERENCE), + "categories"_a = getCategoriesStdVec(DEFAULT), + DOC(ViewTransform, Create)) - .def("__deepcopy__", [](const ConstViewTransformRcPtr & self, py::dict) - { + .def( + "__deepcopy__", + [](const ConstViewTransformRcPtr & self, py::dict) { return self->createEditableCopy(); }, "memo"_a) - .def("getName", &ViewTransform::getName, - DOC(ViewTransform, getName)) - .def("setName", &ViewTransform::setName, "name"_a, - DOC(ViewTransform, setName)) - .def("getFamily", &ViewTransform::getFamily, - DOC(ViewTransform, getFamily)) - .def("setFamily", &ViewTransform::setFamily, "family"_a, - DOC(ViewTransform, setFamily)) - .def("getDescription", &ViewTransform::getDescription, - DOC(ViewTransform, getDescription)) - .def("setDescription", &ViewTransform::setDescription, "description"_a, - DOC(ViewTransform, setDescription)) - .def("hasCategory", &ViewTransform::hasCategory, "category"_a, - DOC(ViewTransform, hasCategory)) - .def("addCategory", &ViewTransform::addCategory, "category"_a, - DOC(ViewTransform, addCategory)) - .def("removeCategory", &ViewTransform::removeCategory, "category"_a, - DOC(ViewTransform, removeCategory)) - .def("getCategories", [](ViewTransformRcPtr & self) - { - return ViewTransformCategoryIterator(self); - }) - .def("clearCategories", &ViewTransform::clearCategories, - DOC(ViewTransform, clearCategories)) - .def("getReferenceSpaceType", &ViewTransform::getReferenceSpaceType, - DOC(ViewTransform, getReferenceSpaceType)) - .def("getTransform", &ViewTransform::getTransform, "direction"_a, - DOC(ViewTransform, getTransform)) - .def("setTransform", &ViewTransform::setTransform, "transform"_a, "direction"_a, - DOC(ViewTransform, setTransform)); + .def("getName", &ViewTransform::getName, DOC(ViewTransform, getName)) + .def("setName", &ViewTransform::setName, "name"_a, DOC(ViewTransform, setName)) + .def("getFamily", &ViewTransform::getFamily, DOC(ViewTransform, getFamily)) + .def("setFamily", &ViewTransform::setFamily, "family"_a, DOC(ViewTransform, setFamily)) + .def("getDescription", &ViewTransform::getDescription, DOC(ViewTransform, getDescription)) + .def( + "setDescription", + &ViewTransform::setDescription, + "description"_a, + DOC(ViewTransform, setDescription)) + .def( + "hasCategory", + &ViewTransform::hasCategory, + "category"_a, + DOC(ViewTransform, hasCategory)) + .def( + "addCategory", + &ViewTransform::addCategory, + "category"_a, + DOC(ViewTransform, addCategory)) + .def( + "removeCategory", + &ViewTransform::removeCategory, + "category"_a, + DOC(ViewTransform, removeCategory)) + .def( + "getCategories", + [](ViewTransformRcPtr & self) { return ViewTransformCategoryIterator(self); }) + .def( + "clearCategories", + &ViewTransform::clearCategories, + DOC(ViewTransform, clearCategories)) + .def( + "getReferenceSpaceType", + &ViewTransform::getReferenceSpaceType, + DOC(ViewTransform, getReferenceSpaceType)) + .def( + "getTransform", + &ViewTransform::getTransform, + "direction"_a, + DOC(ViewTransform, getTransform)) + .def( + "setTransform", + &ViewTransform::setTransform, + "transform"_a, + "direction"_a, + DOC(ViewTransform, setTransform)); defRepr(clsViewTransform); clsViewTransformCategoryIterator - .def("__len__", [](ViewTransformCategoryIterator & it) - { - return it.m_obj->getNumCategories(); - }) - .def("__getitem__", [](ViewTransformCategoryIterator & it, int i) - { + .def( + "__len__", + [](ViewTransformCategoryIterator & it) { return it.m_obj->getNumCategories(); }) + .def( + "__getitem__", + [](ViewTransformCategoryIterator & it, int i) { it.checkIndex(i, it.m_obj->getNumCategories()); return it.m_obj->getCategory(i); }) - .def("__iter__", [](ViewTransformCategoryIterator & it) -> ViewTransformCategoryIterator & - { - return it; + .def( + "__iter__", + [](ViewTransformCategoryIterator & it) -> ViewTransformCategoryIterator & { + return it; }) - .def("__next__", [](ViewTransformCategoryIterator & it) - { - int i = it.nextIndex(it.m_obj->getNumCategories()); - return it.m_obj->getCategory(i); - }); + .def("__next__", [](ViewTransformCategoryIterator & it) { + int i = it.nextIndex(it.m_obj->getNumCategories()); + return it.m_obj->getCategory(i); + }); } } // namespace OCIO_NAMESPACE diff --git a/src/bindings/python/PyViewingRules.cpp b/src/bindings/python/PyViewingRules.cpp index 7b1cfabc08..26fd785459 100644 --- a/src/bindings/python/PyViewingRules.cpp +++ b/src/bindings/python/PyViewingRules.cpp @@ -13,122 +13,157 @@ enum ViewingRuleIterator IT_VIEWING_RULE_ENCODING }; -using ViewingRuleColorSpaceIterator = PyIterator; +using ViewingRuleColorSpaceIterator + = PyIterator; using ViewingRuleEncodingIterator = PyIterator; void bindPyViewingRules(py::module & m) { - auto clsViewingRules = - py::class_( - m.attr("ViewingRules")); + auto clsViewingRules = py::class_(m.attr("ViewingRules")); - auto clsViewingRuleColorSpaceIterator = - py::class_( - clsViewingRules, "ViewingRuleColorSpaceIterator"); + auto clsViewingRuleColorSpaceIterator = py::class_( + clsViewingRules, + "ViewingRuleColorSpaceIterator"); - auto clsViewingRuleEncodingIterator = - py::class_( - clsViewingRules, "ViewingRuleEncodingIterator"); + auto clsViewingRuleEncodingIterator + = py::class_(clsViewingRules, "ViewingRuleEncodingIterator"); clsViewingRules - .def(py::init(&ViewingRules::Create), - DOC(ViewingRules, Create)) + .def(py::init(&ViewingRules::Create), DOC(ViewingRules, Create)) - .def("__deepcopy__", [](const ConstViewingRulesRcPtr & self, py::dict) - { - return self->createEditableCopy(); + .def( + "__deepcopy__", + [](const ConstViewingRulesRcPtr & self, py::dict) { + return self->createEditableCopy(); }, "memo"_a) - .def("getNumEntries", &ViewingRules::getNumEntries, - DOC(ViewingRules, getNumEntries)) - .def("getIndexForRule", &ViewingRules::getIndexForRule, "ruleName"_a, - DOC(ViewingRules, getIndexForRule)) - .def("getName", &ViewingRules::getName, "ruleIndex"_a, - DOC(ViewingRules, getName)) - .def("getColorSpaces", - [](ViewingRulesRcPtr & self, size_t ruleIndex) - { - return ViewingRuleColorSpaceIterator(self, ruleIndex); - }, + .def("getNumEntries", &ViewingRules::getNumEntries, DOC(ViewingRules, getNumEntries)) + .def( + "getIndexForRule", + &ViewingRules::getIndexForRule, + "ruleName"_a, + DOC(ViewingRules, getIndexForRule)) + .def("getName", &ViewingRules::getName, "ruleIndex"_a, DOC(ViewingRules, getName)) + .def( + "getColorSpaces", + [](ViewingRulesRcPtr & self, size_t ruleIndex) { + return ViewingRuleColorSpaceIterator(self, ruleIndex); + }, "ruleIndex"_a) - .def("addColorSpace", &ViewingRules::addColorSpace, "ruleIndex"_a, "colorSpaceName"_a, - DOC(ViewingRules, addColorSpace)) - .def("removeColorSpace", &ViewingRules::removeColorSpace, - "ruleIndex"_a, "colorSpaceIndex"_a, - DOC(ViewingRules, removeColorSpace)) - .def("getEncodings", - [](ViewingRulesRcPtr & self, size_t ruleIndex) - { - return ViewingRuleEncodingIterator(self, ruleIndex); - }, + .def( + "addColorSpace", + &ViewingRules::addColorSpace, + "ruleIndex"_a, + "colorSpaceName"_a, + DOC(ViewingRules, addColorSpace)) + .def( + "removeColorSpace", + &ViewingRules::removeColorSpace, + "ruleIndex"_a, + "colorSpaceIndex"_a, + DOC(ViewingRules, removeColorSpace)) + .def( + "getEncodings", + [](ViewingRulesRcPtr & self, size_t ruleIndex) { + return ViewingRuleEncodingIterator(self, ruleIndex); + }, "ruleIndex"_a) - .def("addEncoding", &ViewingRules::addEncoding, "ruleIndex"_a, "encodingName"_a, - DOC(ViewingRules, addEncoding)) - .def("removeEncoding", &ViewingRules::removeEncoding, "ruleIndex"_a, "encodingIndex"_a, - DOC(ViewingRules, removeEncoding)) - .def("getNumCustomKeys", &ViewingRules::getNumCustomKeys, "ruleIndex"_a, - DOC(ViewingRules, getNumCustomKeys)) - .def("getCustomKeyName", &ViewingRules::getCustomKeyName, "ruleIndex"_a, "key"_a, - DOC(ViewingRules, getCustomKeyName)) - .def("getCustomKeyValue", &ViewingRules::getCustomKeyValue, "ruleIndex"_a, "key"_a, - DOC(ViewingRules, getCustomKeyValue)) - .def("setCustomKey", &ViewingRules::setCustomKey, "ruleIndex"_a, "key"_a, "value"_a, - DOC(ViewingRules, setCustomKey)) - .def("insertRule", - (void (ViewingRules::*)(size_t, const char *)) &ViewingRules::insertRule, - "ruleIndex"_a, "name"_a, - DOC(ViewingRules, insertRule)) - .def("removeRule", &ViewingRules::removeRule, "ruleIndex"_a, - DOC(ViewingRules, removeRule)); + .def( + "addEncoding", + &ViewingRules::addEncoding, + "ruleIndex"_a, + "encodingName"_a, + DOC(ViewingRules, addEncoding)) + .def( + "removeEncoding", + &ViewingRules::removeEncoding, + "ruleIndex"_a, + "encodingIndex"_a, + DOC(ViewingRules, removeEncoding)) + .def( + "getNumCustomKeys", + &ViewingRules::getNumCustomKeys, + "ruleIndex"_a, + DOC(ViewingRules, getNumCustomKeys)) + .def( + "getCustomKeyName", + &ViewingRules::getCustomKeyName, + "ruleIndex"_a, + "key"_a, + DOC(ViewingRules, getCustomKeyName)) + .def( + "getCustomKeyValue", + &ViewingRules::getCustomKeyValue, + "ruleIndex"_a, + "key"_a, + DOC(ViewingRules, getCustomKeyValue)) + .def( + "setCustomKey", + &ViewingRules::setCustomKey, + "ruleIndex"_a, + "key"_a, + "value"_a, + DOC(ViewingRules, setCustomKey)) + .def( + "insertRule", + (void(ViewingRules::*)(size_t, const char *)) & ViewingRules::insertRule, + "ruleIndex"_a, + "name"_a, + DOC(ViewingRules, insertRule)) + .def("removeRule", &ViewingRules::removeRule, "ruleIndex"_a, DOC(ViewingRules, removeRule)); defRepr(clsViewingRules); clsViewingRuleColorSpaceIterator - .def("__len__", [](ViewingRuleColorSpaceIterator & it) - { - return it.m_obj->getNumColorSpaces(std::get<0>(it.m_args)); + .def( + "__len__", + [](ViewingRuleColorSpaceIterator & it) { + return it.m_obj->getNumColorSpaces(std::get<0>(it.m_args)); }) - .def("__getitem__", [](ViewingRuleColorSpaceIterator & it, size_t i) - { + .def( + "__getitem__", + [](ViewingRuleColorSpaceIterator & it, size_t i) { size_t ruleIndex = std::get<0>(it.m_args); - it.checkIndex(static_cast(i), - static_cast(it.m_obj->getNumColorSpaces(ruleIndex))); + it.checkIndex( + static_cast(i), + static_cast(it.m_obj->getNumColorSpaces(ruleIndex))); return it.m_obj->getColorSpace(std::get<0>(it.m_args), i); }) - .def("__iter__", [](ViewingRuleColorSpaceIterator & it) -> ViewingRuleColorSpaceIterator & - { - return it; + .def( + "__iter__", + [](ViewingRuleColorSpaceIterator & it) -> ViewingRuleColorSpaceIterator & { + return it; }) - .def("__next__", [](ViewingRuleColorSpaceIterator & it) - { - size_t ruleIndex = std::get<0>(it.m_args); - int i = it.nextIndex(static_cast(it.m_obj->getNumColorSpaces(ruleIndex))); - return it.m_obj->getColorSpace(std::get<0>(it.m_args), i); - }); + .def("__next__", [](ViewingRuleColorSpaceIterator & it) { + size_t ruleIndex = std::get<0>(it.m_args); + int i = it.nextIndex(static_cast(it.m_obj->getNumColorSpaces(ruleIndex))); + return it.m_obj->getColorSpace(std::get<0>(it.m_args), i); + }); clsViewingRuleEncodingIterator - .def("__len__", [](ViewingRuleEncodingIterator & it) - { - return it.m_obj->getNumEncodings(std::get<0>(it.m_args)); + .def( + "__len__", + [](ViewingRuleEncodingIterator & it) { + return it.m_obj->getNumEncodings(std::get<0>(it.m_args)); }) - .def("__getitem__", [](ViewingRuleEncodingIterator & it, size_t i) - { + .def( + "__getitem__", + [](ViewingRuleEncodingIterator & it, size_t i) { size_t ruleIndex = std::get<0>(it.m_args); - it.checkIndex(static_cast(i), - static_cast(it.m_obj->getNumEncodings(ruleIndex))); + it.checkIndex( + static_cast(i), + static_cast(it.m_obj->getNumEncodings(ruleIndex))); return it.m_obj->getEncoding(std::get<0>(it.m_args), i); }) - .def("__iter__", [](ViewingRuleEncodingIterator & it) -> ViewingRuleEncodingIterator & - { - return it; - }) - .def("__next__", [](ViewingRuleEncodingIterator & it) - { - size_t ruleIndex = std::get<0>(it.m_args); - int i = it.nextIndex(static_cast(it.m_obj->getNumEncodings(ruleIndex))); - return it.m_obj->getEncoding(std::get<0>(it.m_args), i); - }); + .def( + "__iter__", + [](ViewingRuleEncodingIterator & it) -> ViewingRuleEncodingIterator & { return it; }) + .def("__next__", [](ViewingRuleEncodingIterator & it) { + size_t ruleIndex = std::get<0>(it.m_args); + int i = it.nextIndex(static_cast(it.m_obj->getNumEncodings(ruleIndex))); + return it.m_obj->getEncoding(std::get<0>(it.m_args), i); + }); } } // namespace OCIO_NAMESPACE diff --git a/src/bindings/python/apphelpers/PyColorSpaceHelpers.cpp b/src/bindings/python/apphelpers/PyColorSpaceHelpers.cpp index 5106820eb1..8e54438d3c 100644 --- a/src/bindings/python/apphelpers/PyColorSpaceHelpers.cpp +++ b/src/bindings/python/apphelpers/PyColorSpaceHelpers.cpp @@ -15,217 +15,286 @@ enum ParametersIterator IT_PARAMETERS_ADDED_COLORSPACE = 0 }; -using AddedColorSpaceIterator = PyIterator; +using AddedColorSpaceIterator + = PyIterator; enum MenuIterator { IT_MENU_HIERARCHY_LEVEL = 0 }; -using ColorSpaceLevelIterator = PyIterator; +using ColorSpaceLevelIterator + = PyIterator; } // namespace void bindPyColorSpaceMenuHelpers(py::module & m) { auto mColorSpaceHelpers = m.def_submodule("ColorSpaceHelpers") - .def("AddColorSpace", &ColorSpaceHelpers::AddColorSpace, - "config"_a.none(false), - "name"_a.none(false), - "transformFilePath"_a.none(false), - "categories"_a = "", - "connectionColorSpaceName"_a.none(false), - DOC(ColorSpaceHelpers, AddColorSpace)); - - auto clsColorSpaceMenuParameters = - py::class_( + .def( + "AddColorSpace", + &ColorSpaceHelpers::AddColorSpace, + "config"_a.none(false), + "name"_a.none(false), + "transformFilePath"_a.none(false), + "categories"_a = "", + "connectionColorSpaceName"_a.none(false), + DOC(ColorSpaceHelpers, AddColorSpace)); + + auto clsColorSpaceMenuParameters + = py::class_( m.attr("ColorSpaceMenuParameters")); - auto clsAddedColorSpaceIterator = - py::class_( - clsColorSpaceMenuParameters, "AddedColorSpaceIterator"); + auto clsAddedColorSpaceIterator = py::class_( + clsColorSpaceMenuParameters, + "AddedColorSpaceIterator"); - auto clsColorSpaceMenuHelper = - py::class_( - m.attr("ColorSpaceMenuHelper")); + auto clsColorSpaceMenuHelper = py::class_( + m.attr("ColorSpaceMenuHelper")); - auto clsColorSpaceLevelIterator = - py::class_( - clsColorSpaceMenuHelper, "ColorSpaceLevelIterator"); + auto clsColorSpaceLevelIterator + = py::class_(clsColorSpaceMenuHelper, "ColorSpaceLevelIterator"); clsColorSpaceMenuParameters - .def(py::init(&ColorSpaceMenuParameters::Create), - "config"_a.none(false), - DOC(ColorSpaceMenuParameters, Create)) - .def(py::init([](ConstConfigRcPtr config, - const std::string & role, - bool includeColorSpaces, - SearchReferenceSpaceType searchReferenceSpaceType, - bool includeNamedTransforms, - const std::string & appCategories, - const std::string & encodings, - const std::string & userCategories, - bool includeRoles) - { - ColorSpaceMenuParametersRcPtr p = ColorSpaceMenuParameters::Create(config); - if (!role.empty()) - { - p->setRole(role.c_str()); - } - if (!appCategories.empty()) - { - p->setAppCategories(appCategories.c_str()); - } - if (!userCategories.empty()) - { - p->setUserCategories(userCategories.c_str()); - } - if (!encodings.empty()) - { - p->setEncodings(encodings.c_str()); - } - p->setSearchReferenceSpaceType(searchReferenceSpaceType); - p->setIncludeColorSpaces(includeColorSpaces); - p->setIncludeRoles(includeRoles); - p->setIncludeNamedTransforms(includeNamedTransforms); - return p; + .def( + py::init(&ColorSpaceMenuParameters::Create), + "config"_a.none(false), + DOC(ColorSpaceMenuParameters, Create)) + .def( + py::init([](ConstConfigRcPtr config, + const std::string & role, + bool includeColorSpaces, + SearchReferenceSpaceType searchReferenceSpaceType, + bool includeNamedTransforms, + const std::string & appCategories, + const std::string & encodings, + const std::string & userCategories, + bool includeRoles) { + ColorSpaceMenuParametersRcPtr p = ColorSpaceMenuParameters::Create(config); + if (!role.empty()) + { + p->setRole(role.c_str()); + } + if (!appCategories.empty()) + { + p->setAppCategories(appCategories.c_str()); + } + if (!userCategories.empty()) + { + p->setUserCategories(userCategories.c_str()); + } + if (!encodings.empty()) + { + p->setEncodings(encodings.c_str()); + } + p->setSearchReferenceSpaceType(searchReferenceSpaceType); + p->setIncludeColorSpaces(includeColorSpaces); + p->setIncludeRoles(includeRoles); + p->setIncludeNamedTransforms(includeNamedTransforms); + return p; }), - "config"_a.none(false), - "role"_a.none(false) = "", - "includeColorSpaces"_a = true, - "searchReferenceSpaceType"_a = SEARCH_REFERENCE_SPACE_ALL, - "includeNamedTransforms"_a = false, - "appCategories"_a.none(false) = "", - "encodings"_a.none(false) = "", - "userCategories"_a.none(false) = "", - "includeRoles"_a = false, - DOC(ColorSpaceMenuParameters, Create)) - - .def("getConfig", &ColorSpaceMenuParameters::getConfig, - DOC(ColorSpaceMenuParameters, getConfig)) - .def("setConfig", &ColorSpaceMenuParameters::setConfig, "config"_a.none(false), - DOC(ColorSpaceMenuParameters, setConfig)) - .def("getRole", &ColorSpaceMenuParameters::getRole, - DOC(ColorSpaceMenuParameters, getRole)) - .def("setRole", &ColorSpaceMenuParameters::setRole, "role"_a.none(false), - DOC(ColorSpaceMenuParameters, setRole)) - .def("getIncludeColorSpaces", &ColorSpaceMenuParameters::getIncludeColorSpaces, - DOC(ColorSpaceMenuParameters, getIncludeColorSpaces)) - .def("setIncludeColorSpaces", &ColorSpaceMenuParameters::setIncludeColorSpaces, - "includeColorSpaces"_a = true, - DOC(ColorSpaceMenuParameters, setIncludeColorSpaces)) - .def("getSearchReferenceSpaceType", &ColorSpaceMenuParameters::getSearchReferenceSpaceType, - DOC(ColorSpaceMenuParameters, getSearchReferenceSpaceType)) - .def("setSearchReferenceSpaceType", &ColorSpaceMenuParameters::setSearchReferenceSpaceType, - "searchReferenceSpaceType"_a.none(false), - DOC(ColorSpaceMenuParameters, setSearchReferenceSpaceType)) - .def("getIncludeNamedTransforms", &ColorSpaceMenuParameters::getIncludeNamedTransforms, - DOC(ColorSpaceMenuParameters, getIncludeNamedTransforms)) - .def("setIncludeNamedTransforms", &ColorSpaceMenuParameters::setIncludeNamedTransforms, - "includeNamedTransforms"_a = true, - DOC(ColorSpaceMenuParameters, setIncludeNamedTransforms)) - .def("getEncodings", &ColorSpaceMenuParameters::getEncodings, - DOC(ColorSpaceMenuParameters, getEncodings)) - .def("setEncodings", &ColorSpaceMenuParameters::setEncodings, "encodings"_a.none(false), - DOC(ColorSpaceMenuParameters, setEncodings)) - .def("getAppCategories", &ColorSpaceMenuParameters::getAppCategories, - DOC(ColorSpaceMenuParameters, getAppCategories)) - .def("setAppCategories", &ColorSpaceMenuParameters::setAppCategories, - "appCategories"_a.none(false), - DOC(ColorSpaceMenuParameters, setAppCategories)) - .def("getUserCategories", &ColorSpaceMenuParameters::getUserCategories, - DOC(ColorSpaceMenuParameters, getUserCategories)) - .def("setUserCategories", &ColorSpaceMenuParameters::setUserCategories, - "categories"_a.none(false), - DOC(ColorSpaceMenuParameters, setUserCategories)) - .def("getIncludeRoles", &ColorSpaceMenuParameters::getIncludeRoles, - DOC(ColorSpaceMenuParameters, getIncludeRoles)) - .def("setIncludeRoles", &ColorSpaceMenuParameters::setIncludeRoles, - "includeRoles"_a = true, - DOC(ColorSpaceMenuParameters, setIncludeRoles)) - .def("addColorSpace", &ColorSpaceMenuParameters::addColorSpace, - "colorSpace"_a.none(false), - DOC(ColorSpaceMenuParameters, addColorSpace)) - .def("getAddedColorSpaces", [](ColorSpaceMenuParametersRcPtr & self) - { - return AddedColorSpaceIterator(self); - }) - .def("clearAddedColorSpaces", &ColorSpaceMenuParameters::clearAddedColorSpaces, - DOC(ColorSpaceMenuParameters, clearAddedColorSpaces)); + "config"_a.none(false), + "role"_a.none(false) = "", + "includeColorSpaces"_a = true, + "searchReferenceSpaceType"_a = SEARCH_REFERENCE_SPACE_ALL, + "includeNamedTransforms"_a = false, + "appCategories"_a.none(false) = "", + "encodings"_a.none(false) = "", + "userCategories"_a.none(false) = "", + "includeRoles"_a = false, + DOC(ColorSpaceMenuParameters, Create)) + + .def( + "getConfig", + &ColorSpaceMenuParameters::getConfig, + DOC(ColorSpaceMenuParameters, getConfig)) + .def( + "setConfig", + &ColorSpaceMenuParameters::setConfig, + "config"_a.none(false), + DOC(ColorSpaceMenuParameters, setConfig)) + .def("getRole", &ColorSpaceMenuParameters::getRole, DOC(ColorSpaceMenuParameters, getRole)) + .def( + "setRole", + &ColorSpaceMenuParameters::setRole, + "role"_a.none(false), + DOC(ColorSpaceMenuParameters, setRole)) + .def( + "getIncludeColorSpaces", + &ColorSpaceMenuParameters::getIncludeColorSpaces, + DOC(ColorSpaceMenuParameters, getIncludeColorSpaces)) + .def( + "setIncludeColorSpaces", + &ColorSpaceMenuParameters::setIncludeColorSpaces, + "includeColorSpaces"_a = true, + DOC(ColorSpaceMenuParameters, setIncludeColorSpaces)) + .def( + "getSearchReferenceSpaceType", + &ColorSpaceMenuParameters::getSearchReferenceSpaceType, + DOC(ColorSpaceMenuParameters, getSearchReferenceSpaceType)) + .def( + "setSearchReferenceSpaceType", + &ColorSpaceMenuParameters::setSearchReferenceSpaceType, + "searchReferenceSpaceType"_a.none(false), + DOC(ColorSpaceMenuParameters, setSearchReferenceSpaceType)) + .def( + "getIncludeNamedTransforms", + &ColorSpaceMenuParameters::getIncludeNamedTransforms, + DOC(ColorSpaceMenuParameters, getIncludeNamedTransforms)) + .def( + "setIncludeNamedTransforms", + &ColorSpaceMenuParameters::setIncludeNamedTransforms, + "includeNamedTransforms"_a = true, + DOC(ColorSpaceMenuParameters, setIncludeNamedTransforms)) + .def( + "getEncodings", + &ColorSpaceMenuParameters::getEncodings, + DOC(ColorSpaceMenuParameters, getEncodings)) + .def( + "setEncodings", + &ColorSpaceMenuParameters::setEncodings, + "encodings"_a.none(false), + DOC(ColorSpaceMenuParameters, setEncodings)) + .def( + "getAppCategories", + &ColorSpaceMenuParameters::getAppCategories, + DOC(ColorSpaceMenuParameters, getAppCategories)) + .def( + "setAppCategories", + &ColorSpaceMenuParameters::setAppCategories, + "appCategories"_a.none(false), + DOC(ColorSpaceMenuParameters, setAppCategories)) + .def( + "getUserCategories", + &ColorSpaceMenuParameters::getUserCategories, + DOC(ColorSpaceMenuParameters, getUserCategories)) + .def( + "setUserCategories", + &ColorSpaceMenuParameters::setUserCategories, + "categories"_a.none(false), + DOC(ColorSpaceMenuParameters, setUserCategories)) + .def( + "getIncludeRoles", + &ColorSpaceMenuParameters::getIncludeRoles, + DOC(ColorSpaceMenuParameters, getIncludeRoles)) + .def( + "setIncludeRoles", + &ColorSpaceMenuParameters::setIncludeRoles, + "includeRoles"_a = true, + DOC(ColorSpaceMenuParameters, setIncludeRoles)) + .def( + "addColorSpace", + &ColorSpaceMenuParameters::addColorSpace, + "colorSpace"_a.none(false), + DOC(ColorSpaceMenuParameters, addColorSpace)) + .def( + "getAddedColorSpaces", + [](ColorSpaceMenuParametersRcPtr & self) { return AddedColorSpaceIterator(self); }) + .def( + "clearAddedColorSpaces", + &ColorSpaceMenuParameters::clearAddedColorSpaces, + DOC(ColorSpaceMenuParameters, clearAddedColorSpaces)); defRepr(clsColorSpaceMenuParameters); clsAddedColorSpaceIterator - .def("__len__", [](AddedColorSpaceIterator & it) - { - return it.m_obj->getNumAddedColorSpaces(); - }) - .def("__getitem__", [](AddedColorSpaceIterator & it, int i) - { + .def( + "__len__", + [](AddedColorSpaceIterator & it) { return it.m_obj->getNumAddedColorSpaces(); }) + .def( + "__getitem__", + [](AddedColorSpaceIterator & it, int i) { it.checkIndex(i, (int)it.m_obj->getNumAddedColorSpaces()); return it.m_obj->getAddedColorSpace(i); }) - .def("__iter__", [](AddedColorSpaceIterator & it) -> AddedColorSpaceIterator & - { - return it; - }) - .def("__next__", [](AddedColorSpaceIterator & it) - { - int i = it.nextIndex((int)it.m_obj->getNumAddedColorSpaces()); - return it.m_obj->getAddedColorSpace(i); - }); + .def( + "__iter__", + [](AddedColorSpaceIterator & it) -> AddedColorSpaceIterator & { return it; }) + .def("__next__", [](AddedColorSpaceIterator & it) { + int i = it.nextIndex((int)it.m_obj->getNumAddedColorSpaces()); + return it.m_obj->getAddedColorSpace(i); + }); clsColorSpaceMenuHelper - .def(py::init(&ColorSpaceMenuHelper::Create), "parameters"_a.none(false), - DOC(ColorSpaceMenuHelper, Create)) - .def("getNumColorSpaces", &ColorSpaceMenuHelper::getNumColorSpaces, - DOC(ColorSpaceMenuHelper, getNumColorSpaces)) - .def("getName", &ColorSpaceMenuHelper::getName, "index"_a, - DOC(ColorSpaceMenuHelper, getName)) - .def("getUIName", &ColorSpaceMenuHelper::getUIName, "index"_a, - DOC(ColorSpaceMenuHelper, getUIName)) - .def("getIndexFromName", &ColorSpaceMenuHelper::getIndexFromName, "name"_a.none(false), - DOC(ColorSpaceMenuHelper, getIndexFromName)) - .def("getIndexFromUIName", &ColorSpaceMenuHelper::getIndexFromUIName, "name"_a.none(false), - DOC(ColorSpaceMenuHelper, getIndexFromUIName)) - .def("getDescription", &ColorSpaceMenuHelper::getDescription, "index"_a, - DOC(ColorSpaceMenuHelper, getDescription)) - .def("getFamily", &ColorSpaceMenuHelper::getFamily, "index"_a, - DOC(ColorSpaceMenuHelper, getFamily)) - .def("getHierarchyLevels", - [](ColorSpaceMenuHelperRcPtr & self, size_t index) - { - return ColorSpaceLevelIterator(self, index); - }, - "index"_a) - .def("getNameFromUIName", &ColorSpaceMenuHelper::getNameFromUIName, "name"_a.none(false), - DOC(ColorSpaceMenuHelper, getNameFromUIName)) - .def("getUINameFromName", &ColorSpaceMenuHelper::getUINameFromName, "name"_a.none(false), - DOC(ColorSpaceMenuHelper, getUINameFromName)); + .def( + py::init(&ColorSpaceMenuHelper::Create), + "parameters"_a.none(false), + DOC(ColorSpaceMenuHelper, Create)) + .def( + "getNumColorSpaces", + &ColorSpaceMenuHelper::getNumColorSpaces, + DOC(ColorSpaceMenuHelper, getNumColorSpaces)) + .def( + "getName", + &ColorSpaceMenuHelper::getName, + "index"_a, + DOC(ColorSpaceMenuHelper, getName)) + .def( + "getUIName", + &ColorSpaceMenuHelper::getUIName, + "index"_a, + DOC(ColorSpaceMenuHelper, getUIName)) + .def( + "getIndexFromName", + &ColorSpaceMenuHelper::getIndexFromName, + "name"_a.none(false), + DOC(ColorSpaceMenuHelper, getIndexFromName)) + .def( + "getIndexFromUIName", + &ColorSpaceMenuHelper::getIndexFromUIName, + "name"_a.none(false), + DOC(ColorSpaceMenuHelper, getIndexFromUIName)) + .def( + "getDescription", + &ColorSpaceMenuHelper::getDescription, + "index"_a, + DOC(ColorSpaceMenuHelper, getDescription)) + .def( + "getFamily", + &ColorSpaceMenuHelper::getFamily, + "index"_a, + DOC(ColorSpaceMenuHelper, getFamily)) + .def( + "getHierarchyLevels", + [](ColorSpaceMenuHelperRcPtr & self, size_t index) { + return ColorSpaceLevelIterator(self, index); + }, + "index"_a) + .def( + "getNameFromUIName", + &ColorSpaceMenuHelper::getNameFromUIName, + "name"_a.none(false), + DOC(ColorSpaceMenuHelper, getNameFromUIName)) + .def( + "getUINameFromName", + &ColorSpaceMenuHelper::getUINameFromName, + "name"_a.none(false), + DOC(ColorSpaceMenuHelper, getUINameFromName)); defRepr(clsColorSpaceMenuHelper); clsColorSpaceLevelIterator - .def("__len__", [](ColorSpaceLevelIterator & it) - { - return it.m_obj->getNumHierarchyLevels(std::get<0>(it.m_args)); - }) - .def("__getitem__", [](ColorSpaceLevelIterator & it, int i) - { - it.checkIndex(i, static_cast(it.m_obj->getNumHierarchyLevels(std::get<0>(it.m_args)))); - return it.m_obj->getHierarchyLevel(std::get<0>(it.m_args), static_cast(i)); - }) - .def("__iter__", [](ColorSpaceLevelIterator & it) -> ColorSpaceLevelIterator & - { - return it; - }) - .def("__next__", [](ColorSpaceLevelIterator & it) - { - int i = it.nextIndex(static_cast(it.m_obj->getNumHierarchyLevels(std::get<0>(it.m_args)))); - return it.m_obj->getHierarchyLevel(std::get<0>(it.m_args), static_cast(i)); - }); + .def( + "__len__", + [](ColorSpaceLevelIterator & it) { + return it.m_obj->getNumHierarchyLevels(std::get<0>(it.m_args)); + }) + .def( + "__getitem__", + [](ColorSpaceLevelIterator & it, int i) { + it.checkIndex( + i, + static_cast(it.m_obj->getNumHierarchyLevels(std::get<0>(it.m_args)))); + return it.m_obj->getHierarchyLevel(std::get<0>(it.m_args), static_cast(i)); + }) + .def( + "__iter__", + [](ColorSpaceLevelIterator & it) -> ColorSpaceLevelIterator & { return it; }) + .def("__next__", [](ColorSpaceLevelIterator & it) { + int i = it.nextIndex( + static_cast(it.m_obj->getNumHierarchyLevels(std::get<0>(it.m_args)))); + return it.m_obj->getHierarchyLevel(std::get<0>(it.m_args), static_cast(i)); + }); } } // namespace OCIO_NAMESPACE diff --git a/src/bindings/python/apphelpers/PyDisplayViewHelpers.cpp b/src/bindings/python/apphelpers/PyDisplayViewHelpers.cpp index 104d0845e6..8d69c11d8c 100644 --- a/src/bindings/python/apphelpers/PyDisplayViewHelpers.cpp +++ b/src/bindings/python/apphelpers/PyDisplayViewHelpers.cpp @@ -8,71 +8,83 @@ namespace OCIO_NAMESPACE void bindPyDisplayViewHelpers(py::module & m) { - auto mDisplayViewHelpers = m.def_submodule("DisplayViewHelpers") - .def("GetProcessor", [](const ConstConfigRcPtr & config, - const ConstContextRcPtr & context, - const char * workingName, - const char * displayName, - const char * viewName, - const ConstMatrixTransformRcPtr & channelView, - TransformDirection direction) - { - ConstContextRcPtr usedContext = context ? context : config->getCurrentContext(); - return DisplayViewHelpers::GetProcessor(config, - usedContext, - workingName, - displayName, - viewName, - channelView, - direction); - }, - "config"_a.none(false), - "context"_a = ConstContextRcPtr(), - "workingSpaceName"_a.none(false), - "displayName"_a.none(false), - "viewName"_a.none(false), - "channelView"_a = ConstMatrixTransformRcPtr(), - "direction"_a = TRANSFORM_DIR_FORWARD, - DOC(DisplayViewHelpers, GetProcessor)) - .def("GetIdentityProcessor", &DisplayViewHelpers::GetIdentityProcessor, - "config"_a.none(false), - DOC(DisplayViewHelpers, GetIdentityProcessor)) - .def("AddDisplayView", [](ConfigRcPtr & config, - const std::string & displayName, - const std::string & viewName, - const std::string & lookName, // Could be empty - const std::string & colorSpaceName, // Could be empty - const std::string & colorSpaceFamily, // Could be empty - const std::string & colorSpaceDescription, // Could be empty - const std::string & categories, // Could be empty - const std::string & transformFilePath, - const std::string & connectionColorSpaceName) - { - DisplayViewHelpers::AddDisplayView(config, - displayName.c_str(), - viewName.c_str(), - lookName.c_str(), - colorSpaceName.c_str(), - colorSpaceFamily.c_str(), - colorSpaceDescription.c_str(), - categories.c_str(), - transformFilePath.c_str(), - connectionColorSpaceName.c_str()); - }, - "config"_a.none(false), - "displayName"_a, - "viewName"_a, - "lookName"_a = std::string(""), - "colorSpaceName"_a = std::string(""), - "colorSpaceFamily"_a = std::string(""), - "colorSpaceDescription"_a = std::string(""), - "colorSpaceCategories"_a = std::string(""), - "transformFilePath"_a, - "connectionColorSpaceName"_a, - DOC(DisplayViewHelpers, AddDisplayView)) - .def("RemoveDisplayView", &DisplayViewHelpers::RemoveDisplayView, - "config"_a.none(false), "displayName"_a.none(false), "viewName"_a.none(false), - DOC(DisplayViewHelpers, RemoveDisplayView)); + auto mDisplayViewHelpers + = m.def_submodule("DisplayViewHelpers") + .def( + "GetProcessor", + [](const ConstConfigRcPtr & config, + const ConstContextRcPtr & context, + const char * workingName, + const char * displayName, + const char * viewName, + const ConstMatrixTransformRcPtr & channelView, + TransformDirection direction) { + ConstContextRcPtr usedContext + = context ? context : config->getCurrentContext(); + return DisplayViewHelpers::GetProcessor( + config, + usedContext, + workingName, + displayName, + viewName, + channelView, + direction); + }, + "config"_a.none(false), + "context"_a = ConstContextRcPtr(), + "workingSpaceName"_a.none(false), + "displayName"_a.none(false), + "viewName"_a.none(false), + "channelView"_a = ConstMatrixTransformRcPtr(), + "direction"_a = TRANSFORM_DIR_FORWARD, + DOC(DisplayViewHelpers, GetProcessor)) + .def( + "GetIdentityProcessor", + &DisplayViewHelpers::GetIdentityProcessor, + "config"_a.none(false), + DOC(DisplayViewHelpers, GetIdentityProcessor)) + .def( + "AddDisplayView", + [](ConfigRcPtr & config, + const std::string & displayName, + const std::string & viewName, + const std::string & lookName, // Could be empty + const std::string & colorSpaceName, // Could be empty + const std::string & colorSpaceFamily, // Could be empty + const std::string & colorSpaceDescription, // Could be empty + const std::string & categories, // Could be empty + const std::string & transformFilePath, + const std::string & connectionColorSpaceName) { + DisplayViewHelpers::AddDisplayView( + config, + displayName.c_str(), + viewName.c_str(), + lookName.c_str(), + colorSpaceName.c_str(), + colorSpaceFamily.c_str(), + colorSpaceDescription.c_str(), + categories.c_str(), + transformFilePath.c_str(), + connectionColorSpaceName.c_str()); + }, + "config"_a.none(false), + "displayName"_a, + "viewName"_a, + "lookName"_a = std::string(""), + "colorSpaceName"_a = std::string(""), + "colorSpaceFamily"_a = std::string(""), + "colorSpaceDescription"_a = std::string(""), + "colorSpaceCategories"_a = std::string(""), + "transformFilePath"_a, + "connectionColorSpaceName"_a, + DOC(DisplayViewHelpers, AddDisplayView)) + .def( + "RemoveDisplayView", + &DisplayViewHelpers::RemoveDisplayView, + "config"_a.none(false), + "displayName"_a.none(false), + "viewName"_a.none(false), + DOC(DisplayViewHelpers, RemoveDisplayView)); } } // namespace OCIO_NAMESPACE diff --git a/src/bindings/python/apphelpers/PyLegacyViewingPipeline.cpp b/src/bindings/python/apphelpers/PyLegacyViewingPipeline.cpp index 0ea459c11c..2a833a6b8a 100644 --- a/src/bindings/python/apphelpers/PyLegacyViewingPipeline.cpp +++ b/src/bindings/python/apphelpers/PyLegacyViewingPipeline.cpp @@ -9,50 +9,80 @@ namespace OCIO_NAMESPACE void bindPyLegacyViewingPipeline(py::module & m) { - auto clsLegacyViewingPipeline = - py::class_( - m.attr("LegacyViewingPipeline")) + auto clsLegacyViewingPipeline + = py::class_( + m.attr("LegacyViewingPipeline")) - .def(py::init(&LegacyViewingPipeline::Create), - DOC(LegacyViewingPipeline, Create)) - .def("getDisplayViewTransform", &LegacyViewingPipeline::getDisplayViewTransform, - DOC(LegacyViewingPipeline, getDisplayViewTransform)) - .def("setDisplayViewTransform", &LegacyViewingPipeline::setDisplayViewTransform, - DOC(LegacyViewingPipeline, setDisplayViewTransform)) - .def("getLinearCC", &LegacyViewingPipeline::getLinearCC, - DOC(LegacyViewingPipeline, getLinearCC)) - .def("setLinearCC", &LegacyViewingPipeline::setLinearCC, - DOC(LegacyViewingPipeline, setLinearCC)) - .def("getColorTimingCC", &LegacyViewingPipeline::getColorTimingCC, - DOC(LegacyViewingPipeline, getColorTimingCC)) - .def("setColorTimingCC", &LegacyViewingPipeline::setColorTimingCC, - DOC(LegacyViewingPipeline, setColorTimingCC)) - .def("getChannelView", &LegacyViewingPipeline::getChannelView, - DOC(LegacyViewingPipeline, getChannelView)) - .def("setChannelView", &LegacyViewingPipeline::setChannelView, - DOC(LegacyViewingPipeline, setChannelView)) - .def("getDisplayCC", &LegacyViewingPipeline::getDisplayCC, - DOC(LegacyViewingPipeline, getDisplayCC)) - .def("setDisplayCC", &LegacyViewingPipeline::setDisplayCC, - DOC(LegacyViewingPipeline, setDisplayCC)) - .def("setLooksOverrideEnabled", &LegacyViewingPipeline::setLooksOverrideEnabled, - DOC(LegacyViewingPipeline, setLooksOverrideEnabled)) - .def("getLooksOverrideEnabled", &LegacyViewingPipeline::getLooksOverrideEnabled, - DOC(LegacyViewingPipeline, getLooksOverrideEnabled)) - .def("setLooksOverride", &LegacyViewingPipeline::setLooksOverride, "looks"_a.none(false), - DOC(LegacyViewingPipeline, setLooksOverride)) - .def("getLooksOverride", &LegacyViewingPipeline::getLooksOverride, - DOC(LegacyViewingPipeline, getLooksOverride)) - .def("getProcessor", [](LegacyViewingPipelineRcPtr & self, - const ConstConfigRcPtr & config, - const ConstContextRcPtr & context) - { - ConstContextRcPtr usedContext = context ? context : config->getCurrentContext(); - return self->getProcessor(config, usedContext); - }, - "config"_a.none(false), - "context"_a = ConstContextRcPtr(), - DOC(LegacyViewingPipeline, getProcessor)); + .def(py::init(&LegacyViewingPipeline::Create), DOC(LegacyViewingPipeline, Create)) + .def( + "getDisplayViewTransform", + &LegacyViewingPipeline::getDisplayViewTransform, + DOC(LegacyViewingPipeline, getDisplayViewTransform)) + .def( + "setDisplayViewTransform", + &LegacyViewingPipeline::setDisplayViewTransform, + DOC(LegacyViewingPipeline, setDisplayViewTransform)) + .def( + "getLinearCC", + &LegacyViewingPipeline::getLinearCC, + DOC(LegacyViewingPipeline, getLinearCC)) + .def( + "setLinearCC", + &LegacyViewingPipeline::setLinearCC, + DOC(LegacyViewingPipeline, setLinearCC)) + .def( + "getColorTimingCC", + &LegacyViewingPipeline::getColorTimingCC, + DOC(LegacyViewingPipeline, getColorTimingCC)) + .def( + "setColorTimingCC", + &LegacyViewingPipeline::setColorTimingCC, + DOC(LegacyViewingPipeline, setColorTimingCC)) + .def( + "getChannelView", + &LegacyViewingPipeline::getChannelView, + DOC(LegacyViewingPipeline, getChannelView)) + .def( + "setChannelView", + &LegacyViewingPipeline::setChannelView, + DOC(LegacyViewingPipeline, setChannelView)) + .def( + "getDisplayCC", + &LegacyViewingPipeline::getDisplayCC, + DOC(LegacyViewingPipeline, getDisplayCC)) + .def( + "setDisplayCC", + &LegacyViewingPipeline::setDisplayCC, + DOC(LegacyViewingPipeline, setDisplayCC)) + .def( + "setLooksOverrideEnabled", + &LegacyViewingPipeline::setLooksOverrideEnabled, + DOC(LegacyViewingPipeline, setLooksOverrideEnabled)) + .def( + "getLooksOverrideEnabled", + &LegacyViewingPipeline::getLooksOverrideEnabled, + DOC(LegacyViewingPipeline, getLooksOverrideEnabled)) + .def( + "setLooksOverride", + &LegacyViewingPipeline::setLooksOverride, + "looks"_a.none(false), + DOC(LegacyViewingPipeline, setLooksOverride)) + .def( + "getLooksOverride", + &LegacyViewingPipeline::getLooksOverride, + DOC(LegacyViewingPipeline, getLooksOverride)) + .def( + "getProcessor", + [](LegacyViewingPipelineRcPtr & self, + const ConstConfigRcPtr & config, + const ConstContextRcPtr & context) { + ConstContextRcPtr usedContext + = context ? context : config->getCurrentContext(); + return self->getProcessor(config, usedContext); + }, + "config"_a.none(false), + "context"_a = ConstContextRcPtr(), + DOC(LegacyViewingPipeline, getProcessor)); defRepr(clsLegacyViewingPipeline); } diff --git a/src/bindings/python/apphelpers/PyMixingHelpers.cpp b/src/bindings/python/apphelpers/PyMixingHelpers.cpp index 5711b11820..e15f9c4828 100644 --- a/src/bindings/python/apphelpers/PyMixingHelpers.cpp +++ b/src/bindings/python/apphelpers/PyMixingHelpers.cpp @@ -18,137 +18,162 @@ enum MixingColorSpaceManagerIterator IT_MIXING_ENCODING }; -using MixingSpaceIterator = PyIterator; +using MixingSpaceIterator = PyIterator; using MixingEncodingIterator = PyIterator; } // namespace void bindPyMixingHelpers(py::module & m) { - auto clsMixingSlider = - py::class_( - m.attr("MixingSlider")); + auto clsMixingSlider = py::class_(m.attr("MixingSlider")); - auto clsMixingColorSpaceManager = - py::class_( - m.attr("MixingColorSpaceManager")); + auto clsMixingColorSpaceManager + = py::class_( + m.attr("MixingColorSpaceManager")); - auto clsMixingSpaceIterator = - py::class_( - clsMixingColorSpaceManager, "MixingSpaceIterator"); + auto clsMixingSpaceIterator + = py::class_(clsMixingColorSpaceManager, "MixingSpaceIterator"); - auto clsMixingEncodingIterator = - py::class_( - clsMixingColorSpaceManager, "MixingEncodingIterator"); + auto clsMixingEncodingIterator + = py::class_(clsMixingColorSpaceManager, "MixingEncodingIterator"); clsMixingSlider - .def("setSliderMinEdge", &MixingSlider::setSliderMinEdge, - DOC(MixingSlider, setSliderMinEdge)) - .def("getSliderMinEdge", &MixingSlider::getSliderMinEdge, - DOC(MixingSlider, getSliderMinEdge)) - .def("setSliderMaxEdge", &MixingSlider::setSliderMaxEdge, - DOC(MixingSlider, setSliderMaxEdge)) - .def("getSliderMaxEdge", &MixingSlider::getSliderMaxEdge, - DOC(MixingSlider, getSliderMaxEdge)) - .def("sliderToMixing", &MixingSlider::sliderToMixing, "sliderUnits"_a, - DOC(MixingSlider, sliderToMixing)) - .def("mixingToSlider", &MixingSlider::mixingToSlider, "mixingUnits"_a, - DOC(MixingSlider, mixingToSlider)); + .def( + "setSliderMinEdge", + &MixingSlider::setSliderMinEdge, + DOC(MixingSlider, setSliderMinEdge)) + .def( + "getSliderMinEdge", + &MixingSlider::getSliderMinEdge, + DOC(MixingSlider, getSliderMinEdge)) + .def( + "setSliderMaxEdge", + &MixingSlider::setSliderMaxEdge, + DOC(MixingSlider, setSliderMaxEdge)) + .def( + "getSliderMaxEdge", + &MixingSlider::getSliderMaxEdge, + DOC(MixingSlider, getSliderMaxEdge)) + .def( + "sliderToMixing", + &MixingSlider::sliderToMixing, + "sliderUnits"_a, + DOC(MixingSlider, sliderToMixing)) + .def( + "mixingToSlider", + &MixingSlider::mixingToSlider, + "mixingUnits"_a, + DOC(MixingSlider, mixingToSlider)); defRepr(clsMixingSlider); clsMixingColorSpaceManager - .def(py::init([](ConstConfigRcPtr & config) - { - return MixingColorSpaceManager::Create(config); - }), - "config"_a.none(false), - DOC(MixingColorSpaceManager, Create)) - .def("getMixingSpaces", [](MixingColorSpaceManagerRcPtr & self) - { - return MixingSpaceIterator(self); - }) - .def("setSelectedMixingSpaceIdx", &MixingColorSpaceManager::setSelectedMixingSpaceIdx, - DOC(MixingColorSpaceManager, setSelectedMixingSpaceIdx)) - .def("setSelectedMixingSpace", &MixingColorSpaceManager::setSelectedMixingSpace, - "mixingSpace"_a.none(false), - DOC(MixingColorSpaceManager, setSelectedMixingSpace)) - .def("getSelectedMixingSpaceIdx", &MixingColorSpaceManager::getSelectedMixingSpaceIdx, - DOC(MixingColorSpaceManager, getSelectedMixingSpaceIdx)) - .def("isPerceptuallyUniform", &MixingColorSpaceManager::isPerceptuallyUniform, - DOC(MixingColorSpaceManager, isPerceptuallyUniform)) - .def("getMixingEncodings", [](MixingColorSpaceManagerRcPtr & self) - { - return MixingEncodingIterator(self); - }) - .def("setSelectedMixingEncodingIdx", &MixingColorSpaceManager::setSelectedMixingEncodingIdx, - DOC(MixingColorSpaceManager, setSelectedMixingEncodingIdx)) - .def("setSelectedMixingEncoding", &MixingColorSpaceManager::setSelectedMixingEncoding, - "mixingEncoding"_a.none(false), - DOC(MixingColorSpaceManager, setSelectedMixingEncoding)) - .def("getSelectedMixingEncodingIdx", &MixingColorSpaceManager::getSelectedMixingEncodingIdx, - DOC(MixingColorSpaceManager, getSelectedMixingEncodingIdx)) - .def("refresh", &MixingColorSpaceManager::refresh, "config"_a.none(false), - DOC(MixingColorSpaceManager, refresh)) - .def("getProcessor", &MixingColorSpaceManager::getProcessor, - "workingSpaceName"_a.none(false), - "displayName"_a.none(false), - "viewName"_a.none(false), - "direction"_a = TRANSFORM_DIR_FORWARD, - DOC(MixingColorSpaceManager, getProcessor)) - .def("getSlider", - (MixingSlider & (MixingColorSpaceManager::*)()) &MixingColorSpaceManager::getSlider, - py::return_value_policy::reference_internal, - DOC(MixingColorSpaceManager, getSlider)) - .def("getSlider", - (MixingSlider & (MixingColorSpaceManager::*)(float sliderMixingMinEdge, - float sliderMixingMaxEdge)) - &MixingColorSpaceManager::getSlider, - "sliderMixingMinEdge"_a.none(false), "sliderMixingMaxEdge"_a.none(false), - py::return_value_policy::reference_internal, - DOC(MixingColorSpaceManager, getSlider)); + .def( + py::init( + [](ConstConfigRcPtr & config) { return MixingColorSpaceManager::Create(config); }), + "config"_a.none(false), + DOC(MixingColorSpaceManager, Create)) + .def( + "getMixingSpaces", + [](MixingColorSpaceManagerRcPtr & self) { return MixingSpaceIterator(self); }) + .def( + "setSelectedMixingSpaceIdx", + &MixingColorSpaceManager::setSelectedMixingSpaceIdx, + DOC(MixingColorSpaceManager, setSelectedMixingSpaceIdx)) + .def( + "setSelectedMixingSpace", + &MixingColorSpaceManager::setSelectedMixingSpace, + "mixingSpace"_a.none(false), + DOC(MixingColorSpaceManager, setSelectedMixingSpace)) + .def( + "getSelectedMixingSpaceIdx", + &MixingColorSpaceManager::getSelectedMixingSpaceIdx, + DOC(MixingColorSpaceManager, getSelectedMixingSpaceIdx)) + .def( + "isPerceptuallyUniform", + &MixingColorSpaceManager::isPerceptuallyUniform, + DOC(MixingColorSpaceManager, isPerceptuallyUniform)) + .def( + "getMixingEncodings", + [](MixingColorSpaceManagerRcPtr & self) { return MixingEncodingIterator(self); }) + .def( + "setSelectedMixingEncodingIdx", + &MixingColorSpaceManager::setSelectedMixingEncodingIdx, + DOC(MixingColorSpaceManager, setSelectedMixingEncodingIdx)) + .def( + "setSelectedMixingEncoding", + &MixingColorSpaceManager::setSelectedMixingEncoding, + "mixingEncoding"_a.none(false), + DOC(MixingColorSpaceManager, setSelectedMixingEncoding)) + .def( + "getSelectedMixingEncodingIdx", + &MixingColorSpaceManager::getSelectedMixingEncodingIdx, + DOC(MixingColorSpaceManager, getSelectedMixingEncodingIdx)) + .def( + "refresh", + &MixingColorSpaceManager::refresh, + "config"_a.none(false), + DOC(MixingColorSpaceManager, refresh)) + .def( + "getProcessor", + &MixingColorSpaceManager::getProcessor, + "workingSpaceName"_a.none(false), + "displayName"_a.none(false), + "viewName"_a.none(false), + "direction"_a = TRANSFORM_DIR_FORWARD, + DOC(MixingColorSpaceManager, getProcessor)) + .def( + "getSlider", + (MixingSlider & (MixingColorSpaceManager::*)()) & MixingColorSpaceManager::getSlider, + py::return_value_policy::reference_internal, + DOC(MixingColorSpaceManager, getSlider)) + .def( + "getSlider", + (MixingSlider + & (MixingColorSpaceManager::*)(float sliderMixingMinEdge, float sliderMixingMaxEdge)) + & MixingColorSpaceManager::getSlider, + "sliderMixingMinEdge"_a.none(false), + "sliderMixingMaxEdge"_a.none(false), + py::return_value_policy::reference_internal, + DOC(MixingColorSpaceManager, getSlider)); defRepr(clsMixingColorSpaceManager); clsMixingSpaceIterator - .def("__len__", [](MixingSpaceIterator & it) - { - return static_cast(it.m_obj->getNumMixingSpaces()); - }) - .def("__getitem__", [](MixingSpaceIterator & it, int i) - { - it.checkIndex(i, static_cast(it.m_obj->getNumMixingSpaces())); - return it.m_obj->getMixingSpaceUIName(i); - }) - .def("__iter__", [](MixingSpaceIterator & it) -> MixingSpaceIterator & - { - return it; - }) - .def("__next__", [](MixingSpaceIterator & it) - { - int i = it.nextIndex(static_cast(it.m_obj->getNumMixingSpaces())); - return it.m_obj->getMixingSpaceUIName(i); - }); + .def( + "__len__", + [](MixingSpaceIterator & it) { + return static_cast(it.m_obj->getNumMixingSpaces()); + }) + .def( + "__getitem__", + [](MixingSpaceIterator & it, int i) { + it.checkIndex(i, static_cast(it.m_obj->getNumMixingSpaces())); + return it.m_obj->getMixingSpaceUIName(i); + }) + .def("__iter__", [](MixingSpaceIterator & it) -> MixingSpaceIterator & { return it; }) + .def("__next__", [](MixingSpaceIterator & it) { + int i = it.nextIndex(static_cast(it.m_obj->getNumMixingSpaces())); + return it.m_obj->getMixingSpaceUIName(i); + }); clsMixingEncodingIterator - .def("__len__", [](MixingEncodingIterator & it) - { - return static_cast(it.m_obj->getNumMixingEncodings()); - }) - .def("__getitem__", [](MixingEncodingIterator & it, int i) - { - it.checkIndex(i, static_cast(it.m_obj->getNumMixingEncodings())); - return it.m_obj->getMixingEncodingName(i); - }) - .def("__iter__", [](MixingEncodingIterator & it) -> MixingEncodingIterator & - { - return it; - }) - .def("__next__", [](MixingSpaceIterator & it) - { - int i = it.nextIndex(static_cast(it.m_obj->getNumMixingEncodings())); - return it.m_obj->getMixingEncodingName(i); - }); + .def( + "__len__", + [](MixingEncodingIterator & it) { + return static_cast(it.m_obj->getNumMixingEncodings()); + }) + .def( + "__getitem__", + [](MixingEncodingIterator & it, int i) { + it.checkIndex(i, static_cast(it.m_obj->getNumMixingEncodings())); + return it.m_obj->getMixingEncodingName(i); + }) + .def("__iter__", [](MixingEncodingIterator & it) -> MixingEncodingIterator & { return it; }) + .def("__next__", [](MixingSpaceIterator & it) { + int i = it.nextIndex(static_cast(it.m_obj->getNumMixingEncodings())); + return it.m_obj->getMixingEncodingName(i); + }); } } // namespace OCIO_NAMESPACE diff --git a/src/bindings/python/transforms/PyAllocationTransform.cpp b/src/bindings/python/transforms/PyAllocationTransform.cpp index b6456cadd3..f35d99f501 100644 --- a/src/bindings/python/transforms/PyAllocationTransform.cpp +++ b/src/bindings/python/transforms/PyAllocationTransform.cpp @@ -5,10 +5,10 @@ namespace OCIO_NAMESPACE { -namespace +namespace { -std::vector getVarsStdVec(const AllocationTransformRcPtr & p) +std::vector getVarsStdVec(const AllocationTransformRcPtr & p) { std::vector vars; vars.resize(p->getNumVars()); @@ -31,44 +31,50 @@ void bindPyAllocationTransform(py::module & m) { AllocationTransformRcPtr DEFAULT = AllocationTransform::Create(); - auto clsAllocationTransform = - py::class_( - m.attr("AllocationTransform")) + auto clsAllocationTransform + = py::class_( + m.attr("AllocationTransform")) - .def(py::init(&AllocationTransform::Create), - DOC(AllocationTransform, Create)) - .def(py::init([](Allocation allocation, - const std::vector & vars, - TransformDirection dir) - { - AllocationTransformRcPtr p = AllocationTransform::Create(); - p->setAllocation(allocation); - if (!vars.empty()) { setVars(p, vars); } - p->setDirection(dir); - p->validate(); - return p; - }), - "allocation"_a = DEFAULT->getAllocation(), - "vars"_a = getVarsStdVec(DEFAULT), - "direction"_a = DEFAULT->getDirection(), - DOC(AllocationTransform, Create)) + .def(py::init(&AllocationTransform::Create), DOC(AllocationTransform, Create)) + .def( + py::init([](Allocation allocation, + const std::vector & vars, + TransformDirection dir) { + AllocationTransformRcPtr p = AllocationTransform::Create(); + p->setAllocation(allocation); + if (!vars.empty()) + { + setVars(p, vars); + } + p->setDirection(dir); + p->validate(); + return p; + }), + "allocation"_a = DEFAULT->getAllocation(), + "vars"_a = getVarsStdVec(DEFAULT), + "direction"_a = DEFAULT->getDirection(), + DOC(AllocationTransform, Create)) - .def("getAllocation", &AllocationTransform::getAllocation, - DOC(AllocationTransform, getAllocation)) - .def("setAllocation", &AllocationTransform::setAllocation, - "allocation"_a, - DOC(AllocationTransform, setAllocation)) - .def("getVars", [](AllocationTransformRcPtr self) - { - return getVarsStdVec(self); - }, - DOC(AllocationTransform, getVars)) - .def("setVars", [](AllocationTransformRcPtr self, const std::vector & vars) - { - setVars(self, vars); - }, - "vars"_a, - DOC(AllocationTransform, setVars)); + .def( + "getAllocation", + &AllocationTransform::getAllocation, + DOC(AllocationTransform, getAllocation)) + .def( + "setAllocation", + &AllocationTransform::setAllocation, + "allocation"_a, + DOC(AllocationTransform, setAllocation)) + .def( + "getVars", + [](AllocationTransformRcPtr self) { return getVarsStdVec(self); }, + DOC(AllocationTransform, getVars)) + .def( + "setVars", + [](AllocationTransformRcPtr self, const std::vector & vars) { + setVars(self, vars); + }, + "vars"_a, + DOC(AllocationTransform, setVars)); defRepr(clsAllocationTransform); } diff --git a/src/bindings/python/transforms/PyBuiltinTransform.cpp b/src/bindings/python/transforms/PyBuiltinTransform.cpp index cc740dbbeb..4937602a12 100644 --- a/src/bindings/python/transforms/PyBuiltinTransform.cpp +++ b/src/bindings/python/transforms/PyBuiltinTransform.cpp @@ -10,30 +10,35 @@ void bindPyBuiltinTransform(py::module & m) { BuiltinTransformRcPtr DEFAULT = BuiltinTransform::Create(); - auto clsBuiltinTransform = - py::class_( - m.attr("BuiltinTransform")) - - .def(py::init(&BuiltinTransform::Create), - DOC(BuiltinTransform, Create)) - .def(py::init([](const std::string & style, TransformDirection dir) - { - BuiltinTransformRcPtr p = BuiltinTransform::Create(); - if (!style.empty()) { p->setStyle(style.c_str()); } - p->setDirection(dir); - p->validate(); - return p; - }), - "style"_a = DEFAULT->getStyle(), - "direction"_a = DEFAULT->getDirection(), - DOC(BuiltinTransform, Create)) - - .def("setStyle", &BuiltinTransform::setStyle, "style"_a.none(false), - DOC(BuiltinTransform, setStyle)) - .def("getStyle", &BuiltinTransform::getStyle, - DOC(BuiltinTransform, getStyle)) - .def("getDescription", &BuiltinTransform::getDescription, - DOC(BuiltinTransform, getDescription)); + auto clsBuiltinTransform + = py::class_(m.attr("BuiltinTransform")) + + .def(py::init(&BuiltinTransform::Create), DOC(BuiltinTransform, Create)) + .def( + py::init([](const std::string & style, TransformDirection dir) { + BuiltinTransformRcPtr p = BuiltinTransform::Create(); + if (!style.empty()) + { + p->setStyle(style.c_str()); + } + p->setDirection(dir); + p->validate(); + return p; + }), + "style"_a = DEFAULT->getStyle(), + "direction"_a = DEFAULT->getDirection(), + DOC(BuiltinTransform, Create)) + + .def( + "setStyle", + &BuiltinTransform::setStyle, + "style"_a.none(false), + DOC(BuiltinTransform, setStyle)) + .def("getStyle", &BuiltinTransform::getStyle, DOC(BuiltinTransform, getStyle)) + .def( + "getDescription", + &BuiltinTransform::getDescription, + DOC(BuiltinTransform, getDescription)); defRepr(clsBuiltinTransform); } diff --git a/src/bindings/python/transforms/PyCDLTransform.cpp b/src/bindings/python/transforms/PyCDLTransform.cpp index dfe2fc4829..abafe209f2 100644 --- a/src/bindings/python/transforms/PyCDLTransform.cpp +++ b/src/bindings/python/transforms/PyCDLTransform.cpp @@ -19,139 +19,155 @@ void bindPyCDLTransform(py::module & m) std::array DEFAULT_POWER; DEFAULT->getPower(DEFAULT_POWER.data()); - auto clsCDLTransform = - py::class_( - m.attr("CDLTransform")) + auto clsCDLTransform + = py::class_(m.attr("CDLTransform")) - .def(py::init(&CDLTransform::Create), - DOC(CDLTransform, Create)) - .def(py::init([](TransformDirection dir) - { - CDLTransformRcPtr p = CDLTransform::Create(); - p->setDirection(dir); - p->validate(); - return p; - }), - "direction"_a = DEFAULT->getDirection(), - DOC(CDLTransform, Create)) - .def(py::init([](const std::array & slope, - const std::array & offset, - const std::array & power, - double sat, - const std::string & id, - const std::string & desc, - TransformDirection dir) - { - CDLTransformRcPtr p = CDLTransform::Create(); - p->setSlope(slope.data()); - p->setOffset(offset.data()); - p->setPower(power.data()); - p->setSat(sat); - if (!id.empty()) { p->setID(id.c_str()); } - if (!desc.empty()) { p->setFirstSOPDescription(desc.c_str()); } - p->setDirection(dir); - p->validate(); - return p; - }), - "slope"_a = DEFAULT_SLOPE, - "offset"_a = DEFAULT_OFFSET, - "power"_a = DEFAULT_POWER, - "sat"_a = DEFAULT->getSat(), - "id"_a = DEFAULT->getID(), - "description"_a = DEFAULT->getFirstSOPDescription(), - "direction"_a = DEFAULT->getDirection(), - DOC(CDLTransform, Create)) + .def(py::init(&CDLTransform::Create), DOC(CDLTransform, Create)) + .def( + py::init([](TransformDirection dir) { + CDLTransformRcPtr p = CDLTransform::Create(); + p->setDirection(dir); + p->validate(); + return p; + }), + "direction"_a = DEFAULT->getDirection(), + DOC(CDLTransform, Create)) + .def( + py::init([](const std::array & slope, + const std::array & offset, + const std::array & power, + double sat, + const std::string & id, + const std::string & desc, + TransformDirection dir) { + CDLTransformRcPtr p = CDLTransform::Create(); + p->setSlope(slope.data()); + p->setOffset(offset.data()); + p->setPower(power.data()); + p->setSat(sat); + if (!id.empty()) + { + p->setID(id.c_str()); + } + if (!desc.empty()) + { + p->setFirstSOPDescription(desc.c_str()); + } + p->setDirection(dir); + p->validate(); + return p; + }), + "slope"_a = DEFAULT_SLOPE, + "offset"_a = DEFAULT_OFFSET, + "power"_a = DEFAULT_POWER, + "sat"_a = DEFAULT->getSat(), + "id"_a = DEFAULT->getID(), + "description"_a = DEFAULT->getFirstSOPDescription(), + "direction"_a = DEFAULT->getDirection(), + DOC(CDLTransform, Create)) - .def_static("CreateFromFile", &CDLTransform::CreateFromFile, - "src"_a.none(false), "id"_a.none(false), - DOC(CDLTransform, CreateFromFile)) + .def_static( + "CreateFromFile", + &CDLTransform::CreateFromFile, + "src"_a.none(false), + "id"_a.none(false), + DOC(CDLTransform, CreateFromFile)) - .def_static("CreateGroupFromFile", &CDLTransform::CreateGroupFromFile, - "src"_a.none(false), - DOC(CDLTransform, CreateGroupFromFile)) + .def_static( + "CreateGroupFromFile", + &CDLTransform::CreateGroupFromFile, + "src"_a.none(false), + DOC(CDLTransform, CreateGroupFromFile)) - .def("getFormatMetadata", - (FormatMetadata & (CDLTransform::*)()) &CDLTransform::getFormatMetadata, - py::return_value_policy::reference_internal, - DOC(CDLTransform, getFormatMetadata)) - .def("setStyle", &CDLTransform::setStyle, "style"_a, - DOC(CDLTransform, setStyle)) - .def("equals", &CDLTransform::equals, "other"_a, - DOC(CDLTransform, equals)) - .def("getStyle", &CDLTransform::getStyle, - DOC(CDLTransform, getStyle)) - .def("getSlope", [](ConstCDLTransformRcPtr self) - { - std::array rgb; - self->getSlope(rgb.data()); - return rgb; - }, - DOC(CDLTransform, getSlope)) - .def("setSlope", [](CDLTransformRcPtr self, const std::array & rgb) - { - self->setSlope(rgb.data()); - }, - "rgb"_a, - DOC(CDLTransform, setSlope)) - .def("getOffset", [](CDLTransformRcPtr self) - { - std::array rgb; - self->getOffset(rgb.data()); - return rgb; - }, - DOC(CDLTransform, getOffset)) - .def("setOffset", [](CDLTransformRcPtr self, const std::array & rgb) - { - self->setOffset(rgb.data()); - }, - "rgb"_a, - DOC(CDLTransform, setOffset)) - .def("getPower", [](CDLTransformRcPtr self) - { - std::array rgb; - self->getPower(rgb.data()); - return rgb; - }, - DOC(CDLTransform, getPower)) - .def("setPower", [](CDLTransformRcPtr self, const std::array & rgb) - { - self->setPower(rgb.data()); - }, - "rgb"_a, - DOC(CDLTransform, setPower)) - .def("getSOP", [](CDLTransformRcPtr self) - { - std::array vec9; - self->getSOP(vec9.data()); - return vec9; - }, - DOC(CDLTransform, getSOP)) - .def("setSOP", [](CDLTransformRcPtr self, const std::array & vec9) - { - self->setSOP(vec9.data()); - }, - "vec9"_a, - DOC(CDLTransform, setSOP)) - .def("getSat", &CDLTransform::getSat, - DOC(CDLTransform, getSat)) - .def("setSat", &CDLTransform::setSat, "sat"_a, - DOC(CDLTransform, setSat)) - .def("getSatLumaCoefs", [](CDLTransformRcPtr self) - { - std::array rgb; - self->getSatLumaCoefs(rgb.data()); - return rgb; - }, - DOC(CDLTransform, getSatLumaCoefs)) - .def("getID", &CDLTransform::getID, - DOC(CDLTransform, getID)) - .def("setID", &CDLTransform::setID, "id"_a.none(false), - DOC(CDLTransform, setID)) - .def("getFirstSOPDescription", &CDLTransform::getFirstSOPDescription, - DOC(CDLTransform, getFirstSOPDescription)) - .def("setFirstSOPDescription", &CDLTransform::setFirstSOPDescription, - "description"_a.none(false), - DOC(CDLTransform, setFirstSOPDescription)); + .def( + "getFormatMetadata", + (FormatMetadata & (CDLTransform::*)()) & CDLTransform::getFormatMetadata, + py::return_value_policy::reference_internal, + DOC(CDLTransform, getFormatMetadata)) + .def("setStyle", &CDLTransform::setStyle, "style"_a, DOC(CDLTransform, setStyle)) + .def("equals", &CDLTransform::equals, "other"_a, DOC(CDLTransform, equals)) + .def("getStyle", &CDLTransform::getStyle, DOC(CDLTransform, getStyle)) + .def( + "getSlope", + [](ConstCDLTransformRcPtr self) { + std::array rgb; + self->getSlope(rgb.data()); + return rgb; + }, + DOC(CDLTransform, getSlope)) + .def( + "setSlope", + [](CDLTransformRcPtr self, const std::array & rgb) { + self->setSlope(rgb.data()); + }, + "rgb"_a, + DOC(CDLTransform, setSlope)) + .def( + "getOffset", + [](CDLTransformRcPtr self) { + std::array rgb; + self->getOffset(rgb.data()); + return rgb; + }, + DOC(CDLTransform, getOffset)) + .def( + "setOffset", + [](CDLTransformRcPtr self, const std::array & rgb) { + self->setOffset(rgb.data()); + }, + "rgb"_a, + DOC(CDLTransform, setOffset)) + .def( + "getPower", + [](CDLTransformRcPtr self) { + std::array rgb; + self->getPower(rgb.data()); + return rgb; + }, + DOC(CDLTransform, getPower)) + .def( + "setPower", + [](CDLTransformRcPtr self, const std::array & rgb) { + self->setPower(rgb.data()); + }, + "rgb"_a, + DOC(CDLTransform, setPower)) + .def( + "getSOP", + [](CDLTransformRcPtr self) { + std::array vec9; + self->getSOP(vec9.data()); + return vec9; + }, + DOC(CDLTransform, getSOP)) + .def( + "setSOP", + [](CDLTransformRcPtr self, const std::array & vec9) { + self->setSOP(vec9.data()); + }, + "vec9"_a, + DOC(CDLTransform, setSOP)) + .def("getSat", &CDLTransform::getSat, DOC(CDLTransform, getSat)) + .def("setSat", &CDLTransform::setSat, "sat"_a, DOC(CDLTransform, setSat)) + .def( + "getSatLumaCoefs", + [](CDLTransformRcPtr self) { + std::array rgb; + self->getSatLumaCoefs(rgb.data()); + return rgb; + }, + DOC(CDLTransform, getSatLumaCoefs)) + .def("getID", &CDLTransform::getID, DOC(CDLTransform, getID)) + .def("setID", &CDLTransform::setID, "id"_a.none(false), DOC(CDLTransform, setID)) + .def( + "getFirstSOPDescription", + &CDLTransform::getFirstSOPDescription, + DOC(CDLTransform, getFirstSOPDescription)) + .def( + "setFirstSOPDescription", + &CDLTransform::setFirstSOPDescription, + "description"_a.none(false), + DOC(CDLTransform, setFirstSOPDescription)); defRepr(clsCDLTransform); } diff --git a/src/bindings/python/transforms/PyColorSpaceTransform.cpp b/src/bindings/python/transforms/PyColorSpaceTransform.cpp index c9ecceba7b..98c19bac31 100644 --- a/src/bindings/python/transforms/PyColorSpaceTransform.cpp +++ b/src/bindings/python/transforms/PyColorSpaceTransform.cpp @@ -10,43 +10,57 @@ void bindPyColorSpaceTransform(py::module & m) { ColorSpaceTransformRcPtr DEFAULT = ColorSpaceTransform::Create(); - auto clsColorSpaceTransform = - py::class_( - m.attr("ColorSpaceTransform")) - - .def(py::init(&ColorSpaceTransform::Create), - DOC(ColorSpaceTransform, Create)) - .def(py::init([](const std::string & src, - const std::string & dst, - TransformDirection dir, - bool dataBypass) - { - ColorSpaceTransformRcPtr p = ColorSpaceTransform::Create(); - if (!src.empty()) { p->setSrc(src.c_str()); } - if (!dst.empty()) { p->setDst(dst.c_str()); } - p->setDirection(dir); - p->setDataBypass(dataBypass); - p->validate(); - return p; - }), - "src"_a = DEFAULT->getSrc(), - "dst"_a = DEFAULT->getDst(), - "direction"_a = DEFAULT->getDirection(), - "dataBypass"_a = DEFAULT->getDataBypass(), - DOC(ColorSpaceTransform, Create)) - - .def("getSrc", &ColorSpaceTransform::getSrc, - DOC(ColorSpaceTransform, getSrc)) - .def("setSrc", &ColorSpaceTransform::setSrc, "src"_a.none(false), - DOC(ColorSpaceTransform, setSrc)) - .def("getDst", &ColorSpaceTransform::getDst, - DOC(ColorSpaceTransform, getDst)) - .def("setDst", &ColorSpaceTransform::setDst, "dst"_a.none(false), - DOC(ColorSpaceTransform, setDst)) - .def("getDataBypass", &ColorSpaceTransform::getDataBypass, - DOC(ColorSpaceTransform, getDataBypass)) - .def("setDataBypass", &ColorSpaceTransform::setDataBypass, "dataBypass"_a, - DOC(ColorSpaceTransform, setDataBypass)); + auto clsColorSpaceTransform + = py::class_( + m.attr("ColorSpaceTransform")) + + .def(py::init(&ColorSpaceTransform::Create), DOC(ColorSpaceTransform, Create)) + .def( + py::init([](const std::string & src, + const std::string & dst, + TransformDirection dir, + bool dataBypass) { + ColorSpaceTransformRcPtr p = ColorSpaceTransform::Create(); + if (!src.empty()) + { + p->setSrc(src.c_str()); + } + if (!dst.empty()) + { + p->setDst(dst.c_str()); + } + p->setDirection(dir); + p->setDataBypass(dataBypass); + p->validate(); + return p; + }), + "src"_a = DEFAULT->getSrc(), + "dst"_a = DEFAULT->getDst(), + "direction"_a = DEFAULT->getDirection(), + "dataBypass"_a = DEFAULT->getDataBypass(), + DOC(ColorSpaceTransform, Create)) + + .def("getSrc", &ColorSpaceTransform::getSrc, DOC(ColorSpaceTransform, getSrc)) + .def( + "setSrc", + &ColorSpaceTransform::setSrc, + "src"_a.none(false), + DOC(ColorSpaceTransform, setSrc)) + .def("getDst", &ColorSpaceTransform::getDst, DOC(ColorSpaceTransform, getDst)) + .def( + "setDst", + &ColorSpaceTransform::setDst, + "dst"_a.none(false), + DOC(ColorSpaceTransform, setDst)) + .def( + "getDataBypass", + &ColorSpaceTransform::getDataBypass, + DOC(ColorSpaceTransform, getDataBypass)) + .def( + "setDataBypass", + &ColorSpaceTransform::setDataBypass, + "dataBypass"_a, + DOC(ColorSpaceTransform, setDataBypass)); defRepr(clsColorSpaceTransform); } diff --git a/src/bindings/python/transforms/PyDisplayViewTransform.cpp b/src/bindings/python/transforms/PyDisplayViewTransform.cpp index adf9f03cf3..741897806a 100644 --- a/src/bindings/python/transforms/PyDisplayViewTransform.cpp +++ b/src/bindings/python/transforms/PyDisplayViewTransform.cpp @@ -10,57 +10,84 @@ void bindPyDisplayViewTransform(py::module & m) { DisplayViewTransformRcPtr DEFAULT = DisplayViewTransform::Create(); - auto clsDisplayViewTransform = - py::class_( - m.attr("DisplayViewTransform")) + auto clsDisplayViewTransform + = py::class_( + m.attr("DisplayViewTransform")) - .def(py::init(&DisplayViewTransform::Create), - DOC(DisplayViewTransform, Create)) - .def(py::init([](const std::string & src, - const std::string & display, - const std::string & view, - bool looksBypass, - bool dataBypass, - TransformDirection dir) + .def(py::init(&DisplayViewTransform::Create), DOC(DisplayViewTransform, Create)) + .def( + py::init([](const std::string & src, + const std::string & display, + const std::string & view, + bool looksBypass, + bool dataBypass, + TransformDirection dir) { + DisplayViewTransformRcPtr p = DisplayViewTransform::Create(); + if (!src.empty()) { - DisplayViewTransformRcPtr p = DisplayViewTransform::Create(); - if (!src.empty()) { p->setSrc(src.c_str()); } - if (!display.empty()) { p->setDisplay(display.c_str()); } - if (!view.empty()) { p->setView(view.c_str()); } - p->setLooksBypass(looksBypass); - p->setDataBypass(dataBypass); - p->setDirection(dir); - p->validate(); - return p; - }), - "src"_a = DEFAULT->getSrc(), - "display"_a = DEFAULT->getDisplay(), - "view"_a = DEFAULT->getView(), - "looksBypass"_a = DEFAULT->getLooksBypass(), - "dataBypass"_a = DEFAULT->getDataBypass(), - "direction"_a = DEFAULT->getDirection(), - DOC(DisplayViewTransform, Create)) + p->setSrc(src.c_str()); + } + if (!display.empty()) + { + p->setDisplay(display.c_str()); + } + if (!view.empty()) + { + p->setView(view.c_str()); + } + p->setLooksBypass(looksBypass); + p->setDataBypass(dataBypass); + p->setDirection(dir); + p->validate(); + return p; + }), + "src"_a = DEFAULT->getSrc(), + "display"_a = DEFAULT->getDisplay(), + "view"_a = DEFAULT->getView(), + "looksBypass"_a = DEFAULT->getLooksBypass(), + "dataBypass"_a = DEFAULT->getDataBypass(), + "direction"_a = DEFAULT->getDirection(), + DOC(DisplayViewTransform, Create)) - .def("getSrc", &DisplayViewTransform::getSrc, - DOC(DisplayViewTransform, getSrc)) - .def("setSrc", &DisplayViewTransform::setSrc, "src"_a, - DOC(DisplayViewTransform, setSrc)) - .def("getDisplay", &DisplayViewTransform::getDisplay, - DOC(DisplayViewTransform, getDisplay)) - .def("setDisplay", &DisplayViewTransform::setDisplay, "display"_a, - DOC(DisplayViewTransform, setDisplay)) - .def("getView", &DisplayViewTransform::getView, - DOC(DisplayViewTransform, getView)) - .def("setView", &DisplayViewTransform::setView, "view"_a, - DOC(DisplayViewTransform, setView)) - .def("getLooksBypass", &DisplayViewTransform::getLooksBypass, - DOC(DisplayViewTransform, getLooksBypass)) - .def("setLooksBypass", &DisplayViewTransform::setLooksBypass, "looksBypass"_a, - DOC(DisplayViewTransform, setLooksBypass)) - .def("getDataBypass", &DisplayViewTransform::getDataBypass, - DOC(DisplayViewTransform, getDataBypass)) - .def("setDataBypass", &DisplayViewTransform::setDataBypass, "dataBypass"_a, - DOC(DisplayViewTransform, setDataBypass)); + .def("getSrc", &DisplayViewTransform::getSrc, DOC(DisplayViewTransform, getSrc)) + .def( + "setSrc", + &DisplayViewTransform::setSrc, + "src"_a, + DOC(DisplayViewTransform, setSrc)) + .def( + "getDisplay", + &DisplayViewTransform::getDisplay, + DOC(DisplayViewTransform, getDisplay)) + .def( + "setDisplay", + &DisplayViewTransform::setDisplay, + "display"_a, + DOC(DisplayViewTransform, setDisplay)) + .def("getView", &DisplayViewTransform::getView, DOC(DisplayViewTransform, getView)) + .def( + "setView", + &DisplayViewTransform::setView, + "view"_a, + DOC(DisplayViewTransform, setView)) + .def( + "getLooksBypass", + &DisplayViewTransform::getLooksBypass, + DOC(DisplayViewTransform, getLooksBypass)) + .def( + "setLooksBypass", + &DisplayViewTransform::setLooksBypass, + "looksBypass"_a, + DOC(DisplayViewTransform, setLooksBypass)) + .def( + "getDataBypass", + &DisplayViewTransform::getDataBypass, + DOC(DisplayViewTransform, getDataBypass)) + .def( + "setDataBypass", + &DisplayViewTransform::setDataBypass, + "dataBypass"_a, + DOC(DisplayViewTransform, setDataBypass)); defRepr(clsDisplayViewTransform); } diff --git a/src/bindings/python/transforms/PyExponentTransform.cpp b/src/bindings/python/transforms/PyExponentTransform.cpp index deb22008d3..ae8605cb59 100644 --- a/src/bindings/python/transforms/PyExponentTransform.cpp +++ b/src/bindings/python/transforms/PyExponentTransform.cpp @@ -13,51 +13,58 @@ void bindPyExponentTransform(py::module & m) std::array DEFAULT_VALUE; DEFAULT->getValue(*reinterpret_cast(DEFAULT_VALUE.data())); - auto clsExponentTransform = - py::class_( - m.attr("ExponentTransform")) + auto clsExponentTransform + = py::class_( + m.attr("ExponentTransform")) - .def(py::init(&ExponentTransform::Create), - DOC(ExponentTransform, Create)) - .def(py::init([](const std::array & vec4, - NegativeStyle negativeStyle, - TransformDirection dir) - { - ExponentTransformRcPtr p = ExponentTransform::Create(); - p->setValue(*reinterpret_cast(vec4.data())); - p->setNegativeStyle(negativeStyle); - p->setDirection(dir); - p->validate(); - return p; - }), - "value"_a = DEFAULT_VALUE, - "negativeStyle"_a = DEFAULT->getNegativeStyle(), - "direction"_a = DEFAULT->getDirection(), - DOC(ExponentTransform, Create)) + .def(py::init(&ExponentTransform::Create), DOC(ExponentTransform, Create)) + .def( + py::init([](const std::array & vec4, + NegativeStyle negativeStyle, + TransformDirection dir) { + ExponentTransformRcPtr p = ExponentTransform::Create(); + p->setValue(*reinterpret_cast(vec4.data())); + p->setNegativeStyle(negativeStyle); + p->setDirection(dir); + p->validate(); + return p; + }), + "value"_a = DEFAULT_VALUE, + "negativeStyle"_a = DEFAULT->getNegativeStyle(), + "direction"_a = DEFAULT->getDirection(), + DOC(ExponentTransform, Create)) - .def("getFormatMetadata", - (FormatMetadata & (ExponentTransform::*)()) &ExponentTransform::getFormatMetadata, - py::return_value_policy::reference_internal, - DOC(ExponentTransform, getFormatMetadata)) - .def("equals", &ExponentTransform::equals, "other"_a, - DOC(ExponentTransform, equals)) - .def("getValue", [](ExponentTransformRcPtr self) - { - std::array vec4; - self->getValue(*reinterpret_cast(vec4.data())); - return vec4; - }, - DOC(ExponentTransform, getValue)) - .def("setValue", [](ExponentTransformRcPtr self, const std::array & vec4) - { - self->setValue(*reinterpret_cast(vec4.data())); - }, - "value"_a, - DOC(ExponentTransform, setValue)) - .def("getNegativeStyle", &ExponentTransform::getNegativeStyle, - DOC(ExponentTransform, getNegativeStyle)) - .def("setNegativeStyle", &ExponentTransform::setNegativeStyle, "style"_a, - DOC(ExponentTransform, setNegativeStyle)); + .def( + "getFormatMetadata", + (FormatMetadata & (ExponentTransform::*)()) + & ExponentTransform::getFormatMetadata, + py::return_value_policy::reference_internal, + DOC(ExponentTransform, getFormatMetadata)) + .def("equals", &ExponentTransform::equals, "other"_a, DOC(ExponentTransform, equals)) + .def( + "getValue", + [](ExponentTransformRcPtr self) { + std::array vec4; + self->getValue(*reinterpret_cast(vec4.data())); + return vec4; + }, + DOC(ExponentTransform, getValue)) + .def( + "setValue", + [](ExponentTransformRcPtr self, const std::array & vec4) { + self->setValue(*reinterpret_cast(vec4.data())); + }, + "value"_a, + DOC(ExponentTransform, setValue)) + .def( + "getNegativeStyle", + &ExponentTransform::getNegativeStyle, + DOC(ExponentTransform, getNegativeStyle)) + .def( + "setNegativeStyle", + &ExponentTransform::setNegativeStyle, + "style"_a, + DOC(ExponentTransform, setNegativeStyle)); defRepr(clsExponentTransform); } diff --git a/src/bindings/python/transforms/PyExponentWithLinearTransform.cpp b/src/bindings/python/transforms/PyExponentWithLinearTransform.cpp index d25844bf6d..bbc17f0934 100644 --- a/src/bindings/python/transforms/PyExponentWithLinearTransform.cpp +++ b/src/bindings/python/transforms/PyExponentWithLinearTransform.cpp @@ -16,70 +16,82 @@ void bindPyExponentWithLinearTransform(py::module & m) std::array DEFAULT_OFFSET; DEFAULT->getOffset(*reinterpret_cast(DEFAULT_OFFSET.data())); - auto clsExponentWithLinearTransform = - py::class_( - m.attr("ExponentWithLinearTransform")) + auto clsExponentWithLinearTransform + = py::class_( + m.attr("ExponentWithLinearTransform")) - .def(py::init(&ExponentWithLinearTransform::Create), - DOC(ExponentWithLinearTransform, Create)) - .def(py::init([](const std::array & gamma, - const std::array & offset, - NegativeStyle negativeStyle, - TransformDirection dir) - { - ExponentWithLinearTransformRcPtr p = ExponentWithLinearTransform::Create(); - p->setGamma(*reinterpret_cast(gamma.data())); - p->setOffset(*reinterpret_cast(offset.data())); - p->setNegativeStyle(negativeStyle); - p->setDirection(dir); - p->validate(); - return p; - }), - "gamma"_a = DEFAULT_GAMMA, - "offset"_a = DEFAULT_OFFSET, - "negativeStyle"_a = DEFAULT->getNegativeStyle(), - "direction"_a = DEFAULT->getDirection(), - DOC(ExponentWithLinearTransform, Create)) + .def( + py::init(&ExponentWithLinearTransform::Create), + DOC(ExponentWithLinearTransform, Create)) + .def( + py::init([](const std::array & gamma, + const std::array & offset, + NegativeStyle negativeStyle, + TransformDirection dir) { + ExponentWithLinearTransformRcPtr p = ExponentWithLinearTransform::Create(); + p->setGamma(*reinterpret_cast(gamma.data())); + p->setOffset(*reinterpret_cast(offset.data())); + p->setNegativeStyle(negativeStyle); + p->setDirection(dir); + p->validate(); + return p; + }), + "gamma"_a = DEFAULT_GAMMA, + "offset"_a = DEFAULT_OFFSET, + "negativeStyle"_a = DEFAULT->getNegativeStyle(), + "direction"_a = DEFAULT->getDirection(), + DOC(ExponentWithLinearTransform, Create)) - .def("getFormatMetadata", - (FormatMetadata & (ExponentWithLinearTransform::*)()) - &ExponentWithLinearTransform::getFormatMetadata, - py::return_value_policy::reference_internal, - DOC(ExponentWithLinearTransform, getFormatMetadata)) - .def("equals", &ExponentWithLinearTransform::equals, "other"_a, - DOC(ExponentWithLinearTransform, equals)) - .def("getGamma", [](ExponentWithLinearTransformRcPtr self) - { - std::array values; - self->getGamma(*reinterpret_cast(values.data())); - return values; - }, - DOC(ExponentWithLinearTransform, getGamma)) - .def("setGamma", [](ExponentWithLinearTransformRcPtr self, - const std::array & values) - { - self->setGamma(*reinterpret_cast(values.data())); - }, - "values"_a, - DOC(ExponentWithLinearTransform, setGamma)) - .def("getOffset", [](ExponentWithLinearTransformRcPtr self) - { - std::array values; - self->getOffset(*reinterpret_cast(values.data())); - return values; - }, - DOC(ExponentWithLinearTransform, getOffset)) - .def("setOffset", [](ExponentWithLinearTransformRcPtr self, - const std::array & values) - { - self->setOffset(*reinterpret_cast(values.data())); - }, - "values"_a, - DOC(ExponentWithLinearTransform, setOffset)) - .def("getNegativeStyle", &ExponentWithLinearTransform::getNegativeStyle, - DOC(ExponentWithLinearTransform, getNegativeStyle)) - .def("setNegativeStyle", &ExponentWithLinearTransform::setNegativeStyle, "style"_a, - DOC(ExponentWithLinearTransform, setNegativeStyle)); + .def( + "getFormatMetadata", + (FormatMetadata & (ExponentWithLinearTransform::*)()) + & ExponentWithLinearTransform::getFormatMetadata, + py::return_value_policy::reference_internal, + DOC(ExponentWithLinearTransform, getFormatMetadata)) + .def( + "equals", + &ExponentWithLinearTransform::equals, + "other"_a, + DOC(ExponentWithLinearTransform, equals)) + .def( + "getGamma", + [](ExponentWithLinearTransformRcPtr self) { + std::array values; + self->getGamma(*reinterpret_cast(values.data())); + return values; + }, + DOC(ExponentWithLinearTransform, getGamma)) + .def( + "setGamma", + [](ExponentWithLinearTransformRcPtr self, const std::array & values) { + self->setGamma(*reinterpret_cast(values.data())); + }, + "values"_a, + DOC(ExponentWithLinearTransform, setGamma)) + .def( + "getOffset", + [](ExponentWithLinearTransformRcPtr self) { + std::array values; + self->getOffset(*reinterpret_cast(values.data())); + return values; + }, + DOC(ExponentWithLinearTransform, getOffset)) + .def( + "setOffset", + [](ExponentWithLinearTransformRcPtr self, const std::array & values) { + self->setOffset(*reinterpret_cast(values.data())); + }, + "values"_a, + DOC(ExponentWithLinearTransform, setOffset)) + .def( + "getNegativeStyle", + &ExponentWithLinearTransform::getNegativeStyle, + DOC(ExponentWithLinearTransform, getNegativeStyle)) + .def( + "setNegativeStyle", + &ExponentWithLinearTransform::setNegativeStyle, + "style"_a, + DOC(ExponentWithLinearTransform, setNegativeStyle)); defRepr(clsExponentWithLinearTransform); } diff --git a/src/bindings/python/transforms/PyExposureContrastTransform.cpp b/src/bindings/python/transforms/PyExposureContrastTransform.cpp index a9802bdceb..66c9d79f86 100644 --- a/src/bindings/python/transforms/PyExposureContrastTransform.cpp +++ b/src/bindings/python/transforms/PyExposureContrastTransform.cpp @@ -10,106 +10,172 @@ void bindPyExposureContrastTransform(py::module & m) { ExposureContrastTransformRcPtr DEFAULT = ExposureContrastTransform::Create(); - auto clsExposureContrastTransform = - py::class_( - m.attr("ExposureContrastTransform")) + auto clsExposureContrastTransform + = py::class_( + m.attr("ExposureContrastTransform")) - .def(py::init(&ExposureContrastTransform::Create), - DOC(ExposureContrastTransform, Create)) - .def(py::init([](ExposureContrastStyle style, - double exposure, - double contrast, - double gamma, - double pivot, - double logExposureStep, - double logMidGray, - bool dynamicExposure, - bool dynamicContrast, - bool dynamicGamma, - TransformDirection dir) - { - ExposureContrastTransformRcPtr p = ExposureContrastTransform::Create(); - p->setStyle(style); - p->setExposure(exposure); - p->setContrast(contrast); - p->setGamma(gamma); - p->setPivot(pivot); - p->setLogExposureStep(logExposureStep); - p->setLogMidGray(logMidGray); - if (dynamicExposure) { p->makeExposureDynamic(); } - if (dynamicContrast) { p->makeContrastDynamic(); } - if (dynamicGamma) { p->makeGammaDynamic(); } - p->setDirection(dir); - p->validate(); - return p; - }), - "style"_a = DEFAULT->getStyle(), - "exposure"_a = DEFAULT->getExposure(), - "contrast"_a = DEFAULT->getContrast(), - "gamma"_a = DEFAULT->getGamma(), - "pivot"_a = DEFAULT->getPivot(), - "logExposureStep"_a = DEFAULT->getLogExposureStep(), - "logMidGray"_a = DEFAULT->getLogMidGray(), - "dynamicExposure"_a = DEFAULT->isExposureDynamic(), - "dynamicContrast"_a = DEFAULT->isContrastDynamic(), - "dynamicGamma"_a = DEFAULT->isGammaDynamic(), - "direction"_a = DEFAULT->getDirection(), - DOC(ExposureContrastTransform, Create)) + .def( + py::init(&ExposureContrastTransform::Create), + DOC(ExposureContrastTransform, Create)) + .def( + py::init([](ExposureContrastStyle style, + double exposure, + double contrast, + double gamma, + double pivot, + double logExposureStep, + double logMidGray, + bool dynamicExposure, + bool dynamicContrast, + bool dynamicGamma, + TransformDirection dir) { + ExposureContrastTransformRcPtr p = ExposureContrastTransform::Create(); + p->setStyle(style); + p->setExposure(exposure); + p->setContrast(contrast); + p->setGamma(gamma); + p->setPivot(pivot); + p->setLogExposureStep(logExposureStep); + p->setLogMidGray(logMidGray); + if (dynamicExposure) + { + p->makeExposureDynamic(); + } + if (dynamicContrast) + { + p->makeContrastDynamic(); + } + if (dynamicGamma) + { + p->makeGammaDynamic(); + } + p->setDirection(dir); + p->validate(); + return p; + }), + "style"_a = DEFAULT->getStyle(), + "exposure"_a = DEFAULT->getExposure(), + "contrast"_a = DEFAULT->getContrast(), + "gamma"_a = DEFAULT->getGamma(), + "pivot"_a = DEFAULT->getPivot(), + "logExposureStep"_a = DEFAULT->getLogExposureStep(), + "logMidGray"_a = DEFAULT->getLogMidGray(), + "dynamicExposure"_a = DEFAULT->isExposureDynamic(), + "dynamicContrast"_a = DEFAULT->isContrastDynamic(), + "dynamicGamma"_a = DEFAULT->isGammaDynamic(), + "direction"_a = DEFAULT->getDirection(), + DOC(ExposureContrastTransform, Create)) - .def("getFormatMetadata", - (FormatMetadata & (ExposureContrastTransform::*)()) - &ExposureContrastTransform::getFormatMetadata, - py::return_value_policy::reference_internal, - DOC(ExposureContrastTransform, getFormatMetadata)) - .def("equals", &ExposureContrastTransform::equals, "other"_a, - DOC(ExposureContrastTransform, equals)) - .def("getStyle", &ExposureContrastTransform::getStyle, - DOC(ExposureContrastTransform, getStyle)) - .def("setStyle", &ExposureContrastTransform::setStyle, "style"_a, - DOC(ExposureContrastTransform, setStyle)) - .def("getExposure", &ExposureContrastTransform::getExposure, - DOC(ExposureContrastTransform, getExposure)) - .def("setExposure", &ExposureContrastTransform::setExposure, "exposure"_a, - DOC(ExposureContrastTransform, setExposure)) - .def("isExposureDynamic", &ExposureContrastTransform::isExposureDynamic, - DOC(ExposureContrastTransform, isExposureDynamic)) - .def("makeExposureDynamic", &ExposureContrastTransform::makeExposureDynamic, - DOC(ExposureContrastTransform, makeExposureDynamic)) - .def("makeExposureNonDynamic", &ExposureContrastTransform::makeExposureNonDynamic, - DOC(ExposureContrastTransform, makeExposureNonDynamic)) - .def("getContrast", &ExposureContrastTransform::getContrast, - DOC(ExposureContrastTransform, getContrast)) - .def("setContrast", &ExposureContrastTransform::setContrast, "contrast"_a, - DOC(ExposureContrastTransform, setContrast)) - .def("isContrastDynamic", &ExposureContrastTransform::isContrastDynamic, - DOC(ExposureContrastTransform, isContrastDynamic)) - .def("makeContrastDynamic", &ExposureContrastTransform::makeContrastDynamic, - DOC(ExposureContrastTransform, makeContrastDynamic)) - .def("makeContrastNonDynamic", &ExposureContrastTransform::makeContrastNonDynamic, - DOC(ExposureContrastTransform, makeContrastNonDynamic)) - .def("getGamma", &ExposureContrastTransform::getGamma, - DOC(ExposureContrastTransform, getGamma)) - .def("setGamma", &ExposureContrastTransform::setGamma, "gamma"_a, - DOC(ExposureContrastTransform, setGamma)) - .def("isGammaDynamic", &ExposureContrastTransform::isGammaDynamic, - DOC(ExposureContrastTransform, isGammaDynamic)) - .def("makeGammaDynamic", &ExposureContrastTransform::makeGammaDynamic, - DOC(ExposureContrastTransform, makeGammaDynamic)) - .def("makeGammaNonDynamic", &ExposureContrastTransform::makeGammaNonDynamic, - DOC(ExposureContrastTransform, makeGammaNonDynamic)) - .def("getPivot", &ExposureContrastTransform::getPivot, - DOC(ExposureContrastTransform, getPivot)) - .def("setPivot", &ExposureContrastTransform::setPivot, "pivot"_a, - DOC(ExposureContrastTransform, setPivot)) - .def("getLogExposureStep", &ExposureContrastTransform::getLogExposureStep, - DOC(ExposureContrastTransform, getLogExposureStep)) - .def("setLogExposureStep", &ExposureContrastTransform::setLogExposureStep, - "logExposureStep"_a, - DOC(ExposureContrastTransform, setLogExposureStep)) - .def("getLogMidGray", &ExposureContrastTransform::getLogMidGray, - DOC(ExposureContrastTransform, getLogMidGray)) - .def("setLogMidGray", &ExposureContrastTransform::setLogMidGray, "logMidGray"_a, - DOC(ExposureContrastTransform, setLogMidGray)); + .def( + "getFormatMetadata", + (FormatMetadata & (ExposureContrastTransform::*)()) + & ExposureContrastTransform::getFormatMetadata, + py::return_value_policy::reference_internal, + DOC(ExposureContrastTransform, getFormatMetadata)) + .def( + "equals", + &ExposureContrastTransform::equals, + "other"_a, + DOC(ExposureContrastTransform, equals)) + .def( + "getStyle", + &ExposureContrastTransform::getStyle, + DOC(ExposureContrastTransform, getStyle)) + .def( + "setStyle", + &ExposureContrastTransform::setStyle, + "style"_a, + DOC(ExposureContrastTransform, setStyle)) + .def( + "getExposure", + &ExposureContrastTransform::getExposure, + DOC(ExposureContrastTransform, getExposure)) + .def( + "setExposure", + &ExposureContrastTransform::setExposure, + "exposure"_a, + DOC(ExposureContrastTransform, setExposure)) + .def( + "isExposureDynamic", + &ExposureContrastTransform::isExposureDynamic, + DOC(ExposureContrastTransform, isExposureDynamic)) + .def( + "makeExposureDynamic", + &ExposureContrastTransform::makeExposureDynamic, + DOC(ExposureContrastTransform, makeExposureDynamic)) + .def( + "makeExposureNonDynamic", + &ExposureContrastTransform::makeExposureNonDynamic, + DOC(ExposureContrastTransform, makeExposureNonDynamic)) + .def( + "getContrast", + &ExposureContrastTransform::getContrast, + DOC(ExposureContrastTransform, getContrast)) + .def( + "setContrast", + &ExposureContrastTransform::setContrast, + "contrast"_a, + DOC(ExposureContrastTransform, setContrast)) + .def( + "isContrastDynamic", + &ExposureContrastTransform::isContrastDynamic, + DOC(ExposureContrastTransform, isContrastDynamic)) + .def( + "makeContrastDynamic", + &ExposureContrastTransform::makeContrastDynamic, + DOC(ExposureContrastTransform, makeContrastDynamic)) + .def( + "makeContrastNonDynamic", + &ExposureContrastTransform::makeContrastNonDynamic, + DOC(ExposureContrastTransform, makeContrastNonDynamic)) + .def( + "getGamma", + &ExposureContrastTransform::getGamma, + DOC(ExposureContrastTransform, getGamma)) + .def( + "setGamma", + &ExposureContrastTransform::setGamma, + "gamma"_a, + DOC(ExposureContrastTransform, setGamma)) + .def( + "isGammaDynamic", + &ExposureContrastTransform::isGammaDynamic, + DOC(ExposureContrastTransform, isGammaDynamic)) + .def( + "makeGammaDynamic", + &ExposureContrastTransform::makeGammaDynamic, + DOC(ExposureContrastTransform, makeGammaDynamic)) + .def( + "makeGammaNonDynamic", + &ExposureContrastTransform::makeGammaNonDynamic, + DOC(ExposureContrastTransform, makeGammaNonDynamic)) + .def( + "getPivot", + &ExposureContrastTransform::getPivot, + DOC(ExposureContrastTransform, getPivot)) + .def( + "setPivot", + &ExposureContrastTransform::setPivot, + "pivot"_a, + DOC(ExposureContrastTransform, setPivot)) + .def( + "getLogExposureStep", + &ExposureContrastTransform::getLogExposureStep, + DOC(ExposureContrastTransform, getLogExposureStep)) + .def( + "setLogExposureStep", + &ExposureContrastTransform::setLogExposureStep, + "logExposureStep"_a, + DOC(ExposureContrastTransform, setLogExposureStep)) + .def( + "getLogMidGray", + &ExposureContrastTransform::getLogMidGray, + DOC(ExposureContrastTransform, getLogMidGray)) + .def( + "setLogMidGray", + &ExposureContrastTransform::setLogMidGray, + "logMidGray"_a, + DOC(ExposureContrastTransform, setLogMidGray)); defRepr(clsExposureContrastTransform); } diff --git a/src/bindings/python/transforms/PyFileTransform.cpp b/src/bindings/python/transforms/PyFileTransform.cpp index 3d70800988..313d427d35 100644 --- a/src/bindings/python/transforms/PyFileTransform.cpp +++ b/src/bindings/python/transforms/PyFileTransform.cpp @@ -22,83 +22,83 @@ void bindPyFileTransform(py::module & m) { FileTransformRcPtr DEFAULT = FileTransform::Create(); - auto clsFileTransform = - py::class_( - m.attr("FileTransform")); + auto clsFileTransform + = py::class_(m.attr("FileTransform")); - auto clsFormatIterator = - py::class_( - clsFileTransform, "FormatIterator"); + auto clsFormatIterator = py::class_(clsFileTransform, "FormatIterator"); - clsFileTransform - .def(py::init(&FileTransform::Create), - DOC(FileTransform, Create)) - .def(py::init([](const std::string & src, - const std::string & id, - Interpolation interp, - TransformDirection dir) - { + clsFileTransform.def(py::init(&FileTransform::Create), DOC(FileTransform, Create)) + .def( + py::init([](const std::string & src, + const std::string & id, + Interpolation interp, + TransformDirection dir) { FileTransformRcPtr p = FileTransform::Create(); - if (!src.empty()) { p->setSrc(src.c_str()); } - if (!id.empty()) { p->setCCCId(id.c_str()); } + if (!src.empty()) + { + p->setSrc(src.c_str()); + } + if (!id.empty()) + { + p->setCCCId(id.c_str()); + } p->setInterpolation(interp); p->setDirection(dir); p->validate(); return p; - }), - "src"_a = DEFAULT->getSrc(), - "cccId"_a = DEFAULT->getCCCId(), - "interpolation"_a = DEFAULT->getInterpolation(), - "direction"_a = DEFAULT->getDirection(), - DOC(FileTransform, Create)) + }), + "src"_a = DEFAULT->getSrc(), + "cccId"_a = DEFAULT->getCCCId(), + "interpolation"_a = DEFAULT->getInterpolation(), + "direction"_a = DEFAULT->getDirection(), + DOC(FileTransform, Create)) - .def_static("getFormats", []() - { - return FormatIterator(nullptr); - }) + .def_static("getFormats", []() { return FormatIterator(nullptr); }) - .def("getSrc", &FileTransform::getSrc, - DOC(FileTransform, getSrc)) - .def("setSrc", &FileTransform::setSrc, "src"_a.none(false), - DOC(FileTransform, setSrc)) - .def("getCCCId", &FileTransform::getCCCId, - DOC(FileTransform, getCCCId)) - .def("setCCCId", &FileTransform::setCCCId, "cccId"_a.none(false), - DOC(FileTransform, setCCCId)) - .def("getCDLStyle", &FileTransform::getCDLStyle, - DOC(FileTransform, getCDLStyle)) - .def("setCDLStyle", &FileTransform::setCDLStyle, "style"_a, - DOC(FileTransform, setCDLStyle)) - .def("getInterpolation", &FileTransform::getInterpolation, - DOC(FileTransform, getInterpolation)) - .def("setInterpolation", &FileTransform::setInterpolation, "interpolation"_a, - DOC(FileTransform, setInterpolation)) - .def_static("IsFormatExtensionSupported", &FileTransform::IsFormatExtensionSupported, "extension"_a, - DOC(FileTransform, IsFormatExtensionSupported)); + .def("getSrc", &FileTransform::getSrc, DOC(FileTransform, getSrc)) + .def("setSrc", &FileTransform::setSrc, "src"_a.none(false), DOC(FileTransform, setSrc)) + .def("getCCCId", &FileTransform::getCCCId, DOC(FileTransform, getCCCId)) + .def( + "setCCCId", + &FileTransform::setCCCId, + "cccId"_a.none(false), + DOC(FileTransform, setCCCId)) + .def("getCDLStyle", &FileTransform::getCDLStyle, DOC(FileTransform, getCDLStyle)) + .def("setCDLStyle", &FileTransform::setCDLStyle, "style"_a, DOC(FileTransform, setCDLStyle)) + .def( + "getInterpolation", + &FileTransform::getInterpolation, + DOC(FileTransform, getInterpolation)) + .def( + "setInterpolation", + &FileTransform::setInterpolation, + "interpolation"_a, + DOC(FileTransform, setInterpolation)) + .def_static( + "IsFormatExtensionSupported", + &FileTransform::IsFormatExtensionSupported, + "extension"_a, + DOC(FileTransform, IsFormatExtensionSupported)); defRepr(clsFileTransform); clsFormatIterator - .def("__len__", [](FormatIterator & /* it */) - { - return FileTransform::GetNumFormats(); - }) - .def("__getitem__", [](FormatIterator & it, int i) - { + .def("__len__", [](FormatIterator & /* it */) { return FileTransform::GetNumFormats(); }) + .def( + "__getitem__", + [](FormatIterator & it, int i) { it.checkIndex(i, FileTransform::GetNumFormats()); - return py::make_tuple(FileTransform::GetFormatNameByIndex(i), - FileTransform::GetFormatExtensionByIndex(i)); - }) - .def("__iter__", [](FormatIterator & it) -> FormatIterator & - { - return it; + return py::make_tuple( + FileTransform::GetFormatNameByIndex(i), + FileTransform::GetFormatExtensionByIndex(i)); }) - .def("__next__", [](FormatIterator & it) - { - int i = it.nextIndex(FileTransform::GetNumFormats()); - return py::make_tuple(FileTransform::GetFormatNameByIndex(i), - FileTransform::GetFormatExtensionByIndex(i)); - }); + .def("__iter__", [](FormatIterator & it) -> FormatIterator & { return it; }) + .def("__next__", [](FormatIterator & it) { + int i = it.nextIndex(FileTransform::GetNumFormats()); + return py::make_tuple( + FileTransform::GetFormatNameByIndex(i), + FileTransform::GetFormatExtensionByIndex(i)); + }); } } // namespace OCIO_NAMESPACE diff --git a/src/bindings/python/transforms/PyFixedFunctionTransform.cpp b/src/bindings/python/transforms/PyFixedFunctionTransform.cpp index efd7436893..1b2eebe315 100644 --- a/src/bindings/python/transforms/PyFixedFunctionTransform.cpp +++ b/src/bindings/python/transforms/PyFixedFunctionTransform.cpp @@ -6,63 +6,76 @@ namespace OCIO_NAMESPACE { -namespace { - std::vector getParamsStdVec(FixedFunctionTransformRcPtr & p) { - std::vector params; - params.resize(p->getNumParams()); - p->getParams(params.data()); - return params; - } +namespace +{ +std::vector getParamsStdVec(FixedFunctionTransformRcPtr & p) +{ + std::vector params; + params.resize(p->getNumParams()); + p->getParams(params.data()); + return params; } +} // namespace void bindPyFixedFunctionTransform(py::module & m) { - FixedFunctionTransformRcPtr DEFAULT = FixedFunctionTransform::Create(FIXED_FUNCTION_ACES_GLOW_03); + FixedFunctionTransformRcPtr DEFAULT + = FixedFunctionTransform::Create(FIXED_FUNCTION_ACES_GLOW_03); - auto clsFixedFunctionTransform = - py::class_( - m.attr("FixedFunctionTransform")) + auto clsFixedFunctionTransform + = py::class_( + m.attr("FixedFunctionTransform")) - .def(py::init([](FixedFunctionStyle style, - const std::vector & params, - TransformDirection dir) - { - FixedFunctionTransformRcPtr p = params.empty() ? - FixedFunctionTransform::Create(style) : - FixedFunctionTransform::Create(style, - params.data(), - params.size()); - p->setDirection(dir); - p->validate(); - return p; - }), - "style"_a, - "params"_a = getParamsStdVec(DEFAULT), - "direction"_a = DEFAULT->getDirection(), - DOC(FixedFunctionTransform, Create)) + .def( + py::init([](FixedFunctionStyle style, + const std::vector & params, + TransformDirection dir) { + FixedFunctionTransformRcPtr p = params.empty() + ? FixedFunctionTransform::Create(style) + : FixedFunctionTransform::Create( + style, + params.data(), + params.size()); + p->setDirection(dir); + p->validate(); + return p; + }), + "style"_a, + "params"_a = getParamsStdVec(DEFAULT), + "direction"_a = DEFAULT->getDirection(), + DOC(FixedFunctionTransform, Create)) - .def("getFormatMetadata", - (FormatMetadata & (FixedFunctionTransform::*)()) - &FixedFunctionTransform::getFormatMetadata, - py::return_value_policy::reference_internal, - DOC(FixedFunctionTransform, getFormatMetadata)) - .def("equals", &FixedFunctionTransform::equals, "other"_a, - DOC(FixedFunctionTransform, equals)) - .def("getStyle", &FixedFunctionTransform::getStyle, - DOC(FixedFunctionTransform, getStyle)) - .def("setStyle", &FixedFunctionTransform::setStyle, "style"_a, - DOC(FixedFunctionTransform, setStyle)) - .def("getParams", [](FixedFunctionTransformRcPtr self) - { - return getParamsStdVec(self); - }, - DOC(FixedFunctionTransform, getParams)) - .def("setParams", [](FixedFunctionTransformRcPtr self, const std::vector & params) - { - self->setParams(params.data(), params.size()); - }, - "params"_a, - DOC(FixedFunctionTransform, setParams)); + .def( + "getFormatMetadata", + (FormatMetadata & (FixedFunctionTransform::*)()) + & FixedFunctionTransform::getFormatMetadata, + py::return_value_policy::reference_internal, + DOC(FixedFunctionTransform, getFormatMetadata)) + .def( + "equals", + &FixedFunctionTransform::equals, + "other"_a, + DOC(FixedFunctionTransform, equals)) + .def( + "getStyle", + &FixedFunctionTransform::getStyle, + DOC(FixedFunctionTransform, getStyle)) + .def( + "setStyle", + &FixedFunctionTransform::setStyle, + "style"_a, + DOC(FixedFunctionTransform, setStyle)) + .def( + "getParams", + [](FixedFunctionTransformRcPtr self) { return getParamsStdVec(self); }, + DOC(FixedFunctionTransform, getParams)) + .def( + "setParams", + [](FixedFunctionTransformRcPtr self, const std::vector & params) { + self->setParams(params.data(), params.size()); + }, + "params"_a, + DOC(FixedFunctionTransform, setParams)); defRepr(clsFixedFunctionTransform); } diff --git a/src/bindings/python/transforms/PyGradingPrimaryTransform.cpp b/src/bindings/python/transforms/PyGradingPrimaryTransform.cpp index 3aaeaa5e61..a49e087f48 100644 --- a/src/bindings/python/transforms/PyGradingPrimaryTransform.cpp +++ b/src/bindings/python/transforms/PyGradingPrimaryTransform.cpp @@ -10,64 +10,84 @@ void bindPyGradingPrimaryTransform(py::module & m) { GradingPrimaryTransformRcPtr DEFAULT = GradingPrimaryTransform::Create(GRADING_LOG); - auto clsGradingPrimaryTransform = - py::class_( - m.attr("GradingPrimaryTransform")) + auto clsGradingPrimaryTransform + = py::class_( + m.attr("GradingPrimaryTransform")) - .def(py::init([](const GradingPrimary & values, - GradingStyle style, - bool dynamic, - TransformDirection dir) - { - GradingPrimaryTransformRcPtr p = GradingPrimaryTransform::Create(style); - p->setStyle(style); - p->setValue(values); - if (dynamic) { p->makeDynamic(); } - p->setDirection(dir); - p->validate(); - return p; - }), - "values"_a, - "style"_a = DEFAULT->getStyle(), - "dynamic"_a = DEFAULT->isDynamic(), - "dir"_a = DEFAULT->getDirection(), - DOC(GradingPrimaryTransform, Create)) - .def(py::init([](GradingStyle style, bool dynamic, TransformDirection dir) - { - GradingPrimaryTransformRcPtr p = GradingPrimaryTransform::Create(style); - p->setStyle(style); - if (dynamic) - { - p->makeDynamic(); - } - p->setDirection(dir); - p->validate(); - return p; - }), - "style"_a = DEFAULT->getStyle(), - "dynamic"_a = DEFAULT->isDynamic(), - "dir"_a = DEFAULT->getDirection(), - DOC(GradingPrimaryTransform, Create)) + .def( + py::init([](const GradingPrimary & values, + GradingStyle style, + bool dynamic, + TransformDirection dir) { + GradingPrimaryTransformRcPtr p = GradingPrimaryTransform::Create(style); + p->setStyle(style); + p->setValue(values); + if (dynamic) + { + p->makeDynamic(); + } + p->setDirection(dir); + p->validate(); + return p; + }), + "values"_a, + "style"_a = DEFAULT->getStyle(), + "dynamic"_a = DEFAULT->isDynamic(), + "dir"_a = DEFAULT->getDirection(), + DOC(GradingPrimaryTransform, Create)) + .def( + py::init([](GradingStyle style, bool dynamic, TransformDirection dir) { + GradingPrimaryTransformRcPtr p = GradingPrimaryTransform::Create(style); + p->setStyle(style); + if (dynamic) + { + p->makeDynamic(); + } + p->setDirection(dir); + p->validate(); + return p; + }), + "style"_a = DEFAULT->getStyle(), + "dynamic"_a = DEFAULT->isDynamic(), + "dir"_a = DEFAULT->getDirection(), + DOC(GradingPrimaryTransform, Create)) - .def("getFormatMetadata", - (FormatMetadata & (GradingPrimaryTransform::*)()) - &GradingPrimaryTransform::getFormatMetadata, - py::return_value_policy::reference_internal, - DOC(GradingPrimaryTransform, getFormatMetadata)) - .def("getStyle", &GradingPrimaryTransform::getStyle, - DOC(GradingPrimaryTransform, getStyle)) - .def("setStyle", &GradingPrimaryTransform::setStyle, "style"_a, - DOC(GradingPrimaryTransform, setStyle)) - .def("getValue", &GradingPrimaryTransform::getValue, - DOC(GradingPrimaryTransform, getValue)) - .def("setValue", &GradingPrimaryTransform::setValue, "values"_a, - DOC(GradingPrimaryTransform, setValue)) - .def("isDynamic", &GradingPrimaryTransform::isDynamic, - DOC(GradingPrimaryTransform, isDynamic)) - .def("makeDynamic", &GradingPrimaryTransform::makeDynamic, - DOC(GradingPrimaryTransform, makeDynamic)) - .def("makeNonDynamic", &GradingPrimaryTransform::makeNonDynamic, - DOC(GradingPrimaryTransform, makeNonDynamic)); + .def( + "getFormatMetadata", + (FormatMetadata & (GradingPrimaryTransform::*)()) + & GradingPrimaryTransform::getFormatMetadata, + py::return_value_policy::reference_internal, + DOC(GradingPrimaryTransform, getFormatMetadata)) + .def( + "getStyle", + &GradingPrimaryTransform::getStyle, + DOC(GradingPrimaryTransform, getStyle)) + .def( + "setStyle", + &GradingPrimaryTransform::setStyle, + "style"_a, + DOC(GradingPrimaryTransform, setStyle)) + .def( + "getValue", + &GradingPrimaryTransform::getValue, + DOC(GradingPrimaryTransform, getValue)) + .def( + "setValue", + &GradingPrimaryTransform::setValue, + "values"_a, + DOC(GradingPrimaryTransform, setValue)) + .def( + "isDynamic", + &GradingPrimaryTransform::isDynamic, + DOC(GradingPrimaryTransform, isDynamic)) + .def( + "makeDynamic", + &GradingPrimaryTransform::makeDynamic, + DOC(GradingPrimaryTransform, makeDynamic)) + .def( + "makeNonDynamic", + &GradingPrimaryTransform::makeNonDynamic, + DOC(GradingPrimaryTransform, makeNonDynamic)); defRepr(clsGradingPrimaryTransform); } diff --git a/src/bindings/python/transforms/PyGradingRGBCurveTransform.cpp b/src/bindings/python/transforms/PyGradingRGBCurveTransform.cpp index e37eed153a..ac2df259ef 100644 --- a/src/bindings/python/transforms/PyGradingRGBCurveTransform.cpp +++ b/src/bindings/python/transforms/PyGradingRGBCurveTransform.cpp @@ -10,74 +10,111 @@ void bindPyGradingRGBCurveTransform(py::module & m) { GradingRGBCurveTransformRcPtr DEFAULT = GradingRGBCurveTransform::Create(GRADING_LOG); - auto clsGradingRGBCurveTransform = - py::class_( - m.attr("GradingRGBCurveTransform")) + auto clsGradingRGBCurveTransform + = py::class_( + m.attr("GradingRGBCurveTransform")) - .def(py::init([](const ConstGradingRGBCurveRcPtr & values, - GradingStyle style, - bool dynamic, - TransformDirection dir) - { - GradingRGBCurveTransformRcPtr p = GradingRGBCurveTransform::Create(style); - p->setStyle(style); - p->setValue(values); - if (dynamic) { p->makeDynamic(); } - p->setDirection(dir); - p->validate(); - return p; - }), - "values"_a, - "style"_a = DEFAULT->getStyle(), - "dynamic"_a = DEFAULT->isDynamic(), - "dir"_a = DEFAULT->getDirection(), - DOC(GradingRGBCurveTransform, Create)) - .def(py::init([](GradingStyle style, bool dynamic, TransformDirection dir) - { - GradingRGBCurveTransformRcPtr p = GradingRGBCurveTransform::Create(style); - p->setStyle(style); - if (dynamic) - { - p->makeDynamic(); - } - p->setDirection(dir); - p->validate(); - return p; - }), - "style"_a = DEFAULT->getStyle(), - "dynamic"_a = DEFAULT->isDynamic(), - "dir"_a = DEFAULT->getDirection(), - DOC(GradingRGBCurveTransform, Create)) + .def( + py::init([](const ConstGradingRGBCurveRcPtr & values, + GradingStyle style, + bool dynamic, + TransformDirection dir) { + GradingRGBCurveTransformRcPtr p = GradingRGBCurveTransform::Create(style); + p->setStyle(style); + p->setValue(values); + if (dynamic) + { + p->makeDynamic(); + } + p->setDirection(dir); + p->validate(); + return p; + }), + "values"_a, + "style"_a = DEFAULT->getStyle(), + "dynamic"_a = DEFAULT->isDynamic(), + "dir"_a = DEFAULT->getDirection(), + DOC(GradingRGBCurveTransform, Create)) + .def( + py::init([](GradingStyle style, bool dynamic, TransformDirection dir) { + GradingRGBCurveTransformRcPtr p = GradingRGBCurveTransform::Create(style); + p->setStyle(style); + if (dynamic) + { + p->makeDynamic(); + } + p->setDirection(dir); + p->validate(); + return p; + }), + "style"_a = DEFAULT->getStyle(), + "dynamic"_a = DEFAULT->isDynamic(), + "dir"_a = DEFAULT->getDirection(), + DOC(GradingRGBCurveTransform, Create)) - .def("getFormatMetadata", - (FormatMetadata & (GradingRGBCurveTransform::*)()) - &GradingRGBCurveTransform::getFormatMetadata, - py::return_value_policy::reference_internal, - DOC(GradingRGBCurveTransform, getFormatMetadata)) - .def("getStyle", &GradingRGBCurveTransform::getStyle, - DOC(GradingRGBCurveTransform, getStyle)) - .def("setStyle", &GradingRGBCurveTransform::setStyle, "style"_a, - DOC(GradingRGBCurveTransform, setStyle)) - .def("getValue", &GradingRGBCurveTransform::getValue, - DOC(GradingRGBCurveTransform, getValue)) - .def("setValue", &GradingRGBCurveTransform::setValue, "values"_a, - DOC(GradingRGBCurveTransform, setValue)) - .def("getSlope", &GradingRGBCurveTransform::getSlope, "channel"_a, "index"_a, - DOC(GradingRGBCurveTransform, getSlope)) - .def("setSlope", &GradingRGBCurveTransform::setSlope, "channel"_a, "index"_a, "slope"_a, - DOC(GradingRGBCurveTransform, setSlope)) - .def("slopesAreDefault", &GradingRGBCurveTransform::slopesAreDefault, "channel"_a, - DOC(GradingRGBCurveTransform, slopesAreDefault)) - .def("getBypassLinToLog", &GradingRGBCurveTransform::getBypassLinToLog, - DOC(GradingRGBCurveTransform, getBypassLinToLog)) - .def("setBypassLinToLog", &GradingRGBCurveTransform::setBypassLinToLog, "bypass"_a, - DOC(GradingRGBCurveTransform, setBypassLinToLog)) - .def("isDynamic", &GradingRGBCurveTransform::isDynamic, - DOC(GradingRGBCurveTransform, isDynamic)) - .def("makeDynamic", &GradingRGBCurveTransform::makeDynamic, - DOC(GradingRGBCurveTransform, makeDynamic)) - .def("makeNonDynamic", &GradingRGBCurveTransform::makeNonDynamic, - DOC(GradingRGBCurveTransform, makeNonDynamic)); + .def( + "getFormatMetadata", + (FormatMetadata & (GradingRGBCurveTransform::*)()) + & GradingRGBCurveTransform::getFormatMetadata, + py::return_value_policy::reference_internal, + DOC(GradingRGBCurveTransform, getFormatMetadata)) + .def( + "getStyle", + &GradingRGBCurveTransform::getStyle, + DOC(GradingRGBCurveTransform, getStyle)) + .def( + "setStyle", + &GradingRGBCurveTransform::setStyle, + "style"_a, + DOC(GradingRGBCurveTransform, setStyle)) + .def( + "getValue", + &GradingRGBCurveTransform::getValue, + DOC(GradingRGBCurveTransform, getValue)) + .def( + "setValue", + &GradingRGBCurveTransform::setValue, + "values"_a, + DOC(GradingRGBCurveTransform, setValue)) + .def( + "getSlope", + &GradingRGBCurveTransform::getSlope, + "channel"_a, + "index"_a, + DOC(GradingRGBCurveTransform, getSlope)) + .def( + "setSlope", + &GradingRGBCurveTransform::setSlope, + "channel"_a, + "index"_a, + "slope"_a, + DOC(GradingRGBCurveTransform, setSlope)) + .def( + "slopesAreDefault", + &GradingRGBCurveTransform::slopesAreDefault, + "channel"_a, + DOC(GradingRGBCurveTransform, slopesAreDefault)) + .def( + "getBypassLinToLog", + &GradingRGBCurveTransform::getBypassLinToLog, + DOC(GradingRGBCurveTransform, getBypassLinToLog)) + .def( + "setBypassLinToLog", + &GradingRGBCurveTransform::setBypassLinToLog, + "bypass"_a, + DOC(GradingRGBCurveTransform, setBypassLinToLog)) + .def( + "isDynamic", + &GradingRGBCurveTransform::isDynamic, + DOC(GradingRGBCurveTransform, isDynamic)) + .def( + "makeDynamic", + &GradingRGBCurveTransform::makeDynamic, + DOC(GradingRGBCurveTransform, makeDynamic)) + .def( + "makeNonDynamic", + &GradingRGBCurveTransform::makeNonDynamic, + DOC(GradingRGBCurveTransform, makeNonDynamic)); defRepr(clsGradingRGBCurveTransform); } diff --git a/src/bindings/python/transforms/PyGradingToneTransform.cpp b/src/bindings/python/transforms/PyGradingToneTransform.cpp index a3124c42e7..a0e3cff372 100644 --- a/src/bindings/python/transforms/PyGradingToneTransform.cpp +++ b/src/bindings/python/transforms/PyGradingToneTransform.cpp @@ -10,64 +10,78 @@ void bindPyGradingToneTransform(py::module & m) { GradingToneTransformRcPtr DEFAULT = GradingToneTransform::Create(GRADING_LOG); - auto clsGradingToneTransform = - py::class_( - m.attr("GradingToneTransform")) + auto clsGradingToneTransform + = py::class_( + m.attr("GradingToneTransform")) - .def(py::init([](const GradingTone & values, - GradingStyle style, - bool dynamic, - TransformDirection dir) - { - GradingToneTransformRcPtr p = GradingToneTransform::Create(style); - p->setStyle(style); - p->setValue(values); - if (dynamic) { p->makeDynamic(); } - p->setDirection(dir); - p->validate(); - return p; - }), - "values"_a, - "style"_a = DEFAULT->getStyle(), - "dynamic"_a = DEFAULT->isDynamic(), - "dir"_a = DEFAULT->getDirection(), - DOC(GradingToneTransform, Create)) - .def(py::init([](GradingStyle style, bool dynamic, TransformDirection dir) - { - GradingToneTransformRcPtr p = GradingToneTransform::Create(style); - p->setStyle(style); - if (dynamic) - { - p->makeDynamic(); - } - p->setDirection(dir); - p->validate(); - return p; - }), - "style"_a = DEFAULT->getStyle(), - "dynamic"_a = DEFAULT->isDynamic(), - "dir"_a = DEFAULT->getDirection(), - DOC(GradingToneTransform, Create)) + .def( + py::init([](const GradingTone & values, + GradingStyle style, + bool dynamic, + TransformDirection dir) { + GradingToneTransformRcPtr p = GradingToneTransform::Create(style); + p->setStyle(style); + p->setValue(values); + if (dynamic) + { + p->makeDynamic(); + } + p->setDirection(dir); + p->validate(); + return p; + }), + "values"_a, + "style"_a = DEFAULT->getStyle(), + "dynamic"_a = DEFAULT->isDynamic(), + "dir"_a = DEFAULT->getDirection(), + DOC(GradingToneTransform, Create)) + .def( + py::init([](GradingStyle style, bool dynamic, TransformDirection dir) { + GradingToneTransformRcPtr p = GradingToneTransform::Create(style); + p->setStyle(style); + if (dynamic) + { + p->makeDynamic(); + } + p->setDirection(dir); + p->validate(); + return p; + }), + "style"_a = DEFAULT->getStyle(), + "dynamic"_a = DEFAULT->isDynamic(), + "dir"_a = DEFAULT->getDirection(), + DOC(GradingToneTransform, Create)) - .def("getFormatMetadata", - (FormatMetadata & (GradingToneTransform::*)()) - &GradingToneTransform::getFormatMetadata, - py::return_value_policy::reference_internal, - DOC(GradingToneTransform, getFormatMetadata)) - .def("getStyle", &GradingToneTransform::getStyle, - DOC(GradingToneTransform, getStyle)) - .def("setStyle", &GradingToneTransform::setStyle, "style"_a, - DOC(GradingToneTransform, setStyle)) - .def("getValue", &GradingToneTransform::getValue, - DOC(GradingToneTransform, getValue)) - .def("setValue", &GradingToneTransform::setValue, "values"_a, - DOC(GradingToneTransform, setValue)) - .def("isDynamic", &GradingToneTransform::isDynamic, - DOC(GradingToneTransform, isDynamic)) - .def("makeDynamic", &GradingToneTransform::makeDynamic, - DOC(GradingToneTransform, makeDynamic)) - .def("makeNonDynamic", &GradingToneTransform::makeNonDynamic, - DOC(GradingToneTransform, makeNonDynamic)); + .def( + "getFormatMetadata", + (FormatMetadata & (GradingToneTransform::*)()) + & GradingToneTransform::getFormatMetadata, + py::return_value_policy::reference_internal, + DOC(GradingToneTransform, getFormatMetadata)) + .def("getStyle", &GradingToneTransform::getStyle, DOC(GradingToneTransform, getStyle)) + .def( + "setStyle", + &GradingToneTransform::setStyle, + "style"_a, + DOC(GradingToneTransform, setStyle)) + .def("getValue", &GradingToneTransform::getValue, DOC(GradingToneTransform, getValue)) + .def( + "setValue", + &GradingToneTransform::setValue, + "values"_a, + DOC(GradingToneTransform, setValue)) + .def( + "isDynamic", + &GradingToneTransform::isDynamic, + DOC(GradingToneTransform, isDynamic)) + .def( + "makeDynamic", + &GradingToneTransform::makeDynamic, + DOC(GradingToneTransform, makeDynamic)) + .def( + "makeNonDynamic", + &GradingToneTransform::makeNonDynamic, + DOC(GradingToneTransform, makeNonDynamic)); defRepr(clsGradingToneTransform); } diff --git a/src/bindings/python/transforms/PyGroupTransform.cpp b/src/bindings/python/transforms/PyGroupTransform.cpp index 2b5757427f..a34c1eaa11 100644 --- a/src/bindings/python/transforms/PyGroupTransform.cpp +++ b/src/bindings/python/transforms/PyGroupTransform.cpp @@ -8,7 +8,7 @@ namespace OCIO_NAMESPACE { -namespace +namespace { enum GroupTransformIterator @@ -17,7 +17,7 @@ enum GroupTransformIterator IT_WRITE_FORMAT }; -using TransformIterator = PyIterator; +using TransformIterator = PyIterator; using WriteFormatIterator = PyIterator; } // namespace @@ -26,66 +26,62 @@ void bindPyGroupTransform(py::module & m) { GroupTransformRcPtr DEFAULT = GroupTransform::Create(); - auto clsGroupTransform = - py::class_( - m.attr("GroupTransform")); + auto clsGroupTransform + = py::class_(m.attr("GroupTransform")); - auto clsTransformIterator = - py::class_( - clsGroupTransform, "TransformIterator"); + auto clsTransformIterator + = py::class_(clsGroupTransform, "TransformIterator"); - auto clsWriteFormatIterator = - py::class_( - clsGroupTransform, "WriteFormatIterator"); + auto clsWriteFormatIterator + = py::class_(clsGroupTransform, "WriteFormatIterator"); - clsGroupTransform - .def(py::init(&GroupTransform::Create), - DOC(GroupTransform, Create)) - .def(py::init([](const std::vector transforms, - TransformDirection dir) - { + clsGroupTransform.def(py::init(&GroupTransform::Create), DOC(GroupTransform, Create)) + .def( + py::init([](const std::vector transforms, TransformDirection dir) { GroupTransformRcPtr p = GroupTransform::Create(); - for(auto & t : transforms) + for (auto & t : transforms) { p->appendTransform(t); } p->setDirection(dir); p->validate(); return p; - }), - "transforms"_a = std::vector{}, - "direction"_a = DEFAULT->getDirection(), - DOC(GroupTransform, Create)) - - .def_static("GetWriteFormats", []() - { - return WriteFormatIterator(nullptr); - }) - - .def("__iter__", [](GroupTransformRcPtr & self) - { - return TransformIterator(self); - }) - .def("__len__", &GroupTransform::getNumTransforms, - DOC(GroupTransform, getNumTransforms)) - .def("__getitem__", - (TransformRcPtr & (GroupTransform::*)(int)) &GroupTransform::getTransform, - "index"_a, - DOC(GroupTransform, getTransform)) - - .def("getFormatMetadata", - (FormatMetadata & (GroupTransform::*)()) &GroupTransform::getFormatMetadata, - py::return_value_policy::reference_internal, - DOC(GroupTransform, getFormatMetadata)) - .def("appendTransform", &GroupTransform::appendTransform, "transform"_a, - DOC(GroupTransform, appendTransform)) - .def("prependTransform", &GroupTransform::prependTransform, "transform"_a, - DOC(GroupTransform, prependTransform)) - .def("write", [](GroupTransformRcPtr & self, - const std::string & formatName, - const std::string & fileName, - ConstConfigRcPtr & config) - { + }), + "transforms"_a = std::vector{}, + "direction"_a = DEFAULT->getDirection(), + DOC(GroupTransform, Create)) + + .def_static("GetWriteFormats", []() { return WriteFormatIterator(nullptr); }) + + .def("__iter__", [](GroupTransformRcPtr & self) { return TransformIterator(self); }) + .def("__len__", &GroupTransform::getNumTransforms, DOC(GroupTransform, getNumTransforms)) + .def( + "__getitem__", + (TransformRcPtr & (GroupTransform::*)(int)) & GroupTransform::getTransform, + "index"_a, + DOC(GroupTransform, getTransform)) + + .def( + "getFormatMetadata", + (FormatMetadata & (GroupTransform::*)()) & GroupTransform::getFormatMetadata, + py::return_value_policy::reference_internal, + DOC(GroupTransform, getFormatMetadata)) + .def( + "appendTransform", + &GroupTransform::appendTransform, + "transform"_a, + DOC(GroupTransform, appendTransform)) + .def( + "prependTransform", + &GroupTransform::prependTransform, + "transform"_a, + DOC(GroupTransform, prependTransform)) + .def( + "write", + [](GroupTransformRcPtr & self, + const std::string & formatName, + const std::string & fileName, + ConstConfigRcPtr & config) { if (!config) { config = GetCurrentConfig(); @@ -97,15 +93,16 @@ void bindPyGroupTransform(py::module & m) std::ofstream f(fileName.c_str()); self->write(config, formatName.c_str(), f); f.close(); - }, - "formatName"_a.none(false), - "fileName"_a.none(false), - "config"_a = nullptr, - DOC(GroupTransform, write)) - .def("write", [](GroupTransformRcPtr & self, - const std::string & formatName, - const ConstConfigRcPtr & config) - { + }, + "formatName"_a.none(false), + "fileName"_a.none(false), + "config"_a = nullptr, + DOC(GroupTransform, write)) + .def( + "write", + [](GroupTransformRcPtr & self, + const std::string & formatName, + const ConstConfigRcPtr & config) { ConstConfigRcPtr cfg = config; if (!config) { @@ -118,54 +115,46 @@ void bindPyGroupTransform(py::module & m) std::ostringstream os; self->write(cfg, formatName.c_str(), os); return os.str(); - }, + }, "formatName"_a.none(false), - "config"_a = nullptr, + "config"_a = nullptr, DOC(GroupTransform, write)); defRepr(clsGroupTransform); clsTransformIterator - .def("__len__", [](TransformIterator & it) - { - return it.m_obj->getNumTransforms(); - }) - .def("__getitem__", [](TransformIterator & it, int i) - { + .def("__len__", [](TransformIterator & it) { return it.m_obj->getNumTransforms(); }) + .def( + "__getitem__", + [](TransformIterator & it, int i) { // GroupTransform provides index check with exception return it.m_obj->getTransform(i); }) - .def("__iter__", [](TransformIterator & it) -> TransformIterator & - { - return it; - }) - .def("__next__", [](TransformIterator & it) - { - int i = it.nextIndex(it.m_obj->getNumTransforms()); - return it.m_obj->getTransform(i); - }); + .def("__iter__", [](TransformIterator & it) -> TransformIterator & { return it; }) + .def("__next__", [](TransformIterator & it) { + int i = it.nextIndex(it.m_obj->getNumTransforms()); + return it.m_obj->getTransform(i); + }); clsWriteFormatIterator - .def("__len__", [](WriteFormatIterator & /* it */) - { - return GroupTransform::GetNumWriteFormats(); - }) - .def("__getitem__", [](WriteFormatIterator & it, int i) - { + .def( + "__len__", + [](WriteFormatIterator & /* it */) { return GroupTransform::GetNumWriteFormats(); }) + .def( + "__getitem__", + [](WriteFormatIterator & it, int i) { it.checkIndex(i, GroupTransform::GetNumWriteFormats()); - return py::make_tuple(GroupTransform::GetFormatNameByIndex(i), - GroupTransform::GetFormatExtensionByIndex(i)); - }) - .def("__iter__", [](WriteFormatIterator & it) -> WriteFormatIterator & - { - return it; + return py::make_tuple( + GroupTransform::GetFormatNameByIndex(i), + GroupTransform::GetFormatExtensionByIndex(i)); }) - .def("__next__", [](WriteFormatIterator & it) - { - int i = it.nextIndex(GroupTransform::GetNumWriteFormats()); - return py::make_tuple(GroupTransform::GetFormatNameByIndex(i), - GroupTransform::GetFormatExtensionByIndex(i)); - }); + .def("__iter__", [](WriteFormatIterator & it) -> WriteFormatIterator & { return it; }) + .def("__next__", [](WriteFormatIterator & it) { + int i = it.nextIndex(GroupTransform::GetNumWriteFormats()); + return py::make_tuple( + GroupTransform::GetFormatNameByIndex(i), + GroupTransform::GetFormatExtensionByIndex(i)); + }); } } // namespace OCIO_NAMESPACE diff --git a/src/bindings/python/transforms/PyLogAffineTransform.cpp b/src/bindings/python/transforms/PyLogAffineTransform.cpp index 30a4f01a1d..1e61018e3e 100644 --- a/src/bindings/python/transforms/PyLogAffineTransform.cpp +++ b/src/bindings/python/transforms/PyLogAffineTransform.cpp @@ -22,100 +22,118 @@ void bindPyLogAffineTransform(py::module & m) std::array DEFAULT_LIN_SIDE_OFFSET; DEFAULT->getLinSideOffsetValue(*reinterpret_cast(DEFAULT_LIN_SIDE_OFFSET.data())); - auto clsLogAffineTransform = - py::class_( - m.attr("LogAffineTransform")) + auto clsLogAffineTransform + = py::class_( + m.attr("LogAffineTransform")) - .def(py::init(&LogAffineTransform::Create), - DOC(LogAffineTransform, Create)) - .def(py::init([](const std::array & logSideSlope, - const std::array & logSideOffset, - const std::array & linSideSlope, - const std::array & linSideOffset, - TransformDirection dir) - { - LogAffineTransformRcPtr p = LogAffineTransform::Create(); - p->setLogSideSlopeValue(*reinterpret_cast(logSideSlope.data())); - p->setLogSideOffsetValue(*reinterpret_cast(logSideOffset.data())); - p->setLinSideSlopeValue(*reinterpret_cast(linSideSlope.data())); - p->setLinSideOffsetValue(*reinterpret_cast(linSideOffset.data())); - p->setDirection(dir); - p->validate(); - return p; - }), - "logSideSlope"_a = DEFAULT_LOG_SIDE_SLOPE, - "logSideOffset"_a = DEFAULT_LOG_SIDE_OFFSET, - "linSideSlope"_a = DEFAULT_LIN_SIDE_SLOPE, - "linSideOffset"_a = DEFAULT_LIN_SIDE_OFFSET, - "direction"_a = DEFAULT->getDirection(), - DOC(LogAffineTransform, Create)) + .def(py::init(&LogAffineTransform::Create), DOC(LogAffineTransform, Create)) + .def( + py::init([](const std::array & logSideSlope, + const std::array & logSideOffset, + const std::array & linSideSlope, + const std::array & linSideOffset, + TransformDirection dir) { + LogAffineTransformRcPtr p = LogAffineTransform::Create(); + p->setLogSideSlopeValue( + *reinterpret_cast(logSideSlope.data())); + p->setLogSideOffsetValue( + *reinterpret_cast(logSideOffset.data())); + p->setLinSideSlopeValue( + *reinterpret_cast(linSideSlope.data())); + p->setLinSideOffsetValue( + *reinterpret_cast(linSideOffset.data())); + p->setDirection(dir); + p->validate(); + return p; + }), + "logSideSlope"_a = DEFAULT_LOG_SIDE_SLOPE, + "logSideOffset"_a = DEFAULT_LOG_SIDE_OFFSET, + "linSideSlope"_a = DEFAULT_LIN_SIDE_SLOPE, + "linSideOffset"_a = DEFAULT_LIN_SIDE_OFFSET, + "direction"_a = DEFAULT->getDirection(), + DOC(LogAffineTransform, Create)) - .def("getFormatMetadata", - (FormatMetadata & (LogAffineTransform::*)()) &LogAffineTransform::getFormatMetadata, - py::return_value_policy::reference_internal, - DOC(LogAffineTransform, getFormatMetadata)) - .def("equals", &LogAffineTransform::equals, "other"_a, - DOC(LogAffineTransform, equals)) - .def("getBase", &LogAffineTransform::getBase, - DOC(LogAffineTransform, getBase)) - .def("setBase", &LogAffineTransform::setBase, "base"_a, - DOC(LogAffineTransform, setBase)) - .def("getLogSideSlopeValue", [](LogAffineTransformRcPtr self) - { - std::array values; - self->getLogSideSlopeValue(*reinterpret_cast(values.data())); - return values; - }, - DOC(LogAffineTransform, getLogSideSlopeValue)) - .def("setLogSideSlopeValue", [](LogAffineTransformRcPtr self, - const std::array & values) - { - self->setLogSideSlopeValue(*reinterpret_cast(values.data())); - }, - "values"_a, - DOC(LogAffineTransform, setLogSideSlopeValue)) - .def("getLogSideOffsetValue", [](LogAffineTransformRcPtr self) - { - std::array values; - self->getLogSideOffsetValue(*reinterpret_cast(values.data())); - return values; - }, - DOC(LogAffineTransform, getLogSideOffsetValue)) - .def("setLogSideOffsetValue", [](LogAffineTransformRcPtr self, - const std::array & values) - { - self->setLogSideOffsetValue(*reinterpret_cast(values.data())); - }, - "values"_a, - DOC(LogAffineTransform, setLogSideOffsetValue)) - .def("getLinSideSlopeValue", [](LogAffineTransformRcPtr self) - { - std::array values; - self->getLinSideSlopeValue(*reinterpret_cast(values.data())); - return values; - }, - DOC(LogAffineTransform, getLinSideSlopeValue)) - .def("setLinSideSlopeValue", [](LogAffineTransformRcPtr self, - const std::array & values) - { - self->setLinSideSlopeValue(*reinterpret_cast(values.data())); - }, - "values"_a, - DOC(LogAffineTransform, setLinSideSlopeValue)) - .def("getLinSideOffsetValue", [](LogAffineTransformRcPtr self) - { - std::array values; - self->getLinSideOffsetValue(*reinterpret_cast(values.data())); - return values; - }, - DOC(LogAffineTransform, getLinSideOffsetValue)) - .def("setLinSideOffsetValue", [](LogAffineTransformRcPtr self, - const std::array & values) - { - self->setLinSideOffsetValue(*reinterpret_cast(values.data())); - }, - "values"_a, - DOC(LogAffineTransform, setLinSideOffsetValue)); + .def( + "getFormatMetadata", + (FormatMetadata & (LogAffineTransform::*)()) + & LogAffineTransform::getFormatMetadata, + py::return_value_policy::reference_internal, + DOC(LogAffineTransform, getFormatMetadata)) + .def( + "equals", + &LogAffineTransform::equals, + "other"_a, + DOC(LogAffineTransform, equals)) + .def("getBase", &LogAffineTransform::getBase, DOC(LogAffineTransform, getBase)) + .def( + "setBase", + &LogAffineTransform::setBase, + "base"_a, + DOC(LogAffineTransform, setBase)) + .def( + "getLogSideSlopeValue", + [](LogAffineTransformRcPtr self) { + std::array values; + self->getLogSideSlopeValue(*reinterpret_cast(values.data())); + return values; + }, + DOC(LogAffineTransform, getLogSideSlopeValue)) + .def( + "setLogSideSlopeValue", + [](LogAffineTransformRcPtr self, const std::array & values) { + self->setLogSideSlopeValue( + *reinterpret_cast(values.data())); + }, + "values"_a, + DOC(LogAffineTransform, setLogSideSlopeValue)) + .def( + "getLogSideOffsetValue", + [](LogAffineTransformRcPtr self) { + std::array values; + self->getLogSideOffsetValue(*reinterpret_cast(values.data())); + return values; + }, + DOC(LogAffineTransform, getLogSideOffsetValue)) + .def( + "setLogSideOffsetValue", + [](LogAffineTransformRcPtr self, const std::array & values) { + self->setLogSideOffsetValue( + *reinterpret_cast(values.data())); + }, + "values"_a, + DOC(LogAffineTransform, setLogSideOffsetValue)) + .def( + "getLinSideSlopeValue", + [](LogAffineTransformRcPtr self) { + std::array values; + self->getLinSideSlopeValue(*reinterpret_cast(values.data())); + return values; + }, + DOC(LogAffineTransform, getLinSideSlopeValue)) + .def( + "setLinSideSlopeValue", + [](LogAffineTransformRcPtr self, const std::array & values) { + self->setLinSideSlopeValue( + *reinterpret_cast(values.data())); + }, + "values"_a, + DOC(LogAffineTransform, setLinSideSlopeValue)) + .def( + "getLinSideOffsetValue", + [](LogAffineTransformRcPtr self) { + std::array values; + self->getLinSideOffsetValue(*reinterpret_cast(values.data())); + return values; + }, + DOC(LogAffineTransform, getLinSideOffsetValue)) + .def( + "setLinSideOffsetValue", + [](LogAffineTransformRcPtr self, const std::array & values) { + self->setLinSideOffsetValue( + *reinterpret_cast(values.data())); + }, + "values"_a, + DOC(LogAffineTransform, setLinSideOffsetValue)); defRepr(clsLogAffineTransform); } diff --git a/src/bindings/python/transforms/PyLogCameraTransform.cpp b/src/bindings/python/transforms/PyLogCameraTransform.cpp index e70de5a474..19678c374b 100644 --- a/src/bindings/python/transforms/PyLogCameraTransform.cpp +++ b/src/bindings/python/transforms/PyLogCameraTransform.cpp @@ -13,7 +13,7 @@ namespace OCIO_NAMESPACE void bindPyLogCameraTransform(py::module & m) { - const LogCameraTransformRcPtr DEFAULT = LogCameraTransform::Create({ 0.1, 0.1, 0.1 }); + const LogCameraTransformRcPtr DEFAULT = LogCameraTransform::Create({0.1, 0.1, 0.1}); const double DEFAULT_BASE = DEFAULT->getBase(); std::array DEFAULT_LOG_SIDE_SLOPE; @@ -30,154 +30,187 @@ void bindPyLogCameraTransform(py::module & m) std::vector DEFAULT_EMPTY; - auto clsLogCameraTransform = - py::class_( - m.attr("LogCameraTransform")) + auto clsLogCameraTransform + = py::class_( + m.attr("LogCameraTransform")) - .def(py::init([](const std::array & linSideBreak, - double base, - const std::array & logSideSlope, - const std::array & logSideOffset, - const std::array & linSideSlope, - const std::array & linSideOffset, - const std::vector & linearSlope, - TransformDirection dir) - { - LogCameraTransformRcPtr p = LogCameraTransform::Create(*reinterpret_cast(linSideBreak.data())); - p->setBase(base); - p->setLogSideSlopeValue(*reinterpret_cast(logSideSlope.data())); - p->setLogSideOffsetValue(*reinterpret_cast(logSideOffset.data())); - p->setLinSideSlopeValue(*reinterpret_cast(linSideSlope.data())); - p->setLinSideOffsetValue(*reinterpret_cast(linSideOffset.data())); - const size_t linearSlopeSize = linearSlope.size(); - if (linearSlopeSize) - { - if (linearSlopeSize != 3) - { - throw Exception("LinearSlope must be 3 doubles."); - } - p->setLinearSlopeValue(*reinterpret_cast(linearSlope.data())); - } - p->setDirection(dir); - return p; - }), - "linSideBreak"_a, - "base"_a = DEFAULT_BASE, - "logSideSlope"_a = DEFAULT_LOG_SIDE_SLOPE, - "logSideOffset"_a = DEFAULT_LOG_SIDE_OFFSET, - "linSideSlope"_a = DEFAULT_LIN_SIDE_SLOPE, - "linSideOffset"_a = DEFAULT_LIN_SIDE_OFFSET, - "linearSlope"_a = DEFAULT_EMPTY, - "direction"_a = DEFAULT->getDirection(), - DOC(LogCameraTransform, Create)) + .def( + py::init([](const std::array & linSideBreak, + double base, + const std::array & logSideSlope, + const std::array & logSideOffset, + const std::array & linSideSlope, + const std::array & linSideOffset, + const std::vector & linearSlope, + TransformDirection dir) { + LogCameraTransformRcPtr p = LogCameraTransform::Create( + *reinterpret_cast(linSideBreak.data())); + p->setBase(base); + p->setLogSideSlopeValue( + *reinterpret_cast(logSideSlope.data())); + p->setLogSideOffsetValue( + *reinterpret_cast(logSideOffset.data())); + p->setLinSideSlopeValue( + *reinterpret_cast(linSideSlope.data())); + p->setLinSideOffsetValue( + *reinterpret_cast(linSideOffset.data())); + const size_t linearSlopeSize = linearSlope.size(); + if (linearSlopeSize) + { + if (linearSlopeSize != 3) + { + throw Exception("LinearSlope must be 3 doubles."); + } + p->setLinearSlopeValue( + *reinterpret_cast(linearSlope.data())); + } + p->setDirection(dir); + return p; + }), + "linSideBreak"_a, + "base"_a = DEFAULT_BASE, + "logSideSlope"_a = DEFAULT_LOG_SIDE_SLOPE, + "logSideOffset"_a = DEFAULT_LOG_SIDE_OFFSET, + "linSideSlope"_a = DEFAULT_LIN_SIDE_SLOPE, + "linSideOffset"_a = DEFAULT_LIN_SIDE_OFFSET, + "linearSlope"_a = DEFAULT_EMPTY, + "direction"_a = DEFAULT->getDirection(), + DOC(LogCameraTransform, Create)) - .def("getFormatMetadata", - (FormatMetadata & (LogCameraTransform::*)()) &LogCameraTransform::getFormatMetadata, - py::return_value_policy::reference_internal, - DOC(LogCameraTransform, getFormatMetadata)) - .def("equals", &LogCameraTransform::equals, "other"_a, - DOC(LogCameraTransform, equals)) - .def("getBase", &LogCameraTransform::getBase, - DOC(LogCameraTransform, getBase)) - .def("setBase", &LogCameraTransform::setBase, "base"_a, - DOC(LogCameraTransform, setBase)) - .def("getLogSideSlopeValue", [](LogCameraTransformRcPtr self) - { - std::array values; - self->getLogSideSlopeValue(*reinterpret_cast(values.data())); - return values; - }, - DOC(LogCameraTransform, getLogSideSlopeValue)) - .def("setLogSideSlopeValue", [](LogCameraTransformRcPtr self, - const std::array & values) - { - self->setLogSideSlopeValue(*reinterpret_cast(values.data())); - }, - "values"_a, - DOC(LogCameraTransform, setLogSideSlopeValue)) - .def("getLogSideOffsetValue", [](LogCameraTransformRcPtr self) - { - std::array values; - self->getLogSideOffsetValue(*reinterpret_cast(values.data())); - return values; - }, - DOC(LogCameraTransform, getLogSideOffsetValue)) - .def("setLogSideOffsetValue", [](LogCameraTransformRcPtr self, - const std::array & values) - { - self->setLogSideOffsetValue(*reinterpret_cast(values.data())); - }, - "values"_a, - DOC(LogCameraTransform, setLogSideOffsetValue)) - .def("getLinSideSlopeValue", [](LogCameraTransformRcPtr self) - { - std::array values; - self->getLinSideSlopeValue(*reinterpret_cast(values.data())); - return values; - }, - DOC(LogCameraTransform, getLinSideSlopeValue)) - .def("setLinSideSlopeValue", [](LogCameraTransformRcPtr self, - const std::array & values) - { - self->setLinSideSlopeValue(*reinterpret_cast(values.data())); - }, - "values"_a, - DOC(LogCameraTransform, setLinSideSlopeValue)) - .def("getLinSideOffsetValue", [](LogCameraTransformRcPtr self) - { - std::array values; - self->getLinSideOffsetValue(*reinterpret_cast(values.data())); - return values; - }, - DOC(LogCameraTransform, getLinSideOffsetValue)) - .def("setLinSideOffsetValue", [](LogCameraTransformRcPtr self, - const std::array & values) - { - self->setLinSideOffsetValue(*reinterpret_cast(values.data())); - }, - "values"_a, - DOC(LogCameraTransform, setLinSideOffsetValue)) - .def("getLinSideBreakValue", [](LogCameraTransformRcPtr self) - { - std::array values{ { std::numeric_limits::quiet_NaN(), - std::numeric_limits::quiet_NaN(), - std::numeric_limits::quiet_NaN() } }; - self->getLinSideBreakValue(*reinterpret_cast(values.data())); - return values; - }, - DOC(LogCameraTransform, getLinSideBreakValue)) - .def("setLinSideBreakValue", [](LogCameraTransformRcPtr self, - const std::array & values) - { - self->setLinSideBreakValue(*reinterpret_cast(values.data())); - }, - "values"_a, - DOC(LogCameraTransform, setLinSideBreakValue)) - .def("getLinearSlopeValue", [](LogCameraTransformRcPtr self) - { - std::array values{ { std::numeric_limits::quiet_NaN(), - std::numeric_limits::quiet_NaN(), - std::numeric_limits::quiet_NaN() } }; - self->getLinearSlopeValue(*reinterpret_cast(values.data())); - return values; - }, - R"doc( + .def( + "getFormatMetadata", + (FormatMetadata & (LogCameraTransform::*)()) + & LogCameraTransform::getFormatMetadata, + py::return_value_policy::reference_internal, + DOC(LogCameraTransform, getFormatMetadata)) + .def( + "equals", + &LogCameraTransform::equals, + "other"_a, + DOC(LogCameraTransform, equals)) + .def("getBase", &LogCameraTransform::getBase, DOC(LogCameraTransform, getBase)) + .def( + "setBase", + &LogCameraTransform::setBase, + "base"_a, + DOC(LogCameraTransform, setBase)) + .def( + "getLogSideSlopeValue", + [](LogCameraTransformRcPtr self) { + std::array values; + self->getLogSideSlopeValue(*reinterpret_cast(values.data())); + return values; + }, + DOC(LogCameraTransform, getLogSideSlopeValue)) + .def( + "setLogSideSlopeValue", + [](LogCameraTransformRcPtr self, const std::array & values) { + self->setLogSideSlopeValue( + *reinterpret_cast(values.data())); + }, + "values"_a, + DOC(LogCameraTransform, setLogSideSlopeValue)) + .def( + "getLogSideOffsetValue", + [](LogCameraTransformRcPtr self) { + std::array values; + self->getLogSideOffsetValue(*reinterpret_cast(values.data())); + return values; + }, + DOC(LogCameraTransform, getLogSideOffsetValue)) + .def( + "setLogSideOffsetValue", + [](LogCameraTransformRcPtr self, const std::array & values) { + self->setLogSideOffsetValue( + *reinterpret_cast(values.data())); + }, + "values"_a, + DOC(LogCameraTransform, setLogSideOffsetValue)) + .def( + "getLinSideSlopeValue", + [](LogCameraTransformRcPtr self) { + std::array values; + self->getLinSideSlopeValue(*reinterpret_cast(values.data())); + return values; + }, + DOC(LogCameraTransform, getLinSideSlopeValue)) + .def( + "setLinSideSlopeValue", + [](LogCameraTransformRcPtr self, const std::array & values) { + self->setLinSideSlopeValue( + *reinterpret_cast(values.data())); + }, + "values"_a, + DOC(LogCameraTransform, setLinSideSlopeValue)) + .def( + "getLinSideOffsetValue", + [](LogCameraTransformRcPtr self) { + std::array values; + self->getLinSideOffsetValue(*reinterpret_cast(values.data())); + return values; + }, + DOC(LogCameraTransform, getLinSideOffsetValue)) + .def( + "setLinSideOffsetValue", + [](LogCameraTransformRcPtr self, const std::array & values) { + self->setLinSideOffsetValue( + *reinterpret_cast(values.data())); + }, + "values"_a, + DOC(LogCameraTransform, setLinSideOffsetValue)) + .def( + "getLinSideBreakValue", + [](LogCameraTransformRcPtr self) { + std::array values{ + {std::numeric_limits::quiet_NaN(), + std::numeric_limits::quiet_NaN(), + std::numeric_limits::quiet_NaN()} + }; + self->getLinSideBreakValue(*reinterpret_cast(values.data())); + return values; + }, + DOC(LogCameraTransform, getLinSideBreakValue)) + .def( + "setLinSideBreakValue", + [](LogCameraTransformRcPtr self, const std::array & values) { + self->setLinSideBreakValue( + *reinterpret_cast(values.data())); + }, + "values"_a, + DOC(LogCameraTransform, setLinSideBreakValue)) + .def( + "getLinearSlopeValue", + [](LogCameraTransformRcPtr self) { + std::array values{ + {std::numeric_limits::quiet_NaN(), + std::numeric_limits::quiet_NaN(), + std::numeric_limits::quiet_NaN()} + }; + self->getLinearSlopeValue(*reinterpret_cast(values.data())); + return values; + }, + R"doc( Return LinearSlope or 3 qnan values if not defined. )doc") - .def("setLinearSlopeValue", [](LogCameraTransformRcPtr self, - const std::array & values) - { - self->setLinearSlopeValue(*reinterpret_cast(values.data())); - }, - "values"_a, - DOC(LogCameraTransform, setLinearSlopeValue)) - .def("isLinearSlopeValueSet", [](LogCameraTransformRcPtr self) - { - std::array values; - return self->getLinearSlopeValue(*reinterpret_cast(values.data())); - }) - .def("unsetLinearSlopeValue", &LogCameraTransform::unsetLinearSlopeValue, - DOC(LogCameraTransform, unsetLinearSlopeValue)); + .def( + "setLinearSlopeValue", + [](LogCameraTransformRcPtr self, const std::array & values) { + self->setLinearSlopeValue( + *reinterpret_cast(values.data())); + }, + "values"_a, + DOC(LogCameraTransform, setLinearSlopeValue)) + .def( + "isLinearSlopeValueSet", + [](LogCameraTransformRcPtr self) { + std::array values; + return self->getLinearSlopeValue( + *reinterpret_cast(values.data())); + }) + .def( + "unsetLinearSlopeValue", + &LogCameraTransform::unsetLinearSlopeValue, + DOC(LogCameraTransform, unsetLinearSlopeValue)); defRepr(clsLogCameraTransform); } diff --git a/src/bindings/python/transforms/PyLogTransform.cpp b/src/bindings/python/transforms/PyLogTransform.cpp index 2169c448f1..f066bccc55 100644 --- a/src/bindings/python/transforms/PyLogTransform.cpp +++ b/src/bindings/python/transforms/PyLogTransform.cpp @@ -10,35 +10,31 @@ void bindPyLogTransform(py::module & m) { LogTransformRcPtr DEFAULT = LogTransform::Create(); - auto clsLogTransform = - py::class_( - m.attr("LogTransform")) - - .def(py::init(&LogTransform::Create), - DOC(LogTransform, Create)) - - .def(py::init([](double base, TransformDirection dir) - { - LogTransformRcPtr p = LogTransform::Create(); - p->setBase(base); - p->setDirection(dir); - p->validate(); - return p; - }), - "base"_a = DEFAULT->getBase(), - "direction"_a = DEFAULT->getDirection(), - DOC(LogTransform, Create)) - - .def("getFormatMetadata", - (FormatMetadata & (LogTransform::*)()) &LogTransform::getFormatMetadata, - py::return_value_policy::reference_internal, - DOC(LogTransform, getFormatMetadata)) - .def("equals", &LogTransform::equals, "other"_a, - DOC(LogTransform, equals)) - .def("getBase", &LogTransform::getBase, - DOC(LogTransform, getBase)) - .def("setBase", &LogTransform::setBase, "base"_a, - DOC(LogTransform, setBase)); + auto clsLogTransform + = py::class_(m.attr("LogTransform")) + + .def(py::init(&LogTransform::Create), DOC(LogTransform, Create)) + + .def( + py::init([](double base, TransformDirection dir) { + LogTransformRcPtr p = LogTransform::Create(); + p->setBase(base); + p->setDirection(dir); + p->validate(); + return p; + }), + "base"_a = DEFAULT->getBase(), + "direction"_a = DEFAULT->getDirection(), + DOC(LogTransform, Create)) + + .def( + "getFormatMetadata", + (FormatMetadata & (LogTransform::*)()) & LogTransform::getFormatMetadata, + py::return_value_policy::reference_internal, + DOC(LogTransform, getFormatMetadata)) + .def("equals", &LogTransform::equals, "other"_a, DOC(LogTransform, equals)) + .def("getBase", &LogTransform::getBase, DOC(LogTransform, getBase)) + .def("setBase", &LogTransform::setBase, "base"_a, DOC(LogTransform, setBase)); defRepr(clsLogTransform); } diff --git a/src/bindings/python/transforms/PyLookTransform.cpp b/src/bindings/python/transforms/PyLookTransform.cpp index 6f045ce716..1acfd6e911 100644 --- a/src/bindings/python/transforms/PyLookTransform.cpp +++ b/src/bindings/python/transforms/PyLookTransform.cpp @@ -10,51 +10,68 @@ void bindPyLookTransform(py::module & m) { LookTransformRcPtr DEFAULT = LookTransform::Create(); - auto clsLookTransform = - py::class_( - m.attr("LookTransform")) - - .def(py::init(&LookTransform::Create), - DOC(LookTransform, Create)) - .def(py::init([](const std::string & src, - const std::string & dst, - const std::string & looks, - bool skipColorSpaceConversion, - TransformDirection dir) - { - LookTransformRcPtr p = LookTransform::Create(); - if (!src.empty()) { p->setSrc(src.c_str()); } - if (!dst.empty()) { p->setDst(dst.c_str()); } - if (!looks.empty()) { p->setLooks(looks.c_str()); } - p->setSkipColorSpaceConversion(skipColorSpaceConversion); - p->setDirection(dir); - p->validate(); - return p; - }), - "src"_a.none(false), - "dst"_a.none(false), - "looks"_a.none(false) = DEFAULT->getLooks(), - "skipColorSpaceConversion"_a = DEFAULT->getSkipColorSpaceConversion(), - "direction"_a = DEFAULT->getDirection(), - DOC(LookTransform, Create)) - - .def("getSrc", &LookTransform::getSrc, - DOC(LookTransform, getSrc)) - .def("setSrc", &LookTransform::setSrc, "src"_a.none(false), - DOC(LookTransform, setSrc)) - .def("getDst", &LookTransform::getDst, - DOC(LookTransform, getDst)) - .def("setDst", &LookTransform::setDst, "dst"_a.none(false), - DOC(LookTransform, setDst)) - .def("getLooks", &LookTransform::getLooks, - DOC(LookTransform, getLooks)) - .def("setLooks", &LookTransform::setLooks, "looks"_a.none(false), - DOC(LookTransform, setLooks)) - .def("getSkipColorSpaceConversion", &LookTransform::getSkipColorSpaceConversion, - DOC(LookTransform, getSkipColorSpaceConversion)) - .def("setSkipColorSpaceConversion", &LookTransform::setSkipColorSpaceConversion, - "skipColorSpaceConversion"_a, - DOC(LookTransform, setSkipColorSpaceConversion)); + auto clsLookTransform + = py::class_(m.attr("LookTransform")) + + .def(py::init(&LookTransform::Create), DOC(LookTransform, Create)) + .def( + py::init([](const std::string & src, + const std::string & dst, + const std::string & looks, + bool skipColorSpaceConversion, + TransformDirection dir) { + LookTransformRcPtr p = LookTransform::Create(); + if (!src.empty()) + { + p->setSrc(src.c_str()); + } + if (!dst.empty()) + { + p->setDst(dst.c_str()); + } + if (!looks.empty()) + { + p->setLooks(looks.c_str()); + } + p->setSkipColorSpaceConversion(skipColorSpaceConversion); + p->setDirection(dir); + p->validate(); + return p; + }), + "src"_a.none(false), + "dst"_a.none(false), + "looks"_a.none(false) = DEFAULT->getLooks(), + "skipColorSpaceConversion"_a = DEFAULT->getSkipColorSpaceConversion(), + "direction"_a = DEFAULT->getDirection(), + DOC(LookTransform, Create)) + + .def("getSrc", &LookTransform::getSrc, DOC(LookTransform, getSrc)) + .def( + "setSrc", + &LookTransform::setSrc, + "src"_a.none(false), + DOC(LookTransform, setSrc)) + .def("getDst", &LookTransform::getDst, DOC(LookTransform, getDst)) + .def( + "setDst", + &LookTransform::setDst, + "dst"_a.none(false), + DOC(LookTransform, setDst)) + .def("getLooks", &LookTransform::getLooks, DOC(LookTransform, getLooks)) + .def( + "setLooks", + &LookTransform::setLooks, + "looks"_a.none(false), + DOC(LookTransform, setLooks)) + .def( + "getSkipColorSpaceConversion", + &LookTransform::getSkipColorSpaceConversion, + DOC(LookTransform, getSkipColorSpaceConversion)) + .def( + "setSkipColorSpaceConversion", + &LookTransform::setSkipColorSpaceConversion, + "skipColorSpaceConversion"_a, + DOC(LookTransform, setSkipColorSpaceConversion)); defRepr(clsLookTransform); } diff --git a/src/bindings/python/transforms/PyLut1DTransform.cpp b/src/bindings/python/transforms/PyLut1DTransform.cpp index 47ea9f41b8..79c2580bb7 100644 --- a/src/bindings/python/transforms/PyLut1DTransform.cpp +++ b/src/bindings/python/transforms/PyLut1DTransform.cpp @@ -10,129 +10,160 @@ void bindPyLut1DTransform(py::module & m) { Lut1DTransformRcPtr DEFAULT = Lut1DTransform::Create(); - auto clsLut1DTransform = - py::class_( - m.attr("Lut1DTransform")) - - .def(py::init([]() - { - return Lut1DTransform::Create(); - }), - DOC(Lut1DTransform, Create)) - .def(py::init([](unsigned long length, bool isHalfDomain) - { - return Lut1DTransform::Create(length, isHalfDomain); - }), - "length"_a, "inputHalfDomain"_a, - DOC(Lut1DTransform, Create, 2)) - .def(py::init([](unsigned long length, - bool isHalfDomain, - bool isRawHalfs, - BitDepth fileOutputBitDepth, - Lut1DHueAdjust hueAdjust, - Interpolation interpolation, - TransformDirection dir) - { - Lut1DTransformRcPtr p = Lut1DTransform::Create(length, isHalfDomain); - p->setOutputRawHalfs(isRawHalfs); - p->setFileOutputBitDepth(fileOutputBitDepth); - p->setHueAdjust(hueAdjust); - p->setInterpolation(interpolation); - p->setDirection(dir); - p->validate(); - return p; - }), - "length"_a = DEFAULT->getLength(), - "inputHalfDomain"_a = DEFAULT->getInputHalfDomain(), - "outputRawHalfs"_a = DEFAULT->getOutputRawHalfs(), - "fileOutputBitDepth"_a = DEFAULT->getFileOutputBitDepth(), - "hueAdjust"_a = DEFAULT->getHueAdjust(), - "interpolation"_a = DEFAULT->getInterpolation(), - "direction"_a = DEFAULT->getDirection(), - DOC(Lut1DTransform, Create, 2)) - - .def("getFileOutputBitDepth", &Lut1DTransform::getFileOutputBitDepth, - DOC(Lut1DTransform, getFileOutputBitDepth)) - .def("setFileOutputBitDepth", &Lut1DTransform::setFileOutputBitDepth, "bitDepth"_a, - DOC(Lut1DTransform, setFileOutputBitDepth)) - .def("getFormatMetadata", - (FormatMetadata & (Lut1DTransform::*)()) &Lut1DTransform::getFormatMetadata, - py::return_value_policy::reference_internal, - DOC(Lut1DTransform, getFormatMetadata)) - .def("equals", &Lut1DTransform::equals, "other"_a, - DOC(Lut1DTransform, equals)) - .def("getLength", &Lut1DTransform::getLength, - DOC(Lut1DTransform, getLength)) - .def("setLength", &Lut1DTransform::setLength, "length"_a, - DOC(Lut1DTransform, setLength)) - .def("getValue", [](Lut1DTransformRcPtr & self, unsigned long index) - { - float r, g, b; - self->getValue(index, r, g, b); - return py::make_tuple(r, g, b); - }, - "index"_a, - DOC(Lut1DTransform, getValue)) - .def("setValue", &Lut1DTransform::setValue, "index"_a, "r"_a, "g"_a, "b"_a, - DOC(Lut1DTransform, setValue)) - .def("setData", [](Lut1DTransformRcPtr & self, py::buffer & data) - { - py::buffer_info info = data.request(); - checkBufferType(info, py::dtype("float32")); - checkBufferDivisible(info, 3); - - py::gil_scoped_release release; - - unsigned long size = (info.size >= 0 ? static_cast(info.size) : 0); - float * values = static_cast(info.ptr); - - self->setLength(size / 3); - - for (unsigned long i = 0; i < size; i += 3) - { - self->setValue(i / 3, values[i], values[i+1], values[i+2]); - } - }, - "data"_a) - .def("getData", [](Lut1DTransformRcPtr & self) - { - py::gil_scoped_release gil; - - std::vector values; - values.reserve(static_cast(self->getLength() * 3)); - - for (unsigned long i = 0; i < self->getLength(); i++) - { - float r, g, b; - self->getValue(i, r, g, b); - values.push_back(r); - values.push_back(g); - values.push_back(b); - } - - py::gil_scoped_acquire acquire; - - return py::array(py::dtype("float32"), - { static_cast(values.size()) }, - { sizeof(float) }, - values.data()); - }) - .def("getInputHalfDomain", &Lut1DTransform::getInputHalfDomain, - DOC(Lut1DTransform, getInputHalfDomain)) - .def("setInputHalfDomain", &Lut1DTransform::setInputHalfDomain, "isHalfDomain"_a, - DOC(Lut1DTransform, setInputHalfDomain)) - .def("getOutputRawHalfs", &Lut1DTransform::getOutputRawHalfs, - DOC(Lut1DTransform, getOutputRawHalfs)) - .def("setOutputRawHalfs", &Lut1DTransform::setOutputRawHalfs, "isRawHalfs"_a, - DOC(Lut1DTransform, setOutputRawHalfs)) - .def("getHueAdjust", &Lut1DTransform::getHueAdjust, - DOC(Lut1DTransform, getHueAdjust)) - .def("setHueAdjust", &Lut1DTransform::setHueAdjust, "hueAdjust"_a, - DOC(Lut1DTransform, setHueAdjust)) - .def("getInterpolation", &Lut1DTransform::getInterpolation, - DOC(Lut1DTransform, getInterpolation)) - .def("setInterpolation", &Lut1DTransform::setInterpolation, "interpolation"_a, - DOC(Lut1DTransform, setInterpolation)); + auto clsLut1DTransform + = py::class_(m.attr("Lut1DTransform")) + + .def(py::init([]() { return Lut1DTransform::Create(); }), DOC(Lut1DTransform, Create)) + .def( + py::init([](unsigned long length, bool isHalfDomain) { + return Lut1DTransform::Create(length, isHalfDomain); + }), + "length"_a, + "inputHalfDomain"_a, + DOC(Lut1DTransform, Create, 2)) + .def( + py::init([](unsigned long length, + bool isHalfDomain, + bool isRawHalfs, + BitDepth fileOutputBitDepth, + Lut1DHueAdjust hueAdjust, + Interpolation interpolation, + TransformDirection dir) { + Lut1DTransformRcPtr p = Lut1DTransform::Create(length, isHalfDomain); + p->setOutputRawHalfs(isRawHalfs); + p->setFileOutputBitDepth(fileOutputBitDepth); + p->setHueAdjust(hueAdjust); + p->setInterpolation(interpolation); + p->setDirection(dir); + p->validate(); + return p; + }), + "length"_a = DEFAULT->getLength(), + "inputHalfDomain"_a = DEFAULT->getInputHalfDomain(), + "outputRawHalfs"_a = DEFAULT->getOutputRawHalfs(), + "fileOutputBitDepth"_a = DEFAULT->getFileOutputBitDepth(), + "hueAdjust"_a = DEFAULT->getHueAdjust(), + "interpolation"_a = DEFAULT->getInterpolation(), + "direction"_a = DEFAULT->getDirection(), + DOC(Lut1DTransform, Create, 2)) + + .def( + "getFileOutputBitDepth", + &Lut1DTransform::getFileOutputBitDepth, + DOC(Lut1DTransform, getFileOutputBitDepth)) + .def( + "setFileOutputBitDepth", + &Lut1DTransform::setFileOutputBitDepth, + "bitDepth"_a, + DOC(Lut1DTransform, setFileOutputBitDepth)) + .def( + "getFormatMetadata", + (FormatMetadata & (Lut1DTransform::*)()) & Lut1DTransform::getFormatMetadata, + py::return_value_policy::reference_internal, + DOC(Lut1DTransform, getFormatMetadata)) + .def("equals", &Lut1DTransform::equals, "other"_a, DOC(Lut1DTransform, equals)) + .def("getLength", &Lut1DTransform::getLength, DOC(Lut1DTransform, getLength)) + .def( + "setLength", + &Lut1DTransform::setLength, + "length"_a, + DOC(Lut1DTransform, setLength)) + .def( + "getValue", + [](Lut1DTransformRcPtr & self, unsigned long index) { + float r, g, b; + self->getValue(index, r, g, b); + return py::make_tuple(r, g, b); + }, + "index"_a, + DOC(Lut1DTransform, getValue)) + .def( + "setValue", + &Lut1DTransform::setValue, + "index"_a, + "r"_a, + "g"_a, + "b"_a, + DOC(Lut1DTransform, setValue)) + .def( + "setData", + [](Lut1DTransformRcPtr & self, py::buffer & data) { + py::buffer_info info = data.request(); + checkBufferType(info, py::dtype("float32")); + checkBufferDivisible(info, 3); + + py::gil_scoped_release release; + + unsigned long size + = (info.size >= 0 ? static_cast(info.size) : 0); + float * values = static_cast(info.ptr); + + self->setLength(size / 3); + + for (unsigned long i = 0; i < size; i += 3) + { + self->setValue(i / 3, values[i], values[i + 1], values[i + 2]); + } + }, + "data"_a) + .def( + "getData", + [](Lut1DTransformRcPtr & self) { + py::gil_scoped_release gil; + + std::vector values; + values.reserve(static_cast(self->getLength() * 3)); + + for (unsigned long i = 0; i < self->getLength(); i++) + { + float r, g, b; + self->getValue(i, r, g, b); + values.push_back(r); + values.push_back(g); + values.push_back(b); + } + + py::gil_scoped_acquire acquire; + + return py::array( + py::dtype("float32"), + {static_cast(values.size())}, + {sizeof(float)}, + values.data()); + }) + .def( + "getInputHalfDomain", + &Lut1DTransform::getInputHalfDomain, + DOC(Lut1DTransform, getInputHalfDomain)) + .def( + "setInputHalfDomain", + &Lut1DTransform::setInputHalfDomain, + "isHalfDomain"_a, + DOC(Lut1DTransform, setInputHalfDomain)) + .def( + "getOutputRawHalfs", + &Lut1DTransform::getOutputRawHalfs, + DOC(Lut1DTransform, getOutputRawHalfs)) + .def( + "setOutputRawHalfs", + &Lut1DTransform::setOutputRawHalfs, + "isRawHalfs"_a, + DOC(Lut1DTransform, setOutputRawHalfs)) + .def("getHueAdjust", &Lut1DTransform::getHueAdjust, DOC(Lut1DTransform, getHueAdjust)) + .def( + "setHueAdjust", + &Lut1DTransform::setHueAdjust, + "hueAdjust"_a, + DOC(Lut1DTransform, setHueAdjust)) + .def( + "getInterpolation", + &Lut1DTransform::getInterpolation, + DOC(Lut1DTransform, getInterpolation)) + .def( + "setInterpolation", + &Lut1DTransform::setInterpolation, + "interpolation"_a, + DOC(Lut1DTransform, setInterpolation)); defRepr(clsLut1DTransform); } diff --git a/src/bindings/python/transforms/PyLut3DTransform.cpp b/src/bindings/python/transforms/PyLut3DTransform.cpp index bf5d282d82..3168442649 100644 --- a/src/bindings/python/transforms/PyLut3DTransform.cpp +++ b/src/bindings/python/transforms/PyLut3DTransform.cpp @@ -12,130 +12,152 @@ void bindPyLut3DTransform(py::module & m) { Lut3DTransformRcPtr DEFAULT = Lut3DTransform::Create(); - auto clsLut3DTransform = - py::class_( - m.attr("Lut3DTransform")) - - .def(py::init([]() - { - return Lut3DTransform::Create(); - }), - DOC(Lut3DTransform, Create)) - .def(py::init([](unsigned long gridSize) - { - return Lut3DTransform::Create(gridSize); - }), - "gridSize"_a, - DOC(Lut3DTransform, Create, 2)) - .def(py::init([](unsigned long gridSize, - BitDepth fileOutputBitDepth, - Interpolation interpolation, - TransformDirection dir) - { - Lut3DTransformRcPtr p = Lut3DTransform::Create(gridSize); - p->setFileOutputBitDepth(fileOutputBitDepth); - p->setInterpolation(interpolation); - p->setDirection(dir); - p->validate(); - return p; - }), - "gridSize"_a = DEFAULT->getGridSize(), - "fileOutputBitDepth"_a = DEFAULT->getFileOutputBitDepth(), - "interpolation"_a = DEFAULT->getInterpolation(), - "direction"_a = DEFAULT->getDirection(), - DOC(Lut3DTransform, Create, 2)) - - .def("getFileOutputBitDepth", &Lut3DTransform::getFileOutputBitDepth, - DOC(Lut3DTransform, getFileOutputBitDepth)) - .def("setFileOutputBitDepth", &Lut3DTransform::setFileOutputBitDepth, "bitDepth"_a, - DOC(Lut3DTransform, setFileOutputBitDepth)) - .def("getFormatMetadata", - (FormatMetadata & (Lut3DTransform::*)()) &Lut3DTransform::getFormatMetadata, - py::return_value_policy::reference_internal, - DOC(Lut3DTransform, getFormatMetadata)) - .def("equals", &Lut3DTransform::equals, "other"_a, - DOC(Lut3DTransform, equals)) - .def("getGridSize", &Lut3DTransform::getGridSize, - DOC(Lut3DTransform, getGridSize)) - .def("setGridSize", &Lut3DTransform::setGridSize, "gridSize"_a, - DOC(Lut3DTransform, setGridSize)) - .def("getValue", [](Lut3DTransformRcPtr & self, - unsigned long indexR, - unsigned long indexG, - unsigned long indexB) - { - float r, g, b; - self->getValue(indexR, indexG, indexB, r, g, b); - return py::make_tuple(r, g, b); - }, - "indexR"_a, "indexG"_a, "indexB"_a, - DOC(Lut3DTransform, getValue)) - .def("setValue", &Lut3DTransform::setValue, - "indexR"_a, "indexG"_a, "indexB"_a, "r"_a, "g"_a, "b"_a, - DOC(Lut3DTransform, setValue)) - .def("setData", [](Lut3DTransformRcPtr & self, py::buffer & data) - { - py::buffer_info info = data.request(); - checkBufferType(info, py::dtype("float32")); - - unsigned long gs = getBufferLut3DGridSize(info); - - py::gil_scoped_release gil; - - self->setGridSize(gs); - - float * values = static_cast(info.ptr); - - for (unsigned long indexR = 0; indexR < gs; indexR++) - { - for (unsigned long indexG = 0; indexG < gs; indexG++) - { - for (unsigned long indexB = 0; indexB < gs; indexB++) - { - const unsigned long i = 3 * ((indexR*gs + indexG)*gs + indexB); - self->setValue(indexR, indexG, indexB, - values[i], - values[i+1], - values[i+2]); - } - } - } - }, - "data"_a) - .def("getData", [](Lut3DTransformRcPtr & self) - { - py::gil_scoped_release release; - - unsigned long gs = self->getGridSize(); - std::vector values; - values.reserve(static_cast(gs*gs*gs * 3)); - - for (unsigned long indexR = 0; indexR < gs; indexR++) - { - for (unsigned long indexG = 0; indexG < gs; indexG++) - { - for (unsigned long indexB = 0; indexB < gs; indexB++) - { - float r, g, b; - self->getValue(indexR, indexG, indexB, r, g, b); - values.push_back(r); - values.push_back(g); - values.push_back(b); - } - } - } - - py::gil_scoped_acquire acquire; - - return py::array(py::dtype("float32"), - { static_cast(values.size()) }, - { sizeof(float) }, - values.data()); - }) - .def("getInterpolation", &Lut3DTransform::getInterpolation, - DOC(Lut3DTransform, getInterpolation)) - .def("setInterpolation", &Lut3DTransform::setInterpolation, "interpolation"_a, - DOC(Lut3DTransform, setInterpolation)); + auto clsLut3DTransform + = py::class_(m.attr("Lut3DTransform")) + + .def(py::init([]() { return Lut3DTransform::Create(); }), DOC(Lut3DTransform, Create)) + .def( + py::init([](unsigned long gridSize) { return Lut3DTransform::Create(gridSize); }), + "gridSize"_a, + DOC(Lut3DTransform, Create, 2)) + .def( + py::init([](unsigned long gridSize, + BitDepth fileOutputBitDepth, + Interpolation interpolation, + TransformDirection dir) { + Lut3DTransformRcPtr p = Lut3DTransform::Create(gridSize); + p->setFileOutputBitDepth(fileOutputBitDepth); + p->setInterpolation(interpolation); + p->setDirection(dir); + p->validate(); + return p; + }), + "gridSize"_a = DEFAULT->getGridSize(), + "fileOutputBitDepth"_a = DEFAULT->getFileOutputBitDepth(), + "interpolation"_a = DEFAULT->getInterpolation(), + "direction"_a = DEFAULT->getDirection(), + DOC(Lut3DTransform, Create, 2)) + + .def( + "getFileOutputBitDepth", + &Lut3DTransform::getFileOutputBitDepth, + DOC(Lut3DTransform, getFileOutputBitDepth)) + .def( + "setFileOutputBitDepth", + &Lut3DTransform::setFileOutputBitDepth, + "bitDepth"_a, + DOC(Lut3DTransform, setFileOutputBitDepth)) + .def( + "getFormatMetadata", + (FormatMetadata & (Lut3DTransform::*)()) & Lut3DTransform::getFormatMetadata, + py::return_value_policy::reference_internal, + DOC(Lut3DTransform, getFormatMetadata)) + .def("equals", &Lut3DTransform::equals, "other"_a, DOC(Lut3DTransform, equals)) + .def("getGridSize", &Lut3DTransform::getGridSize, DOC(Lut3DTransform, getGridSize)) + .def( + "setGridSize", + &Lut3DTransform::setGridSize, + "gridSize"_a, + DOC(Lut3DTransform, setGridSize)) + .def( + "getValue", + [](Lut3DTransformRcPtr & self, + unsigned long indexR, + unsigned long indexG, + unsigned long indexB) { + float r, g, b; + self->getValue(indexR, indexG, indexB, r, g, b); + return py::make_tuple(r, g, b); + }, + "indexR"_a, + "indexG"_a, + "indexB"_a, + DOC(Lut3DTransform, getValue)) + .def( + "setValue", + &Lut3DTransform::setValue, + "indexR"_a, + "indexG"_a, + "indexB"_a, + "r"_a, + "g"_a, + "b"_a, + DOC(Lut3DTransform, setValue)) + .def( + "setData", + [](Lut3DTransformRcPtr & self, py::buffer & data) { + py::buffer_info info = data.request(); + checkBufferType(info, py::dtype("float32")); + + unsigned long gs = getBufferLut3DGridSize(info); + + py::gil_scoped_release gil; + + self->setGridSize(gs); + + float * values = static_cast(info.ptr); + + for (unsigned long indexR = 0; indexR < gs; indexR++) + { + for (unsigned long indexG = 0; indexG < gs; indexG++) + { + for (unsigned long indexB = 0; indexB < gs; indexB++) + { + const unsigned long i + = 3 * ((indexR * gs + indexG) * gs + indexB); + self->setValue( + indexR, + indexG, + indexB, + values[i], + values[i + 1], + values[i + 2]); + } + } + } + }, + "data"_a) + .def( + "getData", + [](Lut3DTransformRcPtr & self) { + py::gil_scoped_release release; + + unsigned long gs = self->getGridSize(); + std::vector values; + values.reserve(static_cast(gs * gs * gs * 3)); + + for (unsigned long indexR = 0; indexR < gs; indexR++) + { + for (unsigned long indexG = 0; indexG < gs; indexG++) + { + for (unsigned long indexB = 0; indexB < gs; indexB++) + { + float r, g, b; + self->getValue(indexR, indexG, indexB, r, g, b); + values.push_back(r); + values.push_back(g); + values.push_back(b); + } + } + } + + py::gil_scoped_acquire acquire; + + return py::array( + py::dtype("float32"), + {static_cast(values.size())}, + {sizeof(float)}, + values.data()); + }) + .def( + "getInterpolation", + &Lut3DTransform::getInterpolation, + DOC(Lut3DTransform, getInterpolation)) + .def( + "setInterpolation", + &Lut3DTransform::setInterpolation, + "interpolation"_a, + DOC(Lut3DTransform, setInterpolation)); defRepr(clsLut3DTransform); } diff --git a/src/bindings/python/transforms/PyMatrixTransform.cpp b/src/bindings/python/transforms/PyMatrixTransform.cpp index 8ce2ab6bd7..5612267905 100644 --- a/src/bindings/python/transforms/PyMatrixTransform.cpp +++ b/src/bindings/python/transforms/PyMatrixTransform.cpp @@ -16,143 +16,165 @@ void bindPyMatrixTransform(py::module & m) std::array DEFAULT_OFFSET; DEFAULT->getOffset(DEFAULT_OFFSET.data()); - auto clsMatrixTransform = - py::class_( - m.attr("MatrixTransform")) + auto clsMatrixTransform + = py::class_(m.attr("MatrixTransform")) - .def(py::init(&MatrixTransform::Create), - DOC(MatrixTransform, Create)) - .def(py::init([](const std::array & m44, - const std::array & offset4, - TransformDirection dir) - { - MatrixTransformRcPtr p = MatrixTransform::Create(); - p->setMatrix(m44.data()); - p->setOffset(offset4.data()); - p->setDirection(dir); - p->validate(); - return p; - }), - "matrix"_a = DEFAULT_MATRIX, - "offset"_a = DEFAULT_OFFSET, - "direction"_a = DEFAULT->getDirection(), - DOC(MatrixTransform, Create)) + .def(py::init(&MatrixTransform::Create), DOC(MatrixTransform, Create)) + .def( + py::init([](const std::array & m44, + const std::array & offset4, + TransformDirection dir) { + MatrixTransformRcPtr p = MatrixTransform::Create(); + p->setMatrix(m44.data()); + p->setOffset(offset4.data()); + p->setDirection(dir); + p->validate(); + return p; + }), + "matrix"_a = DEFAULT_MATRIX, + "offset"_a = DEFAULT_OFFSET, + "direction"_a = DEFAULT->getDirection(), + DOC(MatrixTransform, Create)) - // TODO: Update static convenience functions to construct a MatrixTransform in C++ - .def_static("Fit", [](const std::array & oldmin4, - const std::array & oldmax4, - const std::array & newmin4, - const std::array & newmax4) - { - double m44[16]; - double offset4[4]; - MatrixTransform::Fit(m44, offset4, - oldmin4.data(), oldmax4.data(), - newmin4.data(), newmax4.data()); - MatrixTransformRcPtr p = MatrixTransform::Create(); - p->setMatrix(m44); - p->setOffset(offset4); - p->validate(); - return p; - }, - "oldMin"_a = std::array{ 0.0, 0.0, 0.0, 0.0 }, - "oldMax"_a = std::array{ 1.0, 1.0, 1.0, 1.0 }, - "newMin"_a = std::array{ 0.0, 0.0, 0.0, 0.0 }, - "newMax"_a = std::array{ 1.0, 1.0, 1.0, 1.0 }, - DOC(MatrixTransform, Fit)) - .def_static("Identity", []() - { - double m44[16]; - double offset4[4]; - MatrixTransform::Identity(m44, offset4); - MatrixTransformRcPtr p = MatrixTransform::Create(); - p->setMatrix(m44); - p->setOffset(offset4); - p->validate(); - return p; - }, - DOC(MatrixTransform, Identity)) - .def_static("Sat", [](double sat, const std::array & lumaCoef3) - { - double m44[16]; - double offset4[4]; - MatrixTransform::Sat(m44, offset4, sat, lumaCoef3.data()); - MatrixTransformRcPtr p = MatrixTransform::Create(); - p->setMatrix(m44); - p->setOffset(offset4); - p->validate(); - return p; - }, - "sat"_a, "lumaCoef"_a, - DOC(MatrixTransform, Sat)) - .def_static("Scale", [](const std::array & scale4) - { - double m44[16]; - double offset4[4]; - MatrixTransform::Scale(m44, offset4, scale4.data()); - MatrixTransformRcPtr p = MatrixTransform::Create(); - p->setMatrix(m44); - p->setOffset(offset4); - p->validate(); - return p; - }, - "scale"_a, - DOC(MatrixTransform, Scale)) - .def_static("View", [](std::array & channelHot4, - const std::array & lumaCoef3) - { - double m44[16]; - double offset4[4]; - MatrixTransform::View(m44, offset4, channelHot4.data(), lumaCoef3.data()); - MatrixTransformRcPtr p = MatrixTransform::Create(); - p->setMatrix(m44); - p->setOffset(offset4); - p->validate(); - return p; - }, - "channelHot"_a, "lumaCoef"_a, - DOC(MatrixTransform, View)) + // TODO: Update static convenience functions to construct a MatrixTransform in C++ + .def_static( + "Fit", + [](const std::array & oldmin4, + const std::array & oldmax4, + const std::array & newmin4, + const std::array & newmax4) { + double m44[16]; + double offset4[4]; + MatrixTransform::Fit( + m44, + offset4, + oldmin4.data(), + oldmax4.data(), + newmin4.data(), + newmax4.data()); + MatrixTransformRcPtr p = MatrixTransform::Create(); + p->setMatrix(m44); + p->setOffset(offset4); + p->validate(); + return p; + }, + "oldMin"_a = std::array{0.0, 0.0, 0.0, 0.0}, + "oldMax"_a = std::array{1.0, 1.0, 1.0, 1.0}, + "newMin"_a = std::array{0.0, 0.0, 0.0, 0.0}, + "newMax"_a = std::array{1.0, 1.0, 1.0, 1.0}, + DOC(MatrixTransform, Fit)) + .def_static( + "Identity", + []() { + double m44[16]; + double offset4[4]; + MatrixTransform::Identity(m44, offset4); + MatrixTransformRcPtr p = MatrixTransform::Create(); + p->setMatrix(m44); + p->setOffset(offset4); + p->validate(); + return p; + }, + DOC(MatrixTransform, Identity)) + .def_static( + "Sat", + [](double sat, const std::array & lumaCoef3) { + double m44[16]; + double offset4[4]; + MatrixTransform::Sat(m44, offset4, sat, lumaCoef3.data()); + MatrixTransformRcPtr p = MatrixTransform::Create(); + p->setMatrix(m44); + p->setOffset(offset4); + p->validate(); + return p; + }, + "sat"_a, + "lumaCoef"_a, + DOC(MatrixTransform, Sat)) + .def_static( + "Scale", + [](const std::array & scale4) { + double m44[16]; + double offset4[4]; + MatrixTransform::Scale(m44, offset4, scale4.data()); + MatrixTransformRcPtr p = MatrixTransform::Create(); + p->setMatrix(m44); + p->setOffset(offset4); + p->validate(); + return p; + }, + "scale"_a, + DOC(MatrixTransform, Scale)) + .def_static( + "View", + [](std::array & channelHot4, const std::array & lumaCoef3) { + double m44[16]; + double offset4[4]; + MatrixTransform::View(m44, offset4, channelHot4.data(), lumaCoef3.data()); + MatrixTransformRcPtr p = MatrixTransform::Create(); + p->setMatrix(m44); + p->setOffset(offset4); + p->validate(); + return p; + }, + "channelHot"_a, + "lumaCoef"_a, + DOC(MatrixTransform, View)) - .def("getFormatMetadata", - (FormatMetadata & (MatrixTransform::*)()) &MatrixTransform::getFormatMetadata, - py::return_value_policy::reference_internal, - DOC(MatrixTransform, getFormatMetadata)) - .def("equals", &MatrixTransform::equals, "other"_a, - DOC(MatrixTransform, equals)) - .def("getMatrix", [](MatrixTransformRcPtr self) - { - std::array m44; - self->getMatrix(m44.data()); - return m44; - }, - DOC(MatrixTransform, getMatrix)) - .def("setMatrix", [](MatrixTransformRcPtr self, const std::array & m44) - { - self->setMatrix(m44.data()); - }, - "matrix"_a, - DOC(MatrixTransform, setMatrix)) - .def("getOffset", [](MatrixTransformRcPtr self) - { - std::array offset4; - self->getOffset(offset4.data()); - return offset4; - }, - DOC(MatrixTransform, getOffset)) - .def("setOffset", [](MatrixTransformRcPtr self, const std::array & offset4) - { - self->setOffset(offset4.data()); - }, - "offset"_a, - DOC(MatrixTransform, setOffset)) - .def("getFileInputBitDepth", &MatrixTransform::getFileInputBitDepth, - DOC(MatrixTransform, getFileInputBitDepth)) - .def("setFileInputBitDepth", &MatrixTransform::setFileInputBitDepth, "bitDepth"_a, - DOC(MatrixTransform, setFileInputBitDepth)) - .def("getFileOutputBitDepth", &MatrixTransform::getFileOutputBitDepth, - DOC(MatrixTransform, getFileOutputBitDepth)) - .def("setFileOutputBitDepth", &MatrixTransform::setFileOutputBitDepth, "bitDepth"_a, - DOC(MatrixTransform, setFileOutputBitDepth)); + .def( + "getFormatMetadata", + (FormatMetadata & (MatrixTransform::*)()) & MatrixTransform::getFormatMetadata, + py::return_value_policy::reference_internal, + DOC(MatrixTransform, getFormatMetadata)) + .def("equals", &MatrixTransform::equals, "other"_a, DOC(MatrixTransform, equals)) + .def( + "getMatrix", + [](MatrixTransformRcPtr self) { + std::array m44; + self->getMatrix(m44.data()); + return m44; + }, + DOC(MatrixTransform, getMatrix)) + .def( + "setMatrix", + [](MatrixTransformRcPtr self, const std::array & m44) { + self->setMatrix(m44.data()); + }, + "matrix"_a, + DOC(MatrixTransform, setMatrix)) + .def( + "getOffset", + [](MatrixTransformRcPtr self) { + std::array offset4; + self->getOffset(offset4.data()); + return offset4; + }, + DOC(MatrixTransform, getOffset)) + .def( + "setOffset", + [](MatrixTransformRcPtr self, const std::array & offset4) { + self->setOffset(offset4.data()); + }, + "offset"_a, + DOC(MatrixTransform, setOffset)) + .def( + "getFileInputBitDepth", + &MatrixTransform::getFileInputBitDepth, + DOC(MatrixTransform, getFileInputBitDepth)) + .def( + "setFileInputBitDepth", + &MatrixTransform::setFileInputBitDepth, + "bitDepth"_a, + DOC(MatrixTransform, setFileInputBitDepth)) + .def( + "getFileOutputBitDepth", + &MatrixTransform::getFileOutputBitDepth, + DOC(MatrixTransform, getFileOutputBitDepth)) + .def( + "setFileOutputBitDepth", + &MatrixTransform::setFileOutputBitDepth, + "bitDepth"_a, + DOC(MatrixTransform, setFileOutputBitDepth)); defRepr(clsMatrixTransform); } diff --git a/src/bindings/python/transforms/PyRangeTransform.cpp b/src/bindings/python/transforms/PyRangeTransform.cpp index 680d9c2dcc..f09515c6ba 100644 --- a/src/bindings/python/transforms/PyRangeTransform.cpp +++ b/src/bindings/python/transforms/PyRangeTransform.cpp @@ -10,84 +10,126 @@ void bindPyRangeTransform(py::module & m) { RangeTransformRcPtr DEFAULT = RangeTransform::Create(); - auto clsRangeTransform = - py::class_( - m.attr("RangeTransform")) + auto clsRangeTransform + = py::class_(m.attr("RangeTransform")) - .def(py::init(&RangeTransform::Create), - DOC(RangeTransform, Create)) - .def(py::init([](double minInValue, - double maxInValue, - double minOutValue, - double maxOutValue, - TransformDirection dir) - { - RangeTransformRcPtr p = RangeTransform::Create(); - p->setMinInValue(minInValue); - p->setMaxInValue(maxInValue); - p->setMinOutValue(minOutValue); - p->setMaxOutValue(maxOutValue); - p->setDirection(dir); - p->validate(); - return p; - }), - "minInValue"_a = DEFAULT->getMinInValue(), - "maxInValue"_a = DEFAULT->getMaxInValue(), - "minOutValue"_a = DEFAULT->getMinOutValue(), - "maxOutValue"_a = DEFAULT->getMaxOutValue(), - "direction"_a = DEFAULT->getDirection(), - DOC(RangeTransform, Create)) + .def(py::init(&RangeTransform::Create), DOC(RangeTransform, Create)) + .def( + py::init([](double minInValue, + double maxInValue, + double minOutValue, + double maxOutValue, + TransformDirection dir) { + RangeTransformRcPtr p = RangeTransform::Create(); + p->setMinInValue(minInValue); + p->setMaxInValue(maxInValue); + p->setMinOutValue(minOutValue); + p->setMaxOutValue(maxOutValue); + p->setDirection(dir); + p->validate(); + return p; + }), + "minInValue"_a = DEFAULT->getMinInValue(), + "maxInValue"_a = DEFAULT->getMaxInValue(), + "minOutValue"_a = DEFAULT->getMinOutValue(), + "maxOutValue"_a = DEFAULT->getMaxOutValue(), + "direction"_a = DEFAULT->getDirection(), + DOC(RangeTransform, Create)) - .def("getStyle", &RangeTransform::getStyle, - DOC(RangeTransform, getStyle)) - .def("setStyle", &RangeTransform::setStyle, "style"_a, - DOC(RangeTransform, setStyle)) - .def("getFormatMetadata", - (FormatMetadata & (RangeTransform::*)()) &RangeTransform::getFormatMetadata, - py::return_value_policy::reference_internal, - DOC(RangeTransform, getFormatMetadata)) - .def("equals", &RangeTransform::equals, "other"_a, - DOC(RangeTransform, equals)) - .def("getFileInputBitDepth", &RangeTransform::getFileInputBitDepth, - DOC(RangeTransform, getFileInputBitDepth)) - .def("setFileInputBitDepth", &RangeTransform::setFileInputBitDepth, "bitDepth"_a, - DOC(RangeTransform, setFileInputBitDepth)) - .def("getFileOutputBitDepth", &RangeTransform::getFileOutputBitDepth, - DOC(RangeTransform, getFileOutputBitDepth)) - .def("setFileOutputBitDepth", &RangeTransform::setFileOutputBitDepth, "bitDepth"_a, - DOC(RangeTransform, setFileOutputBitDepth)) - .def("getMinInValue", &RangeTransform::getMinInValue, - DOC(RangeTransform, getMinInValue)) - .def("setMinInValue", &RangeTransform::setMinInValue, "value"_a, - DOC(RangeTransform, setMinInValue)) - .def("hasMinInValue", &RangeTransform::hasMinInValue, - DOC(RangeTransform, hasMinInValue)) - .def("unsetMinInValue", &RangeTransform::unsetMinInValue, - DOC(RangeTransform, unsetMinInValue)) - .def("getMaxInValue", &RangeTransform::getMaxInValue, - DOC(RangeTransform, getMaxInValue)) - .def("setMaxInValue", &RangeTransform::setMaxInValue, "value"_a, - DOC(RangeTransform, setMaxInValue)) - .def("hasMaxInValue", &RangeTransform::hasMaxInValue, - DOC(RangeTransform, hasMaxInValue)) - .def("unsetMaxInValue", &RangeTransform::unsetMaxInValue, - DOC(RangeTransform, unsetMaxInValue)) - .def("getMinOutValue", &RangeTransform::getMinOutValue, - DOC(RangeTransform, getMinOutValue)) - .def("setMinOutValue", &RangeTransform::setMinOutValue, "value"_a, - DOC(RangeTransform, setMinOutValue)) - .def("hasMinOutValue", &RangeTransform::hasMinOutValue, - DOC(RangeTransform, hasMinOutValue)) - .def("unsetMinOutValue", &RangeTransform::unsetMinOutValue, - DOC(RangeTransform, unsetMinOutValue)) - .def("getMaxOutValue", &RangeTransform::getMaxOutValue, - DOC(RangeTransform, getMaxOutValue)) - .def("setMaxOutValue", &RangeTransform::setMaxOutValue, "value"_a, - DOC(RangeTransform, setMaxOutValue)) - .def("hasMaxOutValue", &RangeTransform::hasMaxOutValue, - DOC(RangeTransform, hasMaxOutValue)) - .def("unsetMaxOutValue", &RangeTransform::unsetMaxOutValue, - DOC(RangeTransform, unsetMaxOutValue)); + .def("getStyle", &RangeTransform::getStyle, DOC(RangeTransform, getStyle)) + .def("setStyle", &RangeTransform::setStyle, "style"_a, DOC(RangeTransform, setStyle)) + .def( + "getFormatMetadata", + (FormatMetadata & (RangeTransform::*)()) & RangeTransform::getFormatMetadata, + py::return_value_policy::reference_internal, + DOC(RangeTransform, getFormatMetadata)) + .def("equals", &RangeTransform::equals, "other"_a, DOC(RangeTransform, equals)) + .def( + "getFileInputBitDepth", + &RangeTransform::getFileInputBitDepth, + DOC(RangeTransform, getFileInputBitDepth)) + .def( + "setFileInputBitDepth", + &RangeTransform::setFileInputBitDepth, + "bitDepth"_a, + DOC(RangeTransform, setFileInputBitDepth)) + .def( + "getFileOutputBitDepth", + &RangeTransform::getFileOutputBitDepth, + DOC(RangeTransform, getFileOutputBitDepth)) + .def( + "setFileOutputBitDepth", + &RangeTransform::setFileOutputBitDepth, + "bitDepth"_a, + DOC(RangeTransform, setFileOutputBitDepth)) + .def( + "getMinInValue", + &RangeTransform::getMinInValue, + DOC(RangeTransform, getMinInValue)) + .def( + "setMinInValue", + &RangeTransform::setMinInValue, + "value"_a, + DOC(RangeTransform, setMinInValue)) + .def( + "hasMinInValue", + &RangeTransform::hasMinInValue, + DOC(RangeTransform, hasMinInValue)) + .def( + "unsetMinInValue", + &RangeTransform::unsetMinInValue, + DOC(RangeTransform, unsetMinInValue)) + .def( + "getMaxInValue", + &RangeTransform::getMaxInValue, + DOC(RangeTransform, getMaxInValue)) + .def( + "setMaxInValue", + &RangeTransform::setMaxInValue, + "value"_a, + DOC(RangeTransform, setMaxInValue)) + .def( + "hasMaxInValue", + &RangeTransform::hasMaxInValue, + DOC(RangeTransform, hasMaxInValue)) + .def( + "unsetMaxInValue", + &RangeTransform::unsetMaxInValue, + DOC(RangeTransform, unsetMaxInValue)) + .def( + "getMinOutValue", + &RangeTransform::getMinOutValue, + DOC(RangeTransform, getMinOutValue)) + .def( + "setMinOutValue", + &RangeTransform::setMinOutValue, + "value"_a, + DOC(RangeTransform, setMinOutValue)) + .def( + "hasMinOutValue", + &RangeTransform::hasMinOutValue, + DOC(RangeTransform, hasMinOutValue)) + .def( + "unsetMinOutValue", + &RangeTransform::unsetMinOutValue, + DOC(RangeTransform, unsetMinOutValue)) + .def( + "getMaxOutValue", + &RangeTransform::getMaxOutValue, + DOC(RangeTransform, getMaxOutValue)) + .def( + "setMaxOutValue", + &RangeTransform::setMaxOutValue, + "value"_a, + DOC(RangeTransform, setMaxOutValue)) + .def( + "hasMaxOutValue", + &RangeTransform::hasMaxOutValue, + DOC(RangeTransform, hasMaxOutValue)) + .def( + "unsetMaxOutValue", + &RangeTransform::unsetMaxOutValue, + DOC(RangeTransform, unsetMaxOutValue)); defRepr(clsRangeTransform); } diff --git a/src/libutils/imageioapphelpers/imageio.cpp b/src/libutils/imageioapphelpers/imageio.cpp index b1701f8909..9f0f4c7cb7 100644 --- a/src/libutils/imageioapphelpers/imageio.cpp +++ b/src/libutils/imageioapphelpers/imageio.cpp @@ -11,8 +11,8 @@ namespace OCIO_NAMESPACE namespace { -const std::vector RgbaChans = { "R", "G", "B", "A" }; -const std::vector RgbChans = { "R", "G", "B" }; +const std::vector RgbaChans = {"R", "G", "B", "A"}; +const std::vector RgbChans = {"R", "G", "B"}; std::vector GetChannelNames(const ChannelOrdering & chanOrder) { @@ -56,7 +56,7 @@ size_t GetNumChannels(const ChannelOrdering & chanOrder) unsigned GetChannelSizeInBytes(BitDepth bitdepth) { - switch(bitdepth) + switch (bitdepth) { case BIT_DEPTH_UINT8: return 1; @@ -82,33 +82,32 @@ unsigned GetChannelSizeInBytes(BitDepth bitdepth) } // anonymous namespace -} // OCIO_NAMESPACE +} // namespace OCIO_NAMESPACE #ifdef USE_OPENIMAGEIO -# include "imageio_oiio.cpp" +#include "imageio_oiio.cpp" #elif USE_OPENEXR -# include "imageio_exr.cpp" +#include "imageio_exr.cpp" #else -# error "No image backend found to compile ImageIO." +#error "No image backend found to compile ImageIO." #endif namespace OCIO_NAMESPACE { ImageIO::ImageIO() -: m_impl(new ImageIO::Impl()) + : m_impl(new ImageIO::Impl()) { - } ImageIO::ImageIO(const std::string & filename) -: m_impl(new ImageIO::Impl()) + : m_impl(new ImageIO::Impl()) { m_impl->read(filename, BIT_DEPTH_UNKNOWN); } ImageIO::ImageIO(long width, long height, ChannelOrdering chanOrder, BitDepth bitDepth) -: m_impl(new ImageIO::Impl()) + : m_impl(new ImageIO::Impl()) { m_impl->init(width, height, chanOrder, bitDepth); } @@ -224,5 +223,4 @@ void ImageIO::write(const std::string & filename, BitDepth bitdepth) const m_impl->write(filename, bitdepth); } - } // namespace OCIO_NAMESPACE diff --git a/src/libutils/imageioapphelpers/imageio.h b/src/libutils/imageioapphelpers/imageio.h index 9f831c5d10..6360ad8e8c 100644 --- a/src/libutils/imageioapphelpers/imageio.h +++ b/src/libutils/imageioapphelpers/imageio.h @@ -30,10 +30,10 @@ class ImageIO ImageIO(long width, long height, ChannelOrdering chanOrder, BitDepth bitDepth); ImageIO(const ImageIO & img) = delete; - ImageIO(ImageIO &&) = delete; + ImageIO(ImageIO &&) = delete; - ImageIO & operator = (const ImageIO &) = delete; - ImageIO & operator = (ImageIO &&) = delete; + ImageIO & operator=(const ImageIO &) = delete; + ImageIO & operator=(ImageIO &&) = delete; ~ImageIO(); diff --git a/src/libutils/imageioapphelpers/imageio_exr.cpp b/src/libutils/imageioapphelpers/imageio_exr.cpp index a53f9c745c..8d04f5af7a 100644 --- a/src/libutils/imageioapphelpers/imageio_exr.cpp +++ b/src/libutils/imageioapphelpers/imageio_exr.cpp @@ -4,18 +4,17 @@ #include #include -#include #include -#include +#include +#include #include #include -#include -#include #include #include +#include +#include #include - namespace OCIO_NAMESPACE { @@ -26,8 +25,10 @@ BitDepth BitDepthFromPixelType(Imf::PixelType type) { switch (type) { - case Imf::HALF: return BIT_DEPTH_F16; - case Imf::FLOAT: return BIT_DEPTH_F32; + case Imf::HALF: + return BIT_DEPTH_F16; + case Imf::FLOAT: + return BIT_DEPTH_F32; case Imf::UINT: case Imf::NUM_PIXELTYPES: default: @@ -43,8 +44,10 @@ Imf::PixelType BitDepthToPixelType(BitDepth bitdepth) { switch (bitdepth) { - case BIT_DEPTH_F16: return Imf::HALF; - case BIT_DEPTH_F32: return Imf::FLOAT; + case BIT_DEPTH_F16: + return Imf::HALF; + case BIT_DEPTH_F32: + return Imf::FLOAT; case BIT_DEPTH_UNKNOWN: case BIT_DEPTH_UINT8: case BIT_DEPTH_UINT10: @@ -79,10 +82,10 @@ class ImageIO::Impl Impl() = default; Impl(const Impl &) = delete; - Impl(Impl &&) = delete; + Impl(Impl &&) = delete; - Impl& operator= (const Impl & rhs) = delete; - Impl& operator= (Impl && rhs) = delete; + Impl & operator=(const Impl & rhs) = delete; + Impl & operator=(Impl && rhs) = delete; ~Impl() = default; @@ -119,26 +122,19 @@ class ImageIO::Impl ImageDescRcPtr getImageDesc() const { return std::make_shared( - (void*) getData(), + (void *)getData(), getWidth(), getHeight(), getChannelOrder(), getBitDepth(), getChanStrideBytes(), getXStrideBytes(), - getYStrideBytes() - ); + getYStrideBytes()); } - uint8_t * getData() - { - return m_data.data(); - } + uint8_t * getData() { return m_data.data(); } - const uint8_t * getData() const - { - return m_data.data(); - } + const uint8_t * getData() const { return m_data.data(); } long getWidth() const { @@ -167,7 +163,7 @@ class ImageIO::Impl long getNumChannels() const { - long channel_count = 0; + long channel_count = 0; const Imf::ChannelList & channels = m_header.channels(); for (auto it = channels.begin(); it != channels.end(); ++it) { @@ -193,25 +189,13 @@ class ImageIO::Impl return GetChannelNames(getChannelOrder()); } - ptrdiff_t getChanStrideBytes() const - { - return GetChannelSizeInBytes(getBitDepth()); - } + ptrdiff_t getChanStrideBytes() const { return GetChannelSizeInBytes(getBitDepth()); } - ptrdiff_t getXStrideBytes() const - { - return getNumChannels() * getChanStrideBytes(); - } + ptrdiff_t getXStrideBytes() const { return getNumChannels() * getChanStrideBytes(); } - ptrdiff_t getYStrideBytes() const - { - return getWidth() * getXStrideBytes(); - } + ptrdiff_t getYStrideBytes() const { return getWidth() * getXStrideBytes(); } - ptrdiff_t getImageBytes() const - { - return getYStrideBytes() * getHeight(); - } + ptrdiff_t getImageBytes() const { return getYStrideBytes() * getHeight(); } void attribute(const std::string & name, const std::string & value) { @@ -232,10 +216,10 @@ class ImageIO::Impl { bitDepth = bitDepth == BIT_DEPTH_UNKNOWN ? img.getBitDepth() : bitDepth; - const size_t numChans = img.getNumChannels(); + const size_t numChans = img.getNumChannels(); const size_t bitDepthBytes = GetChannelSizeInBytes(bitDepth); - const size_t imgSizeInBytes = - bitDepthBytes * numChans * (size_t)(img.getWidth() * img.getHeight()); + const size_t imgSizeInBytes + = bitDepthBytes * numChans * (size_t)(img.getWidth() * img.getHeight()); m_data.resize(imgSizeInBytes, 0); @@ -252,8 +236,8 @@ class ImageIO::Impl void init(long width, long height, ChannelOrdering chanOrder, BitDepth bitDepth) { - const size_t numChans = GetNumChannels(chanOrder); - const size_t bitDepthBytes = GetChannelSizeInBytes(bitDepth); + const size_t numChans = GetNumChannels(chanOrder); + const size_t bitDepthBytes = GetChannelSizeInBytes(bitDepth); const size_t imgSizeInBytes = bitDepthBytes * numChans * (size_t)(width * height); m_data.resize(imgSizeInBytes, 0); @@ -318,8 +302,8 @@ class ImageIO::Impl // Allocate buffer for image data const Imath::Box2i & dw = file.header().dataWindow(); - const long width = (long)(dw.max.x - dw.min.x + 1); - const long height = (long)(dw.max.y - dw.min.y + 1); + const long width = (long)(dw.max.x - dw.min.x + 1); + const long height = (long)(dw.max.y - dw.min.y + 1); init(width, height, chanOrder, BitDepthFromPixelType(pixelType)); // Copy existing attributes, except for channels which we force to @@ -351,13 +335,13 @@ class ImageIO::Impl chanNames[i], Imf::Slice( pixelType, - (char *)(getData() - x*xStride - y*yStride + i*chanStride), - xStride, yStride, - 1, 1, + (char *)(getData() - x * xStride - y * yStride + i * chanStride), + xStride, + yStride, + 1, + 1, // RGB default to 0.0, A default to 1.0 - (i == 3 ? 1.0 : 0.0) - ) - ); + (i == 3 ? 1.0 : 0.0))); } file.setFrameBuffer(frameBuffer); @@ -398,19 +382,18 @@ class ImageIO::Impl chanNames[i], Imf::Slice( pixelType, - (char *)(getData() - x*xStride - y*yStride + i*chanStride), - xStride, yStride, - 1, 1, + (char *)(getData() - x * xStride - y * yStride + i * chanStride), + xStride, + yStride, + 1, + 1, // RGB default to 0.0, A default to 1.0 - (i == 3 ? 1.0 : 0.0) - ) - ); + (i == 3 ? 1.0 : 0.0))); } file.setFrameBuffer(frameBuffer); file.writePixels(getHeight()); } - }; } // namespace OCIO_NAMESPACE diff --git a/src/libutils/imageioapphelpers/imageio_oiio.cpp b/src/libutils/imageioapphelpers/imageio_oiio.cpp index 9505af6ee6..7251cbdd62 100644 --- a/src/libutils/imageioapphelpers/imageio_oiio.cpp +++ b/src/libutils/imageioapphelpers/imageio_oiio.cpp @@ -6,7 +6,6 @@ #include #include - namespace OCIO_NAMESPACE { @@ -17,10 +16,14 @@ BitDepth BitDepthFromTypeDesc(OIIO::TypeDesc type) { switch (type.basetype) { - case OIIO::TypeDesc::UINT8: return BIT_DEPTH_UINT8; - case OIIO::TypeDesc::UINT16: return BIT_DEPTH_UINT16; - case OIIO::TypeDesc::HALF: return BIT_DEPTH_F16; - case OIIO::TypeDesc::FLOAT: return BIT_DEPTH_F32; + case OIIO::TypeDesc::UINT8: + return BIT_DEPTH_UINT8; + case OIIO::TypeDesc::UINT16: + return BIT_DEPTH_UINT16; + case OIIO::TypeDesc::HALF: + return BIT_DEPTH_F16; + case OIIO::TypeDesc::FLOAT: + return BIT_DEPTH_F32; case OIIO::TypeDesc::UNKNOWN: case OIIO::TypeDesc::NONE: case OIIO::TypeDesc::INT8: @@ -46,11 +49,16 @@ OIIO::TypeDesc BitDepthToTypeDesc(BitDepth bitdepth) { switch (bitdepth) { - case BIT_DEPTH_UINT8: return OIIO::TypeDesc(OIIO::TypeDesc::UINT8); - case BIT_DEPTH_UINT16: return OIIO::TypeDesc(OIIO::TypeDesc::UINT16); - case BIT_DEPTH_F16: return OIIO::TypeDesc(OIIO::TypeDesc::HALF); - case BIT_DEPTH_F32: return OIIO::TypeDesc(OIIO::TypeDesc::FLOAT); - case BIT_DEPTH_UNKNOWN: return OIIO::TypeDesc(OIIO::TypeDesc::UNKNOWN); + case BIT_DEPTH_UINT8: + return OIIO::TypeDesc(OIIO::TypeDesc::UINT8); + case BIT_DEPTH_UINT16: + return OIIO::TypeDesc(OIIO::TypeDesc::UINT16); + case BIT_DEPTH_F16: + return OIIO::TypeDesc(OIIO::TypeDesc::HALF); + case BIT_DEPTH_F32: + return OIIO::TypeDesc(OIIO::TypeDesc::FLOAT); + case BIT_DEPTH_UNKNOWN: + return OIIO::TypeDesc(OIIO::TypeDesc::UNKNOWN); case BIT_DEPTH_UINT10: case BIT_DEPTH_UINT12: case BIT_DEPTH_UINT14: @@ -81,10 +89,10 @@ class ImageIO::Impl Impl() = default; Impl(const Impl &) = delete; - Impl(Impl &&) = delete; + Impl(Impl &&) = delete; - Impl& operator= (const Impl & rhs) = delete; - Impl& operator= (Impl && rhs) = delete; + Impl & operator=(const Impl & rhs) = delete; + Impl & operator=(Impl && rhs) = delete; ~Impl() = default; @@ -121,46 +129,27 @@ class ImageIO::Impl ImageDescRcPtr getImageDesc() const { return std::make_shared( - (void*) getData(), + (void *)getData(), getWidth(), getHeight(), getChannelOrder(), getBitDepth(), getChanStrideBytes(), getXStrideBytes(), - getYStrideBytes() - ); + getYStrideBytes()); } - uint8_t * getData() - { - return (uint8_t*) m_buffer.localpixels(); - } + uint8_t * getData() { return (uint8_t *)m_buffer.localpixels(); } - const uint8_t * getData() const - { - return (const uint8_t*) m_buffer.localpixels(); - } + const uint8_t * getData() const { return (const uint8_t *)m_buffer.localpixels(); } - long getWidth() const - { - return m_buffer.spec().width; - } + long getWidth() const { return m_buffer.spec().width; } - long getHeight() const - { - return m_buffer.spec().height; - } + long getHeight() const { return m_buffer.spec().height; } - BitDepth getBitDepth() const - { - return BitDepthFromTypeDesc(m_buffer.spec().format); - } + BitDepth getBitDepth() const { return BitDepthFromTypeDesc(m_buffer.spec().format); } - long getNumChannels() const - { - return m_buffer.spec().nchannels; - } + long getNumChannels() const { return m_buffer.spec().nchannels; } ChannelOrdering getChannelOrder() const { @@ -179,25 +168,13 @@ class ImageIO::Impl return GetChannelNames(getChannelOrder()); } - ptrdiff_t getChanStrideBytes() const - { - return GetChannelSizeInBytes(getBitDepth()); - } + ptrdiff_t getChanStrideBytes() const { return GetChannelSizeInBytes(getBitDepth()); } - ptrdiff_t getXStrideBytes() const - { - return getNumChannels() * getChanStrideBytes(); - } + ptrdiff_t getXStrideBytes() const { return getNumChannels() * getChanStrideBytes(); } - ptrdiff_t getYStrideBytes() const - { - return getWidth() * getXStrideBytes(); - } + ptrdiff_t getYStrideBytes() const { return getWidth() * getXStrideBytes(); } - ptrdiff_t getImageBytes() const - { - return getYStrideBytes() * getHeight(); - } + ptrdiff_t getImageBytes() const { return getYStrideBytes() * getHeight(); } void attribute(const std::string & name, const std::string & value) { @@ -219,7 +196,7 @@ class ImageIO::Impl bitDepth = bitDepth == BIT_DEPTH_UNKNOWN ? img.getBitDepth() : bitDepth; OIIO::ImageSpec spec = img.m_buffer.spec(); - spec.format = BitDepthToTypeDesc(bitDepth); + spec.format = BitDepthToTypeDesc(bitDepth); m_buffer = OIIO::ImageBuf(spec); } @@ -227,7 +204,8 @@ class ImageIO::Impl void init(long width, long height, ChannelOrdering chanOrder, BitDepth bitDepth) { OIIO::ImageSpec spec( - width, height, + width, + height, GetNumChannels(chanOrder), BitDepthToTypeDesc(bitDepth)); @@ -241,11 +219,11 @@ class ImageIO::Impl m_buffer = OIIO::ImageBuf(filename); if (!m_buffer.read( - 0, // subimage - 0, // miplevel - true, // force immediate read - typeDesc // convert to type - )) + 0, // subimage + 0, // miplevel + true, // force immediate read + typeDesc // convert to type + )) { std::stringstream ss; ss << "Error: Could not read image: " << m_buffer.geterror(); @@ -264,7 +242,6 @@ class ImageIO::Impl throw Exception(ss.str().c_str()); } } - }; } // namespace OCIO_NAMESPACE diff --git a/src/libutils/oglapphelpers/glsl.cpp b/src/libutils/oglapphelpers/glsl.cpp index 16709fa3e7..fcb9b9beaf 100644 --- a/src/libutils/oglapphelpers/glsl.cpp +++ b/src/libutils/oglapphelpers/glsl.cpp @@ -1,6 +1,7 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. +// clang-format off #ifdef __APPLE__ @@ -18,15 +19,15 @@ #endif -#include +// clang-format on + #include +#include #include #include "glsl.h" - - namespace OCIO_NAMESPACE { @@ -35,13 +36,13 @@ namespace bool GetGLError(std::string & error) { const GLenum glErr = glGetError(); - if(glErr!=GL_NO_ERROR) + if (glErr != GL_NO_ERROR) { #ifdef __APPLE__ // Unfortunately no gluErrorString equivalent on Mac. error = "OpenGL Error"; #else - error = (const char*)gluErrorString(glErr); + error = (const char *)gluErrorString(glErr); #endif return true; } @@ -59,7 +60,7 @@ void CheckStatus() void SetTextureParameters(GLenum textureType, Interpolation interpolation) { - if(interpolation==INTERP_NEAREST) + if (interpolation == INTERP_NEAREST) { glTexParameteri(textureType, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(textureType, GL_TEXTURE_MAG_FILTER, GL_NEAREST); @@ -75,11 +76,14 @@ void SetTextureParameters(GLenum textureType, Interpolation interpolation) glTexParameteri(textureType, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); } -void AllocateTexture3D(unsigned index, unsigned & texId, - Interpolation interpolation, - unsigned edgelen, const float * values) +void AllocateTexture3D( + unsigned index, + unsigned & texId, + Interpolation interpolation, + unsigned edgelen, + const float * values) { - if(values==0x0) + if (values == 0x0) { throw Exception("Missing texture data"); } @@ -92,16 +96,28 @@ void AllocateTexture3D(unsigned index, unsigned & texId, SetTextureParameters(GL_TEXTURE_3D, interpolation); - glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB32F_ARB, - edgelen, edgelen, edgelen, 0, GL_RGB, GL_FLOAT, values); + glTexImage3D( + GL_TEXTURE_3D, + 0, + GL_RGB32F_ARB, + edgelen, + edgelen, + edgelen, + 0, + GL_RGB, + GL_FLOAT, + values); } -void AllocateTexture(unsigned index, unsigned & texId, - unsigned width, unsigned height, - GpuShaderDesc::TextureType channel, - GpuShaderDesc::TextureDimensions dimensions, - Interpolation interpolation, - const float * values) +void AllocateTexture( + unsigned index, + unsigned & texId, + unsigned width, + unsigned height, + GpuShaderDesc::TextureType channel, + GpuShaderDesc::TextureDimensions dimensions, + Interpolation interpolation, + const float * values) { if (values == nullptr) { @@ -123,25 +139,34 @@ void AllocateTexture(unsigned index, unsigned & texId, switch (dimensions) { - case GpuShaderCreator::TEXTURE_1D: - glBindTexture(GL_TEXTURE_1D, texId); - - SetTextureParameters(GL_TEXTURE_1D, interpolation); + case GpuShaderCreator::TEXTURE_1D: + glBindTexture(GL_TEXTURE_1D, texId); + + SetTextureParameters(GL_TEXTURE_1D, interpolation); - glTexImage1D(GL_TEXTURE_1D, 0, internalformat, width, 0, format, GL_FLOAT, values); - break; + glTexImage1D(GL_TEXTURE_1D, 0, internalformat, width, 0, format, GL_FLOAT, values); + break; - case GpuShaderCreator::TEXTURE_2D: - glBindTexture(GL_TEXTURE_2D, texId); + case GpuShaderCreator::TEXTURE_2D: + glBindTexture(GL_TEXTURE_2D, texId); - SetTextureParameters(GL_TEXTURE_2D, interpolation); + SetTextureParameters(GL_TEXTURE_2D, interpolation); - glTexImage2D(GL_TEXTURE_2D, 0, internalformat, width, height, 0, format, GL_FLOAT, values); - break; + glTexImage2D( + GL_TEXTURE_2D, + 0, + internalformat, + width, + height, + 0, + format, + GL_FLOAT, + values); + break; - default: - throw Exception("Invalid 1D LUT texture dimensions"); - break; + default: + throw Exception("Invalid 1D LUT texture dimensions"); + break; } } @@ -149,7 +174,7 @@ GLuint CompileShaderText(GLenum shaderType, const char * text) { CheckStatus(); - if(!text || !*text) + if (!text || !*text) { throw Exception("Invalid fragment shader program"); } @@ -158,7 +183,7 @@ GLuint CompileShaderText(GLenum shaderType, const char * text) GLint stat; shader = glCreateShader(shaderType); - glShaderSource(shader, 1, (const GLchar **) &text, NULL); + glShaderSource(shader, 1, (const GLchar **)&text, NULL); glCompileShader(shader); glGetShaderiv(shader, GL_COMPILE_STATUS, &stat); @@ -187,7 +212,7 @@ void LinkShaders(GLuint program, GLuint fragShader) { throw Exception("Missing shader program"); } - else + else { glAttachShader(program, fragShader); } @@ -196,7 +221,7 @@ void LinkShaders(GLuint program, GLuint fragShader) GLint stat; glGetProgramiv(program, GL_LINK_STATUS, &stat); - if (!stat) + if (!stat) { GLchar log[1000]; GLsizei len; @@ -207,8 +232,7 @@ void LinkShaders(GLuint program, GLuint fragShader) throw Exception(err.c_str()); } } -} - +} // namespace ////////////////////////////////////////////////////////// @@ -242,23 +266,29 @@ void OpenGLBuilder::Uniform::use() } else if (m_data.m_getBool) { - glUniform1f(m_handle, (GLfloat)(m_data.m_getBool()?1.0f:0.0f)); + glUniform1f(m_handle, (GLfloat)(m_data.m_getBool() ? 1.0f : 0.0f)); } else if (m_data.m_getFloat3) { - glUniform3f(m_handle, (GLfloat)m_data.m_getFloat3()[0], - (GLfloat)m_data.m_getFloat3()[1], - (GLfloat)m_data.m_getFloat3()[2]); + glUniform3f( + m_handle, + (GLfloat)m_data.m_getFloat3()[0], + (GLfloat)m_data.m_getFloat3()[1], + (GLfloat)m_data.m_getFloat3()[2]); } else if (m_data.m_vectorFloat.m_getSize && m_data.m_vectorFloat.m_getVector) { - glUniform1fv(m_handle, (GLsizei)m_data.m_vectorFloat.m_getSize(), - (GLfloat*)m_data.m_vectorFloat.m_getVector()); + glUniform1fv( + m_handle, + (GLsizei)m_data.m_vectorFloat.m_getSize(), + (GLfloat *)m_data.m_vectorFloat.m_getVector()); } else if (m_data.m_vectorInt.m_getSize && m_data.m_vectorInt.m_getVector) { - glUniform1iv(m_handle, (GLsizei)m_data.m_vectorInt.m_getSize(), - (GLint*)m_data.m_vectorInt.m_getVector()); + glUniform1iv( + m_handle, + (GLsizei)m_data.m_vectorInt.m_getSize(), + (GLint *)m_data.m_vectorInt.m_getVector()); } else { @@ -266,7 +296,6 @@ void OpenGLBuilder::Uniform::use() } } - ////////////////////////////////////////////////////////// OpenGLBuilderRcPtr OpenGLBuilder::Create(const GpuShaderDescRcPtr & shaderDesc) @@ -275,11 +304,11 @@ OpenGLBuilderRcPtr OpenGLBuilder::Create(const GpuShaderDescRcPtr & shaderDesc) } OpenGLBuilder::OpenGLBuilder(const GpuShaderDescRcPtr & shaderDesc) - : m_shaderDesc(shaderDesc) - , m_startIndex(0) - , m_fragShader(0) - , m_program(glCreateProgram()) - , m_verbose(false) + : m_shaderDesc(shaderDesc) + , m_startIndex(0) + , m_fragShader(0) + , m_program(glCreateProgram()) + , m_verbose(false) { } @@ -287,14 +316,14 @@ OpenGLBuilder::~OpenGLBuilder() { deleteAllTextures(); - if(m_fragShader) + if (m_fragShader) { glDetachShader(m_program, m_fragShader); glDeleteShader(m_fragShader); m_fragShader = 0; } - if(m_program) + if (m_program) { glDeleteProgram(m_program); m_program = 0; @@ -306,32 +335,30 @@ void OpenGLBuilder::allocateAllTextures(unsigned startIndex) deleteAllTextures(); // This is the first available index for the textures. - m_startIndex = startIndex; + m_startIndex = startIndex; unsigned currIndex = m_startIndex; // Process the 3D LUT first. const unsigned maxTexture3D = m_shaderDesc->getNum3DTextures(); - for(unsigned idx=0; idxget3DTexture(idx, textureName, samplerName, edgelen, interpolation); - if(!textureName || !*textureName - || !samplerName || !*samplerName - || edgelen==0) + if (!textureName || !*textureName || !samplerName || !*samplerName || edgelen == 0) { throw Exception("The texture data is corrupted"); } const float * values = nullptr; m_shaderDesc->get3DTextureValues(idx, values); - if(!values) + if (!values) { throw Exception("The texture values are missing"); } @@ -351,29 +378,35 @@ void OpenGLBuilder::allocateAllTextures(unsigned startIndex) // Process the 1D LUTs. const unsigned maxTexture2D = m_shaderDesc->getNumTextures(); - for(unsigned idx=0; idxgetTexture(idx, textureName, samplerName, width, height, channel, dimensions, interpolation); - - if (!textureName || !*textureName - || !samplerName || !*samplerName - || width==0) + m_shaderDesc->getTexture( + idx, + textureName, + samplerName, + width, + height, + channel, + dimensions, + interpolation); + + if (!textureName || !*textureName || !samplerName || !*samplerName || width == 0) { throw Exception("The texture data is corrupted"); } const float * values = 0x0; m_shaderDesc->getTextureValues(idx, values); - if(!values) + if (!values) { throw Exception("The texture values are missing"); } @@ -381,7 +414,15 @@ void OpenGLBuilder::allocateAllTextures(unsigned startIndex) // 2. Allocate the 1D LUT (a 1D or 2D texture is needed to hold large LUTs). unsigned texId = 0; - AllocateTexture(currIndex, texId, width, height, channel, dimensions, interpolation, values); + AllocateTexture( + currIndex, + texId, + width, + height, + channel, + dimensions, + interpolation, + values); // 3. Keep the texture id & name for the later enabling. @@ -394,7 +435,7 @@ void OpenGLBuilder::allocateAllTextures(unsigned startIndex) void OpenGLBuilder::deleteAllTextures() { const size_t max = m_textureIds.size(); - for (size_t idx=0; idxgetLanguage()) { - case GPU_LANGUAGE_GLSL_1_2: - case GPU_LANGUAGE_MSL_2_0: - // That's the minimal version supported. - return "#version 120"; - case GPU_LANGUAGE_GLSL_1_3: - return "#version 130"; - case GPU_LANGUAGE_GLSL_4_0: - return "#version 400 core"; - case GPU_LANGUAGE_GLSL_ES_1_0: - return "#version 100"; - case GPU_LANGUAGE_GLSL_ES_3_0: - return "#version 300 es"; - case GPU_LANGUAGE_CG: - case GPU_LANGUAGE_HLSL_DX11: - case LANGUAGE_OSL_1: - default: - // These are all impossible in OpenGL contexts. - // The shader will be unusable, so let's throw - throw Exception("Invalid shader language for OpenGLBuilder"); + case GPU_LANGUAGE_GLSL_1_2: + case GPU_LANGUAGE_MSL_2_0: + // That's the minimal version supported. + return "#version 120"; + case GPU_LANGUAGE_GLSL_1_3: + return "#version 130"; + case GPU_LANGUAGE_GLSL_4_0: + return "#version 400 core"; + case GPU_LANGUAGE_GLSL_ES_1_0: + return "#version 100"; + case GPU_LANGUAGE_GLSL_ES_3_0: + return "#version 300 es"; + case GPU_LANGUAGE_CG: + case GPU_LANGUAGE_HLSL_DX11: + case LANGUAGE_OSL_1: + default: + // These are all impossible in OpenGL contexts. + // The shader will be unusable, so let's throw + throw Exception("Invalid shader language for OpenGLBuilder"); } } unsigned OpenGLBuilder::buildProgram(const std::string & clientShaderProgram, bool standaloneShader) { const std::string shaderCacheID = m_shaderDesc->getCacheID(); - if(shaderCacheID!=m_shaderCacheID) + if (shaderCacheID != m_shaderCacheID) { - if(m_fragShader) + if (m_fragShader) { glDetachShader(m_program, m_fragShader); glDeleteShader(m_fragShader); } std::ostringstream oss; - oss << getGLSLVersionString() << std::endl - << (!standaloneShader ? m_shaderDesc->getShaderText() : "") << std::endl - << clientShaderProgram << std::endl; + oss << getGLSLVersionString() << std::endl + << (!standaloneShader ? m_shaderDesc->getShaderText() : "") << std::endl + << clientShaderProgram << std::endl; - if(m_verbose) + if (m_verbose) { - std::cout << "\nGPU Shader Program:\n\n" - << oss.str() - << "\n\n" - << std::flush; + std::cout << "\nGPU Shader Program:\n\n" << oss.str() << "\n\n" << std::flush; } m_fragShader = CompileShaderText(GL_FRAGMENT_SHADER, oss.str().c_str()); @@ -532,19 +569,16 @@ unsigned OpenGLBuilder::GetTextureMaxWidth() unsigned w = maxTextureSize; unsigned h = 1; - while(w>1) + while (w > 1) { - glTexImage2D(GL_PROXY_TEXTURE_2D, 0, - GL_RGB32F_ARB, - w, h, 0, - GL_RGB, GL_FLOAT, NULL); + glTexImage2D(GL_PROXY_TEXTURE_2D, 0, GL_RGB32F_ARB, w, h, 0, GL_RGB, GL_FLOAT, NULL); bool texValid = true; - GLenum glErr = GL_NO_ERROR; + GLenum glErr = GL_NO_ERROR; - while((glErr=glGetError()) != GL_NO_ERROR) + while ((glErr = glGetError()) != GL_NO_ERROR) { - if(glErr==GL_INVALID_VALUE) + if (glErr == GL_INVALID_VALUE) { texValid = false; } @@ -559,25 +593,26 @@ unsigned OpenGLBuilder::GetTextureMaxWidth() // and glGetTexLevelParameteriv() always fails. // So do not try glGetTexLevelParameteriv(). // - if(texValid) + if (texValid) { GLint format = 0; - glGetTexLevelParameteriv(GL_PROXY_TEXTURE_2D, 0, - GL_TEXTURE_COMPONENTS, &format); + glGetTexLevelParameteriv(GL_PROXY_TEXTURE_2D, 0, GL_TEXTURE_COMPONENTS, &format); - texValid = texValid && (GL_RGB32F_ARB==format); + texValid = texValid && (GL_RGB32F_ARB == format); - while((glErr=glGetError()) != GL_NO_ERROR); + while ((glErr = glGetError()) != GL_NO_ERROR) + ; } #endif - if(texValid) break; + if (texValid) + break; w = w >> 1; h = h << 1; } - if(w==1) + if (w == 1) { throw Exception("Maximum texture size unknown"); } diff --git a/src/libutils/oglapphelpers/glsl.h b/src/libutils/oglapphelpers/glsl.h index 1fdd33d274..e7e502b2cb 100644 --- a/src/libutils/oglapphelpers/glsl.h +++ b/src/libutils/oglapphelpers/glsl.h @@ -8,14 +8,12 @@ #include - namespace OCIO_NAMESPACE { class OpenGLBuilder; typedef OCIO_SHARED_PTR OpenGLBuilderRcPtr; - // This is a reference implementation showing how to do the texture upload & allocation, // and the program compilation for the GLSL shader language. @@ -23,20 +21,22 @@ class OpenGLBuilder { struct TextureId { - unsigned m_uid = -1; + unsigned m_uid = -1; std::string m_textureName; std::string m_samplerName; - unsigned m_type = -1; - - TextureId(unsigned uid, - const std::string & textureName, - const std::string & samplerName, - unsigned type) - : m_uid(uid) - , m_textureName(textureName) - , m_samplerName(samplerName) - , m_type(type) - {} + unsigned m_type = -1; + + TextureId( + unsigned uid, + const std::string & textureName, + const std::string & samplerName, + unsigned type) + : m_uid(uid) + , m_textureName(textureName) + , m_samplerName(samplerName) + , m_type(type) + { + } }; typedef std::vector TextureIds; @@ -77,7 +77,7 @@ class OpenGLBuilder // Update all uniforms. void useAllUniforms(); - // Build the complete shader program which includes the OCIO shader program + // Build the complete shader program which includes the OCIO shader program // and the client shader program. unsigned buildProgram(const std::string & clientShaderProgram, bool standaloneShader); void useProgram(); @@ -102,8 +102,8 @@ class OpenGLBuilder private: OpenGLBuilder(); - OpenGLBuilder(const OpenGLBuilder &) = delete; - OpenGLBuilder& operator=(const OpenGLBuilder &) = delete; + OpenGLBuilder(const OpenGLBuilder &) = delete; + OpenGLBuilder & operator=(const OpenGLBuilder &) = delete; const GpuShaderDescRcPtr m_shaderDesc; // Description of the fragment shader to create unsigned m_startIndex; // Starting index for texture allocations @@ -118,4 +118,3 @@ class OpenGLBuilder } // namespace OCIO_NAMESPACE #endif // INCLUDED_OCIO_GLSL_H - diff --git a/src/libutils/oglapphelpers/metalapp.h b/src/libutils/oglapphelpers/metalapp.h index 37fba14018..f45d2d5692 100644 --- a/src/libutils/oglapphelpers/metalapp.h +++ b/src/libutils/oglapphelpers/metalapp.h @@ -1,11 +1,9 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_METALAPP_H #define INCLUDED_OCIO_METALAPP_H - #include #include "oglapp.h" @@ -27,8 +25,8 @@ typedef OCIO_SHARED_PTR MtlTextureRcPtr; class MetalApp : public ScreenApp { public: - MetalApp() = delete; - MetalApp(const MetalApp &) = delete; + MetalApp() = delete; + MetalApp(const MetalApp &) = delete; MetalApp & operator=(const MetalApp &) = delete; // Initialize the app with given window name & client rect size. @@ -37,37 +35,37 @@ class MetalApp : public ScreenApp virtual ~MetalApp(); void initContext(); - + // Initialize the image. - void initImage(int imageWidth, int imageHeight, - Components comp, const float * imageBuffer) override; + void initImage(int imageWidth, int imageHeight, Components comp, const float * imageBuffer) + override; // Update the image if it changes. void updateImage(const float * imageBuffer) override; - + // Set the shader code. void setShader(GpuShaderDescRcPtr & shaderDesc) override; - + // Prepares and binds the OpenGL state used to present metal output texture in GLUT window - void prepareAndBindOpenGLState(); - + void prepareAndBindOpenGLState(); + // Process the image. void redisplay() override; - + // Return a pointer of either ScreenApp or HeadlessApp depending on the // OCIO_HEADLESS_ENABLED preprocessor. static MetalAppRcPtr CreateMetalGlApp(const char * winTitle, int winWidth, int winHeight); - + protected: - MtlTextureRcPtr m_image { nullptr }; - MtlTextureRcPtr m_outputImage { nullptr }; - std::unique_ptr m_context { nullptr }; + MtlTextureRcPtr m_image{nullptr}; + MtlTextureRcPtr m_outputImage{nullptr}; + std::unique_ptr m_context{nullptr}; private: MetalBuilderRcPtr m_metalBuilder; - bool m_glStateBound { false }; // OpenGL state for outputing the metal output texture contents is bound + bool m_glStateBound{ + false}; // OpenGL state for outputing the metal output texture contents is bound }; -} +} // namespace OCIO_NAMESPACE #endif // INCLUDED_OCIO_METALAPP_H - diff --git a/src/libutils/oglapphelpers/mtltexture.h b/src/libutils/oglapphelpers/mtltexture.h index 3d0b4b7d67..3ab010e9f2 100644 --- a/src/libutils/oglapphelpers/mtltexture.h +++ b/src/libutils/oglapphelpers/mtltexture.h @@ -4,81 +4,85 @@ #ifndef INCLUDED_OCIO_MTLTEXTURE_H #define INCLUDED_OCIO_MTLTEXTURE_H -#include #include +#include -#import -#import -#import -#import -#import +#import +#import +#import +#import +#import #include namespace OCIO_NAMESPACE { -typedef struct { - int cvPixelFormat; - MTLPixelFormat mtlFormat; - GLuint glInternalFormat; - GLuint glFormat; - GLuint glType; +typedef struct +{ + int cvPixelFormat; + MTLPixelFormat mtlFormat; + GLuint glInternalFormat; + GLuint glFormat; + GLuint glType; } GLMetalTextureFormatInfo; class MtlTexture { public: - MtlTexture() = delete; - MtlTexture(const MtlTexture&) = delete; - MtlTexture & operator=(const MtlTexture&) = delete; - - int getWidth() const { return m_width; } - int getHeight() const { return m_height; } - uint64_t getGLHandle() const + MtlTexture() = delete; + MtlTexture(const MtlTexture &) = delete; + MtlTexture & operator=(const MtlTexture &) = delete; + + int getWidth() const { return m_width; } + int getHeight() const { return m_height; } + uint64_t getGLHandle() const { - if(!m_openGLContext) + if (!m_openGLContext) { throw Exception("There is no valid OpenGL Context for this texture"); } return m_texID; } - + ~MtlTexture(); - - MtlTexture(id device, uint32_t width, uint32_t height, const float* image); - MtlTexture(id device, NSOpenGLContext* glContext, uint32_t width, uint32_t height, const float* image); - void update(const float* image); + + MtlTexture(id device, uint32_t width, uint32_t height, const float * image); + MtlTexture( + id device, + NSOpenGLContext * glContext, + uint32_t width, + uint32_t height, + const float * image); + void update(const float * image); id getMetalTextureHandle() const { return m_metalTexture; } std::vector readTexture() const; - + private: void createGLTexture(); void createMetalTexture(); - - id m_device; - NSOpenGLContext* m_openGLContext; - - int m_width; - int m_height; - - unsigned int m_texID; - id m_metalTexture; - - const GLMetalTextureFormatInfo* m_formatInfo; - CVPixelBufferRef m_CVPixelBuffer; - CVMetalTextureRef m_CVMTLTexture; - - CVOpenGLTextureCacheRef m_CVGLTextureCache; - CVOpenGLTextureRef m_CVGLTexture; - CGLPixelFormatObj m_CGLPixelFormat; + + id m_device; + NSOpenGLContext * m_openGLContext; + + int m_width; + int m_height; + + unsigned int m_texID; + id m_metalTexture; + + const GLMetalTextureFormatInfo * m_formatInfo; + CVPixelBufferRef m_CVPixelBuffer; + CVMetalTextureRef m_CVMTLTexture; + + CVOpenGLTextureCacheRef m_CVGLTextureCache; + CVOpenGLTextureRef m_CVGLTexture; + CGLPixelFormatObj m_CGLPixelFormat; // Metal - CVMetalTextureCacheRef m_CVMTLTextureCache; + CVMetalTextureCacheRef m_CVMTLTextureCache; }; - } // namespace OCIO_NAMESPACE #endif // INCLUDED_OCIO_MTLTEXTURE_H - diff --git a/src/libutils/oglapphelpers/oglapp.cpp b/src/libutils/oglapphelpers/oglapp.cpp index 32528a55cc..e7637302d8 100644 --- a/src/libutils/oglapphelpers/oglapp.cpp +++ b/src/libutils/oglapphelpers/oglapp.cpp @@ -1,11 +1,12 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #include #include #include +// clang-format off + #ifdef __APPLE__ #include @@ -24,19 +25,20 @@ #endif +// clang-format on #include #include "oglapp.h" - namespace OCIO_NAMESPACE { OglApp::OglApp(int winWidth, int winHeight) : m_viewportWidth(winWidth) , m_viewportHeight(winHeight) -{} +{ +} OglApp::~OglApp() { @@ -45,9 +47,9 @@ OglApp::~OglApp() void OglApp::setImageDimensions(int imgWidth, int imgHeight, Components comp) { - m_imageWidth = imgWidth; + m_imageWidth = imgWidth; m_imageHeight = imgHeight; - m_components = comp; + m_components = comp; if (m_imageHeight != 0) { m_imageAspect = (float)m_imageWidth / (float)m_imageHeight; @@ -57,7 +59,7 @@ void OglApp::setImageDimensions(int imgWidth, int imgHeight, Components comp) void OglApp::initImage(int imgWidth, int imgHeight, Components comp, const float * image) { setImageDimensions(imgWidth, imgHeight, comp); - + glGenTextures(1, &m_imageTexID); glActiveTexture(GL_TEXTURE0); updateImage(image); @@ -76,8 +78,16 @@ void OglApp::updateImage(const float * image) glBindTexture(GL_TEXTURE_2D, m_imageTexID); const GLenum format = m_components == COMPONENTS_RGB ? GL_RGB : GL_RGBA; - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F_ARB, m_imageWidth, m_imageHeight, 0, - format, GL_FLOAT, &image[0]); + glTexImage2D( + GL_TEXTURE_2D, + 0, + GL_RGBA32F_ARB, + m_imageWidth, + m_imageHeight, + 0, + format, + GL_FLOAT, + &image[0]); } void OglApp::redisplay() @@ -95,7 +105,7 @@ void OglApp::redisplay() viewportAspect = (float)m_viewportWidth / (float)m_viewportHeight; } - float pts[4] = { 0.0f, 0.0f, 0.0f, 0.0f }; // x0,y0,x1,y1 + float pts[4] = {0.0f, 0.0f, 0.0f, 0.0f}; // x0,y0,x1,y1 if (viewportAspect >= m_imageAspect) { float imgWidthScreenSpace = m_imageAspect * (float)m_viewportHeight; @@ -107,10 +117,10 @@ void OglApp::redisplay() else { float imgHeightScreenSpace = (float)m_viewportWidth / m_imageAspect; - pts[0] = 0.0f; - pts[2] = (float)m_viewportWidth; - pts[1] = (float)m_viewportHeight * 0.5f - imgHeightScreenSpace * 0.5f; - pts[3] = (float)m_viewportHeight * 0.5f + imgHeightScreenSpace * 0.5f; + pts[0] = 0.0f; + pts[2] = (float)m_viewportWidth; + pts[1] = (float)m_viewportHeight * 0.5f - imgHeightScreenSpace * 0.5f; + pts[3] = (float)m_viewportHeight * 0.5f + imgHeightScreenSpace * 0.5f; } if (m_yMirror) @@ -125,33 +135,32 @@ void OglApp::redisplay() } glEnable(GL_TEXTURE_2D); - glClearColor(0.2f, 0.2f, 0.2f, 0.0f); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - glColor3f(1, 1, 1); + glClearColor(0.2f, 0.2f, 0.2f, 0.0f); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glColor3f(1, 1, 1); - glPushMatrix(); - glBegin(GL_QUADS); - glTexCoord2f(0.0f, 1.0f); - glVertex2f(pts[0], pts[3]); + glPushMatrix(); + glBegin(GL_QUADS); + glTexCoord2f(0.0f, 1.0f); + glVertex2f(pts[0], pts[3]); - glTexCoord2f(0.0f, 0.0f); - glVertex2f(pts[0], pts[1]); + glTexCoord2f(0.0f, 0.0f); + glVertex2f(pts[0], pts[1]); - glTexCoord2f(1.0f, 0.0f); - glVertex2f(pts[2], pts[1]); + glTexCoord2f(1.0f, 0.0f); + glVertex2f(pts[2], pts[1]); - glTexCoord2f(1.0f, 1.0f); - glVertex2f(pts[2], pts[3]); - glEnd(); - glPopMatrix(); + glTexCoord2f(1.0f, 1.0f); + glVertex2f(pts[2], pts[3]); + glEnd(); + glPopMatrix(); glDisable(GL_TEXTURE_2D); - } void OglApp::reshape(int width, int height) { - m_viewportWidth = width; + m_viewportWidth = width; m_viewportHeight = height; glViewport(0, 0, m_viewportWidth, m_viewportHeight); @@ -190,7 +199,7 @@ void OglApp::readImage(float * image) { glReadBuffer(GL_COLOR_ATTACHMENT0); const GLenum format = m_components == COMPONENTS_RGB ? GL_RGB : GL_RGBA; - glReadPixels(0, 0, m_imageWidth, m_imageHeight, format, GL_FLOAT, (GLvoid*)&image[0]); + glReadPixels(0, 0, m_imageWidth, m_imageHeight, format, GL_FLOAT, (GLvoid *)&image[0]); } void OglApp::setShader(GpuShaderDescRcPtr & shaderDesc) @@ -251,7 +260,7 @@ void OglApp::setupCommon() // Initialize the OpenGL engine. - glPixelStorei(GL_UNPACK_ALIGNMENT, 4); // 4-byte pixel alignment + glPixelStorei(GL_UNPACK_ALIGNMENT, 4); // 4-byte pixel alignment #ifndef __APPLE__ glClampColor(GL_CLAMP_READ_COLOR, GL_FALSE); // @@ -265,19 +274,19 @@ void OglApp::setupCommon() OglAppRcPtr OglApp::CreateOglApp(const char * winTitle, int winWidth, int winHeight) { #ifdef OCIO_HEADLESS_ENABLED - return std::make_shared(winTitle, winWidth, winHeight); + return std::make_shared(winTitle, winWidth, winHeight); #else - return std::make_shared(winTitle, winWidth, winHeight); + return std::make_shared(winTitle, winWidth, winHeight); #endif } -ScreenApp::ScreenApp(const char * winTitle, int winWidth, int winHeight): - OglApp(winWidth, winHeight) +ScreenApp::ScreenApp(const char * winTitle, int winWidth, int winHeight) + : OglApp(winWidth, winHeight) { - int argc = 2; - const char * argv[] = { winTitle, "-glDebug" }; + int argc = 2; + const char * argv[] = {winTitle, "-glDebug"}; - glutInit(&argc, const_cast(&argv[0])); + glutInit(&argc, const_cast(&argv[0])); glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH); glutInitWindowSize(m_viewportWidth, m_viewportHeight); @@ -311,39 +320,45 @@ HeadlessApp::HeadlessApp(const char * /* winTitle */, int bufWidth, int bufHeigh , m_pixBufferWidth(bufWidth) , m_pixBufferHeight(bufHeight) { - m_configAttribs = - { - EGL_SURFACE_TYPE, EGL_PBUFFER_BIT, - EGL_BLUE_SIZE, 8, - EGL_GREEN_SIZE, 8, - EGL_RED_SIZE, 8, - EGL_DEPTH_SIZE, 8, - EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT, - EGL_NONE - }; - - m_pixBufferAttribs = - { - EGL_WIDTH, m_pixBufferWidth, - EGL_HEIGHT, m_pixBufferHeight, + m_configAttribs + = {EGL_SURFACE_TYPE, + EGL_PBUFFER_BIT, + EGL_BLUE_SIZE, + 8, + EGL_GREEN_SIZE, + 8, + EGL_RED_SIZE, + 8, + EGL_DEPTH_SIZE, + 8, + EGL_RENDERABLE_TYPE, + EGL_OPENGL_BIT, + EGL_NONE}; + + m_pixBufferAttribs = { + EGL_WIDTH, + m_pixBufferWidth, + EGL_HEIGHT, + m_pixBufferHeight, EGL_NONE, }; m_eglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY); - if(m_eglDisplay == EGL_NO_DISPLAY ) + if (m_eglDisplay == EGL_NO_DISPLAY) { throw Exception("EGL could not be initialized."); } EGLint eglMajor, eglMinor; - if(eglInitialize(m_eglDisplay, &eglMajor, &eglMinor) != EGL_TRUE) + if (eglInitialize(m_eglDisplay, &eglMajor, &eglMinor) != EGL_TRUE) { throw Exception("EGL display connection couldn't be started."); } // Choose an appropriate configuration. EGLint numConfigs; - if(eglChooseConfig(m_eglDisplay, &m_configAttribs[0], &m_eglConfig, 1, &numConfigs) != EGL_TRUE) + if (eglChooseConfig(m_eglDisplay, &m_configAttribs[0], &m_eglConfig, 1, &numConfigs) + != EGL_TRUE) { throw Exception("Failed to choose EGL configuration."); } @@ -353,7 +368,7 @@ HeadlessApp::HeadlessApp(const char * /* winTitle */, int bufWidth, int bufHeigh // Create a context and make it current. m_eglContext = eglCreateContext(m_eglDisplay, m_eglConfig, EGL_NO_CONTEXT, NULL); - if(eglMakeCurrent(m_eglDisplay, m_eglSurface, m_eglSurface, m_eglContext) != EGL_TRUE) + if (eglMakeCurrent(m_eglDisplay, m_eglSurface, m_eglSurface, m_eglContext) != EGL_TRUE) { throw Exception("Could not make EGL context current."); } diff --git a/src/libutils/oglapphelpers/oglapp.h b/src/libutils/oglapphelpers/oglapp.h index 34b2f7d071..0673ca2730 100644 --- a/src/libutils/oglapphelpers/oglapp.h +++ b/src/libutils/oglapphelpers/oglapp.h @@ -1,11 +1,9 @@ // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenColorIO Project. - #ifndef INCLUDED_OCIO_OGLAPP_H #define INCLUDED_OCIO_OGLAPP_H - #include #include "glsl.h" @@ -58,8 +56,8 @@ typedef OCIO_SHARED_PTR OglAppRcPtr; class OglApp { public: - OglApp() = delete; - OglApp(const OglApp &) = delete; + OglApp() = delete; + OglApp(const OglApp &) = delete; OglApp & operator=(const OglApp &) = delete; // Initialize the app with given window name & client rect size. @@ -69,16 +67,10 @@ class OglApp // When displaying the processed image in a window this needs to be done. // In that case, when image is read, the result will be mirrored on Y. - void setYMirror() - { - m_yMirror = true; - } + void setYMirror() { m_yMirror = true; } // Shader code will be printed when generated. - void setPrintShader(bool print) - { - m_printShader = print; - } + void setPrintShader(bool print) { m_printShader = print; } enum Components { @@ -87,8 +79,8 @@ class OglApp }; // Initialize the image. - virtual void initImage(int imageWidth, int imageHeight, - Components comp, const float * imageBuffer); + virtual void + initImage(int imageWidth, int imageHeight, Components comp, const float * imageBuffer); // Update the image if it changes. virtual void updateImage(const float * imageBuffer); @@ -125,41 +117,41 @@ class OglApp // when processed image is read from the viewport it matches the size of the original image. // When an interactive app is just displaying an image, this should equal the viewport size // and the image will be scaled to fit so there is no cropping. - int m_viewportWidth{ 0 }; - int m_viewportHeight{ 0 }; + int m_viewportWidth{0}; + int m_viewportHeight{0}; // Initialize the OpenGL engine, and set up GLEW if needed. void setupCommon(); - + void setImageDimensions(int imgWidth, int imgHeight, Components comp); Components getImageComponents() const { return m_components; } bool printShader() const { return m_printShader; } - + OpenGLBuilderRcPtr m_oglBuilder; - + private: // Keep track of the original image ratio. - float m_imageAspect{ 1.0f }; + float m_imageAspect{1.0f}; // For interactive application displaying the processed image, this needs to be true. - bool m_yMirror{ false }; + bool m_yMirror{false}; // Will shader code be outputed when setShader is called. - bool m_printShader{ false }; + bool m_printShader{false}; // Image information. - int m_imageWidth{ 0 }; - int m_imageHeight{ 0 }; - Components m_components{ COMPONENTS_RGBA }; + int m_imageWidth{0}; + int m_imageHeight{0}; + Components m_components{COMPONENTS_RGBA}; unsigned int m_imageTexID; }; -class ScreenApp: public OglApp +class ScreenApp : public OglApp { public: - ScreenApp() = delete; - ScreenApp(const ScreenApp &) = delete; + ScreenApp() = delete; + ScreenApp(const ScreenApp &) = delete; ScreenApp & operator=(const ScreenApp &) = delete; ScreenApp(const char * winTitle, int winWidth, int winHeight); @@ -171,14 +163,14 @@ class ScreenApp: public OglApp private: // Window identifier returned by glutCreateWindow. - int m_mainWin{ 0 }; + int m_mainWin{0}; }; #ifdef OCIO_HEADLESS_ENABLED #include -class HeadlessApp: public OglApp +class HeadlessApp : public OglApp { public: HeadlessApp() = delete; @@ -195,8 +187,8 @@ class HeadlessApp: public OglApp void printEGLInfo() const noexcept; private: - EGLint m_pixBufferWidth{ 0 }; - EGLint m_pixBufferHeight{ 0 }; + EGLint m_pixBufferWidth{0}; + EGLint m_pixBufferHeight{0}; std::vector m_pixBufferAttribs; EGLDisplay m_eglDisplay; @@ -212,4 +204,3 @@ class HeadlessApp: public OglApp } // namespace OCIO_NAMESPACE #endif // INCLUDED_OCIO_OGLAPP_H - diff --git a/src/utils/NumberUtils.h b/src/utils/NumberUtils.h index 08a9ba0069..940da6b06e 100644 --- a/src/utils/NumberUtils.h +++ b/src/utils/NumberUtils.h @@ -23,35 +23,32 @@ namespace NumberUtils struct Locale { #ifdef _WIN32 - Locale() : local(_create_locale(LC_ALL, "C")) + Locale() + : local(_create_locale(LC_ALL, "C")) { } - ~Locale() - { - _free_locale(local); - } + ~Locale() { _free_locale(local); } _locale_t local; #else - Locale() : local(newlocale(LC_ALL_MASK, "C", NULL)) - { - } - ~Locale() + Locale() + : local(newlocale(LC_ALL_MASK, "C", NULL)) { - freelocale(local); } + ~Locale() { freelocale(local); } locale_t local; #endif }; struct from_chars_result { - const char *ptr; + const char * ptr; std::errc ec; }; static const Locale loc; -really_inline from_chars_result from_chars(const char *first, const char *last, double &value) noexcept +really_inline from_chars_result +from_chars(const char * first, const char * last, double & value) noexcept { errno = 0; if (!first || !last || first == last) @@ -63,9 +60,11 @@ really_inline from_chars_result from_chars(const char *first, const char *last, double #ifdef _WIN32 - tempval = _strtod_l(first, &endptr, loc.local); + tempval + = _strtod_l(first, &endptr, loc.local); #else - tempval = ::strtod_l(first, &endptr, loc.local); + tempval + = ::strtod_l(first, &endptr, loc.local); #endif if (errno != 0 && errno != EINVAL) @@ -87,7 +86,8 @@ really_inline from_chars_result from_chars(const char *first, const char *last, } } -really_inline from_chars_result from_chars(const char *first, const char *last, float &value) noexcept +really_inline from_chars_result +from_chars(const char * first, const char * last, float & value) noexcept { errno = 0; if (!first || !last || first == last) @@ -95,21 +95,25 @@ really_inline from_chars_result from_chars(const char *first, const char *last, return {first, std::errc::invalid_argument}; } - char *endptr = nullptr; + char * endptr = nullptr; float #ifdef _WIN32 #if defined(__MINGW32__) || defined(__MINGW64__) - // MinGW doesn't define strtof_l (clang/gcc) nor strtod_l (gcc)... - tempval = static_cast(_strtod_l (first, &endptr, loc.local)); + // MinGW doesn't define strtof_l (clang/gcc) nor strtod_l (gcc)... + tempval + = static_cast(_strtod_l(first, &endptr, loc.local)); #else - tempval = _strtof_l(first, &endptr, loc.local); + tempval + = _strtof_l(first, &endptr, loc.local); #endif #elif __APPLE__ - // On OSX, strtod_l is for some reason drastically faster than strtof_l. - tempval = static_cast(::strtod_l(first, &endptr, loc.local)); + // On OSX, strtod_l is for some reason drastically faster than strtof_l. + tempval + = static_cast(::strtod_l(first, &endptr, loc.local)); #else - tempval = ::strtof_l(first, &endptr, loc.local); + tempval + = ::strtof_l(first, &endptr, loc.local); #endif if (errno != 0) @@ -131,7 +135,8 @@ really_inline from_chars_result from_chars(const char *first, const char *last, } } -really_inline from_chars_result from_chars(const char *first, const char *last, long int &value) noexcept +really_inline from_chars_result +from_chars(const char * first, const char * last, long int & value) noexcept { errno = 0; if (!first || !last || first == last) @@ -139,15 +144,18 @@ really_inline from_chars_result from_chars(const char *first, const char *last, return {first, std::errc::invalid_argument}; } - char *endptr = nullptr; + char * endptr = nullptr; long int #ifdef _WIN32 - tempval = _strtol_l(first, &endptr, 0, loc.local); + tempval + = _strtol_l(first, &endptr, 0, loc.local); #elif defined(__GLIBC__) - tempval = ::strtol_l(first, &endptr, 0, loc.local); + tempval + = ::strtol_l(first, &endptr, 0, loc.local); #else - tempval = ::strtol(first, &endptr, 0); + tempval + = ::strtol(first, &endptr, 0); #endif if (errno != 0) diff --git a/src/utils/StringUtils.h b/src/utils/StringUtils.h index cc1cf4cd43..0669a8f736 100644 --- a/src/utils/StringUtils.h +++ b/src/utils/StringUtils.h @@ -11,24 +11,24 @@ #include #include - // Note: Most of the implementations heavily rely on the C++ std::move() in order // to simplify the writing without performance penalty. namespace StringUtils { - using StringVec = std::vector; // Return the lower case character without taking into account locale like // std::tolower, to avoid the "Turkish I" problem in file parsing. inline unsigned char Lower(unsigned char c) { - if(c >= 'A' && c <= 'Z') { + if (c >= 'A' && c <= 'Z') + { return c + ('a' - 'A'); } - else { + else + { return c; } } @@ -36,10 +36,12 @@ inline unsigned char Lower(unsigned char c) // Return the upper case character, without taking into account locale. inline unsigned char Upper(unsigned char c) { - if(c >= 'a' && c <= 'z') { + if (c >= 'a' && c <= 'z') + { return c - ('a' - 'A'); } - else { + else + { return c; } } @@ -47,30 +49,30 @@ inline unsigned char Upper(unsigned char c) // Return the lower case string. inline std::string Lower(std::string str) { - std::transform(str.begin(), str.end(), str.begin(), - [](unsigned char c) { return Lower(c); }); + std::transform(str.begin(), str.end(), str.begin(), [](unsigned char c) { return Lower(c); }); return str; } inline std::string Lower(const char * str) { - if (!str) return ""; - const std::string s{ str }; + if (!str) + return ""; + const std::string s{str}; return Lower(s); } // Return the upper case string. inline std::string Upper(std::string str) { - std::transform(str.begin(), str.end(), str.begin(), - [](unsigned char c) { return Upper(c); }); + std::transform(str.begin(), str.end(), str.begin(), [](unsigned char c) { return Upper(c); }); return str; } inline std::string Upper(const char * str) { - if (!str) return ""; - const std::string s{ str }; + if (!str) + return ""; + const std::string s{str}; return Upper(s); } @@ -84,8 +86,8 @@ inline bool Compare(const std::string & left, const std::string & right) // Note: The comparison is case sensitive. inline bool EndsWith(const std::string & str, const std::string & suffix) { - return str.size() >= suffix.size() && - 0 == str.compare(str.size() - suffix.size(), suffix.size(), suffix); + return str.size() >= suffix.size() + && 0 == str.compare(str.size() - suffix.size(), suffix.size(), suffix); } // Return true if the string starts with the prefix. @@ -98,7 +100,7 @@ inline bool StartsWith(const std::string & str, const std::string & prefix) // Starting from the left, trim the character. inline std::string LeftTrim(std::string str, char c) { - const auto it = std::find_if(str.begin(), str.end(), [&c](char ch) { return c!=ch; }); + const auto it = std::find_if(str.begin(), str.end(), [&c](char ch) { return c != ch; }); str.erase(str.begin(), it); return str; } @@ -106,7 +108,9 @@ inline std::string LeftTrim(std::string str, char c) // Starting from the left, trim all the space characters i.e. space, tabulation, etc. inline std::string LeftTrim(std::string str) { - const auto it = std::find_if(str.begin(), str.end(), [](char ch) { return !std::isspace(static_cast(ch)); }); + const auto it = std::find_if(str.begin(), str.end(), [](char ch) { + return !std::isspace(static_cast(ch)); + }); str.erase(str.begin(), it); return str; } @@ -114,7 +118,7 @@ inline std::string LeftTrim(std::string str) // Starting from the right, trim the character. inline std::string RightTrim(std::string str, char c) { - const auto it = std::find_if(str.rbegin(), str.rend(), [&c](char ch) { return c!=ch; }); + const auto it = std::find_if(str.rbegin(), str.rend(), [&c](char ch) { return c != ch; }); str.erase(it.base(), str.end()); return str; } @@ -122,8 +126,9 @@ inline std::string RightTrim(std::string str, char c) // Starting from the right, trim all the space characters i.e. space, tabulation, etc. inline std::string RightTrim(std::string str) { - const auto it = - std::find_if(str.rbegin(), str.rend(), [](char ch) { return !std::isspace(static_cast(ch)); }); + const auto it = std::find_if(str.rbegin(), str.rend(), [](char ch) { + return !std::isspace(static_cast(ch)); + }); str.erase(it.base(), str.end()); return str; } @@ -151,7 +156,8 @@ inline void Trim(StringVec & list) // Split a string content using an arbitrary separator. inline StringVec Split(const std::string & str, char separator) { - if (str.empty()) return {""}; + if (str.empty()) + return {""}; StringVec results; @@ -173,16 +179,18 @@ inline StringVec Split(const std::string & str, char separator) // Join a list of strings using an arbitrary separator. inline std::string Join(const StringVec & strings, char separator) { - if (strings.empty()) return ""; + if (strings.empty()) + return ""; const StringVec::size_type len = strings.size(); - if (len==1) return strings[0]; + if (len == 1) + return strings[0]; const std::string sep(1, separator); std::string result{strings[0]}; - for (StringVec::size_type i=1; i(std::istream_iterator(stream), - std::istream_iterator()); + return std::vector( + std::istream_iterator(stream), + std::istream_iterator()); } // Find the position of 'search' substring. @@ -230,11 +240,12 @@ inline std::string::size_type ReverseFind(const std::string & subject, const std } // In place replace the 'search' substring by the 'replace' string in 'str'. -inline bool ReplaceInPlace(std::string & subject, const std::string & search, const std::string & replace) +inline bool +ReplaceInPlace(std::string & subject, const std::string & search, const std::string & replace) { bool changed = false; - size_t pos = 0; + size_t pos = 0; while ((pos = subject.find(search, pos)) != std::string::npos) { subject.replace(pos, search.length(), replace); @@ -246,7 +257,8 @@ inline bool ReplaceInPlace(std::string & subject, const std::string & search, co } // Replace the 'search' substring by the 'replace' string in 'str'. -inline std::string Replace(const std::string & subject, const std::string & search, const std::string & replace) +inline std::string +Replace(const std::string & subject, const std::string & search, const std::string & replace) { std::string str{subject}; ReplaceInPlace(str, search, replace); @@ -256,24 +268,20 @@ inline std::string Replace(const std::string & subject, const std::string & sear // Check if the 'entry' is in the 'list' using a case insensitive comparison. inline bool Contain(const StringVec & list, const std::string & entry) { - const auto it = std::find_if(list.begin(), list.end(), - [entry](const std::string & ent) - { - return Compare(ent.c_str(), entry.c_str()); - }); - return it!=list.end(); + const auto it = std::find_if(list.begin(), list.end(), [entry](const std::string & ent) { + return Compare(ent.c_str(), entry.c_str()); + }); + return it != list.end(); } // Remove the 'entry' from the 'list' using a case insensitive comparison. // It returns true if found. inline bool Remove(StringVec & list, const std::string & entry) { - const auto it = std::find_if(list.begin(), list.end(), - [entry](const std::string & ent) - { - return Compare(ent.c_str(), entry.c_str()); - }); - if (it!=list.end()) + const auto it = std::find_if(list.begin(), list.end(), [entry](const std::string & ent) { + return Compare(ent.c_str(), entry.c_str()); + }); + if (it != list.end()) { list.erase(it); return true; diff --git a/vendor/openfx/OCIOColorSpace.cpp b/vendor/openfx/OCIOColorSpace.cpp index f930168a9d..97303da858 100644 --- a/vendor/openfx/OCIOColorSpace.cpp +++ b/vendor/openfx/OCIOColorSpace.cpp @@ -46,7 +46,7 @@ void OCIOColorSpace::render(const OFX::RenderArguments & args) // Get transform parameters std::string srcCsName = getChoiceParamOption(srcCsNameParam_); std::string dstCsName = getChoiceParamOption(dstCsNameParam_); - bool inverse = inverseParam_->getValue(); + bool inverse = inverseParam_->getValue(); // Create context with overrides OCIO::ContextRcPtr context = createOCIOContext(contextParams_); @@ -62,15 +62,18 @@ void OCIOColorSpace::render(const OFX::RenderArguments & args) 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.setTransform( + context, + tr, + (inverse ? OCIO::TRANSFORM_DIR_INVERSE : OCIO::TRANSFORM_DIR_FORWARD)); proc.process(); } -bool OCIOColorSpace::isIdentity(const OFX::IsIdentityArguments & args, - OFX::Clip *& identityClip, - double & identityTime) +bool OCIOColorSpace::isIdentity( + const OFX::IsIdentityArguments & args, + OFX::Clip *& identityClip, + double & identityTime) { std::string srcCsName = getChoiceParamOption(srcCsNameParam_); std::string dstCsName = getChoiceParamOption(dstCsNameParam_); @@ -86,22 +89,21 @@ bool OCIOColorSpace::isIdentity(const OFX::IsIdentityArguments & args, return false; } -void OCIOColorSpace::changedParam(const OFX::InstanceChangedArgs & /*args*/, - const std::string & paramName) +void OCIOColorSpace::changedParam( + const OFX::InstanceChangedArgs & /*args*/, + const std::string & paramName) { if (paramName == "src_cs" || paramName == "dst_cs") { OCIO::ConstConfigRcPtr config = getOCIOConfig(); - std::string srcCsName = getChoiceParamOption(srcCsNameParam_); - OCIO::ConstColorSpaceRcPtr srcCs = - config->getColorSpace(srcCsName.c_str()); - OCIO::ReferenceSpaceType srcRef = srcCs->getReferenceSpaceType(); + std::string srcCsName = getChoiceParamOption(srcCsNameParam_); + OCIO::ConstColorSpaceRcPtr srcCs = config->getColorSpace(srcCsName.c_str()); + OCIO::ReferenceSpaceType srcRef = srcCs->getReferenceSpaceType(); - std::string dstCsName = getChoiceParamOption(dstCsNameParam_); - OCIO::ConstColorSpaceRcPtr dstCs = - config->getColorSpace(dstCsName.c_str()); - OCIO::ReferenceSpaceType dstRef = dstCs->getReferenceSpaceType(); + std::string dstCsName = getChoiceParamOption(dstCsNameParam_); + OCIO::ConstColorSpaceRcPtr dstCs = config->getColorSpace(dstCsName.c_str()); + OCIO::ReferenceSpaceType dstRef = dstCs->getReferenceSpaceType(); // Suggest using OCIODisplayView instead int numViewTransforms = config->getNumViewTransforms(); @@ -114,8 +116,8 @@ void OCIOColorSpace::changedParam(const OFX::InstanceChangedArgs & /*args*/, configName = " '" + configName + "'"; } - OCIO::ConstViewTransformRcPtr defaultViewTr = - config->getDefaultSceneToDisplayViewTransform(); + OCIO::ConstViewTransformRcPtr defaultViewTr + = config->getDefaultSceneToDisplayViewTransform(); std::ostringstream os; os << PLUGIN_TYPE << " WARNING: Color space '"; @@ -130,9 +132,7 @@ void OCIOColorSpace::changedParam(const OFX::InstanceChangedArgs & /*args*/, os << "use 'OCIODisplayView' to select your desired view"; os << "transform."; - sendMessage(OFX::Message::eMessageWarning, - "view_transform_warning", - os.str()); + sendMessage(OFX::Message::eMessageWarning, "view_transform_warning", os.str()); } // Store config values @@ -155,13 +155,14 @@ void OCIOColorSpace::changedParam(const OFX::InstanceChangedArgs & /*args*/, } } -void OCIOColorSpaceFactory::describe(OFX::ImageEffectDescriptor& desc) +void OCIOColorSpaceFactory::describe(OFX::ImageEffectDescriptor & desc) { baseDescribe(PLUGIN_TYPE, desc); } -void OCIOColorSpaceFactory::describeInContext(OFX::ImageEffectDescriptor& desc, - OFX::ContextEnum /*context*/) +void OCIOColorSpaceFactory::describeInContext( + OFX::ImageEffectDescriptor & desc, + OFX::ContextEnum /*context*/) { baseDescribeInContext(desc); @@ -169,39 +170,35 @@ void OCIOColorSpaceFactory::describeInContext(OFX::ImageEffectDescriptor& desc, OFX::PageParamDescriptor * page = desc.definePageParam(PARAM_NAME_PAGE_0); // Src color space - defineCsNameParam(desc, page, - "src_cs", - "Source Color Space", - "Source color space name", - 0); + defineCsNameParam(desc, page, "src_cs", "Source Color Space", "Source color space name", 0); // Dst color space - defineCsNameParam(desc, page, - "dst_cs", - "Destination Color Space", - "Destination color space name", - 0); + defineCsNameParam( + desc, + page, + "dst_cs", + "Destination Color Space", + "Destination color space name", + 0); // Inverse - defineBooleanParam(desc, page, - "inverse", - "Inverse", - "Invert the transform", - 0); + defineBooleanParam(desc, page, "inverse", "Inverse", "Invert the transform", 0); // Swap color spaces - definePushButtonParam(desc, page, - "swap_src_dst", - "Swap color spaces", - "Swap src and dst color spaces", - 0); + definePushButtonParam( + desc, + page, + "swap_src_dst", + "Swap color spaces", + "Swap src and dst color spaces", + 0); // Context overrides defineContextParams(desc, page); } OFX::ImageEffect * OCIOColorSpaceFactory::createInstance( - OfxImageEffectHandle handle, + OfxImageEffectHandle handle, OFX::ContextEnum /*context*/) { return new OCIOColorSpace(handle); diff --git a/vendor/openfx/OCIOColorSpace.h b/vendor/openfx/OCIOColorSpace.h index bfdd0c2922..903e297f9e 100644 --- a/vendor/openfx/OCIOColorSpace.h +++ b/vendor/openfx/OCIOColorSpace.h @@ -12,8 +12,8 @@ class OCIOColorSpace : public OFX::ImageEffect { protected: // Do not need to delete these. The ImageEffect is managing them for us. - OFX::Clip *dstClip_; - OFX::Clip *srcClip_; + OFX::Clip * dstClip_; + OFX::Clip * srcClip_; OFX::ChoiceParam * srcCsNameParam_; OFX::ChoiceParam * dstCsNameParam_; @@ -29,13 +29,14 @@ class OCIOColorSpace : public OFX::ImageEffect void render(const OFX::RenderArguments & args) override; /* Override identity (~no-op) check */ - bool isIdentity(const OFX::IsIdentityArguments & args, - OFX::Clip *& identityClip, - double & identityTime) override; + 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; + void changedParam(const OFX::InstanceChangedArgs & args, const std::string & paramName) + override; }; mDeclarePluginFactory(OCIOColorSpaceFactory, {}, {}); diff --git a/vendor/openfx/OCIODisplayView.cpp b/vendor/openfx/OCIODisplayView.cpp index 9fd9d0461c..25a4e5af52 100644 --- a/vendor/openfx/OCIODisplayView.cpp +++ b/vendor/openfx/OCIODisplayView.cpp @@ -49,7 +49,7 @@ void OCIODisplayView::render(const OFX::RenderArguments & args) std::string srcCsName = getChoiceParamOption(srcCsNameParam_); std::string display = getChoiceParamOption(displayParam_); std::string view = getChoiceParamOption(viewParam_); - bool inverse = inverseParam_->getValue(); + bool inverse = inverseParam_->getValue(); // Create context with overrides OCIO::ContextRcPtr context = createOCIOContext(contextParams_); @@ -66,15 +66,18 @@ void OCIODisplayView::render(const OFX::RenderArguments & args) 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.setTransform( + context, + tr, + (inverse ? OCIO::TRANSFORM_DIR_INVERSE : OCIO::TRANSFORM_DIR_FORWARD)); proc.process(); } -bool OCIODisplayView::isIdentity(const OFX::IsIdentityArguments & args, - OFX::Clip *& identityClip, - double & identityTime) +bool OCIODisplayView::isIdentity( + const OFX::IsIdentityArguments & args, + OFX::Clip *& identityClip, + double & identityTime) { std::string srcCsName = getChoiceParamOption(srcCsNameParam_); OCIO::ConstColorSpaceRcPtr srcCs; @@ -82,7 +85,7 @@ bool OCIODisplayView::isIdentity(const OFX::IsIdentityArguments & args, if (!srcCsName.empty()) { OCIO::ConstConfigRcPtr config = getOCIOConfig(); - srcCs = config->getColorSpace(srcCsName.c_str()); + srcCs = config->getColorSpace(srcCsName.c_str()); } // Is processing needed? @@ -96,8 +99,9 @@ bool OCIODisplayView::isIdentity(const OFX::IsIdentityArguments & args, return false; } -void OCIODisplayView::changedParam(const OFX::InstanceChangedArgs & /*args*/, - const std::string & paramName) +void OCIODisplayView::changedParam( + const OFX::InstanceChangedArgs & /*args*/, + const std::string & paramName) { if (paramName == "src_cs" || paramName == "display" || paramName == "view") { @@ -116,13 +120,14 @@ void OCIODisplayView::changedParam(const OFX::InstanceChangedArgs & /*args*/, } } -void OCIODisplayViewFactory::describe(OFX::ImageEffectDescriptor& desc) +void OCIODisplayViewFactory::describe(OFX::ImageEffectDescriptor & desc) { baseDescribe(PLUGIN_TYPE, desc); } -void OCIODisplayViewFactory::describeInContext(OFX::ImageEffectDescriptor& desc, - OFX::ContextEnum /*context*/) +void OCIODisplayViewFactory::describeInContext( + OFX::ImageEffectDescriptor & desc, + OFX::ContextEnum /*context*/) { baseDescribeInContext(desc); @@ -130,39 +135,23 @@ void OCIODisplayViewFactory::describeInContext(OFX::ImageEffectDescriptor& desc, OFX::PageParamDescriptor * page = desc.definePageParam(PARAM_NAME_PAGE_0); // Src color space - defineCsNameParam(desc, page, - "src_cs", - "Source Color Space", - "Source color space name", - 0); + defineCsNameParam(desc, page, "src_cs", "Source Color Space", "Source color space name", 0); // Display - defineDisplayParam(desc, page, - "display", - "Display", - "Display device name", - 0); + defineDisplayParam(desc, page, "display", "Display", "Display device name", 0); // View - defineViewParam(desc, page, - "view", - "View", - "View name", - 0); + defineViewParam(desc, page, "view", "View", "View name", 0); // Inverse - defineBooleanParam(desc, page, - "inverse", - "Inverse", - "Invert the transform", - 0); + defineBooleanParam(desc, page, "inverse", "Inverse", "Invert the transform", 0); // Context overrides defineContextParams(desc, page); } OFX::ImageEffect * OCIODisplayViewFactory::createInstance( - OfxImageEffectHandle handle, + OfxImageEffectHandle handle, OFX::ContextEnum /*context*/) { return new OCIODisplayView(handle); diff --git a/vendor/openfx/OCIODisplayView.h b/vendor/openfx/OCIODisplayView.h index 5191536ec6..dae7602cd7 100644 --- a/vendor/openfx/OCIODisplayView.h +++ b/vendor/openfx/OCIODisplayView.h @@ -14,8 +14,8 @@ class OCIODisplayView : public OFX::ImageEffect { protected: // Do not need to delete these. The ImageEffect is managing them for us. - OFX::Clip *dstClip_; - OFX::Clip *srcClip_; + OFX::Clip * dstClip_; + OFX::Clip * srcClip_; OFX::ChoiceParam * srcCsNameParam_; OFX::ChoiceParam * displayParam_; @@ -31,14 +31,14 @@ class OCIODisplayView : public OFX::ImageEffect void render(const OFX::RenderArguments & args) override; /* Override identity (~no-op) check */ - bool isIdentity(const OFX::IsIdentityArguments & args, - OFX::Clip *& identityClip, - double & identityTime) override; + 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; - + void changedParam(const OFX::InstanceChangedArgs & args, const std::string & paramName) + override; }; mDeclarePluginFactory(OCIODisplayViewFactory, {}, {}); diff --git a/vendor/openfx/OCIOMain.cpp b/vendor/openfx/OCIOMain.cpp index 9312892023..ead037e7c1 100644 --- a/vendor/openfx/OCIOMain.cpp +++ b/vendor/openfx/OCIOMain.cpp @@ -6,11 +6,9 @@ void OFX::Plugin::getPluginIDs(OFX::PluginFactoryArray & ids) { - static OCIOColorSpaceFactory ocioColorSpace( - "OpenColorIO.OCIOColorSpace", 1, 0); + static OCIOColorSpaceFactory ocioColorSpace("OpenColorIO.OCIOColorSpace", 1, 0); ids.push_back(&ocioColorSpace); - static OCIODisplayViewFactory ocioDisplayView( - "OpenColorIO.OCIODisplayView", 1, 0); + static OCIODisplayViewFactory ocioDisplayView("OpenColorIO.OCIODisplayView", 1, 0); ids.push_back(&ocioDisplayView); } diff --git a/vendor/openfx/OCIOProcessor.cpp b/vendor/openfx/OCIOProcessor.cpp index 020515a65a..d31e436f0d 100644 --- a/vendor/openfx/OCIOProcessor.cpp +++ b/vendor/openfx/OCIOProcessor.cpp @@ -30,12 +30,13 @@ void OCIOProcessor::setSrcImg(OFX::Image * img) } } -void OCIOProcessor::setTransform(OCIO::ContextRcPtr context, - OCIO::ConstTransformRcPtr transform, - OCIO::TransformDirection direction) +void OCIOProcessor::setTransform( + OCIO::ContextRcPtr context, + OCIO::ConstTransformRcPtr transform, + OCIO::TransformDirection direction) { OCIO::ConstConfigRcPtr config = getOCIOConfig(); - // Src and dst bit-depth always match, since + // Src and dst bit-depth always match, since // kOfxImageEffectPropSupportsMultipleClipDepths is 0. OCIO::BitDepth bitDepth = getOCIOBitDepth(_srcImg->getPixelDepth()); @@ -44,13 +45,10 @@ void OCIOProcessor::setTransform(OCIO::ContextRcPtr context, // Throw if the transform is invalid transform->validate(); - OCIO::ConstProcessorRcPtr proc = - config->getProcessor(context, transform, direction); + OCIO::ConstProcessorRcPtr proc = config->getProcessor(context, transform, direction); // Build processor which optimizes for input and output bit-depth - _cpuProc = proc->getOptimizedCPUProcessor( - bitDepth, bitDepth, - OCIO::OPTIMIZATION_DEFAULT); + _cpuProc = proc->getOptimizedCPUProcessor(bitDepth, bitDepth, OCIO::OPTIMIZATION_DEFAULT); } catch (const OCIO::Exception & e) { @@ -64,16 +62,15 @@ void OCIOProcessor::multiThreadProcessImages(OfxRectI procWindow) // Inspect image buffer OCIO::BitDepth bitDepth = getOCIOBitDepth(_dstImg->getPixelDepth()); - int numChannels = _dstImg->getPixelComponentCount(); + int numChannels = _dstImg->getPixelComponentCount(); int chanStrideBytes = getChanStrideBytes(bitDepth); - int xStrideBytes = chanStrideBytes * numChannels; - int yStrideBytes = _dstImg->getRowBytes(); + int xStrideBytes = chanStrideBytes * numChannels; + int yStrideBytes = _dstImg->getRowBytes(); // Offset image address to processing window start - int begin = procWindow.y1 * yStrideBytes - + procWindow.x1 * xStrideBytes; - int w = procWindow.x2 - procWindow.x1; - int h = procWindow.y2 - procWindow.y1; + int begin = procWindow.y1 * yStrideBytes + procWindow.x1 * xStrideBytes; + int w = procWindow.x2 - procWindow.x1; + int h = procWindow.y2 - procWindow.y1; char * srcData = static_cast(_srcImg->getPixelData()); srcData += begin; @@ -81,21 +78,25 @@ void OCIOProcessor::multiThreadProcessImages(OfxRectI procWindow) dstData += begin; // Wrap in OCIO image description, which doesn't take ownership of data - OCIO::PackedImageDesc srcImgDesc(srcData, - w, h, - numChannels, - bitDepth, - chanStrideBytes, - xStrideBytes, - yStrideBytes); - - OCIO::PackedImageDesc dstImgDesc(dstData, - w, h, - numChannels, - bitDepth, - chanStrideBytes, - xStrideBytes, - yStrideBytes); + OCIO::PackedImageDesc srcImgDesc( + srcData, + w, + h, + numChannels, + bitDepth, + chanStrideBytes, + xStrideBytes, + yStrideBytes); + + OCIO::PackedImageDesc dstImgDesc( + dstData, + w, + h, + numChannels, + bitDepth, + chanStrideBytes, + xStrideBytes, + yStrideBytes); // Apply processor on CPU _cpuProc->apply(srcImgDesc, dstImgDesc); diff --git a/vendor/openfx/OCIOProcessor.h b/vendor/openfx/OCIOProcessor.h index f8dd0fdc60..a12e38605f 100644 --- a/vendor/openfx/OCIOProcessor.h +++ b/vendor/openfx/OCIOProcessor.h @@ -11,7 +11,7 @@ #include namespace OCIO = OCIO_NAMESPACE; -class OCIOProcessor : public OFX::ImageProcessor +class OCIOProcessor : public OFX::ImageProcessor { protected: OFX::Image * _srcImg = nullptr; @@ -21,19 +21,20 @@ class OCIOProcessor : public OFX::ImageProcessor public: OCIOProcessor(OFX::ImageEffect & instance) : OFX::ImageProcessor(instance) - {} + { + } /* Set the src image */ void setSrcImg(OFX::Image * img); /* Set the processor's transform */ - void setTransform(OCIO::ContextRcPtr context, - OCIO::ConstTransformRcPtr transform, - OCIO::TransformDirection direction); + void setTransform( + OCIO::ContextRcPtr context, + OCIO::ConstTransformRcPtr transform, + OCIO::TransformDirection direction); /* Process image on multiple threads */ void multiThreadProcessImages(OfxRectI procWindow) override; - }; #endif // INCLUDED_OFX_OCIOPROCESSOR_H diff --git a/vendor/openfx/OCIOUtils.cpp b/vendor/openfx/OCIOUtils.cpp index 90f6e42527..2172361168 100644 --- a/vendor/openfx/OCIOUtils.cpp +++ b/vendor/openfx/OCIOUtils.cpp @@ -15,17 +15,18 @@ namespace OCIO = OCIO_NAMESPACE; namespace { -void initParam(OFX::ParamDescriptor * param, - const std::string & name, - const std::string & label, - const std::string & hint, - OFX::GroupParamDescriptor * parent) +void initParam( + OFX::ParamDescriptor * param, + const std::string & name, + const std::string & label, + const std::string & hint, + OFX::GroupParamDescriptor * parent) { param->setLabels(label, label, label); param->setScriptName(name); param->setHint(hint); - if (parent) + if (parent) { param->setParent(*parent); } @@ -43,7 +44,7 @@ ContextMap deserializeContextStore(const std::string & contextStoreRaw) { std::vector contextPair; pystring::split(contextPairsRaw[i], contextPair, ":"); - + if (contextPair.size() == 2) { contextMap[contextPair[0]] = contextPair[1]; @@ -72,7 +73,7 @@ std::string serializeContextStore(const ContextMap & contextMap) } // namespace -void baseDescribe(const std::string & name, OFX::ImageEffectDescriptor& desc) +void baseDescribe(const std::string & name, OFX::ImageEffectDescriptor & desc) { // Labels desc.setLabels(name, name, name); @@ -91,18 +92,16 @@ void baseDescribe(const std::string & name, OFX::ImageEffectDescriptor& desc) desc.setSupportsMultipleClipDepths(false); } -void baseDescribeInContext(OFX::ImageEffectDescriptor& desc) +void baseDescribeInContext(OFX::ImageEffectDescriptor & desc) { // Create the mandated source clip - OFX::ClipDescriptor * srcClip = desc.defineClip( - kOfxImageEffectSimpleSourceClipName); + OFX::ClipDescriptor * srcClip = desc.defineClip(kOfxImageEffectSimpleSourceClipName); srcClip->addSupportedComponent(OFX::ePixelComponentRGBA); srcClip->addSupportedComponent(OFX::ePixelComponentRGB); // Create the mandated output clip - OFX::ClipDescriptor * dstClip = desc.defineClip( - kOfxImageEffectOutputClipName); + OFX::ClipDescriptor * dstClip = desc.defineClip(kOfxImageEffectOutputClipName); dstClip->addSupportedComponent(OFX::ePixelComponentRGBA); dstClip->addSupportedComponent(OFX::ePixelComponentRGB); @@ -130,10 +129,10 @@ OCIO::BitDepth getOCIOBitDepth(OFX::BitDepthEnum ofxBitDepth) ocioBitDepth = OCIO::BIT_DEPTH_UINT8; break; case OFX::eBitDepthUShort: - ocioBitDepth = OCIO::BIT_DEPTH_UINT16; + ocioBitDepth = OCIO::BIT_DEPTH_UINT16; break; case OFX::eBitDepthHalf: - ocioBitDepth = OCIO::BIT_DEPTH_F16; + ocioBitDepth = OCIO::BIT_DEPTH_F16; break; case OFX::eBitDepthFloat: ocioBitDepth = OCIO::BIT_DEPTH_F32; @@ -162,7 +161,7 @@ int getChanStrideBytes(OCIO::BitDepth ocioBitDepth) break; case OCIO::BIT_DEPTH_UINT16: case OCIO::BIT_DEPTH_F16: - chanStrideBytes = 2; + chanStrideBytes = 2; break; case OCIO::BIT_DEPTH_F32: chanStrideBytes = 4; @@ -183,12 +182,13 @@ int getChanStrideBytes(OCIO::BitDepth ocioBitDepth) return chanStrideBytes; } -void defineCsNameParam(OFX::ImageEffectDescriptor & desc, - OFX::PageParamDescriptor * page, - const std::string & name, - const std::string & label, - const std::string & hint, - OFX::GroupParamDescriptor * parent) +void defineCsNameParam( + OFX::ImageEffectDescriptor & desc, + OFX::PageParamDescriptor * page, + const std::string & name, + const std::string & label, + const std::string & hint, + OFX::GroupParamDescriptor * parent) { OFX::ChoiceParamDescriptor * param = desc.defineChoiceParam(name); initParam(param, name, label, hint, parent); @@ -196,7 +196,7 @@ void defineCsNameParam(OFX::ImageEffectDescriptor & desc, OCIO::ConstConfigRcPtr config = getOCIOConfig(); // Populate color space names - // TODO: Use ColorSpaceMenuHelper to generate the menus in order to + // TODO: Use ColorSpaceMenuHelper to generate the menus in order to // leverage features such as categories. for (int i = 0; i < config->getNumColorSpaces(); i++) { @@ -219,20 +219,23 @@ void defineCsNameParam(OFX::ImageEffectDescriptor & desc, page->addChild(*param); // Preserve color space name param values through OCIO config changes - defineStringParam(desc, page, - name + "_store", - "Color space name store", - "Persistent color space name parameter value storage", - parent, - true); // secret + defineStringParam( + desc, + page, + name + "_store", + "Color space name store", + "Persistent color space name parameter value storage", + parent, + true); // secret } -void defineDisplayParam(OFX::ImageEffectDescriptor & desc, - OFX::PageParamDescriptor * page, - const std::string & name, - const std::string & label, - const std::string & hint, - OFX::GroupParamDescriptor * parent) +void defineDisplayParam( + OFX::ImageEffectDescriptor & desc, + OFX::PageParamDescriptor * page, + const std::string & name, + const std::string & label, + const std::string & hint, + OFX::GroupParamDescriptor * parent) { OFX::ChoiceParamDescriptor * param = desc.defineChoiceParam(name); initParam(param, name, label, hint, parent); @@ -256,22 +259,25 @@ void defineDisplayParam(OFX::ImageEffectDescriptor & desc, param->setDefault(defaultDisplayIdx); page->addChild(*param); - + // Preserve display param values through OCIO config changes - defineStringParam(desc, page, - name + "_store", - "Display store", - "Persistent display parameter value storage", - parent, - true); // secret + defineStringParam( + desc, + page, + name + "_store", + "Display store", + "Persistent display parameter value storage", + parent, + true); // secret } -void defineViewParam(OFX::ImageEffectDescriptor & desc, - OFX::PageParamDescriptor * page, - const std::string & name, - const std::string & label, - const std::string & hint, - OFX::GroupParamDescriptor * parent) +void defineViewParam( + OFX::ImageEffectDescriptor & desc, + OFX::PageParamDescriptor * page, + const std::string & name, + const std::string & label, + const std::string & hint, + OFX::GroupParamDescriptor * parent) { OFX::ChoiceParamDescriptor * param = desc.defineChoiceParam(name); initParam(param, name, label, hint, parent); @@ -297,23 +303,26 @@ void defineViewParam(OFX::ImageEffectDescriptor & desc, param->setDefault(defaultViewIdx); page->addChild(*param); - + // Preserve view param values through OCIO config changes - defineStringParam(desc, page, - name + "_store", - "View store", - "Persistent view parameter value storage", - parent, - true); // secret + defineStringParam( + desc, + page, + name + "_store", + "View store", + "Persistent view parameter value storage", + parent, + true); // secret } -void defineBooleanParam(OFX::ImageEffectDescriptor & desc, - OFX::PageParamDescriptor * page, - const std::string & name, - const std::string & label, - const std::string & hint, - OFX::GroupParamDescriptor * parent, - bool defaultValue) +void defineBooleanParam( + OFX::ImageEffectDescriptor & desc, + OFX::PageParamDescriptor * page, + const std::string & name, + const std::string & label, + const std::string & hint, + OFX::GroupParamDescriptor * parent, + bool defaultValue) { OFX::BooleanParamDescriptor * param = desc.defineBooleanParam(name); initParam(param, name, label, hint, parent); @@ -323,15 +332,16 @@ void defineBooleanParam(OFX::ImageEffectDescriptor & desc, page->addChild(*param); } -void defineStringParam(OFX::ImageEffectDescriptor & desc, - OFX::PageParamDescriptor * page, - const std::string & name, - const std::string & label, - const std::string & hint, - OFX::GroupParamDescriptor * parent, - bool isSecret, - std::string defaultValue, - OFX::StringTypeEnum stringType) +void defineStringParam( + OFX::ImageEffectDescriptor & desc, + OFX::PageParamDescriptor * page, + const std::string & name, + const std::string & label, + const std::string & hint, + OFX::GroupParamDescriptor * parent, + bool isSecret, + std::string defaultValue, + OFX::StringTypeEnum stringType) { OFX::StringParamDescriptor * param = desc.defineStringParam(name); initParam(param, name, label, hint, parent); @@ -343,12 +353,13 @@ void defineStringParam(OFX::ImageEffectDescriptor & desc, page->addChild(*param); } -void definePushButtonParam(OFX::ImageEffectDescriptor & desc, - OFX::PageParamDescriptor * page, - const std::string & name, - const std::string & label, - const std::string & hint, - OFX::GroupParamDescriptor * parent) +void definePushButtonParam( + OFX::ImageEffectDescriptor & desc, + OFX::PageParamDescriptor * page, + const std::string & name, + const std::string & label, + const std::string & hint, + OFX::GroupParamDescriptor * parent) { OFX::PushButtonParamDescriptor * param = desc.definePushButtonParam(name); initParam(param, name, label, hint, parent); @@ -356,8 +367,7 @@ void definePushButtonParam(OFX::ImageEffectDescriptor & desc, page->addChild(*param); } -void defineContextParams(OFX::ImageEffectDescriptor & desc, - OFX::PageParamDescriptor * page) +void defineContextParams(OFX::ImageEffectDescriptor & desc, OFX::PageParamDescriptor * page) { OFX::GroupParamDescriptor * group = desc.defineGroupParam("Context"); group->setOpen(false); @@ -369,36 +379,36 @@ void defineContextParams(OFX::ImageEffectDescriptor & desc, for (int i = 0; i < config->getNumEnvironmentVars(); i++) { - std::string envVarName( - config->getEnvironmentVarNameByIndex(i)); - std::string envVarDefault( - config->getEnvironmentVarDefault(envVarName.c_str())); - - defineStringParam(desc, page, - "context_" + envVarName, // name - envVarName, // label - ("Set or override context variable: " // hint - + envVarName + " (default: '" - + envVarDefault + "')"), - group); + std::string envVarName(config->getEnvironmentVarNameByIndex(i)); + std::string envVarDefault(config->getEnvironmentVarDefault(envVarName.c_str())); + + defineStringParam( + desc, + page, + "context_" + envVarName, // name + envVarName, // label + ("Set or override context variable: " // hint + + envVarName + " (default: '" + envVarDefault + "')"), + group); } // Preserve all context_* param values through OCIO config/context changes - defineStringParam(desc, page, - "context_store", - "Context store", - "Persistent context parameter value storage", - group, - true); // secret + defineStringParam( + desc, + page, + "context_store", + "Context store", + "Persistent context parameter value storage", + group, + true); // secret } void fetchContextParams(OFX::ImageEffect & instance, ParamMap & params) { OCIO::ConstConfigRcPtr config = getOCIOConfig(); - OFX::StringParam * contextStoreParam = - instance.fetchStringParam("context_store"); - + OFX::StringParam * contextStoreParam = instance.fetchStringParam("context_store"); + // Deserialize raw context store string into a context map std::string contextStoreRaw; contextStoreParam->getValue(contextStoreRaw); @@ -409,8 +419,7 @@ void fetchContextParams(OFX::ImageEffect & instance, ParamMap & params) { std::string envVarName(config->getEnvironmentVarNameByIndex(i)); - OFX::StringParam * contextParam = - instance.fetchStringParam("context_" + envVarName); + OFX::StringParam * contextParam = instance.fetchStringParam("context_" + envVarName); if (contextParam != 0) { @@ -433,24 +442,21 @@ void fetchContextParams(OFX::ImageEffect & instance, ParamMap & params) } } -void contextParamChanged(OFX::ImageEffect & instance, - const std::string & paramName) +void contextParamChanged(OFX::ImageEffect & instance, const std::string & paramName) { // Is changed param a context variable? - if (!pystring::startswith(paramName, "context_") - || paramName == "context_store") + if (!pystring::startswith(paramName, "context_") || paramName == "context_store") { return; } - - OFX::StringParam * contextStoreParam = - instance.fetchStringParam("context_store"); + + OFX::StringParam * contextStoreParam = instance.fetchStringParam("context_store"); // Deserialize raw context store string into a context map std::string contextStoreRaw; contextStoreParam->getValue(contextStoreRaw); ContextMap contextMap = deserializeContextStore(contextStoreRaw); - + // Update context map with new value OFX::StringParam * contextParam = instance.fetchStringParam(paramName); @@ -474,9 +480,9 @@ void contextParamChanged(OFX::ImageEffect & instance, OCIO::ContextRcPtr createOCIOContext(ParamMap & params) { - OCIO::ConstConfigRcPtr config = getOCIOConfig(); + OCIO::ConstConfigRcPtr config = getOCIOConfig(); OCIO::ConstContextRcPtr srcContext = config->getCurrentContext(); - OCIO::ContextRcPtr context = srcContext->createEditableCopy(); + OCIO::ContextRcPtr context = srcContext->createEditableCopy(); ParamMap::const_iterator it = params.begin(); @@ -484,7 +490,7 @@ OCIO::ContextRcPtr createOCIOContext(ParamMap & params) { std::string value; it->second->getValue(value); - + if (!value.empty()) { context->setStringVar(it->first.c_str(), value.c_str()); @@ -509,8 +515,7 @@ std::string getChoiceParamOption(OFX::ChoiceParam * param) return name; } -void choiceParamChanged(OFX::ImageEffect & instance, - const std::string & paramName) +void choiceParamChanged(OFX::ImageEffect & instance, const std::string & paramName) { // Ignore sibling *_store params if (pystring::endswith(paramName, "_store")) @@ -526,8 +531,7 @@ void choiceParamChanged(OFX::ImageEffect & instance, } // Does the choice param have a sibling *_store param? - OFX::StringParam * storeParam = - instance.fetchStringParam(paramName + "_store"); + OFX::StringParam * storeParam = instance.fetchStringParam(paramName + "_store"); if (!storeParam) { return; @@ -541,9 +545,10 @@ void choiceParamChanged(OFX::ImageEffect & instance, } } -void restoreChoiceParamOption(OFX::ImageEffect & instance, - const std::string & paramName, - const std::string & pluginType) +void restoreChoiceParamOption( + OFX::ImageEffect & instance, + const std::string & paramName, + const std::string & pluginType) { // Get choice param OFX::ChoiceParam * choiceParam = instance.fetchChoiceParam(paramName); @@ -553,8 +558,7 @@ void restoreChoiceParamOption(OFX::ImageEffect & instance, } // Get sibling *_store param - OFX::StringParam * storeParam = - instance.fetchStringParam(paramName + "_store"); + OFX::StringParam * storeParam = instance.fetchStringParam(paramName + "_store"); if (!storeParam) { return; @@ -580,9 +584,9 @@ void restoreChoiceParamOption(OFX::ImageEffect & instance, } } - // Value is missing. Add it and make it current, with an indication + // Value is missing. Add it and make it current, with an indication // that it's now missing from the config. - // NOTE: Some hosts don't honor option labels, so also send a warning + // NOTE: Some hosts don't honor option labels, so also send a warning // message about the missing value. if (idx == -1) { @@ -597,9 +601,10 @@ void restoreChoiceParamOption(OFX::ImageEffect & instance, os << "' choice '" << storedValue << "' is missing. "; os << "Is the correct OCIO config loaded?"; - instance.sendMessage(OFX::Message::eMessageWarning, - "choice_param_missing_option_error", - os.str()); + instance.sendMessage( + OFX::Message::eMessageWarning, + "choice_param_missing_option_error", + os.str()); } // Value is present, but index changed. Reset it. else @@ -612,8 +617,7 @@ void restoreChoiceParamOption(OFX::ImageEffect & instance, choiceParamChanged(instance, paramName); } -void updateViewParamOptions(OFX::ChoiceParam * displayParam, - OFX::ChoiceParam * viewParam) +void updateViewParamOptions(OFX::ChoiceParam * displayParam, OFX::ChoiceParam * viewParam) { OCIO::ConstConfigRcPtr config = getOCIOConfig(); diff --git a/vendor/openfx/OCIOUtils.h b/vendor/openfx/OCIOUtils.h index 24f51a3f2d..b396a36612 100644 --- a/vendor/openfx/OCIOUtils.h +++ b/vendor/openfx/OCIOUtils.h @@ -4,8 +4,8 @@ #ifndef INCLUDED_OFX_OCIOUTILS_H #define INCLUDED_OFX_OCIOUTILS_H -#include #include +#include #include "ofxsImageEffect.h" @@ -19,8 +19,8 @@ typedef std::map ContextMap; static const std::string PARAM_NAME_PAGE_0 = "Controls"; /* Default plugin setup */ -void baseDescribe(const std::string & name, OFX::ImageEffectDescriptor& desc); -void baseDescribeInContext(OFX::ImageEffectDescriptor& desc); +void baseDescribe(const std::string & name, OFX::ImageEffectDescriptor & desc); +void baseDescribeInContext(OFX::ImageEffectDescriptor & desc); /* Get the current OCIO config */ OCIO::ConstConfigRcPtr getOCIOConfig(); @@ -32,67 +32,71 @@ OCIO::BitDepth getOCIOBitDepth(OFX::BitDepthEnum ofxBitDepth); int getChanStrideBytes(OCIO::BitDepth ocioBitDepth); /* Build color space ChoiceParam from the current OCIO config */ -void defineCsNameParam(OFX::ImageEffectDescriptor & desc, - OFX::PageParamDescriptor * page, - const std::string & name, - const std::string & label, - const std::string & hint, - OFX::GroupParamDescriptor * parent); +void defineCsNameParam( + OFX::ImageEffectDescriptor & desc, + OFX::PageParamDescriptor * page, + const std::string & name, + const std::string & label, + const std::string & hint, + OFX::GroupParamDescriptor * parent); /* Build display ChoiceParam from the current OCIO config */ -void defineDisplayParam(OFX::ImageEffectDescriptor & desc, - OFX::PageParamDescriptor * page, - const std::string & name, - const std::string & label, - const std::string & hint, - OFX::GroupParamDescriptor * parent); +void defineDisplayParam( + OFX::ImageEffectDescriptor & desc, + OFX::PageParamDescriptor * page, + const std::string & name, + const std::string & label, + const std::string & hint, + OFX::GroupParamDescriptor * parent); /* Build view ChoiceParam from the default OCIO config display */ -void defineViewParam(OFX::ImageEffectDescriptor & desc, - OFX::PageParamDescriptor * page, - const std::string & name, - const std::string & label, - const std::string & hint, - OFX::GroupParamDescriptor * parent); +void defineViewParam( + OFX::ImageEffectDescriptor & desc, + OFX::PageParamDescriptor * page, + const std::string & name, + const std::string & label, + const std::string & hint, + OFX::GroupParamDescriptor * parent); /* Build simple BooleanParam, defaulting to false */ -void defineBooleanParam(OFX::ImageEffectDescriptor & desc, - OFX::PageParamDescriptor * page, - const std::string & name, - const std::string & label, - const std::string & hint, - OFX::GroupParamDescriptor * parent, - bool defaultValue = false); +void defineBooleanParam( + OFX::ImageEffectDescriptor & desc, + OFX::PageParamDescriptor * page, + const std::string & name, + const std::string & label, + const std::string & hint, + OFX::GroupParamDescriptor * parent, + bool defaultValue = false); /* Build simple StringParam */ -void defineStringParam(OFX::ImageEffectDescriptor & desc, - OFX::PageParamDescriptor * page, - const std::string & name, - const std::string & label, - const std::string & hint, - OFX::GroupParamDescriptor * parent, - bool isSecret = false, - std::string defaultValue = "", - OFX::StringTypeEnum stringType = OFX::eStringTypeSingleLine); +void defineStringParam( + OFX::ImageEffectDescriptor & desc, + OFX::PageParamDescriptor * page, + const std::string & name, + const std::string & label, + const std::string & hint, + OFX::GroupParamDescriptor * parent, + bool isSecret = false, + std::string defaultValue = "", + OFX::StringTypeEnum stringType = OFX::eStringTypeSingleLine); /* Build simple PushButtonParam */ -void definePushButtonParam(OFX::ImageEffectDescriptor & desc, - OFX::PageParamDescriptor * page, - const std::string & name, - const std::string & label, - const std::string & hint, - OFX::GroupParamDescriptor * parent); +void definePushButtonParam( + OFX::ImageEffectDescriptor & desc, + OFX::PageParamDescriptor * page, + const std::string & name, + const std::string & label, + const std::string & hint, + OFX::GroupParamDescriptor * parent); /* Build GroupParam with four context variable StringParam name/value pairs */ -void defineContextParams(OFX::ImageEffectDescriptor & desc, - OFX::PageParamDescriptor * page); +void defineContextParams(OFX::ImageEffectDescriptor & desc, OFX::PageParamDescriptor * page); /* Fetch StringParams defined by defineContextParams */ void fetchContextParams(OFX::ImageEffect & instance, ParamMap & params); /* Update internal context_store param on context variable StringParam change */ -void contextParamChanged(OFX::ImageEffect & instance, - const std::string & paramName); +void contextParamChanged(OFX::ImageEffect & instance, const std::string & paramName); /* Create copy of the current OCIO context with additional or overridden context variables from StringParams defined by defineContextParams. @@ -103,16 +107,15 @@ OCIO::ContextRcPtr createOCIOContext(ParamMap & params); std::string getChoiceParamOption(OFX::ChoiceParam * param); /* Update internal *_store param on config ChoiceParam change */ -void choiceParamChanged(OFX::ImageEffect & instance, - const std::string & paramName); +void choiceParamChanged(OFX::ImageEffect & instance, const std::string & paramName); /* Restore "missing" config ChoiceParam option from internal *_store param */ -void restoreChoiceParamOption(OFX::ImageEffect & instance, - const std::string & paramName, - const std::string & pluginType); +void restoreChoiceParamOption( + OFX::ImageEffect & instance, + const std::string & paramName, + const std::string & pluginType); /* Update view ChoiceParam options from current display ChoiceParam option */ -void updateViewParamOptions(OFX::ChoiceParam * displayParam, - OFX::ChoiceParam * viewParam); +void updateViewParamOptions(OFX::ChoiceParam * displayParam, OFX::ChoiceParam * viewParam); #endif // INCLUDED_OFX_OCIOUTILS_H