diff --git a/CMakeLists.txt b/CMakeLists.txt index 9769abd9d..91bbb6e6e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -65,6 +65,7 @@ find_package(EXPAT) find_package(opengl_system REQUIRED) find_package(cimg REQUIRED) find_package(spdlog REQUIRED) +find_package(tcb-span REQUIRED) # Macros include(OpenFX) diff --git a/Documentation/README.md b/Documentation/README.md index dcbea8f42..5811c2979 100755 --- a/Documentation/README.md +++ b/Documentation/README.md @@ -26,6 +26,8 @@ system python if you like.) * Make sure your virtualenv above is activated: `source ofx-docgen/bin/activate` * Generate references: `python Documentation/genPropertiesReference.py -i include -o Documentation/sources/Reference/ofxPropertiesReference.rst -r` +* Generate property documentation from YAML definitions: + `python scripts/gen-props-doc.py -v` (requires PyYAML) * Build the doxygen docs: `cd include; doxygen ofx.doxy; cd -` (you'll see some warnings) * Build the sphinx docs: diff --git a/Documentation/build.sh b/Documentation/build.sh index 087406928..676ca040c 100755 --- a/Documentation/build.sh +++ b/Documentation/build.sh @@ -41,7 +41,17 @@ $UV_RUN python genPropertiesReference.py \ > /tmp/ofx-doc-build.out 2>&1 grep -v -E "$EXPECTED_ERRS" /tmp/ofx-doc-build.out || true -# Build the Doxygen docs +# Generate property documentation from YAML definitions +cd .. +if command -v uv > /dev/null 2>&1; then + uv run scripts/gen-props-doc.py -v >> /tmp/ofx-doc-build.out 2>&1 +else + # Fall back to regular python if uv is not available + python scripts/gen-props-doc.py -v >> /tmp/ofx-doc-build.out 2>&1 +fi +cd Documentation + +# Build the Doxygen docs into $TOP/Documentation/doxygen_build EXPECTED_ERRS="malformed hyperlink target|Duplicate explicit|Definition list ends|unable to resolve|could not be resolved" cd ../include doxygen ofx.doxy > /tmp/ofx-doc-build.out 2>&1 diff --git a/Documentation/genPropertiesReference.py b/Documentation/genPropertiesReference.py index 7c1dce055..e263c1dc7 100755 --- a/Documentation/genPropertiesReference.py +++ b/Documentation/genPropertiesReference.py @@ -4,68 +4,88 @@ badlyNamedProperties = ["kOfxImageEffectFrameVarying", "kOfxImageEffectPluginRenderThreadSafety"] -def getPropertiesFromDir(sourcePath, recursive, props): +def getPropertiesFromFile(path): + """Get all OpenFX property definitions from C header file. - if os.path.isdir(sourcePath): - files=sorted(os.listdir(sourcePath)) - for f in files: - absF = sourcePath + '/' + f - if not recursive and os.path.isdir(absF): + Uses a heuristic to identify property #define lines: + anything starting with '#define' and containing 'Prop' in the name. + """ + props = set() + with open(path) as f: + try: + lines = f.readlines() + except UnicodeDecodeError as e: + logging.error(f'error reading {path}: {e}') + raise e + for l in lines: + # Detect lines that correspond to a property definition, e.g: + # #define kOfxPropLala "OfxPropLala" + splits=l.split() + if len(splits) < 3: continue - else: - getPropertiesFromDir(absF,recursive,props) - elif os.path.isfile(sourcePath): - ext = os.path.splitext(sourcePath)[1] - if ext.lower() in ('.c', '.cxx', '.cpp', '.h', '.hxx', '.hpp'): - with open(sourcePath) as f: - try: - lines = f.readlines() - except UnicodeDecodeError as e: - print('WARNING: error in', sourcePath, ':') - raise e - for l in lines: - # Detect lines that correspond to a property definition, e.g: - # #define kOfxPropLala "OfxPropLala" - splits=l.split(' ') - if len(splits) != 3: - continue - if splits[0] != '#define': - continue - if 'Prop' in splits[1] and splits[1] != 'kOfxPropertySuite': - #if l.startswith('#define kOfx') and 'Prop' in l: - props.append(splits[1]) - else: - raise ValueError('No such file or directory: %s' % sourcePath) + if splits[0] != '#define': + continue + # ignore these + nonProperties = ('kOfxPropertySuite', + # prop values, not props + 'kOfxImageEffectPropColourManagementNone', + 'kOfxImageEffectPropColourManagementBasic', + 'kOfxImageEffectPropColourManagementCore', + 'kOfxImageEffectPropColourManagementFull', + 'kOfxImageEffectPropColourManagementOCIO', + ) + if splits[1] in nonProperties: + continue + # these are props, as well as anything with Prop in the name + badlyNamedProperties = ("kOfxImageEffectFrameVarying", + "kOfxImageEffectPluginRenderThreadSafety") + if 'Prop' in splits[1] \ + or any(s in splits[1] for s in badlyNamedProperties): + props.add(splits[1]) + return props + +def getPropertiesFromDir(dir): + """ + Recursively get all property definitions from source files in a dir. + """ + + extensions = {'.c', '.h', '.cxx', '.hxx', '.cpp', '.hpp'} + + props = set() + for root, _dirs, files in os.walk(dir): + for file in files: + # Get the file extension + file_extension = os.path.splitext(file)[1] + + if file_extension in extensions: + file_path = os.path.join(root, file) + props |= getPropertiesFromFile(file_path) + return list(props) def main(argv): - recursive=False sourcePath='' outputFile='' try: - opts, args = getopt.getopt(argv,"i:o:r",["sourcePath=","outputFile","recursive"]) + opts, args = getopt.getopt(argv,"i:o:r",["sourcePath=","outputFile"]) for opt,value in opts: if opt == "-i": sourcePath = value elif opt == "-o": outputFile = value - elif opt == "-r": - recursive=True except getopt.GetoptError: sys.exit(1) - props=badlyNamedProperties - getPropertiesFromDir(sourcePath, recursive, props) + props = getPropertiesFromDir(sourcePath) - re='/^#define k[\w_]*Ofx[\w_]*Prop/' with open(outputFile, 'w') as f: f.write('.. _propertiesReference:\n') f.write('Properties Reference\n') f.write('=====================\n') - props.sort() - for p in props: - f.write('.. doxygendefine:: ' + p + '\n\n') + for p in sorted(props): + f.write('.. doxygendefine:: ' + p + '\n') + f.write('.. property_link:: ' + p + '\n\n') if __name__ == "__main__": main(sys.argv[1:]) diff --git a/Documentation/pipreq.txt b/Documentation/pipreq.txt index 04d0a80a5..242d9c16c 100644 --- a/Documentation/pipreq.txt +++ b/Documentation/pipreq.txt @@ -1,3 +1,4 @@ sphinx<7 breathe sphinx_rtd_theme +pyyaml>=6.0 diff --git a/Documentation/sources/Guide/ofxExample5_Circle.rst b/Documentation/sources/Guide/ofxExample5_Circle.rst index cd8c418a9..bdee4a904 100644 --- a/Documentation/sources/Guide/ofxExample5_Circle.rst +++ b/Documentation/sources/Guide/ofxExample5_Circle.rst @@ -4,7 +4,7 @@ This guide will introduce the spatial coordinate system used by OFX and will illustrate that with a simple circle drawing plugin. Its source can be found in the source code file -`circle.cpp `_. +`circle.cpp `_. This plugin takes a clip and draws a circle over it. The colour, size and position of the circle are controlled by several parameters. @@ -127,7 +127,7 @@ depending on what the host says it can do. Here is the source for the load action… -`circle.cpp `__ +`circle.cpp `__ .. code:: c++ @@ -191,7 +191,7 @@ Note, we are relying on a parameter type that is only available with the 1.2 version of OFX. Our plugin checks for this version of the API the host supports and will fail gracefully during the load action. -`circle.cpp `__ +`circle.cpp `__ .. code:: c++ @@ -252,7 +252,7 @@ are being described relative to the project size. So our circle’s radius will default to be a quarter of the nominal project size’s x dimension. For a 1080 HD project, this would be a value of 480. -`circle.cpp `__ +`circle.cpp `__ .. code:: c++ @@ -294,7 +294,7 @@ for such parameters to let you simply drag such positions around. We are also setting the default values relative to the project size, and in this case (0.5, 0.5), it should appear in the centre of the final image. -`circle.cpp `__ +`circle.cpp `__ .. code:: c++ @@ -325,7 +325,7 @@ when you get and set the colour, you need to scale the values up to the nominal white point of your image, which is implicitly defined by the data type of the image. -`circle.cpp `__ +`circle.cpp `__ .. code:: c++ @@ -382,7 +382,7 @@ To set the output rod, we need to trap the :c:macro:`kOfxImageEffectActionGetRegionOfDefinition` action. Our MainEntry function now has an extra conditional in there…. -`circle.cpp `__ +`circle.cpp `__ .. code:: c++ @@ -397,7 +397,7 @@ definition on those hosts RoDs are fixed. The code for the action itself is quite simple: -`circle.cpp `__ +`circle.cpp `__ :: @@ -479,7 +479,7 @@ The action code is fairly boiler plate, it fetches parameter values and images from clips before calling the templated PixelProcessing function. Which is below: -`circle.cpp `__ +`circle.cpp `__ :: diff --git a/Documentation/sources/Reference/index.rst b/Documentation/sources/Reference/index.rst index f531ab81a..97d787c74 100644 --- a/Documentation/sources/Reference/index.rst +++ b/Documentation/sources/Reference/index.rst @@ -28,8 +28,12 @@ the API. The changes to the API are listed in an addendum. ofxImageEffectActions ofxInteractActions suites/ofxSuiteReference - ofxPropertiesByObject + .. outdated: + .. ofxPropertiesByObject ofxPropertiesReference + ofxPropertiesReferenceGenerated + ofxPropertySetsGenerated DoxygenIndex ofxStatusCodes - apiChanges_1_2_Chapter + .. not needed: + .. apiChanges_1_2_Chapter diff --git a/Documentation/sources/Reference/ofxInteracts.rst b/Documentation/sources/Reference/ofxInteracts.rst index d5add773e..4a8d06115 100644 --- a/Documentation/sources/Reference/ofxInteracts.rst +++ b/Documentation/sources/Reference/ofxInteracts.rst @@ -5,7 +5,7 @@ Interacts When a host presents a graphical user interface to an image effect, it may optionally give it the chance to draw its own custom GUI tools and to be able to interact with pen and keyboard input. In OFX this is done -via the OfxInteract suite, which is found in the file `ofxInteract.h `_. +via the OfxInteract suite, which is found in the file `ofxInteract.h `_. OFX interacts by default use openGL to perform all drawing in interacts, due to its portabilty, robustness and wide implementation. diff --git a/Documentation/sources/Reference/ofxPropertiesReference.rst b/Documentation/sources/Reference/ofxPropertiesReference.rst index cbd93af1e..f449ef383 100644 --- a/Documentation/sources/Reference/ofxPropertiesReference.rst +++ b/Documentation/sources/Reference/ofxPropertiesReference.rst @@ -2,354 +2,541 @@ Properties Reference ===================== .. doxygendefine:: kOfxImageClipPropColourspace +.. property_link:: kOfxImageClipPropColourspace .. doxygendefine:: kOfxImageClipPropConnected +.. property_link:: kOfxImageClipPropConnected .. doxygendefine:: kOfxImageClipPropContinuousSamples +.. property_link:: kOfxImageClipPropContinuousSamples .. doxygendefine:: kOfxImageClipPropFieldExtraction +.. property_link:: kOfxImageClipPropFieldExtraction .. doxygendefine:: kOfxImageClipPropFieldOrder +.. property_link:: kOfxImageClipPropFieldOrder .. doxygendefine:: kOfxImageClipPropIsMask +.. property_link:: kOfxImageClipPropIsMask .. doxygendefine:: kOfxImageClipPropOptional +.. property_link:: kOfxImageClipPropOptional .. doxygendefine:: kOfxImageClipPropPreferredColourspaces +.. property_link:: kOfxImageClipPropPreferredColourspaces .. doxygendefine:: kOfxImageClipPropUnmappedComponents +.. property_link:: kOfxImageClipPropUnmappedComponents .. doxygendefine:: kOfxImageClipPropUnmappedPixelDepth +.. property_link:: kOfxImageClipPropUnmappedPixelDepth .. doxygendefine:: kOfxImageEffectFrameVarying +.. property_link:: kOfxImageEffectFrameVarying .. doxygendefine:: kOfxImageEffectHostPropIsBackground +.. property_link:: kOfxImageEffectHostPropIsBackground + +.. doxygendefine:: kOfxImageEffectHostPropNativeOrigin +.. property_link:: kOfxImageEffectHostPropNativeOrigin .. doxygendefine:: kOfxImageEffectInstancePropEffectDuration +.. property_link:: kOfxImageEffectInstancePropEffectDuration .. doxygendefine:: kOfxImageEffectInstancePropSequentialRender +.. property_link:: kOfxImageEffectInstancePropSequentialRender .. doxygendefine:: kOfxImageEffectPluginPropFieldRenderTwiceAlways +.. property_link:: kOfxImageEffectPluginPropFieldRenderTwiceAlways .. doxygendefine:: kOfxImageEffectPluginPropGrouping +.. property_link:: kOfxImageEffectPluginPropGrouping .. doxygendefine:: kOfxImageEffectPluginPropHostFrameThreading +.. property_link:: kOfxImageEffectPluginPropHostFrameThreading .. doxygendefine:: kOfxImageEffectPluginPropOverlayInteractV1 +.. property_link:: kOfxImageEffectPluginPropOverlayInteractV1 .. doxygendefine:: kOfxImageEffectPluginPropOverlayInteractV2 +.. property_link:: kOfxImageEffectPluginPropOverlayInteractV2 .. doxygendefine:: kOfxImageEffectPluginPropSingleInstance +.. property_link:: kOfxImageEffectPluginPropSingleInstance .. doxygendefine:: kOfxImageEffectPluginRenderThreadSafety +.. property_link:: kOfxImageEffectPluginRenderThreadSafety .. doxygendefine:: kOfxImageEffectPropClipPreferencesSlaveParam +.. property_link:: kOfxImageEffectPropClipPreferencesSlaveParam .. doxygendefine:: kOfxImageEffectPropColourManagementAvailableConfigs +.. property_link:: kOfxImageEffectPropColourManagementAvailableConfigs .. doxygendefine:: kOfxImageEffectPropColourManagementConfig +.. property_link:: kOfxImageEffectPropColourManagementConfig .. doxygendefine:: kOfxImageEffectPropColourManagementStyle +.. property_link:: kOfxImageEffectPropColourManagementStyle .. doxygendefine:: kOfxImageEffectPropComponents +.. property_link:: kOfxImageEffectPropComponents .. doxygendefine:: kOfxImageEffectPropContext +.. property_link:: kOfxImageEffectPropContext .. doxygendefine:: kOfxImageEffectPropCudaEnabled +.. property_link:: kOfxImageEffectPropCudaEnabled .. doxygendefine:: kOfxImageEffectPropCudaRenderSupported +.. property_link:: kOfxImageEffectPropCudaRenderSupported .. doxygendefine:: kOfxImageEffectPropCudaStream +.. property_link:: kOfxImageEffectPropCudaStream .. doxygendefine:: kOfxImageEffectPropCudaStreamSupported +.. property_link:: kOfxImageEffectPropCudaStreamSupported .. doxygendefine:: kOfxImageEffectPropDisplayColourspace +.. property_link:: kOfxImageEffectPropDisplayColourspace .. doxygendefine:: kOfxImageEffectPropFieldToRender +.. property_link:: kOfxImageEffectPropFieldToRender .. doxygendefine:: kOfxImageEffectPropFrameRange +.. property_link:: kOfxImageEffectPropFrameRange .. doxygendefine:: kOfxImageEffectPropFrameRate +.. property_link:: kOfxImageEffectPropFrameRate .. doxygendefine:: kOfxImageEffectPropFrameStep +.. property_link:: kOfxImageEffectPropFrameStep .. doxygendefine:: kOfxImageEffectPropInAnalysis +.. property_link:: kOfxImageEffectPropInAnalysis .. doxygendefine:: kOfxImageEffectPropInteractiveRenderStatus +.. property_link:: kOfxImageEffectPropInteractiveRenderStatus .. doxygendefine:: kOfxImageEffectPropMetalCommandQueue +.. property_link:: kOfxImageEffectPropMetalCommandQueue .. doxygendefine:: kOfxImageEffectPropMetalEnabled +.. property_link:: kOfxImageEffectPropMetalEnabled .. doxygendefine:: kOfxImageEffectPropMetalRenderSupported +.. property_link:: kOfxImageEffectPropMetalRenderSupported .. doxygendefine:: kOfxImageEffectPropNoSpatialAwareness .. doxygendefine:: kOfxImageEffectPropOCIOConfig +.. property_link:: kOfxImageEffectPropOCIOConfig .. doxygendefine:: kOfxImageEffectPropOCIODisplay +.. property_link:: kOfxImageEffectPropOCIODisplay .. doxygendefine:: kOfxImageEffectPropOCIOView +.. property_link:: kOfxImageEffectPropOCIOView .. doxygendefine:: kOfxImageEffectPropOpenCLCommandQueue +.. property_link:: kOfxImageEffectPropOpenCLCommandQueue .. doxygendefine:: kOfxImageEffectPropOpenCLEnabled +.. property_link:: kOfxImageEffectPropOpenCLEnabled + +.. doxygendefine:: kOfxImageEffectPropOpenCLImage +.. property_link:: kOfxImageEffectPropOpenCLImage .. doxygendefine:: kOfxImageEffectPropOpenCLRenderSupported +.. property_link:: kOfxImageEffectPropOpenCLRenderSupported + +.. doxygendefine:: kOfxImageEffectPropOpenCLSupported +.. property_link:: kOfxImageEffectPropOpenCLSupported .. doxygendefine:: kOfxImageEffectPropOpenGLEnabled +.. property_link:: kOfxImageEffectPropOpenGLEnabled .. doxygendefine:: kOfxImageEffectPropOpenGLRenderSupported +.. property_link:: kOfxImageEffectPropOpenGLRenderSupported .. doxygendefine:: kOfxImageEffectPropOpenGLTextureIndex +.. property_link:: kOfxImageEffectPropOpenGLTextureIndex .. doxygendefine:: kOfxImageEffectPropOpenGLTextureTarget +.. property_link:: kOfxImageEffectPropOpenGLTextureTarget .. doxygendefine:: kOfxImageEffectPropPixelDepth +.. property_link:: kOfxImageEffectPropPixelDepth .. doxygendefine:: kOfxImageEffectPropPluginHandle +.. property_link:: kOfxImageEffectPropPluginHandle .. doxygendefine:: kOfxImageEffectPropPreMultiplication +.. property_link:: kOfxImageEffectPropPreMultiplication .. doxygendefine:: kOfxImageEffectPropProjectExtent +.. property_link:: kOfxImageEffectPropProjectExtent .. doxygendefine:: kOfxImageEffectPropProjectOffset +.. property_link:: kOfxImageEffectPropProjectOffset .. doxygendefine:: kOfxImageEffectPropProjectPixelAspectRatio +.. property_link:: kOfxImageEffectPropProjectPixelAspectRatio .. doxygendefine:: kOfxImageEffectPropProjectSize +.. property_link:: kOfxImageEffectPropProjectSize .. doxygendefine:: kOfxImageEffectPropRegionOfDefinition +.. property_link:: kOfxImageEffectPropRegionOfDefinition .. doxygendefine:: kOfxImageEffectPropRegionOfInterest +.. property_link:: kOfxImageEffectPropRegionOfInterest .. doxygendefine:: kOfxImageEffectPropRenderQualityDraft +.. property_link:: kOfxImageEffectPropRenderQualityDraft .. doxygendefine:: kOfxImageEffectPropRenderScale +.. property_link:: kOfxImageEffectPropRenderScale .. doxygendefine:: kOfxImageEffectPropRenderWindow +.. property_link:: kOfxImageEffectPropRenderWindow .. doxygendefine:: kOfxImageEffectPropSequentialRenderStatus +.. property_link:: kOfxImageEffectPropSequentialRenderStatus .. doxygendefine:: kOfxImageEffectPropSetableFielding +.. property_link:: kOfxImageEffectPropSetableFielding .. doxygendefine:: kOfxImageEffectPropSetableFrameRate +.. property_link:: kOfxImageEffectPropSetableFrameRate .. doxygendefine:: kOfxImageEffectPropSupportedComponents +.. property_link:: kOfxImageEffectPropSupportedComponents .. doxygendefine:: kOfxImageEffectPropSupportedContexts +.. property_link:: kOfxImageEffectPropSupportedContexts .. doxygendefine:: kOfxImageEffectPropSupportedPixelDepths +.. property_link:: kOfxImageEffectPropSupportedPixelDepths .. doxygendefine:: kOfxImageEffectPropSupportsMultiResolution +.. property_link:: kOfxImageEffectPropSupportsMultiResolution .. doxygendefine:: kOfxImageEffectPropSupportsMultipleClipDepths +.. property_link:: kOfxImageEffectPropSupportsMultipleClipDepths .. doxygendefine:: kOfxImageEffectPropSupportsMultipleClipPARs +.. property_link:: kOfxImageEffectPropSupportsMultipleClipPARs .. doxygendefine:: kOfxImageEffectPropSupportsOverlays +.. property_link:: kOfxImageEffectPropSupportsOverlays .. doxygendefine:: kOfxImageEffectPropSupportsTiles +.. property_link:: kOfxImageEffectPropSupportsTiles .. doxygendefine:: kOfxImageEffectPropTemporalClipAccess +.. property_link:: kOfxImageEffectPropTemporalClipAccess .. doxygendefine:: kOfxImageEffectPropUnmappedFrameRange +.. property_link:: kOfxImageEffectPropUnmappedFrameRange .. doxygendefine:: kOfxImageEffectPropUnmappedFrameRate +.. property_link:: kOfxImageEffectPropUnmappedFrameRate .. doxygendefine:: kOfxImagePropBounds +.. property_link:: kOfxImagePropBounds .. doxygendefine:: kOfxImagePropData +.. property_link:: kOfxImagePropData .. doxygendefine:: kOfxImagePropField +.. property_link:: kOfxImagePropField .. doxygendefine:: kOfxImagePropPixelAspectRatio +.. property_link:: kOfxImagePropPixelAspectRatio .. doxygendefine:: kOfxImagePropRegionOfDefinition +.. property_link:: kOfxImagePropRegionOfDefinition .. doxygendefine:: kOfxImagePropRowBytes +.. property_link:: kOfxImagePropRowBytes .. doxygendefine:: kOfxImagePropUniqueIdentifier +.. property_link:: kOfxImagePropUniqueIdentifier .. doxygendefine:: kOfxInteractPropBackgroundColour +.. property_link:: kOfxInteractPropBackgroundColour .. doxygendefine:: kOfxInteractPropBitDepth +.. property_link:: kOfxInteractPropBitDepth .. doxygendefine:: kOfxInteractPropDrawContext +.. property_link:: kOfxInteractPropDrawContext .. doxygendefine:: kOfxInteractPropHasAlpha +.. property_link:: kOfxInteractPropHasAlpha .. doxygendefine:: kOfxInteractPropPenPosition +.. property_link:: kOfxInteractPropPenPosition .. doxygendefine:: kOfxInteractPropPenPressure +.. property_link:: kOfxInteractPropPenPressure .. doxygendefine:: kOfxInteractPropPenViewportPosition +.. property_link:: kOfxInteractPropPenViewportPosition .. doxygendefine:: kOfxInteractPropPixelScale +.. property_link:: kOfxInteractPropPixelScale .. doxygendefine:: kOfxInteractPropSlaveToParam +.. property_link:: kOfxInteractPropSlaveToParam .. doxygendefine:: kOfxInteractPropSuggestedColour +.. property_link:: kOfxInteractPropSuggestedColour .. doxygendefine:: kOfxInteractPropViewportSize +.. property_link:: kOfxInteractPropViewportSize .. doxygendefine:: kOfxOpenGLPropPixelDepth +.. property_link:: kOfxOpenGLPropPixelDepth .. doxygendefine:: kOfxParamHostPropMaxPages +.. property_link:: kOfxParamHostPropMaxPages .. doxygendefine:: kOfxParamHostPropMaxParameters +.. property_link:: kOfxParamHostPropMaxParameters .. doxygendefine:: kOfxParamHostPropPageRowColumnCount +.. property_link:: kOfxParamHostPropPageRowColumnCount .. doxygendefine:: kOfxParamHostPropSupportsBooleanAnimation +.. property_link:: kOfxParamHostPropSupportsBooleanAnimation .. doxygendefine:: kOfxParamHostPropSupportsChoiceAnimation +.. property_link:: kOfxParamHostPropSupportsChoiceAnimation .. doxygendefine:: kOfxParamHostPropSupportsCustomAnimation +.. property_link:: kOfxParamHostPropSupportsCustomAnimation .. doxygendefine:: kOfxParamHostPropSupportsCustomInteract +.. property_link:: kOfxParamHostPropSupportsCustomInteract .. doxygendefine:: kOfxParamHostPropSupportsParametricAnimation +.. property_link:: kOfxParamHostPropSupportsParametricAnimation .. doxygendefine:: kOfxParamHostPropSupportsStrChoice +.. property_link:: kOfxParamHostPropSupportsStrChoice .. doxygendefine:: kOfxParamHostPropSupportsStrChoiceAnimation +.. property_link:: kOfxParamHostPropSupportsStrChoiceAnimation .. doxygendefine:: kOfxParamHostPropSupportsStringAnimation +.. property_link:: kOfxParamHostPropSupportsStringAnimation .. doxygendefine:: kOfxParamPropAnimates +.. property_link:: kOfxParamPropAnimates .. doxygendefine:: kOfxParamPropCacheInvalidation +.. property_link:: kOfxParamPropCacheInvalidation .. doxygendefine:: kOfxParamPropCanUndo +.. property_link:: kOfxParamPropCanUndo .. doxygendefine:: kOfxParamPropChoiceEnum +.. property_link:: kOfxParamPropChoiceEnum .. doxygendefine:: kOfxParamPropChoiceOption +.. property_link:: kOfxParamPropChoiceOption .. doxygendefine:: kOfxParamPropChoiceOrder +.. property_link:: kOfxParamPropChoiceOrder .. doxygendefine:: kOfxParamPropCustomInterpCallbackV1 +.. property_link:: kOfxParamPropCustomInterpCallbackV1 .. doxygendefine:: kOfxParamPropCustomValue +.. property_link:: kOfxParamPropCustomValue .. doxygendefine:: kOfxParamPropDataPtr +.. property_link:: kOfxParamPropDataPtr .. doxygendefine:: kOfxParamPropDefault +.. property_link:: kOfxParamPropDefault .. doxygendefine:: kOfxParamPropDefaultCoordinateSystem +.. property_link:: kOfxParamPropDefaultCoordinateSystem .. doxygendefine:: kOfxParamPropDigits +.. property_link:: kOfxParamPropDigits .. doxygendefine:: kOfxParamPropDimensionLabel +.. property_link:: kOfxParamPropDimensionLabel .. doxygendefine:: kOfxParamPropDisplayMax +.. property_link:: kOfxParamPropDisplayMax .. doxygendefine:: kOfxParamPropDisplayMin +.. property_link:: kOfxParamPropDisplayMin .. doxygendefine:: kOfxParamPropDoubleType +.. property_link:: kOfxParamPropDoubleType .. doxygendefine:: kOfxParamPropEnabled +.. property_link:: kOfxParamPropEnabled .. doxygendefine:: kOfxParamPropEvaluateOnChange +.. property_link:: kOfxParamPropEvaluateOnChange .. doxygendefine:: kOfxParamPropGroupOpen +.. property_link:: kOfxParamPropGroupOpen .. doxygendefine:: kOfxParamPropHasHostOverlayHandle +.. property_link:: kOfxParamPropHasHostOverlayHandle .. doxygendefine:: kOfxParamPropHint +.. property_link:: kOfxParamPropHint .. doxygendefine:: kOfxParamPropIncrement +.. property_link:: kOfxParamPropIncrement .. doxygendefine:: kOfxParamPropInteractMinimumSize +.. property_link:: kOfxParamPropInteractMinimumSize .. doxygendefine:: kOfxParamPropInteractPreferedSize +.. property_link:: kOfxParamPropInteractPreferedSize .. doxygendefine:: kOfxParamPropInteractSize +.. property_link:: kOfxParamPropInteractSize .. doxygendefine:: kOfxParamPropInteractSizeAspect +.. property_link:: kOfxParamPropInteractSizeAspect .. doxygendefine:: kOfxParamPropInteractV1 +.. property_link:: kOfxParamPropInteractV1 .. doxygendefine:: kOfxParamPropInterpolationAmount +.. property_link:: kOfxParamPropInterpolationAmount .. doxygendefine:: kOfxParamPropInterpolationTime +.. property_link:: kOfxParamPropInterpolationTime .. doxygendefine:: kOfxParamPropIsAnimating +.. property_link:: kOfxParamPropIsAnimating .. doxygendefine:: kOfxParamPropIsAutoKeying +.. property_link:: kOfxParamPropIsAutoKeying .. doxygendefine:: kOfxParamPropMax +.. property_link:: kOfxParamPropMax .. doxygendefine:: kOfxParamPropMin +.. property_link:: kOfxParamPropMin .. doxygendefine:: kOfxParamPropPageChild +.. property_link:: kOfxParamPropPageChild .. doxygendefine:: kOfxParamPropParametricDimension +.. property_link:: kOfxParamPropParametricDimension .. doxygendefine:: kOfxParamPropParametricInteractBackground +.. property_link:: kOfxParamPropParametricInteractBackground .. doxygendefine:: kOfxParamPropParametricRange +.. property_link:: kOfxParamPropParametricRange .. doxygendefine:: kOfxParamPropParametricUIColour +.. property_link:: kOfxParamPropParametricUIColour .. doxygendefine:: kOfxParamPropParent +.. property_link:: kOfxParamPropParent .. doxygendefine:: kOfxParamPropPersistant +.. property_link:: kOfxParamPropPersistant .. doxygendefine:: kOfxParamPropPluginMayWrite +.. property_link:: kOfxParamPropPluginMayWrite .. doxygendefine:: kOfxParamPropScriptName +.. property_link:: kOfxParamPropScriptName .. doxygendefine:: kOfxParamPropSecret +.. property_link:: kOfxParamPropSecret .. doxygendefine:: kOfxParamPropShowTimeMarker +.. property_link:: kOfxParamPropShowTimeMarker + +.. doxygendefine:: kOfxParamPropStringFilePathExists +.. property_link:: kOfxParamPropStringFilePathExists .. doxygendefine:: kOfxParamPropStringMode +.. property_link:: kOfxParamPropStringMode .. doxygendefine:: kOfxParamPropType +.. property_link:: kOfxParamPropType .. doxygendefine:: kOfxParamPropUseHostOverlayHandle +.. property_link:: kOfxParamPropUseHostOverlayHandle .. doxygendefine:: kOfxPluginPropFilePath +.. property_link:: kOfxPluginPropFilePath .. doxygendefine:: kOfxPluginPropParamPageOrder +.. property_link:: kOfxPluginPropParamPageOrder .. doxygendefine:: kOfxPropAPIVersion +.. property_link:: kOfxPropAPIVersion .. doxygendefine:: kOfxPropChangeReason +.. property_link:: kOfxPropChangeReason .. doxygendefine:: kOfxPropEffectInstance +.. property_link:: kOfxPropEffectInstance .. doxygendefine:: kOfxPropHostOSHandle +.. property_link:: kOfxPropHostOSHandle .. doxygendefine:: kOfxPropIcon +.. property_link:: kOfxPropIcon .. doxygendefine:: kOfxPropInstanceData +.. property_link:: kOfxPropInstanceData .. doxygendefine:: kOfxPropIsInteractive +.. property_link:: kOfxPropIsInteractive .. doxygendefine:: kOfxPropKeyString +.. property_link:: kOfxPropKeyString .. doxygendefine:: kOfxPropKeySym +.. property_link:: kOfxPropKeySym .. doxygendefine:: kOfxPropLabel +.. property_link:: kOfxPropLabel .. doxygendefine:: kOfxPropLongLabel +.. property_link:: kOfxPropLongLabel .. doxygendefine:: kOfxPropName +.. property_link:: kOfxPropName .. doxygendefine:: kOfxPropParamSetNeedsSyncing +.. property_link:: kOfxPropParamSetNeedsSyncing .. doxygendefine:: kOfxPropPluginDescription +.. property_link:: kOfxPropPluginDescription .. doxygendefine:: kOfxPropShortLabel +.. property_link:: kOfxPropShortLabel .. doxygendefine:: kOfxPropTime +.. property_link:: kOfxPropTime .. doxygendefine:: kOfxPropType +.. property_link:: kOfxPropType .. doxygendefine:: kOfxPropVersion +.. property_link:: kOfxPropVersion .. doxygendefine:: kOfxPropVersionLabel +.. property_link:: kOfxPropVersionLabel diff --git a/Documentation/sources/Reference/ofxPropertiesReferenceGenerated.rst b/Documentation/sources/Reference/ofxPropertiesReferenceGenerated.rst new file mode 100644 index 000000000..137542a4b --- /dev/null +++ b/Documentation/sources/Reference/ofxPropertiesReferenceGenerated.rst @@ -0,0 +1,2214 @@ +.. _propertiesReferenceGenerated: +Properties Reference (Generated) +============================== + +This reference is auto-generated from property definitions in the OpenFX source code. +It provides a structured view of properties with their types, dimensions, and where they are used. +For each property, a link to the detailed Doxygen documentation is provided when available. + + +Boolean Properties +------------------ + +.. _prop_OfxImageClipPropConnected: + +**OfxImageClipPropConnected** +^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageClipPropConnected` +- **Type**: bool +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ClipInstance ` +- **Doc**: For detailed doc, see :c:macro:`kOfxImageClipPropConnected`. + +.. _prop_OfxImageClipPropContinuousSamples: + +**OfxImageClipPropContinuousSamples** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageClipPropContinuousSamples` +- **Type**: bool +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ClipInstance ` +- **Doc**: For detailed doc, see :c:macro:`kOfxImageClipPropContinuousSamples`. + +.. _prop_OfxImageClipPropIsMask: + +**OfxImageClipPropIsMask** +^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageClipPropIsMask` +- **Type**: bool +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ClipDescriptor `, :ref:`ClipInstance ` +- **Doc**: For detailed doc, see :c:macro:`kOfxImageClipPropIsMask`. + +.. _prop_OfxImageClipPropOptional: + +**OfxImageClipPropOptional** +^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageClipPropOptional` +- **Type**: bool +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ClipDescriptor `, :ref:`ClipInstance ` +- **Doc**: For detailed doc, see :c:macro:`kOfxImageClipPropOptional`. + +.. _prop_OfxImageEffectFrameVarying: + +**OfxImageEffectFrameVarying** +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectFrameVarying` +- **Type**: bool +- **Dimension**: 1 +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectFrameVarying`. + +.. _prop_OfxImageEffectHostPropIsBackground: + +**OfxImageEffectHostPropIsBackground** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectHostPropIsBackground` +- **Type**: bool +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ImageEffectHost ` +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectHostPropIsBackground`. + +.. _prop_OfxImageEffectInstancePropSequentialRender: + +**OfxImageEffectInstancePropSequentialRender** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectInstancePropSequentialRender` +- **Type**: bool +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`EffectInstance `, :ref:`ImageEffectHost ` +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectInstancePropSequentialRender`. + +.. _prop_OfxImageEffectPluginPropFieldRenderTwiceAlways: + +**OfxImageEffectPluginPropFieldRenderTwiceAlways** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPluginPropFieldRenderTwiceAlways` +- **Type**: bool +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`EffectDescriptor ` +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPluginPropFieldRenderTwiceAlways`. + +.. _prop_OfxImageEffectPluginPropHostFrameThreading: + +**OfxImageEffectPluginPropHostFrameThreading** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPluginPropHostFrameThreading` +- **Type**: bool +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`EffectDescriptor ` +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPluginPropHostFrameThreading`. + +.. _prop_OfxImageEffectPluginPropSingleInstance: + +**OfxImageEffectPluginPropSingleInstance** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPluginPropSingleInstance` +- **Type**: bool +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`EffectDescriptor ` +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPluginPropSingleInstance`. + +.. _prop_OfxImageEffectPropCudaEnabled: + +**OfxImageEffectPropCudaEnabled** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropCudaEnabled` +- **Type**: bool +- **Dimension**: 1 +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropCudaEnabled`. + +.. _prop_OfxImageEffectPropInAnalysis: + +**OfxImageEffectPropInAnalysis** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropInAnalysis` +- **Type**: bool +- **Dimension**: 1 +- **Deprecated in**: version 1.4 +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropInAnalysis`. + +.. _prop_OfxImageEffectPropInteractiveRenderStatus: + +**OfxImageEffectPropInteractiveRenderStatus** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropInteractiveRenderStatus` +- **Type**: bool +- **Dimension**: 1 +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropInteractiveRenderStatus`. + +.. _prop_OfxImageEffectPropMetalEnabled: + +**OfxImageEffectPropMetalEnabled** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropMetalEnabled` +- **Type**: bool +- **Dimension**: 1 +- **Introduced in**: version 1.5 +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropMetalEnabled`. + +.. _prop_OfxImageEffectPropMultipleClipDepths: + +**OfxImageEffectPropMultipleClipDepths** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropSupportsMultipleClipDepths` +- **Type**: bool +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`EffectDescriptor `, :ref:`ImageEffectHost ` +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropSupportsMultipleClipDepths`. + +.. _prop_OfxImageEffectPropOpenCLEnabled: + +**OfxImageEffectPropOpenCLEnabled** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropOpenCLEnabled` +- **Type**: bool +- **Dimension**: 1 +- **Introduced in**: version 1.5 +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropOpenCLEnabled`. + +.. _prop_OfxImageEffectPropOpenGLEnabled: + +**OfxImageEffectPropOpenGLEnabled** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropOpenGLEnabled` +- **Type**: bool +- **Dimension**: 1 +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropOpenGLEnabled`. + +.. _prop_OfxImageEffectPropRenderQualityDraft: + +**OfxImageEffectPropRenderQualityDraft** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropRenderQualityDraft` +- **Type**: bool +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ImageEffectHost ` +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropRenderQualityDraft`. + +.. _prop_OfxImageEffectPropSequentialRenderStatus: + +**OfxImageEffectPropSequentialRenderStatus** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropSequentialRenderStatus` +- **Type**: bool +- **Dimension**: 1 +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropSequentialRenderStatus`. + +.. _prop_OfxImageEffectPropSetableFielding: + +**OfxImageEffectPropSetableFielding** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropSetableFielding` +- **Type**: bool +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ImageEffectHost ` +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropSetableFielding`. + +.. _prop_OfxImageEffectPropSetableFrameRate: + +**OfxImageEffectPropSetableFrameRate** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropSetableFrameRate` +- **Type**: bool +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ImageEffectHost ` +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropSetableFrameRate`. + +.. _prop_OfxImageEffectPropSupportsMultiResolution: + +**OfxImageEffectPropSupportsMultiResolution** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropSupportsMultiResolution` +- **Type**: bool +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`EffectDescriptor `, :ref:`ImageEffectHost ` +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropSupportsMultiResolution`. + +.. _prop_OfxImageEffectPropSupportsMultipleClipPARs: + +**OfxImageEffectPropSupportsMultipleClipPARs** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropSupportsMultipleClipPARs` +- **Type**: bool +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`EffectDescriptor `, :ref:`ImageEffectHost ` +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropSupportsMultipleClipPARs`. + +.. _prop_OfxImageEffectPropSupportsOverlays: + +**OfxImageEffectPropSupportsOverlays** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropSupportsOverlays` +- **Type**: bool +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ImageEffectHost ` +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropSupportsOverlays`. + +.. _prop_OfxImageEffectPropSupportsTiles: + +**OfxImageEffectPropSupportsTiles** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropSupportsTiles` +- **Type**: bool +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ClipDescriptor `, :ref:`ClipInstance `, :ref:`EffectDescriptor `, :ref:`EffectInstance `, :ref:`ImageEffectHost ` +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropSupportsTiles`. + +.. _prop_OfxImageEffectPropTemporalClipAccess: + +**OfxImageEffectPropTemporalClipAccess** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropTemporalClipAccess` +- **Type**: bool +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ClipDescriptor `, :ref:`ClipInstance `, :ref:`EffectDescriptor `, :ref:`ImageEffectHost ` +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropTemporalClipAccess`. + +.. _prop_OfxInteractPropHasAlpha: + +**OfxInteractPropHasAlpha** +^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxInteractPropHasAlpha` +- **Type**: bool +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`InteractDescriptor `, :ref:`InteractInstance ` +- **Doc**: For detailed doc, see :c:macro:`kOfxInteractPropHasAlpha`. + +.. _prop_OfxParamHostPropSupportsBooleanAnimation: + +**OfxParamHostPropSupportsBooleanAnimation** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamHostPropSupportsBooleanAnimation` +- **Type**: bool +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ImageEffectHost ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamHostPropSupportsBooleanAnimation`. + +.. _prop_OfxParamHostPropSupportsChoiceAnimation: + +**OfxParamHostPropSupportsChoiceAnimation** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamHostPropSupportsChoiceAnimation` +- **Type**: bool +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ImageEffectHost ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamHostPropSupportsChoiceAnimation`. + +.. _prop_OfxParamHostPropSupportsCustomAnimation: + +**OfxParamHostPropSupportsCustomAnimation** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamHostPropSupportsCustomAnimation` +- **Type**: bool +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ImageEffectHost ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamHostPropSupportsCustomAnimation`. + +.. _prop_OfxParamHostPropSupportsCustomInteract: + +**OfxParamHostPropSupportsCustomInteract** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamHostPropSupportsCustomInteract` +- **Type**: bool +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ImageEffectHost ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamHostPropSupportsCustomInteract`. + +.. _prop_OfxParamHostPropSupportsParametricAnimation: + +**OfxParamHostPropSupportsParametricAnimation** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamHostPropSupportsParametricAnimation` +- **Type**: bool +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ImageEffectHost ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamHostPropSupportsParametricAnimation`. + +.. _prop_OfxParamHostPropSupportsStrChoice: + +**OfxParamHostPropSupportsStrChoice** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamHostPropSupportsStrChoice` +- **Type**: bool +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ImageEffectHost ` +- **Introduced in**: version 1.5 +- **Doc**: For detailed doc, see :c:macro:`kOfxParamHostPropSupportsStrChoice`. + +.. _prop_OfxParamHostPropSupportsStrChoiceAnimation: + +**OfxParamHostPropSupportsStrChoiceAnimation** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamHostPropSupportsStrChoiceAnimation` +- **Type**: bool +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ImageEffectHost ` +- **Introduced in**: version 1.5 +- **Doc**: For detailed doc, see :c:macro:`kOfxParamHostPropSupportsStrChoiceAnimation`. + +.. _prop_OfxParamHostPropSupportsStringAnimation: + +**OfxParamHostPropSupportsStringAnimation** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamHostPropSupportsStringAnimation` +- **Type**: bool +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ImageEffectHost ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamHostPropSupportsStringAnimation`. + +.. _prop_OfxParamPropAnimates: + +**OfxParamPropAnimates** +^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropAnimates` +- **Type**: bool +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ParamDouble1D `, :ref:`ParamsByte `, :ref:`ParamsChoice `, :ref:`ParamsCustom `, :ref:`ParamsDouble2D3D `, :ref:`ParamsInt2D3D `, :ref:`ParamsNormalizedSpatial `, :ref:`ParamsParametric `, :ref:`ParamsParametric `, :ref:`ParamsStrChoice `, :ref:`ParamsString ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropAnimates`. + +.. _prop_OfxParamPropCanUndo: + +**OfxParamPropCanUndo** +^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropCanUndo` +- **Type**: bool +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ParamDouble1D `, :ref:`ParamsByte `, :ref:`ParamsChoice `, :ref:`ParamsCustom `, :ref:`ParamsDouble2D3D `, :ref:`ParamsInt2D3D `, :ref:`ParamsNormalizedSpatial `, :ref:`ParamsParametric `, :ref:`ParamsParametric `, :ref:`ParamsStrChoice `, :ref:`ParamsString ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropCanUndo`. + +.. _prop_OfxParamPropChoiceEnum: + +**OfxParamPropChoiceEnum** +^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropChoiceEnum` +- **Type**: bool +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ParamsStrChoice ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropChoiceEnum`. + +.. _prop_OfxParamPropEnabled: + +**OfxParamPropEnabled** +^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropEnabled` +- **Type**: bool +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ParamDouble1D `, :ref:`ParamsByte `, :ref:`ParamsChoice `, :ref:`ParamsCustom `, :ref:`ParamsDouble2D3D `, :ref:`ParamsGroup `, :ref:`ParamsInt2D3D `, :ref:`ParamsNormalizedSpatial `, :ref:`ParamsPage `, :ref:`ParamsParametric `, :ref:`ParamsStrChoice `, :ref:`ParamsString ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropEnabled`. + +.. _prop_OfxParamPropEvaluateOnChange: + +**OfxParamPropEvaluateOnChange** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropEvaluateOnChange` +- **Type**: bool +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ParamDouble1D `, :ref:`ParamsByte `, :ref:`ParamsChoice `, :ref:`ParamsCustom `, :ref:`ParamsDouble2D3D `, :ref:`ParamsInt2D3D `, :ref:`ParamsNormalizedSpatial `, :ref:`ParamsParametric `, :ref:`ParamsParametric `, :ref:`ParamsStrChoice `, :ref:`ParamsString ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropEvaluateOnChange`. + +.. _prop_OfxParamPropGroupOpen: + +**OfxParamPropGroupOpen** +^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropGroupOpen` +- **Type**: bool +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ParamsGroup ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropGroupOpen`. + +.. _prop_OfxParamPropHasHostOverlayHandle: + +**OfxParamPropHasHostOverlayHandle** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropHasHostOverlayHandle` +- **Type**: bool +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ParamDouble1D `, :ref:`ParamsByte `, :ref:`ParamsChoice `, :ref:`ParamsCustom `, :ref:`ParamsDouble2D3D `, :ref:`ParamsInt2D3D `, :ref:`ParamsNormalizedSpatial `, :ref:`ParamsParametric `, :ref:`ParamsStrChoice `, :ref:`ParamsString ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropHasHostOverlayHandle`. + +.. _prop_OfxParamPropIsAnimating: + +**OfxParamPropIsAnimating** +^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropIsAnimating` +- **Type**: bool +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ParamDouble1D `, :ref:`ParamsByte `, :ref:`ParamsChoice `, :ref:`ParamsCustom `, :ref:`ParamsDouble2D3D `, :ref:`ParamsInt2D3D `, :ref:`ParamsNormalizedSpatial `, :ref:`ParamsParametric `, :ref:`ParamsParametric `, :ref:`ParamsStrChoice `, :ref:`ParamsString ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropIsAnimating`. + +.. _prop_OfxParamPropIsAutoKeying: + +**OfxParamPropIsAutoKeying** +^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropIsAutoKeying` +- **Type**: bool +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ParamDouble1D `, :ref:`ParamsByte `, :ref:`ParamsChoice `, :ref:`ParamsCustom `, :ref:`ParamsDouble2D3D `, :ref:`ParamsInt2D3D `, :ref:`ParamsNormalizedSpatial `, :ref:`ParamsParametric `, :ref:`ParamsParametric `, :ref:`ParamsStrChoice `, :ref:`ParamsString ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropIsAutoKeying`. + +.. _prop_OfxParamPropPersistant: + +**OfxParamPropPersistant** +^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropPersistant` +- **Type**: bool +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ParamDouble1D `, :ref:`ParamsByte `, :ref:`ParamsChoice `, :ref:`ParamsCustom `, :ref:`ParamsDouble2D3D `, :ref:`ParamsInt2D3D `, :ref:`ParamsNormalizedSpatial `, :ref:`ParamsParametric `, :ref:`ParamsParametric `, :ref:`ParamsStrChoice `, :ref:`ParamsString ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropPersistant`. + +.. _prop_OfxParamPropPluginMayWrite: + +**OfxParamPropPluginMayWrite** +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropPluginMayWrite` +- **Type**: bool +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ParamDouble1D `, :ref:`ParamsByte `, :ref:`ParamsChoice `, :ref:`ParamsCustom `, :ref:`ParamsDouble2D3D `, :ref:`ParamsInt2D3D `, :ref:`ParamsNormalizedSpatial `, :ref:`ParamsParametric `, :ref:`ParamsParametric `, :ref:`ParamsStrChoice `, :ref:`ParamsString ` +- **Deprecated in**: version 1.4 +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropPluginMayWrite`. + +.. _prop_OfxParamPropSecret: + +**OfxParamPropSecret** +^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropSecret` +- **Type**: bool +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ParamDouble1D `, :ref:`ParamsByte `, :ref:`ParamsChoice `, :ref:`ParamsCustom `, :ref:`ParamsDouble2D3D `, :ref:`ParamsGroup `, :ref:`ParamsInt2D3D `, :ref:`ParamsNormalizedSpatial `, :ref:`ParamsPage `, :ref:`ParamsParametric `, :ref:`ParamsStrChoice `, :ref:`ParamsString ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropSecret`. + +.. _prop_OfxParamPropShowTimeMarker: + +**OfxParamPropShowTimeMarker** +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropShowTimeMarker` +- **Type**: bool +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ParamDouble1D ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropShowTimeMarker`. + +.. _prop_OfxParamPropStringFilePathExists: + +**OfxParamPropStringFilePathExists** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropStringFilePathExists` +- **Type**: bool +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ParamsString ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropStringFilePathExists`. + +.. _prop_OfxPropIsInteractive: + +**OfxPropIsInteractive** +^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxPropIsInteractive` +- **Type**: bool +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`EffectInstance ` +- **Doc**: For detailed doc, see :c:macro:`kOfxPropIsInteractive`. + +.. _prop_OfxPropParamSetNeedsSyncing: + +**OfxPropParamSetNeedsSyncing** +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxPropParamSetNeedsSyncing` +- **Type**: bool +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ParameterSet ` +- **Doc**: For detailed doc, see :c:macro:`kOfxPropParamSetNeedsSyncing`. + +.. _prop_kOfxParamPropUseHostOverlayHandle: + +**kOfxParamPropUseHostOverlayHandle** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropUseHostOverlayHandle` +- **Type**: bool +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ParamDouble1D `, :ref:`ParamsByte `, :ref:`ParamsChoice `, :ref:`ParamsCustom `, :ref:`ParamsDouble2D3D `, :ref:`ParamsInt2D3D `, :ref:`ParamsNormalizedSpatial `, :ref:`ParamsParametric `, :ref:`ParamsStrChoice `, :ref:`ParamsString ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropUseHostOverlayHandle`. + + +Double Properties +----------------- + +.. _prop_OfxImageEffectInstancePropEffectDuration: + +**OfxImageEffectInstancePropEffectDuration** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectInstancePropEffectDuration` +- **Type**: double +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`EffectInstance ` +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectInstancePropEffectDuration`. + +.. _prop_OfxImageEffectPropFrameRange: + +**OfxImageEffectPropFrameRange** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropFrameRange` +- **Type**: double +- **Dimension**: 2 +- **Used in Property Sets**: :ref:`ClipInstance ` +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropFrameRange`. + +.. _prop_OfxImageEffectPropFrameRate: + +**OfxImageEffectPropFrameRate** +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropFrameRate` +- **Type**: double +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ClipInstance `, :ref:`EffectInstance ` +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropFrameRate`. + +.. _prop_OfxImageEffectPropFrameStep: + +**OfxImageEffectPropFrameStep** +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropFrameStep` +- **Type**: double +- **Dimension**: 1 +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropFrameStep`. + +.. _prop_OfxImageEffectPropPixelAspectRatio: + +**OfxImageEffectPropPixelAspectRatio** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropProjectPixelAspectRatio` +- **Type**: double +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`EffectInstance ` +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropProjectPixelAspectRatio`. + +.. _prop_OfxImageEffectPropProjectExtent: + +**OfxImageEffectPropProjectExtent** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropProjectExtent` +- **Type**: double +- **Dimension**: 2 +- **Used in Property Sets**: :ref:`EffectInstance ` +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropProjectExtent`. + +.. _prop_OfxImageEffectPropProjectOffset: + +**OfxImageEffectPropProjectOffset** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropProjectOffset` +- **Type**: double +- **Dimension**: 2 +- **Used in Property Sets**: :ref:`EffectInstance ` +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropProjectOffset`. + +.. _prop_OfxImageEffectPropProjectSize: + +**OfxImageEffectPropProjectSize** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropProjectSize` +- **Type**: double +- **Dimension**: 2 +- **Used in Property Sets**: :ref:`EffectInstance ` +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropProjectSize`. + +.. _prop_OfxImageEffectPropRegionOfDefinition: + +**OfxImageEffectPropRegionOfDefinition** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropRegionOfDefinition` +- **Type**: double +- **Dimension**: 4 +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropRegionOfDefinition`. + +.. _prop_OfxImageEffectPropRegionOfInterest: + +**OfxImageEffectPropRegionOfInterest** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropRegionOfInterest` +- **Type**: double +- **Dimension**: 4 +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropRegionOfInterest`. + +.. _prop_OfxImageEffectPropRenderScale: + +**OfxImageEffectPropRenderScale** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropRenderScale` +- **Type**: double +- **Dimension**: 2 +- **Used in Property Sets**: :ref:`Image ` +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropRenderScale`. + +.. _prop_OfxImageEffectPropUnmappedFrameRange: + +**OfxImageEffectPropUnmappedFrameRange** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropUnmappedFrameRange` +- **Type**: double +- **Dimension**: 2 +- **Used in Property Sets**: :ref:`ClipInstance ` +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropUnmappedFrameRange`. + +.. _prop_OfxImageEffectPropUnmappedFrameRate: + +**OfxImageEffectPropUnmappedFrameRate** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropUnmappedFrameRate` +- **Type**: double +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ClipInstance ` +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropUnmappedFrameRate`. + +.. _prop_OfxImagePropPixelAspectRatio: + +**OfxImagePropPixelAspectRatio** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImagePropPixelAspectRatio` +- **Type**: double +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ClipInstance `, :ref:`Image ` +- **Doc**: For detailed doc, see :c:macro:`kOfxImagePropPixelAspectRatio`. + +.. _prop_OfxInteractPropBackgroundColour: + +**OfxInteractPropBackgroundColour** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxInteractPropBackgroundColour` +- **Type**: double +- **Dimension**: 3 +- **Used in Property Sets**: :ref:`InteractInstance ` +- **Doc**: For detailed doc, see :c:macro:`kOfxInteractPropBackgroundColour`. + +.. _prop_OfxInteractPropPenPosition: + +**OfxInteractPropPenPosition** +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxInteractPropPenPosition` +- **Type**: double +- **Dimension**: 2 +- **Doc**: For detailed doc, see :c:macro:`kOfxInteractPropPenPosition`. + +.. _prop_OfxInteractPropPenPressure: + +**OfxInteractPropPenPressure** +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxInteractPropPenPressure` +- **Type**: double +- **Dimension**: 1 +- **Doc**: For detailed doc, see :c:macro:`kOfxInteractPropPenPressure`. + +.. _prop_OfxInteractPropPixelScale: + +**OfxInteractPropPixelScale** +^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxInteractPropPixelScale` +- **Type**: double +- **Dimension**: 2 +- **Used in Property Sets**: :ref:`InteractInstance ` +- **Doc**: For detailed doc, see :c:macro:`kOfxInteractPropPixelScale`. + +.. _prop_OfxInteractPropSuggestedColour: + +**OfxInteractPropSuggestedColour** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxInteractPropSuggestedColour` +- **Type**: double +- **Dimension**: 3 +- **Used in Property Sets**: :ref:`InteractInstance ` +- **Doc**: For detailed doc, see :c:macro:`kOfxInteractPropSuggestedColour`. + +.. _prop_OfxParamPropDefault: + +**OfxParamPropDefault** +^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropDefault` +- **Type**: Multiple types: int, double, string, pointer +- **Dimension**: Variable (0 or more) +- **Used in Property Sets**: :ref:`ParamDouble1D `, :ref:`ParamsByte `, :ref:`ParamsChoice `, :ref:`ParamsCustom `, :ref:`ParamsDouble2D3D `, :ref:`ParamsInt2D3D `, :ref:`ParamsNormalizedSpatial `, :ref:`ParamsParametric `, :ref:`ParamsStrChoice `, :ref:`ParamsString ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropDefault`. + +.. _prop_OfxParamPropDisplayMax: + +**OfxParamPropDisplayMax** +^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropDisplayMax` +- **Type**: Multiple types: int, double +- **Dimension**: Variable (0 or more) +- **Used in Property Sets**: :ref:`ParamDouble1D `, :ref:`ParamsByte `, :ref:`ParamsDouble2D3D `, :ref:`ParamsInt2D3D `, :ref:`ParamsNormalizedSpatial `, :ref:`ParamsString ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropDisplayMax`. + +.. _prop_OfxParamPropDisplayMin: + +**OfxParamPropDisplayMin** +^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropDisplayMin` +- **Type**: Multiple types: int, double +- **Dimension**: Variable (0 or more) +- **Used in Property Sets**: :ref:`ParamDouble1D `, :ref:`ParamsByte `, :ref:`ParamsDouble2D3D `, :ref:`ParamsInt2D3D `, :ref:`ParamsNormalizedSpatial `, :ref:`ParamsString ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropDisplayMin`. + +.. _prop_OfxParamPropIncrement: + +**OfxParamPropIncrement** +^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropIncrement` +- **Type**: double +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ParamDouble1D `, :ref:`ParamsDouble2D3D `, :ref:`ParamsNormalizedSpatial ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropIncrement`. + +.. _prop_OfxParamPropInteractMinimumSize: + +**OfxParamPropInteractMinimumSize** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropInteractMinimumSize` +- **Type**: double +- **Dimension**: 2 +- **Used in Property Sets**: :ref:`ParamDouble1D `, :ref:`ParamsByte `, :ref:`ParamsChoice `, :ref:`ParamsCustom `, :ref:`ParamsDouble2D3D `, :ref:`ParamsInt2D3D `, :ref:`ParamsNormalizedSpatial `, :ref:`ParamsParametric `, :ref:`ParamsStrChoice `, :ref:`ParamsString ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropInteractMinimumSize`. + +.. _prop_OfxParamPropInteractSize: + +**OfxParamPropInteractSize** +^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropInteractSize` +- **Type**: double +- **Dimension**: 2 +- **Used in Property Sets**: :ref:`ParamDouble1D `, :ref:`ParamsByte `, :ref:`ParamsChoice `, :ref:`ParamsCustom `, :ref:`ParamsDouble2D3D `, :ref:`ParamsInt2D3D `, :ref:`ParamsNormalizedSpatial `, :ref:`ParamsParametric `, :ref:`ParamsStrChoice `, :ref:`ParamsString ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropInteractSize`. + +.. _prop_OfxParamPropInteractSizeAspect: + +**OfxParamPropInteractSizeAspect** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropInteractSizeAspect` +- **Type**: double +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ParamDouble1D `, :ref:`ParamsByte `, :ref:`ParamsChoice `, :ref:`ParamsCustom `, :ref:`ParamsDouble2D3D `, :ref:`ParamsInt2D3D `, :ref:`ParamsNormalizedSpatial `, :ref:`ParamsParametric `, :ref:`ParamsStrChoice `, :ref:`ParamsString ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropInteractSizeAspect`. + +.. _prop_OfxParamPropInterpolationAmount: + +**OfxParamPropInterpolationAmount** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropInterpolationAmount` +- **Type**: double +- **Dimension**: 1 +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropInterpolationAmount`. + +.. _prop_OfxParamPropInterpolationTime: + +**OfxParamPropInterpolationTime** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropInterpolationTime` +- **Type**: double +- **Dimension**: 2 +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropInterpolationTime`. + +.. _prop_OfxParamPropMax: + +**OfxParamPropMax** +^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropMax` +- **Type**: Multiple types: int, double +- **Dimension**: Variable (0 or more) +- **Used in Property Sets**: :ref:`ParamDouble1D `, :ref:`ParamsByte `, :ref:`ParamsDouble2D3D `, :ref:`ParamsInt2D3D `, :ref:`ParamsNormalizedSpatial `, :ref:`ParamsString ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropMax`. + +.. _prop_OfxParamPropMin: + +**OfxParamPropMin** +^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropMin` +- **Type**: Multiple types: int, double +- **Dimension**: Variable (0 or more) +- **Used in Property Sets**: :ref:`ParamDouble1D `, :ref:`ParamsByte `, :ref:`ParamsDouble2D3D `, :ref:`ParamsInt2D3D `, :ref:`ParamsNormalizedSpatial `, :ref:`ParamsString ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropMin`. + +.. _prop_OfxParamPropParametricRange: + +**OfxParamPropParametricRange** +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropParametricRange` +- **Type**: double +- **Dimension**: 2 +- **Used in Property Sets**: :ref:`ParamsParametric ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropParametricRange`. + +.. _prop_OfxParamPropParametricUIColour: + +**OfxParamPropParametricUIColour** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropParametricUIColour` +- **Type**: double +- **Dimension**: Variable (0 or more) +- **Used in Property Sets**: :ref:`ParamsParametric ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropParametricUIColour`. + +.. _prop_OfxPropTime: + +**OfxPropTime** +^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxPropTime` +- **Type**: double +- **Dimension**: 1 +- **Doc**: For detailed doc, see :c:macro:`kOfxPropTime`. + + +Enumeration Properties +---------------------- + +.. _prop_OfxImageClipPropFieldExtraction: + +**OfxImageClipPropFieldExtraction** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageClipPropFieldExtraction` +- **Type**: enum +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ClipDescriptor `, :ref:`ClipInstance ` +- **Valid Values**: + - ``OfxImageFieldNone`` + - ``OfxImageFieldLower`` + - ``OfxImageFieldUpper`` + - ``OfxImageFieldBoth`` + - ``OfxImageFieldSingle`` + - ``OfxImageFieldDoubled`` +- **Doc**: For detailed doc, see :c:macro:`kOfxImageClipPropFieldExtraction`. + +.. _prop_OfxImageClipPropFieldOrder: + +**OfxImageClipPropFieldOrder** +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageClipPropFieldOrder` +- **Type**: enum +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ClipInstance ` +- **Valid Values**: + - ``OfxImageFieldNone`` + - ``OfxImageFieldLower`` + - ``OfxImageFieldUpper`` +- **Doc**: For detailed doc, see :c:macro:`kOfxImageClipPropFieldOrder`. + +.. _prop_OfxImageClipPropUnmappedComponents: + +**OfxImageClipPropUnmappedComponents** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageClipPropUnmappedComponents` +- **Type**: enum +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ClipInstance ` +- **Valid Values**: + - ``OfxImageComponentNone`` + - ``OfxImageComponentRGBA`` + - ``OfxImageComponentRGB`` + - ``OfxImageComponentAlpha`` +- **Doc**: For detailed doc, see :c:macro:`kOfxImageClipPropUnmappedComponents`. + +.. _prop_OfxImageClipPropUnmappedPixelDepth: + +**OfxImageClipPropUnmappedPixelDepth** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageClipPropUnmappedPixelDepth` +- **Type**: enum +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ClipInstance ` +- **Valid Values**: + - ``OfxBitDepthNone`` + - ``OfxBitDepthByte`` + - ``OfxBitDepthShort`` + - ``OfxBitDepthHalf`` + - ``OfxBitDepthFloat`` +- **Doc**: For detailed doc, see :c:macro:`kOfxImageClipPropUnmappedPixelDepth`. + +.. _prop_OfxImageEffectHostPropNativeOrigin: + +**OfxImageEffectHostPropNativeOrigin** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectHostPropNativeOrigin` +- **Type**: enum +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ImageEffectHost ` +- **Valid Values**: + - ``OfxImageEffectHostPropNativeOriginBottomLeft`` + - ``OfxImageEffectHostPropNativeOriginTopLeft`` + - ``OfxImageEffectHostPropNativeOriginCenter`` +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectHostPropNativeOrigin`. + +.. _prop_OfxImageEffectPluginRenderThreadSafety: + +**OfxImageEffectPluginRenderThreadSafety** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPluginRenderThreadSafety` +- **Type**: enum +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`EffectDescriptor `, :ref:`EffectDescriptor ` +- **Valid Values**: + - ``OfxImageEffectRenderUnsafe`` + - ``OfxImageEffectRenderInstanceSafe`` + - ``OfxImageEffectRenderFullySafe`` +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPluginRenderThreadSafety`. + +.. _prop_OfxImageEffectPropColourManagementStyle: + +**OfxImageEffectPropColourManagementStyle** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropColourManagementStyle` +- **Type**: enum +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`EffectDescriptor `, :ref:`EffectInstance `, :ref:`ImageEffectHost ` +- **Valid Values**: + - ``OfxImageEffectPropColourManagementNone`` + - ``OfxImageEffectPropColourManagementBasic`` + - ``OfxImageEffectPropColourManagementCore`` + - ``OfxImageEffectPropColourManagementFull`` + - ``OfxImageEffectPropColourManagementOCIO`` +- **Introduced in**: version 1.5 +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropColourManagementStyle`. + +.. _prop_OfxImageEffectPropComponents: + +**OfxImageEffectPropComponents** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropComponents` +- **Type**: enum +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ClipInstance `, :ref:`Image ` +- **Valid Values**: + - ``OfxImageComponentNone`` + - ``OfxImageComponentRGBA`` + - ``OfxImageComponentRGB`` + - ``OfxImageComponentAlpha`` +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropComponents`. + +.. _prop_OfxImageEffectPropContext: + +**OfxImageEffectPropContext** +^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropContext` +- **Type**: enum +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`EffectInstance ` +- **Valid Values**: + - ``OfxImageEffectContextGenerator`` + - ``OfxImageEffectContextFilter`` + - ``OfxImageEffectContextTransition`` + - ``OfxImageEffectContextPaint`` + - ``OfxImageEffectContextGeneral`` + - ``OfxImageEffectContextRetimer`` +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropContext`. + +.. _prop_OfxImageEffectPropCudaRenderSupported: + +**OfxImageEffectPropCudaRenderSupported** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropCudaRenderSupported` +- **Type**: enum +- **Dimension**: 1 +- **Valid Values**: + - ``false`` + - ``true`` + - ``needed`` +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropCudaRenderSupported`. + +.. _prop_OfxImageEffectPropCudaStreamSupported: + +**OfxImageEffectPropCudaStreamSupported** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropCudaStreamSupported` +- **Type**: enum +- **Dimension**: 1 +- **Valid Values**: + - ``false`` + - ``true`` + - ``needed`` +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropCudaStreamSupported`. + +.. _prop_OfxImageEffectPropFieldToRender: + +**OfxImageEffectPropFieldToRender** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropFieldToRender` +- **Type**: enum +- **Dimension**: 1 +- **Valid Values**: + - ``OfxImageFieldNone`` + - ``OfxImageFieldBoth`` + - ``OfxImageFieldLower`` + - ``OfxImageFieldUpper`` +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropFieldToRender`. + +.. _prop_OfxImageEffectPropMetalRenderSupported: + +**OfxImageEffectPropMetalRenderSupported** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropMetalRenderSupported` +- **Type**: enum +- **Dimension**: 1 +- **Valid Values**: + - ``false`` + - ``true`` + - ``needed`` +- **Introduced in**: version 1.5 +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropMetalRenderSupported`. + +.. _prop_OfxImageEffectPropOpenCLRenderSupported: + +**OfxImageEffectPropOpenCLRenderSupported** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropOpenCLRenderSupported` +- **Type**: enum +- **Dimension**: 1 +- **Valid Values**: + - ``false`` + - ``true`` + - ``needed`` +- **Introduced in**: version 1.5 +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropOpenCLRenderSupported`. + +.. _prop_OfxImageEffectPropOpenCLSupported: + +**OfxImageEffectPropOpenCLSupported** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropOpenCLSupported` +- **Type**: enum +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`EffectDescriptor `, :ref:`ImageEffectHost ` +- **Valid Values**: + - ``false`` + - ``true`` +- **Introduced in**: version 1.5 +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropOpenCLSupported`. + +.. _prop_OfxImageEffectPropOpenGLRenderSupported: + +**OfxImageEffectPropOpenGLRenderSupported** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropOpenGLRenderSupported` +- **Type**: enum +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`EffectDescriptor `, :ref:`EffectInstance `, :ref:`ImageEffectHost ` +- **Valid Values**: + - ``false`` + - ``true`` + - ``needed`` +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropOpenGLRenderSupported`. + +.. _prop_OfxImageEffectPropPixelDepth: + +**OfxImageEffectPropPixelDepth** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropPixelDepth` +- **Type**: enum +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ClipInstance `, :ref:`Image ` +- **Valid Values**: + - ``OfxBitDepthNone`` + - ``OfxBitDepthByte`` + - ``OfxBitDepthShort`` + - ``OfxBitDepthHalf`` + - ``OfxBitDepthFloat`` +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropPixelDepth`. + +.. _prop_OfxImageEffectPropPreMultiplication: + +**OfxImageEffectPropPreMultiplication** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropPreMultiplication` +- **Type**: enum +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ClipInstance `, :ref:`Image ` +- **Valid Values**: + - ``OfxImageOpaque`` + - ``OfxImagePreMultiplied`` + - ``OfxImageUnPreMultiplied`` +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropPreMultiplication`. + +.. _prop_OfxImageEffectPropSupportedComponents: + +**OfxImageEffectPropSupportedComponents** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropSupportedComponents` +- **Type**: enum +- **Dimension**: Variable (0 or more) +- **Used in Property Sets**: :ref:`ClipDescriptor `, :ref:`ClipInstance `, :ref:`ImageEffectHost ` +- **Valid Values**: + - ``OfxImageComponentNone`` + - ``OfxImageComponentRGBA`` + - ``OfxImageComponentRGB`` + - ``OfxImageComponentAlpha`` +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropSupportedComponents`. + +.. _prop_OfxImageEffectPropSupportedContexts: + +**OfxImageEffectPropSupportedContexts** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropSupportedContexts` +- **Type**: enum +- **Dimension**: Variable (0 or more) +- **Used in Property Sets**: :ref:`EffectDescriptor `, :ref:`ImageEffectHost ` +- **Valid Values**: + - ``OfxImageEffectContextGenerator`` + - ``OfxImageEffectContextFilter`` + - ``OfxImageEffectContextTransition`` + - ``OfxImageEffectContextPaint`` + - ``OfxImageEffectContextGeneral`` + - ``OfxImageEffectContextRetimer`` +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropSupportedContexts`. + +.. _prop_OfxImageEffectPropSupportedPixelDepths: + +**OfxImageEffectPropSupportedPixelDepths** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropSupportedPixelDepths` +- **Type**: enum +- **Dimension**: Variable (0 or more) +- **Used in Property Sets**: :ref:`EffectDescriptor ` +- **Valid Values**: + - ``OfxBitDepthNone`` + - ``OfxBitDepthByte`` + - ``OfxBitDepthShort`` + - ``OfxBitDepthHalf`` + - ``OfxBitDepthFloat`` +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropSupportedPixelDepths`. + +.. _prop_OfxImagePropField: + +**OfxImagePropField** +^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImagePropField` +- **Type**: enum +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`Image ` +- **Valid Values**: + - ``OfxImageFieldNone`` + - ``OfxImageFieldBoth`` + - ``OfxImageFieldLower`` + - ``OfxImageFieldUpper`` +- **Doc**: For detailed doc, see :c:macro:`kOfxImagePropField`. + +.. _prop_OfxOpenGLPropPixelDepth: + +**OfxOpenGLPropPixelDepth** +^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxOpenGLPropPixelDepth` +- **Type**: enum +- **Dimension**: Variable (0 or more) +- **Used in Property Sets**: :ref:`EffectDescriptor ` +- **Valid Values**: + - ``OfxBitDepthNone`` + - ``OfxBitDepthByte`` + - ``OfxBitDepthShort`` + - ``OfxBitDepthHalf`` + - ``OfxBitDepthFloat`` +- **Doc**: For detailed doc, see :c:macro:`kOfxOpenGLPropPixelDepth`. + +.. _prop_OfxParamPropCacheInvalidation: + +**OfxParamPropCacheInvalidation** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropCacheInvalidation` +- **Type**: enum +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ParamDouble1D `, :ref:`ParamsByte `, :ref:`ParamsChoice `, :ref:`ParamsCustom `, :ref:`ParamsDouble2D3D `, :ref:`ParamsInt2D3D `, :ref:`ParamsNormalizedSpatial `, :ref:`ParamsParametric `, :ref:`ParamsParametric `, :ref:`ParamsStrChoice `, :ref:`ParamsString ` +- **Valid Values**: + - ``OfxParamInvalidateValueChange`` + - ``OfxParamInvalidateValueChangeToEnd`` + - ``OfxParamInvalidateAll`` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropCacheInvalidation`. + +.. _prop_OfxParamPropDefaultCoordinateSystem: + +**OfxParamPropDefaultCoordinateSystem** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropDefaultCoordinateSystem` +- **Type**: enum +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ParamsNormalizedSpatial ` +- **Valid Values**: + - ``OfxParamCoordinatesCanonical`` + - ``OfxParamCoordinatesNormalised`` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropDefaultCoordinateSystem`. + +.. _prop_OfxParamPropDoubleType: + +**OfxParamPropDoubleType** +^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropDoubleType` +- **Type**: enum +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ParamDouble1D `, :ref:`ParamsDouble2D3D ` +- **Valid Values**: + - ``OfxParamDoubleTypePlain`` + - ``OfxParamDoubleTypeAngle`` + - ``OfxParamDoubleTypeScale`` + - ``OfxParamDoubleTypeTime`` + - ``OfxParamDoubleTypeAbsoluteTime`` + - ``OfxParamDoubleTypeX`` + - ``OfxParamDoubleTypeXAbsolute`` + - ``OfxParamDoubleTypeY`` + - ``OfxParamDoubleTypeYAbsolute`` + - ``OfxParamDoubleTypeXY`` + - ``OfxParamDoubleTypeXYAbsolute`` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropDoubleType`. + +.. _prop_OfxParamPropStringMode: + +**OfxParamPropStringMode** +^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropStringMode` +- **Type**: enum +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ParamsString ` +- **Valid Values**: + - ``OfxParamStringIsSingleLine`` + - ``OfxParamStringIsMultiLine`` + - ``OfxParamStringIsFilePath`` + - ``OfxParamStringIsDirectoryPath`` + - ``OfxParamStringIsLabel`` + - ``OfxParamStringIsRichTextFormat`` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropStringMode`. + +.. _prop_OfxPluginPropFilePath: + +**OfxPluginPropFilePath** +^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxPluginPropFilePath` +- **Type**: enum +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`EffectDescriptor ` +- **Valid Values**: + - ``false`` + - ``true`` + - ``needed`` +- **Doc**: For detailed doc, see :c:macro:`kOfxPluginPropFilePath`. + +.. _prop_OfxPropChangeReason: + +**OfxPropChangeReason** +^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxPropChangeReason` +- **Type**: enum +- **Dimension**: 1 +- **Valid Values**: + - ``OfxChangeUserEdited`` + - ``OfxChangePluginEdited`` + - ``OfxChangeTime`` +- **Doc**: For detailed doc, see :c:macro:`kOfxPropChangeReason`. + + +Integer Properties +------------------ + +.. _prop_OfxImageEffectPropOpenGLTextureIndex: + +**OfxImageEffectPropOpenGLTextureIndex** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropOpenGLTextureIndex` +- **Type**: int +- **Dimension**: 1 +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropOpenGLTextureIndex`. + +.. _prop_OfxImageEffectPropOpenGLTextureTarget: + +**OfxImageEffectPropOpenGLTextureTarget** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropOpenGLTextureTarget` +- **Type**: int +- **Dimension**: 1 +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropOpenGLTextureTarget`. + +.. _prop_OfxImageEffectPropRenderWindow: + +**OfxImageEffectPropRenderWindow** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropRenderWindow` +- **Type**: int +- **Dimension**: 4 +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropRenderWindow`. + +.. _prop_OfxImagePropBounds: + +**OfxImagePropBounds** +^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImagePropBounds` +- **Type**: int +- **Dimension**: 4 +- **Used in Property Sets**: :ref:`Image ` +- **Doc**: For detailed doc, see :c:macro:`kOfxImagePropBounds`. + +.. _prop_OfxImagePropRegionOfDefinition: + +**OfxImagePropRegionOfDefinition** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImagePropRegionOfDefinition` +- **Type**: int +- **Dimension**: 4 +- **Used in Property Sets**: :ref:`Image ` +- **Doc**: For detailed doc, see :c:macro:`kOfxImagePropRegionOfDefinition`. + +.. _prop_OfxImagePropRowBytes: + +**OfxImagePropRowBytes** +^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImagePropRowBytes` +- **Type**: int +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`Image ` +- **Doc**: For detailed doc, see :c:macro:`kOfxImagePropRowBytes`. + +.. _prop_OfxInteractPropBitDepth: + +**OfxInteractPropBitDepth** +^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxInteractPropBitDepth` +- **Type**: int +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`InteractDescriptor `, :ref:`InteractInstance ` +- **Doc**: For detailed doc, see :c:macro:`kOfxInteractPropBitDepth`. + +.. _prop_OfxInteractPropPenViewportPosition: + +**OfxInteractPropPenViewportPosition** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxInteractPropPenViewportPosition` +- **Type**: int +- **Dimension**: 2 +- **Doc**: For detailed doc, see :c:macro:`kOfxInteractPropPenViewportPosition`. + +.. _prop_OfxInteractPropViewport: + +**OfxInteractPropViewport** +^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxInteractPropViewportSize` +- **Type**: int +- **Dimension**: 2 +- **Deprecated in**: version 1.3 +- **Doc**: For detailed doc, see :c:macro:`kOfxInteractPropViewportSize`. + +.. _prop_OfxParamHostPropMaxPages: + +**OfxParamHostPropMaxPages** +^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamHostPropMaxPages` +- **Type**: int +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ImageEffectHost ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamHostPropMaxPages`. + +.. _prop_OfxParamHostPropMaxParameters: + +**OfxParamHostPropMaxParameters** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamHostPropMaxParameters` +- **Type**: int +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ImageEffectHost ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamHostPropMaxParameters`. + +.. _prop_OfxParamHostPropPageRowColumnCount: + +**OfxParamHostPropPageRowColumnCount** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamHostPropPageRowColumnCount` +- **Type**: int +- **Dimension**: 2 +- **Used in Property Sets**: :ref:`ImageEffectHost ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamHostPropPageRowColumnCount`. + +.. _prop_OfxParamPropChoiceOrder: + +**OfxParamPropChoiceOrder** +^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropChoiceOrder` +- **Type**: int +- **Dimension**: Variable (0 or more) +- **Used in Property Sets**: :ref:`ParamsChoice ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropChoiceOrder`. + +.. _prop_OfxParamPropDefault: + +**OfxParamPropDefault** +^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropDefault` +- **Type**: Multiple types: int, double, string, pointer +- **Dimension**: Variable (0 or more) +- **Used in Property Sets**: :ref:`ParamDouble1D `, :ref:`ParamsByte `, :ref:`ParamsChoice `, :ref:`ParamsCustom `, :ref:`ParamsDouble2D3D `, :ref:`ParamsInt2D3D `, :ref:`ParamsNormalizedSpatial `, :ref:`ParamsParametric `, :ref:`ParamsStrChoice `, :ref:`ParamsString ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropDefault`. + +.. _prop_OfxParamPropDigits: + +**OfxParamPropDigits** +^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropDigits` +- **Type**: int +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ParamDouble1D `, :ref:`ParamsDouble2D3D `, :ref:`ParamsNormalizedSpatial ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropDigits`. + +.. _prop_OfxParamPropDisplayMax: + +**OfxParamPropDisplayMax** +^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropDisplayMax` +- **Type**: Multiple types: int, double +- **Dimension**: Variable (0 or more) +- **Used in Property Sets**: :ref:`ParamDouble1D `, :ref:`ParamsByte `, :ref:`ParamsDouble2D3D `, :ref:`ParamsInt2D3D `, :ref:`ParamsNormalizedSpatial `, :ref:`ParamsString ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropDisplayMax`. + +.. _prop_OfxParamPropDisplayMin: + +**OfxParamPropDisplayMin** +^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropDisplayMin` +- **Type**: Multiple types: int, double +- **Dimension**: Variable (0 or more) +- **Used in Property Sets**: :ref:`ParamDouble1D `, :ref:`ParamsByte `, :ref:`ParamsDouble2D3D `, :ref:`ParamsInt2D3D `, :ref:`ParamsNormalizedSpatial `, :ref:`ParamsString ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropDisplayMin`. + +.. _prop_OfxParamPropInteractPreferedSize: + +**OfxParamPropInteractPreferedSize** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropInteractPreferedSize` +- **Type**: int +- **Dimension**: 2 +- **Used in Property Sets**: :ref:`ParamDouble1D `, :ref:`ParamsByte `, :ref:`ParamsChoice `, :ref:`ParamsCustom `, :ref:`ParamsDouble2D3D `, :ref:`ParamsInt2D3D `, :ref:`ParamsNormalizedSpatial `, :ref:`ParamsParametric `, :ref:`ParamsStrChoice `, :ref:`ParamsString ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropInteractPreferedSize`. + +.. _prop_OfxParamPropMax: + +**OfxParamPropMax** +^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropMax` +- **Type**: Multiple types: int, double +- **Dimension**: Variable (0 or more) +- **Used in Property Sets**: :ref:`ParamDouble1D `, :ref:`ParamsByte `, :ref:`ParamsDouble2D3D `, :ref:`ParamsInt2D3D `, :ref:`ParamsNormalizedSpatial `, :ref:`ParamsString ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropMax`. + +.. _prop_OfxParamPropMin: + +**OfxParamPropMin** +^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropMin` +- **Type**: Multiple types: int, double +- **Dimension**: Variable (0 or more) +- **Used in Property Sets**: :ref:`ParamDouble1D `, :ref:`ParamsByte `, :ref:`ParamsDouble2D3D `, :ref:`ParamsInt2D3D `, :ref:`ParamsNormalizedSpatial `, :ref:`ParamsString ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropMin`. + +.. _prop_OfxParamPropParametricDimension: + +**OfxParamPropParametricDimension** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropParametricDimension` +- **Type**: int +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ParamsParametric ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropParametricDimension`. + +.. _prop_OfxPropAPIVersion: + +**OfxPropAPIVersion** +^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxPropAPIVersion` +- **Type**: int +- **Dimension**: Variable (0 or more) +- **Used in Property Sets**: :ref:`ImageEffectHost ` +- **Doc**: For detailed doc, see :c:macro:`kOfxPropAPIVersion`. + +.. _prop_OfxPropVersion: + +**OfxPropVersion** +^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxPropVersion` +- **Type**: int +- **Dimension**: Variable (0 or more) +- **Used in Property Sets**: :ref:`EffectDescriptor `, :ref:`ImageEffectHost ` +- **Doc**: For detailed doc, see :c:macro:`kOfxPropVersion`. + +.. _prop_kOfxPropKeySym: + +**kOfxPropKeySym** +^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxPropKeySym` +- **Type**: int +- **Dimension**: 1 +- **Doc**: For detailed doc, see :c:macro:`kOfxPropKeySym`. + + +Pointer Properties +------------------ + +.. _prop_OfxImageEffectPluginPropOverlayInteractV1: + +**OfxImageEffectPluginPropOverlayInteractV1** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPluginPropOverlayInteractV1` +- **Type**: pointer +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`EffectDescriptor ` +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPluginPropOverlayInteractV1`. + +.. _prop_OfxImageEffectPluginPropOverlayInteractV2: + +**OfxImageEffectPluginPropOverlayInteractV2** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPluginPropOverlayInteractV2` +- **Type**: pointer +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`EffectDescriptor ` +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPluginPropOverlayInteractV2`. + +.. _prop_OfxImageEffectPropCudaStream: + +**OfxImageEffectPropCudaStream** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropCudaStream` +- **Type**: pointer +- **Dimension**: 1 +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropCudaStream`. + +.. _prop_OfxImageEffectPropMetalCommandQueue: + +**OfxImageEffectPropMetalCommandQueue** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropMetalCommandQueue` +- **Type**: pointer +- **Dimension**: 1 +- **Introduced in**: version 1.5 +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropMetalCommandQueue`. + +.. _prop_OfxImageEffectPropOpenCLCommandQueue: + +**OfxImageEffectPropOpenCLCommandQueue** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropOpenCLCommandQueue` +- **Type**: pointer +- **Dimension**: 1 +- **Introduced in**: version 1.5 +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropOpenCLCommandQueue`. + +.. _prop_OfxImageEffectPropOpenCLImage: + +**OfxImageEffectPropOpenCLImage** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropOpenCLImage` +- **Type**: pointer +- **Dimension**: 1 +- **Introduced in**: version 1.5 +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropOpenCLImage`. + +.. _prop_OfxImageEffectPropPluginHandle: + +**OfxImageEffectPropPluginHandle** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropPluginHandle` +- **Type**: pointer +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`EffectInstance ` +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropPluginHandle`. + +.. _prop_OfxImagePropData: + +**OfxImagePropData** +^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImagePropData` +- **Type**: pointer +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`Image ` +- **Doc**: For detailed doc, see :c:macro:`kOfxImagePropData`. + +.. _prop_OfxInteractPropDrawContext: + +**OfxInteractPropDrawContext** +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxInteractPropDrawContext` +- **Type**: pointer +- **Dimension**: 1 +- **Doc**: For detailed doc, see :c:macro:`kOfxInteractPropDrawContext`. + +.. _prop_OfxParamPropCustomCallbackV1: + +**OfxParamPropCustomCallbackV1** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropCustomInterpCallbackV1` +- **Type**: pointer +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ParamsCustom ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropCustomInterpCallbackV1`. + +.. _prop_OfxParamPropDataPtr: + +**OfxParamPropDataPtr** +^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropDataPtr` +- **Type**: pointer +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ParamDouble1D `, :ref:`ParamsByte `, :ref:`ParamsChoice `, :ref:`ParamsCustom `, :ref:`ParamsDouble2D3D `, :ref:`ParamsGroup `, :ref:`ParamsInt2D3D `, :ref:`ParamsNormalizedSpatial `, :ref:`ParamsPage `, :ref:`ParamsParametric `, :ref:`ParamsStrChoice `, :ref:`ParamsString ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropDataPtr`. + +.. _prop_OfxParamPropDefault: + +**OfxParamPropDefault** +^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropDefault` +- **Type**: Multiple types: int, double, string, pointer +- **Dimension**: Variable (0 or more) +- **Used in Property Sets**: :ref:`ParamDouble1D `, :ref:`ParamsByte `, :ref:`ParamsChoice `, :ref:`ParamsCustom `, :ref:`ParamsDouble2D3D `, :ref:`ParamsInt2D3D `, :ref:`ParamsNormalizedSpatial `, :ref:`ParamsParametric `, :ref:`ParamsStrChoice `, :ref:`ParamsString ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropDefault`. + +.. _prop_OfxParamPropInteractV1: + +**OfxParamPropInteractV1** +^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropInteractV1` +- **Type**: pointer +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ParamDouble1D `, :ref:`ParamsByte `, :ref:`ParamsChoice `, :ref:`ParamsCustom `, :ref:`ParamsDouble2D3D `, :ref:`ParamsInt2D3D `, :ref:`ParamsNormalizedSpatial `, :ref:`ParamsParametric `, :ref:`ParamsStrChoice `, :ref:`ParamsString ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropInteractV1`. + +.. _prop_OfxParamPropParametricInteractBackground: + +**OfxParamPropParametricInteractBackground** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropParametricInteractBackground` +- **Type**: pointer +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ParamsParametric ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropParametricInteractBackground`. + +.. _prop_OfxPropEffectInstance: + +**OfxPropEffectInstance** +^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxPropEffectInstance` +- **Type**: pointer +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`InteractInstance ` +- **Doc**: For detailed doc, see :c:macro:`kOfxPropEffectInstance`. + +.. _prop_OfxPropHostOSHandle: + +**OfxPropHostOSHandle** +^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxPropHostOSHandle` +- **Type**: pointer +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ImageEffectHost ` +- **Doc**: For detailed doc, see :c:macro:`kOfxPropHostOSHandle`. + +.. _prop_OfxPropInstanceData: + +**OfxPropInstanceData** +^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxPropInstanceData` +- **Type**: pointer +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`EffectInstance `, :ref:`InteractInstance ` +- **Doc**: For detailed doc, see :c:macro:`kOfxPropInstanceData`. + + +String Properties +----------------- + +.. _prop_OfxImageClipPropColourspace: + +**OfxImageClipPropColourspace** +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageClipPropColourspace` +- **Type**: string +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ClipInstance ` +- **Introduced in**: version 1.5 +- **Doc**: For detailed doc, see :c:macro:`kOfxImageClipPropColourspace`. + +.. _prop_OfxImageClipPropPreferredColourspaces: + +**OfxImageClipPropPreferredColourspaces** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageClipPropPreferredColourspaces` +- **Type**: string +- **Dimension**: Variable (0 or more) +- **Used in Property Sets**: :ref:`ClipInstance ` +- **Introduced in**: version 1.5 +- **Doc**: For detailed doc, see :c:macro:`kOfxImageClipPropPreferredColourspaces`. + +.. _prop_OfxImageEffectPluginPropGrouping: + +**OfxImageEffectPluginPropGrouping** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPluginPropGrouping` +- **Type**: string +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`EffectDescriptor ` +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPluginPropGrouping`. + +.. _prop_OfxImageEffectPropClipPreferencesSlaveParam: + +**OfxImageEffectPropClipPreferencesSlaveParam** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropClipPreferencesSlaveParam` +- **Type**: string +- **Dimension**: Variable (0 or more) +- **Used in Property Sets**: :ref:`EffectDescriptor ` +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropClipPreferencesSlaveParam`. + +.. _prop_OfxImageEffectPropColourManagementAvailableConfigs: + +**OfxImageEffectPropColourManagementAvailableConfigs** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropColourManagementAvailableConfigs` +- **Type**: string +- **Dimension**: Variable (0 or more) +- **Used in Property Sets**: :ref:`EffectDescriptor `, :ref:`ImageEffectHost ` +- **Introduced in**: version 1.5 +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropColourManagementAvailableConfigs`. + +.. _prop_OfxImageEffectPropColourManagementConfig: + +**OfxImageEffectPropColourManagementConfig** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropColourManagementConfig` +- **Type**: string +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`EffectInstance ` +- **Introduced in**: version 1.5 +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropColourManagementConfig`. + +.. _prop_OfxImageEffectPropDisplayColourspace: + +**OfxImageEffectPropDisplayColourspace** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropDisplayColourspace` +- **Type**: string +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`EffectInstance ` +- **Introduced in**: version 1.5 +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropDisplayColourspace`. + +.. _prop_OfxImageEffectPropOCIOConfig: + +**OfxImageEffectPropOCIOConfig** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropOCIOConfig` +- **Type**: string +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`EffectInstance ` +- **Introduced in**: version 1.5 +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropOCIOConfig`. + +.. _prop_OfxImageEffectPropOCIODisplay: + +**OfxImageEffectPropOCIODisplay** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropOCIODisplay` +- **Type**: string +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`EffectInstance ` +- **Introduced in**: version 1.5 +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropOCIODisplay`. + +.. _prop_OfxImageEffectPropOCIOView: + +**OfxImageEffectPropOCIOView** +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImageEffectPropOCIOView` +- **Type**: string +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`EffectInstance ` +- **Introduced in**: version 1.5 +- **Doc**: For detailed doc, see :c:macro:`kOfxImageEffectPropOCIOView`. + +.. _prop_OfxImagePropUniqueIdentifier: + +**OfxImagePropUniqueIdentifier** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxImagePropUniqueIdentifier` +- **Type**: string +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`Image ` +- **Doc**: For detailed doc, see :c:macro:`kOfxImagePropUniqueIdentifier`. + +.. _prop_OfxInteractPropSlaveToParam: + +**OfxInteractPropSlaveToParam** +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxInteractPropSlaveToParam` +- **Type**: string +- **Dimension**: Variable (0 or more) +- **Used in Property Sets**: :ref:`InteractInstance ` +- **Doc**: For detailed doc, see :c:macro:`kOfxInteractPropSlaveToParam`. + +.. _prop_OfxParamPropChoiceOption: + +**OfxParamPropChoiceOption** +^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropChoiceOption` +- **Type**: string +- **Dimension**: Variable (0 or more) +- **Used in Property Sets**: :ref:`ParamsChoice `, :ref:`ParamsStrChoice ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropChoiceOption`. + +.. _prop_OfxParamPropCustomValue: + +**OfxParamPropCustomValue** +^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropCustomValue` +- **Type**: string +- **Dimension**: 2 +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropCustomValue`. + +.. _prop_OfxParamPropDefault: + +**OfxParamPropDefault** +^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropDefault` +- **Type**: Multiple types: int, double, string, pointer +- **Dimension**: Variable (0 or more) +- **Used in Property Sets**: :ref:`ParamDouble1D `, :ref:`ParamsByte `, :ref:`ParamsChoice `, :ref:`ParamsCustom `, :ref:`ParamsDouble2D3D `, :ref:`ParamsInt2D3D `, :ref:`ParamsNormalizedSpatial `, :ref:`ParamsParametric `, :ref:`ParamsStrChoice `, :ref:`ParamsString ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropDefault`. + +.. _prop_OfxParamPropDimensionLabel: + +**OfxParamPropDimensionLabel** +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropDimensionLabel` +- **Type**: string +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ParamsInt2D3D ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropDimensionLabel`. + +.. _prop_OfxParamPropHint: + +**OfxParamPropHint** +^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropHint` +- **Type**: string +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ParamDouble1D `, :ref:`ParamsByte `, :ref:`ParamsChoice `, :ref:`ParamsCustom `, :ref:`ParamsDouble2D3D `, :ref:`ParamsGroup `, :ref:`ParamsInt2D3D `, :ref:`ParamsNormalizedSpatial `, :ref:`ParamsPage `, :ref:`ParamsParametric `, :ref:`ParamsStrChoice `, :ref:`ParamsString ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropHint`. + +.. _prop_OfxParamPropPageChild: + +**OfxParamPropPageChild** +^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropPageChild` +- **Type**: string +- **Dimension**: Variable (0 or more) +- **Used in Property Sets**: :ref:`ParamsPage ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropPageChild`. + +.. _prop_OfxParamPropParent: + +**OfxParamPropParent** +^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropParent` +- **Type**: string +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ParamDouble1D `, :ref:`ParamsByte `, :ref:`ParamsChoice `, :ref:`ParamsCustom `, :ref:`ParamsDouble2D3D `, :ref:`ParamsGroup `, :ref:`ParamsInt2D3D `, :ref:`ParamsNormalizedSpatial `, :ref:`ParamsPage `, :ref:`ParamsParametric `, :ref:`ParamsStrChoice `, :ref:`ParamsString ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropParent`. + +.. _prop_OfxParamPropScriptName: + +**OfxParamPropScriptName** +^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropScriptName` +- **Type**: string +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ParamDouble1D `, :ref:`ParamsByte `, :ref:`ParamsChoice `, :ref:`ParamsCustom `, :ref:`ParamsDouble2D3D `, :ref:`ParamsGroup `, :ref:`ParamsInt2D3D `, :ref:`ParamsNormalizedSpatial `, :ref:`ParamsPage `, :ref:`ParamsParametric `, :ref:`ParamsStrChoice `, :ref:`ParamsString ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropScriptName`. + +.. _prop_OfxParamPropType: + +**OfxParamPropType** +^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxParamPropType` +- **Type**: string +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ParamDouble1D `, :ref:`ParamsByte `, :ref:`ParamsChoice `, :ref:`ParamsCustom `, :ref:`ParamsDouble2D3D `, :ref:`ParamsGroup `, :ref:`ParamsInt2D3D `, :ref:`ParamsNormalizedSpatial `, :ref:`ParamsPage `, :ref:`ParamsParametric `, :ref:`ParamsStrChoice `, :ref:`ParamsString ` +- **Doc**: For detailed doc, see :c:macro:`kOfxParamPropType`. + +.. _prop_OfxPluginPropParamPageOrder: + +**OfxPluginPropParamPageOrder** +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxPluginPropParamPageOrder` +- **Type**: string +- **Dimension**: Variable (0 or more) +- **Used in Property Sets**: :ref:`ParameterSet ` +- **Doc**: For detailed doc, see :c:macro:`kOfxPluginPropParamPageOrder`. + +.. _prop_OfxPropIcon: + +**OfxPropIcon** +^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxPropIcon` +- **Type**: string +- **Dimension**: 2 +- **Used in Property Sets**: :ref:`ParamDouble1D `, :ref:`ParamsByte `, :ref:`ParamsChoice `, :ref:`ParamsCustom `, :ref:`ParamsDouble2D3D `, :ref:`ParamsGroup `, :ref:`ParamsInt2D3D `, :ref:`ParamsNormalizedSpatial `, :ref:`ParamsPage `, :ref:`ParamsParametric `, :ref:`ParamsStrChoice `, :ref:`ParamsString ` +- **Doc**: For detailed doc, see :c:macro:`kOfxPropIcon`. + +.. _prop_OfxPropLabel: + +**OfxPropLabel** +^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxPropLabel` +- **Type**: string +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ClipDescriptor `, :ref:`ClipInstance `, :ref:`EffectDescriptor `, :ref:`ImageEffectHost `, :ref:`ParamDouble1D `, :ref:`ParamsByte `, :ref:`ParamsChoice `, :ref:`ParamsCustom `, :ref:`ParamsDouble2D3D `, :ref:`ParamsGroup `, :ref:`ParamsInt2D3D `, :ref:`ParamsNormalizedSpatial `, :ref:`ParamsPage `, :ref:`ParamsParametric `, :ref:`ParamsStrChoice `, :ref:`ParamsString ` +- **Doc**: For detailed doc, see :c:macro:`kOfxPropLabel`. + +.. _prop_OfxPropLongLabel: + +**OfxPropLongLabel** +^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxPropLongLabel` +- **Type**: string +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ClipDescriptor `, :ref:`ClipInstance `, :ref:`EffectDescriptor `, :ref:`ParamDouble1D `, :ref:`ParamsByte `, :ref:`ParamsChoice `, :ref:`ParamsCustom `, :ref:`ParamsDouble2D3D `, :ref:`ParamsGroup `, :ref:`ParamsInt2D3D `, :ref:`ParamsNormalizedSpatial `, :ref:`ParamsPage `, :ref:`ParamsParametric `, :ref:`ParamsStrChoice `, :ref:`ParamsString ` +- **Doc**: For detailed doc, see :c:macro:`kOfxPropLongLabel`. + +.. _prop_OfxPropName: + +**OfxPropName** +^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxPropName` +- **Type**: string +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ClipDescriptor `, :ref:`ClipInstance `, :ref:`ImageEffectHost `, :ref:`ParamDouble1D `, :ref:`ParamsByte `, :ref:`ParamsChoice `, :ref:`ParamsCustom `, :ref:`ParamsDouble2D3D `, :ref:`ParamsGroup `, :ref:`ParamsInt2D3D `, :ref:`ParamsNormalizedSpatial `, :ref:`ParamsPage `, :ref:`ParamsParametric `, :ref:`ParamsStrChoice `, :ref:`ParamsString ` +- **Doc**: For detailed doc, see :c:macro:`kOfxPropName`. + +.. _prop_OfxPropPluginDescription: + +**OfxPropPluginDescription** +^^^^^^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxPropPluginDescription` +- **Type**: string +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`EffectDescriptor ` +- **Doc**: For detailed doc, see :c:macro:`kOfxPropPluginDescription`. + +.. _prop_OfxPropShortLabel: + +**OfxPropShortLabel** +^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxPropShortLabel` +- **Type**: string +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ClipDescriptor `, :ref:`ClipInstance `, :ref:`EffectDescriptor `, :ref:`ParamDouble1D `, :ref:`ParamsByte `, :ref:`ParamsChoice `, :ref:`ParamsCustom `, :ref:`ParamsDouble2D3D `, :ref:`ParamsGroup `, :ref:`ParamsInt2D3D `, :ref:`ParamsNormalizedSpatial `, :ref:`ParamsPage `, :ref:`ParamsParametric `, :ref:`ParamsStrChoice `, :ref:`ParamsString ` +- **Doc**: For detailed doc, see :c:macro:`kOfxPropShortLabel`. + +.. _prop_OfxPropType: + +**OfxPropType** +^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxPropType` +- **Type**: string +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`ClipDescriptor `, :ref:`ClipInstance `, :ref:`EffectDescriptor `, :ref:`EffectInstance `, :ref:`Image `, :ref:`ImageEffectHost `, :ref:`ParamDouble1D `, :ref:`ParamsByte `, :ref:`ParamsChoice `, :ref:`ParamsCustom `, :ref:`ParamsDouble2D3D `, :ref:`ParamsGroup `, :ref:`ParamsInt2D3D `, :ref:`ParamsNormalizedSpatial `, :ref:`ParamsPage `, :ref:`ParamsParametric `, :ref:`ParamsStrChoice `, :ref:`ParamsString ` +- **Doc**: For detailed doc, see :c:macro:`kOfxPropType`. + +.. _prop_OfxPropVersionLabel: + +**OfxPropVersionLabel** +^^^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxPropVersionLabel` +- **Type**: string +- **Dimension**: 1 +- **Used in Property Sets**: :ref:`EffectDescriptor `, :ref:`ImageEffectHost ` +- **Doc**: For detailed doc, see :c:macro:`kOfxPropVersionLabel`. + +.. _prop_kOfxPropKeyString: + +**kOfxPropKeyString** +^^^^^^^^^^^^^^^^^ + +- **C #define**: :c:macro:`kOfxPropKeyString` +- **Type**: string +- **Dimension**: 1 +- **Doc**: For detailed doc, see :c:macro:`kOfxPropKeyString`. + diff --git a/Documentation/sources/Reference/ofxPropertySetsGenerated.rst b/Documentation/sources/Reference/ofxPropertySetsGenerated.rst new file mode 100644 index 000000000..69cd51fad --- /dev/null +++ b/Documentation/sources/Reference/ofxPropertySetsGenerated.rst @@ -0,0 +1,1349 @@ +.. _propertySetReferenceGenerated: +Property Sets Reference (Generated) +================================== + +This reference is auto-generated from property set definitions in the OpenFX source code. +It provides an overview of property sets and their associated properties. +For each property, a link to its detailed description in the :doc:`Properties Reference (Generated) ` is provided. + +Regular Property Sets +-------------------- + +These property sets represent collections of properties associated with various OpenFX objects. + +**Property Sets Quick Reference** + +* :ref:`ClipDescriptor ` +* :ref:`ClipInstance ` +* :ref:`EffectDescriptor ` +* :ref:`EffectInstance ` +* :ref:`Image ` +* :ref:`ImageEffectHost ` +* :ref:`InteractDescriptor ` +* :ref:`InteractInstance ` +* :ref:`ParamDouble1D ` +* :ref:`ParameterSet ` +* :ref:`ParamsByte ` +* :ref:`ParamsChoice ` +* :ref:`ParamsCustom ` +* :ref:`ParamsDouble2D3D ` +* :ref:`ParamsGroup ` +* :ref:`ParamsInt2D3D ` +* :ref:`ParamsNormalizedSpatial ` +* :ref:`ParamsPage ` +* :ref:`ParamsParametric ` +* :ref:`ParamsStrChoice ` +* :ref:`ParamsString ` + +.. _propset_ClipDescriptor: + +**ClipDescriptor** +^^^^^^^^^^^^^^ + +- **Write Access**: plugin + +**Properties** + +- :ref:`OfxImageClipPropFieldExtraction ` - Type: enum, Dimension: 1 (doc: :c:macro:`kOfxImageClipPropFieldExtraction`) +- :ref:`OfxImageClipPropIsMask ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxImageClipPropIsMask`) +- :ref:`OfxImageClipPropOptional ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxImageClipPropOptional`) +- :ref:`OfxImageEffectPropSupportedComponents ` - Type: enum, Dimension: Variable (doc: :c:macro:`kOfxImageEffectPropSupportedComponents`) +- :ref:`OfxImageEffectPropSupportsTiles ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxImageEffectPropSupportsTiles`) +- :ref:`OfxImageEffectPropTemporalClipAccess ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxImageEffectPropTemporalClipAccess`) +- :ref:`OfxPropLabel ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropLabel`) +- :ref:`OfxPropLongLabel ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropLongLabel`) +- :ref:`OfxPropName ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropName`) +- :ref:`OfxPropShortLabel ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropShortLabel`) +- :ref:`OfxPropType ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropType`) + +.. _propset_ClipInstance: + +**ClipInstance** +^^^^^^^^^^^^ + +- **Write Access**: host + +**Properties** + +- :ref:`OfxImageClipPropColourspace ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxImageClipPropColourspace`) +- :ref:`OfxImageClipPropConnected ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxImageClipPropConnected`) +- :ref:`OfxImageClipPropContinuousSamples ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxImageClipPropContinuousSamples`) +- :ref:`OfxImageClipPropFieldExtraction ` - Type: enum, Dimension: 1 (doc: :c:macro:`kOfxImageClipPropFieldExtraction`) +- :ref:`OfxImageClipPropFieldOrder ` - Type: enum, Dimension: 1 (doc: :c:macro:`kOfxImageClipPropFieldOrder`) +- :ref:`OfxImageClipPropIsMask ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxImageClipPropIsMask`) +- :ref:`OfxImageClipPropOptional ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxImageClipPropOptional`) +- :ref:`OfxImageClipPropPreferredColourspaces ` - Type: string, Dimension: Variable (doc: :c:macro:`kOfxImageClipPropPreferredColourspaces`) +- :ref:`OfxImageClipPropUnmappedComponents ` - Type: enum, Dimension: 1 (doc: :c:macro:`kOfxImageClipPropUnmappedComponents`) +- :ref:`OfxImageClipPropUnmappedPixelDepth ` - Type: enum, Dimension: 1 (doc: :c:macro:`kOfxImageClipPropUnmappedPixelDepth`) +- :ref:`OfxImageEffectPropComponents ` - Type: enum, Dimension: 1 (doc: :c:macro:`kOfxImageEffectPropComponents`) +- :ref:`OfxImageEffectPropFrameRange ` - Type: double, Dimension: 2 (doc: :c:macro:`kOfxImageEffectPropFrameRange`) +- :ref:`OfxImageEffectPropFrameRate ` - Type: double, Dimension: 1 (doc: :c:macro:`kOfxImageEffectPropFrameRate`) +- :ref:`OfxImageEffectPropPixelDepth ` - Type: enum, Dimension: 1 (doc: :c:macro:`kOfxImageEffectPropPixelDepth`) +- :ref:`OfxImageEffectPropPreMultiplication ` - Type: enum, Dimension: 1 (doc: :c:macro:`kOfxImageEffectPropPreMultiplication`) +- :ref:`OfxImageEffectPropSupportedComponents ` - Type: enum, Dimension: Variable (doc: :c:macro:`kOfxImageEffectPropSupportedComponents`) +- :ref:`OfxImageEffectPropSupportsTiles ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxImageEffectPropSupportsTiles`) +- :ref:`OfxImageEffectPropTemporalClipAccess ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxImageEffectPropTemporalClipAccess`) +- :ref:`OfxImageEffectPropUnmappedFrameRange ` - Type: double, Dimension: 2 (doc: :c:macro:`kOfxImageEffectPropUnmappedFrameRange`) +- :ref:`OfxImageEffectPropUnmappedFrameRate ` - Type: double, Dimension: 1 (doc: :c:macro:`kOfxImageEffectPropUnmappedFrameRate`) +- :ref:`OfxImagePropPixelAspectRatio ` - Type: double, Dimension: 1 (doc: :c:macro:`kOfxImagePropPixelAspectRatio`) +- :ref:`OfxPropLabel ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropLabel`) +- :ref:`OfxPropLongLabel ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropLongLabel`) +- :ref:`OfxPropName ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropName`) +- :ref:`OfxPropShortLabel ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropShortLabel`) +- :ref:`OfxPropType ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropType`) + +.. _propset_EffectDescriptor: + +**EffectDescriptor** +^^^^^^^^^^^^^^^^ + +- **Write Access**: plugin + +**Properties** + +- :ref:`OfxImageEffectPluginPropFieldRenderTwiceAlways ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxImageEffectPluginPropFieldRenderTwiceAlways`) +- :ref:`OfxImageEffectPluginPropGrouping ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxImageEffectPluginPropGrouping`) +- :ref:`OfxImageEffectPluginPropHostFrameThreading ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxImageEffectPluginPropHostFrameThreading`) +- :ref:`OfxImageEffectPluginPropOverlayInteractV1 ` - Type: pointer, Dimension: 1 (doc: :c:macro:`kOfxImageEffectPluginPropOverlayInteractV1`) +- :ref:`OfxImageEffectPluginPropOverlayInteractV2 ` - Type: pointer, Dimension: 1 (doc: :c:macro:`kOfxImageEffectPluginPropOverlayInteractV2`) +- :ref:`OfxImageEffectPluginPropSingleInstance ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxImageEffectPluginPropSingleInstance`) +- :ref:`OfxImageEffectPluginRenderThreadSafety ` - Type: enum, Dimension: 1 (doc: :c:macro:`kOfxImageEffectPluginRenderThreadSafety`) +- :ref:`OfxImageEffectPluginRenderThreadSafety ` - Type: enum, Dimension: 1 (doc: :c:macro:`kOfxImageEffectPluginRenderThreadSafety`) +- :ref:`OfxImageEffectPropClipPreferencesSlaveParam ` - Type: string, Dimension: Variable (doc: :c:macro:`kOfxImageEffectPropClipPreferencesSlaveParam`) +- :ref:`OfxImageEffectPropColourManagementAvailableConfigs ` - Type: string, Dimension: Variable (doc: :c:macro:`kOfxImageEffectPropColourManagementAvailableConfigs`) +- :ref:`OfxImageEffectPropColourManagementStyle ` - Type: enum, Dimension: 1 (doc: :c:macro:`kOfxImageEffectPropColourManagementStyle`) +- :ref:`OfxImageEffectPropMultipleClipDepths ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxImageEffectPropSupportsMultipleClipDepths`) +- :ref:`OfxImageEffectPropOpenCLSupported ` - Type: enum, Dimension: 1 (doc: :c:macro:`kOfxImageEffectPropOpenCLSupported`) +- :ref:`OfxImageEffectPropOpenGLRenderSupported ` - Type: enum, Dimension: 1 (doc: :c:macro:`kOfxImageEffectPropOpenGLRenderSupported`) +- :ref:`OfxImageEffectPropSupportedContexts ` - Type: enum, Dimension: Variable (doc: :c:macro:`kOfxImageEffectPropSupportedContexts`) +- :ref:`OfxImageEffectPropSupportedPixelDepths ` - Type: enum, Dimension: Variable (doc: :c:macro:`kOfxImageEffectPropSupportedPixelDepths`) +- :ref:`OfxImageEffectPropSupportsMultiResolution ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxImageEffectPropSupportsMultiResolution`) +- :ref:`OfxImageEffectPropSupportsMultipleClipPARs ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxImageEffectPropSupportsMultipleClipPARs`) +- :ref:`OfxImageEffectPropSupportsTiles ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxImageEffectPropSupportsTiles`) +- :ref:`OfxImageEffectPropTemporalClipAccess ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxImageEffectPropTemporalClipAccess`) +- :ref:`OfxOpenGLPropPixelDepth ` - Type: enum, Dimension: Variable (doc: :c:macro:`kOfxOpenGLPropPixelDepth`) +- :ref:`OfxPluginPropFilePath ` - Type: enum, Dimension: 1 (doc: :c:macro:`kOfxPluginPropFilePath`) +- :ref:`OfxPropLabel ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropLabel`) +- :ref:`OfxPropLongLabel ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropLongLabel`) +- :ref:`OfxPropPluginDescription ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropPluginDescription`) +- :ref:`OfxPropShortLabel ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropShortLabel`) +- :ref:`OfxPropType ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropType`) +- :ref:`OfxPropVersion ` - Type: int, Dimension: Variable (doc: :c:macro:`kOfxPropVersion`) +- :ref:`OfxPropVersionLabel ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropVersionLabel`) + +.. _propset_EffectInstance: + +**EffectInstance** +^^^^^^^^^^^^^^ + +- **Write Access**: host + +**Properties** + +- :ref:`OfxImageEffectInstancePropEffectDuration ` - Type: double, Dimension: 1 (doc: :c:macro:`kOfxImageEffectInstancePropEffectDuration`) +- :ref:`OfxImageEffectInstancePropSequentialRender ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxImageEffectInstancePropSequentialRender`) +- :ref:`OfxImageEffectPropColourManagementConfig ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxImageEffectPropColourManagementConfig`) +- :ref:`OfxImageEffectPropColourManagementStyle ` - Type: enum, Dimension: 1 (doc: :c:macro:`kOfxImageEffectPropColourManagementStyle`) +- :ref:`OfxImageEffectPropContext ` - Type: enum, Dimension: 1 (doc: :c:macro:`kOfxImageEffectPropContext`) +- :ref:`OfxImageEffectPropDisplayColourspace ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxImageEffectPropDisplayColourspace`) +- :ref:`OfxImageEffectPropFrameRate ` - Type: double, Dimension: 1 (doc: :c:macro:`kOfxImageEffectPropFrameRate`) +- :ref:`OfxImageEffectPropOCIOConfig ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxImageEffectPropOCIOConfig`) +- :ref:`OfxImageEffectPropOCIODisplay ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxImageEffectPropOCIODisplay`) +- :ref:`OfxImageEffectPropOCIOView ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxImageEffectPropOCIOView`) +- :ref:`OfxImageEffectPropOpenGLRenderSupported ` - Type: enum, Dimension: 1 (doc: :c:macro:`kOfxImageEffectPropOpenGLRenderSupported`) +- :ref:`OfxImageEffectPropPixelAspectRatio ` - Type: double, Dimension: 1 (doc: :c:macro:`kOfxImageEffectPropProjectPixelAspectRatio`) +- :ref:`OfxImageEffectPropPluginHandle ` - Type: pointer, Dimension: 1 (doc: :c:macro:`kOfxImageEffectPropPluginHandle`) +- :ref:`OfxImageEffectPropProjectExtent ` - Type: double, Dimension: 2 (doc: :c:macro:`kOfxImageEffectPropProjectExtent`) +- :ref:`OfxImageEffectPropProjectOffset ` - Type: double, Dimension: 2 (doc: :c:macro:`kOfxImageEffectPropProjectOffset`) +- :ref:`OfxImageEffectPropProjectSize ` - Type: double, Dimension: 2 (doc: :c:macro:`kOfxImageEffectPropProjectSize`) +- :ref:`OfxImageEffectPropSupportsTiles ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxImageEffectPropSupportsTiles`) +- :ref:`OfxPropInstanceData ` - Type: pointer, Dimension: 1 (doc: :c:macro:`kOfxPropInstanceData`) +- :ref:`OfxPropIsInteractive ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxPropIsInteractive`) +- :ref:`OfxPropType ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropType`) + +.. _propset_Image: + +**Image** +^^^^^ + +- **Write Access**: host + +**Properties** + +- :ref:`OfxImageEffectPropComponents ` - Type: enum, Dimension: 1 (doc: :c:macro:`kOfxImageEffectPropComponents`) +- :ref:`OfxImageEffectPropPixelDepth ` - Type: enum, Dimension: 1 (doc: :c:macro:`kOfxImageEffectPropPixelDepth`) +- :ref:`OfxImageEffectPropPreMultiplication ` - Type: enum, Dimension: 1 (doc: :c:macro:`kOfxImageEffectPropPreMultiplication`) +- :ref:`OfxImageEffectPropRenderScale ` - Type: double, Dimension: 2 (doc: :c:macro:`kOfxImageEffectPropRenderScale`) +- :ref:`OfxImagePropBounds ` - Type: int, Dimension: 4 (doc: :c:macro:`kOfxImagePropBounds`) +- :ref:`OfxImagePropData ` - Type: pointer, Dimension: 1 (doc: :c:macro:`kOfxImagePropData`) +- :ref:`OfxImagePropField ` - Type: enum, Dimension: 1 (doc: :c:macro:`kOfxImagePropField`) +- :ref:`OfxImagePropPixelAspectRatio ` - Type: double, Dimension: 1 (doc: :c:macro:`kOfxImagePropPixelAspectRatio`) +- :ref:`OfxImagePropRegionOfDefinition ` - Type: int, Dimension: 4 (doc: :c:macro:`kOfxImagePropRegionOfDefinition`) +- :ref:`OfxImagePropRowBytes ` - Type: int, Dimension: 1 (doc: :c:macro:`kOfxImagePropRowBytes`) +- :ref:`OfxImagePropUniqueIdentifier ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxImagePropUniqueIdentifier`) +- :ref:`OfxPropType ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropType`) + +.. _propset_ImageEffectHost: + +**ImageEffectHost** +^^^^^^^^^^^^^^^ + +- **Write Access**: host + +**Properties** + +- :ref:`OfxImageEffectHostPropIsBackground ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxImageEffectHostPropIsBackground`) +- :ref:`OfxImageEffectHostPropNativeOrigin ` - Type: enum, Dimension: 1 (doc: :c:macro:`kOfxImageEffectHostPropNativeOrigin`) +- :ref:`OfxImageEffectInstancePropSequentialRender ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxImageEffectInstancePropSequentialRender`) +- :ref:`OfxImageEffectPropColourManagementAvailableConfigs ` - Type: string, Dimension: Variable (doc: :c:macro:`kOfxImageEffectPropColourManagementAvailableConfigs`) +- :ref:`OfxImageEffectPropColourManagementStyle ` - Type: enum, Dimension: 1 (doc: :c:macro:`kOfxImageEffectPropColourManagementStyle`) +- :ref:`OfxImageEffectPropMultipleClipDepths ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxImageEffectPropSupportsMultipleClipDepths`) +- :ref:`OfxImageEffectPropOpenCLSupported ` - Type: enum, Dimension: 1 (doc: :c:macro:`kOfxImageEffectPropOpenCLSupported`) +- :ref:`OfxImageEffectPropOpenGLRenderSupported ` - Type: enum, Dimension: 1 (doc: :c:macro:`kOfxImageEffectPropOpenGLRenderSupported`) +- :ref:`OfxImageEffectPropRenderQualityDraft ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxImageEffectPropRenderQualityDraft`) +- :ref:`OfxImageEffectPropSetableFielding ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxImageEffectPropSetableFielding`) +- :ref:`OfxImageEffectPropSetableFrameRate ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxImageEffectPropSetableFrameRate`) +- :ref:`OfxImageEffectPropSupportedComponents ` - Type: enum, Dimension: Variable (doc: :c:macro:`kOfxImageEffectPropSupportedComponents`) +- :ref:`OfxImageEffectPropSupportedContexts ` - Type: enum, Dimension: Variable (doc: :c:macro:`kOfxImageEffectPropSupportedContexts`) +- :ref:`OfxImageEffectPropSupportsMultiResolution ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxImageEffectPropSupportsMultiResolution`) +- :ref:`OfxImageEffectPropSupportsMultipleClipPARs ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxImageEffectPropSupportsMultipleClipPARs`) +- :ref:`OfxImageEffectPropSupportsOverlays ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxImageEffectPropSupportsOverlays`) +- :ref:`OfxImageEffectPropSupportsTiles ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxImageEffectPropSupportsTiles`) +- :ref:`OfxImageEffectPropTemporalClipAccess ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxImageEffectPropTemporalClipAccess`) +- :ref:`OfxParamHostPropMaxPages ` - Type: int, Dimension: 1 (doc: :c:macro:`kOfxParamHostPropMaxPages`) +- :ref:`OfxParamHostPropMaxParameters ` - Type: int, Dimension: 1 (doc: :c:macro:`kOfxParamHostPropMaxParameters`) +- :ref:`OfxParamHostPropPageRowColumnCount ` - Type: int, Dimension: 2 (doc: :c:macro:`kOfxParamHostPropPageRowColumnCount`) +- :ref:`OfxParamHostPropSupportsBooleanAnimation ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamHostPropSupportsBooleanAnimation`) +- :ref:`OfxParamHostPropSupportsChoiceAnimation ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamHostPropSupportsChoiceAnimation`) +- :ref:`OfxParamHostPropSupportsCustomAnimation ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamHostPropSupportsCustomAnimation`) +- :ref:`OfxParamHostPropSupportsCustomInteract ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamHostPropSupportsCustomInteract`) +- :ref:`OfxParamHostPropSupportsParametricAnimation ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamHostPropSupportsParametricAnimation`) +- :ref:`OfxParamHostPropSupportsStrChoice ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamHostPropSupportsStrChoice`) +- :ref:`OfxParamHostPropSupportsStrChoiceAnimation ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamHostPropSupportsStrChoiceAnimation`) +- :ref:`OfxParamHostPropSupportsStringAnimation ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamHostPropSupportsStringAnimation`) +- :ref:`OfxPropAPIVersion ` - Type: int, Dimension: Variable (doc: :c:macro:`kOfxPropAPIVersion`) +- :ref:`OfxPropHostOSHandle ` - Type: pointer, Dimension: 1 (doc: :c:macro:`kOfxPropHostOSHandle`) +- :ref:`OfxPropLabel ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropLabel`) +- :ref:`OfxPropName ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropName`) +- :ref:`OfxPropType ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropType`) +- :ref:`OfxPropVersion ` - Type: int, Dimension: Variable (doc: :c:macro:`kOfxPropVersion`) +- :ref:`OfxPropVersionLabel ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropVersionLabel`) + +.. _propset_InteractDescriptor: + +**InteractDescriptor** +^^^^^^^^^^^^^^^^^^ + +- **Write Access**: host + +**Properties** + +- :ref:`OfxInteractPropBitDepth ` - Type: int, Dimension: 1 (doc: :c:macro:`kOfxInteractPropBitDepth`) +- :ref:`OfxInteractPropHasAlpha ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxInteractPropHasAlpha`) + +.. _propset_InteractInstance: + +**InteractInstance** +^^^^^^^^^^^^^^^^ + +- **Write Access**: host + +**Properties** + +- :ref:`OfxInteractPropBackgroundColour ` - Type: double, Dimension: 3 (doc: :c:macro:`kOfxInteractPropBackgroundColour`) +- :ref:`OfxInteractPropBitDepth ` - Type: int, Dimension: 1 (doc: :c:macro:`kOfxInteractPropBitDepth`) +- :ref:`OfxInteractPropHasAlpha ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxInteractPropHasAlpha`) +- :ref:`OfxInteractPropPixelScale ` - Type: double, Dimension: 2 (doc: :c:macro:`kOfxInteractPropPixelScale`) +- :ref:`OfxInteractPropSlaveToParam ` - Type: string, Dimension: Variable (doc: :c:macro:`kOfxInteractPropSlaveToParam`) +- :ref:`OfxInteractPropSuggestedColour ` - Type: double, Dimension: 3 (doc: :c:macro:`kOfxInteractPropSuggestedColour`) +- :ref:`OfxPropEffectInstance ` - Type: pointer, Dimension: 1 (doc: :c:macro:`kOfxPropEffectInstance`) +- :ref:`OfxPropInstanceData ` - Type: pointer, Dimension: 1 (doc: :c:macro:`kOfxPropInstanceData`) + +.. _propset_ParamDouble1D: + +**ParamDouble1D** +^^^^^^^^^^^^^ + +- **Write Access**: plugin + +**Properties** + +- :ref:`OfxParamPropAnimates ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropAnimates`) +- :ref:`OfxParamPropCacheInvalidation ` - Type: enum, Dimension: 1 (doc: :c:macro:`kOfxParamPropCacheInvalidation`) +- :ref:`OfxParamPropCanUndo ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropCanUndo`) +- :ref:`OfxParamPropDataPtr ` - Type: pointer, Dimension: 1 (doc: :c:macro:`kOfxParamPropDataPtr`) +- :ref:`OfxParamPropDefault ` - Type: int/double/string/pointer, Dimension: Variable (doc: :c:macro:`kOfxParamPropDefault`) +- :ref:`OfxParamPropDigits ` - Type: int, Dimension: 1 (doc: :c:macro:`kOfxParamPropDigits`) +- :ref:`OfxParamPropDisplayMax ` - Type: int/double, Dimension: Variable (doc: :c:macro:`kOfxParamPropDisplayMax`) +- :ref:`OfxParamPropDisplayMin ` - Type: int/double, Dimension: Variable (doc: :c:macro:`kOfxParamPropDisplayMin`) +- :ref:`OfxParamPropDoubleType ` - Type: enum, Dimension: 1 (doc: :c:macro:`kOfxParamPropDoubleType`) +- :ref:`OfxParamPropEnabled ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropEnabled`) +- :ref:`OfxParamPropEvaluateOnChange ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropEvaluateOnChange`) +- :ref:`OfxParamPropHasHostOverlayHandle ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropHasHostOverlayHandle`) +- :ref:`OfxParamPropHint ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxParamPropHint`) +- :ref:`OfxParamPropIncrement ` - Type: double, Dimension: 1 (doc: :c:macro:`kOfxParamPropIncrement`) +- :ref:`OfxParamPropInteractMinimumSize ` - Type: double, Dimension: 2 (doc: :c:macro:`kOfxParamPropInteractMinimumSize`) +- :ref:`OfxParamPropInteractPreferedSize ` - Type: int, Dimension: 2 (doc: :c:macro:`kOfxParamPropInteractPreferedSize`) +- :ref:`OfxParamPropInteractSize ` - Type: double, Dimension: 2 (doc: :c:macro:`kOfxParamPropInteractSize`) +- :ref:`OfxParamPropInteractSizeAspect ` - Type: double, Dimension: 1 (doc: :c:macro:`kOfxParamPropInteractSizeAspect`) +- :ref:`OfxParamPropInteractV1 ` - Type: pointer, Dimension: 1 (doc: :c:macro:`kOfxParamPropInteractV1`) +- :ref:`OfxParamPropIsAnimating ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropIsAnimating`) +- :ref:`OfxParamPropIsAutoKeying ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropIsAutoKeying`) +- :ref:`OfxParamPropMax ` - Type: int/double, Dimension: Variable (doc: :c:macro:`kOfxParamPropMax`) +- :ref:`OfxParamPropMin ` - Type: int/double, Dimension: Variable (doc: :c:macro:`kOfxParamPropMin`) +- :ref:`OfxParamPropParent ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxParamPropParent`) +- :ref:`OfxParamPropPersistant ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropPersistant`) +- :ref:`OfxParamPropPluginMayWrite ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropPluginMayWrite`) +- :ref:`OfxParamPropScriptName ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxParamPropScriptName`) +- :ref:`OfxParamPropSecret ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropSecret`) +- :ref:`OfxParamPropShowTimeMarker ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropShowTimeMarker`) +- :ref:`OfxParamPropType ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxParamPropType`) +- :ref:`OfxPropIcon ` - Type: string, Dimension: 2 (doc: :c:macro:`kOfxPropIcon`) +- :ref:`OfxPropLabel ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropLabel`) +- :ref:`OfxPropLongLabel ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropLongLabel`) +- :ref:`OfxPropName ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropName`) +- :ref:`OfxPropShortLabel ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropShortLabel`) +- :ref:`OfxPropType ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropType`) +- :ref:`kOfxParamPropUseHostOverlayHandle ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropUseHostOverlayHandle`) + +.. _propset_ParameterSet: + +**ParameterSet** +^^^^^^^^^^^^ + +- **Write Access**: plugin + +**Properties** + +- :ref:`OfxPluginPropParamPageOrder ` - Type: string, Dimension: Variable (doc: :c:macro:`kOfxPluginPropParamPageOrder`) +- :ref:`OfxPropParamSetNeedsSyncing ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxPropParamSetNeedsSyncing`) + +.. _propset_ParamsByte: + +**ParamsByte** +^^^^^^^^^^ + +- **Write Access**: plugin + +**Properties** + +- :ref:`OfxParamPropAnimates ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropAnimates`) +- :ref:`OfxParamPropCacheInvalidation ` - Type: enum, Dimension: 1 (doc: :c:macro:`kOfxParamPropCacheInvalidation`) +- :ref:`OfxParamPropCanUndo ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropCanUndo`) +- :ref:`OfxParamPropDataPtr ` - Type: pointer, Dimension: 1 (doc: :c:macro:`kOfxParamPropDataPtr`) +- :ref:`OfxParamPropDefault ` - Type: int/double/string/pointer, Dimension: Variable (doc: :c:macro:`kOfxParamPropDefault`) +- :ref:`OfxParamPropDisplayMax ` - Type: int/double, Dimension: Variable (doc: :c:macro:`kOfxParamPropDisplayMax`) +- :ref:`OfxParamPropDisplayMin ` - Type: int/double, Dimension: Variable (doc: :c:macro:`kOfxParamPropDisplayMin`) +- :ref:`OfxParamPropEnabled ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropEnabled`) +- :ref:`OfxParamPropEvaluateOnChange ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropEvaluateOnChange`) +- :ref:`OfxParamPropHasHostOverlayHandle ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropHasHostOverlayHandle`) +- :ref:`OfxParamPropHint ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxParamPropHint`) +- :ref:`OfxParamPropInteractMinimumSize ` - Type: double, Dimension: 2 (doc: :c:macro:`kOfxParamPropInteractMinimumSize`) +- :ref:`OfxParamPropInteractPreferedSize ` - Type: int, Dimension: 2 (doc: :c:macro:`kOfxParamPropInteractPreferedSize`) +- :ref:`OfxParamPropInteractSize ` - Type: double, Dimension: 2 (doc: :c:macro:`kOfxParamPropInteractSize`) +- :ref:`OfxParamPropInteractSizeAspect ` - Type: double, Dimension: 1 (doc: :c:macro:`kOfxParamPropInteractSizeAspect`) +- :ref:`OfxParamPropInteractV1 ` - Type: pointer, Dimension: 1 (doc: :c:macro:`kOfxParamPropInteractV1`) +- :ref:`OfxParamPropIsAnimating ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropIsAnimating`) +- :ref:`OfxParamPropIsAutoKeying ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropIsAutoKeying`) +- :ref:`OfxParamPropMax ` - Type: int/double, Dimension: Variable (doc: :c:macro:`kOfxParamPropMax`) +- :ref:`OfxParamPropMin ` - Type: int/double, Dimension: Variable (doc: :c:macro:`kOfxParamPropMin`) +- :ref:`OfxParamPropParent ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxParamPropParent`) +- :ref:`OfxParamPropPersistant ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropPersistant`) +- :ref:`OfxParamPropPluginMayWrite ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropPluginMayWrite`) +- :ref:`OfxParamPropScriptName ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxParamPropScriptName`) +- :ref:`OfxParamPropSecret ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropSecret`) +- :ref:`OfxParamPropType ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxParamPropType`) +- :ref:`OfxPropIcon ` - Type: string, Dimension: 2 (doc: :c:macro:`kOfxPropIcon`) +- :ref:`OfxPropLabel ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropLabel`) +- :ref:`OfxPropLongLabel ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropLongLabel`) +- :ref:`OfxPropName ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropName`) +- :ref:`OfxPropShortLabel ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropShortLabel`) +- :ref:`OfxPropType ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropType`) +- :ref:`kOfxParamPropUseHostOverlayHandle ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropUseHostOverlayHandle`) + +.. _propset_ParamsChoice: + +**ParamsChoice** +^^^^^^^^^^^^ + +- **Write Access**: plugin + +**Properties** + +- :ref:`OfxParamPropAnimates ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropAnimates`) +- :ref:`OfxParamPropCacheInvalidation ` - Type: enum, Dimension: 1 (doc: :c:macro:`kOfxParamPropCacheInvalidation`) +- :ref:`OfxParamPropCanUndo ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropCanUndo`) +- :ref:`OfxParamPropChoiceOption ` - Type: string, Dimension: Variable (doc: :c:macro:`kOfxParamPropChoiceOption`) +- :ref:`OfxParamPropChoiceOrder ` - Type: int, Dimension: Variable (doc: :c:macro:`kOfxParamPropChoiceOrder`) +- :ref:`OfxParamPropDataPtr ` - Type: pointer, Dimension: 1 (doc: :c:macro:`kOfxParamPropDataPtr`) +- :ref:`OfxParamPropDefault ` - Type: int/double/string/pointer, Dimension: Variable (doc: :c:macro:`kOfxParamPropDefault`) +- :ref:`OfxParamPropEnabled ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropEnabled`) +- :ref:`OfxParamPropEvaluateOnChange ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropEvaluateOnChange`) +- :ref:`OfxParamPropHasHostOverlayHandle ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropHasHostOverlayHandle`) +- :ref:`OfxParamPropHint ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxParamPropHint`) +- :ref:`OfxParamPropInteractMinimumSize ` - Type: double, Dimension: 2 (doc: :c:macro:`kOfxParamPropInteractMinimumSize`) +- :ref:`OfxParamPropInteractPreferedSize ` - Type: int, Dimension: 2 (doc: :c:macro:`kOfxParamPropInteractPreferedSize`) +- :ref:`OfxParamPropInteractSize ` - Type: double, Dimension: 2 (doc: :c:macro:`kOfxParamPropInteractSize`) +- :ref:`OfxParamPropInteractSizeAspect ` - Type: double, Dimension: 1 (doc: :c:macro:`kOfxParamPropInteractSizeAspect`) +- :ref:`OfxParamPropInteractV1 ` - Type: pointer, Dimension: 1 (doc: :c:macro:`kOfxParamPropInteractV1`) +- :ref:`OfxParamPropIsAnimating ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropIsAnimating`) +- :ref:`OfxParamPropIsAutoKeying ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropIsAutoKeying`) +- :ref:`OfxParamPropParent ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxParamPropParent`) +- :ref:`OfxParamPropPersistant ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropPersistant`) +- :ref:`OfxParamPropPluginMayWrite ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropPluginMayWrite`) +- :ref:`OfxParamPropScriptName ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxParamPropScriptName`) +- :ref:`OfxParamPropSecret ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropSecret`) +- :ref:`OfxParamPropType ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxParamPropType`) +- :ref:`OfxPropIcon ` - Type: string, Dimension: 2 (doc: :c:macro:`kOfxPropIcon`) +- :ref:`OfxPropLabel ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropLabel`) +- :ref:`OfxPropLongLabel ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropLongLabel`) +- :ref:`OfxPropName ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropName`) +- :ref:`OfxPropShortLabel ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropShortLabel`) +- :ref:`OfxPropType ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropType`) +- :ref:`kOfxParamPropUseHostOverlayHandle ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropUseHostOverlayHandle`) + +.. _propset_ParamsCustom: + +**ParamsCustom** +^^^^^^^^^^^^ + +- **Write Access**: plugin + +**Properties** + +- :ref:`OfxParamPropAnimates ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropAnimates`) +- :ref:`OfxParamPropCacheInvalidation ` - Type: enum, Dimension: 1 (doc: :c:macro:`kOfxParamPropCacheInvalidation`) +- :ref:`OfxParamPropCanUndo ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropCanUndo`) +- :ref:`OfxParamPropCustomCallbackV1 ` - Type: pointer, Dimension: 1 (doc: :c:macro:`kOfxParamPropCustomInterpCallbackV1`) +- :ref:`OfxParamPropDataPtr ` - Type: pointer, Dimension: 1 (doc: :c:macro:`kOfxParamPropDataPtr`) +- :ref:`OfxParamPropDefault ` - Type: int/double/string/pointer, Dimension: Variable (doc: :c:macro:`kOfxParamPropDefault`) +- :ref:`OfxParamPropEnabled ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropEnabled`) +- :ref:`OfxParamPropEvaluateOnChange ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropEvaluateOnChange`) +- :ref:`OfxParamPropHasHostOverlayHandle ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropHasHostOverlayHandle`) +- :ref:`OfxParamPropHint ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxParamPropHint`) +- :ref:`OfxParamPropInteractMinimumSize ` - Type: double, Dimension: 2 (doc: :c:macro:`kOfxParamPropInteractMinimumSize`) +- :ref:`OfxParamPropInteractPreferedSize ` - Type: int, Dimension: 2 (doc: :c:macro:`kOfxParamPropInteractPreferedSize`) +- :ref:`OfxParamPropInteractSize ` - Type: double, Dimension: 2 (doc: :c:macro:`kOfxParamPropInteractSize`) +- :ref:`OfxParamPropInteractSizeAspect ` - Type: double, Dimension: 1 (doc: :c:macro:`kOfxParamPropInteractSizeAspect`) +- :ref:`OfxParamPropInteractV1 ` - Type: pointer, Dimension: 1 (doc: :c:macro:`kOfxParamPropInteractV1`) +- :ref:`OfxParamPropIsAnimating ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropIsAnimating`) +- :ref:`OfxParamPropIsAutoKeying ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropIsAutoKeying`) +- :ref:`OfxParamPropParent ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxParamPropParent`) +- :ref:`OfxParamPropPersistant ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropPersistant`) +- :ref:`OfxParamPropPluginMayWrite ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropPluginMayWrite`) +- :ref:`OfxParamPropScriptName ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxParamPropScriptName`) +- :ref:`OfxParamPropSecret ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropSecret`) +- :ref:`OfxParamPropType ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxParamPropType`) +- :ref:`OfxPropIcon ` - Type: string, Dimension: 2 (doc: :c:macro:`kOfxPropIcon`) +- :ref:`OfxPropLabel ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropLabel`) +- :ref:`OfxPropLongLabel ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropLongLabel`) +- :ref:`OfxPropName ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropName`) +- :ref:`OfxPropShortLabel ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropShortLabel`) +- :ref:`OfxPropType ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropType`) +- :ref:`kOfxParamPropUseHostOverlayHandle ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropUseHostOverlayHandle`) + +.. _propset_ParamsDouble2D3D: + +**ParamsDouble2D3D** +^^^^^^^^^^^^^^^^ + +- **Write Access**: plugin + +**Properties** + +- :ref:`OfxParamPropAnimates ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropAnimates`) +- :ref:`OfxParamPropCacheInvalidation ` - Type: enum, Dimension: 1 (doc: :c:macro:`kOfxParamPropCacheInvalidation`) +- :ref:`OfxParamPropCanUndo ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropCanUndo`) +- :ref:`OfxParamPropDataPtr ` - Type: pointer, Dimension: 1 (doc: :c:macro:`kOfxParamPropDataPtr`) +- :ref:`OfxParamPropDefault ` - Type: int/double/string/pointer, Dimension: Variable (doc: :c:macro:`kOfxParamPropDefault`) +- :ref:`OfxParamPropDigits ` - Type: int, Dimension: 1 (doc: :c:macro:`kOfxParamPropDigits`) +- :ref:`OfxParamPropDisplayMax ` - Type: int/double, Dimension: Variable (doc: :c:macro:`kOfxParamPropDisplayMax`) +- :ref:`OfxParamPropDisplayMin ` - Type: int/double, Dimension: Variable (doc: :c:macro:`kOfxParamPropDisplayMin`) +- :ref:`OfxParamPropDoubleType ` - Type: enum, Dimension: 1 (doc: :c:macro:`kOfxParamPropDoubleType`) +- :ref:`OfxParamPropEnabled ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropEnabled`) +- :ref:`OfxParamPropEvaluateOnChange ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropEvaluateOnChange`) +- :ref:`OfxParamPropHasHostOverlayHandle ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropHasHostOverlayHandle`) +- :ref:`OfxParamPropHint ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxParamPropHint`) +- :ref:`OfxParamPropIncrement ` - Type: double, Dimension: 1 (doc: :c:macro:`kOfxParamPropIncrement`) +- :ref:`OfxParamPropInteractMinimumSize ` - Type: double, Dimension: 2 (doc: :c:macro:`kOfxParamPropInteractMinimumSize`) +- :ref:`OfxParamPropInteractPreferedSize ` - Type: int, Dimension: 2 (doc: :c:macro:`kOfxParamPropInteractPreferedSize`) +- :ref:`OfxParamPropInteractSize ` - Type: double, Dimension: 2 (doc: :c:macro:`kOfxParamPropInteractSize`) +- :ref:`OfxParamPropInteractSizeAspect ` - Type: double, Dimension: 1 (doc: :c:macro:`kOfxParamPropInteractSizeAspect`) +- :ref:`OfxParamPropInteractV1 ` - Type: pointer, Dimension: 1 (doc: :c:macro:`kOfxParamPropInteractV1`) +- :ref:`OfxParamPropIsAnimating ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropIsAnimating`) +- :ref:`OfxParamPropIsAutoKeying ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropIsAutoKeying`) +- :ref:`OfxParamPropMax ` - Type: int/double, Dimension: Variable (doc: :c:macro:`kOfxParamPropMax`) +- :ref:`OfxParamPropMin ` - Type: int/double, Dimension: Variable (doc: :c:macro:`kOfxParamPropMin`) +- :ref:`OfxParamPropParent ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxParamPropParent`) +- :ref:`OfxParamPropPersistant ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropPersistant`) +- :ref:`OfxParamPropPluginMayWrite ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropPluginMayWrite`) +- :ref:`OfxParamPropScriptName ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxParamPropScriptName`) +- :ref:`OfxParamPropSecret ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropSecret`) +- :ref:`OfxParamPropType ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxParamPropType`) +- :ref:`OfxPropIcon ` - Type: string, Dimension: 2 (doc: :c:macro:`kOfxPropIcon`) +- :ref:`OfxPropLabel ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropLabel`) +- :ref:`OfxPropLongLabel ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropLongLabel`) +- :ref:`OfxPropName ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropName`) +- :ref:`OfxPropShortLabel ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropShortLabel`) +- :ref:`OfxPropType ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropType`) +- :ref:`kOfxParamPropUseHostOverlayHandle ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropUseHostOverlayHandle`) + +.. _propset_ParamsGroup: + +**ParamsGroup** +^^^^^^^^^^^ + +- **Write Access**: plugin + +**Properties** + +- :ref:`OfxParamPropDataPtr ` - Type: pointer, Dimension: 1 (doc: :c:macro:`kOfxParamPropDataPtr`) +- :ref:`OfxParamPropEnabled ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropEnabled`) +- :ref:`OfxParamPropGroupOpen ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropGroupOpen`) +- :ref:`OfxParamPropHint ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxParamPropHint`) +- :ref:`OfxParamPropParent ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxParamPropParent`) +- :ref:`OfxParamPropScriptName ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxParamPropScriptName`) +- :ref:`OfxParamPropSecret ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropSecret`) +- :ref:`OfxParamPropType ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxParamPropType`) +- :ref:`OfxPropIcon ` - Type: string, Dimension: 2 (doc: :c:macro:`kOfxPropIcon`) +- :ref:`OfxPropLabel ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropLabel`) +- :ref:`OfxPropLongLabel ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropLongLabel`) +- :ref:`OfxPropName ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropName`) +- :ref:`OfxPropShortLabel ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropShortLabel`) +- :ref:`OfxPropType ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropType`) + +.. _propset_ParamsInt2D3D: + +**ParamsInt2D3D** +^^^^^^^^^^^^^ + +- **Write Access**: plugin + +**Properties** + +- :ref:`OfxParamPropAnimates ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropAnimates`) +- :ref:`OfxParamPropCacheInvalidation ` - Type: enum, Dimension: 1 (doc: :c:macro:`kOfxParamPropCacheInvalidation`) +- :ref:`OfxParamPropCanUndo ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropCanUndo`) +- :ref:`OfxParamPropDataPtr ` - Type: pointer, Dimension: 1 (doc: :c:macro:`kOfxParamPropDataPtr`) +- :ref:`OfxParamPropDefault ` - Type: int/double/string/pointer, Dimension: Variable (doc: :c:macro:`kOfxParamPropDefault`) +- :ref:`OfxParamPropDimensionLabel ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxParamPropDimensionLabel`) +- :ref:`OfxParamPropDisplayMax ` - Type: int/double, Dimension: Variable (doc: :c:macro:`kOfxParamPropDisplayMax`) +- :ref:`OfxParamPropDisplayMin ` - Type: int/double, Dimension: Variable (doc: :c:macro:`kOfxParamPropDisplayMin`) +- :ref:`OfxParamPropEnabled ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropEnabled`) +- :ref:`OfxParamPropEvaluateOnChange ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropEvaluateOnChange`) +- :ref:`OfxParamPropHasHostOverlayHandle ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropHasHostOverlayHandle`) +- :ref:`OfxParamPropHint ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxParamPropHint`) +- :ref:`OfxParamPropInteractMinimumSize ` - Type: double, Dimension: 2 (doc: :c:macro:`kOfxParamPropInteractMinimumSize`) +- :ref:`OfxParamPropInteractPreferedSize ` - Type: int, Dimension: 2 (doc: :c:macro:`kOfxParamPropInteractPreferedSize`) +- :ref:`OfxParamPropInteractSize ` - Type: double, Dimension: 2 (doc: :c:macro:`kOfxParamPropInteractSize`) +- :ref:`OfxParamPropInteractSizeAspect ` - Type: double, Dimension: 1 (doc: :c:macro:`kOfxParamPropInteractSizeAspect`) +- :ref:`OfxParamPropInteractV1 ` - Type: pointer, Dimension: 1 (doc: :c:macro:`kOfxParamPropInteractV1`) +- :ref:`OfxParamPropIsAnimating ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropIsAnimating`) +- :ref:`OfxParamPropIsAutoKeying ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropIsAutoKeying`) +- :ref:`OfxParamPropMax ` - Type: int/double, Dimension: Variable (doc: :c:macro:`kOfxParamPropMax`) +- :ref:`OfxParamPropMin ` - Type: int/double, Dimension: Variable (doc: :c:macro:`kOfxParamPropMin`) +- :ref:`OfxParamPropParent ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxParamPropParent`) +- :ref:`OfxParamPropPersistant ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropPersistant`) +- :ref:`OfxParamPropPluginMayWrite ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropPluginMayWrite`) +- :ref:`OfxParamPropScriptName ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxParamPropScriptName`) +- :ref:`OfxParamPropSecret ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropSecret`) +- :ref:`OfxParamPropType ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxParamPropType`) +- :ref:`OfxPropIcon ` - Type: string, Dimension: 2 (doc: :c:macro:`kOfxPropIcon`) +- :ref:`OfxPropLabel ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropLabel`) +- :ref:`OfxPropLongLabel ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropLongLabel`) +- :ref:`OfxPropName ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropName`) +- :ref:`OfxPropShortLabel ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropShortLabel`) +- :ref:`OfxPropType ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropType`) +- :ref:`kOfxParamPropUseHostOverlayHandle ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropUseHostOverlayHandle`) + +.. _propset_ParamsNormalizedSpatial: + +**ParamsNormalizedSpatial** +^^^^^^^^^^^^^^^^^^^^^^^ + +- **Write Access**: plugin + +**Properties** + +- :ref:`OfxParamPropAnimates ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropAnimates`) +- :ref:`OfxParamPropCacheInvalidation ` - Type: enum, Dimension: 1 (doc: :c:macro:`kOfxParamPropCacheInvalidation`) +- :ref:`OfxParamPropCanUndo ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropCanUndo`) +- :ref:`OfxParamPropDataPtr ` - Type: pointer, Dimension: 1 (doc: :c:macro:`kOfxParamPropDataPtr`) +- :ref:`OfxParamPropDefault ` - Type: int/double/string/pointer, Dimension: Variable (doc: :c:macro:`kOfxParamPropDefault`) +- :ref:`OfxParamPropDefaultCoordinateSystem ` - Type: enum, Dimension: 1 (doc: :c:macro:`kOfxParamPropDefaultCoordinateSystem`) +- :ref:`OfxParamPropDigits ` - Type: int, Dimension: 1 (doc: :c:macro:`kOfxParamPropDigits`) +- :ref:`OfxParamPropDisplayMax ` - Type: int/double, Dimension: Variable (doc: :c:macro:`kOfxParamPropDisplayMax`) +- :ref:`OfxParamPropDisplayMin ` - Type: int/double, Dimension: Variable (doc: :c:macro:`kOfxParamPropDisplayMin`) +- :ref:`OfxParamPropEnabled ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropEnabled`) +- :ref:`OfxParamPropEvaluateOnChange ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropEvaluateOnChange`) +- :ref:`OfxParamPropHasHostOverlayHandle ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropHasHostOverlayHandle`) +- :ref:`OfxParamPropHint ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxParamPropHint`) +- :ref:`OfxParamPropIncrement ` - Type: double, Dimension: 1 (doc: :c:macro:`kOfxParamPropIncrement`) +- :ref:`OfxParamPropInteractMinimumSize ` - Type: double, Dimension: 2 (doc: :c:macro:`kOfxParamPropInteractMinimumSize`) +- :ref:`OfxParamPropInteractPreferedSize ` - Type: int, Dimension: 2 (doc: :c:macro:`kOfxParamPropInteractPreferedSize`) +- :ref:`OfxParamPropInteractSize ` - Type: double, Dimension: 2 (doc: :c:macro:`kOfxParamPropInteractSize`) +- :ref:`OfxParamPropInteractSizeAspect ` - Type: double, Dimension: 1 (doc: :c:macro:`kOfxParamPropInteractSizeAspect`) +- :ref:`OfxParamPropInteractV1 ` - Type: pointer, Dimension: 1 (doc: :c:macro:`kOfxParamPropInteractV1`) +- :ref:`OfxParamPropIsAnimating ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropIsAnimating`) +- :ref:`OfxParamPropIsAutoKeying ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropIsAutoKeying`) +- :ref:`OfxParamPropMax ` - Type: int/double, Dimension: Variable (doc: :c:macro:`kOfxParamPropMax`) +- :ref:`OfxParamPropMin ` - Type: int/double, Dimension: Variable (doc: :c:macro:`kOfxParamPropMin`) +- :ref:`OfxParamPropParent ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxParamPropParent`) +- :ref:`OfxParamPropPersistant ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropPersistant`) +- :ref:`OfxParamPropPluginMayWrite ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropPluginMayWrite`) +- :ref:`OfxParamPropScriptName ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxParamPropScriptName`) +- :ref:`OfxParamPropSecret ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropSecret`) +- :ref:`OfxParamPropType ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxParamPropType`) +- :ref:`OfxPropIcon ` - Type: string, Dimension: 2 (doc: :c:macro:`kOfxPropIcon`) +- :ref:`OfxPropLabel ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropLabel`) +- :ref:`OfxPropLongLabel ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropLongLabel`) +- :ref:`OfxPropName ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropName`) +- :ref:`OfxPropShortLabel ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropShortLabel`) +- :ref:`OfxPropType ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropType`) +- :ref:`kOfxParamPropUseHostOverlayHandle ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropUseHostOverlayHandle`) + +.. _propset_ParamsPage: + +**ParamsPage** +^^^^^^^^^^ + +- **Write Access**: plugin + +**Properties** + +- :ref:`OfxParamPropDataPtr ` - Type: pointer, Dimension: 1 (doc: :c:macro:`kOfxParamPropDataPtr`) +- :ref:`OfxParamPropEnabled ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropEnabled`) +- :ref:`OfxParamPropHint ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxParamPropHint`) +- :ref:`OfxParamPropPageChild ` - Type: string, Dimension: Variable (doc: :c:macro:`kOfxParamPropPageChild`) +- :ref:`OfxParamPropParent ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxParamPropParent`) +- :ref:`OfxParamPropScriptName ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxParamPropScriptName`) +- :ref:`OfxParamPropSecret ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropSecret`) +- :ref:`OfxParamPropType ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxParamPropType`) +- :ref:`OfxPropIcon ` - Type: string, Dimension: 2 (doc: :c:macro:`kOfxPropIcon`) +- :ref:`OfxPropLabel ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropLabel`) +- :ref:`OfxPropLongLabel ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropLongLabel`) +- :ref:`OfxPropName ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropName`) +- :ref:`OfxPropShortLabel ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropShortLabel`) +- :ref:`OfxPropType ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropType`) + +.. _propset_ParamsParametric: + +**ParamsParametric** +^^^^^^^^^^^^^^^^ + +- **Write Access**: plugin + +**Properties** + +- :ref:`OfxParamPropAnimates ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropAnimates`) +- :ref:`OfxParamPropAnimates ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropAnimates`) +- :ref:`OfxParamPropCacheInvalidation ` - Type: enum, Dimension: 1 (doc: :c:macro:`kOfxParamPropCacheInvalidation`) +- :ref:`OfxParamPropCacheInvalidation ` - Type: enum, Dimension: 1 (doc: :c:macro:`kOfxParamPropCacheInvalidation`) +- :ref:`OfxParamPropCanUndo ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropCanUndo`) +- :ref:`OfxParamPropCanUndo ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropCanUndo`) +- :ref:`OfxParamPropDataPtr ` - Type: pointer, Dimension: 1 (doc: :c:macro:`kOfxParamPropDataPtr`) +- :ref:`OfxParamPropDefault ` - Type: int/double/string/pointer, Dimension: Variable (doc: :c:macro:`kOfxParamPropDefault`) +- :ref:`OfxParamPropEnabled ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropEnabled`) +- :ref:`OfxParamPropEvaluateOnChange ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropEvaluateOnChange`) +- :ref:`OfxParamPropEvaluateOnChange ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropEvaluateOnChange`) +- :ref:`OfxParamPropHasHostOverlayHandle ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropHasHostOverlayHandle`) +- :ref:`OfxParamPropHint ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxParamPropHint`) +- :ref:`OfxParamPropInteractMinimumSize ` - Type: double, Dimension: 2 (doc: :c:macro:`kOfxParamPropInteractMinimumSize`) +- :ref:`OfxParamPropInteractPreferedSize ` - Type: int, Dimension: 2 (doc: :c:macro:`kOfxParamPropInteractPreferedSize`) +- :ref:`OfxParamPropInteractSize ` - Type: double, Dimension: 2 (doc: :c:macro:`kOfxParamPropInteractSize`) +- :ref:`OfxParamPropInteractSizeAspect ` - Type: double, Dimension: 1 (doc: :c:macro:`kOfxParamPropInteractSizeAspect`) +- :ref:`OfxParamPropInteractV1 ` - Type: pointer, Dimension: 1 (doc: :c:macro:`kOfxParamPropInteractV1`) +- :ref:`OfxParamPropIsAnimating ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropIsAnimating`) +- :ref:`OfxParamPropIsAnimating ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropIsAnimating`) +- :ref:`OfxParamPropIsAutoKeying ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropIsAutoKeying`) +- :ref:`OfxParamPropIsAutoKeying ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropIsAutoKeying`) +- :ref:`OfxParamPropParametricDimension ` - Type: int, Dimension: 1 (doc: :c:macro:`kOfxParamPropParametricDimension`) +- :ref:`OfxParamPropParametricInteractBackground ` - Type: pointer, Dimension: 1 (doc: :c:macro:`kOfxParamPropParametricInteractBackground`) +- :ref:`OfxParamPropParametricRange ` - Type: double, Dimension: 2 (doc: :c:macro:`kOfxParamPropParametricRange`) +- :ref:`OfxParamPropParametricUIColour ` - Type: double, Dimension: Variable (doc: :c:macro:`kOfxParamPropParametricUIColour`) +- :ref:`OfxParamPropParent ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxParamPropParent`) +- :ref:`OfxParamPropPersistant ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropPersistant`) +- :ref:`OfxParamPropPersistant ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropPersistant`) +- :ref:`OfxParamPropPluginMayWrite ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropPluginMayWrite`) +- :ref:`OfxParamPropPluginMayWrite ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropPluginMayWrite`) +- :ref:`OfxParamPropScriptName ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxParamPropScriptName`) +- :ref:`OfxParamPropSecret ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropSecret`) +- :ref:`OfxParamPropType ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxParamPropType`) +- :ref:`OfxPropIcon ` - Type: string, Dimension: 2 (doc: :c:macro:`kOfxPropIcon`) +- :ref:`OfxPropLabel ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropLabel`) +- :ref:`OfxPropLongLabel ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropLongLabel`) +- :ref:`OfxPropName ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropName`) +- :ref:`OfxPropShortLabel ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropShortLabel`) +- :ref:`OfxPropType ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropType`) +- :ref:`kOfxParamPropUseHostOverlayHandle ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropUseHostOverlayHandle`) + +.. _propset_ParamsStrChoice: + +**ParamsStrChoice** +^^^^^^^^^^^^^^^ + +- **Write Access**: plugin + +**Properties** + +- :ref:`OfxParamPropAnimates ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropAnimates`) +- :ref:`OfxParamPropCacheInvalidation ` - Type: enum, Dimension: 1 (doc: :c:macro:`kOfxParamPropCacheInvalidation`) +- :ref:`OfxParamPropCanUndo ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropCanUndo`) +- :ref:`OfxParamPropChoiceEnum ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropChoiceEnum`) +- :ref:`OfxParamPropChoiceOption ` - Type: string, Dimension: Variable (doc: :c:macro:`kOfxParamPropChoiceOption`) +- :ref:`OfxParamPropDataPtr ` - Type: pointer, Dimension: 1 (doc: :c:macro:`kOfxParamPropDataPtr`) +- :ref:`OfxParamPropDefault ` - Type: int/double/string/pointer, Dimension: Variable (doc: :c:macro:`kOfxParamPropDefault`) +- :ref:`OfxParamPropEnabled ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropEnabled`) +- :ref:`OfxParamPropEvaluateOnChange ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropEvaluateOnChange`) +- :ref:`OfxParamPropHasHostOverlayHandle ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropHasHostOverlayHandle`) +- :ref:`OfxParamPropHint ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxParamPropHint`) +- :ref:`OfxParamPropInteractMinimumSize ` - Type: double, Dimension: 2 (doc: :c:macro:`kOfxParamPropInteractMinimumSize`) +- :ref:`OfxParamPropInteractPreferedSize ` - Type: int, Dimension: 2 (doc: :c:macro:`kOfxParamPropInteractPreferedSize`) +- :ref:`OfxParamPropInteractSize ` - Type: double, Dimension: 2 (doc: :c:macro:`kOfxParamPropInteractSize`) +- :ref:`OfxParamPropInteractSizeAspect ` - Type: double, Dimension: 1 (doc: :c:macro:`kOfxParamPropInteractSizeAspect`) +- :ref:`OfxParamPropInteractV1 ` - Type: pointer, Dimension: 1 (doc: :c:macro:`kOfxParamPropInteractV1`) +- :ref:`OfxParamPropIsAnimating ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropIsAnimating`) +- :ref:`OfxParamPropIsAutoKeying ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropIsAutoKeying`) +- :ref:`OfxParamPropParent ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxParamPropParent`) +- :ref:`OfxParamPropPersistant ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropPersistant`) +- :ref:`OfxParamPropPluginMayWrite ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropPluginMayWrite`) +- :ref:`OfxParamPropScriptName ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxParamPropScriptName`) +- :ref:`OfxParamPropSecret ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropSecret`) +- :ref:`OfxParamPropType ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxParamPropType`) +- :ref:`OfxPropIcon ` - Type: string, Dimension: 2 (doc: :c:macro:`kOfxPropIcon`) +- :ref:`OfxPropLabel ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropLabel`) +- :ref:`OfxPropLongLabel ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropLongLabel`) +- :ref:`OfxPropName ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropName`) +- :ref:`OfxPropShortLabel ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropShortLabel`) +- :ref:`OfxPropType ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropType`) +- :ref:`kOfxParamPropUseHostOverlayHandle ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropUseHostOverlayHandle`) + +.. _propset_ParamsString: + +**ParamsString** +^^^^^^^^^^^^ + +- **Write Access**: plugin + +**Properties** + +- :ref:`OfxParamPropAnimates ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropAnimates`) +- :ref:`OfxParamPropCacheInvalidation ` - Type: enum, Dimension: 1 (doc: :c:macro:`kOfxParamPropCacheInvalidation`) +- :ref:`OfxParamPropCanUndo ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropCanUndo`) +- :ref:`OfxParamPropDataPtr ` - Type: pointer, Dimension: 1 (doc: :c:macro:`kOfxParamPropDataPtr`) +- :ref:`OfxParamPropDefault ` - Type: int/double/string/pointer, Dimension: Variable (doc: :c:macro:`kOfxParamPropDefault`) +- :ref:`OfxParamPropDisplayMax ` - Type: int/double, Dimension: Variable (doc: :c:macro:`kOfxParamPropDisplayMax`) +- :ref:`OfxParamPropDisplayMin ` - Type: int/double, Dimension: Variable (doc: :c:macro:`kOfxParamPropDisplayMin`) +- :ref:`OfxParamPropEnabled ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropEnabled`) +- :ref:`OfxParamPropEvaluateOnChange ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropEvaluateOnChange`) +- :ref:`OfxParamPropHasHostOverlayHandle ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropHasHostOverlayHandle`) +- :ref:`OfxParamPropHint ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxParamPropHint`) +- :ref:`OfxParamPropInteractMinimumSize ` - Type: double, Dimension: 2 (doc: :c:macro:`kOfxParamPropInteractMinimumSize`) +- :ref:`OfxParamPropInteractPreferedSize ` - Type: int, Dimension: 2 (doc: :c:macro:`kOfxParamPropInteractPreferedSize`) +- :ref:`OfxParamPropInteractSize ` - Type: double, Dimension: 2 (doc: :c:macro:`kOfxParamPropInteractSize`) +- :ref:`OfxParamPropInteractSizeAspect ` - Type: double, Dimension: 1 (doc: :c:macro:`kOfxParamPropInteractSizeAspect`) +- :ref:`OfxParamPropInteractV1 ` - Type: pointer, Dimension: 1 (doc: :c:macro:`kOfxParamPropInteractV1`) +- :ref:`OfxParamPropIsAnimating ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropIsAnimating`) +- :ref:`OfxParamPropIsAutoKeying ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropIsAutoKeying`) +- :ref:`OfxParamPropMax ` - Type: int/double, Dimension: Variable (doc: :c:macro:`kOfxParamPropMax`) +- :ref:`OfxParamPropMin ` - Type: int/double, Dimension: Variable (doc: :c:macro:`kOfxParamPropMin`) +- :ref:`OfxParamPropParent ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxParamPropParent`) +- :ref:`OfxParamPropPersistant ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropPersistant`) +- :ref:`OfxParamPropPluginMayWrite ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropPluginMayWrite`) +- :ref:`OfxParamPropScriptName ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxParamPropScriptName`) +- :ref:`OfxParamPropSecret ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropSecret`) +- :ref:`OfxParamPropStringFilePathExists ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropStringFilePathExists`) +- :ref:`OfxParamPropStringMode ` - Type: enum, Dimension: 1 (doc: :c:macro:`kOfxParamPropStringMode`) +- :ref:`OfxParamPropType ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxParamPropType`) +- :ref:`OfxPropIcon ` - Type: string, Dimension: 2 (doc: :c:macro:`kOfxPropIcon`) +- :ref:`OfxPropLabel ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropLabel`) +- :ref:`OfxPropLongLabel ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropLongLabel`) +- :ref:`OfxPropName ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropName`) +- :ref:`OfxPropShortLabel ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropShortLabel`) +- :ref:`OfxPropType ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxPropType`) +- :ref:`kOfxParamPropUseHostOverlayHandle ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxParamPropUseHostOverlayHandle`) + + +Actions Property Sets +------------------- + +Actions in OFX have input and output property sets that are used to pass data between the host and plugin. +For each action, the required input properties (passed from host to plugin) and output properties (set by the plugin for the host to read) are documented. + +**Actions Quick Reference** + +* :ref:`CustomParamInterpFunc ` +* :ref:`OfxActionBeginInstanceChanged ` +* :ref:`OfxActionBeginInstanceEdit ` +* :ref:`OfxActionCreateInstance ` +* :ref:`OfxActionDescribe ` +* :ref:`OfxActionDestroyInstance ` +* :ref:`OfxActionEndInstanceChanged ` +* :ref:`OfxActionEndInstanceEdit ` +* :ref:`OfxActionInstanceChanged ` +* :ref:`OfxActionLoad ` +* :ref:`OfxActionPurgeCaches ` +* :ref:`OfxActionSyncPrivateData ` +* :ref:`OfxActionUnload ` +* :ref:`OfxImageEffectActionBeginSequenceRender ` +* :ref:`OfxImageEffectActionDescribeInContext ` +* :ref:`OfxImageEffectActionEndSequenceRender ` +* :ref:`OfxImageEffectActionGetClipPreferences ` +* :ref:`OfxImageEffectActionGetFramesNeeded ` +* :ref:`OfxImageEffectActionGetOutputColourspace ` +* :ref:`OfxImageEffectActionGetRegionOfDefinition ` +* :ref:`OfxImageEffectActionGetRegionsOfInterest ` +* :ref:`OfxImageEffectActionGetTimeDomain ` +* :ref:`OfxImageEffectActionIsIdentity ` +* :ref:`OfxImageEffectActionRender ` +* :ref:`OfxInteractActionDraw ` +* :ref:`OfxInteractActionGainFocus ` +* :ref:`OfxInteractActionKeyDown ` +* :ref:`OfxInteractActionKeyRepeat ` +* :ref:`OfxInteractActionKeyUp ` +* :ref:`OfxInteractActionLoseFocus ` +* :ref:`OfxInteractActionPenDown ` +* :ref:`OfxInteractActionPenMotion ` +* :ref:`OfxInteractActionPenUp ` + +.. _action_CustomParamInterpFunc: + +**CustomParamInterpFunc** +^^^^^^^^^^^^^^^^^^^^^ + +**Input Arguments** + +- :ref:`OfxParamPropCustomValue ` - Type: string, Dimension: 2 (:c:macro:`kOfxParamPropCustomValue`) + +- :ref:`OfxParamPropInterpolationTime ` - Type: double, Dimension: 2 (:c:macro:`kOfxParamPropInterpolationTime`) + +- :ref:`OfxParamPropInterpolationAmount ` - Type: double, Dimension: 1 (:c:macro:`kOfxParamPropInterpolationAmount`) + +**Output Arguments** + +- :ref:`OfxParamPropCustomValue ` - Type: string, Dimension: 2 (doc: :c:macro:`kOfxParamPropCustomValue`) + +- :ref:`OfxParamPropInterpolationTime ` - Type: double, Dimension: 2 (doc: :c:macro:`kOfxParamPropInterpolationTime`) + +.. _action_OfxActionBeginInstanceChanged: + +**OfxActionBeginInstanceChanged** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +**Input Arguments** + +- :ref:`OfxPropChangeReason ` - Type: enum, Dimension: 1 (:c:macro:`kOfxPropChangeReason`) + +.. _action_OfxActionBeginInstanceEdit: + +**OfxActionBeginInstanceEdit** +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +-- no in/out args -- + +.. _action_OfxActionCreateInstance: + +**OfxActionCreateInstance** +^^^^^^^^^^^^^^^^^^^^^^^ + +-- no in/out args -- + +.. _action_OfxActionDescribe: + +**OfxActionDescribe** +^^^^^^^^^^^^^^^^^ + +-- no in/out args -- + +.. _action_OfxActionDestroyInstance: + +**OfxActionDestroyInstance** +^^^^^^^^^^^^^^^^^^^^^^^^ + +-- no in/out args -- + +.. _action_OfxActionEndInstanceChanged: + +**OfxActionEndInstanceChanged** +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +**Input Arguments** + +- :ref:`OfxPropChangeReason ` - Type: enum, Dimension: 1 (:c:macro:`kOfxPropChangeReason`) + +.. _action_OfxActionEndInstanceEdit: + +**OfxActionEndInstanceEdit** +^^^^^^^^^^^^^^^^^^^^^^^^ + +-- no in/out args -- + +.. _action_OfxActionInstanceChanged: + +**OfxActionInstanceChanged** +^^^^^^^^^^^^^^^^^^^^^^^^ + +**Input Arguments** + +- :ref:`OfxPropType ` - Type: string, Dimension: 1 (:c:macro:`kOfxPropType`) + +- :ref:`OfxPropName ` - Type: string, Dimension: 1 (:c:macro:`kOfxPropName`) + +- :ref:`OfxPropChangeReason ` - Type: enum, Dimension: 1 (:c:macro:`kOfxPropChangeReason`) + +- :ref:`OfxPropTime ` - Type: double, Dimension: 1 (:c:macro:`kOfxPropTime`) + +- :ref:`OfxImageEffectPropRenderScale ` - Type: double, Dimension: 2 (:c:macro:`kOfxImageEffectPropRenderScale`) + +.. _action_OfxActionLoad: + +**OfxActionLoad** +^^^^^^^^^^^^^ + +-- no in/out args -- + +.. _action_OfxActionPurgeCaches: + +**OfxActionPurgeCaches** +^^^^^^^^^^^^^^^^^^^^ + +-- no in/out args -- + +.. _action_OfxActionSyncPrivateData: + +**OfxActionSyncPrivateData** +^^^^^^^^^^^^^^^^^^^^^^^^ + +-- no in/out args -- + +.. _action_OfxActionUnload: + +**OfxActionUnload** +^^^^^^^^^^^^^^^ + +-- no in/out args -- + +.. _action_OfxImageEffectActionBeginSequenceRender: + +**OfxImageEffectActionBeginSequenceRender** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +**Input Arguments** + +- :ref:`OfxImageEffectPropFrameRange ` - Type: double, Dimension: 2 (:c:macro:`kOfxImageEffectPropFrameRange`) + +- :ref:`OfxImageEffectPropFrameStep ` - Type: double, Dimension: 1 (:c:macro:`kOfxImageEffectPropFrameStep`) + +- :ref:`OfxPropIsInteractive ` - Type: bool, Dimension: 1 (:c:macro:`kOfxPropIsInteractive`) + +- :ref:`OfxImageEffectPropRenderScale ` - Type: double, Dimension: 2 (:c:macro:`kOfxImageEffectPropRenderScale`) + +- :ref:`OfxImageEffectPropSequentialRenderStatus ` - Type: bool, Dimension: 1 (:c:macro:`kOfxImageEffectPropSequentialRenderStatus`) + +- :ref:`OfxImageEffectPropInteractiveRenderStatus ` - Type: bool, Dimension: 1 (:c:macro:`kOfxImageEffectPropInteractiveRenderStatus`) + +- :ref:`OfxImageEffectPropCudaEnabled ` - Type: bool, Dimension: 1 (:c:macro:`kOfxImageEffectPropCudaEnabled`) + +- :ref:`OfxImageEffectPropCudaRenderSupported ` - Type: enum, Dimension: 1 (:c:macro:`kOfxImageEffectPropCudaRenderSupported`) + +- :ref:`OfxImageEffectPropCudaStream ` - Type: pointer, Dimension: 1 (:c:macro:`kOfxImageEffectPropCudaStream`) + +- :ref:`OfxImageEffectPropCudaStreamSupported ` - Type: enum, Dimension: 1 (:c:macro:`kOfxImageEffectPropCudaStreamSupported`) + +- :ref:`OfxImageEffectPropMetalCommandQueue ` - Type: pointer, Dimension: 1 (:c:macro:`kOfxImageEffectPropMetalCommandQueue`) + +- :ref:`OfxImageEffectPropMetalEnabled ` - Type: bool, Dimension: 1 (:c:macro:`kOfxImageEffectPropMetalEnabled`) + +- :ref:`OfxImageEffectPropMetalRenderSupported ` - Type: enum, Dimension: 1 (:c:macro:`kOfxImageEffectPropMetalRenderSupported`) + +- :ref:`OfxImageEffectPropOpenCLCommandQueue ` - Type: pointer, Dimension: 1 (:c:macro:`kOfxImageEffectPropOpenCLCommandQueue`) + +- :ref:`OfxImageEffectPropOpenCLEnabled ` - Type: bool, Dimension: 1 (:c:macro:`kOfxImageEffectPropOpenCLEnabled`) + +- :ref:`OfxImageEffectPropOpenCLImage ` - Type: pointer, Dimension: 1 (:c:macro:`kOfxImageEffectPropOpenCLImage`) + +- :ref:`OfxImageEffectPropOpenCLRenderSupported ` - Type: enum, Dimension: 1 (:c:macro:`kOfxImageEffectPropOpenCLRenderSupported`) + +- :ref:`OfxImageEffectPropOpenCLSupported ` - Type: enum, Dimension: 1 (:c:macro:`kOfxImageEffectPropOpenCLSupported`) + +- :ref:`OfxImageEffectPropOpenGLEnabled ` - Type: bool, Dimension: 1 (:c:macro:`kOfxImageEffectPropOpenGLEnabled`) + +- :ref:`OfxImageEffectPropOpenGLTextureIndex ` - Type: int, Dimension: 1 (:c:macro:`kOfxImageEffectPropOpenGLTextureIndex`) + +- :ref:`OfxImageEffectPropOpenGLTextureTarget ` - Type: int, Dimension: 1 (:c:macro:`kOfxImageEffectPropOpenGLTextureTarget`) + +- :ref:`OfxImageEffectPropInteractiveRenderStatus ` - Type: bool, Dimension: 1 (:c:macro:`kOfxImageEffectPropInteractiveRenderStatus`) + +.. _action_OfxImageEffectActionDescribeInContext: + +**OfxImageEffectActionDescribeInContext** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +**Input Arguments** + +- :ref:`OfxImageEffectPropContext ` - Type: enum, Dimension: 1 (:c:macro:`kOfxImageEffectPropContext`) + +.. _action_OfxImageEffectActionEndSequenceRender: + +**OfxImageEffectActionEndSequenceRender** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +**Input Arguments** + +- :ref:`OfxImageEffectPropFrameRange ` - Type: double, Dimension: 2 (:c:macro:`kOfxImageEffectPropFrameRange`) + +- :ref:`OfxImageEffectPropFrameStep ` - Type: double, Dimension: 1 (:c:macro:`kOfxImageEffectPropFrameStep`) + +- :ref:`OfxPropIsInteractive ` - Type: bool, Dimension: 1 (:c:macro:`kOfxPropIsInteractive`) + +- :ref:`OfxImageEffectPropRenderScale ` - Type: double, Dimension: 2 (:c:macro:`kOfxImageEffectPropRenderScale`) + +- :ref:`OfxImageEffectPropSequentialRenderStatus ` - Type: bool, Dimension: 1 (:c:macro:`kOfxImageEffectPropSequentialRenderStatus`) + +- :ref:`OfxImageEffectPropInteractiveRenderStatus ` - Type: bool, Dimension: 1 (:c:macro:`kOfxImageEffectPropInteractiveRenderStatus`) + +- :ref:`OfxImageEffectPropCudaEnabled ` - Type: bool, Dimension: 1 (:c:macro:`kOfxImageEffectPropCudaEnabled`) + +- :ref:`OfxImageEffectPropCudaRenderSupported ` - Type: enum, Dimension: 1 (:c:macro:`kOfxImageEffectPropCudaRenderSupported`) + +- :ref:`OfxImageEffectPropCudaStream ` - Type: pointer, Dimension: 1 (:c:macro:`kOfxImageEffectPropCudaStream`) + +- :ref:`OfxImageEffectPropCudaStreamSupported ` - Type: enum, Dimension: 1 (:c:macro:`kOfxImageEffectPropCudaStreamSupported`) + +- :ref:`OfxImageEffectPropMetalCommandQueue ` - Type: pointer, Dimension: 1 (:c:macro:`kOfxImageEffectPropMetalCommandQueue`) + +- :ref:`OfxImageEffectPropMetalEnabled ` - Type: bool, Dimension: 1 (:c:macro:`kOfxImageEffectPropMetalEnabled`) + +- :ref:`OfxImageEffectPropMetalRenderSupported ` - Type: enum, Dimension: 1 (:c:macro:`kOfxImageEffectPropMetalRenderSupported`) + +- :ref:`OfxImageEffectPropOpenCLCommandQueue ` - Type: pointer, Dimension: 1 (:c:macro:`kOfxImageEffectPropOpenCLCommandQueue`) + +- :ref:`OfxImageEffectPropOpenCLEnabled ` - Type: bool, Dimension: 1 (:c:macro:`kOfxImageEffectPropOpenCLEnabled`) + +- :ref:`OfxImageEffectPropOpenCLImage ` - Type: pointer, Dimension: 1 (:c:macro:`kOfxImageEffectPropOpenCLImage`) + +- :ref:`OfxImageEffectPropOpenCLRenderSupported ` - Type: enum, Dimension: 1 (:c:macro:`kOfxImageEffectPropOpenCLRenderSupported`) + +- :ref:`OfxImageEffectPropOpenCLSupported ` - Type: enum, Dimension: 1 (:c:macro:`kOfxImageEffectPropOpenCLSupported`) + +- :ref:`OfxImageEffectPropOpenGLEnabled ` - Type: bool, Dimension: 1 (:c:macro:`kOfxImageEffectPropOpenGLEnabled`) + +- :ref:`OfxImageEffectPropOpenGLTextureIndex ` - Type: int, Dimension: 1 (:c:macro:`kOfxImageEffectPropOpenGLTextureIndex`) + +- :ref:`OfxImageEffectPropOpenGLTextureTarget ` - Type: int, Dimension: 1 (:c:macro:`kOfxImageEffectPropOpenGLTextureTarget`) + +- :ref:`OfxImageEffectPropInteractiveRenderStatus ` - Type: bool, Dimension: 1 (:c:macro:`kOfxImageEffectPropInteractiveRenderStatus`) + +.. _action_OfxImageEffectActionGetClipPreferences: + +**OfxImageEffectActionGetClipPreferences** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +**Output Arguments** + +- :ref:`OfxImageEffectPropFrameRate ` - Type: double, Dimension: 1 (doc: :c:macro:`kOfxImageEffectPropFrameRate`) + +- :ref:`OfxImageClipPropFieldOrder ` - Type: enum, Dimension: 1 (doc: :c:macro:`kOfxImageClipPropFieldOrder`) + +- :ref:`OfxImageEffectPropPreMultiplication ` - Type: enum, Dimension: 1 (doc: :c:macro:`kOfxImageEffectPropPreMultiplication`) + +- :ref:`OfxImageClipPropContinuousSamples ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxImageClipPropContinuousSamples`) + +- :ref:`OfxImageEffectFrameVarying ` - Type: bool, Dimension: 1 (doc: :c:macro:`kOfxImageEffectFrameVarying`) + +.. _action_OfxImageEffectActionGetFramesNeeded: + +**OfxImageEffectActionGetFramesNeeded** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +**Input Arguments** + +- :ref:`OfxPropTime ` - Type: double, Dimension: 1 (:c:macro:`kOfxPropTime`) + +**Output Arguments** + +- :ref:`OfxImageEffectPropFrameRange ` - Type: double, Dimension: 2 (doc: :c:macro:`kOfxImageEffectPropFrameRange`) + +.. _action_OfxImageEffectActionGetOutputColourspace: + +**OfxImageEffectActionGetOutputColourspace** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +**Input Arguments** + +- :ref:`OfxImageClipPropPreferredColourspaces ` - Type: string, Dimension: Variable (:c:macro:`kOfxImageClipPropPreferredColourspaces`) + +**Output Arguments** + +- :ref:`OfxImageClipPropColourspace ` - Type: string, Dimension: 1 (doc: :c:macro:`kOfxImageClipPropColourspace`) + +.. _action_OfxImageEffectActionGetRegionOfDefinition: + +**OfxImageEffectActionGetRegionOfDefinition** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +**Input Arguments** + +- :ref:`OfxPropTime ` - Type: double, Dimension: 1 (:c:macro:`kOfxPropTime`) + +- :ref:`OfxImageEffectPropRenderScale ` - Type: double, Dimension: 2 (:c:macro:`kOfxImageEffectPropRenderScale`) + +**Output Arguments** + +- :ref:`OfxImageEffectPropRegionOfDefinition ` - Type: double, Dimension: 4 (doc: :c:macro:`kOfxImageEffectPropRegionOfDefinition`) + +.. _action_OfxImageEffectActionGetRegionsOfInterest: + +**OfxImageEffectActionGetRegionsOfInterest** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +**Input Arguments** + +- :ref:`OfxPropTime ` - Type: double, Dimension: 1 (:c:macro:`kOfxPropTime`) + +- :ref:`OfxImageEffectPropRenderScale ` - Type: double, Dimension: 2 (:c:macro:`kOfxImageEffectPropRenderScale`) + +- :ref:`OfxImageEffectPropRegionOfInterest ` - Type: double, Dimension: 4 (:c:macro:`kOfxImageEffectPropRegionOfInterest`) + +.. _action_OfxImageEffectActionGetTimeDomain: + +**OfxImageEffectActionGetTimeDomain** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +**Output Arguments** + +- :ref:`OfxImageEffectPropFrameRange ` - Type: double, Dimension: 2 (doc: :c:macro:`kOfxImageEffectPropFrameRange`) + +.. _action_OfxImageEffectActionIsIdentity: + +**OfxImageEffectActionIsIdentity** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +**Input Arguments** + +- :ref:`OfxPropTime ` - Type: double, Dimension: 1 (:c:macro:`kOfxPropTime`) + +- :ref:`OfxImageEffectPropFieldToRender ` - Type: enum, Dimension: 1 (:c:macro:`kOfxImageEffectPropFieldToRender`) + +- :ref:`OfxImageEffectPropRenderWindow ` - Type: int, Dimension: 4 (:c:macro:`kOfxImageEffectPropRenderWindow`) + +- :ref:`OfxImageEffectPropRenderScale ` - Type: double, Dimension: 2 (:c:macro:`kOfxImageEffectPropRenderScale`) + +.. _action_OfxImageEffectActionRender: + +**OfxImageEffectActionRender** +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +**Input Arguments** + +- :ref:`OfxPropTime ` - Type: double, Dimension: 1 (:c:macro:`kOfxPropTime`) + +- :ref:`OfxImageEffectPropSequentialRenderStatus ` - Type: bool, Dimension: 1 (:c:macro:`kOfxImageEffectPropSequentialRenderStatus`) + +- :ref:`OfxImageEffectPropInteractiveRenderStatus ` - Type: bool, Dimension: 1 (:c:macro:`kOfxImageEffectPropInteractiveRenderStatus`) + +- :ref:`OfxImageEffectPropRenderQualityDraft ` - Type: bool, Dimension: 1 (:c:macro:`kOfxImageEffectPropRenderQualityDraft`) + +- :ref:`OfxImageEffectPropCudaEnabled ` - Type: bool, Dimension: 1 (:c:macro:`kOfxImageEffectPropCudaEnabled`) + +- :ref:`OfxImageEffectPropCudaRenderSupported ` - Type: enum, Dimension: 1 (:c:macro:`kOfxImageEffectPropCudaRenderSupported`) + +- :ref:`OfxImageEffectPropCudaStream ` - Type: pointer, Dimension: 1 (:c:macro:`kOfxImageEffectPropCudaStream`) + +- :ref:`OfxImageEffectPropCudaStreamSupported ` - Type: enum, Dimension: 1 (:c:macro:`kOfxImageEffectPropCudaStreamSupported`) + +- :ref:`OfxImageEffectPropMetalCommandQueue ` - Type: pointer, Dimension: 1 (:c:macro:`kOfxImageEffectPropMetalCommandQueue`) + +- :ref:`OfxImageEffectPropMetalEnabled ` - Type: bool, Dimension: 1 (:c:macro:`kOfxImageEffectPropMetalEnabled`) + +- :ref:`OfxImageEffectPropMetalRenderSupported ` - Type: enum, Dimension: 1 (:c:macro:`kOfxImageEffectPropMetalRenderSupported`) + +- :ref:`OfxImageEffectPropOpenCLCommandQueue ` - Type: pointer, Dimension: 1 (:c:macro:`kOfxImageEffectPropOpenCLCommandQueue`) + +- :ref:`OfxImageEffectPropOpenCLEnabled ` - Type: bool, Dimension: 1 (:c:macro:`kOfxImageEffectPropOpenCLEnabled`) + +- :ref:`OfxImageEffectPropOpenCLImage ` - Type: pointer, Dimension: 1 (:c:macro:`kOfxImageEffectPropOpenCLImage`) + +- :ref:`OfxImageEffectPropOpenCLRenderSupported ` - Type: enum, Dimension: 1 (:c:macro:`kOfxImageEffectPropOpenCLRenderSupported`) + +- :ref:`OfxImageEffectPropOpenCLSupported ` - Type: enum, Dimension: 1 (:c:macro:`kOfxImageEffectPropOpenCLSupported`) + +- :ref:`OfxImageEffectPropOpenGLEnabled ` - Type: bool, Dimension: 1 (:c:macro:`kOfxImageEffectPropOpenGLEnabled`) + +- :ref:`OfxImageEffectPropOpenGLTextureIndex ` - Type: int, Dimension: 1 (:c:macro:`kOfxImageEffectPropOpenGLTextureIndex`) + +- :ref:`OfxImageEffectPropOpenGLTextureTarget ` - Type: int, Dimension: 1 (:c:macro:`kOfxImageEffectPropOpenGLTextureTarget`) + +.. _action_OfxInteractActionDraw: + +**OfxInteractActionDraw** +^^^^^^^^^^^^^^^^^^^^^ + +**Input Arguments** + +- :ref:`OfxPropEffectInstance ` - Type: pointer, Dimension: 1 (:c:macro:`kOfxPropEffectInstance`) + +- :ref:`OfxInteractPropDrawContext ` - Type: pointer, Dimension: 1 (:c:macro:`kOfxInteractPropDrawContext`) + +- :ref:`OfxInteractPropPixelScale ` - Type: double, Dimension: 2 (:c:macro:`kOfxInteractPropPixelScale`) + +- :ref:`OfxInteractPropBackgroundColour ` - Type: double, Dimension: 3 (:c:macro:`kOfxInteractPropBackgroundColour`) + +- :ref:`OfxPropTime ` - Type: double, Dimension: 1 (:c:macro:`kOfxPropTime`) + +- :ref:`OfxImageEffectPropRenderScale ` - Type: double, Dimension: 2 (:c:macro:`kOfxImageEffectPropRenderScale`) + +.. _action_OfxInteractActionGainFocus: + +**OfxInteractActionGainFocus** +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +**Input Arguments** + +- :ref:`OfxPropEffectInstance ` - Type: pointer, Dimension: 1 (:c:macro:`kOfxPropEffectInstance`) + +- :ref:`OfxInteractPropPixelScale ` - Type: double, Dimension: 2 (:c:macro:`kOfxInteractPropPixelScale`) + +- :ref:`OfxInteractPropBackgroundColour ` - Type: double, Dimension: 3 (:c:macro:`kOfxInteractPropBackgroundColour`) + +- :ref:`OfxPropTime ` - Type: double, Dimension: 1 (:c:macro:`kOfxPropTime`) + +- :ref:`OfxImageEffectPropRenderScale ` - Type: double, Dimension: 2 (:c:macro:`kOfxImageEffectPropRenderScale`) + +.. _action_OfxInteractActionKeyDown: + +**OfxInteractActionKeyDown** +^^^^^^^^^^^^^^^^^^^^^^^^ + +**Input Arguments** + +- :ref:`OfxPropEffectInstance ` - Type: pointer, Dimension: 1 (:c:macro:`kOfxPropEffectInstance`) + +- :ref:`kOfxPropKeySym ` - Type: int, Dimension: 1 (:c:macro:`kOfxPropKeySym`) + +- :ref:`kOfxPropKeyString ` - Type: string, Dimension: 1 (:c:macro:`kOfxPropKeyString`) + +- :ref:`OfxPropTime ` - Type: double, Dimension: 1 (:c:macro:`kOfxPropTime`) + +- :ref:`OfxImageEffectPropRenderScale ` - Type: double, Dimension: 2 (:c:macro:`kOfxImageEffectPropRenderScale`) + +.. _action_OfxInteractActionKeyRepeat: + +**OfxInteractActionKeyRepeat** +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +**Input Arguments** + +- :ref:`OfxPropEffectInstance ` - Type: pointer, Dimension: 1 (:c:macro:`kOfxPropEffectInstance`) + +- :ref:`kOfxPropKeySym ` - Type: int, Dimension: 1 (:c:macro:`kOfxPropKeySym`) + +- :ref:`kOfxPropKeyString ` - Type: string, Dimension: 1 (:c:macro:`kOfxPropKeyString`) + +- :ref:`OfxPropTime ` - Type: double, Dimension: 1 (:c:macro:`kOfxPropTime`) + +- :ref:`OfxImageEffectPropRenderScale ` - Type: double, Dimension: 2 (:c:macro:`kOfxImageEffectPropRenderScale`) + +.. _action_OfxInteractActionKeyUp: + +**OfxInteractActionKeyUp** +^^^^^^^^^^^^^^^^^^^^^^ + +**Input Arguments** + +- :ref:`OfxPropEffectInstance ` - Type: pointer, Dimension: 1 (:c:macro:`kOfxPropEffectInstance`) + +- :ref:`kOfxPropKeySym ` - Type: int, Dimension: 1 (:c:macro:`kOfxPropKeySym`) + +- :ref:`kOfxPropKeyString ` - Type: string, Dimension: 1 (:c:macro:`kOfxPropKeyString`) + +- :ref:`OfxPropTime ` - Type: double, Dimension: 1 (:c:macro:`kOfxPropTime`) + +- :ref:`OfxImageEffectPropRenderScale ` - Type: double, Dimension: 2 (:c:macro:`kOfxImageEffectPropRenderScale`) + +.. _action_OfxInteractActionLoseFocus: + +**OfxInteractActionLoseFocus** +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +**Input Arguments** + +- :ref:`OfxPropEffectInstance ` - Type: pointer, Dimension: 1 (:c:macro:`kOfxPropEffectInstance`) + +- :ref:`OfxInteractPropPixelScale ` - Type: double, Dimension: 2 (:c:macro:`kOfxInteractPropPixelScale`) + +- :ref:`OfxInteractPropBackgroundColour ` - Type: double, Dimension: 3 (:c:macro:`kOfxInteractPropBackgroundColour`) + +- :ref:`OfxPropTime ` - Type: double, Dimension: 1 (:c:macro:`kOfxPropTime`) + +- :ref:`OfxImageEffectPropRenderScale ` - Type: double, Dimension: 2 (:c:macro:`kOfxImageEffectPropRenderScale`) + +.. _action_OfxInteractActionPenDown: + +**OfxInteractActionPenDown** +^^^^^^^^^^^^^^^^^^^^^^^^ + +**Input Arguments** + +- :ref:`OfxPropEffectInstance ` - Type: pointer, Dimension: 1 (:c:macro:`kOfxPropEffectInstance`) + +- :ref:`OfxInteractPropPixelScale ` - Type: double, Dimension: 2 (:c:macro:`kOfxInteractPropPixelScale`) + +- :ref:`OfxInteractPropBackgroundColour ` - Type: double, Dimension: 3 (:c:macro:`kOfxInteractPropBackgroundColour`) + +- :ref:`OfxPropTime ` - Type: double, Dimension: 1 (:c:macro:`kOfxPropTime`) + +- :ref:`OfxImageEffectPropRenderScale ` - Type: double, Dimension: 2 (:c:macro:`kOfxImageEffectPropRenderScale`) + +- :ref:`OfxInteractPropPenPosition ` - Type: double, Dimension: 2 (:c:macro:`kOfxInteractPropPenPosition`) + +- :ref:`OfxInteractPropPenViewportPosition ` - Type: int, Dimension: 2 (:c:macro:`kOfxInteractPropPenViewportPosition`) + +- :ref:`OfxInteractPropPenPressure ` - Type: double, Dimension: 1 (:c:macro:`kOfxInteractPropPenPressure`) + +.. _action_OfxInteractActionPenMotion: + +**OfxInteractActionPenMotion** +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +**Input Arguments** + +- :ref:`OfxPropEffectInstance ` - Type: pointer, Dimension: 1 (:c:macro:`kOfxPropEffectInstance`) + +- :ref:`OfxInteractPropPixelScale ` - Type: double, Dimension: 2 (:c:macro:`kOfxInteractPropPixelScale`) + +- :ref:`OfxInteractPropBackgroundColour ` - Type: double, Dimension: 3 (:c:macro:`kOfxInteractPropBackgroundColour`) + +- :ref:`OfxPropTime ` - Type: double, Dimension: 1 (:c:macro:`kOfxPropTime`) + +- :ref:`OfxImageEffectPropRenderScale ` - Type: double, Dimension: 2 (:c:macro:`kOfxImageEffectPropRenderScale`) + +- :ref:`OfxInteractPropPenPosition ` - Type: double, Dimension: 2 (:c:macro:`kOfxInteractPropPenPosition`) + +- :ref:`OfxInteractPropPenViewportPosition ` - Type: int, Dimension: 2 (:c:macro:`kOfxInteractPropPenViewportPosition`) + +- :ref:`OfxInteractPropPenPressure ` - Type: double, Dimension: 1 (:c:macro:`kOfxInteractPropPenPressure`) + +.. _action_OfxInteractActionPenUp: + +**OfxInteractActionPenUp** +^^^^^^^^^^^^^^^^^^^^^^ + +**Input Arguments** + +- :ref:`OfxPropEffectInstance ` - Type: pointer, Dimension: 1 (:c:macro:`kOfxPropEffectInstance`) + +- :ref:`OfxInteractPropPixelScale ` - Type: double, Dimension: 2 (:c:macro:`kOfxInteractPropPixelScale`) + +- :ref:`OfxInteractPropBackgroundColour ` - Type: double, Dimension: 3 (:c:macro:`kOfxInteractPropBackgroundColour`) + +- :ref:`OfxPropTime ` - Type: double, Dimension: 1 (:c:macro:`kOfxPropTime`) + +- :ref:`OfxImageEffectPropRenderScale ` - Type: double, Dimension: 2 (:c:macro:`kOfxImageEffectPropRenderScale`) + +- :ref:`OfxInteractPropPenPosition ` - Type: double, Dimension: 2 (:c:macro:`kOfxInteractPropPenPosition`) + +- :ref:`OfxInteractPropPenViewportPosition ` - Type: int, Dimension: 2 (:c:macro:`kOfxInteractPropPenViewportPosition`) + +- :ref:`OfxInteractPropPenPressure ` - Type: double, Dimension: 1 (:c:macro:`kOfxInteractPropPenPressure`) + diff --git a/Documentation/sources/_ext/.gitignore b/Documentation/sources/_ext/.gitignore new file mode 100644 index 000000000..bee8a64b7 --- /dev/null +++ b/Documentation/sources/_ext/.gitignore @@ -0,0 +1 @@ +__pycache__ diff --git a/Documentation/sources/_ext/property_links.py b/Documentation/sources/_ext/property_links.py new file mode 100644 index 000000000..7ff09ffdd --- /dev/null +++ b/Documentation/sources/_ext/property_links.py @@ -0,0 +1,44 @@ +""" +Sphinx extension to add links from property documentation to structured documentation. +""" + +from docutils import nodes +from docutils.parsers.rst import Directive, directives +from sphinx.util.docutils import SphinxDirective + +class PropertyLinkDirective(SphinxDirective): + """ + Custom directive to add links to structured documentation. + """ + required_arguments = 1 + optional_arguments = 0 + has_content = False + + def run(self): + prop_name = self.arguments[0] + # Remove the 'k' prefix for the reference + if prop_name.startswith('k'): + ref_name = prop_name[1:] + else: + ref_name = prop_name + + # Create a paragraph node with the link + para = nodes.paragraph() + para['classes'].append('property-link') + + # Create a reference node + reference = nodes.reference('', f'See structured property reference for {prop_name}') + # Convert to lowercase for the actual HTML anchor + reference['refuri'] = f'ofxPropertiesReferenceGenerated.html#{ref_name.lower()}' + para += reference + + return [para] + +def setup(app): + app.add_directive('property_link', PropertyLinkDirective) + + return { + 'version': '0.1', + 'parallel_read_safe': True, + 'parallel_write_safe': True, + } diff --git a/Documentation/sources/_static/css/custom.css b/Documentation/sources/_static/css/custom.css index 33a5b6dbf..66e847f06 100644 --- a/Documentation/sources/_static/css/custom.css +++ b/Documentation/sources/_static/css/custom.css @@ -5,3 +5,20 @@ https://stackoverflow.com/questions/59215996/how-to-add-a-logo-to-my-readthedocs .wy-side-nav-search .wy-dropdown > a img.logo, .wy-side-nav-search > a img.logo { width: 275px; } + +/* +* Customizations for property documentation +*/ +/* Style for our custom property links */ +.property-link { + margin-top: -10px !important; + margin-bottom: 15px !important; + padding: 0px 0px 3px 22px !important; + font-size: 0.9em !important; + display: inline-block !important; +} + +/* Close up space between .cpp.macro and .property-link */ +dl.cpp.macro:has(+ p.property-link) { + margin-bottom: 0 !important; +} diff --git a/Documentation/sources/conf.py b/Documentation/sources/conf.py index 93cce72c5..a1f9b205d 100755 --- a/Documentation/sources/conf.py +++ b/Documentation/sources/conf.py @@ -9,13 +9,24 @@ # SPDX-License-Identifier: BSD-3-Clause -import subprocess, os, shutil +import subprocess, os, shutil, re, sys +from docutils import nodes +from docutils.parsers.rst import directives +from sphinx.directives import ObjectDescription +from sphinx.util.docutils import SphinxDirective + +# Add the _ext directory to Python path +sys.path.append(os.path.abspath('_ext')) + project = 'OpenFX' copyright = '''2025, OpenFX a Series of LF Projects, LLC. For web site terms of use, trademark policy and other project policies please see https://lfprojects.org/''' author = 'Contributors to the OpenFX Project' release = '1.5' +# We're now using a custom extension for property links +# Directive definitions have been moved to _ext/property_links.py + read_the_docs_build = os.environ.get('READTHEDOCS', None) == 'True' # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration @@ -53,7 +64,7 @@ # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. -extensions = [ "breathe", "sphinx_rtd_theme" ] +extensions = [ "breathe", "sphinx_rtd_theme", "property_links" ] # breathe is an rst/sphinx extension to read and render doxygen xml output breathe_projects = { diff --git a/Examples/CMakeLists.txt b/Examples/CMakeLists.txt index e6790fcc8..7f21ae778 100644 --- a/Examples/CMakeLists.txt +++ b/Examples/CMakeLists.txt @@ -1,4 +1,5 @@ set(OFX_SUPPORT_HEADER_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../Support/include") +set(OFX_CPP_BINDINGS_HEADER_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../openfx-cpp/include") set(PLUGINS Basic @@ -10,6 +11,7 @@ set(PLUGINS OpenGL Rectangle Test + TestProps DrawSuite ) @@ -20,7 +22,8 @@ foreach(PLUGIN IN LISTS PLUGINS) add_ofx_plugin(${TGT} ${PLUGIN}) target_sources(${TGT} PUBLIC ${PLUGIN_SOURCES}) target_link_libraries(${TGT} ${CONAN_LIBS}) - target_include_directories(${TGT} PUBLIC ${OFX_HEADER_DIR} ${OFX_SUPPORT_HEADER_DIR}) + target_include_directories(${TGT} PUBLIC ${OFX_HEADER_DIR}) + if (OFX_SUPPORTS_OPENCLRENDER) target_link_libraries(${TGT} PRIVATE OpenCL::Headers OpenCL::OpenCL) endif() @@ -30,3 +33,6 @@ target_link_libraries(example-OpenGL PRIVATE opengl::opengl) target_link_libraries(example-Custom PRIVATE opengl::opengl) target_link_libraries(example-ColourSpace PRIVATE cimg::cimg) target_link_libraries(example-ColourSpace PRIVATE spdlog::spdlog_header_only) +target_link_libraries(example-TestProps PRIVATE spdlog::spdlog_header_only) +target_link_libraries(example-TestProps PRIVATE tcb-span::tcb-span) +target_include_directories(example-TestProps PUBLIC ${OFX_CPP_BINDINGS_HEADER_DIR}) diff --git a/Examples/TestProps/Info.plist b/Examples/TestProps/Info.plist new file mode 100644 index 000000000..a8a879430 --- /dev/null +++ b/Examples/TestProps/Info.plist @@ -0,0 +1,20 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + testProperties.ofx + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + BNDL + CFBundleSignature + ???? + CFBundleVersion + 0.0.1d1 + CSResourcesFileMapped + + + diff --git a/Examples/TestProps/testProperties.cpp b/Examples/TestProps/testProperties.cpp new file mode 100644 index 000000000..04b269d89 --- /dev/null +++ b/Examples/TestProps/testProperties.cpp @@ -0,0 +1,909 @@ +// Copyright OpenFX and contributors to the OpenFX project. +// SPDX-License-Identifier: BSD-3-Clause + +/** @file testProperties.cpp OFX test plugin which logs all properties + in various actions. + + Uses openfx::Logger for logging. +*/ +#include "ofxImageEffect.h" +#include "ofxMemory.h" +#include "ofxMessage.h" +#include "ofxMultiThread.h" +#include "openfx/ofxPropsAccess.h" +#include "openfx/ofxPropsBySet.h" +#include "openfx/ofxPropsMetadata.h" +#include "openfx/ofxPropSetAccessors.h" // Type-safe property set accessor classes +#include "openfx/ofxLog.h" // OpenFX logging +#include "../openfx-cpp/examples/host-specific-props/myhost/myhostPropsMetadata.h" // Ensure example compiles +#include // stl maps +#include // stl strings +#include +#include + +#if defined __APPLE__ || defined __linux__ || defined __FreeBSD__ +#define EXPORT __attribute__((visibility("default"))) +#elif defined _WIN32 +#define EXPORT OfxExport +#else +#error Not building on your operating system quite yet +#endif + +using namespace openfx; // for props access + +// Plugin identification +static constexpr const char* kPluginName = "PropertyTester"; + +static OfxHost *gHost; +static OfxImageEffectSuiteV1 *gEffectSuite; +static OfxPropertySuiteV1 *gPropSuite; +static OfxInteractSuiteV1 *gInteractSuite; +static OfxParameterSuiteV1 *gParamSuite; +static OfxMemorySuiteV1 *gMemorySuite; +static OfxMultiThreadSuiteV1 *gThreadSuite; +static OfxMessageSuiteV1 *gMessageSuite; + +//////////////////////////////////////////////////////////////////////////////// +// fetch a suite +static const void *fetchSuite(const char *suiteName, int suiteVersion, + bool optional = false) { + const void *suite = gHost->fetchSuite(gHost->host, suiteName, suiteVersion); + if (optional) { + if (suite == 0) + Logger::warn("Could not fetch the optional suite '{}' version {}", suiteName, suiteVersion); + } else { + if (suite == 0) + Logger::error("Could not fetch the mandatory suite '{}' version {}", suiteName, suiteVersion); + } + if (!optional && suite == 0) + throw kOfxStatErrMissingHostFeature; + return suite; +} + +//////////////////////////////////////////////////////////////////////////////// +// maps status to a string +static const char *mapStatus(OfxStatus stat) { + switch (stat) { + case kOfxStatOK: + return "kOfxStatOK"; + case kOfxStatFailed: + return "kOfxStatFailed"; + case kOfxStatErrFatal: + return "kOfxStatErrFatal"; + case kOfxStatErrUnknown: + return "kOfxStatErrUnknown"; + case kOfxStatErrMissingHostFeature: + return "kOfxStatErrMissingHostFeature"; + case kOfxStatErrUnsupported: + return "kOfxStatErrUnsupported"; + case kOfxStatErrExists: + return "kOfxStatErrExists"; + case kOfxStatErrFormat: + return "kOfxStatErrFormat"; + case kOfxStatErrMemory: + return "kOfxStatErrMemory"; + case kOfxStatErrBadHandle: + return "kOfxStatErrBadHandle"; + case kOfxStatErrBadIndex: + return "kOfxStatErrBadIndex"; + case kOfxStatErrValue: + return "kOfxStatErrValue"; + case kOfxStatReplyYes: + return "kOfxStatReplyYes"; + case kOfxStatReplyNo: + return "kOfxStatReplyNo"; + case kOfxStatReplyDefault: + return "kOfxStatReplyDefault"; + case kOfxStatErrImageFormat: + return "kOfxStatErrImageFormat"; + } + return "UNKNOWN STATUS CODE"; +} + +// ======================================================================== +// Read all props in a prop set +// ======================================================================== + +using PropValue = std::variant; + +struct PropRecord { + const PropDef &def; + std::vector values; +}; + +// Fills in values and returns true if property exists, false (and no values) otherwise +bool readProperty(PropertyAccessor &accessor, const PropDef &def, + std::vector &values) { + if (!accessor.exists(def.name)) { + values.clear(); + return false; + } + int dimension = accessor.getDimensionRaw(def.name); + + values.clear(); + values.reserve(dimension); + + // Read all values based on the primary type + PropType primaryType = def.supportedTypes[0]; + + for (int i = 0; i < dimension; ++i) { + if (primaryType == PropType::Int || primaryType == PropType::Bool) { + values.push_back(accessor.getRaw(def.name, i)); + } else if (primaryType == PropType::Double) { + values.push_back(accessor.getRaw(def.name, i)); + } else if (primaryType == PropType::String || + primaryType == PropType::Enum) { + const char *strValue = accessor.getRaw(def.name, i); + values.push_back(strValue); + + // Validate enum values against spec + if (primaryType == PropType::Enum && !def.enumValues.empty()) { + bool valid = false; + for (auto validValue : def.enumValues) { + if (std::strcmp(strValue, validValue) == 0) { + valid = true; + break; + } + } + if (!valid) { + Logger::warn("Property '{}' has invalid enum value '{}' (not in spec)", + def.name, strValue); + // Log valid values for debugging + std::string validValues; + for (size_t j = 0; j < def.enumValues.size(); ++j) { + if (j > 0) validValues += ", "; + validValues += def.enumValues[j]; + } + Logger::warn(" Valid values are: {}", validValues); + } + } + } else if (primaryType == PropType::Pointer) { + values.push_back(accessor.getRaw(def.name, i)); + } + } + return true; +} + +std::vector getAllPropertiesOfSet(PropertyAccessor &accessor, + const char *propertySetName) { + std::vector result; + + // Find the property set in the map + auto setIt = prop_sets.find(propertySetName); + if (setIt == prop_sets.end()) { + Logger::error("Property set not found: {}", propertySetName); + return {}; + } + + // Read each property and push onto result + for (const auto &prop : setIt->second) { + // Use template dispatch to get property with correct type + std::vector values; + bool status = readProperty(accessor, prop.def, values); + if (status) + result.push_back({prop.def, std::move(values)}); + else + Logger::warn("Property not found: {}.{}", propertySetName, prop.def.name); + } + return result; +} + +/** + * Log all property values gotten from getAllPropertiesOfSet() + */ +void logPropValues(const std::string_view setName, + const std::vector &props) { + Logger::info("Properties for {}", setName); + for (const auto &[propDef, values] : props) { + // Build up the log string with property values + std::ostringstream buf; + buf << " " << propDef.name << " (" << values.size() << "d) = ["; + for (size_t i = 0; i < values.size(); ++i) { + std::visit( + [&buf](auto &&value) { + using T = std::decay_t; + if constexpr (std::is_same_v) { + buf << value; + } else if constexpr (std::is_same_v) { + buf << value; + } else if constexpr (std::is_same_v) { + buf << value; + } else if constexpr (std::is_same_v) { + buf << value; + } + }, + values[i]); + if (i < values.size() - 1) + buf << ","; + } + buf << "]"; + // log it + Logger::info("{}", buf.str()); + } +} + +/** + * Test property set compliance - verify all properties in a property set are accessible + * Returns number of failures + * + * Can test either: + * 1. Regular property sets: testPropertySetCompliance(accessor, "EffectDescriptor") + * 2. Action arguments: testPropertySetCompliance(accessor, kOfxActionRender, "inArgs") + */ +int testPropertySetCompliance(PropertyAccessor &accessor, const char *setName, const char *argType = nullptr) { + std::string testName; + std::vector propNames; + std::vector propDefs; + std::vector propOptional; + + if (argType == nullptr) { + // Testing a regular property set + testName = std::string(setName); + Logger::info("========================================"); + Logger::info("Testing property set compliance: {}", testName); + Logger::info("========================================"); + + // Find the property set + auto setIt = prop_sets.find(setName); + if (setIt == prop_sets.end()) { + Logger::error("Property set '{}' not found in prop_sets", setName); + return 1; + } + + // Build lists from prop_sets map + for (const auto &prop : setIt->second) { + propNames.push_back(prop.def.name); + propDefs.push_back(&prop.def); + propOptional.push_back(prop.host_optional); + } + } else { + // Testing action arguments + testName = std::string(setName) + "." + argType; + Logger::info("========================================"); + Logger::info("Testing action argument compliance: {}", testName); + Logger::info("========================================"); + + // Find the action's property list + std::array key = {setName, argType}; + auto setIt = action_props.find(key); + if (setIt == action_props.end()) { + Logger::error("Action argument '{}' not found in action_props", testName); + return 1; + } + + // Build lists from action_props map + for (const char* propName : setIt->second) { + propNames.push_back(propName); + + // Find property definition + auto propIt = std::find_if(prop_defs.data.begin(), prop_defs.data.end(), + [propName](const PropDef& def) { + return std::string_view(def.name) == std::string_view(propName); + }); + + if (propIt == prop_defs.data.end()) { + Logger::error(" ✗ {} - property definition not found", propName); + propDefs.push_back(nullptr); + propOptional.push_back(false); + continue; + } + + propDefs.push_back(&(*propIt)); + propOptional.push_back(false); // Action args are typically not marked as optional + } + } + + // Test each property + int totalProps = 0; + int accessibleProps = 0; + int requiredMissing = 0; + int optionalMissing = 0; + int typeErrors = 0; + + for (size_t i = 0; i < propNames.size(); ++i) { + totalProps++; + const char* propName = propNames[i]; + const PropDef* propDef = propDefs[i]; + bool isOptional = propOptional[i]; + + if (propDef == nullptr) { + typeErrors++; + continue; + } + + try { + bool exists = accessor.exists(propName); + if (!exists) + throw openfx::PropertyNotFoundException(-1); + + // Try to get dimension (this will fail if property doesn't exist) + int dimension = accessor.getDimensionRaw(propName); + + // Verify dimension matches spec (0 means variable dimension) + if (propDef->dimension != 0 && dimension != propDef->dimension) { + Logger::warn(" ✗ {} - dimension mismatch: expected {}, got {}", + propName, propDef->dimension, dimension); + } + + // Try to read the property based on its type + std::vector values; + try { + readProperty(accessor, *propDef, values); + accessibleProps++; + + // For optional properties that are present, log them + if (isOptional) { + Logger::info(" ✓ {} - accessible (optional, dimension={})", propName, dimension); + } + } catch (const std::exception& e) { + typeErrors++; + Logger::error(" ✗ {} - type error: {}", propName, e.what()); + } + + } catch (...) { + // Property not accessible + if (isOptional) { + optionalMissing++; + // Silently skip optional missing properties + } else { + requiredMissing++; + Logger::warn(" ✗ {} - NOT ACCESSIBLE{}", propName, argType ? "" : " (required!)"); + } + } + } + + // Summary + Logger::info("----------------------------------------"); + Logger::info("'{}' compliance results:", testName); + Logger::info(" Total properties defined: {}", totalProps); + Logger::info(" Accessible: {}", accessibleProps); + if (argType == nullptr) { + Logger::info(" Required missing: {}", requiredMissing); + Logger::info(" Optional missing: {}", optionalMissing); + } else { + Logger::info(" Missing: {}", requiredMissing + optionalMissing); + } + Logger::info(" Type errors: {}", typeErrors); + + int failures = requiredMissing + typeErrors; + if (failures == 0) { + Logger::info(" ✓ COMPLIANCE TEST PASSED"); + } else { + Logger::error(" ✗ COMPLIANCE TEST FAILED ({} issues)", failures); + } + Logger::info("========================================"); + + return failures; +} + +// ======================================================================== + +//////////////////////////////////////////////////////////////////////////////// +// how many times has actionLoad been called +static int gLoadCount = 0; + +/** @brief Called at load */ +static OfxStatus actionLoad(void) { + Logger::info("loadAction()"); + if (gLoadCount != 0) + Logger::error("Load action called more than once without unload being called"); + gLoadCount++; + + OfxStatus status = kOfxStatOK; + + try { + // fetch the suites + if (gHost == 0) + Logger::error("Host pointer has not been set"); + if (!gHost) + throw kOfxStatErrBadHandle; + + if (gLoadCount == 1) { + Logger::info("loadAction - loading suites"); + gEffectSuite = + (OfxImageEffectSuiteV1 *)fetchSuite(kOfxImageEffectSuite, 1); + gPropSuite = (OfxPropertySuiteV1 *)fetchSuite(kOfxPropertySuite, 1); + gParamSuite = (OfxParameterSuiteV1 *)fetchSuite(kOfxParameterSuite, 1); + gMemorySuite = (OfxMemorySuiteV1 *)fetchSuite(kOfxMemorySuite, 1); + gThreadSuite = + (OfxMultiThreadSuiteV1 *)fetchSuite(kOfxMultiThreadSuite, 1); + gMessageSuite = (OfxMessageSuiteV1 *)fetchSuite(kOfxMessageSuite, 1); + + Logger::info("loadAction - getting all props..."); + // Get all host props, property set name "ImageEffectHost" + PropertyAccessor accessor = PropertyAccessor(gHost->host, gPropSuite); + const auto prop_values = + getAllPropertiesOfSet(accessor, "ImageEffectHost"); + Logger::info("loadAction - got {} props", prop_values.size()); + logPropValues("ImageEffectHost", prop_values); + + // Test host property set compliance + Logger::info("loadAction - testing compliance..."); + testPropertySetCompliance(accessor, "ImageEffectHost"); + } + } + + catch (int err) { + Logger::error("loadAction - caught err {}", err); + status = err; + } + catch (...) { + Logger::error("loadAction - caught unknown err"); + status = kOfxStatErrFatal; + } + + Logger::info("loadAction returning {}", status); + return status; +} + +/** @brief Called before unload */ +static OfxStatus unLoadAction(void) { + if (gLoadCount <= 0) + Logger::error("UnLoad action called without a corresponding load action having been called"); + gLoadCount--; + + // force these to null + gEffectSuite = 0; + gPropSuite = 0; + gParamSuite = 0; + gMemorySuite = 0; + gThreadSuite = 0; + gMessageSuite = 0; + gInteractSuite = 0; + return kOfxStatOK; +} + +// instance construction +static OfxStatus createInstance(OfxImageEffectHandle /*effect*/) { + return kOfxStatOK; +} + +// instance destruction +static OfxStatus destroyInstance(OfxImageEffectHandle /*effect*/) { + return kOfxStatOK; +} + +// tells the host what region we are capable of filling +OfxStatus getSpatialRoD(OfxImageEffectHandle /*effect*/, + OfxPropertySetHandle /*inArgs*/, + OfxPropertySetHandle /*outArgs*/) { + return kOfxStatOK; +} + +// tells the host how much of the input we need to fill the given window +OfxStatus getSpatialRoI(OfxImageEffectHandle /*effect*/, + OfxPropertySetHandle /*inArgs*/, + OfxPropertySetHandle /*outArgs*/) { + return kOfxStatOK; +} + +// Tells the host how many frames we can fill, only called in the general +// context. This is actually redundant as this is the default behaviour, but for +// illustrative purposes. +OfxStatus getTemporalDomain(OfxImageEffectHandle /*effect*/, + OfxPropertySetHandle /*inArgs*/, + OfxPropertySetHandle /*outArgs*/) { + return kOfxStatOK; +} + +// Set our clip preferences +static OfxStatus getClipPreferences(OfxImageEffectHandle /*effect*/, + OfxPropertySetHandle /*inArgs*/, + OfxPropertySetHandle /*outArgs*/) { + return kOfxStatOK; +} + +// are the settings of the effect performing an identity operation +static OfxStatus isIdentity(OfxImageEffectHandle /*effect*/, + OfxPropertySetHandle /*inArgs*/, + OfxPropertySetHandle /*outArgs*/) { + // In this case do the default, which in this case is to render + return kOfxStatReplyDefault; +} + +//////////////////////////////////////////////////////////////////////////////// +// function called when the instance has been changed by anything +static OfxStatus instanceChanged(OfxImageEffectHandle instance, + OfxPropertySetHandle inArgs, + OfxPropertySetHandle outArgs) { + // Test property set compliance + PropertyAccessor in_accessor = PropertyAccessor(inArgs, gPropSuite); + testPropertySetCompliance(in_accessor, kOfxActionInstanceChanged, "inArgs"); + PropertyAccessor out_accessor = PropertyAccessor(outArgs, gPropSuite); + testPropertySetCompliance(out_accessor, kOfxActionInstanceChanged, "outArgs"); + + auto accessor = PropertyAccessor(instance, gEffectSuite, gPropSuite); + testPropertySetCompliance(accessor, "EffectInstance"); + + // don't trap any others + return kOfxStatReplyDefault; +} + +// the process code that the host sees +static OfxStatus render(OfxImageEffectHandle instance, + OfxPropertySetHandle inArgs, + OfxPropertySetHandle outArgs) { + // Test property set compliance + PropertyAccessor in_accessor = PropertyAccessor(inArgs, gPropSuite); + testPropertySetCompliance(in_accessor, kOfxImageEffectActionRender, "inArgs"); + PropertyAccessor out_accessor = PropertyAccessor(outArgs, gPropSuite); + testPropertySetCompliance(out_accessor, kOfxImageEffectActionRender, "outArgs"); + + auto accessor = PropertyAccessor(instance, gEffectSuite, gPropSuite); + testPropertySetCompliance(accessor, "EffectInstance"); + + return kOfxStatOK; +} + + +static OfxStatus getRegionOfDefinition(OfxImageEffectHandle instance, + OfxPropertySetHandle inArgs, + OfxPropertySetHandle outArgs) { + // Test property set compliance + PropertyAccessor in_accessor = PropertyAccessor(inArgs, gPropSuite); + testPropertySetCompliance(in_accessor, kOfxImageEffectActionGetRegionOfDefinition, "inArgs"); + PropertyAccessor out_accessor = PropertyAccessor(outArgs, gPropSuite); + testPropertySetCompliance(out_accessor, kOfxImageEffectActionGetRegionOfDefinition, "outArgs"); + + auto accessor = PropertyAccessor(instance, gEffectSuite, gPropSuite); + testPropertySetCompliance(accessor, "EffectInstance"); + + return kOfxStatReplyDefault; +} + +static OfxStatus getRegionsOfInterest(OfxImageEffectHandle instance, + OfxPropertySetHandle inArgs, + OfxPropertySetHandle outArgs) { + // Test property set compliance + PropertyAccessor in_accessor = PropertyAccessor(inArgs, gPropSuite); + testPropertySetCompliance(in_accessor, kOfxImageEffectActionGetRegionsOfInterest, "inArgs"); + // No outArgs here + // PropertyAccessor out_accessor = PropertyAccessor(outArgs, gPropSuite); + // testPropertySetCompliance(out_accessor, kOfxImageEffectActionGetRegionsOfInterest, "outArgs"); + + auto accessor = PropertyAccessor(instance, gEffectSuite, gPropSuite); + testPropertySetCompliance(accessor, "EffectInstance"); + + return kOfxStatReplyDefault; +} + +// describe the plugin in context +static OfxStatus describeInContext(OfxImageEffectHandle effect, + OfxPropertySetHandle inArgs) { + // Test property set compliance + PropertyAccessor accessor = PropertyAccessor(inArgs, gPropSuite); + testPropertySetCompliance(accessor, kOfxImageEffectActionDescribeInContext, "inArgs"); + accessor = PropertyAccessor(effect, gEffectSuite, gPropSuite); + testPropertySetCompliance(accessor, "EffectDescriptor"); + + OfxPropertySetHandle props; + // define the output clip + gEffectSuite->clipDefine(effect, kOfxImageEffectOutputClipName, &props); + accessor = PropertyAccessor(props, gPropSuite); + accessor.setAll( + {kOfxImageComponentRGBA, kOfxImageComponentAlpha}); + + // define the single source clip + gEffectSuite->clipDefine(effect, kOfxImageEffectSimpleSourceClipName, &props); + accessor = PropertyAccessor(props, gPropSuite); + accessor.setAll( + {kOfxImageComponentRGBA, kOfxImageComponentAlpha}); + + // Params + OfxParamSetHandle paramSet; + gEffectSuite->getParamSet(effect, ¶mSet); + + // simple param test + gParamSuite->paramDefine(paramSet, kOfxParamTypeDouble, "scale", &props); + accessor = PropertyAccessor(props, gPropSuite); + // Traditional API - note explicit type for multi-type property + accessor.set(0) + .set("Enables scales on individual components") + .set("scale") + .set("Scale Param"); + + // NEW: Can also use type-safe property set accessor for multi-type properties + // The accessor class provides templated methods for multi-type properties + // Note: dimension=0 properties (like Min/Max/Default) still need index parameter + openfx::ParamDouble1D paramDesc(accessor); + paramDesc.setDefault(1.0); // dimension=0, so default index=0 + paramDesc.setMin(0.0, 0); // explicit index for dimension=0 + paramDesc.setMax(10.0, 0); // explicit index for dimension=0 + Logger::info(" Using ParamDouble1D accessor with multi-type properties!"); + + // Log all the effect descriptor's props + OfxPropertySetHandle effectProps; + gEffectSuite->getPropertySet(effect, &effectProps); + PropertyAccessor effect_accessor = PropertyAccessor(effectProps, gPropSuite); + const auto prop_values = + getAllPropertiesOfSet(effect_accessor, "EffectDescriptor"); + logPropValues("EffectDescriptor", prop_values); + + return kOfxStatOK; +} + +//////////////////////////////////////////////////////////////////////////////// +// code for the plugin's description routine + +// contexts we support +static std::vector supportedContexts{ + kOfxImageEffectContextGenerator, kOfxImageEffectContextFilter, + kOfxImageEffectContextTransition, kOfxImageEffectContextPaint, + kOfxImageEffectContextGeneral, kOfxImageEffectContextRetimer}; + +// pixel depths we support +static std::vector supportedPixelDepths{ + kOfxBitDepthByte, kOfxBitDepthShort, kOfxBitDepthFloat}; + +static OfxStatus actionDescribe(OfxImageEffectHandle effect) { + // get the property handle for the plugin + OfxPropertySetHandle effectProps; + gEffectSuite->getPropertySet(effect, &effectProps); + + + PropertyAccessor accessor = PropertyAccessor(effectProps, gPropSuite); + // Test property set compliance + testPropertySetCompliance(accessor, "EffectDescriptor"); + + // Low-level PropertyAccessor API + accessor.set("Property Tester v2") + .set("1.0", 0, false) + .setAll({1, 0, 0}, false) + .set( + "Sample plugin which logs all actions and properties", 0, false) + .set("OFX Examples") + .set(false) + .setAll(supportedContexts) + .setAll( + supportedPixelDepths); + + // OR: high-level, simpler (still type-safe) property set accessor API + Logger::info("Testing property set accessor classes..."); + openfx::EffectDescriptor effectDesc(accessor); + + // Simplified setters via property set class (same as above, but more convenient) + // Also chainable for fluent interface! + effectDesc.setLabel("Property Tester V2") + .setVersionLabel("1.0") + .setVersion({1,0,0}) + .setPluginDescription("Sample plugin, logging all actions & properties") + .setImageEffectPluginPropGrouping("OFX Examples") + .setMultipleClipDepths(false) + .setSupportedContexts(supportedContexts) + .setSupportedPixelDepths(supportedPixelDepths); + + // Test host-specific property extensibility (will fail at runtime but compiles!) + Logger::info("Testing host-specific property extensibility..."); + try { + // Test myhost properties (from examples/host-specific-props) + auto viewerProcess = accessor.get(0, false); + Logger::info(" MyHost viewer process: {}", viewerProcess ? viewerProcess : "(not available)"); + + auto projectPath = accessor.get(0, false); + Logger::info(" MyHost project path: {}", projectPath ? projectPath : "(not available)"); + + auto nodeColor = accessor.getAll(); + Logger::info(" MyHost node color dimension: {}", nodeColor.size()); + + // Test setting host properties + accessor.setAll({255, 128, 64}); + + } catch (const PropertyNotFoundException& e) { + Logger::info(" Host properties not available (expected) - but compilation succeeded!"); + } catch (...) { + Logger::info(" Host properties failed (expected) - but compilation succeeded!"); + } + + // After setting up, log all known props + const auto prop_values = getAllPropertiesOfSet(accessor, "EffectDescriptor"); + logPropValues("EffectDescriptor", prop_values); + + return kOfxStatOK; +} + +////////////////////////////////////////////////////////////////////////////////. +// check handles to the main function +static void checkMainHandles(const char *action, const void *handle, + OfxPropertySetHandle inArgsHandle, + OfxPropertySetHandle outArgsHandle, + bool handleCanBeNull, bool inArgsCanBeNull, + bool outArgsCanBeNull) { + if (handleCanBeNull) { + if (handle != 0) { + Logger::warn("Handle passed to '{}' is not null", action); + } else if (handle == 0) { + Logger::error("'Handle passed to '{}' is null", action); + } + } + + if (inArgsCanBeNull) { + if (inArgsHandle != 0) { + Logger::warn("'inArgs' Handle passed to '{}' is not null", action); + } else if (inArgsHandle == 0) { + Logger::error("'inArgs' handle passed to '{}' is null", action); + } + } + + if (outArgsCanBeNull) { + if (outArgsHandle != 0) { + Logger::warn("'outArgs' Handle passed to '{}' is not null", action); + } else if (outArgsHandle == 0) { + Logger::error("'outArgs' handle passed to '{}' is null", action); + } + } + + if (!handleCanBeNull && !handle) + throw kOfxStatErrBadHandle; + if (!inArgsCanBeNull && !inArgsHandle) + throw kOfxStatErrBadHandle; + if (!outArgsCanBeNull && !outArgsHandle) + throw kOfxStatErrBadHandle; +} + +//////////////////////////////////////////////////////////////////////////////// +// The main function +static OfxStatus pluginMain(const char *action, const void *handle, + OfxPropertySetHandle inArgsHandle, + OfxPropertySetHandle outArgsHandle) { + Logger::info(">>> {}", action); + OfxStatus stat = kOfxStatReplyDefault; + + try { + // cast to handle appropriate type + OfxImageEffectHandle effectHandle = (OfxImageEffectHandle)handle; + + if (!strcmp(action, kOfxActionLoad)) { + checkMainHandles(action, handle, inArgsHandle, outArgsHandle, true, true, + true); + stat = actionLoad(); + } else if (!strcmp(action, kOfxActionUnload)) { + checkMainHandles(action, handle, inArgsHandle, outArgsHandle, true, true, + true); + stat = unLoadAction(); + } else if (!strcmp(action, kOfxActionDescribe)) { + checkMainHandles(action, handle, inArgsHandle, outArgsHandle, false, true, + true); + stat = actionDescribe(effectHandle); + } else if (!strcmp(action, kOfxActionPurgeCaches)) { + checkMainHandles(action, handle, inArgsHandle, outArgsHandle, false, true, + true); + } else if (!strcmp(action, kOfxActionSyncPrivateData)) { + checkMainHandles(action, handle, inArgsHandle, outArgsHandle, false, true, + true); + } else if (!strcmp(action, kOfxActionCreateInstance)) { + checkMainHandles(action, handle, inArgsHandle, outArgsHandle, false, true, + true); + stat = createInstance(effectHandle); + } else if (!strcmp(action, kOfxActionDestroyInstance)) { + checkMainHandles(action, handle, inArgsHandle, outArgsHandle, false, true, + true); + stat = destroyInstance(effectHandle); + } else if (!strcmp(action, kOfxActionInstanceChanged)) { + checkMainHandles(action, handle, inArgsHandle, outArgsHandle, false, + false, true); + stat = instanceChanged(effectHandle, inArgsHandle, outArgsHandle); + } else if (!strcmp(action, kOfxActionBeginInstanceChanged)) { + checkMainHandles(action, handle, inArgsHandle, outArgsHandle, false, + false, true); + } else if (!strcmp(action, kOfxActionEndInstanceChanged)) { + checkMainHandles(action, handle, inArgsHandle, outArgsHandle, false, + false, true); + } else if (!strcmp(action, kOfxActionBeginInstanceEdit)) { + checkMainHandles(action, handle, inArgsHandle, outArgsHandle, false, true, + true); + } else if (!strcmp(action, kOfxActionEndInstanceEdit)) { + checkMainHandles(action, handle, inArgsHandle, outArgsHandle, false, true, + true); + } else if (!strcmp(action, kOfxImageEffectActionGetRegionOfDefinition)) { + checkMainHandles(action, handle, inArgsHandle, outArgsHandle, false, + false, false); + stat = getRegionOfDefinition(effectHandle, inArgsHandle, outArgsHandle); + } else if (!strcmp(action, kOfxImageEffectActionGetRegionsOfInterest)) { + checkMainHandles(action, handle, inArgsHandle, outArgsHandle, false, + false, false); + stat = getRegionsOfInterest(effectHandle, inArgsHandle, outArgsHandle); + } else if (!strcmp(action, kOfxImageEffectActionGetTimeDomain)) { + checkMainHandles(action, handle, inArgsHandle, outArgsHandle, false, true, + false); + } else if (!strcmp(action, kOfxImageEffectActionGetFramesNeeded)) { + checkMainHandles(action, handle, inArgsHandle, outArgsHandle, false, + false, false); + } else if (!strcmp(action, kOfxImageEffectActionGetClipPreferences)) { + checkMainHandles(action, handle, inArgsHandle, outArgsHandle, false, + false, false); + stat = getClipPreferences(effectHandle, inArgsHandle, outArgsHandle); + } else if (!strcmp(action, kOfxImageEffectActionIsIdentity)) { + checkMainHandles(action, handle, inArgsHandle, outArgsHandle, false, + false, false); + stat = isIdentity(effectHandle, inArgsHandle, outArgsHandle); + } else if (!strcmp(action, kOfxImageEffectActionRender)) { + checkMainHandles(action, handle, inArgsHandle, outArgsHandle, false, + false, true); + stat = render(effectHandle, inArgsHandle, outArgsHandle); + } else if (!strcmp(action, kOfxImageEffectActionBeginSequenceRender)) { + checkMainHandles(action, handle, inArgsHandle, outArgsHandle, false, + false, true); + } else if (!strcmp(action, kOfxImageEffectActionEndSequenceRender)) { + checkMainHandles(action, handle, inArgsHandle, outArgsHandle, false, + false, true); + } else if (!strcmp(action, kOfxImageEffectActionDescribeInContext)) { + checkMainHandles(action, handle, inArgsHandle, outArgsHandle, false, + false, true); + stat = describeInContext(effectHandle, inArgsHandle); + } else { + Logger::error("Unknown action '{}'", action); + } + } catch (std::bad_alloc) { + // catch memory + Logger::error("OFX Plugin Memory error"); + stat = kOfxStatErrMemory; + } catch (const std::exception &e) { + // standard exceptions + Logger::error("Plugin exception: '{}'", e.what()); + stat = kOfxStatErrUnknown; + } catch (int err) { + // ho hum, gone wrong somehow + Logger::error("Misc int plugin exception: '{}'", mapStatus(err)); + stat = err; + } catch (...) { + // everything else + Logger::error("Uncaught misc plugin exception"); + stat = kOfxStatErrUnknown; + } + + Logger::info("<<< {} = {}", action, stat); + + // other actions to take the default value + return stat; +} + +// function to set the host structure +static void setHostFunc(OfxHost *hostStruct) { + // Set the plugin name context for all logging + Logger::setContext(kPluginName); + + Logger::info("setHostFunc()"); + if (hostStruct == 0) + Logger::error("host is a null pointer"); + gHost = hostStruct; +} + +//////////////////////////////////////////////////////////////////////////////// +// the plugin struct +static OfxPlugin basicPlugin = {kOfxImageEffectPluginApi, + 1, + "net.sf.openfx:PropertyTestPlugin", + 1, + 0, + setHostFunc, + pluginMain}; + +// the two mandated functions +EXPORT OfxPlugin *OfxGetPlugin(int nth) { + Logger::info("OfxGetPlugin - start()"); + Logger::info(" asking for {}th plugin", nth); + if (nth != 0) + Logger::error("requested plugin {} is more than the number of plugins in the file", nth); + Logger::info("OfxGetPlugin - stop"); + + if (nth == 0) + return &basicPlugin; + return 0; +} + +EXPORT int OfxGetNumberOfPlugins(void) { + Logger::info("OfxGetNumberOfPlugins - start()"); + Logger::info("OfxGetNumberOfPlugins - stop"); + return 1; +} + +//////////////////////////////////////////////////////////////////////////////// +// global destructor, the destructor is called when the plugin is unloaded +class GlobalDestructor { +public: + ~GlobalDestructor(); +}; + +GlobalDestructor::~GlobalDestructor() {} + +static GlobalDestructor globalDestructor; diff --git a/HostSupport/examples/hostDemoClipInstance.cpp b/HostSupport/examples/hostDemoClipInstance.cpp index c067816b4..2b17c66dd 100644 --- a/HostSupport/examples/hostDemoClipInstance.cpp +++ b/HostSupport/examples/hostDemoClipInstance.cpp @@ -301,7 +301,7 @@ namespace MyHost { // Continuous Samples - // // 0 if the images can only be sampled at discrete times (eg: the clip is a sequence of frames), - // 1 if the images can only be sampled continuously (eg: the clip is in fact an animating roto spline and can be rendered anywhen). + // 1 if the images can only be sampled continuously (eg: the clip is in fact an animating roto spline and can be rendered anywhen). bool MyClipInstance::getContinuousSamples() const { return false; diff --git a/HostSupport/examples/hostDemoClipInstance.h b/HostSupport/examples/hostDemoClipInstance.h index 4fa244e3c..4b6733c5c 100755 --- a/HostSupport/examples/hostDemoClipInstance.h +++ b/HostSupport/examples/hostDemoClipInstance.h @@ -99,7 +99,7 @@ namespace MyHost { // Continuous Samples - // // 0 if the images can only be sampled at discrete times (eg: the clip is a sequence of frames), - // 1 if the images can only be sampled continuously (eg: the clip is in fact an animating roto spline and can be rendered anywhen). + // 1 if the images can only be sampled continuously (eg: the clip is in fact an animating roto spline and can be rendered anywhen). virtual bool getContinuousSamples() const; /// override this to fill in the image at the given time. diff --git a/HostSupport/include/ofxhClip.h b/HostSupport/include/ofxhClip.h index fdc63cee4..94058df95 100755 --- a/HostSupport/include/ofxhClip.h +++ b/HostSupport/include/ofxhClip.h @@ -246,7 +246,7 @@ namespace OFX { // Continuous Samples - // // 0 if the images can only be sampled at discrete times (eg: the clip is a sequence of frames), - // 1 if the images can only be sampled continuously (eg: the clip is in fact an animating roto spline and can be rendered anywhen). + // 1 if the images can only be sampled continuously (eg: the clip is in fact an animating roto spline and can be rendered anywhen). virtual bool getContinuousSamples() const = 0; /// override this to fill in the image at the given time. diff --git a/Support/CMakeLists.txt b/Support/CMakeLists.txt index 6d0757991..7285679fc 100644 --- a/Support/CMakeLists.txt +++ b/Support/CMakeLists.txt @@ -1,4 +1,5 @@ set(OFX_SUPPORT_HEADER_DIR "${CMAKE_CURRENT_SOURCE_DIR}/include") +set(OFX_CPP_BINDINGS_HEADER_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../openfx-cpp/include") file(GLOB_RECURSE OFX_SUPPORT_HEADER_FILES "${OFX_SUPPORT_HEADER_DIR}/*.h") add_subdirectory(Library) diff --git a/Support/Plugins/CMakeLists.txt b/Support/Plugins/CMakeLists.txt index 413795d5c..a566e9b9d 100644 --- a/Support/Plugins/CMakeLists.txt +++ b/Support/Plugins/CMakeLists.txt @@ -31,8 +31,8 @@ foreach(PLUGIN IN LISTS PLUGINS) set(TGT example-${PLUGIN}-support) add_ofx_plugin(${TGT} ${PLUGIN}) target_sources(${TGT} PUBLIC ${PLUGIN_SOURCES}) - target_link_libraries(${TGT} ${CONAN_LIBS} OfxSupport opengl::opengl) - target_include_directories(${TGT} PUBLIC ${OFX_HEADER_DIR} ${OFX_SUPPORT_HEADER_DIR}) + target_link_libraries(${TGT} ${CONAN_LIBS} OfxSupport opengl::opengl tcb-span::tcb-span) + target_include_directories(${TGT} PUBLIC ${OFX_HEADER_DIR} ${OFX_SUPPORT_HEADER_DIR} ${OFX_CPP_BINDINGS_HEADER_DIR}) if(APPLE) target_link_libraries(${TGT} "-framework Metal" "-framework Foundation" "-framework QuartzCore") if (OFX_SUPPORTS_OPENCLRENDER) diff --git a/Support/Plugins/Tester/Tester.cpp b/Support/Plugins/Tester/Tester.cpp index 1cf901dc2..11f980f99 100644 --- a/Support/Plugins/Tester/Tester.cpp +++ b/Support/Plugins/Tester/Tester.cpp @@ -16,6 +16,9 @@ #include "ofxsMultiThread.h" #include "ofxsInteract.h" +#include "openfx/ofxPropsBySet.h" +#include "openfx/ofxPropsMetadata.h" + #include "../include/ofxsProcessing.H" static const OfxPointD kBoxSize = {5, 5}; diff --git a/Support/PropTester/CMakeLists.txt b/Support/PropTester/CMakeLists.txt index 44bb26f05..4f70446b9 100644 --- a/Support/PropTester/CMakeLists.txt +++ b/Support/PropTester/CMakeLists.txt @@ -3,5 +3,5 @@ file(GLOB_RECURSE PLUGIN_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/*.cpp") set(TGT example-PropTester) add_ofx_plugin(${TGT} ${CMAKE_CURRENT_SOURCE_DIR}) target_sources(${TGT} PUBLIC ${PLUGIN_SOURCES}) -target_link_libraries(${TGT} ${CONAN_LIBS} OfxSupport opengl::opengl) -target_include_directories(${TGT} PUBLIC ${OFX_HEADER_DIR} ${OFX_SUPPORT_HEADER_DIR}) +target_link_libraries(${TGT} ${CONAN_LIBS} OfxSupport opengl::opengl tcb-span::tcb-span) +target_include_directories(${TGT} PUBLIC ${OFX_HEADER_DIR} ${OFX_SUPPORT_HEADER_DIR} ${OFX_CPP_BINDINGS_HEADER_DIR}) diff --git a/conanfile.py b/conanfile.py index a721d3158..cb9033680 100644 --- a/conanfile.py +++ b/conanfile.py @@ -3,15 +3,17 @@ from conan.tools.files import copy, collect_libs import os.path -required_conan_version = ">=1.59.0" +required_conan_version = ">=2.0.16" class openfx(ConanFile): name = "openfx" - version = "1.4.0" + version = "1.5.0" license = "BSD-3-Clause" url = "https://github.com/AcademySoftwareFoundation/openfx" description = "OpenFX image processing plug-in standard" - + homepage = "https://openeffects.org/" + topics = ["graphics", "vfx", "image-processing", "plugins"] + exports_sources = ( "cmake/*", "Examples/*", @@ -42,6 +44,7 @@ def requirements(self): self.requires("expat/2.7.1") # for HostSupport self.requires("cimg/3.3.2") # to draw text into images self.requires("spdlog/1.13.0") # for logging + self.requires("tcb-span/cci.20220616") # for openfx-cpp span support (C++17) def layout(self): cmake_layout(self) @@ -84,7 +87,7 @@ def package_info(self): self.cpp_info.components["HostSupport"].requires = ["expat::expat"] self.cpp_info.components["Support"].libs = [i for i in libs if "OfxSupport" in i] self.cpp_info.components["Support"].includedirs = ["Support/include"] - self.cpp_info.components["Support"].requires = ["opengl::opengl"] + self.cpp_info.components["Support"].requires = ["opengl::opengl", "cimg::cimg", "spdlog::spdlog", "tcb-span::tcb-span"] if self.settings.os == "Windows": win_defines = ["WINDOWS", "NOMINMAX"] diff --git a/include/ofx-props.yml b/include/ofx-props.yml new file mode 100644 index 000000000..adbdf7d1d --- /dev/null +++ b/include/ofx-props.yml @@ -0,0 +1,1347 @@ +######################################################################## +# All OpenFX properties. +######################################################################## + +# List all properties by property-set, and then metadata for each +# property. + +# Notes: +# - In prop sets, _REFs interpolate the corresponding _DEFs. This is +# just to save repetition, mostly for params. +# - In prop sets, the property set itself sets defaults for which +# side is able to write to props in that prop set. Individual props +# can override that with this syntax: - OfxPropName | write=host,... +# (this is generalizable, so "optional" can be done the same way) +# - Action inArgs/outArgs don't (yet) support this override syntax +# because presumably all inArgs are host->plugin and outArgs are +# plugin->host, by definition. + +propertySets: + ImageEffectHost: + write: host + props: + - OfxPropAPIVersion + - OfxPropType + - OfxPropName + - OfxPropLabel + - OfxPropVersion + - OfxPropVersionLabel + - OfxImageEffectHostPropIsBackground + - OfxImageEffectPropSupportsOverlays + - OfxImageEffectPropSupportsMultiResolution + - OfxImageEffectPropSupportsTiles + - OfxImageEffectPropTemporalClipAccess + - OfxImageEffectPropSupportedComponents + - OfxImageEffectPropSupportedContexts + - OfxImageEffectPropMultipleClipDepths + - OfxImageEffectPropOpenCLSupported | host_optional=true + - OfxImageEffectPropSupportsMultipleClipPARs + - OfxImageEffectPropSetableFrameRate + - OfxImageEffectPropSetableFielding + - OfxParamHostPropSupportsCustomInteract + - OfxParamHostPropSupportsStringAnimation + - OfxParamHostPropSupportsChoiceAnimation + - OfxParamHostPropSupportsBooleanAnimation + - OfxParamHostPropSupportsCustomAnimation + - OfxParamHostPropSupportsStrChoice | host_optional=true + - OfxParamHostPropSupportsStrChoiceAnimation | host_optional=true + - OfxParamHostPropMaxParameters + - OfxParamHostPropMaxPages + - OfxParamHostPropPageRowColumnCount + - OfxPropHostOSHandle | host_optional=true + - OfxParamHostPropSupportsParametricAnimation | host_optional=true + - OfxImageEffectInstancePropSequentialRender | host_optional=true + - OfxImageEffectPropOpenGLRenderSupported + - OfxImageEffectPropRenderQualityDraft | host_optional=true + - OfxImageEffectHostPropNativeOrigin | host_optional=true + - OfxImageEffectPropColourManagementAvailableConfigs | host_optional=true + - OfxImageEffectPropColourManagementStyle | host_optional=true + EffectDescriptor: + write: plugin + props: + - OfxPropType + - OfxPropLabel + - OfxPropShortLabel + - OfxPropLongLabel + - OfxPropVersion | host_optional=true + - OfxPropVersionLabel | host_optional=true + - OfxPropPluginDescription | host_optional=true + - OfxImageEffectPropSupportedContexts + - OfxImageEffectPluginPropGrouping + - OfxImageEffectPluginPropSingleInstance + - OfxImageEffectPluginRenderThreadSafety + - OfxImageEffectPluginPropHostFrameThreading + - OfxImageEffectPluginPropOverlayInteractV1 + - OfxImageEffectPropOpenCLSupported | host_optional=true + - OfxImageEffectPropSupportsMultiResolution + - OfxImageEffectPropSupportsTiles + - OfxImageEffectPropTemporalClipAccess + - OfxImageEffectPropSupportedPixelDepths + - OfxImageEffectPluginPropFieldRenderTwiceAlways + - OfxImageEffectPropMultipleClipDepths # should have been SupportsMultipleClipDepths + - OfxImageEffectPropSupportsMultipleClipPARs + - OfxImageEffectPluginRenderThreadSafety + - OfxImageEffectPropClipPreferencesSlaveParam + - OfxImageEffectPropOpenGLRenderSupported + - OfxPluginPropFilePath | write=host + - OfxOpenGLPropPixelDepth | host_optional=true + - OfxImageEffectPluginPropOverlayInteractV2 + - OfxImageEffectPropColourManagementAvailableConfigs | host_optional=true + - OfxImageEffectPropColourManagementStyle | host_optional=true + - OfxImageEffectPropNoSpatialAwareness | host_optional=true + EffectInstance: + write: host + props: + - OfxPropType + - OfxImageEffectPropContext + - OfxPropInstanceData + - OfxImageEffectPropProjectSize + - OfxImageEffectPropProjectOffset + - OfxImageEffectPropProjectExtent + - OfxImageEffectPropPixelAspectRatio + - OfxImageEffectInstancePropEffectDuration + - OfxImageEffectInstancePropSequentialRender + - OfxImageEffectPropSupportsTiles + - OfxImageEffectPropOpenGLRenderSupported + - OfxImageEffectPropFrameRate + - OfxPropIsInteractive + - OfxImageEffectPropOCIOConfig + - OfxImageEffectPropOCIODisplay + - OfxImageEffectPropOCIOView + - OfxImageEffectPropColourManagementConfig + - OfxImageEffectPropColourManagementStyle + - OfxImageEffectPropDisplayColourspace + - OfxImageEffectPropPluginHandle + ClipDescriptor: + write: plugin + props: + - OfxPropType + - OfxPropName + - OfxPropLabel + - OfxPropShortLabel + - OfxPropLongLabel + - OfxImageEffectPropSupportedComponents + - OfxImageEffectPropTemporalClipAccess + - OfxImageClipPropOptional + - OfxImageClipPropFieldExtraction + - OfxImageClipPropIsMask + - OfxImageEffectPropSupportsTiles + ClipInstance: + write: host + props: + - OfxPropType + - OfxPropName + - OfxPropLabel + - OfxPropShortLabel + - OfxPropLongLabel + - OfxImageEffectPropSupportedComponents + - OfxImageEffectPropTemporalClipAccess + - OfxImageClipPropColourspace + - OfxImageClipPropPreferredColourspaces + - OfxImageClipPropOptional + - OfxImageClipPropFieldExtraction + - OfxImageClipPropIsMask + - OfxImageEffectPropSupportsTiles + - OfxImageEffectPropPixelDepth + - OfxImageEffectPropComponents + - OfxImageClipPropUnmappedPixelDepth + - OfxImageClipPropUnmappedComponents + - OfxImageEffectPropPreMultiplication + - OfxImagePropPixelAspectRatio + - OfxImageEffectPropFrameRate + - OfxImageEffectPropFrameRange + - OfxImageClipPropFieldOrder + - OfxImageClipPropConnected + - OfxImageEffectPropUnmappedFrameRange + - OfxImageEffectPropUnmappedFrameRate + - OfxImageClipPropContinuousSamples + Image: + write: host + props: + - OfxPropType + - OfxImageEffectPropPixelDepth + - OfxImageEffectPropComponents + - OfxImageEffectPropPreMultiplication + - OfxImageEffectPropRenderScale + - OfxImagePropPixelAspectRatio + - OfxImagePropData + - OfxImagePropBounds + - OfxImagePropRegionOfDefinition + - OfxImagePropRowBytes + - OfxImagePropField + - OfxImagePropUniqueIdentifier + ParameterSet: + write: plugin + props: + - OfxPropParamSetNeedsSyncing + - OfxPluginPropParamPageOrder + ParamsCommon_DEF: + - OfxPropType + - OfxPropName + - OfxPropLabel + - OfxPropShortLabel + - OfxPropLongLabel + - OfxParamPropType + - OfxParamPropSecret + - OfxParamPropHint + - OfxParamPropScriptName + - OfxParamPropParent + - OfxParamPropEnabled + - OfxParamPropDataPtr + - OfxPropIcon + ParamsAllButGroupPage_DEF: + - OfxParamPropInteractV1 + - OfxParamPropInteractSize + - OfxParamPropInteractSizeAspect + - OfxParamPropInteractMinimumSize + - OfxParamPropInteractPreferedSize + - OfxParamPropHasHostOverlayHandle + - kOfxParamPropUseHostOverlayHandle + ParamsValue_DEF: + - OfxParamPropDefault + - OfxParamPropAnimates + - OfxParamPropIsAnimating | write=host + - OfxParamPropIsAutoKeying | write=host + - OfxParamPropPersistant + - OfxParamPropEvaluateOnChange + - OfxParamPropPluginMayWrite + - OfxParamPropCacheInvalidation + - OfxParamPropCanUndo + ParamsNumeric_DEF: + - OfxParamPropMin + - OfxParamPropMax + - OfxParamPropDisplayMin + - OfxParamPropDisplayMax + ParamsDouble_DEF: + - OfxParamPropIncrement + - OfxParamPropDigits + ParamsGroup: + write: plugin + props: + - OfxParamPropGroupOpen + - ParamsCommon_REF + ParamDouble1D: + write: plugin + props: + - OfxParamPropShowTimeMarker + - OfxParamPropDoubleType + - ParamsCommon_REF + - ParamsAllButGroupPage_REF + - ParamsValue_REF + - ParamsNumeric_REF + - ParamsDouble_REF + ParamsDouble2D3D: + write: plugin + props: + - OfxParamPropDoubleType + - ParamsCommon_REF + - ParamsAllButGroupPage_REF + - ParamsValue_REF + - ParamsNumeric_REF + - ParamsDouble_REF + ParamsNormalizedSpatial: + write: plugin + props: + - OfxParamPropDefaultCoordinateSystem + - ParamsCommon_REF + - ParamsAllButGroupPage_REF + - ParamsValue_REF + - ParamsNumeric_REF + - ParamsDouble_REF + ParamsInt2D3D: + write: plugin + props: + - OfxParamPropDimensionLabel + - ParamsCommon_REF + - ParamsAllButGroupPage_REF + - ParamsValue_REF + - ParamsNumeric_REF + ParamsString: + write: plugin + props: + - OfxParamPropStringMode + - OfxParamPropStringFilePathExists + - ParamsCommon_REF + - ParamsAllButGroupPage_REF + - ParamsValue_REF + - ParamsNumeric_REF + ParamsByte: + write: plugin + props: + - ParamsCommon_REF + - ParamsAllButGroupPage_REF + - ParamsValue_REF + - ParamsNumeric_REF + ParamsChoice: + write: plugin + props: + - OfxParamPropChoiceOption + - OfxParamPropChoiceOrder + - ParamsCommon_REF + - ParamsAllButGroupPage_REF + - ParamsValue_REF + ParamsStrChoice: + write: plugin + props: + - OfxParamPropChoiceOption + - OfxParamPropChoiceEnum + - ParamsCommon_REF + - ParamsAllButGroupPage_REF + - ParamsValue_REF + ParamsCustom: + write: plugin + props: + - OfxParamPropCustomCallbackV1 + - ParamsCommon_REF + - ParamsAllButGroupPage_REF + - ParamsValue_REF + ParamsPage: + write: plugin + props: + - OfxParamPropPageChild + - ParamsCommon_REF + ParamsParametric: + write: plugin + props: + - OfxParamPropAnimates + - OfxParamPropIsAnimating + - OfxParamPropIsAutoKeying + - OfxParamPropPersistant + - OfxParamPropEvaluateOnChange + - OfxParamPropPluginMayWrite + - OfxParamPropCacheInvalidation + - OfxParamPropCanUndo + - OfxParamPropParametricDimension + - OfxParamPropParametricUIColour + - OfxParamPropParametricInteractBackground + - OfxParamPropParametricRange + - ParamsCommon_REF + - ParamsAllButGroupPage_REF + - ParamsValue_REF + InteractDescriptor: + write: host + props: + - OfxInteractPropHasAlpha + - OfxInteractPropBitDepth + InteractInstance: + write: host + props: + - OfxPropEffectInstance + - OfxPropInstanceData + - OfxInteractPropPixelScale + - OfxInteractPropBackgroundColour + - OfxInteractPropHasAlpha + - OfxInteractPropBitDepth + - OfxInteractPropSlaveToParam + - OfxInteractPropSuggestedColour + +Actions: + OfxActionLoad: + inArgs: + outArgs: + OfxActionDescribe: + inArgs: + outArgs: + OfxActionUnload: + inArgs: + outArgs: + OfxActionPurgeCaches: + inArgs: + outArgs: + OfxActionSyncPrivateData: + inArgs: + outArgs: + OfxActionCreateInstance: + inArgs: + outArgs: + OfxActionDestroyInstance: + inArgs: + outArgs: + OfxActionInstanceChanged: + inArgs: + - OfxPropType + - OfxPropName + - OfxPropChangeReason + - OfxPropTime + - OfxImageEffectPropRenderScale + outArgs: + OfxActionBeginInstanceChanged: + inArgs: + - OfxPropChangeReason + outArgs: [] + OfxActionEndInstanceChanged: + inArgs: + - OfxPropChangeReason + outArgs: + OfxActionBeginInstanceEdit: + inArgs: + outArgs: + OfxActionEndInstanceEdit: + inArgs: + outArgs: + OfxImageEffectActionGetRegionOfDefinition: + inArgs: + - OfxPropTime + - OfxImageEffectPropRenderScale + outArgs: + - OfxImageEffectPropRegionOfDefinition + OfxImageEffectActionGetRegionsOfInterest: + inArgs: + - OfxPropTime + - OfxImageEffectPropRenderScale + - OfxImageEffectPropRegionOfInterest + outArgs: + # - OfxImageEffectClipPropRoI_ # with clip name + OfxImageEffectActionGetTimeDomain: + inArgs: + outArgs: + - OfxImageEffectPropFrameRange + OfxImageEffectActionGetFramesNeeded: + inArgs: + - OfxPropTime + outArgs: + - OfxImageEffectPropFrameRange + OfxImageEffectActionGetClipPreferences: + inArgs: + outArgs: + - OfxImageEffectPropFrameRate + - OfxImageClipPropFieldOrder + - OfxImageEffectPropPreMultiplication + - OfxImageClipPropContinuousSamples + - OfxImageEffectFrameVarying + # these special props all have the clip name postpended after "_" + # - OfxImageClipPropComponents_ + # - OfxImageClipPropDepth_ + # - OfxImageClipPropPreferredColourspaces_ + # - OfxImageClipPropPAR_ + OfxImageEffectActionIsIdentity: + inArgs: + - OfxPropTime + - OfxImageEffectPropFieldToRender + - OfxImageEffectPropRenderWindow + - OfxImageEffectPropRenderScale + OfxImageEffectActionRender: + inArgs: + - OfxPropTime + - OfxImageEffectPropSequentialRenderStatus + - OfxImageEffectPropInteractiveRenderStatus + - OfxImageEffectPropRenderQualityDraft + - OfxImageEffectPropCudaEnabled + - OfxImageEffectPropCudaRenderSupported + - OfxImageEffectPropCudaStream + - OfxImageEffectPropCudaStreamSupported + - OfxImageEffectPropMetalCommandQueue + - OfxImageEffectPropMetalEnabled + - OfxImageEffectPropMetalRenderSupported + - OfxImageEffectPropOpenCLCommandQueue + - OfxImageEffectPropOpenCLEnabled + - OfxImageEffectPropOpenCLImage + - OfxImageEffectPropOpenCLRenderSupported + - OfxImageEffectPropOpenCLSupported + - OfxImageEffectPropOpenGLEnabled + - OfxImageEffectPropOpenGLTextureIndex + - OfxImageEffectPropOpenGLTextureTarget + - OfxImageEffectPropNoSpatialAwareness + OfxImageEffectActionBeginSequenceRender: + inArgs: + - OfxImageEffectPropFrameRange + - OfxImageEffectPropFrameStep + - OfxPropIsInteractive + - OfxImageEffectPropRenderScale + - OfxImageEffectPropSequentialRenderStatus + - OfxImageEffectPropInteractiveRenderStatus + - OfxImageEffectPropCudaEnabled + - OfxImageEffectPropCudaRenderSupported + - OfxImageEffectPropCudaStream + - OfxImageEffectPropCudaStreamSupported + - OfxImageEffectPropMetalCommandQueue + - OfxImageEffectPropMetalEnabled + - OfxImageEffectPropMetalRenderSupported + - OfxImageEffectPropOpenCLCommandQueue + - OfxImageEffectPropOpenCLEnabled + - OfxImageEffectPropOpenCLImage + - OfxImageEffectPropOpenCLRenderSupported + - OfxImageEffectPropOpenCLSupported + - OfxImageEffectPropOpenGLEnabled + - OfxImageEffectPropOpenGLTextureIndex + - OfxImageEffectPropOpenGLTextureTarget + - OfxImageEffectPropInteractiveRenderStatus + - OfxImageEffectPropNoSpatialAwareness + outArgs: + OfxImageEffectActionEndSequenceRender: + inArgs: + - OfxImageEffectPropFrameRange + - OfxImageEffectPropFrameStep + - OfxPropIsInteractive + - OfxImageEffectPropRenderScale + - OfxImageEffectPropSequentialRenderStatus + - OfxImageEffectPropInteractiveRenderStatus + - OfxImageEffectPropCudaEnabled + - OfxImageEffectPropCudaRenderSupported + - OfxImageEffectPropCudaStream + - OfxImageEffectPropCudaStreamSupported + - OfxImageEffectPropMetalCommandQueue + - OfxImageEffectPropMetalEnabled + - OfxImageEffectPropMetalRenderSupported + - OfxImageEffectPropOpenCLCommandQueue + - OfxImageEffectPropOpenCLEnabled + - OfxImageEffectPropOpenCLImage + - OfxImageEffectPropOpenCLRenderSupported + - OfxImageEffectPropOpenCLSupported + - OfxImageEffectPropOpenGLEnabled + - OfxImageEffectPropOpenGLTextureIndex + - OfxImageEffectPropOpenGLTextureTarget + - OfxImageEffectPropInteractiveRenderStatus + outArgs: + OfxImageEffectActionDescribeInContext: + inArgs: + - OfxImageEffectPropContext + outArgs: + # These are duplicates of regular describe/create/destroy, + # not unique action names. + # OfxActionDescribeInteract: + # inArgs: + # outArgs: + # OfxActionCreateInstanceInteract: + # inArgs: + # outArgs: + # OfxActionDestroyInstanceInteract: + # inArgs: + # outArgs: + OfxInteractActionDraw: + inArgs: + - OfxPropEffectInstance + - OfxInteractPropDrawContext + - OfxInteractPropPixelScale + - OfxInteractPropBackgroundColour + - OfxPropTime + - OfxImageEffectPropRenderScale + outArgs: + OfxInteractActionPenMotion: + inArgs: + - OfxPropEffectInstance + - OfxInteractPropPixelScale + - OfxInteractPropBackgroundColour + - OfxPropTime + - OfxImageEffectPropRenderScale + - OfxInteractPropPenPosition + - OfxInteractPropPenViewportPosition + - OfxInteractPropPenPressure + outArgs: + OfxInteractActionPenDown: + inArgs: + - OfxPropEffectInstance + - OfxInteractPropPixelScale + - OfxInteractPropBackgroundColour + - OfxPropTime + - OfxImageEffectPropRenderScale + - OfxInteractPropPenPosition + - OfxInteractPropPenViewportPosition + - OfxInteractPropPenPressure + outArgs: + OfxInteractActionPenUp: + inArgs: + - OfxPropEffectInstance + - OfxInteractPropPixelScale + - OfxInteractPropBackgroundColour + - OfxPropTime + - OfxImageEffectPropRenderScale + - OfxInteractPropPenPosition + - OfxInteractPropPenViewportPosition + - OfxInteractPropPenPressure + outArgs: + OfxInteractActionKeyDown: + inArgs: + - OfxPropEffectInstance + - kOfxPropKeySym + - kOfxPropKeyString + - OfxPropTime + - OfxImageEffectPropRenderScale + outArgs: + OfxInteractActionKeyUp: + inArgs: + - OfxPropEffectInstance + - kOfxPropKeySym + - kOfxPropKeyString + - OfxPropTime + - OfxImageEffectPropRenderScale + outArgs: + OfxInteractActionKeyRepeat: + inArgs: + - OfxPropEffectInstance + - kOfxPropKeySym + - kOfxPropKeyString + - OfxPropTime + - OfxImageEffectPropRenderScale + outArgs: + OfxInteractActionGainFocus: + inArgs: + - OfxPropEffectInstance + - OfxInteractPropPixelScale + - OfxInteractPropBackgroundColour + - OfxPropTime + - OfxImageEffectPropRenderScale + outArgs: + OfxInteractActionLoseFocus: + inArgs: + - OfxPropEffectInstance + - OfxInteractPropPixelScale + - OfxInteractPropBackgroundColour + - OfxPropTime + - OfxImageEffectPropRenderScale + outArgs: + CustomParamInterpFunc: + inArgs: + - OfxParamPropCustomValue + - OfxParamPropInterpolationTime + - OfxParamPropInterpolationAmount + outArgs: + - OfxParamPropCustomValue + - OfxParamPropInterpolationTime + OfxImageEffectActionGetOutputColourspace: + inArgs: + - OfxImageClipPropPreferredColourspaces + outArgs: + - OfxImageClipPropColourspace + +# Properties by name. +# Notes: +# type=bool means an int property with value 1 or 0 for true or false. +# type=enum means a string property with values from the "values" list +# default: only include here if not "" for strings or 0 for numeric or null for ptr. +# hostOptional: is it optional for a host to support this prop? Only include if true. +# pluginOptional: is it optional for a plugin to support this prop? Only include if true. +# dimension: 0 means "any dimension OK" +properties: + OfxPropType: + type: string + dimension: 1 + OfxPropName: + type: string + dimension: 1 + OfxPropTime: + type: double + dimension: 1 + # Param props + OfxParamPropSecret: + type: bool + dimension: 1 + OfxParamPropHint: + type: string + dimension: 1 + OfxParamPropScriptName: + type: string + dimension: 1 + OfxParamPropParent: + type: string + dimension: 1 + OfxParamPropEnabled: + type: bool + dimension: 1 + optional: true + OfxParamPropDataPtr: + type: pointer + dimension: 1 + OfxParamPropType: + type: string + dimension: 1 + OfxPropLabel: + type: string + dimension: 1 + OfxPropShortLabel: + type: string + dimension: 1 + hostOptional: true + OfxPropLongLabel: + type: string + dimension: 1 + hostOptional: true + OfxPropIcon: + type: string + dimension: 2 + hostOptional: true + # host props + OfxPropAPIVersion: + type: int + dimension: 0 + OfxPropVersion: + type: int + dimension: 0 + OfxPropVersionLabel: + type: string + dimension: 1 + # ImageEffect props: + OfxPropPluginDescription: + type: string + dimension: 1 + OfxImageEffectPropSupportedContexts: + type: enum + dimension: 0 + values: + - OfxImageEffectContextGenerator + - OfxImageEffectContextFilter + - OfxImageEffectContextTransition + - OfxImageEffectContextPaint + - OfxImageEffectContextGeneral + - OfxImageEffectContextRetimer + OfxImageEffectPluginPropGrouping: + type: string + dimension: 1 + OfxImageEffectPluginPropSingleInstance: + type: bool + dimension: 1 + OfxImageEffectPluginRenderThreadSafety: + type: enum + dimension: 1 + values: + - OfxImageEffectRenderUnsafe + - OfxImageEffectRenderInstanceSafe + - OfxImageEffectRenderFullySafe + OfxImageEffectPluginPropHostFrameThreading: + type: bool + dimension: 1 + OfxImageEffectPropSupportsMultiResolution: + type: bool + dimension: 1 + OfxImageEffectPropSupportsTiles: + type: bool + dimension: 1 + OfxImageEffectPropTemporalClipAccess: + type: bool + dimension: 1 + OfxImageEffectPropSupportedPixelDepths: + type: enum + dimension: 0 + values: + - OfxBitDepthNone + - OfxBitDepthByte + - OfxBitDepthShort + - OfxBitDepthHalf + - OfxBitDepthFloat + OfxImageEffectPluginPropFieldRenderTwiceAlways: + type: bool + dimension: 1 + OfxImageEffectPropMultipleClipDepths: + cname: kOfxImageEffectPropSupportsMultipleClipDepths + type: bool + dimension: 1 + OfxImageEffectPropSupportsMultipleClipPARs: + type: bool + dimension: 1 + OfxImageEffectPropClipPreferencesSlaveParam: + type: string + dimension: 0 + OfxImageEffectInstancePropSequentialRender: + type: bool + dimension: 1 + OfxPluginPropFilePath: + type: string + dimension: 1 + OfxImageEffectPropOpenGLRenderSupported: + type: enum + dimension: 1 + values: ['false', 'true', 'needed'] + OfxImageEffectPropCudaRenderSupported: + type: enum + dimension: 1 + values: ['false', 'true', 'needed'] + OfxImageEffectPropCudaStreamSupported: + type: enum + dimension: 1 + values: ['false', 'true', 'needed'] + OfxImageEffectPropMetalRenderSupported: + type: enum + dimension: 1 + values: ['false', 'true', 'needed'] + introduced: "1.5" + OfxImageEffectPropOpenCLRenderSupported: + type: enum + dimension: 1 + values: ['false', 'true', 'needed'] + introduced: "1.5" + # Clip props + OfxImageClipPropColourspace: + type: string + dimension: 1 + introduced: "1.5" + OfxImageClipPropConnected: + type: bool + dimension: 1 + OfxImageClipPropContinuousSamples: + type: bool + dimension: 1 + OfxImageClipPropFieldExtraction: + type: enum + dimension: 1 + values: ['OfxImageFieldNone', 'OfxImageFieldLower', 'OfxImageFieldUpper', 'OfxImageFieldBoth', 'OfxImageFieldSingle', 'OfxImageFieldDoubled'] + OfxImageClipPropFieldOrder: + type: enum + dimension: 1 + values: ['OfxImageFieldNone', 'OfxImageFieldLower', 'OfxImageFieldUpper'] + OfxImageClipPropIsMask: + type: bool + dimension: 1 + OfxImageClipPropOptional: + type: bool + dimension: 1 + OfxImageClipPropPreferredColourspaces: + type: string + dimension: 0 + introduced: "1.5" + OfxImageClipPropUnmappedComponents: + type: enum + dimension: 1 + values: + - OfxImageComponentNone + - OfxImageComponentRGBA + - OfxImageComponentRGB + - OfxImageComponentAlpha + OfxImageClipPropUnmappedPixelDepth: + type: enum + dimension: 1 + values: + - OfxBitDepthNone + - OfxBitDepthByte + - OfxBitDepthShort + - OfxBitDepthHalf + - OfxBitDepthFloat + # # Special props, with clip names postpended: + # OfxImageClipPropComponents_: + # type: enum + # dimension: 1 + # values: + # - OfxImageComponentNone + # - OfxImageComponentRGBA + # - OfxImageComponentRGB + # - OfxImageComponentAlpha + # OfxImageClipPropDepth_: + # type: enum + # dimension: 1 + # values: + # - OfxBitDepthNone + # - OfxBitDepthByte + # - OfxBitDepthShort + # - OfxBitDepthHalf + # - OfxBitDepthFloat + # OfxImageClipPropPreferredColourspaces_: + # type: string + # dimension: 1 + # OfxImageClipPropPAR_: + # type: double + # dimension: 1 + # OfxImageClipPropRoI_: + # type: int + # dimension: 4 + + # Image Effect + OfxImageEffectFrameVarying: + type: bool + dimension: 1 + OfxImageEffectHostPropIsBackground: + type: bool + dimension: 1 + OfxImageEffectHostPropNativeOrigin: + type: enum + dimension: 1 + values: + - OfxImageEffectHostPropNativeOriginBottomLeft + - OfxImageEffectHostPropNativeOriginTopLeft + - OfxImageEffectHostPropNativeOriginCenter + OfxImageEffectInstancePropEffectDuration: + type: double + dimension: 1 + OfxImageEffectPluginPropOverlayInteractV1: + type: pointer + dimension: 1 + OfxImageEffectPluginPropOverlayInteractV2: + type: pointer + dimension: 1 + OfxImageEffectPropColourManagementAvailableConfigs: + type: string + dimension: 0 + introduced: "1.5" + OfxImageEffectPropColourManagementStyle: + type: enum + dimension: 1 + values: + - OfxImageEffectPropColourManagementNone + - OfxImageEffectPropColourManagementBasic + - OfxImageEffectPropColourManagementCore + - OfxImageEffectPropColourManagementFull + - OfxImageEffectPropColourManagementOCIO + introduced: "1.5" + OfxImageEffectPropComponents: + type: enum + dimension: 1 + values: + - OfxImageComponentNone + - OfxImageComponentRGBA + - OfxImageComponentRGB + - OfxImageComponentAlpha + OfxImageEffectPropContext: + type: enum + dimension: 1 + values: + - OfxImageEffectContextGenerator + - OfxImageEffectContextFilter + - OfxImageEffectContextTransition + - OfxImageEffectContextPaint + - OfxImageEffectContextGeneral + - OfxImageEffectContextRetimer + OfxImageEffectPropCudaEnabled: + type: bool + dimension: 1 + OfxImageEffectPropCudaStream: + type: pointer + dimension: 1 + OfxImageEffectPropDisplayColourspace: + type: string + dimension: 1 + introduced: "1.5" + OfxImageEffectPropFieldToRender: + type: enum + dimension: 1 + values: + - OfxImageFieldNone + - OfxImageFieldBoth + - OfxImageFieldLower + - OfxImageFieldUpper + OfxImageEffectPropFrameRange: + type: double + dimension: 2 + OfxImageEffectPropFrameRate: + type: double + dimension: 1 + OfxImageEffectPropFrameStep: + type: double + dimension: 1 + OfxImageEffectPropInAnalysis: + type: bool + dimension: 1 + deprecated: "1.4" + OfxImageEffectPropInteractiveRenderStatus: + type: bool + dimension: 1 + OfxImageEffectPropMetalCommandQueue: + type: pointer + dimension: 1 + introduced: "1.5" + OfxImageEffectPropMetalEnabled: + type: bool + dimension: 1 + introduced: "1.5" + OfxImageEffectPropOCIOConfig: + type: string + dimension: 1 + introduced: "1.5" + OfxImageEffectPropOCIODisplay: + type: string + dimension: 1 + introduced: "1.5" + OfxImageEffectPropOCIOView: + type: string + dimension: 1 + introduced: "1.5" + OfxImageEffectPropOpenCLCommandQueue: + type: pointer + dimension: 1 + introduced: "1.5" + OfxImageEffectPropOpenCLEnabled: + type: bool + dimension: 1 + introduced: "1.5" + OfxImageEffectPropOpenCLImage: + type: pointer + dimension: 1 + introduced: "1.5" + OfxImageEffectPropOpenCLSupported: + type: enum + dimension: 1 + values: + - "false" + - "true" + introduced: "1.5" + OfxImageEffectPropOpenGLEnabled: + type: bool + dimension: 1 + OfxImageEffectPropOpenGLTextureIndex: + type: int + dimension: 1 + OfxImageEffectPropOpenGLTextureTarget: + type: int + dimension: 1 + OfxImageEffectPropPixelDepth: + type: enum + dimension: 1 + values: + - OfxBitDepthNone + - OfxBitDepthByte + - OfxBitDepthShort + - OfxBitDepthHalf + - OfxBitDepthFloat + OfxImageEffectPropPluginHandle: + type: pointer + dimension: 1 + OfxImageEffectPropPreMultiplication: + type: enum + dimension: 1 + values: + - OfxImageOpaque + - OfxImagePreMultiplied + - OfxImageUnPreMultiplied + OfxImageEffectPropProjectExtent: + type: double + dimension: 2 + OfxImageEffectPropProjectOffset: + type: double + dimension: 2 + OfxImageEffectPropPixelAspectRatio: + cname: kOfxImageEffectPropProjectPixelAspectRatio + type: double + dimension: 1 + OfxImageEffectPropProjectSize: + type: double + dimension: 2 + OfxImageEffectPropRegionOfDefinition: + type: double + dimension: 4 + OfxImageEffectPropRegionOfInterest: + type: double + dimension: 4 + OfxImageEffectPropRenderQualityDraft: + type: bool + dimension: 1 + OfxImageEffectPropRenderScale: + type: double + dimension: 2 + OfxImageEffectPropRenderWindow: + type: int + dimension: 4 + OfxImageEffectPropSequentialRenderStatus: + type: bool + dimension: 1 + OfxImageEffectPropSetableFielding: + type: bool + dimension: 1 + OfxImageEffectPropSetableFrameRate: + type: bool + dimension: 1 + OfxImageEffectPropSupportedComponents: + type: enum + dimension: 0 + values: + - OfxImageComponentNone + - OfxImageComponentRGBA + - OfxImageComponentRGB + - OfxImageComponentAlpha + OfxImageEffectPropSupportsOverlays: + type: bool + dimension: 1 + OfxImageEffectPropUnmappedFrameRange: + type: double + dimension: 2 + OfxImageEffectPropUnmappedFrameRate: + type: double + dimension: 1 + OfxImageEffectPropColourManagementConfig: + type: string + dimension: 1 + introduced: "1.5" + OfxImagePropBounds: + type: int + dimension: 4 + OfxImagePropData: + type: pointer + dimension: 1 + OfxImagePropField: + type: enum + dimension: 1 + values: + - OfxImageFieldNone + - OfxImageFieldBoth + - OfxImageFieldLower + - OfxImageFieldUpper + OfxImagePropPixelAspectRatio: + type: double + dimension: 1 + OfxImagePropRegionOfDefinition: + type: int + dimension: 4 + OfxImagePropRowBytes: + type: int + dimension: 1 + OfxImagePropUniqueIdentifier: + type: string + dimension: 1 + # Interact/Drawing + OfxInteractPropBackgroundColour: + type: double + dimension: 3 + OfxInteractPropBitDepth: + type: int + dimension: 1 + OfxInteractPropDrawContext: + type: pointer + dimension: 1 + OfxInteractPropHasAlpha: + type: bool + dimension: 1 + OfxInteractPropPenPosition: + type: double + dimension: 2 + OfxInteractPropPenPressure: + type: double + dimension: 1 + OfxInteractPropPenViewportPosition: + type: int + dimension: 2 + OfxInteractPropPixelScale: + type: double + dimension: 2 + OfxInteractPropSlaveToParam: + type: string + dimension: 0 + OfxInteractPropSuggestedColour: + type: double + dimension: 3 + OfxInteractPropViewport: + cname: kOfxInteractPropViewportSize + type: int + dimension: 2 + deprecated: "1.3" + OfxOpenGLPropPixelDepth: + type: enum + dimension: 0 + values: + - OfxBitDepthNone + - OfxBitDepthByte + - OfxBitDepthShort + - OfxBitDepthHalf + - OfxBitDepthFloat + OfxParamHostPropMaxPages: + type: int + dimension: 1 + OfxParamHostPropMaxParameters: + type: int + dimension: 1 + OfxParamHostPropPageRowColumnCount: + type: int + dimension: 2 + OfxParamHostPropSupportsBooleanAnimation: + type: bool + dimension: 1 + OfxParamHostPropSupportsChoiceAnimation: + type: bool + dimension: 1 + OfxParamHostPropSupportsCustomAnimation: + type: bool + dimension: 1 + OfxParamHostPropSupportsCustomInteract: + type: bool + dimension: 1 + OfxParamHostPropSupportsParametricAnimation: + type: bool + dimension: 1 + OfxParamHostPropSupportsStrChoice: + type: bool + dimension: 1 + introduced: "1.5" + OfxParamHostPropSupportsStrChoiceAnimation: + type: bool + dimension: 1 + introduced: "1.5" + OfxParamHostPropSupportsStringAnimation: + type: bool + dimension: 1 + # Param + OfxParamPropAnimates: + type: bool + dimension: 1 + OfxParamPropCacheInvalidation: + type: enum + dimension: 1 + values: + - OfxParamInvalidateValueChange + - OfxParamInvalidateValueChangeToEnd + - OfxParamInvalidateAll + OfxParamPropCanUndo: + type: bool + dimension: 1 + OfxParamPropChoiceEnum: + type: bool + dimension: 1 + added: "1.5" + OfxParamPropChoiceOption: + type: string + dimension: 0 + OfxParamPropChoiceOrder: + type: int + dimension: 0 + OfxParamPropCustomCallbackV1: + cname: kOfxParamPropCustomInterpCallbackV1 + type: pointer + dimension: 1 + OfxParamPropCustomValue: + type: string + dimension: 2 + # This is special because its type and dims vary depending on the param + OfxParamPropDefault: + type: [int, double, string, pointer] + dimension: 0 + OfxParamPropDefaultCoordinateSystem: + type: enum + dimension: 1 + values: + - OfxParamCoordinatesCanonical + - OfxParamCoordinatesNormalised + OfxParamPropDigits: + type: int + dimension: 1 + OfxParamPropDimensionLabel: + type: string + dimension: 1 + OfxParamPropDisplayMax: + type: [int, double] + dimension: 0 + OfxParamPropDisplayMin: + type: [int, double] + dimension: 0 + OfxParamPropDoubleType: + type: enum + dimension: 1 + values: + - OfxParamDoubleTypePlain + - OfxParamDoubleTypeAngle + - OfxParamDoubleTypeScale + - OfxParamDoubleTypeTime + - OfxParamDoubleTypeAbsoluteTime + - OfxParamDoubleTypeX + - OfxParamDoubleTypeXAbsolute + - OfxParamDoubleTypeY + - OfxParamDoubleTypeYAbsolute + - OfxParamDoubleTypeXY + - OfxParamDoubleTypeXYAbsolute + OfxParamPropEvaluateOnChange: + type: bool + dimension: 1 + OfxParamPropGroupOpen: + type: bool + dimension: 1 + OfxParamPropHasHostOverlayHandle: + type: bool + dimension: 1 + OfxParamPropIncrement: + type: double + dimension: 1 + OfxParamPropInteractMinimumSize: + type: double + dimension: 2 + OfxParamPropInteractPreferedSize: + type: int + dimension: 2 + OfxParamPropInteractSize: + type: double + dimension: 2 + OfxParamPropInteractSizeAspect: + type: double + dimension: 1 + OfxParamPropInteractV1: + type: pointer + dimension: 1 + OfxParamPropInterpolationAmount: + type: double + dimension: 1 + OfxParamPropInterpolationTime: + type: double + dimension: 2 + OfxParamPropIsAnimating: + type: bool + dimension: 1 + OfxParamPropIsAutoKeying: + type: bool + dimension: 1 + OfxParamPropMax: + type: [int, double] + dimension: 0 + OfxParamPropMin: + type: [int, double] + dimension: 0 + OfxParamPropPageChild: + type: string + dimension: 0 + OfxParamPropParametricDimension: + type: int + dimension: 1 + OfxParamPropParametricInteractBackground: + type: pointer + dimension: 1 + OfxParamPropParametricRange: + type: double + dimension: 2 + OfxParamPropParametricUIColour: + type: double + dimension: 0 + OfxParamPropPersistant: + type: bool + dimension: 1 + OfxParamPropPluginMayWrite: + type: bool + dimension: 1 + deprecated: "1.4" + OfxParamPropShowTimeMarker: + type: bool + dimension: 1 + OfxParamPropStringMode: + type: enum + dimension: 1 + values: + - OfxParamStringIsSingleLine + - OfxParamStringIsMultiLine + - OfxParamStringIsFilePath + - OfxParamStringIsDirectoryPath + - OfxParamStringIsLabel + - OfxParamStringIsRichTextFormat + kOfxParamPropUseHostOverlayHandle: + cname: kOfxParamPropUseHostOverlayHandle + type: bool + dimension: 1 + OfxParamPropStringFilePathExists: + type: bool + dimension: 1 + OfxPluginPropParamPageOrder: + type: string + dimension: 0 + OfxPropChangeReason: + type: enum + dimension: 1 + values: + - OfxChangeUserEdited + - OfxChangePluginEdited + - OfxChangeTime + OfxPropEffectInstance: + type: pointer + dimension: 1 + OfxPropHostOSHandle: + type: pointer + dimension: 1 + OfxPropInstanceData: + type: pointer + dimension: 1 + OfxPropIsInteractive: + type: bool + dimension: 1 + kOfxPropKeyString: + cname: kOfxPropKeyString + type: string + dimension: 1 + kOfxPropKeySym: + cname: kOfxPropKeySym + type: int + dimension: 1 + OfxPropParamSetNeedsSyncing: + type: bool + dimension: 1 + OfxImageEffectPropNoSpatialAwareness: + dimension: 1 + type: enum + values: ['false', 'true'] diff --git a/include/ofxCore.h b/include/ofxCore.h index 0fff10bd9..9454eb8ee 100644 --- a/include/ofxCore.h +++ b/include/ofxCore.h @@ -616,9 +616,9 @@ If this is not present, it is safe to assume that the version of the API is "1.0 - Property Set - effect instance (read only) - Valid Values - 0 or 1 -If false the effect currently has no interface, however this may be because the effect is loaded in a background render host, or it may be loaded on an interactive host that has not yet opened an editor for the effect. +If false, the effect currently has no interface. This may be because the effect is loaded in a background render host, or it may be loaded on an interactive host that has not yet opened an editor for the effect. -The output of an effect should only ever depend on the state of its parameters, not on the interactive flag. The interactive flag is more a courtesy flag to let a plugin know that it has an interface. If a plugin wants to have its behaviour dependent on the interactive flag, it can always make a secret parameter which shadows the state if the flag. +The output of an effect should only ever depend on the state of its parameters, not on the interactive flag. The interactive flag is more a courtesy flag to let a plugin know that it has an interface. If a plugin wants to have its behaviour depend on the interactive flag, it should make a secret parameter which shadows the state of the flag. */ #define kOfxPropIsInteractive "OfxPropIsInteractive" diff --git a/include/ofxImageEffect.h b/include/ofxImageEffect.h index 7dd644d29..7ef961597 100644 --- a/include/ofxImageEffect.h +++ b/include/ofxImageEffect.h @@ -931,7 +931,7 @@ then the plugin can detect this via an identifier change and re-evaluate the cac - Default - 0 as an out argument to the ::kOfxImageEffectActionGetClipPreferences action - Valid Values - This must be one of... - 0 if the images can only be sampled at discrete times (eg: the clip is a sequence of frames), - - 1 if the images can only be sampled continuously (eg: the clip is in fact an animating roto spline and can be rendered anywhen). + - 1 if the images can only be sampled continuously (eg: the clip is in fact an animating roto spline and can be rendered at any time). If this is set to true, then the frame rate of a clip is effectively infinite, so to stop arithmetic errors the frame rate should then be set to 0. diff --git a/include/ofxInteract.h b/include/ofxInteract.h index b9f9de1a9..053569591 100644 --- a/include/ofxInteract.h +++ b/include/ofxInteract.h @@ -111,7 +111,7 @@ This is used to indicate the status of the 'pen' in an interact. If a pen has on */ #define kOfxInteractPropPenPressure "OfxInteractPropPenPressure" -/** @brief Indicates whether the dits per component in the interact's openGL frame buffer +/** @brief Indicates the bits per component in the interact's openGL frame buffer - Type - int X 1 - Property Set - interact instance and descriptor (read only) diff --git a/include/ofxKeySyms.h b/include/ofxKeySyms.h index 9ef59dbbb..fe5d2fd5e 100644 --- a/include/ofxKeySyms.h +++ b/include/ofxKeySyms.h @@ -31,7 +31,7 @@ the UTF8 value. /** @brief This property encodes a single keypresses that generates a unicode code point. The value is stored as a UTF8 string. - Type - C string X 1, UTF8 - - Property Set - an read only in argument for the actions ::kOfxInteractActionKeyDown, ::kOfxInteractActionKeyUp and ::kOfxInteractActionKeyRepeat. + - Property Set - a read-only in argument for the actions ::kOfxInteractActionKeyDown, ::kOfxInteractActionKeyUp and ::kOfxInteractActionKeyRepeat. - Valid Values - a UTF8 string representing a single character, or the empty string. This property represents the UTF8 encode value of a single key press by a user in an OFX interact. diff --git a/include/ofxParam.h b/include/ofxParam.h index 6e0afb8d5..16f542e20 100644 --- a/include/ofxParam.h +++ b/include/ofxParam.h @@ -717,7 +717,7 @@ Setting this will also reset ::kOfxParamPropDisplayMin. - Property Set - plugin parameter descriptor (read/write) and instance (read/write), - Default - the largest possible value corresponding to the parameter type (eg: INT_MAX for an integer, DBL_MAX for a double parameter) -Setting this will also reset :;kOfxParamPropDisplayMax. +Setting this will also reset ::kOfxParamPropDisplayMax. */ #define kOfxParamPropMax "OfxParamPropMax" diff --git a/openfx-cpp/examples/host-specific-props/README.md b/openfx-cpp/examples/host-specific-props/README.md new file mode 100644 index 000000000..ffd8dba25 --- /dev/null +++ b/openfx-cpp/examples/host-specific-props/README.md @@ -0,0 +1,286 @@ +# Host-Extensible Property System + +This directory contains examples showing how OpenFX hosts can define custom properties that plugins can access with full type safety, without modifying OpenFX core code. + +## Overview + +The OpenFX C++ property system now supports **host-extensible properties** through C++17 `auto` template parameters and argument-dependent lookup (ADL). This allows hosts like MyHost, Resolve, Flame, etc. to: + +- Define custom properties in their own namespace +- Provide the same type safety as standard OpenFX properties +- Maintain zero coupling with OpenFX core code +- Give plugins optional access to host-specific features + +## How It Works + +### Architecture + +``` +┌─────────────────────────────────────────────────────────────┐ +│ OpenFX Core (openfx namespace) │ +│ - PropId enum (standard properties) │ +│ - PropTraits (metadata) │ +│ - PropertyAccessor with template │ +│ - prop_traits_helper() for ADL │ +└─────────────────────────────────────────────────────────────┘ + │ + │ No coupling - hosts extend independently + │ +┌─────────────────────────────────────────────────────────────┐ +│ Host Extension (e.g., myhost namespace) │ +│ - PropId enum (host properties) │ +│ - PropTraits (metadata) │ +│ - prop_traits_helper() for ADL │ +└─────────────────────────────────────────────────────────────┘ + │ + │ Plugins include host headers + │ +┌─────────────────────────────────────────────────────────────┐ +│ Plugin Code │ +│ - props.get() │ +│ - props.get() │ +└─────────────────────────────────────────────────────────────┘ +``` + +### Key Mechanism: ADL (Argument-Dependent Lookup) + +The `PropertyAccessor` uses `template` to accept any enum type: + +```cpp +template +auto get() { + using Traits = PropTraits_t; // Uses ADL to find correct namespace + // ... +} +``` + +The `PropTraits_t` type alias uses decltype + ADL: + +```cpp +template +using PropTraits_t = decltype( + prop_traits_helper(std::integral_constant{}) +); +``` + +Each namespace provides a `prop_traits_helper` function for its `PropId` enum: + +```cpp +// In openfx namespace: +template +properties::PropTraits prop_traits_helper(std::integral_constant); + +// In myhost namespace: +template +properties::PropTraits prop_traits_helper(std::integral_constant); +``` + +When the compiler sees `prop_traits_helper(std::integral_constant{})`, ADL finds the `myhost::prop_traits_helper` function because the argument type (`std::integral_constant`) is associated with the `nuke` namespace. + +## For Hosts: Defining Custom Properties + +### Step 1: Define Properties in YAML (Recommended) + +Create a YAML file following the OpenFX property schema: + +```yaml +# myhost-props.yml +properties: + MyHostCustomProperty: + name: "com.mycompany.myhost.CustomProperty" + type: string + dimension: 1 + description: "Description of the custom property" + valid_for: + - "Effect Descriptor" + - "Effect Instance" +``` + +**Naming Convention**: Use reverse-DNS notation: +- `com.company.product.PropertyName` +- Examples: `com.foundry.myhost.ViewerProcess`, `com.blackmagic.resolve.Timeline` + +### Step 2: Generate Metadata Header + +Use the OpenFX `gen-props.py` script (or create your own generator): + +```bash +./scripts/gen-props.py \ + --input myhost-props.yml \ + --output myhost/myhostPropsMetadata.h \ + --namespace myhost +``` + +Or create the header manually (see `myhost/myhostPropsMetadata.h` for the canonical template). + +### Step 3: Distribute Header to Plugin Developers + +Provide the generated header file to plugin developers in your SDK: + +``` +MyHostSDK/ + include/ + myhost/ + myhostPropsMetadata.h +``` + +## For Plugin Developers: Using Host Properties + +### Step 1: Include Host Header + +```cpp +#include // OpenFX core +#include // Host-specific +``` + +### Step 2: Use Properties with Type Safety + +```cpp +using namespace openfx; + +void describe(OfxImageEffectHandle effect, const SuiteContainer& suites) { + PropertyAccessor props(effect, suites); + + // Standard OpenFX property + props.set("My Effect"); + + // Host-specific property (fully qualified) + try { + auto value = props.get(0, false); + Logger::info("Host property value: {}", value); + } catch (const PropertyNotFoundException&) { + // Not running in MyHost, or property not supported + } +} +``` + +### Step 3: Handle Missing Properties Gracefully + +Host properties may not exist when running in other hosts: + +```cpp +// Method 1: Use error_if_missing=false +auto value = props.get(0, false); +if (value) { + // Use the value +} + +// Method 2: Use try/catch +try { + auto value = props.get(); + // Use the value +} catch (const PropertyNotFoundException&) { + // Handle missing property +} +``` + +## Examples + +### MyHost Template + +The `myhost/` directory provides a **canonical template** for hosts to follow: +- Complete metadata header (`myhostPropsMetadata.h`) with detailed step-by-step comments +- Example plugin usage (`example-usage.cpp`) showing best practices +- This template is compile-tested as part of the TestProps example + +**To create your own host properties:** +1. Copy `myhost/myhostPropsMetadata.h` to your SDK +2. Rename the namespace from `myhost` to your host name +3. Follow the numbered STEP comments in the header to customize it + +**Example properties defined in the template:** +- `MyHostViewerProcess`: Viewer process name (demonstrates string property) +- `MyHostColorConfig`: Path to color management config (demonstrates string property) +- `MyHostProjectPath`: Current project path (demonstrates string property) +- `MyHostNodeName`: Name of the containing node (demonstrates string property) +- `MyHostNodeColor`: RGB color of the node (demonstrates int[3] array property) + +## Benefits + +### For Hosts +- **Zero Coupling**: No need to modify OpenFX core +- **Version Control**: Version your property definitions independently +- **Documentation**: Generate docs from YAML files +- **Flexibility**: Add properties without coordinating with OpenFX releases + +### For Plugin Developers +- **Type Safety**: Compile-time checking for all properties +- **IDE Support**: Autocomplete and documentation tooltips +- **Discoverability**: Browse available host properties with IDE +- **Optional**: Ignore host extensions if not needed +- **Backward Compatible**: Existing code continues to work + +## Technical Details + +### Requirements +- C++17 or later (for `template` and structured bindings) +- Standard OpenFX C++ headers (`openfx-cpp`) + +### Compiler Compatibility +Tested with: +- GCC 7+ (C++17) +- Clang 5+ (C++17) +- MSVC 2017+ (C++17) + +### Performance +- **Zero runtime overhead**: All property lookups are template-based +- **Compile-time**: Type checking happens at compile time +- **Same performance** as direct property suite calls + +### Limitations +- Host properties must use reverse-DNS naming (`com.company.product.*`) to avoid string name collisions +- PropId enum values only need to be unique within each host's own namespace (used for array indexing) +- ADL requires proper namespace organization (each host defines `prop_traits_helper` in their namespace) + +## Migration Guide + +### Existing Code +No changes needed! Existing code using `PropId` continues to work: + +```cpp +// This still works exactly as before +props.get(); +props.set("OfxImageComponentRGBA"); +``` + +### New Code +Take advantage of host extensions: + +```cpp +// Mix standard and host properties seamlessly +props.set("My Effect") + .set("sRGB") + .setAll({128, 200, 255}); +``` + +## FAQ + +**Q: Do I need to modify OpenFX core to add host properties?** +A: No! That's the whole point. Hosts define properties in their own namespace. + +**Q: What if two hosts define the same property name?** +A: Use reverse-DNS naming (`com.company.product.*`) to avoid collisions. Even if names collide, they're in different C++ namespaces. + +**Q: Can I still use `getRaw()` for dynamic properties?** +A: Yes! The "escape hatch" methods (`getRaw`, `setRaw`) still work for truly dynamic property access. + +**Q: Do host properties work with older OpenFX versions?** +A: Host properties require the C++17-based property system (OpenFX 1.5+). For older versions, use `getRaw()`. + +**Q: How do I discover what host properties are available?** +A: Include the host's metadata header and use IDE autocomplete on `hostname::PropId::` to see all available properties. + +**Q: Can hosts add new properties without breaking plugins?** +A: Yes! New properties are opt-in. Plugins that don't know about them can simply not access them. + +## Support + +For questions or issues: +- OpenFX discussion forum: https://github.com/AcademySoftwareFoundation/openfx/discussions +- OpenFX issue tracker: https://github.com/AcademySoftwareFoundation/openfx/issues + +## See Also + +- [OpenFX Property System Documentation](../../Documentation/properties.md) +- [PropertyAccessor API Reference](../../openfx-cpp/include/openfx/ofxPropsAccess.h) +- [Property Generation Script](../../scripts/gen-props.py) diff --git a/openfx-cpp/examples/host-specific-props/example-usage.cpp b/openfx-cpp/examples/host-specific-props/example-usage.cpp new file mode 100644 index 000000000..bb4a7cda5 --- /dev/null +++ b/openfx-cpp/examples/host-specific-props/example-usage.cpp @@ -0,0 +1,156 @@ +// Copyright OpenFX and contributors to the OpenFX project. +// SPDX-License-Identifier: BSD-3-Clause +// +// Example: Using Host-Defined Properties +// +// NOTE: This file contains example CODE SNIPPETS for documentation purposes. +// It is NOT a complete, buildable OFX plugin. These examples demonstrate how +// a plugin would access both standard OpenFX properties and host-defined +// properties (in this case, MyHost properties) with full type safety. +// +// The myhost/myhostPropsMetadata.h header IS compile-tested as part of the +// TestProps example build, ensuring the example code is syntactically correct. +// +// For complete, buildable plugin examples, see the Examples/ directory at +// the project root (e.g., TestProps, Basic, etc.). + +#include +#include +#include "myhost/myhostPropsMetadata.h" + +using namespace openfx; + +// Example plugin describe function +void describeMyHostAwarePlugin(OfxImageEffectHandle effect, const SuiteContainer& suites) { + PropertyAccessor props(effect, suites); + + // ========================================================================= + // Standard OpenFX Properties + // ========================================================================= + // These work exactly as before - no changes needed to existing code + + props.set("MyHost-Aware Effect") + .set("1.0") + .setAll({1, 0, 0}); + + // ========================================================================= + // Host-Defined Properties + // ========================================================================= + // Now we can also access MyHost-specific properties with the same type safety! + + // Try to get MyHost-specific properties + // Use error_if_missing=false since these properties only exist in MyHost + try { + // Get the viewer process - this tells us the color management display transform + auto viewerProcess = props.get(0, false); + if (viewerProcess) { + Logger::info("Running in MyHost with viewer process: {}", viewerProcess); + } + + // Get the project path + auto projectPath = props.get(0, false); + if (projectPath) { + Logger::info("MyHost project path: {}", projectPath); + } + + // Get the node name + auto nodeName = props.get(0, false); + if (nodeName) { + Logger::info("This effect is in MyHost node: {}", nodeName); + } + + // Set a custom node color (RGB 0-255) + // This demonstrates setting host properties + props.setAll({128, 200, 255}); + Logger::info("Set MyHost node color to light blue"); + + } catch (const PropertyNotFoundException& e) { + // Not running in MyHost, or MyHost doesn't support these properties + Logger::info("MyHost properties not available - probably not running in MyHost"); + } +} + +// Example showing compile-time type safety +void demonstrateTypeSafety(OfxImageEffectHandle effect, const SuiteContainer& suites) { + PropertyAccessor props(effect, suites); + + // ✅ This compiles - MyHostViewerProcess is a string property + auto viewerProcess = props.get(); + + // ✅ This compiles - MyHostNodeColor is an int property with dimension 3 + auto colors = props.getAll(); + // colors is std::array because dimension is known at compile time + + // ✅ This compiles - setting an int array property + props.setAll({255, 128, 0}); + + // ❌ This would NOT compile - type mismatch! + // auto wrong = props.get(); + // ^^^^^^^^^ Compile error: MyHostNodeColor is int, not string + + // ✅ Standard OpenFX properties still work exactly as before + props.set("My Effect"); + auto label = props.get(); +} + +// Example showing namespace flexibility +void demonstrateNamespaces(OfxImageEffectHandle effect, const SuiteContainer& suites) { + PropertyAccessor props(effect, suites); + + // Method 1: Fully qualified names (explicit and clear) + auto viewer1 = props.get(0, false); + auto label1 = props.get(); + + // Method 2: Using namespace for convenience + { + using namespace myhost; + auto viewer2 = props.get(0, false); + // Note: This would be ambiguous if both namespaces are in scope! + // So we still need openfx:: for standard properties + auto label2 = props.get(); + } + + // Method 3: Mix and match as needed + props.set("Mixed Namespaces") + .setAll({200, 100, 50}); +} + +// Example showing the "escape hatch" still works +void demonstrateDynamicAccess(OfxPropertySetHandle propSet, const OfxPropertySuiteV1* propSuite) { + PropertyAccessor props(propSet, propSuite); + + // For truly dynamic properties, the getRaw/setRaw methods still work + auto unknownProp = props.getRaw("com.somehost.unknownProperty", 0, false); + + // But when possible, use the type-safe methods with PropId enums + auto typeSafe = props.get(0, false); +} + +/* + * KEY BENEFITS of this approach: + * + * 1. **Zero Coupling**: MyHost (the host) doesn't modify OpenFX core code + * - myhostPropsMetadata.h is distributed by MyHost, not OpenFX + * - Plugins include it only if they want MyHost-specific features + * + * 2. **Type Safety**: Compile-time checking for host properties + * - Wrong type? Compile error. + * - Wrong property ID? Compile error. + * - IDE autocomplete shows available properties + * + * 3. **Clean Syntax**: Same API for standard and host properties + * - props.get() + * - props.get() + * + * 4. **Backward Compatible**: Existing code continues to work + * - No changes needed to existing plugins + * - New features are opt-in + * + * 5. **Discoverability**: IDE autocomplete works + * - Type "myhost::PropId::" and see all available properties + * - Hover over a property to see its documentation + * + * 6. **Optional**: Plugins can ignore host extensions + * - Don't include myhostPropsMetadata.h? No problem. + * - Use getRaw() for dynamic access? Still works. + */ diff --git a/openfx-cpp/examples/host-specific-props/myhost/myhost-props.yml b/openfx-cpp/examples/host-specific-props/myhost/myhost-props.yml new file mode 100644 index 000000000..8c70f6b68 --- /dev/null +++ b/openfx-cpp/examples/host-specific-props/myhost/myhost-props.yml @@ -0,0 +1,46 @@ +# Example host-defined properties for MyHost +# This file would be processed by gen-props.py (or a host's own generator) +# to create myhostPropsMetadata.h + +properties: + MyHostViewerProcess: + name: "com.example.myhost.ViewerProcess" + type: string + dimension: 1 + description: "MyHost viewer process name (color management display transform)" + valid_for: + - "Effect Descriptor" + - "Effect Instance" + + MyHostColorConfig: + name: "com.example.myhost.ColorConfig" + type: string + dimension: 1 + description: "Path to MyHost's color management config file" + valid_for: + - "Effect Instance" + + MyHostProjectPath: + name: "com.example.myhost.ProjectPath" + type: string + dimension: 1 + description: "Path to the current MyHost project file" + valid_for: + - "Effect Instance" + + MyHostNodeName: + name: "com.example.myhost.NodeName" + type: string + dimension: 1 + description: "Name of the MyHost node containing this effect" + valid_for: + - "Effect Instance" + + MyHostNodeColor: + name: "com.example.myhost.NodeColor" + type: int + dimension: 3 + description: "RGB color of the node in MyHost's node graph (0-255)" + valid_for: + - "Effect Descriptor" + - "Effect Instance" diff --git a/openfx-cpp/examples/host-specific-props/myhost/myhostPropsMetadata.h b/openfx-cpp/examples/host-specific-props/myhost/myhostPropsMetadata.h new file mode 100644 index 000000000..df03777c9 --- /dev/null +++ b/openfx-cpp/examples/host-specific-props/myhost/myhostPropsMetadata.h @@ -0,0 +1,174 @@ +// Copyright OpenFX and contributors to the OpenFX project. +// SPDX-License-Identifier: BSD-3-Clause +// +// TEMPLATE: Host-Defined Properties Header +// +// This file serves as the canonical template for hosts that want to define +// custom properties with full compile-time type safety. +// +// HOW TO USE THIS TEMPLATE: +// 1. Copy this file to your host's SDK/include directory +// 2. Rename the namespace from 'myhost' to match your host (e.g., 'nuke', 'resolve', etc.) +// 3. Define your host's custom properties in the PropId enum +// 4. Update the prop_defs array with your property definitions +// 5. Add PropTraits specializations for each property +// 6. Distribute this header with your host's plugin SDK +// +// GENERATION: While this template can be manually edited, we recommend +// generating it from a YAML file using gen-props.py (see Support/Scripts/). +// This ensures consistency and reduces the chance of errors. +// +// This example uses "MyHost" as a fictitious host name to demonstrate the +// pattern without implying endorsement by any actual product. + +#pragma once + +#include +#include +#include +#include + +namespace myhost { + +// ============================================================================ +// STEP 1: Define your host's property IDs +// ============================================================================ +// Property ID enum for compile-time lookup and type safety. +// +// IMPORTANT: Enum values are ONLY used as array indices into prop_defs below. +// They don't need to avoid collisions with other hosts because: +// - This is a separate C++ type (myhost::PropId vs other::PropId) +// - Runtime property access uses STRING NAMES, not these numeric values +// - No coordination needed between hosts - each namespace is independent +// +// Best practices: +// - Start at 0 and increment sequentially for simple indexing +// - Use descriptive names matching your property naming convention +// - Order doesn't matter, but sequential is easiest to maintain +// +enum class PropId { + MyHostViewerProcess = 0, // Example: string property + MyHostColorConfig = 1, // Example: string property + MyHostProjectPath = 2, // Example: string property + MyHostNodeName = 3, // Example: string property + MyHostNodeColor = 4, // Example: int[3] property (RGB color) +}; + +namespace properties { + +// ============================================================================ +// STEP 2: Define type arrays for each property +// ============================================================================ +// Each property needs a constexpr array specifying its supported types. +// Most properties have a single type, but multi-type properties are possible. +// +static constexpr openfx::PropType MyHostViewerProcess_types[] = {openfx::PropType::String}; +static constexpr openfx::PropType MyHostColorConfig_types[] = {openfx::PropType::String}; +static constexpr openfx::PropType MyHostProjectPath_types[] = {openfx::PropType::String}; +static constexpr openfx::PropType MyHostNodeName_types[] = {openfx::PropType::String}; +static constexpr openfx::PropType MyHostNodeColor_types[] = {openfx::PropType::Int}; + +// ============================================================================ +// STEP 3: Define property metadata +// ============================================================================ +// Property definitions array using openfx::PropDef structure. +// +// Each PropDef entry contains: +// 1. name: Full property name string (use reverse-DNS: "com.yourcompany.yourhost.PropertyName") +// 2. supportedTypes: span of the type array defined above +// 3. dimension: Number of values (1 for scalars, >1 for arrays) +// 4. enumValues: span of valid enum strings (empty for non-enum properties) +// +constexpr openfx::PropDef prop_defs[] = { + // MyHostViewerProcess - "MyHost viewer process name (color management display transform)" + { "com.example.myhost.ViewerProcess", + openfx::span(MyHostViewerProcess_types, 1), 1, openfx::span() }, + // MyHostColorConfig - "Path to MyHost's color management config file" + { "com.example.myhost.ColorConfig", + openfx::span(MyHostColorConfig_types, 1), 1, openfx::span() }, + // MyHostProjectPath - "Path to the current MyHost project file" + { "com.example.myhost.ProjectPath", + openfx::span(MyHostProjectPath_types, 1), 1, openfx::span() }, + // MyHostNodeName - "Name of the MyHost node containing this effect" + { "com.example.myhost.NodeName", + openfx::span(MyHostNodeName_types, 1), 1, openfx::span() }, + // MyHostNodeColor - "RGB color of the node in MyHost's node graph (0-255)" + { "com.example.myhost.NodeColor", + openfx::span(MyHostNodeColor_types, 1), 3, openfx::span() }, +}; + +// ============================================================================ +// STEP 4: Define PropTraits specializations +// ============================================================================ +// PropTraits maps each PropId enum value to its type metadata. +// This enables compile-time type checking in PropertyAccessor. +// +// Each specialization must define: +// - type: The C++ type (const char* for strings, int for ints, etc.) +// - is_multitype: false for single-type properties, true for multi-type +// - dimension: Number of values (must match prop_defs entry) +// - def: Reference to the corresponding prop_defs entry +// + +// Base template (leave undefined - specializations required) +template +struct PropTraits; + +// PropTraits specializations for each property +template<> +struct PropTraits { + using type = const char*; + static constexpr bool is_multitype = false; + static constexpr int dimension = 1; + static constexpr const openfx::PropDef& def = prop_defs[static_cast(PropId::MyHostViewerProcess)]; +}; + +template<> +struct PropTraits { + using type = const char*; + static constexpr bool is_multitype = false; + static constexpr int dimension = 1; + static constexpr const openfx::PropDef& def = prop_defs[static_cast(PropId::MyHostColorConfig)]; +}; + +template<> +struct PropTraits { + using type = const char*; + static constexpr bool is_multitype = false; + static constexpr int dimension = 1; + static constexpr const openfx::PropDef& def = prop_defs[static_cast(PropId::MyHostProjectPath)]; +}; + +template<> +struct PropTraits { + using type = const char*; + static constexpr bool is_multitype = false; + static constexpr int dimension = 1; + static constexpr const openfx::PropDef& def = prop_defs[static_cast(PropId::MyHostNodeName)]; +}; + +template<> +struct PropTraits { + using type = int; + static constexpr bool is_multitype = false; + static constexpr int dimension = 3; + static constexpr const openfx::PropDef& def = prop_defs[static_cast(PropId::MyHostNodeColor)]; +}; + +} // namespace properties + +// ============================================================================ +// STEP 5: Define ADL helper (DO NOT MODIFY) +// ============================================================================ +// This function declaration enables Argument-Dependent Lookup (ADL) so that +// openfx::PropertyAccessor can automatically find your PropTraits. +// +// IMPORTANT: This must be declared in the same namespace as your PropId enum +// (i.e., the myhost namespace, NOT the properties sub-namespace). +// +// You should not need to modify this - just copy it as-is. +// +template +properties::PropTraits prop_traits_helper(std::integral_constant); + +} // namespace myhost diff --git a/openfx-cpp/include/openfx/README-logging.md b/openfx-cpp/include/openfx/README-logging.md new file mode 100644 index 000000000..cf02f2aeb --- /dev/null +++ b/openfx-cpp/include/openfx/README-logging.md @@ -0,0 +1,132 @@ +# OFX API Wrapper Logging System + + +## Overview + +The OFX API Wrapper provides a lightweight, thread-safe customizable logging system. It supports very simple `fmt`-style formatting. + +## Basic Usage + +```cpp +#include "openfx/ofxLog.h" + +// Log simple messages +openfx::Logger::info("Application started"); +openfx::Logger::warn("Resource usage is high"); +openfx::Logger::error("Operation failed"); + +// Log with formatting (similar to std::format) +openfx::Logger::info("Processing resource: {}", resource_id); +openfx::Logger::warn("Memory usage: {}MB", memory_usage); +openfx::Logger::error("Failed to process item {} in category {}", item_id, category); +``` + +## Log Levels + +The logging system supports three log levels: + +- **Info**: General information messages +- **Warning**: Warning messages that don't prevent operation +- **Error**: Error messages indicating failures + +## Custom Log Handlers + +You can customize where and how log messages are processed by providing your own log handler: + +```cpp +// Create a custom log handler that writes to a file +std::shared_ptr logfile = + std::make_shared("application.log", std::ios::app); + +openfx::Logger::setLogHandler( + [logfile](openfx::Logger::Level level, + std::chrono::system_clock::time_point timestamp, + const std::string& message) { + // Convert timestamp to local time + std::time_t time = std::chrono::system_clock::to_time_t(timestamp); + std::tm local_tm = *std::localtime(&time); + + // Level to string + const char* levelStr = ""; + switch (level) { + case openfx::Logger::Level::Info: levelStr = "INFO"; break; + case openfx::Logger::Level::Warning: levelStr = "WARN"; break; + case openfx::Logger::Level::Error: levelStr = "ERROR"; break; + } + + // Write to file + *logfile << "[" + << std::put_time(&local_tm, "%Y-%m-%d %H:%M:%S") + << "][" + << levelStr + << "] " + << message + << std::endl; + } +); +``` + +## String Formatting + +The logging system includes a simple string formatting utility that uses `{}` placeholders, similar to `std::format`: + +```cpp +// Single placeholder +openfx::Logger::info("Processing file: {}", filename); + +// Multiple placeholders +openfx::Logger::info("Transfer completed: {} bytes in {} seconds", bytes, seconds); + +// You can also use the formatter directly +std::string msg = openfx::format("User {} logged in from {}", username, ip_address); +``` + +## Default Log Format + +The default log handler formats messages as: + +``` +[YYYY-MM-DD HH:MM:SS][LEVEL] Message +``` + +For example: +``` +[2025-02-28 14:30:45][INFO] Application started +[2025-02-28 14:30:46][WARN] Memory usage above threshold: 85% +[2025-02-28 14:30:47][ERROR] Failed to connect to database +``` + +## Thread Safety + +The logging system is thread-safe and can be used from multiple threads simultaneously. A mutex protects the log handler to ensure that log messages are not interleaved. + +## Performance Considerations + +- The logging system is designed to be lightweight, but frequent logging can impact performance +- When using custom log handlers, consider implementing buffering for high-volume logging +- String formatting occurs even if the log message is filtered out, so consider adding level checks for verbose logging: + +```cpp +if (is_debug_mode) { + openfx::Logger::info("Detailed debug info: {}", expensive_to_compute_string()); +} +``` + +## Integration with Error Handling + +The logging system is designed to work well with the OFX API Wrapper's exception system: + +```cpp +try { + // Some operation +} catch (const openfx::ApiException& e) { + openfx::Logger::error("API error occurred: {} (code: {})", e.what(), e.code()); + // Handle the exception +} +``` + +------------- +Copyright OpenFX and contributors to the OpenFX project. + +`SPDX-License-Identifier: BSD-3-Clause` + diff --git a/openfx-cpp/include/openfx/README.md b/openfx-cpp/include/openfx/README.md new file mode 100644 index 000000000..8529bd3ca --- /dev/null +++ b/openfx-cpp/include/openfx/README.md @@ -0,0 +1,8 @@ +# OpenFX C++ Bindings + +This is a set of C++ bindings for parts of OpenFX. It consists of a +set of prerelease-quality (for now) C++17 header files. They primarily +simplify type-safe access to properties, params, images and suites. It +includes a simple logging facility and a set of standard exceptions. + +The goal is to include a version of this in the next OpenFX release. diff --git a/openfx-cpp/include/openfx/ofxClip.h b/openfx-cpp/include/openfx/ofxClip.h new file mode 100644 index 000000000..77fa5f1ce --- /dev/null +++ b/openfx-cpp/include/openfx/ofxClip.h @@ -0,0 +1,124 @@ +// Copyright OpenFX and contributors to the OpenFX project. +// SPDX-License-Identifier: BSD-3-Clause + +#pragma once + +#include +#include + +#include // For std::unique_ptr + +#include "openfx/ofxExceptions.h" +#include "openfx/ofxImage.h" +#include "openfx/ofxPropsAccess.h" + +namespace openfx { + +class Clip { + private: + const OfxImageEffectSuiteV1* mEffectSuite; + const OfxPropertySuiteV1* mPropertySuite; + OfxImageClipHandle mClip{}; + OfxPropertySetHandle mClipPropSet{}; // The clip property set handle + std::unique_ptr mClipProps; // Accessor: use a pointer to defer construction + + public: + // Construct a clip given the raw clip handle. + // Gets the property set and sets up accessor for it. + Clip(const OfxImageEffectSuiteV1* effect_suite, const OfxPropertySuiteV1* prop_suite, + OfxImageClipHandle clip) + : mEffectSuite(effect_suite), mPropertySuite(prop_suite), mClip(clip), mClipProps(nullptr) { + if (clip != nullptr) { + OfxStatus status = mEffectSuite->clipGetPropertySet(clip, &mClipPropSet); + if (status != kOfxStatOK) + throw ClipNotFoundException(status); + if (mClipPropSet) { + mClipProps = std::make_unique(mClipPropSet, prop_suite); + } + } + } + + // Construct a clip given effect and clip name. + // Gets the clip with its property set, and sets up accessor for it. + Clip(const OfxImageEffectSuiteV1* effect_suite, const OfxPropertySuiteV1* prop_suite, + OfxImageEffectHandle effect, std::string_view clip_name) + : mEffectSuite(effect_suite), mPropertySuite(prop_suite), mClipProps(nullptr) { + OfxStatus status = effect_suite->clipGetHandle(effect, clip_name.data(), &mClip, &mClipPropSet); + if (status != kOfxStatOK || !mClip || !mClipPropSet) + throw ClipNotFoundException(status); + mClipProps = std::make_unique(mClipPropSet, prop_suite); + } + + // Construct a clip given effect and clip name, using suite container (simpler) + Clip(OfxImageEffectHandle effect, std::string_view clip_name, const SuiteContainer& suites) + : mClipProps(nullptr) { + mEffectSuite = suites.get(); + mPropertySuite = suites.get(); + OfxStatus status = mEffectSuite->clipGetHandle(effect, clip_name.data(), &mClip, &mClipPropSet); + if (status != kOfxStatOK || !mClip || !mClipPropSet) + throw ClipNotFoundException(status); + mClipProps = std::make_unique(mClipPropSet, mPropertySuite); + } + + // Default constructor: empty clip + Clip() : mEffectSuite(nullptr), mClipProps(nullptr) {} + + // Destructor releases the resource + ~Clip() { + if (mClipPropSet) { + mClipPropSet = nullptr; + } + } + + // Disable copying + Clip(const Clip&) = delete; + Clip& operator=(const Clip&) = delete; + + // Enable moving + Clip(Clip&& other) noexcept + : mEffectSuite(other.mEffectSuite), + mPropertySuite(other.mPropertySuite), + mClip(other.mClip), + mClipPropSet(other.mClipPropSet), + mClipProps(std::move(other.mClipProps)) { + other.mClipPropSet = nullptr; + } + + Clip& operator=(Clip&& other) noexcept { + if (this != &other) { + // Release any existing resource + + // Acquire the other's resource + mEffectSuite = other.mEffectSuite; + mPropertySuite = other.mPropertySuite; + mClip = other.mClip; + mClipPropSet = other.mClipPropSet; + mClipProps = std::move(other.mClipProps); + other.mClipPropSet = nullptr; + } + return *this; + } + + // Get an image from the clip at this time + openfx::Image get_image(OfxTime time, const OfxRectD* rect = nullptr) { + return openfx::Image(mEffectSuite, mPropertySuite, mClip, time, rect); + } + + // get the clip handle + OfxImageClipHandle clip() const { return mClip; } + + // get the clip's prop set + OfxPropertySetHandle get_propset() const { return mClipPropSet; } + + // Accessor for PropertyAccessor + PropertyAccessor* props() { return mClipProps.get(); } + const PropertyAccessor* props() const { return mClipProps.get(); } + + // Implicit conversions to the handle types + explicit operator OfxPropertySetHandle() const { return mClipPropSet; } + explicit operator OfxImageClipHandle() const { return mClip; } + + bool empty() const { return mClip == nullptr; } +}; + +} // namespace openfx diff --git a/openfx-cpp/include/openfx/ofxExceptions.h b/openfx-cpp/include/openfx/ofxExceptions.h new file mode 100644 index 000000000..bb7a6e49c --- /dev/null +++ b/openfx-cpp/include/openfx/ofxExceptions.h @@ -0,0 +1,79 @@ +// Copyright OpenFX and contributors to the OpenFX project. +// SPDX-License-Identifier: BSD-3-Clause + +#pragma once + +#include + +#include +#include +#include + +#include "ofxStatusStrings.h" + +namespace openfx { + +/** + * @brief Base exception class for the OpenFX API wrapper + */ +class OfxException : public std::runtime_error { + public: + /** + * @brief Construct a new API exception + * @param code Error code from the C API + * @param message Error message + */ + OfxException(OfxStatus status, const std::string &msg) + : std::runtime_error(createMessage(msg, status)), error_code_(status) {} + + /** + * @brief Get the error code + * @return The error code from the C API + */ + int code() const noexcept { return error_code_; } + + private: + OfxStatus error_code_; + static std::string createMessage(const std::string &msg, OfxStatus status) { + std::ostringstream oss; + oss << "OpenFX error: " << msg << ": " << ofxStatusToString(status) << "\n"; + return oss.str(); + } +}; + +/** + * @brief Exception thrown when a required property isn't found + */ +class PropertyNotFoundException : public OfxException { + public: + explicit PropertyNotFoundException(int code, const std::string &msg = "") + : OfxException(code, msg) {} +}; + +/** + * @brief Exception thrown when an clip isn't found + */ +class ClipNotFoundException : public OfxException { + public: + explicit ClipNotFoundException(int code, const std::string &msg = "") : OfxException(code, msg) {} +}; + +/** + * @brief Exception thrown when an image isn't found + */ +class ImageNotFoundException : public OfxException { + public: + explicit ImageNotFoundException(int code, const std::string &msg = "") + : OfxException(code, msg) {} +}; + +/** + * @brief Exception thrown when a suite isn't found + */ +class SuiteNotFoundException : public OfxException { + public: + explicit SuiteNotFoundException(int code, const std::string &msg = "") + : OfxException(code, msg) {} +}; + +} // namespace openfx diff --git a/openfx-cpp/include/openfx/ofxImage.h b/openfx-cpp/include/openfx/ofxImage.h new file mode 100644 index 000000000..ed599012f --- /dev/null +++ b/openfx-cpp/include/openfx/ofxImage.h @@ -0,0 +1,100 @@ +// Copyright OpenFX and contributors to the OpenFX project. +// SPDX-License-Identifier: BSD-3-Clause + +#pragma once + +#include +#include + +#include // For std::unique_ptr + +#include "openfx/ofxExceptions.h" +#include "openfx/ofxMisc.h" +#include "openfx/ofxPropsAccess.h" + +namespace openfx { + +class Image { + private: + // The image property set handle + const OfxImageEffectSuiteV1* mEffectSuite; + OfxPropertySetHandle mImg{}; + std::unique_ptr mImgProps; // Use a pointer to defer construction + + public: + // Constructor acquires the resource + Image(const OfxImageEffectSuiteV1* effect_suite, const OfxPropertySuiteV1* prop_suite, + OfxImageClipHandle clip, OfxTime time, const OfxRectD* rect = nullptr) + : mEffectSuite(effect_suite), mImgProps(nullptr) { + if (clip != nullptr) { + OfxStatus status = mEffectSuite->clipGetImage(clip, time, rect, &mImg); + if (status != kOfxStatOK) + throw ImageNotFoundException(status); + if (mImg) { + mImgProps = std::make_unique(mImg, prop_suite); + } + } + } + + // Default constructor: empty image + Image() : mEffectSuite(nullptr), mImgProps(nullptr) {} + + // Destructor releases the resource + ~Image() { + if (mImg) { + mEffectSuite->clipReleaseImage(mImg); + mImg = nullptr; + } + } + + // Disable copying + Image(const Image&) = delete; + Image& operator=(const Image&) = delete; + + // Enable moving + Image(Image&& other) noexcept + : mEffectSuite(other.mEffectSuite), mImg(other.mImg), mImgProps(std::move(other.mImgProps)) { + other.mImg = nullptr; + } + + Image& operator=(Image&& other) noexcept { + if (this != &other) { + // Release any existing resource + if (mImg) { + mEffectSuite->clipReleaseImage(mImg); + } + + // Acquire the other's resource + mEffectSuite = other.mEffectSuite; + mImg = other.mImg; + mImgProps = std::move(other.mImgProps); + other.mImg = nullptr; + } + return *this; + } + + // Get the image's data pointer + void* data() { return props()->get(); } + + // Get the image's bounds + OfxRectI bounds() { + return openfx::toOfxRectI(props()->getAll()); + } + + // Get the image's rowbytes + int rowbytes() { return props()->get(); } + + // Get the PropertyAccessor + PropertyAccessor* props() { return mImgProps.get(); } + const PropertyAccessor* props() const { return mImgProps.get(); } + + // Get the underlying handle + OfxPropertySetHandle get() const { return mImg; } + + // Implicit conversion to base handle type + explicit operator OfxPropertySetHandle() const { return mImg; } + + bool empty() const { return mImg == nullptr; } +}; + +} // namespace openfx diff --git a/openfx-cpp/include/openfx/ofxLog.h b/openfx-cpp/include/openfx/ofxLog.h new file mode 100644 index 000000000..f94568d4c --- /dev/null +++ b/openfx-cpp/include/openfx/ofxLog.h @@ -0,0 +1,289 @@ +// Copyright OpenFX and contributors to the OpenFX project. +// SPDX-License-Identifier: BSD-3-Clause + +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace openfx { + +// String formatter: forward decls +template +std::string format(const std::string& fmt, Args&&... args); + +inline void format_impl(std::ostringstream& oss, const char* fmt); + +template +void format_impl(std::ostringstream& oss, const char* fmt, T&& value, Args&&... args); + +/** + * @brief Simple, customizable logging facility for the OpenFX API wrapper + */ +class Logger { + public: + /** + * @brief Log levels + */ + enum class Level { + Info, ///< Informational messages + Warning, ///< Warning messages + Error ///< Error messages + }; + + /** + * @brief Log handler function type + * + * @param level The log level + * @param timestamp Timestamp when log was created + * @param message The log message + */ + using LogHandler = std::function; + + /** + * @brief Set a custom log handler + * + * @param handler The log handler function + */ + static void setLogHandler(LogHandler handler); + + /** + * @brief Set a context string (e.g., plugin name) to prepend to all log messages + * + * @param context The context string (typically plugin name) + */ + static void setContext(const std::string& context); + + /** + * @brief Get the current context string + * + * @return The current context string + */ + static std::string getContext(); + + /** + * @brief Log an informational message + * + * @param message The message to log + */ + static void info(const std::string& message); + + /** + * @brief Log an informational message with formatting + * + * @param format Format string with {} placeholders + * @param args Arguments to format + */ + template + static void info(const std::string& format, Args&&... args) { + log(Level::Info, format_message(format, std::forward(args)...)); + } + + /** + * @brief Log a warning message + * + * @param message The message to log + */ + static void warn(const std::string& message); + + /** + * @brief Log a warning message with formatting + * + * @param format Format string with {} placeholders + * @param args Arguments to format + */ + template + static void warn(const std::string& format, Args&&... args) { + log(Level::Warning, format_message(format, std::forward(args)...)); + } + + /** + * @brief Log an error message + * + * @param message The message to log + */ + static void error(const std::string& message); + + /** + * @brief Log an error message with formatting + * + * @param format Format string with {} placeholders + * @param args Arguments to format + */ + template + static void error(const std::string& format, Args&&... args) { + log(Level::Error, format_message(format, std::forward(args)...)); + } + + private: + /** + * @brief Log a message with the specified level + * + * @param level The log level + * @param message The message to log + */ + static void log(Level level, const std::string& message); + + /** + * @brief Default log handler implementation + * + * @param level The log level + * @param timestamp Timestamp when log was created + * @param message The message to log + */ + static void defaultLogHandler(Level level, std::chrono::system_clock::time_point timestamp, + const std::string& message); + + /** + * @brief Format a message using the simple formatter + * + * @param format Format string with {} placeholders + * @param args Arguments to format + * @return Formatted string + */ + template + static std::string format_message(const std::string& format, Args&&... args) { + if constexpr (sizeof...(args) == 0) { + return format; + } else { + return ::openfx::format(format, std::forward(args)...); + } + } + + // Static member variables (inline in C++17) + static inline LogHandler g_logHandler = defaultLogHandler; + static inline std::mutex g_logMutex; + static inline std::string g_context; +}; + +// Inline implementations for non-template methods + +inline void Logger::setLogHandler(LogHandler handler) { + if (handler) { + std::lock_guard lock(g_logMutex); + g_logHandler = std::move(handler); + } else { + std::lock_guard lock(g_logMutex); + g_logHandler = defaultLogHandler; + } +} + +inline void Logger::setContext(const std::string& context) { + std::lock_guard lock(g_logMutex); + g_context = context; +} + +inline std::string Logger::getContext() { + std::lock_guard lock(g_logMutex); + return g_context; +} + +inline void Logger::info(const std::string& message) { log(Level::Info, message); } + +inline void Logger::warn(const std::string& message) { log(Level::Warning, message); } + +inline void Logger::error(const std::string& message) { log(Level::Error, message); } + +inline void Logger::log(Level level, const std::string& message) { + auto timestamp = std::chrono::system_clock::now(); + + std::lock_guard lock(g_logMutex); + + // Prepend context if set + std::string finalMessage = message; + if (!g_context.empty()) { + finalMessage = "[" + g_context + "] " + message; + } + + g_logHandler(level, timestamp, finalMessage); +} + +inline void Logger::defaultLogHandler(Level level, std::chrono::system_clock::time_point timestamp, + const std::string& message) { + // Convert timestamp to local time + std::time_t time = std::chrono::system_clock::to_time_t(timestamp); + std::tm local_time; +#ifdef _WIN32 + // Microsoft’s localtime_s expects arguments in reverse order compared to C11's localtime_s: + localtime_s(&local_time, &time); +#else + // POSIX + localtime_r(&time, &local_time); +#endif + + // Level prefix + const char* levelStr = ""; + switch (level) { + case Level::Info: + levelStr = "INFO"; + break; + case Level::Warning: + levelStr = "WARN"; + break; + case Level::Error: + levelStr = "ERROR"; + break; + } + + // Write formatted log message to stdout (not stderr) + // In plugin contexts, stderr may not be captured by host applications + std::cout << "[" << std::put_time(&local_time, "%Y-%m-%d %H:%M:%S") << "][" << levelStr << "] " << message + << std::endl; +} + +/** + * @brief String formatter with {} placeholders (similar to std::format) + * + * @param fmt Format string with {} placeholders + * @param args Arguments to format + * @return Formatted string + */ +template +std::string format(const std::string& fmt, Args&&... args) { + std::ostringstream oss; + format_impl(oss, fmt.c_str(), std::forward(args)...); + return oss.str(); +} + +/** + * @brief Implementation detail for the string formatter + * + * @param oss Output string stream + * @param fmt Format string + */ +inline void format_impl(std::ostringstream& oss, const char* fmt) { oss << fmt; } + +/** + * @brief Implementation detail for the string formatter + * + * @param oss Output string stream + * @param fmt Format string + * @param value Value to format + * @param args Remaining arguments + */ +template +void format_impl(std::ostringstream& oss, const char* fmt, T&& value, Args&&... args) { + const char* pos = std::strchr(fmt, '{'); + + // Check if we have a valid placeholder with closing } + if (pos && pos[1] == '}') { + // Write everything up to the placeholder + oss.write(fmt, pos - fmt); + // Write the value + oss << value; + // Continue with the rest of the format string + format_impl(oss, pos + 2, std::forward(args)...); + } else { + // No valid placeholder, just write the rest of the format string + oss << fmt; + } +} + +} // namespace openfx diff --git a/openfx-cpp/include/openfx/ofxMisc.h b/openfx-cpp/include/openfx/ofxMisc.h new file mode 100644 index 000000000..a505f7cf9 --- /dev/null +++ b/openfx-cpp/include/openfx/ofxMisc.h @@ -0,0 +1,74 @@ +// Copyright OpenFX and contributors to the OpenFX project. +// SPDX-License-Identifier: BSD-3-Clause + +#pragma once + +#include +#include "ofxExceptions.h" + +#include +#include + +namespace openfx { + +namespace detail { +// Element count traits +template +inline constexpr size_t ofx_elem_count = 0; +template <> +inline constexpr size_t ofx_elem_count = 4; +template <> +inline constexpr size_t ofx_elem_count = 4; +template <> +inline constexpr size_t ofx_elem_count = 2; +template <> +inline constexpr size_t ofx_elem_count = 2; + +// Generic conversion implementation +template +Result toOfx(const Container& container) { + if (container.size() < ofx_elem_count) + throw OfxException(kOfxStatErrValue, "Container has too few elements"); + + Result result; + if constexpr (ofx_elem_count == 4) { + result.x1 = container[0]; + result.y1 = container[1]; + result.x2 = container[2]; + result.y2 = container[3]; + } else { + result.x = container[0]; + result.y = container[1]; + } + return result; +} +} // namespace detail + +// Integer type functions - use std::remove_reference_t to handle references properly +template +auto toOfxRectI(const Container& c) + -> std::enable_if_t>, OfxRectI> { + return detail::toOfx(c); +} + +template +auto toOfxPointI(const Container& c) + -> std::enable_if_t>, OfxPointI> { + return detail::toOfx(c); +} + +// Floating-point type functions +template +auto toOfxRectD(const Container& c) + -> std::enable_if_t>, + OfxRectD> { + return detail::toOfx(c); +} + +template +auto toOfxPointD(const Container& c) + -> std::enable_if_t>, + OfxPointD> { + return detail::toOfx(c); +} +} // namespace openfx diff --git a/openfx-cpp/include/openfx/ofxPropSetAccessors.h b/openfx-cpp/include/openfx/ofxPropSetAccessors.h new file mode 100644 index 000000000..a534a5883 --- /dev/null +++ b/openfx-cpp/include/openfx/ofxPropSetAccessors.h @@ -0,0 +1,4458 @@ +// Copyright OpenFX and contributors to the OpenFX project. +// SPDX-License-Identifier: BSD-3-Clause +// NOTE: This file is auto-generated by gen-props.py. DO NOT EDIT. + +#pragma once + +#include +#include +#include "ofxPropsAccess.h" +#include "ofxPropsMetadata.h" + +namespace openfx { + +// Type-safe property set accessor classes for PLUGINS +// +// These wrapper classes provide convenient, type-safe access to property sets. +// - For plugins: getters for host-written properties, setters for plugin-written properties +// - For hosts: setters for host-written properties, getters for plugin-written properties +// +// Usage: +// PropertyAccessor accessor(handle, propSuite); +// EffectDescriptor desc(accessor); +// desc.setLabel("My Effect"); // Type-safe setter +// auto label = desc.label(); // Type-safe getter + +// Base class for property set accessors +class PropertySetAccessor { +protected: + PropertyAccessor& props_; +public: + explicit PropertySetAccessor(PropertyAccessor& p) : props_(p) {} + + // Access to underlying PropertyAccessor for advanced use + PropertyAccessor& props() { return props_; } + const PropertyAccessor& props() const { return props_; } +}; + +// Property set accessor for: ActionBeginInstanceChanged_InArgs +class ActionBeginInstanceChanged_InArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + const char* changeReason(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + +}; + +// Property set accessor for: ActionEndInstanceChanged_InArgs +class ActionEndInstanceChanged_InArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + const char* changeReason(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + +}; + +// Property set accessor for: ActionInstanceChanged_InArgs +class ActionInstanceChanged_InArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + const char* type(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* name(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* changeReason(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + double time(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array renderScale() const { + return props_.getAll(); + } + +}; + +// Property set accessor for: ClipDescriptor +class ClipDescriptor : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + ClipDescriptor& setType(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ClipDescriptor& setName(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ClipDescriptor& setLabel(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ClipDescriptor& setShortLabel(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ClipDescriptor& setLongLabel(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ClipDescriptor& setSupportedComponents(const char* value, int index = 0, bool error_if_missing = true) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + ClipDescriptor& setSupportedComponents(const Container& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + ClipDescriptor& setSupportedComponents(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ClipDescriptor& setTemporalClipAccess(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ClipDescriptor& setOptional(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ClipDescriptor& setFieldExtraction(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ClipDescriptor& setIsMask(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ClipDescriptor& setSupportsTiles(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + +}; + +// Property set accessor for: ClipInstance +class ClipInstance : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + const char* type(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* name(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* label(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* shortLabel(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* longLabel(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* supportedComponents(int index = 0, bool error_if_missing = true) const { + return props_.get(index, error_if_missing); + } + + bool temporalClipAccess(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* colourspace(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* preferredColourspaces(int index = 0, bool error_if_missing = true) const { + return props_.get(index, error_if_missing); + } + + bool optional(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* fieldExtraction(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool isMask(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool supportsTiles(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* pixelDepth(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* components(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* unmappedPixelDepth(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* unmappedComponents(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* preMultiplication(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + double pixelAspectRatio(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + double frameRate(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array frameRange() const { + return props_.getAll(); + } + + const char* fieldOrder(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool connected(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array unmappedFrameRange() const { + return props_.getAll(); + } + + double unmappedFrameRate(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool continuousSamples(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + +}; + +// Property set accessor for: CustomParamInterpFunc_InArgs +class CustomParamInterpFunc_InArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + std::array customValue() const { + return props_.getAll(); + } + + std::array interpolationTime() const { + return props_.getAll(); + } + + double interpolationAmount(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + +}; + +// Property set accessor for: CustomParamInterpFunc_OutArgs +class CustomParamInterpFunc_OutArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + CustomParamInterpFunc_OutArgs& setCustomValue(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + CustomParamInterpFunc_OutArgs& setCustomValue(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + CustomParamInterpFunc_OutArgs& setInterpolationTime(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + CustomParamInterpFunc_OutArgs& setInterpolationTime(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + +}; + +// Property set accessor for: EffectDescriptor +class EffectDescriptor : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + EffectDescriptor& setType(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + EffectDescriptor& setLabel(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + EffectDescriptor& setShortLabel(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + EffectDescriptor& setLongLabel(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + EffectDescriptor& setVersion(int value, int index = 0, bool error_if_missing = false) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + EffectDescriptor& setVersion(const Container& values, bool error_if_missing = false) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + EffectDescriptor& setVersion(std::initializer_list values, bool error_if_missing = false) { + props_.setAll(values, error_if_missing); + return *this; + } + + EffectDescriptor& setVersionLabel(const char* value, bool error_if_missing = false) { + props_.set(value, 0, error_if_missing); + return *this; + } + + EffectDescriptor& setPluginDescription(const char* value, bool error_if_missing = false) { + props_.set(value, 0, error_if_missing); + return *this; + } + + EffectDescriptor& setSupportedContexts(const char* value, int index = 0, bool error_if_missing = true) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + EffectDescriptor& setSupportedContexts(const Container& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + EffectDescriptor& setSupportedContexts(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + EffectDescriptor& setImageEffectPluginPropGrouping(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + EffectDescriptor& setImageEffectPluginPropSingleInstance(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + EffectDescriptor& setImageEffectPluginRenderThreadSafety(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + EffectDescriptor& setImageEffectPluginPropHostFrameThreading(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + EffectDescriptor& setImageEffectPluginPropOverlayInteractV1(void* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + EffectDescriptor& setOpenCLSupported(const char* value, bool error_if_missing = false) { + props_.set(value, 0, error_if_missing); + return *this; + } + + EffectDescriptor& setSupportsMultiResolution(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + EffectDescriptor& setSupportsTiles(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + EffectDescriptor& setTemporalClipAccess(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + EffectDescriptor& setSupportedPixelDepths(const char* value, int index = 0, bool error_if_missing = true) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + EffectDescriptor& setSupportedPixelDepths(const Container& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + EffectDescriptor& setSupportedPixelDepths(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + EffectDescriptor& setImageEffectPluginPropFieldRenderTwiceAlways(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + EffectDescriptor& setMultipleClipDepths(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + EffectDescriptor& setSupportsMultipleClipPARs(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + EffectDescriptor& setClipPreferencesSlaveParam(const char* value, int index = 0, bool error_if_missing = true) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + EffectDescriptor& setClipPreferencesSlaveParam(const Container& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + EffectDescriptor& setClipPreferencesSlaveParam(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + EffectDescriptor& setOpenGLRenderSupported(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + const char* filePath(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + EffectDescriptor& setPixelDepth(const char* value, int index = 0, bool error_if_missing = false) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + EffectDescriptor& setPixelDepth(const Container& values, bool error_if_missing = false) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + EffectDescriptor& setPixelDepth(std::initializer_list values, bool error_if_missing = false) { + props_.setAll(values, error_if_missing); + return *this; + } + + EffectDescriptor& setImageEffectPluginPropOverlayInteractV2(void* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + EffectDescriptor& setColourManagementAvailableConfigs(const char* value, int index = 0, bool error_if_missing = false) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + EffectDescriptor& setColourManagementAvailableConfigs(const Container& values, bool error_if_missing = false) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + EffectDescriptor& setColourManagementAvailableConfigs(std::initializer_list values, bool error_if_missing = false) { + props_.setAll(values, error_if_missing); + return *this; + } + + EffectDescriptor& setColourManagementStyle(const char* value, bool error_if_missing = false) { + props_.set(value, 0, error_if_missing); + return *this; + } + + EffectDescriptor& setNoSpatialAwareness(const char* value, bool error_if_missing = false) { + props_.set(value, 0, error_if_missing); + return *this; + } + +}; + +// Property set accessor for: EffectInstance +class EffectInstance : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + const char* type(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* context(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + void* instanceData(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array projectSize() const { + return props_.getAll(); + } + + std::array projectOffset() const { + return props_.getAll(); + } + + std::array projectExtent() const { + return props_.getAll(); + } + + double pixelAspectRatio(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + double imageEffectInstancePropEffectDuration(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool imageEffectInstancePropSequentialRender(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool supportsTiles(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* openGLRenderSupported(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + double frameRate(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool isInteractive(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* oCIOConfig(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* oCIODisplay(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* oCIOView(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* colourManagementConfig(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* colourManagementStyle(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* displayColourspace(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + void* pluginHandle(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + +}; + +// Property set accessor for: Image +class Image : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + const char* type(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* pixelDepth(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* components(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* preMultiplication(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array renderScale() const { + return props_.getAll(); + } + + double pixelAspectRatio(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + void* data(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array bounds() const { + return props_.getAll(); + } + + std::array regionOfDefinition() const { + return props_.getAll(); + } + + int rowBytes(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* field(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* uniqueIdentifier(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + +}; + +// Property set accessor for: ImageEffectActionBeginSequenceRender_InArgs +class ImageEffectActionBeginSequenceRender_InArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + std::array frameRange() const { + return props_.getAll(); + } + + double frameStep(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool isInteractive(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array renderScale() const { + return props_.getAll(); + } + + bool sequentialRenderStatus(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool interactiveRenderStatus(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool cudaEnabled(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* cudaRenderSupported(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + void* cudaStream(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* cudaStreamSupported(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + void* metalCommandQueue(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool metalEnabled(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* metalRenderSupported(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + void* openCLCommandQueue(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool openCLEnabled(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + void* openCLImage(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* openCLRenderSupported(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* openCLSupported(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool openGLEnabled(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + int openGLTextureIndex(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + int openGLTextureTarget(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* noSpatialAwareness(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + +}; + +// Property set accessor for: ImageEffectActionDescribeInContext_InArgs +class ImageEffectActionDescribeInContext_InArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + const char* context(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + +}; + +// Property set accessor for: ImageEffectActionEndSequenceRender_InArgs +class ImageEffectActionEndSequenceRender_InArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + std::array frameRange() const { + return props_.getAll(); + } + + double frameStep(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool isInteractive(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array renderScale() const { + return props_.getAll(); + } + + bool sequentialRenderStatus(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool interactiveRenderStatus(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool cudaEnabled(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* cudaRenderSupported(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + void* cudaStream(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* cudaStreamSupported(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + void* metalCommandQueue(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool metalEnabled(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* metalRenderSupported(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + void* openCLCommandQueue(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool openCLEnabled(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + void* openCLImage(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* openCLRenderSupported(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* openCLSupported(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool openGLEnabled(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + int openGLTextureIndex(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + int openGLTextureTarget(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + +}; + +// Property set accessor for: ImageEffectActionGetClipPreferences_OutArgs +class ImageEffectActionGetClipPreferences_OutArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + ImageEffectActionGetClipPreferences_OutArgs& setFrameRate(double value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionGetClipPreferences_OutArgs& setFieldOrder(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionGetClipPreferences_OutArgs& setPreMultiplication(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionGetClipPreferences_OutArgs& setContinuousSamples(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionGetClipPreferences_OutArgs& setImageEffectFrameVarying(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + +}; + +// Property set accessor for: ImageEffectActionGetFramesNeeded_InArgs +class ImageEffectActionGetFramesNeeded_InArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + double time(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + +}; + +// Property set accessor for: ImageEffectActionGetFramesNeeded_OutArgs +class ImageEffectActionGetFramesNeeded_OutArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + ImageEffectActionGetFramesNeeded_OutArgs& setFrameRange(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ImageEffectActionGetFramesNeeded_OutArgs& setFrameRange(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + +}; + +// Property set accessor for: ImageEffectActionGetOutputColourspace_InArgs +class ImageEffectActionGetOutputColourspace_InArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + const char* preferredColourspaces(int index = 0, bool error_if_missing = true) const { + return props_.get(index, error_if_missing); + } + +}; + +// Property set accessor for: ImageEffectActionGetOutputColourspace_OutArgs +class ImageEffectActionGetOutputColourspace_OutArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + ImageEffectActionGetOutputColourspace_OutArgs& setColourspace(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + +}; + +// Property set accessor for: ImageEffectActionGetRegionOfDefinition_InArgs +class ImageEffectActionGetRegionOfDefinition_InArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + double time(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array renderScale() const { + return props_.getAll(); + } + +}; + +// Property set accessor for: ImageEffectActionGetRegionOfDefinition_OutArgs +class ImageEffectActionGetRegionOfDefinition_OutArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + ImageEffectActionGetRegionOfDefinition_OutArgs& setRegionOfDefinition(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ImageEffectActionGetRegionOfDefinition_OutArgs& setRegionOfDefinition(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + +}; + +// Property set accessor for: ImageEffectActionGetRegionsOfInterest_InArgs +class ImageEffectActionGetRegionsOfInterest_InArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + double time(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array renderScale() const { + return props_.getAll(); + } + + std::array regionOfInterest() const { + return props_.getAll(); + } + +}; + +// Property set accessor for: ImageEffectActionGetTimeDomain_OutArgs +class ImageEffectActionGetTimeDomain_OutArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + ImageEffectActionGetTimeDomain_OutArgs& setFrameRange(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ImageEffectActionGetTimeDomain_OutArgs& setFrameRange(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + +}; + +// Property set accessor for: ImageEffectActionIsIdentity_InArgs +class ImageEffectActionIsIdentity_InArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + double time(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* fieldToRender(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array renderWindow() const { + return props_.getAll(); + } + + std::array renderScale() const { + return props_.getAll(); + } + +}; + +// Property set accessor for: ImageEffectActionRender_InArgs +class ImageEffectActionRender_InArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + double time(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool sequentialRenderStatus(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool interactiveRenderStatus(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool renderQualityDraft(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool cudaEnabled(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* cudaRenderSupported(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + void* cudaStream(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* cudaStreamSupported(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + void* metalCommandQueue(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool metalEnabled(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* metalRenderSupported(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + void* openCLCommandQueue(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool openCLEnabled(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + void* openCLImage(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* openCLRenderSupported(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* openCLSupported(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool openGLEnabled(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + int openGLTextureIndex(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + int openGLTextureTarget(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* noSpatialAwareness(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + +}; + +// Property set accessor for: ImageEffectHost +class ImageEffectHost : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + int aPIVersion(int index = 0, bool error_if_missing = true) const { + return props_.get(index, error_if_missing); + } + + const char* type(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* name(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* label(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + int version(int index = 0, bool error_if_missing = true) const { + return props_.get(index, error_if_missing); + } + + const char* versionLabel(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool imageEffectHostPropIsBackground(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool supportsOverlays(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool supportsMultiResolution(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool supportsTiles(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool temporalClipAccess(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* supportedComponents(int index = 0, bool error_if_missing = true) const { + return props_.get(index, error_if_missing); + } + + const char* supportedContexts(int index = 0, bool error_if_missing = true) const { + return props_.get(index, error_if_missing); + } + + bool multipleClipDepths(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* openCLSupported(bool error_if_missing = false) const { + return props_.get(0, error_if_missing); + } + + bool supportsMultipleClipPARs(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool setableFrameRate(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool setableFielding(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool paramHostPropSupportsCustomInteract(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool paramHostPropSupportsStringAnimation(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool paramHostPropSupportsChoiceAnimation(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool paramHostPropSupportsBooleanAnimation(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool paramHostPropSupportsCustomAnimation(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool paramHostPropSupportsStrChoice(bool error_if_missing = false) const { + return props_.get(0, error_if_missing); + } + + bool paramHostPropSupportsStrChoiceAnimation(bool error_if_missing = false) const { + return props_.get(0, error_if_missing); + } + + int paramHostPropMaxParameters(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + int paramHostPropMaxPages(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array paramHostPropPageRowColumnCount() const { + return props_.getAll(); + } + + void* hostOSHandle(bool error_if_missing = false) const { + return props_.get(0, error_if_missing); + } + + bool paramHostPropSupportsParametricAnimation(bool error_if_missing = false) const { + return props_.get(0, error_if_missing); + } + + bool imageEffectInstancePropSequentialRender(bool error_if_missing = false) const { + return props_.get(0, error_if_missing); + } + + const char* openGLRenderSupported(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool renderQualityDraft(bool error_if_missing = false) const { + return props_.get(0, error_if_missing); + } + + const char* imageEffectHostPropNativeOrigin(bool error_if_missing = false) const { + return props_.get(0, error_if_missing); + } + + const char* colourManagementAvailableConfigs(int index = 0, bool error_if_missing = false) const { + return props_.get(index, error_if_missing); + } + + const char* colourManagementStyle(bool error_if_missing = false) const { + return props_.get(0, error_if_missing); + } + +}; + +// Property set accessor for: InteractActionDraw_InArgs +class InteractActionDraw_InArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + void* effectInstance(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + void* interactPropDrawContext(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array interactPropPixelScale() const { + return props_.getAll(); + } + + std::array interactPropBackgroundColour() const { + return props_.getAll(); + } + + double time(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array renderScale() const { + return props_.getAll(); + } + +}; + +// Property set accessor for: InteractActionGainFocus_InArgs +class InteractActionGainFocus_InArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + void* effectInstance(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array interactPropPixelScale() const { + return props_.getAll(); + } + + std::array interactPropBackgroundColour() const { + return props_.getAll(); + } + + double time(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array renderScale() const { + return props_.getAll(); + } + +}; + +// Property set accessor for: InteractActionKeyDown_InArgs +class InteractActionKeyDown_InArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + void* effectInstance(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + int keySym(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* keyString(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + double time(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array renderScale() const { + return props_.getAll(); + } + +}; + +// Property set accessor for: InteractActionKeyRepeat_InArgs +class InteractActionKeyRepeat_InArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + void* effectInstance(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + int keySym(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* keyString(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + double time(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array renderScale() const { + return props_.getAll(); + } + +}; + +// Property set accessor for: InteractActionKeyUp_InArgs +class InteractActionKeyUp_InArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + void* effectInstance(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + int keySym(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* keyString(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + double time(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array renderScale() const { + return props_.getAll(); + } + +}; + +// Property set accessor for: InteractActionLoseFocus_InArgs +class InteractActionLoseFocus_InArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + void* effectInstance(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array interactPropPixelScale() const { + return props_.getAll(); + } + + std::array interactPropBackgroundColour() const { + return props_.getAll(); + } + + double time(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array renderScale() const { + return props_.getAll(); + } + +}; + +// Property set accessor for: InteractActionPenDown_InArgs +class InteractActionPenDown_InArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + void* effectInstance(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array interactPropPixelScale() const { + return props_.getAll(); + } + + std::array interactPropBackgroundColour() const { + return props_.getAll(); + } + + double time(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array renderScale() const { + return props_.getAll(); + } + + std::array interactPropPenPosition() const { + return props_.getAll(); + } + + std::array interactPropPenViewportPosition() const { + return props_.getAll(); + } + + double interactPropPenPressure(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + +}; + +// Property set accessor for: InteractActionPenMotion_InArgs +class InteractActionPenMotion_InArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + void* effectInstance(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array interactPropPixelScale() const { + return props_.getAll(); + } + + std::array interactPropBackgroundColour() const { + return props_.getAll(); + } + + double time(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array renderScale() const { + return props_.getAll(); + } + + std::array interactPropPenPosition() const { + return props_.getAll(); + } + + std::array interactPropPenViewportPosition() const { + return props_.getAll(); + } + + double interactPropPenPressure(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + +}; + +// Property set accessor for: InteractActionPenUp_InArgs +class InteractActionPenUp_InArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + void* effectInstance(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array interactPropPixelScale() const { + return props_.getAll(); + } + + std::array interactPropBackgroundColour() const { + return props_.getAll(); + } + + double time(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array renderScale() const { + return props_.getAll(); + } + + std::array interactPropPenPosition() const { + return props_.getAll(); + } + + std::array interactPropPenViewportPosition() const { + return props_.getAll(); + } + + double interactPropPenPressure(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + +}; + +// Property set accessor for: InteractDescriptor +class InteractDescriptor : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + bool interactPropHasAlpha(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + int interactPropBitDepth(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + +}; + +// Property set accessor for: InteractInstance +class InteractInstance : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + void* effectInstance(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + void* instanceData(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array interactPropPixelScale() const { + return props_.getAll(); + } + + std::array interactPropBackgroundColour() const { + return props_.getAll(); + } + + bool interactPropHasAlpha(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + int interactPropBitDepth(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* interactPropSlaveToParam(int index = 0, bool error_if_missing = true) const { + return props_.get(index, error_if_missing); + } + + std::array interactPropSuggestedColour() const { + return props_.getAll(); + } + +}; + +// Property set accessor for: ParamDouble1D +class ParamDouble1D : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + ParamDouble1D& setShowTimeMarker(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamDouble1D& setDoubleType(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamDouble1D& setType(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamDouble1D& setName(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamDouble1D& setLabel(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamDouble1D& setShortLabel(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamDouble1D& setLongLabel(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamDouble1D& setSecret(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamDouble1D& setHint(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamDouble1D& setScriptName(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamDouble1D& setParent(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamDouble1D& setEnabled(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamDouble1D& setDataPtr(void* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamDouble1D& setIcon(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ParamDouble1D& setIcon(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ParamDouble1D& setInteractV1(void* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamDouble1D& setInteractSize(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ParamDouble1D& setInteractSize(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ParamDouble1D& setInteractSizeAspect(double value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamDouble1D& setInteractMinimumSize(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ParamDouble1D& setInteractMinimumSize(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ParamDouble1D& setInteractPreferedSize(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ParamDouble1D& setInteractPreferedSize(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ParamDouble1D& setHasHostOverlayHandle(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamDouble1D& setUseHostOverlayHandle(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + // Multi-type property (supports: int, double, string, pointer) + template + ParamDouble1D& setDefault(T value, int index = 0, bool error_if_missing = true) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + ParamDouble1D& setDefault(const Container& values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + template + ParamDouble1D& setDefault(std::initializer_list values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + ParamDouble1D& setAnimates(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + bool isAnimating(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool isAutoKeying(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + ParamDouble1D& setPersistant(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamDouble1D& setEvaluateOnChange(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamDouble1D& setPluginMayWrite(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamDouble1D& setCacheInvalidation(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamDouble1D& setCanUndo(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + // Multi-type property (supports: int, double) + template + ParamDouble1D& setMin(T value, int index = 0, bool error_if_missing = true) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + ParamDouble1D& setMin(const Container& values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + template + ParamDouble1D& setMin(std::initializer_list values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + // Multi-type property (supports: int, double) + template + ParamDouble1D& setMax(T value, int index = 0, bool error_if_missing = true) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + ParamDouble1D& setMax(const Container& values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + template + ParamDouble1D& setMax(std::initializer_list values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + // Multi-type property (supports: int, double) + template + ParamDouble1D& setDisplayMin(T value, int index = 0, bool error_if_missing = true) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + ParamDouble1D& setDisplayMin(const Container& values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + template + ParamDouble1D& setDisplayMin(std::initializer_list values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + // Multi-type property (supports: int, double) + template + ParamDouble1D& setDisplayMax(T value, int index = 0, bool error_if_missing = true) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + ParamDouble1D& setDisplayMax(const Container& values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + template + ParamDouble1D& setDisplayMax(std::initializer_list values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + ParamDouble1D& setIncrement(double value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamDouble1D& setDigits(int value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + +}; + +// Property set accessor for: ParameterSet +class ParameterSet : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + ParameterSet& setParamSetNeedsSyncing(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParameterSet& setParamPageOrder(const char* value, int index = 0, bool error_if_missing = true) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + ParameterSet& setParamPageOrder(const Container& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + ParameterSet& setParamPageOrder(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + +}; + +// Property set accessor for: ParamsByte +class ParamsByte : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + ParamsByte& setType(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsByte& setName(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsByte& setLabel(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsByte& setShortLabel(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsByte& setLongLabel(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsByte& setSecret(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsByte& setHint(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsByte& setScriptName(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsByte& setParent(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsByte& setEnabled(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsByte& setDataPtr(void* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsByte& setIcon(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ParamsByte& setIcon(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ParamsByte& setInteractV1(void* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsByte& setInteractSize(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ParamsByte& setInteractSize(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ParamsByte& setInteractSizeAspect(double value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsByte& setInteractMinimumSize(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ParamsByte& setInteractMinimumSize(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ParamsByte& setInteractPreferedSize(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ParamsByte& setInteractPreferedSize(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ParamsByte& setHasHostOverlayHandle(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsByte& setUseHostOverlayHandle(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + // Multi-type property (supports: int, double, string, pointer) + template + ParamsByte& setDefault(T value, int index = 0, bool error_if_missing = true) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + ParamsByte& setDefault(const Container& values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + template + ParamsByte& setDefault(std::initializer_list values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + ParamsByte& setAnimates(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + bool isAnimating(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool isAutoKeying(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + ParamsByte& setPersistant(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsByte& setEvaluateOnChange(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsByte& setPluginMayWrite(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsByte& setCacheInvalidation(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsByte& setCanUndo(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + // Multi-type property (supports: int, double) + template + ParamsByte& setMin(T value, int index = 0, bool error_if_missing = true) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + ParamsByte& setMin(const Container& values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + template + ParamsByte& setMin(std::initializer_list values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + // Multi-type property (supports: int, double) + template + ParamsByte& setMax(T value, int index = 0, bool error_if_missing = true) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + ParamsByte& setMax(const Container& values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + template + ParamsByte& setMax(std::initializer_list values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + // Multi-type property (supports: int, double) + template + ParamsByte& setDisplayMin(T value, int index = 0, bool error_if_missing = true) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + ParamsByte& setDisplayMin(const Container& values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + template + ParamsByte& setDisplayMin(std::initializer_list values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + // Multi-type property (supports: int, double) + template + ParamsByte& setDisplayMax(T value, int index = 0, bool error_if_missing = true) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + ParamsByte& setDisplayMax(const Container& values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + template + ParamsByte& setDisplayMax(std::initializer_list values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + +}; + +// Property set accessor for: ParamsChoice +class ParamsChoice : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + ParamsChoice& setChoiceOption(const char* value, int index = 0, bool error_if_missing = true) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + ParamsChoice& setChoiceOption(const Container& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + ParamsChoice& setChoiceOption(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ParamsChoice& setChoiceOrder(int value, int index = 0, bool error_if_missing = true) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + ParamsChoice& setChoiceOrder(const Container& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + ParamsChoice& setChoiceOrder(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ParamsChoice& setType(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsChoice& setName(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsChoice& setLabel(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsChoice& setShortLabel(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsChoice& setLongLabel(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsChoice& setSecret(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsChoice& setHint(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsChoice& setScriptName(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsChoice& setParent(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsChoice& setEnabled(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsChoice& setDataPtr(void* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsChoice& setIcon(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ParamsChoice& setIcon(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ParamsChoice& setInteractV1(void* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsChoice& setInteractSize(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ParamsChoice& setInteractSize(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ParamsChoice& setInteractSizeAspect(double value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsChoice& setInteractMinimumSize(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ParamsChoice& setInteractMinimumSize(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ParamsChoice& setInteractPreferedSize(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ParamsChoice& setInteractPreferedSize(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ParamsChoice& setHasHostOverlayHandle(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsChoice& setUseHostOverlayHandle(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + // Multi-type property (supports: int, double, string, pointer) + template + ParamsChoice& setDefault(T value, int index = 0, bool error_if_missing = true) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + ParamsChoice& setDefault(const Container& values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + template + ParamsChoice& setDefault(std::initializer_list values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + ParamsChoice& setAnimates(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + bool isAnimating(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool isAutoKeying(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + ParamsChoice& setPersistant(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsChoice& setEvaluateOnChange(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsChoice& setPluginMayWrite(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsChoice& setCacheInvalidation(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsChoice& setCanUndo(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + +}; + +// Property set accessor for: ParamsCustom +class ParamsCustom : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + ParamsCustom& setCustomCallbackV1(void* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsCustom& setType(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsCustom& setName(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsCustom& setLabel(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsCustom& setShortLabel(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsCustom& setLongLabel(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsCustom& setSecret(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsCustom& setHint(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsCustom& setScriptName(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsCustom& setParent(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsCustom& setEnabled(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsCustom& setDataPtr(void* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsCustom& setIcon(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ParamsCustom& setIcon(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ParamsCustom& setInteractV1(void* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsCustom& setInteractSize(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ParamsCustom& setInteractSize(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ParamsCustom& setInteractSizeAspect(double value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsCustom& setInteractMinimumSize(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ParamsCustom& setInteractMinimumSize(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ParamsCustom& setInteractPreferedSize(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ParamsCustom& setInteractPreferedSize(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ParamsCustom& setHasHostOverlayHandle(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsCustom& setUseHostOverlayHandle(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + // Multi-type property (supports: int, double, string, pointer) + template + ParamsCustom& setDefault(T value, int index = 0, bool error_if_missing = true) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + ParamsCustom& setDefault(const Container& values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + template + ParamsCustom& setDefault(std::initializer_list values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + ParamsCustom& setAnimates(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + bool isAnimating(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool isAutoKeying(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + ParamsCustom& setPersistant(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsCustom& setEvaluateOnChange(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsCustom& setPluginMayWrite(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsCustom& setCacheInvalidation(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsCustom& setCanUndo(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + +}; + +// Property set accessor for: ParamsDouble2D3D +class ParamsDouble2D3D : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + ParamsDouble2D3D& setDoubleType(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsDouble2D3D& setType(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsDouble2D3D& setName(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsDouble2D3D& setLabel(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsDouble2D3D& setShortLabel(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsDouble2D3D& setLongLabel(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsDouble2D3D& setSecret(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsDouble2D3D& setHint(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsDouble2D3D& setScriptName(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsDouble2D3D& setParent(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsDouble2D3D& setEnabled(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsDouble2D3D& setDataPtr(void* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsDouble2D3D& setIcon(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ParamsDouble2D3D& setIcon(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ParamsDouble2D3D& setInteractV1(void* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsDouble2D3D& setInteractSize(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ParamsDouble2D3D& setInteractSize(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ParamsDouble2D3D& setInteractSizeAspect(double value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsDouble2D3D& setInteractMinimumSize(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ParamsDouble2D3D& setInteractMinimumSize(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ParamsDouble2D3D& setInteractPreferedSize(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ParamsDouble2D3D& setInteractPreferedSize(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ParamsDouble2D3D& setHasHostOverlayHandle(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsDouble2D3D& setUseHostOverlayHandle(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + // Multi-type property (supports: int, double, string, pointer) + template + ParamsDouble2D3D& setDefault(T value, int index = 0, bool error_if_missing = true) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + ParamsDouble2D3D& setDefault(const Container& values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + template + ParamsDouble2D3D& setDefault(std::initializer_list values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + ParamsDouble2D3D& setAnimates(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + bool isAnimating(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool isAutoKeying(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + ParamsDouble2D3D& setPersistant(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsDouble2D3D& setEvaluateOnChange(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsDouble2D3D& setPluginMayWrite(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsDouble2D3D& setCacheInvalidation(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsDouble2D3D& setCanUndo(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + // Multi-type property (supports: int, double) + template + ParamsDouble2D3D& setMin(T value, int index = 0, bool error_if_missing = true) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + ParamsDouble2D3D& setMin(const Container& values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + template + ParamsDouble2D3D& setMin(std::initializer_list values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + // Multi-type property (supports: int, double) + template + ParamsDouble2D3D& setMax(T value, int index = 0, bool error_if_missing = true) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + ParamsDouble2D3D& setMax(const Container& values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + template + ParamsDouble2D3D& setMax(std::initializer_list values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + // Multi-type property (supports: int, double) + template + ParamsDouble2D3D& setDisplayMin(T value, int index = 0, bool error_if_missing = true) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + ParamsDouble2D3D& setDisplayMin(const Container& values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + template + ParamsDouble2D3D& setDisplayMin(std::initializer_list values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + // Multi-type property (supports: int, double) + template + ParamsDouble2D3D& setDisplayMax(T value, int index = 0, bool error_if_missing = true) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + ParamsDouble2D3D& setDisplayMax(const Container& values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + template + ParamsDouble2D3D& setDisplayMax(std::initializer_list values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + ParamsDouble2D3D& setIncrement(double value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsDouble2D3D& setDigits(int value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + +}; + +// Property set accessor for: ParamsGroup +class ParamsGroup : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + ParamsGroup& setGroupOpen(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsGroup& setType(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsGroup& setName(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsGroup& setLabel(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsGroup& setShortLabel(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsGroup& setLongLabel(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsGroup& setSecret(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsGroup& setHint(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsGroup& setScriptName(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsGroup& setParent(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsGroup& setEnabled(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsGroup& setDataPtr(void* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsGroup& setIcon(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ParamsGroup& setIcon(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + +}; + +// Property set accessor for: ParamsInt2D3D +class ParamsInt2D3D : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + ParamsInt2D3D& setDimensionLabel(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsInt2D3D& setType(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsInt2D3D& setName(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsInt2D3D& setLabel(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsInt2D3D& setShortLabel(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsInt2D3D& setLongLabel(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsInt2D3D& setSecret(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsInt2D3D& setHint(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsInt2D3D& setScriptName(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsInt2D3D& setParent(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsInt2D3D& setEnabled(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsInt2D3D& setDataPtr(void* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsInt2D3D& setIcon(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ParamsInt2D3D& setIcon(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ParamsInt2D3D& setInteractV1(void* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsInt2D3D& setInteractSize(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ParamsInt2D3D& setInteractSize(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ParamsInt2D3D& setInteractSizeAspect(double value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsInt2D3D& setInteractMinimumSize(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ParamsInt2D3D& setInteractMinimumSize(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ParamsInt2D3D& setInteractPreferedSize(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ParamsInt2D3D& setInteractPreferedSize(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ParamsInt2D3D& setHasHostOverlayHandle(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsInt2D3D& setUseHostOverlayHandle(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + // Multi-type property (supports: int, double, string, pointer) + template + ParamsInt2D3D& setDefault(T value, int index = 0, bool error_if_missing = true) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + ParamsInt2D3D& setDefault(const Container& values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + template + ParamsInt2D3D& setDefault(std::initializer_list values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + ParamsInt2D3D& setAnimates(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + bool isAnimating(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool isAutoKeying(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + ParamsInt2D3D& setPersistant(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsInt2D3D& setEvaluateOnChange(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsInt2D3D& setPluginMayWrite(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsInt2D3D& setCacheInvalidation(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsInt2D3D& setCanUndo(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + // Multi-type property (supports: int, double) + template + ParamsInt2D3D& setMin(T value, int index = 0, bool error_if_missing = true) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + ParamsInt2D3D& setMin(const Container& values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + template + ParamsInt2D3D& setMin(std::initializer_list values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + // Multi-type property (supports: int, double) + template + ParamsInt2D3D& setMax(T value, int index = 0, bool error_if_missing = true) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + ParamsInt2D3D& setMax(const Container& values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + template + ParamsInt2D3D& setMax(std::initializer_list values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + // Multi-type property (supports: int, double) + template + ParamsInt2D3D& setDisplayMin(T value, int index = 0, bool error_if_missing = true) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + ParamsInt2D3D& setDisplayMin(const Container& values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + template + ParamsInt2D3D& setDisplayMin(std::initializer_list values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + // Multi-type property (supports: int, double) + template + ParamsInt2D3D& setDisplayMax(T value, int index = 0, bool error_if_missing = true) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + ParamsInt2D3D& setDisplayMax(const Container& values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + template + ParamsInt2D3D& setDisplayMax(std::initializer_list values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + +}; + +// Property set accessor for: ParamsNormalizedSpatial +class ParamsNormalizedSpatial : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + ParamsNormalizedSpatial& setDefaultCoordinateSystem(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsNormalizedSpatial& setType(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsNormalizedSpatial& setName(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsNormalizedSpatial& setLabel(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsNormalizedSpatial& setShortLabel(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsNormalizedSpatial& setLongLabel(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsNormalizedSpatial& setSecret(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsNormalizedSpatial& setHint(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsNormalizedSpatial& setScriptName(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsNormalizedSpatial& setParent(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsNormalizedSpatial& setEnabled(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsNormalizedSpatial& setDataPtr(void* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsNormalizedSpatial& setIcon(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ParamsNormalizedSpatial& setIcon(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ParamsNormalizedSpatial& setInteractV1(void* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsNormalizedSpatial& setInteractSize(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ParamsNormalizedSpatial& setInteractSize(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ParamsNormalizedSpatial& setInteractSizeAspect(double value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsNormalizedSpatial& setInteractMinimumSize(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ParamsNormalizedSpatial& setInteractMinimumSize(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ParamsNormalizedSpatial& setInteractPreferedSize(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ParamsNormalizedSpatial& setInteractPreferedSize(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ParamsNormalizedSpatial& setHasHostOverlayHandle(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsNormalizedSpatial& setUseHostOverlayHandle(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + // Multi-type property (supports: int, double, string, pointer) + template + ParamsNormalizedSpatial& setDefault(T value, int index = 0, bool error_if_missing = true) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + ParamsNormalizedSpatial& setDefault(const Container& values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + template + ParamsNormalizedSpatial& setDefault(std::initializer_list values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + ParamsNormalizedSpatial& setAnimates(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + bool isAnimating(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool isAutoKeying(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + ParamsNormalizedSpatial& setPersistant(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsNormalizedSpatial& setEvaluateOnChange(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsNormalizedSpatial& setPluginMayWrite(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsNormalizedSpatial& setCacheInvalidation(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsNormalizedSpatial& setCanUndo(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + // Multi-type property (supports: int, double) + template + ParamsNormalizedSpatial& setMin(T value, int index = 0, bool error_if_missing = true) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + ParamsNormalizedSpatial& setMin(const Container& values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + template + ParamsNormalizedSpatial& setMin(std::initializer_list values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + // Multi-type property (supports: int, double) + template + ParamsNormalizedSpatial& setMax(T value, int index = 0, bool error_if_missing = true) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + ParamsNormalizedSpatial& setMax(const Container& values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + template + ParamsNormalizedSpatial& setMax(std::initializer_list values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + // Multi-type property (supports: int, double) + template + ParamsNormalizedSpatial& setDisplayMin(T value, int index = 0, bool error_if_missing = true) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + ParamsNormalizedSpatial& setDisplayMin(const Container& values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + template + ParamsNormalizedSpatial& setDisplayMin(std::initializer_list values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + // Multi-type property (supports: int, double) + template + ParamsNormalizedSpatial& setDisplayMax(T value, int index = 0, bool error_if_missing = true) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + ParamsNormalizedSpatial& setDisplayMax(const Container& values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + template + ParamsNormalizedSpatial& setDisplayMax(std::initializer_list values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + ParamsNormalizedSpatial& setIncrement(double value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsNormalizedSpatial& setDigits(int value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + +}; + +// Property set accessor for: ParamsPage +class ParamsPage : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + ParamsPage& setPageChild(const char* value, int index = 0, bool error_if_missing = true) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + ParamsPage& setPageChild(const Container& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + ParamsPage& setPageChild(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ParamsPage& setType(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsPage& setName(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsPage& setLabel(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsPage& setShortLabel(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsPage& setLongLabel(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsPage& setSecret(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsPage& setHint(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsPage& setScriptName(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsPage& setParent(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsPage& setEnabled(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsPage& setDataPtr(void* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsPage& setIcon(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ParamsPage& setIcon(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + +}; + +// Property set accessor for: ParamsParametric +class ParamsParametric : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + ParamsParametric& setAnimates(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsParametric& setIsAnimating(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsParametric& setIsAutoKeying(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsParametric& setPersistant(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsParametric& setEvaluateOnChange(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsParametric& setPluginMayWrite(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsParametric& setCacheInvalidation(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsParametric& setCanUndo(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsParametric& setParametricDimension(int value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsParametric& setParametricUIColour(double value, int index = 0, bool error_if_missing = true) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + ParamsParametric& setParametricUIColour(const Container& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + ParamsParametric& setParametricUIColour(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ParamsParametric& setParametricInteractBackground(void* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsParametric& setParametricRange(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ParamsParametric& setParametricRange(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ParamsParametric& setType(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsParametric& setName(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsParametric& setLabel(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsParametric& setShortLabel(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsParametric& setLongLabel(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsParametric& setSecret(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsParametric& setHint(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsParametric& setScriptName(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsParametric& setParent(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsParametric& setEnabled(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsParametric& setDataPtr(void* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsParametric& setIcon(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ParamsParametric& setIcon(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ParamsParametric& setInteractV1(void* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsParametric& setInteractSize(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ParamsParametric& setInteractSize(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ParamsParametric& setInteractSizeAspect(double value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsParametric& setInteractMinimumSize(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ParamsParametric& setInteractMinimumSize(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ParamsParametric& setInteractPreferedSize(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ParamsParametric& setInteractPreferedSize(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ParamsParametric& setHasHostOverlayHandle(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsParametric& setUseHostOverlayHandle(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + // Multi-type property (supports: int, double, string, pointer) + template + ParamsParametric& setDefault(T value, int index = 0, bool error_if_missing = true) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + ParamsParametric& setDefault(const Container& values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + template + ParamsParametric& setDefault(std::initializer_list values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + +}; + +// Property set accessor for: ParamsStrChoice +class ParamsStrChoice : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + ParamsStrChoice& setChoiceOption(const char* value, int index = 0, bool error_if_missing = true) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + ParamsStrChoice& setChoiceOption(const Container& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + ParamsStrChoice& setChoiceOption(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ParamsStrChoice& setChoiceEnum(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsStrChoice& setType(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsStrChoice& setName(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsStrChoice& setLabel(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsStrChoice& setShortLabel(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsStrChoice& setLongLabel(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsStrChoice& setSecret(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsStrChoice& setHint(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsStrChoice& setScriptName(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsStrChoice& setParent(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsStrChoice& setEnabled(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsStrChoice& setDataPtr(void* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsStrChoice& setIcon(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ParamsStrChoice& setIcon(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ParamsStrChoice& setInteractV1(void* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsStrChoice& setInteractSize(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ParamsStrChoice& setInteractSize(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ParamsStrChoice& setInteractSizeAspect(double value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsStrChoice& setInteractMinimumSize(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ParamsStrChoice& setInteractMinimumSize(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ParamsStrChoice& setInteractPreferedSize(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ParamsStrChoice& setInteractPreferedSize(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ParamsStrChoice& setHasHostOverlayHandle(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsStrChoice& setUseHostOverlayHandle(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + // Multi-type property (supports: int, double, string, pointer) + template + ParamsStrChoice& setDefault(T value, int index = 0, bool error_if_missing = true) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + ParamsStrChoice& setDefault(const Container& values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + template + ParamsStrChoice& setDefault(std::initializer_list values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + ParamsStrChoice& setAnimates(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + bool isAnimating(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool isAutoKeying(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + ParamsStrChoice& setPersistant(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsStrChoice& setEvaluateOnChange(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsStrChoice& setPluginMayWrite(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsStrChoice& setCacheInvalidation(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsStrChoice& setCanUndo(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + +}; + +// Property set accessor for: ParamsString +class ParamsString : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + ParamsString& setStringMode(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsString& setStringFilePathExists(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsString& setType(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsString& setName(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsString& setLabel(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsString& setShortLabel(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsString& setLongLabel(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsString& setSecret(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsString& setHint(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsString& setScriptName(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsString& setParent(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsString& setEnabled(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsString& setDataPtr(void* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsString& setIcon(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ParamsString& setIcon(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ParamsString& setInteractV1(void* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsString& setInteractSize(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ParamsString& setInteractSize(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ParamsString& setInteractSizeAspect(double value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsString& setInteractMinimumSize(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ParamsString& setInteractMinimumSize(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ParamsString& setInteractPreferedSize(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ParamsString& setInteractPreferedSize(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ParamsString& setHasHostOverlayHandle(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsString& setUseHostOverlayHandle(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + // Multi-type property (supports: int, double, string, pointer) + template + ParamsString& setDefault(T value, int index = 0, bool error_if_missing = true) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + ParamsString& setDefault(const Container& values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + template + ParamsString& setDefault(std::initializer_list values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + ParamsString& setAnimates(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + bool isAnimating(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool isAutoKeying(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + ParamsString& setPersistant(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsString& setEvaluateOnChange(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsString& setPluginMayWrite(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsString& setCacheInvalidation(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsString& setCanUndo(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + // Multi-type property (supports: int, double) + template + ParamsString& setMin(T value, int index = 0, bool error_if_missing = true) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + ParamsString& setMin(const Container& values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + template + ParamsString& setMin(std::initializer_list values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + // Multi-type property (supports: int, double) + template + ParamsString& setMax(T value, int index = 0, bool error_if_missing = true) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + ParamsString& setMax(const Container& values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + template + ParamsString& setMax(std::initializer_list values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + // Multi-type property (supports: int, double) + template + ParamsString& setDisplayMin(T value, int index = 0, bool error_if_missing = true) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + ParamsString& setDisplayMin(const Container& values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + template + ParamsString& setDisplayMin(std::initializer_list values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + // Multi-type property (supports: int, double) + template + ParamsString& setDisplayMax(T value, int index = 0, bool error_if_missing = true) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + ParamsString& setDisplayMax(const Container& values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + template + ParamsString& setDisplayMax(std::initializer_list values, bool error_if_missing = true) { + props_.setAllTyped(values, error_if_missing); + return *this; + } + +}; + +} // namespace openfx diff --git a/openfx-cpp/include/openfx/ofxPropSetAccessorsHost.h b/openfx-cpp/include/openfx/ofxPropSetAccessorsHost.h new file mode 100644 index 000000000..05f695267 --- /dev/null +++ b/openfx-cpp/include/openfx/ofxPropSetAccessorsHost.h @@ -0,0 +1,3919 @@ +// Copyright OpenFX and contributors to the OpenFX project. +// SPDX-License-Identifier: BSD-3-Clause +// NOTE: This file is auto-generated by gen-props.py. DO NOT EDIT. + +#pragma once + +#include +#include +#include "ofxPropsAccess.h" +#include "ofxPropsMetadata.h" + +namespace openfx { + +// Type-safe property set accessor classes for HOSTS +// +// These wrapper classes provide convenient, type-safe access to property sets. +// - For plugins: getters for host-written properties, setters for plugin-written properties +// - For hosts: setters for host-written properties, getters for plugin-written properties +// +// Usage: +// PropertyAccessor accessor(handle, propSuite); +// EffectDescriptor desc(accessor); +// desc.setLabel("My Effect"); // Type-safe setter +// auto label = desc.label(); // Type-safe getter + +// Base class for property set accessors +class PropertySetAccessor { +protected: + PropertyAccessor& props_; +public: + explicit PropertySetAccessor(PropertyAccessor& p) : props_(p) {} + + // Access to underlying PropertyAccessor for advanced use + PropertyAccessor& props() { return props_; } + const PropertyAccessor& props() const { return props_; } +}; + +// Property set accessor for: ActionBeginInstanceChanged_InArgs +class ActionBeginInstanceChanged_InArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + ActionBeginInstanceChanged_InArgs& setChangeReason(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + +}; + +// Property set accessor for: ActionEndInstanceChanged_InArgs +class ActionEndInstanceChanged_InArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + ActionEndInstanceChanged_InArgs& setChangeReason(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + +}; + +// Property set accessor for: ActionInstanceChanged_InArgs +class ActionInstanceChanged_InArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + ActionInstanceChanged_InArgs& setType(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ActionInstanceChanged_InArgs& setName(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ActionInstanceChanged_InArgs& setChangeReason(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ActionInstanceChanged_InArgs& setTime(double value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ActionInstanceChanged_InArgs& setRenderScale(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ActionInstanceChanged_InArgs& setRenderScale(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + +}; + +// Property set accessor for: ClipDescriptor +class ClipDescriptor : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + const char* type(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* name(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* label(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* shortLabel(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* longLabel(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* supportedComponents(int index = 0, bool error_if_missing = true) const { + return props_.get(index, error_if_missing); + } + + bool temporalClipAccess(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool optional(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* fieldExtraction(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool isMask(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool supportsTiles(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + +}; + +// Property set accessor for: ClipInstance +class ClipInstance : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + ClipInstance& setType(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ClipInstance& setName(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ClipInstance& setLabel(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ClipInstance& setShortLabel(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ClipInstance& setLongLabel(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ClipInstance& setSupportedComponents(const char* value, int index = 0, bool error_if_missing = true) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + ClipInstance& setSupportedComponents(const Container& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + ClipInstance& setSupportedComponents(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ClipInstance& setTemporalClipAccess(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ClipInstance& setColourspace(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ClipInstance& setPreferredColourspaces(const char* value, int index = 0, bool error_if_missing = true) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + ClipInstance& setPreferredColourspaces(const Container& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + ClipInstance& setPreferredColourspaces(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ClipInstance& setOptional(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ClipInstance& setFieldExtraction(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ClipInstance& setIsMask(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ClipInstance& setSupportsTiles(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ClipInstance& setPixelDepth(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ClipInstance& setComponents(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ClipInstance& setUnmappedPixelDepth(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ClipInstance& setUnmappedComponents(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ClipInstance& setPreMultiplication(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ClipInstance& setPixelAspectRatio(double value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ClipInstance& setFrameRate(double value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ClipInstance& setFrameRange(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ClipInstance& setFrameRange(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ClipInstance& setFieldOrder(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ClipInstance& setConnected(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ClipInstance& setUnmappedFrameRange(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ClipInstance& setUnmappedFrameRange(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ClipInstance& setUnmappedFrameRate(double value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ClipInstance& setContinuousSamples(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + +}; + +// Property set accessor for: CustomParamInterpFunc_InArgs +class CustomParamInterpFunc_InArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + CustomParamInterpFunc_InArgs& setCustomValue(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + CustomParamInterpFunc_InArgs& setCustomValue(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + CustomParamInterpFunc_InArgs& setInterpolationTime(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + CustomParamInterpFunc_InArgs& setInterpolationTime(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + CustomParamInterpFunc_InArgs& setInterpolationAmount(double value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + +}; + +// Property set accessor for: CustomParamInterpFunc_OutArgs +class CustomParamInterpFunc_OutArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + std::array customValue() const { + return props_.getAll(); + } + + std::array interpolationTime() const { + return props_.getAll(); + } + +}; + +// Property set accessor for: EffectDescriptor +class EffectDescriptor : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + const char* type(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* label(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* shortLabel(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* longLabel(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + int version(int index = 0, bool error_if_missing = false) const { + return props_.get(index, error_if_missing); + } + + const char* versionLabel(bool error_if_missing = false) const { + return props_.get(0, error_if_missing); + } + + const char* pluginDescription(bool error_if_missing = false) const { + return props_.get(0, error_if_missing); + } + + const char* supportedContexts(int index = 0, bool error_if_missing = true) const { + return props_.get(index, error_if_missing); + } + + const char* imageEffectPluginPropGrouping(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool imageEffectPluginPropSingleInstance(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* imageEffectPluginRenderThreadSafety(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool imageEffectPluginPropHostFrameThreading(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + void* imageEffectPluginPropOverlayInteractV1(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* openCLSupported(bool error_if_missing = false) const { + return props_.get(0, error_if_missing); + } + + bool supportsMultiResolution(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool supportsTiles(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool temporalClipAccess(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* supportedPixelDepths(int index = 0, bool error_if_missing = true) const { + return props_.get(index, error_if_missing); + } + + bool imageEffectPluginPropFieldRenderTwiceAlways(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool multipleClipDepths(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool supportsMultipleClipPARs(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* clipPreferencesSlaveParam(int index = 0, bool error_if_missing = true) const { + return props_.get(index, error_if_missing); + } + + const char* openGLRenderSupported(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + EffectDescriptor& setFilePath(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + const char* pixelDepth(int index = 0, bool error_if_missing = false) const { + return props_.get(index, error_if_missing); + } + + void* imageEffectPluginPropOverlayInteractV2(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* colourManagementAvailableConfigs(int index = 0, bool error_if_missing = false) const { + return props_.get(index, error_if_missing); + } + + const char* colourManagementStyle(bool error_if_missing = false) const { + return props_.get(0, error_if_missing); + } + + const char* noSpatialAwareness(bool error_if_missing = false) const { + return props_.get(0, error_if_missing); + } + +}; + +// Property set accessor for: EffectInstance +class EffectInstance : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + EffectInstance& setType(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + EffectInstance& setContext(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + EffectInstance& setInstanceData(void* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + EffectInstance& setProjectSize(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + EffectInstance& setProjectSize(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + EffectInstance& setProjectOffset(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + EffectInstance& setProjectOffset(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + EffectInstance& setProjectExtent(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + EffectInstance& setProjectExtent(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + EffectInstance& setPixelAspectRatio(double value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + EffectInstance& setImageEffectInstancePropEffectDuration(double value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + EffectInstance& setImageEffectInstancePropSequentialRender(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + EffectInstance& setSupportsTiles(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + EffectInstance& setOpenGLRenderSupported(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + EffectInstance& setFrameRate(double value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + EffectInstance& setIsInteractive(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + EffectInstance& setOCIOConfig(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + EffectInstance& setOCIODisplay(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + EffectInstance& setOCIOView(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + EffectInstance& setColourManagementConfig(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + EffectInstance& setColourManagementStyle(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + EffectInstance& setDisplayColourspace(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + EffectInstance& setPluginHandle(void* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + +}; + +// Property set accessor for: Image +class Image : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + Image& setType(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + Image& setPixelDepth(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + Image& setComponents(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + Image& setPreMultiplication(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + Image& setRenderScale(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + Image& setRenderScale(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + Image& setPixelAspectRatio(double value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + Image& setData(void* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + Image& setBounds(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + Image& setBounds(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + Image& setRegionOfDefinition(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + Image& setRegionOfDefinition(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + Image& setRowBytes(int value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + Image& setField(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + Image& setUniqueIdentifier(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + +}; + +// Property set accessor for: ImageEffectActionBeginSequenceRender_InArgs +class ImageEffectActionBeginSequenceRender_InArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + ImageEffectActionBeginSequenceRender_InArgs& setFrameRange(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ImageEffectActionBeginSequenceRender_InArgs& setFrameRange(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ImageEffectActionBeginSequenceRender_InArgs& setFrameStep(double value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionBeginSequenceRender_InArgs& setIsInteractive(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionBeginSequenceRender_InArgs& setRenderScale(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ImageEffectActionBeginSequenceRender_InArgs& setRenderScale(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ImageEffectActionBeginSequenceRender_InArgs& setSequentialRenderStatus(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionBeginSequenceRender_InArgs& setInteractiveRenderStatus(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionBeginSequenceRender_InArgs& setCudaEnabled(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionBeginSequenceRender_InArgs& setCudaRenderSupported(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionBeginSequenceRender_InArgs& setCudaStream(void* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionBeginSequenceRender_InArgs& setCudaStreamSupported(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionBeginSequenceRender_InArgs& setMetalCommandQueue(void* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionBeginSequenceRender_InArgs& setMetalEnabled(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionBeginSequenceRender_InArgs& setMetalRenderSupported(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionBeginSequenceRender_InArgs& setOpenCLCommandQueue(void* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionBeginSequenceRender_InArgs& setOpenCLEnabled(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionBeginSequenceRender_InArgs& setOpenCLImage(void* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionBeginSequenceRender_InArgs& setOpenCLRenderSupported(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionBeginSequenceRender_InArgs& setOpenCLSupported(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionBeginSequenceRender_InArgs& setOpenGLEnabled(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionBeginSequenceRender_InArgs& setOpenGLTextureIndex(int value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionBeginSequenceRender_InArgs& setOpenGLTextureTarget(int value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionBeginSequenceRender_InArgs& setNoSpatialAwareness(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + +}; + +// Property set accessor for: ImageEffectActionDescribeInContext_InArgs +class ImageEffectActionDescribeInContext_InArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + ImageEffectActionDescribeInContext_InArgs& setContext(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + +}; + +// Property set accessor for: ImageEffectActionEndSequenceRender_InArgs +class ImageEffectActionEndSequenceRender_InArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + ImageEffectActionEndSequenceRender_InArgs& setFrameRange(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ImageEffectActionEndSequenceRender_InArgs& setFrameRange(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ImageEffectActionEndSequenceRender_InArgs& setFrameStep(double value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionEndSequenceRender_InArgs& setIsInteractive(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionEndSequenceRender_InArgs& setRenderScale(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ImageEffectActionEndSequenceRender_InArgs& setRenderScale(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ImageEffectActionEndSequenceRender_InArgs& setSequentialRenderStatus(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionEndSequenceRender_InArgs& setInteractiveRenderStatus(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionEndSequenceRender_InArgs& setCudaEnabled(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionEndSequenceRender_InArgs& setCudaRenderSupported(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionEndSequenceRender_InArgs& setCudaStream(void* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionEndSequenceRender_InArgs& setCudaStreamSupported(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionEndSequenceRender_InArgs& setMetalCommandQueue(void* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionEndSequenceRender_InArgs& setMetalEnabled(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionEndSequenceRender_InArgs& setMetalRenderSupported(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionEndSequenceRender_InArgs& setOpenCLCommandQueue(void* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionEndSequenceRender_InArgs& setOpenCLEnabled(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionEndSequenceRender_InArgs& setOpenCLImage(void* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionEndSequenceRender_InArgs& setOpenCLRenderSupported(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionEndSequenceRender_InArgs& setOpenCLSupported(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionEndSequenceRender_InArgs& setOpenGLEnabled(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionEndSequenceRender_InArgs& setOpenGLTextureIndex(int value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionEndSequenceRender_InArgs& setOpenGLTextureTarget(int value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + +}; + +// Property set accessor for: ImageEffectActionGetClipPreferences_OutArgs +class ImageEffectActionGetClipPreferences_OutArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + double frameRate(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* fieldOrder(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* preMultiplication(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool continuousSamples(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool imageEffectFrameVarying(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + +}; + +// Property set accessor for: ImageEffectActionGetFramesNeeded_InArgs +class ImageEffectActionGetFramesNeeded_InArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + ImageEffectActionGetFramesNeeded_InArgs& setTime(double value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + +}; + +// Property set accessor for: ImageEffectActionGetFramesNeeded_OutArgs +class ImageEffectActionGetFramesNeeded_OutArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + std::array frameRange() const { + return props_.getAll(); + } + +}; + +// Property set accessor for: ImageEffectActionGetOutputColourspace_InArgs +class ImageEffectActionGetOutputColourspace_InArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + ImageEffectActionGetOutputColourspace_InArgs& setPreferredColourspaces(const char* value, int index = 0, bool error_if_missing = true) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + ImageEffectActionGetOutputColourspace_InArgs& setPreferredColourspaces(const Container& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + ImageEffectActionGetOutputColourspace_InArgs& setPreferredColourspaces(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + +}; + +// Property set accessor for: ImageEffectActionGetOutputColourspace_OutArgs +class ImageEffectActionGetOutputColourspace_OutArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + const char* colourspace(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + +}; + +// Property set accessor for: ImageEffectActionGetRegionOfDefinition_InArgs +class ImageEffectActionGetRegionOfDefinition_InArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + ImageEffectActionGetRegionOfDefinition_InArgs& setTime(double value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionGetRegionOfDefinition_InArgs& setRenderScale(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ImageEffectActionGetRegionOfDefinition_InArgs& setRenderScale(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + +}; + +// Property set accessor for: ImageEffectActionGetRegionOfDefinition_OutArgs +class ImageEffectActionGetRegionOfDefinition_OutArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + std::array regionOfDefinition() const { + return props_.getAll(); + } + +}; + +// Property set accessor for: ImageEffectActionGetRegionsOfInterest_InArgs +class ImageEffectActionGetRegionsOfInterest_InArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + ImageEffectActionGetRegionsOfInterest_InArgs& setTime(double value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionGetRegionsOfInterest_InArgs& setRenderScale(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ImageEffectActionGetRegionsOfInterest_InArgs& setRenderScale(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ImageEffectActionGetRegionsOfInterest_InArgs& setRegionOfInterest(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ImageEffectActionGetRegionsOfInterest_InArgs& setRegionOfInterest(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + +}; + +// Property set accessor for: ImageEffectActionGetTimeDomain_OutArgs +class ImageEffectActionGetTimeDomain_OutArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + std::array frameRange() const { + return props_.getAll(); + } + +}; + +// Property set accessor for: ImageEffectActionIsIdentity_InArgs +class ImageEffectActionIsIdentity_InArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + ImageEffectActionIsIdentity_InArgs& setTime(double value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionIsIdentity_InArgs& setFieldToRender(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionIsIdentity_InArgs& setRenderWindow(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ImageEffectActionIsIdentity_InArgs& setRenderWindow(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ImageEffectActionIsIdentity_InArgs& setRenderScale(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ImageEffectActionIsIdentity_InArgs& setRenderScale(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + +}; + +// Property set accessor for: ImageEffectActionRender_InArgs +class ImageEffectActionRender_InArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + ImageEffectActionRender_InArgs& setTime(double value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionRender_InArgs& setSequentialRenderStatus(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionRender_InArgs& setInteractiveRenderStatus(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionRender_InArgs& setRenderQualityDraft(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionRender_InArgs& setCudaEnabled(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionRender_InArgs& setCudaRenderSupported(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionRender_InArgs& setCudaStream(void* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionRender_InArgs& setCudaStreamSupported(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionRender_InArgs& setMetalCommandQueue(void* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionRender_InArgs& setMetalEnabled(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionRender_InArgs& setMetalRenderSupported(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionRender_InArgs& setOpenCLCommandQueue(void* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionRender_InArgs& setOpenCLEnabled(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionRender_InArgs& setOpenCLImage(void* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionRender_InArgs& setOpenCLRenderSupported(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionRender_InArgs& setOpenCLSupported(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionRender_InArgs& setOpenGLEnabled(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionRender_InArgs& setOpenGLTextureIndex(int value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionRender_InArgs& setOpenGLTextureTarget(int value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectActionRender_InArgs& setNoSpatialAwareness(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + +}; + +// Property set accessor for: ImageEffectHost +class ImageEffectHost : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + ImageEffectHost& setAPIVersion(int value, int index = 0, bool error_if_missing = true) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + ImageEffectHost& setAPIVersion(const Container& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + ImageEffectHost& setAPIVersion(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ImageEffectHost& setType(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectHost& setName(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectHost& setLabel(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectHost& setVersion(int value, int index = 0, bool error_if_missing = true) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + ImageEffectHost& setVersion(const Container& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + ImageEffectHost& setVersion(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ImageEffectHost& setVersionLabel(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectHost& setImageEffectHostPropIsBackground(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectHost& setSupportsOverlays(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectHost& setSupportsMultiResolution(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectHost& setSupportsTiles(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectHost& setTemporalClipAccess(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectHost& setSupportedComponents(const char* value, int index = 0, bool error_if_missing = true) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + ImageEffectHost& setSupportedComponents(const Container& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + ImageEffectHost& setSupportedComponents(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ImageEffectHost& setSupportedContexts(const char* value, int index = 0, bool error_if_missing = true) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + ImageEffectHost& setSupportedContexts(const Container& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + ImageEffectHost& setSupportedContexts(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ImageEffectHost& setMultipleClipDepths(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectHost& setOpenCLSupported(const char* value, bool error_if_missing = false) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectHost& setSupportsMultipleClipPARs(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectHost& setSetableFrameRate(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectHost& setSetableFielding(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectHost& setParamHostPropSupportsCustomInteract(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectHost& setParamHostPropSupportsStringAnimation(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectHost& setParamHostPropSupportsChoiceAnimation(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectHost& setParamHostPropSupportsBooleanAnimation(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectHost& setParamHostPropSupportsCustomAnimation(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectHost& setParamHostPropSupportsStrChoice(bool value, bool error_if_missing = false) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectHost& setParamHostPropSupportsStrChoiceAnimation(bool value, bool error_if_missing = false) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectHost& setParamHostPropMaxParameters(int value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectHost& setParamHostPropMaxPages(int value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectHost& setParamHostPropPageRowColumnCount(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + ImageEffectHost& setParamHostPropPageRowColumnCount(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + ImageEffectHost& setHostOSHandle(void* value, bool error_if_missing = false) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectHost& setParamHostPropSupportsParametricAnimation(bool value, bool error_if_missing = false) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectHost& setImageEffectInstancePropSequentialRender(bool value, bool error_if_missing = false) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectHost& setOpenGLRenderSupported(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectHost& setRenderQualityDraft(bool value, bool error_if_missing = false) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectHost& setImageEffectHostPropNativeOrigin(const char* value, bool error_if_missing = false) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ImageEffectHost& setColourManagementAvailableConfigs(const char* value, int index = 0, bool error_if_missing = false) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + ImageEffectHost& setColourManagementAvailableConfigs(const Container& values, bool error_if_missing = false) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + ImageEffectHost& setColourManagementAvailableConfigs(std::initializer_list values, bool error_if_missing = false) { + props_.setAll(values, error_if_missing); + return *this; + } + + ImageEffectHost& setColourManagementStyle(const char* value, bool error_if_missing = false) { + props_.set(value, 0, error_if_missing); + return *this; + } + +}; + +// Property set accessor for: InteractActionDraw_InArgs +class InteractActionDraw_InArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + InteractActionDraw_InArgs& setEffectInstance(void* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + InteractActionDraw_InArgs& setInteractPropDrawContext(void* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + InteractActionDraw_InArgs& setInteractPropPixelScale(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + InteractActionDraw_InArgs& setInteractPropPixelScale(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + InteractActionDraw_InArgs& setInteractPropBackgroundColour(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + InteractActionDraw_InArgs& setInteractPropBackgroundColour(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + InteractActionDraw_InArgs& setTime(double value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + InteractActionDraw_InArgs& setRenderScale(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + InteractActionDraw_InArgs& setRenderScale(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + +}; + +// Property set accessor for: InteractActionGainFocus_InArgs +class InteractActionGainFocus_InArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + InteractActionGainFocus_InArgs& setEffectInstance(void* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + InteractActionGainFocus_InArgs& setInteractPropPixelScale(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + InteractActionGainFocus_InArgs& setInteractPropPixelScale(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + InteractActionGainFocus_InArgs& setInteractPropBackgroundColour(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + InteractActionGainFocus_InArgs& setInteractPropBackgroundColour(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + InteractActionGainFocus_InArgs& setTime(double value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + InteractActionGainFocus_InArgs& setRenderScale(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + InteractActionGainFocus_InArgs& setRenderScale(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + +}; + +// Property set accessor for: InteractActionKeyDown_InArgs +class InteractActionKeyDown_InArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + InteractActionKeyDown_InArgs& setEffectInstance(void* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + InteractActionKeyDown_InArgs& setKeySym(int value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + InteractActionKeyDown_InArgs& setKeyString(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + InteractActionKeyDown_InArgs& setTime(double value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + InteractActionKeyDown_InArgs& setRenderScale(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + InteractActionKeyDown_InArgs& setRenderScale(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + +}; + +// Property set accessor for: InteractActionKeyRepeat_InArgs +class InteractActionKeyRepeat_InArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + InteractActionKeyRepeat_InArgs& setEffectInstance(void* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + InteractActionKeyRepeat_InArgs& setKeySym(int value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + InteractActionKeyRepeat_InArgs& setKeyString(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + InteractActionKeyRepeat_InArgs& setTime(double value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + InteractActionKeyRepeat_InArgs& setRenderScale(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + InteractActionKeyRepeat_InArgs& setRenderScale(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + +}; + +// Property set accessor for: InteractActionKeyUp_InArgs +class InteractActionKeyUp_InArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + InteractActionKeyUp_InArgs& setEffectInstance(void* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + InteractActionKeyUp_InArgs& setKeySym(int value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + InteractActionKeyUp_InArgs& setKeyString(const char* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + InteractActionKeyUp_InArgs& setTime(double value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + InteractActionKeyUp_InArgs& setRenderScale(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + InteractActionKeyUp_InArgs& setRenderScale(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + +}; + +// Property set accessor for: InteractActionLoseFocus_InArgs +class InteractActionLoseFocus_InArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + InteractActionLoseFocus_InArgs& setEffectInstance(void* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + InteractActionLoseFocus_InArgs& setInteractPropPixelScale(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + InteractActionLoseFocus_InArgs& setInteractPropPixelScale(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + InteractActionLoseFocus_InArgs& setInteractPropBackgroundColour(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + InteractActionLoseFocus_InArgs& setInteractPropBackgroundColour(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + InteractActionLoseFocus_InArgs& setTime(double value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + InteractActionLoseFocus_InArgs& setRenderScale(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + InteractActionLoseFocus_InArgs& setRenderScale(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + +}; + +// Property set accessor for: InteractActionPenDown_InArgs +class InteractActionPenDown_InArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + InteractActionPenDown_InArgs& setEffectInstance(void* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + InteractActionPenDown_InArgs& setInteractPropPixelScale(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + InteractActionPenDown_InArgs& setInteractPropPixelScale(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + InteractActionPenDown_InArgs& setInteractPropBackgroundColour(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + InteractActionPenDown_InArgs& setInteractPropBackgroundColour(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + InteractActionPenDown_InArgs& setTime(double value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + InteractActionPenDown_InArgs& setRenderScale(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + InteractActionPenDown_InArgs& setRenderScale(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + InteractActionPenDown_InArgs& setInteractPropPenPosition(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + InteractActionPenDown_InArgs& setInteractPropPenPosition(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + InteractActionPenDown_InArgs& setInteractPropPenViewportPosition(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + InteractActionPenDown_InArgs& setInteractPropPenViewportPosition(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + InteractActionPenDown_InArgs& setInteractPropPenPressure(double value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + +}; + +// Property set accessor for: InteractActionPenMotion_InArgs +class InteractActionPenMotion_InArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + InteractActionPenMotion_InArgs& setEffectInstance(void* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + InteractActionPenMotion_InArgs& setInteractPropPixelScale(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + InteractActionPenMotion_InArgs& setInteractPropPixelScale(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + InteractActionPenMotion_InArgs& setInteractPropBackgroundColour(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + InteractActionPenMotion_InArgs& setInteractPropBackgroundColour(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + InteractActionPenMotion_InArgs& setTime(double value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + InteractActionPenMotion_InArgs& setRenderScale(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + InteractActionPenMotion_InArgs& setRenderScale(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + InteractActionPenMotion_InArgs& setInteractPropPenPosition(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + InteractActionPenMotion_InArgs& setInteractPropPenPosition(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + InteractActionPenMotion_InArgs& setInteractPropPenViewportPosition(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + InteractActionPenMotion_InArgs& setInteractPropPenViewportPosition(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + InteractActionPenMotion_InArgs& setInteractPropPenPressure(double value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + +}; + +// Property set accessor for: InteractActionPenUp_InArgs +class InteractActionPenUp_InArgs : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + InteractActionPenUp_InArgs& setEffectInstance(void* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + InteractActionPenUp_InArgs& setInteractPropPixelScale(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + InteractActionPenUp_InArgs& setInteractPropPixelScale(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + InteractActionPenUp_InArgs& setInteractPropBackgroundColour(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + InteractActionPenUp_InArgs& setInteractPropBackgroundColour(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + InteractActionPenUp_InArgs& setTime(double value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + InteractActionPenUp_InArgs& setRenderScale(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + InteractActionPenUp_InArgs& setRenderScale(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + InteractActionPenUp_InArgs& setInteractPropPenPosition(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + InteractActionPenUp_InArgs& setInteractPropPenPosition(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + InteractActionPenUp_InArgs& setInteractPropPenViewportPosition(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + InteractActionPenUp_InArgs& setInteractPropPenViewportPosition(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + InteractActionPenUp_InArgs& setInteractPropPenPressure(double value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + +}; + +// Property set accessor for: InteractDescriptor +class InteractDescriptor : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + InteractDescriptor& setInteractPropHasAlpha(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + InteractDescriptor& setInteractPropBitDepth(int value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + +}; + +// Property set accessor for: InteractInstance +class InteractInstance : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + InteractInstance& setEffectInstance(void* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + InteractInstance& setInstanceData(void* value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + InteractInstance& setInteractPropPixelScale(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + InteractInstance& setInteractPropPixelScale(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + InteractInstance& setInteractPropBackgroundColour(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + InteractInstance& setInteractPropBackgroundColour(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + InteractInstance& setInteractPropHasAlpha(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + InteractInstance& setInteractPropBitDepth(int value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + InteractInstance& setInteractPropSlaveToParam(const char* value, int index = 0, bool error_if_missing = true) { + props_.set(value, index, error_if_missing); + return *this; + } + + // Set all values from a container (vector, array, span, etc.) + // SFINAE: only enabled for container types (not scalars) + template && !std::is_pointer_v>> + InteractInstance& setInteractPropSlaveToParam(const Container& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2, 3}) + InteractInstance& setInteractPropSlaveToParam(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + InteractInstance& setInteractPropSuggestedColour(const std::array& values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + + // Set all values from an initializer list (e.g., {1, 2}) + InteractInstance& setInteractPropSuggestedColour(std::initializer_list values, bool error_if_missing = true) { + props_.setAll(values, error_if_missing); + return *this; + } + +}; + +// Property set accessor for: ParamDouble1D +class ParamDouble1D : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + bool showTimeMarker(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* doubleType(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* type(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* name(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* label(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* shortLabel(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* longLabel(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool secret(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* hint(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* scriptName(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* parent(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool enabled(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + void* dataPtr(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array icon() const { + return props_.getAll(); + } + + void* interactV1(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array interactSize() const { + return props_.getAll(); + } + + double interactSizeAspect(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array interactMinimumSize() const { + return props_.getAll(); + } + + std::array interactPreferedSize() const { + return props_.getAll(); + } + + bool hasHostOverlayHandle(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool useHostOverlayHandle(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + // Multi-type property (supports: int, double, string, pointer) + template + T default(int index = 0, bool error_if_missing = true) const { + return props_.get(index, error_if_missing); + } + + template + std::vector defaultAll() const { + return props_.getAll(); + } + + bool animates(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + ParamDouble1D& setIsAnimating(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamDouble1D& setIsAutoKeying(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + bool persistant(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool evaluateOnChange(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool pluginMayWrite(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* cacheInvalidation(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool canUndo(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + // Multi-type property (supports: int, double) + template + T min(int index = 0, bool error_if_missing = true) const { + return props_.get(index, error_if_missing); + } + + template + std::vector minAll() const { + return props_.getAll(); + } + + // Multi-type property (supports: int, double) + template + T max(int index = 0, bool error_if_missing = true) const { + return props_.get(index, error_if_missing); + } + + template + std::vector maxAll() const { + return props_.getAll(); + } + + // Multi-type property (supports: int, double) + template + T displayMin(int index = 0, bool error_if_missing = true) const { + return props_.get(index, error_if_missing); + } + + template + std::vector displayMinAll() const { + return props_.getAll(); + } + + // Multi-type property (supports: int, double) + template + T displayMax(int index = 0, bool error_if_missing = true) const { + return props_.get(index, error_if_missing); + } + + template + std::vector displayMaxAll() const { + return props_.getAll(); + } + + double increment(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + int digits(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + +}; + +// Property set accessor for: ParameterSet +class ParameterSet : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + bool paramSetNeedsSyncing(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* paramPageOrder(int index = 0, bool error_if_missing = true) const { + return props_.get(index, error_if_missing); + } + +}; + +// Property set accessor for: ParamsByte +class ParamsByte : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + const char* type(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* name(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* label(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* shortLabel(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* longLabel(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool secret(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* hint(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* scriptName(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* parent(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool enabled(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + void* dataPtr(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array icon() const { + return props_.getAll(); + } + + void* interactV1(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array interactSize() const { + return props_.getAll(); + } + + double interactSizeAspect(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array interactMinimumSize() const { + return props_.getAll(); + } + + std::array interactPreferedSize() const { + return props_.getAll(); + } + + bool hasHostOverlayHandle(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool useHostOverlayHandle(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + // Multi-type property (supports: int, double, string, pointer) + template + T default(int index = 0, bool error_if_missing = true) const { + return props_.get(index, error_if_missing); + } + + template + std::vector defaultAll() const { + return props_.getAll(); + } + + bool animates(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + ParamsByte& setIsAnimating(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsByte& setIsAutoKeying(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + bool persistant(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool evaluateOnChange(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool pluginMayWrite(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* cacheInvalidation(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool canUndo(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + // Multi-type property (supports: int, double) + template + T min(int index = 0, bool error_if_missing = true) const { + return props_.get(index, error_if_missing); + } + + template + std::vector minAll() const { + return props_.getAll(); + } + + // Multi-type property (supports: int, double) + template + T max(int index = 0, bool error_if_missing = true) const { + return props_.get(index, error_if_missing); + } + + template + std::vector maxAll() const { + return props_.getAll(); + } + + // Multi-type property (supports: int, double) + template + T displayMin(int index = 0, bool error_if_missing = true) const { + return props_.get(index, error_if_missing); + } + + template + std::vector displayMinAll() const { + return props_.getAll(); + } + + // Multi-type property (supports: int, double) + template + T displayMax(int index = 0, bool error_if_missing = true) const { + return props_.get(index, error_if_missing); + } + + template + std::vector displayMaxAll() const { + return props_.getAll(); + } + +}; + +// Property set accessor for: ParamsChoice +class ParamsChoice : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + const char* choiceOption(int index = 0, bool error_if_missing = true) const { + return props_.get(index, error_if_missing); + } + + int choiceOrder(int index = 0, bool error_if_missing = true) const { + return props_.get(index, error_if_missing); + } + + const char* type(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* name(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* label(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* shortLabel(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* longLabel(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool secret(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* hint(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* scriptName(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* parent(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool enabled(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + void* dataPtr(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array icon() const { + return props_.getAll(); + } + + void* interactV1(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array interactSize() const { + return props_.getAll(); + } + + double interactSizeAspect(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array interactMinimumSize() const { + return props_.getAll(); + } + + std::array interactPreferedSize() const { + return props_.getAll(); + } + + bool hasHostOverlayHandle(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool useHostOverlayHandle(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + // Multi-type property (supports: int, double, string, pointer) + template + T default(int index = 0, bool error_if_missing = true) const { + return props_.get(index, error_if_missing); + } + + template + std::vector defaultAll() const { + return props_.getAll(); + } + + bool animates(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + ParamsChoice& setIsAnimating(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsChoice& setIsAutoKeying(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + bool persistant(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool evaluateOnChange(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool pluginMayWrite(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* cacheInvalidation(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool canUndo(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + +}; + +// Property set accessor for: ParamsCustom +class ParamsCustom : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + void* customCallbackV1(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* type(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* name(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* label(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* shortLabel(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* longLabel(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool secret(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* hint(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* scriptName(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* parent(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool enabled(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + void* dataPtr(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array icon() const { + return props_.getAll(); + } + + void* interactV1(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array interactSize() const { + return props_.getAll(); + } + + double interactSizeAspect(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array interactMinimumSize() const { + return props_.getAll(); + } + + std::array interactPreferedSize() const { + return props_.getAll(); + } + + bool hasHostOverlayHandle(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool useHostOverlayHandle(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + // Multi-type property (supports: int, double, string, pointer) + template + T default(int index = 0, bool error_if_missing = true) const { + return props_.get(index, error_if_missing); + } + + template + std::vector defaultAll() const { + return props_.getAll(); + } + + bool animates(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + ParamsCustom& setIsAnimating(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsCustom& setIsAutoKeying(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + bool persistant(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool evaluateOnChange(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool pluginMayWrite(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* cacheInvalidation(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool canUndo(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + +}; + +// Property set accessor for: ParamsDouble2D3D +class ParamsDouble2D3D : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + const char* doubleType(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* type(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* name(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* label(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* shortLabel(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* longLabel(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool secret(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* hint(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* scriptName(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* parent(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool enabled(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + void* dataPtr(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array icon() const { + return props_.getAll(); + } + + void* interactV1(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array interactSize() const { + return props_.getAll(); + } + + double interactSizeAspect(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array interactMinimumSize() const { + return props_.getAll(); + } + + std::array interactPreferedSize() const { + return props_.getAll(); + } + + bool hasHostOverlayHandle(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool useHostOverlayHandle(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + // Multi-type property (supports: int, double, string, pointer) + template + T default(int index = 0, bool error_if_missing = true) const { + return props_.get(index, error_if_missing); + } + + template + std::vector defaultAll() const { + return props_.getAll(); + } + + bool animates(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + ParamsDouble2D3D& setIsAnimating(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsDouble2D3D& setIsAutoKeying(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + bool persistant(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool evaluateOnChange(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool pluginMayWrite(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* cacheInvalidation(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool canUndo(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + // Multi-type property (supports: int, double) + template + T min(int index = 0, bool error_if_missing = true) const { + return props_.get(index, error_if_missing); + } + + template + std::vector minAll() const { + return props_.getAll(); + } + + // Multi-type property (supports: int, double) + template + T max(int index = 0, bool error_if_missing = true) const { + return props_.get(index, error_if_missing); + } + + template + std::vector maxAll() const { + return props_.getAll(); + } + + // Multi-type property (supports: int, double) + template + T displayMin(int index = 0, bool error_if_missing = true) const { + return props_.get(index, error_if_missing); + } + + template + std::vector displayMinAll() const { + return props_.getAll(); + } + + // Multi-type property (supports: int, double) + template + T displayMax(int index = 0, bool error_if_missing = true) const { + return props_.get(index, error_if_missing); + } + + template + std::vector displayMaxAll() const { + return props_.getAll(); + } + + double increment(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + int digits(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + +}; + +// Property set accessor for: ParamsGroup +class ParamsGroup : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + bool groupOpen(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* type(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* name(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* label(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* shortLabel(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* longLabel(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool secret(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* hint(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* scriptName(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* parent(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool enabled(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + void* dataPtr(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array icon() const { + return props_.getAll(); + } + +}; + +// Property set accessor for: ParamsInt2D3D +class ParamsInt2D3D : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + const char* dimensionLabel(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* type(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* name(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* label(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* shortLabel(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* longLabel(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool secret(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* hint(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* scriptName(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* parent(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool enabled(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + void* dataPtr(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array icon() const { + return props_.getAll(); + } + + void* interactV1(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array interactSize() const { + return props_.getAll(); + } + + double interactSizeAspect(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array interactMinimumSize() const { + return props_.getAll(); + } + + std::array interactPreferedSize() const { + return props_.getAll(); + } + + bool hasHostOverlayHandle(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool useHostOverlayHandle(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + // Multi-type property (supports: int, double, string, pointer) + template + T default(int index = 0, bool error_if_missing = true) const { + return props_.get(index, error_if_missing); + } + + template + std::vector defaultAll() const { + return props_.getAll(); + } + + bool animates(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + ParamsInt2D3D& setIsAnimating(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsInt2D3D& setIsAutoKeying(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + bool persistant(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool evaluateOnChange(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool pluginMayWrite(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* cacheInvalidation(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool canUndo(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + // Multi-type property (supports: int, double) + template + T min(int index = 0, bool error_if_missing = true) const { + return props_.get(index, error_if_missing); + } + + template + std::vector minAll() const { + return props_.getAll(); + } + + // Multi-type property (supports: int, double) + template + T max(int index = 0, bool error_if_missing = true) const { + return props_.get(index, error_if_missing); + } + + template + std::vector maxAll() const { + return props_.getAll(); + } + + // Multi-type property (supports: int, double) + template + T displayMin(int index = 0, bool error_if_missing = true) const { + return props_.get(index, error_if_missing); + } + + template + std::vector displayMinAll() const { + return props_.getAll(); + } + + // Multi-type property (supports: int, double) + template + T displayMax(int index = 0, bool error_if_missing = true) const { + return props_.get(index, error_if_missing); + } + + template + std::vector displayMaxAll() const { + return props_.getAll(); + } + +}; + +// Property set accessor for: ParamsNormalizedSpatial +class ParamsNormalizedSpatial : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + const char* defaultCoordinateSystem(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* type(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* name(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* label(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* shortLabel(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* longLabel(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool secret(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* hint(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* scriptName(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* parent(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool enabled(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + void* dataPtr(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array icon() const { + return props_.getAll(); + } + + void* interactV1(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array interactSize() const { + return props_.getAll(); + } + + double interactSizeAspect(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array interactMinimumSize() const { + return props_.getAll(); + } + + std::array interactPreferedSize() const { + return props_.getAll(); + } + + bool hasHostOverlayHandle(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool useHostOverlayHandle(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + // Multi-type property (supports: int, double, string, pointer) + template + T default(int index = 0, bool error_if_missing = true) const { + return props_.get(index, error_if_missing); + } + + template + std::vector defaultAll() const { + return props_.getAll(); + } + + bool animates(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + ParamsNormalizedSpatial& setIsAnimating(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsNormalizedSpatial& setIsAutoKeying(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + bool persistant(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool evaluateOnChange(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool pluginMayWrite(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* cacheInvalidation(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool canUndo(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + // Multi-type property (supports: int, double) + template + T min(int index = 0, bool error_if_missing = true) const { + return props_.get(index, error_if_missing); + } + + template + std::vector minAll() const { + return props_.getAll(); + } + + // Multi-type property (supports: int, double) + template + T max(int index = 0, bool error_if_missing = true) const { + return props_.get(index, error_if_missing); + } + + template + std::vector maxAll() const { + return props_.getAll(); + } + + // Multi-type property (supports: int, double) + template + T displayMin(int index = 0, bool error_if_missing = true) const { + return props_.get(index, error_if_missing); + } + + template + std::vector displayMinAll() const { + return props_.getAll(); + } + + // Multi-type property (supports: int, double) + template + T displayMax(int index = 0, bool error_if_missing = true) const { + return props_.get(index, error_if_missing); + } + + template + std::vector displayMaxAll() const { + return props_.getAll(); + } + + double increment(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + int digits(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + +}; + +// Property set accessor for: ParamsPage +class ParamsPage : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + const char* pageChild(int index = 0, bool error_if_missing = true) const { + return props_.get(index, error_if_missing); + } + + const char* type(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* name(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* label(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* shortLabel(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* longLabel(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool secret(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* hint(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* scriptName(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* parent(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool enabled(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + void* dataPtr(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array icon() const { + return props_.getAll(); + } + +}; + +// Property set accessor for: ParamsParametric +class ParamsParametric : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + bool animates(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool isAnimating(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool isAutoKeying(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool persistant(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool evaluateOnChange(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool pluginMayWrite(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* cacheInvalidation(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool canUndo(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + int parametricDimension(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + double parametricUIColour(int index = 0, bool error_if_missing = true) const { + return props_.get(index, error_if_missing); + } + + void* parametricInteractBackground(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array parametricRange() const { + return props_.getAll(); + } + + const char* type(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* name(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* label(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* shortLabel(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* longLabel(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool secret(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* hint(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* scriptName(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* parent(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool enabled(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + void* dataPtr(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array icon() const { + return props_.getAll(); + } + + void* interactV1(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array interactSize() const { + return props_.getAll(); + } + + double interactSizeAspect(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array interactMinimumSize() const { + return props_.getAll(); + } + + std::array interactPreferedSize() const { + return props_.getAll(); + } + + bool hasHostOverlayHandle(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool useHostOverlayHandle(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + // Multi-type property (supports: int, double, string, pointer) + template + T default(int index = 0, bool error_if_missing = true) const { + return props_.get(index, error_if_missing); + } + + template + std::vector defaultAll() const { + return props_.getAll(); + } + +}; + +// Property set accessor for: ParamsStrChoice +class ParamsStrChoice : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + const char* choiceOption(int index = 0, bool error_if_missing = true) const { + return props_.get(index, error_if_missing); + } + + bool choiceEnum(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* type(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* name(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* label(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* shortLabel(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* longLabel(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool secret(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* hint(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* scriptName(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* parent(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool enabled(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + void* dataPtr(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array icon() const { + return props_.getAll(); + } + + void* interactV1(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array interactSize() const { + return props_.getAll(); + } + + double interactSizeAspect(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array interactMinimumSize() const { + return props_.getAll(); + } + + std::array interactPreferedSize() const { + return props_.getAll(); + } + + bool hasHostOverlayHandle(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool useHostOverlayHandle(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + // Multi-type property (supports: int, double, string, pointer) + template + T default(int index = 0, bool error_if_missing = true) const { + return props_.get(index, error_if_missing); + } + + template + std::vector defaultAll() const { + return props_.getAll(); + } + + bool animates(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + ParamsStrChoice& setIsAnimating(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsStrChoice& setIsAutoKeying(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + bool persistant(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool evaluateOnChange(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool pluginMayWrite(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* cacheInvalidation(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool canUndo(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + +}; + +// Property set accessor for: ParamsString +class ParamsString : public PropertySetAccessor { +public: + using PropertySetAccessor::PropertySetAccessor; + + const char* stringMode(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool stringFilePathExists(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* type(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* name(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* label(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* shortLabel(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* longLabel(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool secret(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* hint(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* scriptName(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* parent(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool enabled(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + void* dataPtr(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array icon() const { + return props_.getAll(); + } + + void* interactV1(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array interactSize() const { + return props_.getAll(); + } + + double interactSizeAspect(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + std::array interactMinimumSize() const { + return props_.getAll(); + } + + std::array interactPreferedSize() const { + return props_.getAll(); + } + + bool hasHostOverlayHandle(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool useHostOverlayHandle(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + // Multi-type property (supports: int, double, string, pointer) + template + T default(int index = 0, bool error_if_missing = true) const { + return props_.get(index, error_if_missing); + } + + template + std::vector defaultAll() const { + return props_.getAll(); + } + + bool animates(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + ParamsString& setIsAnimating(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + ParamsString& setIsAutoKeying(bool value, bool error_if_missing = true) { + props_.set(value, 0, error_if_missing); + return *this; + } + + bool persistant(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool evaluateOnChange(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool pluginMayWrite(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + const char* cacheInvalidation(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + bool canUndo(bool error_if_missing = true) const { + return props_.get(0, error_if_missing); + } + + // Multi-type property (supports: int, double) + template + T min(int index = 0, bool error_if_missing = true) const { + return props_.get(index, error_if_missing); + } + + template + std::vector minAll() const { + return props_.getAll(); + } + + // Multi-type property (supports: int, double) + template + T max(int index = 0, bool error_if_missing = true) const { + return props_.get(index, error_if_missing); + } + + template + std::vector maxAll() const { + return props_.getAll(); + } + + // Multi-type property (supports: int, double) + template + T displayMin(int index = 0, bool error_if_missing = true) const { + return props_.get(index, error_if_missing); + } + + template + std::vector displayMinAll() const { + return props_.getAll(); + } + + // Multi-type property (supports: int, double) + template + T displayMax(int index = 0, bool error_if_missing = true) const { + return props_.get(index, error_if_missing); + } + + template + std::vector displayMaxAll() const { + return props_.getAll(); + } + +}; + +} // namespace openfx diff --git a/openfx-cpp/include/openfx/ofxPropsAccess.h b/openfx-cpp/include/openfx/ofxPropsAccess.h new file mode 100644 index 000000000..923626237 --- /dev/null +++ b/openfx-cpp/include/openfx/ofxPropsAccess.h @@ -0,0 +1,849 @@ +// Copyright OpenFX and contributors to the OpenFX project. +// SPDX-License-Identifier: BSD-3-Clause + +#pragma once + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "ofxExceptions.h" +#include "ofxLog.h" +#include "ofxPropsMetadata.h" +#include "ofxSuites.h" + +/** + * OpenFX Property Accessor System - Usage Examples + +// Basic property access with type safety +void basicPropertyAccess(OfxPropertySetHandle handle, OfxPropertySuiteV1* +propHost) { + // Create a property accessor + openfx::PropertyAccessor props(handle, propHost); + + // Get a string property - type is deduced from PropTraits + const char* colorspace = props.get(); + + // Get a boolean property - returned as int (0 or 1) + int isConnected = props.get(); + + // Set a property value (type checked at compile time) + props.set(1); + + // Set all of a property's values (type checked at compile time) + // Supports any container with size() and operator[], or initializer-list + props.setAll({1, 0, 0}); + + // Get and set properties by index (for multi-dimensional properties) + const char* fieldMode = props.get(0); + props.set("OfxImageFieldLower", 0); + + // Chaining set operations + props.set(valueA) + .set(valueB) + .set(valueC); + + // Get dimension of a property + int dimension = props.getDimension(); +} + +// Working with multi-type properties +void multiTypePropertyAccess(OfxPropertySetHandle handle, OfxPropertySuiteV1* +propHost) { openfx::PropertyAccessor props(handle, propHost); + + // For multi-type properties, explicitly specify the type + double maxValueDouble = props.get(); + + // You can also get the same property as a different type + int maxValueInt = props.get(); + + // Setting values with explicit types + props.set(10.5); + props.set(10); + + // Attempting to use an incompatible type would cause a compile error: + // const char* str = props.get(); +// Error! +} + + +// Using the "escape hatch" for dynamic property access +void dynamicPropertyAccess(OfxPropertySetHandle handle, OfxPropertySuiteV1* +propHost) { openfx::PropertyAccessor props(handle, propHost); + + // Get and set properties by name without compile-time checking + const char* pluginDefined = props.getRaw("PluginDefinedProperty"); props.setRaw("DynamicIntProperty", 42); + + // Get dimension of a dynamic property + int dim = props.getDimensionRaw("DynamicArrayProperty"); + + // When property names come from external sources + const char* propName = getPropertyNameFromPlugin(); + double value = props.getRaw(propName); +} + +// Working with enum properties +void enumPropertyHandling(OfxPropertySetHandle handle, OfxPropertySuiteV1* +propHost) { openfx::PropertyAccessor props(handle, propHost); + + // Get an enum property value + const char* fieldExtraction = +props.get(); + + // Set an enum property using a valid value + props.set("OfxImageFieldLower"); + + // Access enum values directly using the EnumValue helper + const char* noneField = +openfx::EnumValue::get(0); const char* +lowerField = openfx::EnumValue::get(1); + + // Check if a value is valid for an enum + bool isValid = +openfx::EnumValue::isValid("OfxImageFieldUpper"); + + // Get total number of enum values + size_t enumCount = +openfx::EnumValue::size(); +} + +// End of examples +*/ + +// Status checking private macros + +#define _OPENFX_CHECK_THROW(expr, msg) \ + do { \ + auto &&_status = (expr); \ + if (_status != kOfxStatOK) { \ + openfx::Logger::error("{} in {}:{}: {}", ofxStatusToString(_status), __FILE__, __LINE__, \ + msg); \ + throw openfx::PropertyNotFoundException(_status); \ + } \ + } while (0) + +#define _OPENFX_CHECK_WARN(expr, msg) \ + do { \ + auto &&_status = (expr); \ + if (_status != kOfxStatOK) { \ + openfx::Logger::warn("{} in {}:{}: {}", ofxStatusToString(_status), __FILE__, __LINE__, \ + msg); \ + } \ + } while (0) + +#define _OPENFX_CHECK(expr, msg, error_if_fail) \ + do { \ + if (error_if_fail) { \ + _OPENFX_CHECK_THROW(expr, msg); \ + } else { \ + _OPENFX_CHECK_WARN(expr, msg); \ + } \ + } while (0) + +namespace openfx { + +// ============================================================================ +// Host-Extensible Property System Support +// ============================================================================ +// +// This section enables hosts to define their own custom properties in their +// own namespaces while maintaining the same type safety as standard OpenFX +// properties. This is achieved through C++17 auto template parameters and +// argument-dependent lookup (ADL). +// +// How it works: +// 1. Hosts define their own PropId enum in their namespace (e.g., nuke::PropId) +// 2. Hosts define PropTraits specializations in their namespace +// 3. Hosts define a prop_traits_helper function for ADL lookup +// 4. PropertyAccessor uses template to accept any enum type +// 5. PropTraits_t uses ADL to find the correct PropTraits in the right namespace +// +// Example host usage (in host's header file): +// namespace myhost { +// enum class PropId { CustomProperty, ... }; +// namespace properties { +// template struct PropTraits; +// template<> struct PropTraits { ... }; +// } +// // Enable ADL lookup +// template +// properties::PropTraits prop_traits_helper(std::integral_constant); +// } +// +// Plugin usage: +// props.get(); // Standard property +// props.get(); // Host property +// +// ============================================================================ + +// Forward declare the ADL helper for standard OpenFX properties. +// This function is never actually called - it's only used for type deduction via decltype. +// It must be in the same namespace as PropId (openfx) for ADL to work. +template +properties::PropTraits prop_traits_helper(std::integral_constant); + +// PropTraits_t: Type alias that uses ADL to find the correct PropTraits +// for any PropId enum (openfx::PropId or host-defined). +// The decltype+ADL pattern allows each namespace to provide its own prop_traits_helper. +template +using PropTraits_t = decltype(prop_traits_helper(std::integral_constant{})); + +// Type-mapping helper to infer C++ type from PropType +template +struct PropTypeToNative { + using type = void; // Default case, should never be used directly +}; + +// Specializations for each property type +template <> +struct PropTypeToNative { + using type = int; +}; +template <> +struct PropTypeToNative { + using type = double; +}; +template <> +struct PropTypeToNative { + using type = const char *; +}; +template <> +struct PropTypeToNative { + using type = int; +}; +template <> +struct PropTypeToNative { + using type = const char *; +}; +template <> +struct PropTypeToNative { + using type = void *; +}; + +// Helper to access enum property values with strong typing. +// Works with any PropId enum (standard OpenFX or host-defined). +template +struct EnumValue { + using Traits = PropTraits_t; + + static constexpr const char *get(size_t index) { + static_assert(index < Traits::def.enumValues.size(), + "Property enum index out of range"); + return Traits::def.enumValues[index]; + } + + static constexpr size_t size() { + return Traits::def.enumValues.size(); + } + + static constexpr bool isValid(const char *value) { + for (auto val : Traits::def.enumValues) { + if (std::strcmp(val, value) == 0) + return true; + } + return false; + } +}; + +// Type-safe property accessor for any props of a given prop set +class PropertyAccessor { + public: + // Basic constructor + explicit PropertyAccessor(OfxPropertySetHandle propset, const OfxPropertySuiteV1 *prop_suite) + : propset_(propset), propSuite_(prop_suite) { + if (!propSuite_) { + throw SuiteNotFoundException(kOfxStatErrMissingHostFeature, + "PropertyAccessor: missing property suite"); + } + } + + // Constructor taking a prop set and a suites container, for simplicity + explicit PropertyAccessor(OfxPropertySetHandle propset, const SuiteContainer &suites) + : propset_(propset) { + propSuite_ = suites.get(); + if (!propSuite_) { + throw SuiteNotFoundException(kOfxStatErrMissingHostFeature, + "PropertyAccessor: missing property suite"); + } + } + + // Convenience constructors for ImageEffect -- get effect property set & construct accessor + explicit PropertyAccessor(OfxImageEffectHandle effect, const OfxImageEffectSuiteV1 *effects_suite, + const OfxPropertySuiteV1 *prop_suite) + : propset_(nullptr), propSuite_(prop_suite) { + if (!propSuite_) { + throw SuiteNotFoundException(kOfxStatErrMissingHostFeature, + "PropertyAccessor: missing property suite"); + } + if (!effects_suite) { + throw SuiteNotFoundException(kOfxStatErrMissingHostFeature, + "PropertyAccessor: missing effects suite"); + } + effects_suite->getPropertySet(effect, &propset_); + assert(propset_); + } + + explicit PropertyAccessor(OfxImageEffectHandle effect, const SuiteContainer &suites) + : propset_(nullptr) { + propSuite_ = suites.get(); + if (!propSuite_) { + throw SuiteNotFoundException(kOfxStatErrMissingHostFeature, + "PropertyAccessor: missing property suite"); + } + auto effects_suite = suites.get(); + if (!effects_suite) { + throw SuiteNotFoundException(kOfxStatErrMissingHostFeature, + "PropertyAccessor: missing effects suite"); + } + effects_suite->getPropertySet(effect, &propset_); + assert(propset_); + } + + // Convenience constructors for Interact -- get effect property set & construct accessor + explicit PropertyAccessor(OfxInteractHandle interact, const OfxInteractSuiteV1 *interact_suite, + const OfxPropertySuiteV1 *prop_suite) + : propset_(nullptr), propSuite_(prop_suite) { + if (!interact_suite) { + throw SuiteNotFoundException(kOfxStatErrMissingHostFeature, + "PropertyAccessor: missing interact suite"); + } + interact_suite->interactGetPropertySet(interact, &propset_); + assert(propset_); + } + explicit PropertyAccessor(OfxInteractHandle interact, const SuiteContainer &suites) + : propset_(nullptr) { + propSuite_ = suites.get(); + auto interact_suite = suites.get(); + if (!interact_suite) { + throw SuiteNotFoundException(kOfxStatErrMissingHostFeature, + "PropertyAccessor: missing interact suite"); + } + interact_suite->interactGetPropertySet(interact, &propset_); + assert(propset_); + } + + // Get property value using PropId (compile-time type checking). + // Works with any PropId enum (openfx::PropId or host-defined). + template ::is_multitype>> + typename PropTraits_t::type get(int index = 0, bool error_if_missing = true) const { + using Traits = PropTraits_t; + + static_assert(!Traits::is_multitype, + "This property supports multiple types. Use get() instead."); + + using T = typename Traits::type; + + assert(propset_ != nullptr); + if constexpr (std::is_same_v || std::is_same_v) { + int value = 0; + _OPENFX_CHECK(propSuite_->propGetInt(propset_, Traits::def.name, index, &value), + Traits::def.name, error_if_missing); + return value; + } else if constexpr (std::is_same_v || std::is_same_v) { + double value = 0; + _OPENFX_CHECK(propSuite_->propGetDouble(propset_, Traits::def.name, index, &value), + Traits::def.name, error_if_missing); + return value; + } else if constexpr (std::is_same_v) { + char *value = nullptr; + _OPENFX_CHECK(propSuite_->propGetString(propset_, Traits::def.name, index, &value), + Traits::def.name, error_if_missing); + return value; + } else if constexpr (std::is_same_v) { + void *value = nullptr; + _OPENFX_CHECK(propSuite_->propGetPointer(propset_, Traits::def.name, index, &value), + Traits::def.name, error_if_missing); + return value; + } else { + static_assert(always_false::value, "Unsupported property value type"); + } + } + + // Get multi-type property value (requires explicit type). + // Works with any PropId enum (openfx::PropId or host-defined). + template ::is_multitype>> + T get(int index = 0, bool error_if_missing = true) const { + using Traits = PropTraits_t; + + // Check if T is compatible with any of the supported PropTypes + constexpr bool isValidType = [&]() { + for (const auto &type : Traits::def.supportedTypes) { + if constexpr (std::is_same_v || std::is_same_v) { + if (type == PropType::Int || type == PropType::Bool || type == PropType::Enum) + return true; + } else if constexpr (std::is_same_v) { + if (type == PropType::Double) + return true; + } else if constexpr (std::is_same_v) { + if (type == PropType::String || type == PropType::Enum) + return true; + } else if constexpr (std::is_same_v) { + if (type == PropType::Pointer) + return true; + } + } + return false; + }(); + + static_assert(isValidType, "Requested type is not compatible with this property"); + assert(propset_ != nullptr); + + if constexpr (std::is_same_v || std::is_same_v) { + int value = 0; + _OPENFX_CHECK(propSuite_->propGetInt(propset_, Traits::def.name, index, &value), + Traits::def.name, error_if_missing); + return value; + } else if constexpr (std::is_same_v) { + double value = NAN; + _OPENFX_CHECK(propSuite_->propGetDouble(propset_, Traits::def.name, index, &value), + Traits::def.name, error_if_missing); + return value; + } else if constexpr (std::is_same_v) { + char *value = nullptr; + _OPENFX_CHECK(propSuite_->propGetString(propset_, Traits::def.name, index, &value), + Traits::def.name, error_if_missing); + return value; + } else if constexpr (std::is_same_v) { + void *value = nullptr; + _OPENFX_CHECK(propSuite_->propGetPointer(propset_, Traits::def.name, index, &value), + Traits::def.name, error_if_missing); + return value; + } else { + static_assert(always_false::value, "Unsupported property value type"); + } + } + + // Set property value using PropId (compile-time type checking). + // Works with any PropId enum (openfx::PropId or host-defined). + template + PropertyAccessor &set(typename PropTraits_t::type value, int index = 0, + bool error_if_missing = true) { + using Traits = PropTraits_t; + + static_assert(!Traits::is_multitype, + "This property supports multiple types. Use set() instead."); + + if constexpr (Traits::def.supportedTypes[0] == PropType::Enum) { + bool isValidEnumValue = openfx::EnumValue::isValid(value); + assert(isValidEnumValue); + } + assert(propset_ != nullptr); + + using T = typename Traits::type; + + if constexpr (std::is_same_v) { // allow bool -> int + _OPENFX_CHECK(propSuite_->propSetInt(propset_, Traits::def.name, index, value), + Traits::def.name, error_if_missing); + } else if constexpr (std::is_same_v) { + _OPENFX_CHECK(propSuite_->propSetInt(propset_, Traits::def.name, index, value), + Traits::def.name, error_if_missing); + } else if constexpr (std::is_same_v) { // allow float -> double + _OPENFX_CHECK(propSuite_->propSetDouble(propset_, Traits::def.name, index, value), + Traits::def.name, error_if_missing); + } else if constexpr (std::is_same_v) { + _OPENFX_CHECK(propSuite_->propSetDouble(propset_, Traits::def.name, index, value), + Traits::def.name, error_if_missing); + } else if constexpr (std::is_same_v) { + _OPENFX_CHECK(propSuite_->propSetString(propset_, Traits::def.name, index, value), + openfx::format("{}={}", Traits::def.name, value), error_if_missing); + } else if constexpr (std::is_same_v) { + _OPENFX_CHECK(propSuite_->propSetPointer(propset_, Traits::def.name, index, value), + Traits::def.name, error_if_missing); + } else { + static_assert(always_false::value, "Invalid value type when setting property"); + } + return *this; + } + + // Set multi-type property value (requires explicit type). + // Should only be used for multitype props (SFINAE). + // Works with any PropId enum (openfx::PropId or host-defined). + template ::is_multitype>> + PropertyAccessor &set(T value, int index = 0, bool error_if_missing = true) { + using Traits = PropTraits_t; + + // Check if T is compatible with any of the supported PropTypes + constexpr bool isValidType = [&]() { + for (const auto &type : Traits::def.supportedTypes) { + if constexpr (std::is_same_v || std::is_same_v) { + if (type == PropType::Int || type == PropType::Bool) + return true; + } else if constexpr (std::is_same_v || std::is_same_v) { + if (type == PropType::Double) + return true; + } else if constexpr (std::is_same_v) { + if (type == PropType::String) // no Enums here -- there shouldn't be + // any multi-type enums + return true; + } else if constexpr (std::is_same_v) { + if (type == PropType::Pointer) + return true; + } + } + return false; + }(); + + static_assert(isValidType, "Requested type is not compatible with this property"); + assert(propset_ != nullptr); + + if constexpr (std::is_same_v || std::is_same_v) { + _OPENFX_CHECK(propSuite_->propSetInt(propset_, Traits::def.name, index, value), + Traits::def.name, error_if_missing); + } else if constexpr (std::is_same_v || std::is_same_v) { + _OPENFX_CHECK(propSuite_->propSetDouble(propset_, Traits::def.name, index, value), + Traits::def.name, error_if_missing); + } else if constexpr (std::is_same_v) { + _OPENFX_CHECK(propSuite_->propSetString(propset_, Traits::def.name, index, value), + Traits::def.name, error_if_missing); + } else if constexpr (std::is_same_v) { + _OPENFX_CHECK(propSuite_->propSetPointer(propset_, Traits::def.name, index, value), + Traits::def.name, error_if_missing); + } else { + static_assert(always_false::value, "Invalid value type when setting property"); + } + return *this; + } + + // Get all values of a property (for single-type properties). + // Works with any PropId enum (openfx::PropId or host-defined). + template + auto getAll(bool error_if_missing = true) const { + static_assert( + !PropTraits_t::is_multitype, + "This property supports multiple types. Use getAllTyped() instead."); + assert(propset_ != nullptr); + + using ValueType = typename PropTraits_t::type; + + // If dimension is known at compile time, use std::array for stack allocation + if constexpr (PropTraits_t::def.dimension > 0) { + constexpr int dim = PropTraits_t::def.dimension; + std::array values; + + for (int i = 0; i < dim; ++i) { + values[i] = get(i, error_if_missing); + } + + return values; + } else { + // Otherwise use std::vector for dynamic sizing + int dimension = getDimension(); + std::vector values; + values.reserve(dimension); + + for (int i = 0; i < dimension; ++i) { + values.push_back(get(i, error_if_missing)); + } + + return values; + } + } + + // Get all values of a multi-type property - require explicit ElementType. + // Works with any PropId enum (openfx::PropId or host-defined). + template + auto getAllTyped(bool error_if_missing = true) const { + static_assert(PropTraits_t::is_multitype, + "This property does not support multiple types. Use getAll() instead."); + assert(propset_ != nullptr); + + // If dimension is known at compile time, use std::array for stack allocation + if constexpr (PropTraits_t::def.dimension > 0) { + constexpr int dim = PropTraits_t::def.dimension; + std::array values; + + for (int i = 0; i < dim; ++i) { + values[i] = get(i, error_if_missing); + } + + return values; + } else { + // Otherwise use std::vector for dynamic sizing + int dimension = getDimension(); + std::vector values; + values.reserve(dimension); + + for (int i = 0; i < dimension; ++i) { + values.push_back(get(i, error_if_missing)); + } + + return values; + } + } + + // Set all values of a prop + + // For single-type properties with any container. + // Works with any PropId enum (openfx::PropId or host-defined). + template // Container must have size() and operator[] + PropertyAccessor &setAll(const Container &values, bool error_if_missing = true) { + static_assert(!PropTraits_t::is_multitype, + "This property supports multiple types. Use setAll(container) instead."); + assert(propset_ != nullptr); + + for (size_t i = 0; i < values.size(); ++i) { + this->template set(values[i], static_cast(i), error_if_missing); + } + + return *this; + } + + // For single-type properties with initializer lists. + // Works with any PropId enum (openfx::PropId or host-defined). + template + PropertyAccessor &setAll(std::initializer_list::type> values, + bool error_if_missing = true) { + static_assert(!PropTraits_t::is_multitype, + "This property supports multiple types. Use " + "setAllTyped() instead."); + assert(propset_ != nullptr); + + int index = 0; + for (const auto &value : values) { + this->template set(value, index++, error_if_missing); + } + + return *this; + } + + // For 2-d (PointD) single-type properties. + // Works with any PropId enum (openfx::PropId or host-defined). + template ::def.dimension == 2 && + !PropTraits_t::is_multitype && + std::is_same_v::type, double>, + int> = 0> + PropertyAccessor &set(OfxPointD values, bool error_if_missing = true) { + assert(propset_ != nullptr); + this->template set(values.x, 0, error_if_missing); + this->template set(values.y, 1, error_if_missing); + return *this; + } + + // For 2-d (PointI) single-type properties. + // Works with any PropId enum (openfx::PropId or host-defined). + template ::def.dimension == 2 && + !PropTraits_t::is_multitype && + std::is_same_v::type, double>, + int> = 0> + PropertyAccessor &set(OfxPointI values, bool error_if_missing = true) { + assert(propset_ != nullptr); + this->template set(values.x, 0, error_if_missing); + this->template set(values.y, 1, error_if_missing); + return *this; + } + + // For 4-d (RectD) single-type properties. + // Works with any PropId enum (openfx::PropId or host-defined). + template ::def.dimension == 4 && + !PropTraits_t::is_multitype && + std::is_same_v::type, double>, + int> = 0> + PropertyAccessor &set(OfxRectD values, bool error_if_missing = true) { + assert(propset_ != nullptr); + this->template set(values.x1, 0, error_if_missing); + this->template set(values.y1, 1, error_if_missing); + this->template set(values.x2, 2, error_if_missing); + this->template set(values.y2, 3, error_if_missing); + return *this; + } + + // For 4-d (RectI) single-type properties. + // Works with any PropId enum (openfx::PropId or host-defined). + template ::def.dimension == 4 && + !PropTraits_t::is_multitype && + std::is_same_v::type, double>, + int> = 0> + PropertyAccessor &set(OfxRectI values, bool error_if_missing = true) { + assert(propset_ != nullptr); + this->template set(values.x1, 0, error_if_missing); + this->template set(values.y1, 1, error_if_missing); + this->template set(values.x2, 2, error_if_missing); + this->template set(values.y2, 3, error_if_missing); + return *this; + } + + // For multi-type properties - require explicit ElementType. + // Works with any PropId enum (openfx::PropId or host-defined). + template + PropertyAccessor &setAllTyped(const std::initializer_list &values, + bool error_if_missing = true) { + static_assert(PropTraits_t::is_multitype, + "This property does not support multiple types. Use " + "setAll() instead."); + assert(propset_ != nullptr); + + for (size_t i = 0; i < values.size(); ++i) { + this->template set(values[i], static_cast(i), error_if_missing); + } + + return *this; + } + + // Overload for any container with multi-type properties. + // Works with any PropId enum (openfx::PropId or host-defined). + template + PropertyAccessor &setAllTyped(const Container &values, bool error_if_missing = true) { + static_assert(PropTraits_t::is_multitype, + "This property does not support multiple types. Use " + "setAll() instead."); + assert(propset_ != nullptr); + + for (size_t i = 0; i < values.size(); ++i) { + this->template set(values[i], static_cast(i), error_if_missing); + } + + return *this; + } + + // Get dimension of a property. + // Works with any PropId enum (openfx::PropId or host-defined). + template + int getDimension(bool error_if_missing = true) const { + using Traits = PropTraits_t; + assert(propset_ != nullptr); + + // If dimension is known at compile time, we can just return it + if constexpr (Traits::dimension > 0) { + return Traits::dimension; + } else { + // Otherwise query at runtime + int dimension = 0; + _OPENFX_CHECK(propSuite_->propGetDimension(propset_, Traits::def.name, &dimension), + Traits::def.name, error_if_missing); + return dimension; + } + } + + // "Escape hatch" for unchecked property access - get any property by name + // with explicit type + template + T getRaw(const char *name, int index = 0, bool error_if_missing = true) const { + assert(propset_ != nullptr); + if constexpr (std::is_same_v) { + int value = 0; + _OPENFX_CHECK(propSuite_->propGetInt(propset_, name, index, &value), name, error_if_missing); + return value; + } else if constexpr (std::is_same_v) { + double value = NAN; + _OPENFX_CHECK(propSuite_->propGetDouble(propset_, name, index, &value), name, + error_if_missing); + return value; + } else if constexpr (std::is_same_v) { + char *value = nullptr; + _OPENFX_CHECK(propSuite_->propGetString(propset_, name, index, &value), name, + error_if_missing); + return value; + } else if constexpr (std::is_same_v) { + void *value = nullptr; + _OPENFX_CHECK(propSuite_->propGetPointer(propset_, name, index, &value), name, + error_if_missing); + return value; + } else { + static_assert(always_false::value, "Unsupported property type"); + } + } + + // "Escape hatch" for unchecked property access - set any property by name + // with explicit type + template + PropertyAccessor &setRaw(const char *name, T value, int index = 0, bool error_if_missing = true) { + assert(propset_ != nullptr); + if constexpr (std::is_same_v) { + _OPENFX_CHECK(propSuite_->propSetInt(propset_, name, index, value), name, error_if_missing); + } else if constexpr (std::is_same_v) { + _OPENFX_CHECK(propSuite_->propSetDouble(propset_, name, index, value), name, + error_if_missing); + } else if constexpr (std::is_same_v) { + _OPENFX_CHECK(propSuite_->propSetString(propset_, name, index, value), name, + error_if_missing); + } else if constexpr (std::is_same_v) { + _OPENFX_CHECK(propSuite_->propSetPointer(propset_, name, index, value), name, + error_if_missing); + } else { + static_assert(always_false::value, "Unsupported property type for setting"); + } + return *this; + } + + // Get raw dimension of a property + int getDimensionRaw(const char *name, bool error_if_missing = true) const { + assert(propset_ != nullptr); + int dimension = -1; + _OPENFX_CHECK(propSuite_->propGetDimension(propset_, name, &dimension), name, error_if_missing); + return dimension; + } + + // Does the prop exist? Checks for its dimension. + int exists(const char *name) const { + assert(propset_ != nullptr); + int dimension = 0; + OfxStatus status = propSuite_->propGetDimension(propset_, name, &dimension); + return (status == kOfxStatOK); + } + + private: + OfxPropertySetHandle propset_; + const OfxPropertySuiteV1 *propSuite_; + + // Helper for static_assert to fail compilation for unsupported types + template + struct always_false : std::false_type {}; +}; + +// Namespace for property access constants and helpers +namespace prop { +// We'll use the existing defined constants like kOfxImageClipPropColourspace + +// Helper to validate property existence at compile time. +// Works with any PropId enum (openfx::PropId or host-defined). +template +constexpr bool exists() { + return true; // All PropId values are valid by definition +} + +// Helper to check if a property supports a specific C++ type. +// Works with any PropId enum (openfx::PropId or host-defined). +template +constexpr bool supportsType() { + constexpr auto supportedTypes = PropTraits_t::def.supportedTypes; + + for (const auto &type : supportedTypes) { + if constexpr (std::is_same_v) { + if (type == PropType::Int || type == PropType::Bool || type == PropType::Enum) + return true; + } else if constexpr (std::is_same_v) { + if (type == PropType::Double) + return true; + } else if constexpr (std::is_same_v) { + if (type == PropType::String || type == PropType::Enum) + return true; + } else if constexpr (std::is_same_v) { + if (type == PropType::Pointer) + return true; + } + } + return false; +} +} // namespace prop + +#undef _OPENFX_CHECK +#undef _OPENFX_CHECK_THROW +#undef _OPENFX_CHECK_WARN + +} // namespace openfx diff --git a/openfx-cpp/include/openfx/ofxPropsBySet.h b/openfx-cpp/include/openfx/ofxPropsBySet.h new file mode 100644 index 000000000..9b3a0e790 --- /dev/null +++ b/openfx-cpp/include/openfx/ofxPropsBySet.h @@ -0,0 +1,881 @@ +// Copyright OpenFX and contributors to the OpenFX project. +// SPDX-License-Identifier: BSD-3-Clause +// NOTE: This file is auto-generated by gen-props.py. DO NOT EDIT. + +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "ofxPropsMetadata.h" +// #include + +namespace openfx { + +struct Prop { + const char *name; + const PropDef &def; + bool host_write; + bool plugin_write; + bool host_optional; + + Prop(const char *n, const PropDef &d, bool hw, bool pw, bool ho) + : name(n), def(d), host_write(hw), plugin_write(pw), host_optional(ho) {} +}; + +// Properties for property sets +static inline const std::map> prop_sets { +// ClipDescriptor +{ "ClipDescriptor", { + { "OfxPropType", prop_defs[PropId::OfxPropType], false, true, false }, + { "OfxPropName", prop_defs[PropId::OfxPropName], false, true, false }, + { "OfxPropLabel", prop_defs[PropId::OfxPropLabel], false, true, false }, + { "OfxPropShortLabel", prop_defs[PropId::OfxPropShortLabel], false, true, false }, + { "OfxPropLongLabel", prop_defs[PropId::OfxPropLongLabel], false, true, false }, + { "OfxImageEffectPropSupportedComponents", prop_defs[PropId::OfxImageEffectPropSupportedComponents], false, true, false }, + { "OfxImageEffectPropTemporalClipAccess", prop_defs[PropId::OfxImageEffectPropTemporalClipAccess], false, true, false }, + { "OfxImageClipPropOptional", prop_defs[PropId::OfxImageClipPropOptional], false, true, false }, + { "OfxImageClipPropFieldExtraction", prop_defs[PropId::OfxImageClipPropFieldExtraction], false, true, false }, + { "OfxImageClipPropIsMask", prop_defs[PropId::OfxImageClipPropIsMask], false, true, false }, + { "OfxImageEffectPropSupportsTiles", prop_defs[PropId::OfxImageEffectPropSupportsTiles], false, true, false } } }, +// ClipInstance +{ "ClipInstance", { + { "OfxPropType", prop_defs[PropId::OfxPropType], true, false, false }, + { "OfxPropName", prop_defs[PropId::OfxPropName], true, false, false }, + { "OfxPropLabel", prop_defs[PropId::OfxPropLabel], true, false, false }, + { "OfxPropShortLabel", prop_defs[PropId::OfxPropShortLabel], true, false, false }, + { "OfxPropLongLabel", prop_defs[PropId::OfxPropLongLabel], true, false, false }, + { "OfxImageEffectPropSupportedComponents", prop_defs[PropId::OfxImageEffectPropSupportedComponents], true, false, false }, + { "OfxImageEffectPropTemporalClipAccess", prop_defs[PropId::OfxImageEffectPropTemporalClipAccess], true, false, false }, + { "OfxImageClipPropColourspace", prop_defs[PropId::OfxImageClipPropColourspace], true, false, false }, + { "OfxImageClipPropPreferredColourspaces", prop_defs[PropId::OfxImageClipPropPreferredColourspaces], true, false, false }, + { "OfxImageClipPropOptional", prop_defs[PropId::OfxImageClipPropOptional], true, false, false }, + { "OfxImageClipPropFieldExtraction", prop_defs[PropId::OfxImageClipPropFieldExtraction], true, false, false }, + { "OfxImageClipPropIsMask", prop_defs[PropId::OfxImageClipPropIsMask], true, false, false }, + { "OfxImageEffectPropSupportsTiles", prop_defs[PropId::OfxImageEffectPropSupportsTiles], true, false, false }, + { "OfxImageEffectPropPixelDepth", prop_defs[PropId::OfxImageEffectPropPixelDepth], true, false, false }, + { "OfxImageEffectPropComponents", prop_defs[PropId::OfxImageEffectPropComponents], true, false, false }, + { "OfxImageClipPropUnmappedPixelDepth", prop_defs[PropId::OfxImageClipPropUnmappedPixelDepth], true, false, false }, + { "OfxImageClipPropUnmappedComponents", prop_defs[PropId::OfxImageClipPropUnmappedComponents], true, false, false }, + { "OfxImageEffectPropPreMultiplication", prop_defs[PropId::OfxImageEffectPropPreMultiplication], true, false, false }, + { "OfxImagePropPixelAspectRatio", prop_defs[PropId::OfxImagePropPixelAspectRatio], true, false, false }, + { "OfxImageEffectPropFrameRate", prop_defs[PropId::OfxImageEffectPropFrameRate], true, false, false }, + { "OfxImageEffectPropFrameRange", prop_defs[PropId::OfxImageEffectPropFrameRange], true, false, false }, + { "OfxImageClipPropFieldOrder", prop_defs[PropId::OfxImageClipPropFieldOrder], true, false, false }, + { "OfxImageClipPropConnected", prop_defs[PropId::OfxImageClipPropConnected], true, false, false }, + { "OfxImageEffectPropUnmappedFrameRange", prop_defs[PropId::OfxImageEffectPropUnmappedFrameRange], true, false, false }, + { "OfxImageEffectPropUnmappedFrameRate", prop_defs[PropId::OfxImageEffectPropUnmappedFrameRate], true, false, false }, + { "OfxImageClipPropContinuousSamples", prop_defs[PropId::OfxImageClipPropContinuousSamples], true, false, false } } }, +// EffectDescriptor +{ "EffectDescriptor", { + { "OfxPropType", prop_defs[PropId::OfxPropType], false, true, false }, + { "OfxPropLabel", prop_defs[PropId::OfxPropLabel], false, true, false }, + { "OfxPropShortLabel", prop_defs[PropId::OfxPropShortLabel], false, true, false }, + { "OfxPropLongLabel", prop_defs[PropId::OfxPropLongLabel], false, true, false }, + { "OfxPropVersion", prop_defs[PropId::OfxPropVersion], false, true, true }, + { "OfxPropVersionLabel", prop_defs[PropId::OfxPropVersionLabel], false, true, true }, + { "OfxPropPluginDescription", prop_defs[PropId::OfxPropPluginDescription], false, true, true }, + { "OfxImageEffectPropSupportedContexts", prop_defs[PropId::OfxImageEffectPropSupportedContexts], false, true, false }, + { "OfxImageEffectPluginPropGrouping", prop_defs[PropId::OfxImageEffectPluginPropGrouping], false, true, false }, + { "OfxImageEffectPluginPropSingleInstance", prop_defs[PropId::OfxImageEffectPluginPropSingleInstance], false, true, false }, + { "OfxImageEffectPluginRenderThreadSafety", prop_defs[PropId::OfxImageEffectPluginRenderThreadSafety], false, true, false }, + { "OfxImageEffectPluginPropHostFrameThreading", prop_defs[PropId::OfxImageEffectPluginPropHostFrameThreading], false, true, false }, + { "OfxImageEffectPluginPropOverlayInteractV1", prop_defs[PropId::OfxImageEffectPluginPropOverlayInteractV1], false, true, false }, + { "OfxImageEffectPropOpenCLSupported", prop_defs[PropId::OfxImageEffectPropOpenCLSupported], false, true, true }, + { "OfxImageEffectPropSupportsMultiResolution", prop_defs[PropId::OfxImageEffectPropSupportsMultiResolution], false, true, false }, + { "OfxImageEffectPropSupportsTiles", prop_defs[PropId::OfxImageEffectPropSupportsTiles], false, true, false }, + { "OfxImageEffectPropTemporalClipAccess", prop_defs[PropId::OfxImageEffectPropTemporalClipAccess], false, true, false }, + { "OfxImageEffectPropSupportedPixelDepths", prop_defs[PropId::OfxImageEffectPropSupportedPixelDepths], false, true, false }, + { "OfxImageEffectPluginPropFieldRenderTwiceAlways", prop_defs[PropId::OfxImageEffectPluginPropFieldRenderTwiceAlways], false, true, false }, + { "OfxImageEffectPropMultipleClipDepths", prop_defs[PropId::OfxImageEffectPropMultipleClipDepths], false, true, false }, + { "OfxImageEffectPropSupportsMultipleClipPARs", prop_defs[PropId::OfxImageEffectPropSupportsMultipleClipPARs], false, true, false }, + { "OfxImageEffectPluginRenderThreadSafety", prop_defs[PropId::OfxImageEffectPluginRenderThreadSafety], false, true, false }, + { "OfxImageEffectPropClipPreferencesSlaveParam", prop_defs[PropId::OfxImageEffectPropClipPreferencesSlaveParam], false, true, false }, + { "OfxImageEffectPropOpenGLRenderSupported", prop_defs[PropId::OfxImageEffectPropOpenGLRenderSupported], false, true, false }, + { "OfxPluginPropFilePath", prop_defs[PropId::OfxPluginPropFilePath], true, false, false }, + { "OfxOpenGLPropPixelDepth", prop_defs[PropId::OfxOpenGLPropPixelDepth], false, true, true }, + { "OfxImageEffectPluginPropOverlayInteractV2", prop_defs[PropId::OfxImageEffectPluginPropOverlayInteractV2], false, true, false }, + { "OfxImageEffectPropColourManagementAvailableConfigs", prop_defs[PropId::OfxImageEffectPropColourManagementAvailableConfigs], false, true, true }, + { "OfxImageEffectPropColourManagementStyle", prop_defs[PropId::OfxImageEffectPropColourManagementStyle], false, true, true }, + { "OfxImageEffectPropNoSpatialAwareness", prop_defs[PropId::OfxImageEffectPropNoSpatialAwareness], false, true, true } } }, +// EffectInstance +{ "EffectInstance", { + { "OfxPropType", prop_defs[PropId::OfxPropType], true, false, false }, + { "OfxImageEffectPropContext", prop_defs[PropId::OfxImageEffectPropContext], true, false, false }, + { "OfxPropInstanceData", prop_defs[PropId::OfxPropInstanceData], true, false, false }, + { "OfxImageEffectPropProjectSize", prop_defs[PropId::OfxImageEffectPropProjectSize], true, false, false }, + { "OfxImageEffectPropProjectOffset", prop_defs[PropId::OfxImageEffectPropProjectOffset], true, false, false }, + { "OfxImageEffectPropProjectExtent", prop_defs[PropId::OfxImageEffectPropProjectExtent], true, false, false }, + { "OfxImageEffectPropPixelAspectRatio", prop_defs[PropId::OfxImageEffectPropPixelAspectRatio], true, false, false }, + { "OfxImageEffectInstancePropEffectDuration", prop_defs[PropId::OfxImageEffectInstancePropEffectDuration], true, false, false }, + { "OfxImageEffectInstancePropSequentialRender", prop_defs[PropId::OfxImageEffectInstancePropSequentialRender], true, false, false }, + { "OfxImageEffectPropSupportsTiles", prop_defs[PropId::OfxImageEffectPropSupportsTiles], true, false, false }, + { "OfxImageEffectPropOpenGLRenderSupported", prop_defs[PropId::OfxImageEffectPropOpenGLRenderSupported], true, false, false }, + { "OfxImageEffectPropFrameRate", prop_defs[PropId::OfxImageEffectPropFrameRate], true, false, false }, + { "OfxPropIsInteractive", prop_defs[PropId::OfxPropIsInteractive], true, false, false }, + { "OfxImageEffectPropOCIOConfig", prop_defs[PropId::OfxImageEffectPropOCIOConfig], true, false, false }, + { "OfxImageEffectPropOCIODisplay", prop_defs[PropId::OfxImageEffectPropOCIODisplay], true, false, false }, + { "OfxImageEffectPropOCIOView", prop_defs[PropId::OfxImageEffectPropOCIOView], true, false, false }, + { "OfxImageEffectPropColourManagementConfig", prop_defs[PropId::OfxImageEffectPropColourManagementConfig], true, false, false }, + { "OfxImageEffectPropColourManagementStyle", prop_defs[PropId::OfxImageEffectPropColourManagementStyle], true, false, false }, + { "OfxImageEffectPropDisplayColourspace", prop_defs[PropId::OfxImageEffectPropDisplayColourspace], true, false, false }, + { "OfxImageEffectPropPluginHandle", prop_defs[PropId::OfxImageEffectPropPluginHandle], true, false, false } } }, +// Image +{ "Image", { + { "OfxPropType", prop_defs[PropId::OfxPropType], true, false, false }, + { "OfxImageEffectPropPixelDepth", prop_defs[PropId::OfxImageEffectPropPixelDepth], true, false, false }, + { "OfxImageEffectPropComponents", prop_defs[PropId::OfxImageEffectPropComponents], true, false, false }, + { "OfxImageEffectPropPreMultiplication", prop_defs[PropId::OfxImageEffectPropPreMultiplication], true, false, false }, + { "OfxImageEffectPropRenderScale", prop_defs[PropId::OfxImageEffectPropRenderScale], true, false, false }, + { "OfxImagePropPixelAspectRatio", prop_defs[PropId::OfxImagePropPixelAspectRatio], true, false, false }, + { "OfxImagePropData", prop_defs[PropId::OfxImagePropData], true, false, false }, + { "OfxImagePropBounds", prop_defs[PropId::OfxImagePropBounds], true, false, false }, + { "OfxImagePropRegionOfDefinition", prop_defs[PropId::OfxImagePropRegionOfDefinition], true, false, false }, + { "OfxImagePropRowBytes", prop_defs[PropId::OfxImagePropRowBytes], true, false, false }, + { "OfxImagePropField", prop_defs[PropId::OfxImagePropField], true, false, false }, + { "OfxImagePropUniqueIdentifier", prop_defs[PropId::OfxImagePropUniqueIdentifier], true, false, false } } }, +// ImageEffectHost +{ "ImageEffectHost", { + { "OfxPropAPIVersion", prop_defs[PropId::OfxPropAPIVersion], true, false, false }, + { "OfxPropType", prop_defs[PropId::OfxPropType], true, false, false }, + { "OfxPropName", prop_defs[PropId::OfxPropName], true, false, false }, + { "OfxPropLabel", prop_defs[PropId::OfxPropLabel], true, false, false }, + { "OfxPropVersion", prop_defs[PropId::OfxPropVersion], true, false, false }, + { "OfxPropVersionLabel", prop_defs[PropId::OfxPropVersionLabel], true, false, false }, + { "OfxImageEffectHostPropIsBackground", prop_defs[PropId::OfxImageEffectHostPropIsBackground], true, false, false }, + { "OfxImageEffectPropSupportsOverlays", prop_defs[PropId::OfxImageEffectPropSupportsOverlays], true, false, false }, + { "OfxImageEffectPropSupportsMultiResolution", prop_defs[PropId::OfxImageEffectPropSupportsMultiResolution], true, false, false }, + { "OfxImageEffectPropSupportsTiles", prop_defs[PropId::OfxImageEffectPropSupportsTiles], true, false, false }, + { "OfxImageEffectPropTemporalClipAccess", prop_defs[PropId::OfxImageEffectPropTemporalClipAccess], true, false, false }, + { "OfxImageEffectPropSupportedComponents", prop_defs[PropId::OfxImageEffectPropSupportedComponents], true, false, false }, + { "OfxImageEffectPropSupportedContexts", prop_defs[PropId::OfxImageEffectPropSupportedContexts], true, false, false }, + { "OfxImageEffectPropMultipleClipDepths", prop_defs[PropId::OfxImageEffectPropMultipleClipDepths], true, false, false }, + { "OfxImageEffectPropOpenCLSupported", prop_defs[PropId::OfxImageEffectPropOpenCLSupported], true, false, true }, + { "OfxImageEffectPropSupportsMultipleClipPARs", prop_defs[PropId::OfxImageEffectPropSupportsMultipleClipPARs], true, false, false }, + { "OfxImageEffectPropSetableFrameRate", prop_defs[PropId::OfxImageEffectPropSetableFrameRate], true, false, false }, + { "OfxImageEffectPropSetableFielding", prop_defs[PropId::OfxImageEffectPropSetableFielding], true, false, false }, + { "OfxParamHostPropSupportsCustomInteract", prop_defs[PropId::OfxParamHostPropSupportsCustomInteract], true, false, false }, + { "OfxParamHostPropSupportsStringAnimation", prop_defs[PropId::OfxParamHostPropSupportsStringAnimation], true, false, false }, + { "OfxParamHostPropSupportsChoiceAnimation", prop_defs[PropId::OfxParamHostPropSupportsChoiceAnimation], true, false, false }, + { "OfxParamHostPropSupportsBooleanAnimation", prop_defs[PropId::OfxParamHostPropSupportsBooleanAnimation], true, false, false }, + { "OfxParamHostPropSupportsCustomAnimation", prop_defs[PropId::OfxParamHostPropSupportsCustomAnimation], true, false, false }, + { "OfxParamHostPropSupportsStrChoice", prop_defs[PropId::OfxParamHostPropSupportsStrChoice], true, false, true }, + { "OfxParamHostPropSupportsStrChoiceAnimation", prop_defs[PropId::OfxParamHostPropSupportsStrChoiceAnimation], true, false, true }, + { "OfxParamHostPropMaxParameters", prop_defs[PropId::OfxParamHostPropMaxParameters], true, false, false }, + { "OfxParamHostPropMaxPages", prop_defs[PropId::OfxParamHostPropMaxPages], true, false, false }, + { "OfxParamHostPropPageRowColumnCount", prop_defs[PropId::OfxParamHostPropPageRowColumnCount], true, false, false }, + { "OfxPropHostOSHandle", prop_defs[PropId::OfxPropHostOSHandle], true, false, true }, + { "OfxParamHostPropSupportsParametricAnimation", prop_defs[PropId::OfxParamHostPropSupportsParametricAnimation], true, false, true }, + { "OfxImageEffectInstancePropSequentialRender", prop_defs[PropId::OfxImageEffectInstancePropSequentialRender], true, false, true }, + { "OfxImageEffectPropOpenGLRenderSupported", prop_defs[PropId::OfxImageEffectPropOpenGLRenderSupported], true, false, false }, + { "OfxImageEffectPropRenderQualityDraft", prop_defs[PropId::OfxImageEffectPropRenderQualityDraft], true, false, true }, + { "OfxImageEffectHostPropNativeOrigin", prop_defs[PropId::OfxImageEffectHostPropNativeOrigin], true, false, true }, + { "OfxImageEffectPropColourManagementAvailableConfigs", prop_defs[PropId::OfxImageEffectPropColourManagementAvailableConfigs], true, false, true }, + { "OfxImageEffectPropColourManagementStyle", prop_defs[PropId::OfxImageEffectPropColourManagementStyle], true, false, true } } }, +// InteractDescriptor +{ "InteractDescriptor", { + { "OfxInteractPropHasAlpha", prop_defs[PropId::OfxInteractPropHasAlpha], true, false, false }, + { "OfxInteractPropBitDepth", prop_defs[PropId::OfxInteractPropBitDepth], true, false, false } } }, +// InteractInstance +{ "InteractInstance", { + { "OfxPropEffectInstance", prop_defs[PropId::OfxPropEffectInstance], true, false, false }, + { "OfxPropInstanceData", prop_defs[PropId::OfxPropInstanceData], true, false, false }, + { "OfxInteractPropPixelScale", prop_defs[PropId::OfxInteractPropPixelScale], true, false, false }, + { "OfxInteractPropBackgroundColour", prop_defs[PropId::OfxInteractPropBackgroundColour], true, false, false }, + { "OfxInteractPropHasAlpha", prop_defs[PropId::OfxInteractPropHasAlpha], true, false, false }, + { "OfxInteractPropBitDepth", prop_defs[PropId::OfxInteractPropBitDepth], true, false, false }, + { "OfxInteractPropSlaveToParam", prop_defs[PropId::OfxInteractPropSlaveToParam], true, false, false }, + { "OfxInteractPropSuggestedColour", prop_defs[PropId::OfxInteractPropSuggestedColour], true, false, false } } }, +// ParamDouble1D +{ "ParamDouble1D", { + { "OfxParamPropShowTimeMarker", prop_defs[PropId::OfxParamPropShowTimeMarker], false, true, false }, + { "OfxParamPropDoubleType", prop_defs[PropId::OfxParamPropDoubleType], false, true, false }, + { "OfxPropType", prop_defs[PropId::OfxPropType], false, true, false }, + { "OfxPropName", prop_defs[PropId::OfxPropName], false, true, false }, + { "OfxPropLabel", prop_defs[PropId::OfxPropLabel], false, true, false }, + { "OfxPropShortLabel", prop_defs[PropId::OfxPropShortLabel], false, true, false }, + { "OfxPropLongLabel", prop_defs[PropId::OfxPropLongLabel], false, true, false }, + { "OfxParamPropType", prop_defs[PropId::OfxParamPropType], false, true, false }, + { "OfxParamPropSecret", prop_defs[PropId::OfxParamPropSecret], false, true, false }, + { "OfxParamPropHint", prop_defs[PropId::OfxParamPropHint], false, true, false }, + { "OfxParamPropScriptName", prop_defs[PropId::OfxParamPropScriptName], false, true, false }, + { "OfxParamPropParent", prop_defs[PropId::OfxParamPropParent], false, true, false }, + { "OfxParamPropEnabled", prop_defs[PropId::OfxParamPropEnabled], false, true, false }, + { "OfxParamPropDataPtr", prop_defs[PropId::OfxParamPropDataPtr], false, true, false }, + { "OfxPropIcon", prop_defs[PropId::OfxPropIcon], false, true, false }, + { "OfxParamPropInteractV1", prop_defs[PropId::OfxParamPropInteractV1], false, true, false }, + { "OfxParamPropInteractSize", prop_defs[PropId::OfxParamPropInteractSize], false, true, false }, + { "OfxParamPropInteractSizeAspect", prop_defs[PropId::OfxParamPropInteractSizeAspect], false, true, false }, + { "OfxParamPropInteractMinimumSize", prop_defs[PropId::OfxParamPropInteractMinimumSize], false, true, false }, + { "OfxParamPropInteractPreferedSize", prop_defs[PropId::OfxParamPropInteractPreferedSize], false, true, false }, + { "OfxParamPropHasHostOverlayHandle", prop_defs[PropId::OfxParamPropHasHostOverlayHandle], false, true, false }, + { "kOfxParamPropUseHostOverlayHandle", prop_defs[PropId::OfxParamPropUseHostOverlayHandle], false, true, false }, + { "OfxParamPropDefault", prop_defs[PropId::OfxParamPropDefault], false, true, false }, + { "OfxParamPropAnimates", prop_defs[PropId::OfxParamPropAnimates], false, true, false }, + { "OfxParamPropIsAnimating", prop_defs[PropId::OfxParamPropIsAnimating], true, false, false }, + { "OfxParamPropIsAutoKeying", prop_defs[PropId::OfxParamPropIsAutoKeying], true, false, false }, + { "OfxParamPropPersistant", prop_defs[PropId::OfxParamPropPersistant], false, true, false }, + { "OfxParamPropEvaluateOnChange", prop_defs[PropId::OfxParamPropEvaluateOnChange], false, true, false }, + { "OfxParamPropPluginMayWrite", prop_defs[PropId::OfxParamPropPluginMayWrite], false, true, false }, + { "OfxParamPropCacheInvalidation", prop_defs[PropId::OfxParamPropCacheInvalidation], false, true, false }, + { "OfxParamPropCanUndo", prop_defs[PropId::OfxParamPropCanUndo], false, true, false }, + { "OfxParamPropMin", prop_defs[PropId::OfxParamPropMin], false, true, false }, + { "OfxParamPropMax", prop_defs[PropId::OfxParamPropMax], false, true, false }, + { "OfxParamPropDisplayMin", prop_defs[PropId::OfxParamPropDisplayMin], false, true, false }, + { "OfxParamPropDisplayMax", prop_defs[PropId::OfxParamPropDisplayMax], false, true, false }, + { "OfxParamPropIncrement", prop_defs[PropId::OfxParamPropIncrement], false, true, false }, + { "OfxParamPropDigits", prop_defs[PropId::OfxParamPropDigits], false, true, false } } }, +// ParameterSet +{ "ParameterSet", { + { "OfxPropParamSetNeedsSyncing", prop_defs[PropId::OfxPropParamSetNeedsSyncing], false, true, false }, + { "OfxPluginPropParamPageOrder", prop_defs[PropId::OfxPluginPropParamPageOrder], false, true, false } } }, +// ParamsByte +{ "ParamsByte", { + { "OfxPropType", prop_defs[PropId::OfxPropType], false, true, false }, + { "OfxPropName", prop_defs[PropId::OfxPropName], false, true, false }, + { "OfxPropLabel", prop_defs[PropId::OfxPropLabel], false, true, false }, + { "OfxPropShortLabel", prop_defs[PropId::OfxPropShortLabel], false, true, false }, + { "OfxPropLongLabel", prop_defs[PropId::OfxPropLongLabel], false, true, false }, + { "OfxParamPropType", prop_defs[PropId::OfxParamPropType], false, true, false }, + { "OfxParamPropSecret", prop_defs[PropId::OfxParamPropSecret], false, true, false }, + { "OfxParamPropHint", prop_defs[PropId::OfxParamPropHint], false, true, false }, + { "OfxParamPropScriptName", prop_defs[PropId::OfxParamPropScriptName], false, true, false }, + { "OfxParamPropParent", prop_defs[PropId::OfxParamPropParent], false, true, false }, + { "OfxParamPropEnabled", prop_defs[PropId::OfxParamPropEnabled], false, true, false }, + { "OfxParamPropDataPtr", prop_defs[PropId::OfxParamPropDataPtr], false, true, false }, + { "OfxPropIcon", prop_defs[PropId::OfxPropIcon], false, true, false }, + { "OfxParamPropInteractV1", prop_defs[PropId::OfxParamPropInteractV1], false, true, false }, + { "OfxParamPropInteractSize", prop_defs[PropId::OfxParamPropInteractSize], false, true, false }, + { "OfxParamPropInteractSizeAspect", prop_defs[PropId::OfxParamPropInteractSizeAspect], false, true, false }, + { "OfxParamPropInteractMinimumSize", prop_defs[PropId::OfxParamPropInteractMinimumSize], false, true, false }, + { "OfxParamPropInteractPreferedSize", prop_defs[PropId::OfxParamPropInteractPreferedSize], false, true, false }, + { "OfxParamPropHasHostOverlayHandle", prop_defs[PropId::OfxParamPropHasHostOverlayHandle], false, true, false }, + { "kOfxParamPropUseHostOverlayHandle", prop_defs[PropId::OfxParamPropUseHostOverlayHandle], false, true, false }, + { "OfxParamPropDefault", prop_defs[PropId::OfxParamPropDefault], false, true, false }, + { "OfxParamPropAnimates", prop_defs[PropId::OfxParamPropAnimates], false, true, false }, + { "OfxParamPropIsAnimating", prop_defs[PropId::OfxParamPropIsAnimating], true, false, false }, + { "OfxParamPropIsAutoKeying", prop_defs[PropId::OfxParamPropIsAutoKeying], true, false, false }, + { "OfxParamPropPersistant", prop_defs[PropId::OfxParamPropPersistant], false, true, false }, + { "OfxParamPropEvaluateOnChange", prop_defs[PropId::OfxParamPropEvaluateOnChange], false, true, false }, + { "OfxParamPropPluginMayWrite", prop_defs[PropId::OfxParamPropPluginMayWrite], false, true, false }, + { "OfxParamPropCacheInvalidation", prop_defs[PropId::OfxParamPropCacheInvalidation], false, true, false }, + { "OfxParamPropCanUndo", prop_defs[PropId::OfxParamPropCanUndo], false, true, false }, + { "OfxParamPropMin", prop_defs[PropId::OfxParamPropMin], false, true, false }, + { "OfxParamPropMax", prop_defs[PropId::OfxParamPropMax], false, true, false }, + { "OfxParamPropDisplayMin", prop_defs[PropId::OfxParamPropDisplayMin], false, true, false }, + { "OfxParamPropDisplayMax", prop_defs[PropId::OfxParamPropDisplayMax], false, true, false } } }, +// ParamsChoice +{ "ParamsChoice", { + { "OfxParamPropChoiceOption", prop_defs[PropId::OfxParamPropChoiceOption], false, true, false }, + { "OfxParamPropChoiceOrder", prop_defs[PropId::OfxParamPropChoiceOrder], false, true, false }, + { "OfxPropType", prop_defs[PropId::OfxPropType], false, true, false }, + { "OfxPropName", prop_defs[PropId::OfxPropName], false, true, false }, + { "OfxPropLabel", prop_defs[PropId::OfxPropLabel], false, true, false }, + { "OfxPropShortLabel", prop_defs[PropId::OfxPropShortLabel], false, true, false }, + { "OfxPropLongLabel", prop_defs[PropId::OfxPropLongLabel], false, true, false }, + { "OfxParamPropType", prop_defs[PropId::OfxParamPropType], false, true, false }, + { "OfxParamPropSecret", prop_defs[PropId::OfxParamPropSecret], false, true, false }, + { "OfxParamPropHint", prop_defs[PropId::OfxParamPropHint], false, true, false }, + { "OfxParamPropScriptName", prop_defs[PropId::OfxParamPropScriptName], false, true, false }, + { "OfxParamPropParent", prop_defs[PropId::OfxParamPropParent], false, true, false }, + { "OfxParamPropEnabled", prop_defs[PropId::OfxParamPropEnabled], false, true, false }, + { "OfxParamPropDataPtr", prop_defs[PropId::OfxParamPropDataPtr], false, true, false }, + { "OfxPropIcon", prop_defs[PropId::OfxPropIcon], false, true, false }, + { "OfxParamPropInteractV1", prop_defs[PropId::OfxParamPropInteractV1], false, true, false }, + { "OfxParamPropInteractSize", prop_defs[PropId::OfxParamPropInteractSize], false, true, false }, + { "OfxParamPropInteractSizeAspect", prop_defs[PropId::OfxParamPropInteractSizeAspect], false, true, false }, + { "OfxParamPropInteractMinimumSize", prop_defs[PropId::OfxParamPropInteractMinimumSize], false, true, false }, + { "OfxParamPropInteractPreferedSize", prop_defs[PropId::OfxParamPropInteractPreferedSize], false, true, false }, + { "OfxParamPropHasHostOverlayHandle", prop_defs[PropId::OfxParamPropHasHostOverlayHandle], false, true, false }, + { "kOfxParamPropUseHostOverlayHandle", prop_defs[PropId::OfxParamPropUseHostOverlayHandle], false, true, false }, + { "OfxParamPropDefault", prop_defs[PropId::OfxParamPropDefault], false, true, false }, + { "OfxParamPropAnimates", prop_defs[PropId::OfxParamPropAnimates], false, true, false }, + { "OfxParamPropIsAnimating", prop_defs[PropId::OfxParamPropIsAnimating], true, false, false }, + { "OfxParamPropIsAutoKeying", prop_defs[PropId::OfxParamPropIsAutoKeying], true, false, false }, + { "OfxParamPropPersistant", prop_defs[PropId::OfxParamPropPersistant], false, true, false }, + { "OfxParamPropEvaluateOnChange", prop_defs[PropId::OfxParamPropEvaluateOnChange], false, true, false }, + { "OfxParamPropPluginMayWrite", prop_defs[PropId::OfxParamPropPluginMayWrite], false, true, false }, + { "OfxParamPropCacheInvalidation", prop_defs[PropId::OfxParamPropCacheInvalidation], false, true, false }, + { "OfxParamPropCanUndo", prop_defs[PropId::OfxParamPropCanUndo], false, true, false } } }, +// ParamsCustom +{ "ParamsCustom", { + { "OfxParamPropCustomCallbackV1", prop_defs[PropId::OfxParamPropCustomCallbackV1], false, true, false }, + { "OfxPropType", prop_defs[PropId::OfxPropType], false, true, false }, + { "OfxPropName", prop_defs[PropId::OfxPropName], false, true, false }, + { "OfxPropLabel", prop_defs[PropId::OfxPropLabel], false, true, false }, + { "OfxPropShortLabel", prop_defs[PropId::OfxPropShortLabel], false, true, false }, + { "OfxPropLongLabel", prop_defs[PropId::OfxPropLongLabel], false, true, false }, + { "OfxParamPropType", prop_defs[PropId::OfxParamPropType], false, true, false }, + { "OfxParamPropSecret", prop_defs[PropId::OfxParamPropSecret], false, true, false }, + { "OfxParamPropHint", prop_defs[PropId::OfxParamPropHint], false, true, false }, + { "OfxParamPropScriptName", prop_defs[PropId::OfxParamPropScriptName], false, true, false }, + { "OfxParamPropParent", prop_defs[PropId::OfxParamPropParent], false, true, false }, + { "OfxParamPropEnabled", prop_defs[PropId::OfxParamPropEnabled], false, true, false }, + { "OfxParamPropDataPtr", prop_defs[PropId::OfxParamPropDataPtr], false, true, false }, + { "OfxPropIcon", prop_defs[PropId::OfxPropIcon], false, true, false }, + { "OfxParamPropInteractV1", prop_defs[PropId::OfxParamPropInteractV1], false, true, false }, + { "OfxParamPropInteractSize", prop_defs[PropId::OfxParamPropInteractSize], false, true, false }, + { "OfxParamPropInteractSizeAspect", prop_defs[PropId::OfxParamPropInteractSizeAspect], false, true, false }, + { "OfxParamPropInteractMinimumSize", prop_defs[PropId::OfxParamPropInteractMinimumSize], false, true, false }, + { "OfxParamPropInteractPreferedSize", prop_defs[PropId::OfxParamPropInteractPreferedSize], false, true, false }, + { "OfxParamPropHasHostOverlayHandle", prop_defs[PropId::OfxParamPropHasHostOverlayHandle], false, true, false }, + { "kOfxParamPropUseHostOverlayHandle", prop_defs[PropId::OfxParamPropUseHostOverlayHandle], false, true, false }, + { "OfxParamPropDefault", prop_defs[PropId::OfxParamPropDefault], false, true, false }, + { "OfxParamPropAnimates", prop_defs[PropId::OfxParamPropAnimates], false, true, false }, + { "OfxParamPropIsAnimating", prop_defs[PropId::OfxParamPropIsAnimating], true, false, false }, + { "OfxParamPropIsAutoKeying", prop_defs[PropId::OfxParamPropIsAutoKeying], true, false, false }, + { "OfxParamPropPersistant", prop_defs[PropId::OfxParamPropPersistant], false, true, false }, + { "OfxParamPropEvaluateOnChange", prop_defs[PropId::OfxParamPropEvaluateOnChange], false, true, false }, + { "OfxParamPropPluginMayWrite", prop_defs[PropId::OfxParamPropPluginMayWrite], false, true, false }, + { "OfxParamPropCacheInvalidation", prop_defs[PropId::OfxParamPropCacheInvalidation], false, true, false }, + { "OfxParamPropCanUndo", prop_defs[PropId::OfxParamPropCanUndo], false, true, false } } }, +// ParamsDouble2D3D +{ "ParamsDouble2D3D", { + { "OfxParamPropDoubleType", prop_defs[PropId::OfxParamPropDoubleType], false, true, false }, + { "OfxPropType", prop_defs[PropId::OfxPropType], false, true, false }, + { "OfxPropName", prop_defs[PropId::OfxPropName], false, true, false }, + { "OfxPropLabel", prop_defs[PropId::OfxPropLabel], false, true, false }, + { "OfxPropShortLabel", prop_defs[PropId::OfxPropShortLabel], false, true, false }, + { "OfxPropLongLabel", prop_defs[PropId::OfxPropLongLabel], false, true, false }, + { "OfxParamPropType", prop_defs[PropId::OfxParamPropType], false, true, false }, + { "OfxParamPropSecret", prop_defs[PropId::OfxParamPropSecret], false, true, false }, + { "OfxParamPropHint", prop_defs[PropId::OfxParamPropHint], false, true, false }, + { "OfxParamPropScriptName", prop_defs[PropId::OfxParamPropScriptName], false, true, false }, + { "OfxParamPropParent", prop_defs[PropId::OfxParamPropParent], false, true, false }, + { "OfxParamPropEnabled", prop_defs[PropId::OfxParamPropEnabled], false, true, false }, + { "OfxParamPropDataPtr", prop_defs[PropId::OfxParamPropDataPtr], false, true, false }, + { "OfxPropIcon", prop_defs[PropId::OfxPropIcon], false, true, false }, + { "OfxParamPropInteractV1", prop_defs[PropId::OfxParamPropInteractV1], false, true, false }, + { "OfxParamPropInteractSize", prop_defs[PropId::OfxParamPropInteractSize], false, true, false }, + { "OfxParamPropInteractSizeAspect", prop_defs[PropId::OfxParamPropInteractSizeAspect], false, true, false }, + { "OfxParamPropInteractMinimumSize", prop_defs[PropId::OfxParamPropInteractMinimumSize], false, true, false }, + { "OfxParamPropInteractPreferedSize", prop_defs[PropId::OfxParamPropInteractPreferedSize], false, true, false }, + { "OfxParamPropHasHostOverlayHandle", prop_defs[PropId::OfxParamPropHasHostOverlayHandle], false, true, false }, + { "kOfxParamPropUseHostOverlayHandle", prop_defs[PropId::OfxParamPropUseHostOverlayHandle], false, true, false }, + { "OfxParamPropDefault", prop_defs[PropId::OfxParamPropDefault], false, true, false }, + { "OfxParamPropAnimates", prop_defs[PropId::OfxParamPropAnimates], false, true, false }, + { "OfxParamPropIsAnimating", prop_defs[PropId::OfxParamPropIsAnimating], true, false, false }, + { "OfxParamPropIsAutoKeying", prop_defs[PropId::OfxParamPropIsAutoKeying], true, false, false }, + { "OfxParamPropPersistant", prop_defs[PropId::OfxParamPropPersistant], false, true, false }, + { "OfxParamPropEvaluateOnChange", prop_defs[PropId::OfxParamPropEvaluateOnChange], false, true, false }, + { "OfxParamPropPluginMayWrite", prop_defs[PropId::OfxParamPropPluginMayWrite], false, true, false }, + { "OfxParamPropCacheInvalidation", prop_defs[PropId::OfxParamPropCacheInvalidation], false, true, false }, + { "OfxParamPropCanUndo", prop_defs[PropId::OfxParamPropCanUndo], false, true, false }, + { "OfxParamPropMin", prop_defs[PropId::OfxParamPropMin], false, true, false }, + { "OfxParamPropMax", prop_defs[PropId::OfxParamPropMax], false, true, false }, + { "OfxParamPropDisplayMin", prop_defs[PropId::OfxParamPropDisplayMin], false, true, false }, + { "OfxParamPropDisplayMax", prop_defs[PropId::OfxParamPropDisplayMax], false, true, false }, + { "OfxParamPropIncrement", prop_defs[PropId::OfxParamPropIncrement], false, true, false }, + { "OfxParamPropDigits", prop_defs[PropId::OfxParamPropDigits], false, true, false } } }, +// ParamsGroup +{ "ParamsGroup", { + { "OfxParamPropGroupOpen", prop_defs[PropId::OfxParamPropGroupOpen], false, true, false }, + { "OfxPropType", prop_defs[PropId::OfxPropType], false, true, false }, + { "OfxPropName", prop_defs[PropId::OfxPropName], false, true, false }, + { "OfxPropLabel", prop_defs[PropId::OfxPropLabel], false, true, false }, + { "OfxPropShortLabel", prop_defs[PropId::OfxPropShortLabel], false, true, false }, + { "OfxPropLongLabel", prop_defs[PropId::OfxPropLongLabel], false, true, false }, + { "OfxParamPropType", prop_defs[PropId::OfxParamPropType], false, true, false }, + { "OfxParamPropSecret", prop_defs[PropId::OfxParamPropSecret], false, true, false }, + { "OfxParamPropHint", prop_defs[PropId::OfxParamPropHint], false, true, false }, + { "OfxParamPropScriptName", prop_defs[PropId::OfxParamPropScriptName], false, true, false }, + { "OfxParamPropParent", prop_defs[PropId::OfxParamPropParent], false, true, false }, + { "OfxParamPropEnabled", prop_defs[PropId::OfxParamPropEnabled], false, true, false }, + { "OfxParamPropDataPtr", prop_defs[PropId::OfxParamPropDataPtr], false, true, false }, + { "OfxPropIcon", prop_defs[PropId::OfxPropIcon], false, true, false } } }, +// ParamsInt2D3D +{ "ParamsInt2D3D", { + { "OfxParamPropDimensionLabel", prop_defs[PropId::OfxParamPropDimensionLabel], false, true, false }, + { "OfxPropType", prop_defs[PropId::OfxPropType], false, true, false }, + { "OfxPropName", prop_defs[PropId::OfxPropName], false, true, false }, + { "OfxPropLabel", prop_defs[PropId::OfxPropLabel], false, true, false }, + { "OfxPropShortLabel", prop_defs[PropId::OfxPropShortLabel], false, true, false }, + { "OfxPropLongLabel", prop_defs[PropId::OfxPropLongLabel], false, true, false }, + { "OfxParamPropType", prop_defs[PropId::OfxParamPropType], false, true, false }, + { "OfxParamPropSecret", prop_defs[PropId::OfxParamPropSecret], false, true, false }, + { "OfxParamPropHint", prop_defs[PropId::OfxParamPropHint], false, true, false }, + { "OfxParamPropScriptName", prop_defs[PropId::OfxParamPropScriptName], false, true, false }, + { "OfxParamPropParent", prop_defs[PropId::OfxParamPropParent], false, true, false }, + { "OfxParamPropEnabled", prop_defs[PropId::OfxParamPropEnabled], false, true, false }, + { "OfxParamPropDataPtr", prop_defs[PropId::OfxParamPropDataPtr], false, true, false }, + { "OfxPropIcon", prop_defs[PropId::OfxPropIcon], false, true, false }, + { "OfxParamPropInteractV1", prop_defs[PropId::OfxParamPropInteractV1], false, true, false }, + { "OfxParamPropInteractSize", prop_defs[PropId::OfxParamPropInteractSize], false, true, false }, + { "OfxParamPropInteractSizeAspect", prop_defs[PropId::OfxParamPropInteractSizeAspect], false, true, false }, + { "OfxParamPropInteractMinimumSize", prop_defs[PropId::OfxParamPropInteractMinimumSize], false, true, false }, + { "OfxParamPropInteractPreferedSize", prop_defs[PropId::OfxParamPropInteractPreferedSize], false, true, false }, + { "OfxParamPropHasHostOverlayHandle", prop_defs[PropId::OfxParamPropHasHostOverlayHandle], false, true, false }, + { "kOfxParamPropUseHostOverlayHandle", prop_defs[PropId::OfxParamPropUseHostOverlayHandle], false, true, false }, + { "OfxParamPropDefault", prop_defs[PropId::OfxParamPropDefault], false, true, false }, + { "OfxParamPropAnimates", prop_defs[PropId::OfxParamPropAnimates], false, true, false }, + { "OfxParamPropIsAnimating", prop_defs[PropId::OfxParamPropIsAnimating], true, false, false }, + { "OfxParamPropIsAutoKeying", prop_defs[PropId::OfxParamPropIsAutoKeying], true, false, false }, + { "OfxParamPropPersistant", prop_defs[PropId::OfxParamPropPersistant], false, true, false }, + { "OfxParamPropEvaluateOnChange", prop_defs[PropId::OfxParamPropEvaluateOnChange], false, true, false }, + { "OfxParamPropPluginMayWrite", prop_defs[PropId::OfxParamPropPluginMayWrite], false, true, false }, + { "OfxParamPropCacheInvalidation", prop_defs[PropId::OfxParamPropCacheInvalidation], false, true, false }, + { "OfxParamPropCanUndo", prop_defs[PropId::OfxParamPropCanUndo], false, true, false }, + { "OfxParamPropMin", prop_defs[PropId::OfxParamPropMin], false, true, false }, + { "OfxParamPropMax", prop_defs[PropId::OfxParamPropMax], false, true, false }, + { "OfxParamPropDisplayMin", prop_defs[PropId::OfxParamPropDisplayMin], false, true, false }, + { "OfxParamPropDisplayMax", prop_defs[PropId::OfxParamPropDisplayMax], false, true, false } } }, +// ParamsNormalizedSpatial +{ "ParamsNormalizedSpatial", { + { "OfxParamPropDefaultCoordinateSystem", prop_defs[PropId::OfxParamPropDefaultCoordinateSystem], false, true, false }, + { "OfxPropType", prop_defs[PropId::OfxPropType], false, true, false }, + { "OfxPropName", prop_defs[PropId::OfxPropName], false, true, false }, + { "OfxPropLabel", prop_defs[PropId::OfxPropLabel], false, true, false }, + { "OfxPropShortLabel", prop_defs[PropId::OfxPropShortLabel], false, true, false }, + { "OfxPropLongLabel", prop_defs[PropId::OfxPropLongLabel], false, true, false }, + { "OfxParamPropType", prop_defs[PropId::OfxParamPropType], false, true, false }, + { "OfxParamPropSecret", prop_defs[PropId::OfxParamPropSecret], false, true, false }, + { "OfxParamPropHint", prop_defs[PropId::OfxParamPropHint], false, true, false }, + { "OfxParamPropScriptName", prop_defs[PropId::OfxParamPropScriptName], false, true, false }, + { "OfxParamPropParent", prop_defs[PropId::OfxParamPropParent], false, true, false }, + { "OfxParamPropEnabled", prop_defs[PropId::OfxParamPropEnabled], false, true, false }, + { "OfxParamPropDataPtr", prop_defs[PropId::OfxParamPropDataPtr], false, true, false }, + { "OfxPropIcon", prop_defs[PropId::OfxPropIcon], false, true, false }, + { "OfxParamPropInteractV1", prop_defs[PropId::OfxParamPropInteractV1], false, true, false }, + { "OfxParamPropInteractSize", prop_defs[PropId::OfxParamPropInteractSize], false, true, false }, + { "OfxParamPropInteractSizeAspect", prop_defs[PropId::OfxParamPropInteractSizeAspect], false, true, false }, + { "OfxParamPropInteractMinimumSize", prop_defs[PropId::OfxParamPropInteractMinimumSize], false, true, false }, + { "OfxParamPropInteractPreferedSize", prop_defs[PropId::OfxParamPropInteractPreferedSize], false, true, false }, + { "OfxParamPropHasHostOverlayHandle", prop_defs[PropId::OfxParamPropHasHostOverlayHandle], false, true, false }, + { "kOfxParamPropUseHostOverlayHandle", prop_defs[PropId::OfxParamPropUseHostOverlayHandle], false, true, false }, + { "OfxParamPropDefault", prop_defs[PropId::OfxParamPropDefault], false, true, false }, + { "OfxParamPropAnimates", prop_defs[PropId::OfxParamPropAnimates], false, true, false }, + { "OfxParamPropIsAnimating", prop_defs[PropId::OfxParamPropIsAnimating], true, false, false }, + { "OfxParamPropIsAutoKeying", prop_defs[PropId::OfxParamPropIsAutoKeying], true, false, false }, + { "OfxParamPropPersistant", prop_defs[PropId::OfxParamPropPersistant], false, true, false }, + { "OfxParamPropEvaluateOnChange", prop_defs[PropId::OfxParamPropEvaluateOnChange], false, true, false }, + { "OfxParamPropPluginMayWrite", prop_defs[PropId::OfxParamPropPluginMayWrite], false, true, false }, + { "OfxParamPropCacheInvalidation", prop_defs[PropId::OfxParamPropCacheInvalidation], false, true, false }, + { "OfxParamPropCanUndo", prop_defs[PropId::OfxParamPropCanUndo], false, true, false }, + { "OfxParamPropMin", prop_defs[PropId::OfxParamPropMin], false, true, false }, + { "OfxParamPropMax", prop_defs[PropId::OfxParamPropMax], false, true, false }, + { "OfxParamPropDisplayMin", prop_defs[PropId::OfxParamPropDisplayMin], false, true, false }, + { "OfxParamPropDisplayMax", prop_defs[PropId::OfxParamPropDisplayMax], false, true, false }, + { "OfxParamPropIncrement", prop_defs[PropId::OfxParamPropIncrement], false, true, false }, + { "OfxParamPropDigits", prop_defs[PropId::OfxParamPropDigits], false, true, false } } }, +// ParamsPage +{ "ParamsPage", { + { "OfxParamPropPageChild", prop_defs[PropId::OfxParamPropPageChild], false, true, false }, + { "OfxPropType", prop_defs[PropId::OfxPropType], false, true, false }, + { "OfxPropName", prop_defs[PropId::OfxPropName], false, true, false }, + { "OfxPropLabel", prop_defs[PropId::OfxPropLabel], false, true, false }, + { "OfxPropShortLabel", prop_defs[PropId::OfxPropShortLabel], false, true, false }, + { "OfxPropLongLabel", prop_defs[PropId::OfxPropLongLabel], false, true, false }, + { "OfxParamPropType", prop_defs[PropId::OfxParamPropType], false, true, false }, + { "OfxParamPropSecret", prop_defs[PropId::OfxParamPropSecret], false, true, false }, + { "OfxParamPropHint", prop_defs[PropId::OfxParamPropHint], false, true, false }, + { "OfxParamPropScriptName", prop_defs[PropId::OfxParamPropScriptName], false, true, false }, + { "OfxParamPropParent", prop_defs[PropId::OfxParamPropParent], false, true, false }, + { "OfxParamPropEnabled", prop_defs[PropId::OfxParamPropEnabled], false, true, false }, + { "OfxParamPropDataPtr", prop_defs[PropId::OfxParamPropDataPtr], false, true, false }, + { "OfxPropIcon", prop_defs[PropId::OfxPropIcon], false, true, false } } }, +// ParamsParametric +{ "ParamsParametric", { + { "OfxParamPropAnimates", prop_defs[PropId::OfxParamPropAnimates], false, true, false }, + { "OfxParamPropIsAnimating", prop_defs[PropId::OfxParamPropIsAnimating], false, true, false }, + { "OfxParamPropIsAutoKeying", prop_defs[PropId::OfxParamPropIsAutoKeying], false, true, false }, + { "OfxParamPropPersistant", prop_defs[PropId::OfxParamPropPersistant], false, true, false }, + { "OfxParamPropEvaluateOnChange", prop_defs[PropId::OfxParamPropEvaluateOnChange], false, true, false }, + { "OfxParamPropPluginMayWrite", prop_defs[PropId::OfxParamPropPluginMayWrite], false, true, false }, + { "OfxParamPropCacheInvalidation", prop_defs[PropId::OfxParamPropCacheInvalidation], false, true, false }, + { "OfxParamPropCanUndo", prop_defs[PropId::OfxParamPropCanUndo], false, true, false }, + { "OfxParamPropParametricDimension", prop_defs[PropId::OfxParamPropParametricDimension], false, true, false }, + { "OfxParamPropParametricUIColour", prop_defs[PropId::OfxParamPropParametricUIColour], false, true, false }, + { "OfxParamPropParametricInteractBackground", prop_defs[PropId::OfxParamPropParametricInteractBackground], false, true, false }, + { "OfxParamPropParametricRange", prop_defs[PropId::OfxParamPropParametricRange], false, true, false }, + { "OfxPropType", prop_defs[PropId::OfxPropType], false, true, false }, + { "OfxPropName", prop_defs[PropId::OfxPropName], false, true, false }, + { "OfxPropLabel", prop_defs[PropId::OfxPropLabel], false, true, false }, + { "OfxPropShortLabel", prop_defs[PropId::OfxPropShortLabel], false, true, false }, + { "OfxPropLongLabel", prop_defs[PropId::OfxPropLongLabel], false, true, false }, + { "OfxParamPropType", prop_defs[PropId::OfxParamPropType], false, true, false }, + { "OfxParamPropSecret", prop_defs[PropId::OfxParamPropSecret], false, true, false }, + { "OfxParamPropHint", prop_defs[PropId::OfxParamPropHint], false, true, false }, + { "OfxParamPropScriptName", prop_defs[PropId::OfxParamPropScriptName], false, true, false }, + { "OfxParamPropParent", prop_defs[PropId::OfxParamPropParent], false, true, false }, + { "OfxParamPropEnabled", prop_defs[PropId::OfxParamPropEnabled], false, true, false }, + { "OfxParamPropDataPtr", prop_defs[PropId::OfxParamPropDataPtr], false, true, false }, + { "OfxPropIcon", prop_defs[PropId::OfxPropIcon], false, true, false }, + { "OfxParamPropInteractV1", prop_defs[PropId::OfxParamPropInteractV1], false, true, false }, + { "OfxParamPropInteractSize", prop_defs[PropId::OfxParamPropInteractSize], false, true, false }, + { "OfxParamPropInteractSizeAspect", prop_defs[PropId::OfxParamPropInteractSizeAspect], false, true, false }, + { "OfxParamPropInteractMinimumSize", prop_defs[PropId::OfxParamPropInteractMinimumSize], false, true, false }, + { "OfxParamPropInteractPreferedSize", prop_defs[PropId::OfxParamPropInteractPreferedSize], false, true, false }, + { "OfxParamPropHasHostOverlayHandle", prop_defs[PropId::OfxParamPropHasHostOverlayHandle], false, true, false }, + { "kOfxParamPropUseHostOverlayHandle", prop_defs[PropId::OfxParamPropUseHostOverlayHandle], false, true, false }, + { "OfxParamPropDefault", prop_defs[PropId::OfxParamPropDefault], false, true, false }, + { "OfxParamPropAnimates", prop_defs[PropId::OfxParamPropAnimates], false, true, false }, + { "OfxParamPropIsAnimating", prop_defs[PropId::OfxParamPropIsAnimating], true, false, false }, + { "OfxParamPropIsAutoKeying", prop_defs[PropId::OfxParamPropIsAutoKeying], true, false, false }, + { "OfxParamPropPersistant", prop_defs[PropId::OfxParamPropPersistant], false, true, false }, + { "OfxParamPropEvaluateOnChange", prop_defs[PropId::OfxParamPropEvaluateOnChange], false, true, false }, + { "OfxParamPropPluginMayWrite", prop_defs[PropId::OfxParamPropPluginMayWrite], false, true, false }, + { "OfxParamPropCacheInvalidation", prop_defs[PropId::OfxParamPropCacheInvalidation], false, true, false }, + { "OfxParamPropCanUndo", prop_defs[PropId::OfxParamPropCanUndo], false, true, false } } }, +// ParamsStrChoice +{ "ParamsStrChoice", { + { "OfxParamPropChoiceOption", prop_defs[PropId::OfxParamPropChoiceOption], false, true, false }, + { "OfxParamPropChoiceEnum", prop_defs[PropId::OfxParamPropChoiceEnum], false, true, false }, + { "OfxPropType", prop_defs[PropId::OfxPropType], false, true, false }, + { "OfxPropName", prop_defs[PropId::OfxPropName], false, true, false }, + { "OfxPropLabel", prop_defs[PropId::OfxPropLabel], false, true, false }, + { "OfxPropShortLabel", prop_defs[PropId::OfxPropShortLabel], false, true, false }, + { "OfxPropLongLabel", prop_defs[PropId::OfxPropLongLabel], false, true, false }, + { "OfxParamPropType", prop_defs[PropId::OfxParamPropType], false, true, false }, + { "OfxParamPropSecret", prop_defs[PropId::OfxParamPropSecret], false, true, false }, + { "OfxParamPropHint", prop_defs[PropId::OfxParamPropHint], false, true, false }, + { "OfxParamPropScriptName", prop_defs[PropId::OfxParamPropScriptName], false, true, false }, + { "OfxParamPropParent", prop_defs[PropId::OfxParamPropParent], false, true, false }, + { "OfxParamPropEnabled", prop_defs[PropId::OfxParamPropEnabled], false, true, false }, + { "OfxParamPropDataPtr", prop_defs[PropId::OfxParamPropDataPtr], false, true, false }, + { "OfxPropIcon", prop_defs[PropId::OfxPropIcon], false, true, false }, + { "OfxParamPropInteractV1", prop_defs[PropId::OfxParamPropInteractV1], false, true, false }, + { "OfxParamPropInteractSize", prop_defs[PropId::OfxParamPropInteractSize], false, true, false }, + { "OfxParamPropInteractSizeAspect", prop_defs[PropId::OfxParamPropInteractSizeAspect], false, true, false }, + { "OfxParamPropInteractMinimumSize", prop_defs[PropId::OfxParamPropInteractMinimumSize], false, true, false }, + { "OfxParamPropInteractPreferedSize", prop_defs[PropId::OfxParamPropInteractPreferedSize], false, true, false }, + { "OfxParamPropHasHostOverlayHandle", prop_defs[PropId::OfxParamPropHasHostOverlayHandle], false, true, false }, + { "kOfxParamPropUseHostOverlayHandle", prop_defs[PropId::OfxParamPropUseHostOverlayHandle], false, true, false }, + { "OfxParamPropDefault", prop_defs[PropId::OfxParamPropDefault], false, true, false }, + { "OfxParamPropAnimates", prop_defs[PropId::OfxParamPropAnimates], false, true, false }, + { "OfxParamPropIsAnimating", prop_defs[PropId::OfxParamPropIsAnimating], true, false, false }, + { "OfxParamPropIsAutoKeying", prop_defs[PropId::OfxParamPropIsAutoKeying], true, false, false }, + { "OfxParamPropPersistant", prop_defs[PropId::OfxParamPropPersistant], false, true, false }, + { "OfxParamPropEvaluateOnChange", prop_defs[PropId::OfxParamPropEvaluateOnChange], false, true, false }, + { "OfxParamPropPluginMayWrite", prop_defs[PropId::OfxParamPropPluginMayWrite], false, true, false }, + { "OfxParamPropCacheInvalidation", prop_defs[PropId::OfxParamPropCacheInvalidation], false, true, false }, + { "OfxParamPropCanUndo", prop_defs[PropId::OfxParamPropCanUndo], false, true, false } } }, +// ParamsString +{ "ParamsString", { + { "OfxParamPropStringMode", prop_defs[PropId::OfxParamPropStringMode], false, true, false }, + { "OfxParamPropStringFilePathExists", prop_defs[PropId::OfxParamPropStringFilePathExists], false, true, false }, + { "OfxPropType", prop_defs[PropId::OfxPropType], false, true, false }, + { "OfxPropName", prop_defs[PropId::OfxPropName], false, true, false }, + { "OfxPropLabel", prop_defs[PropId::OfxPropLabel], false, true, false }, + { "OfxPropShortLabel", prop_defs[PropId::OfxPropShortLabel], false, true, false }, + { "OfxPropLongLabel", prop_defs[PropId::OfxPropLongLabel], false, true, false }, + { "OfxParamPropType", prop_defs[PropId::OfxParamPropType], false, true, false }, + { "OfxParamPropSecret", prop_defs[PropId::OfxParamPropSecret], false, true, false }, + { "OfxParamPropHint", prop_defs[PropId::OfxParamPropHint], false, true, false }, + { "OfxParamPropScriptName", prop_defs[PropId::OfxParamPropScriptName], false, true, false }, + { "OfxParamPropParent", prop_defs[PropId::OfxParamPropParent], false, true, false }, + { "OfxParamPropEnabled", prop_defs[PropId::OfxParamPropEnabled], false, true, false }, + { "OfxParamPropDataPtr", prop_defs[PropId::OfxParamPropDataPtr], false, true, false }, + { "OfxPropIcon", prop_defs[PropId::OfxPropIcon], false, true, false }, + { "OfxParamPropInteractV1", prop_defs[PropId::OfxParamPropInteractV1], false, true, false }, + { "OfxParamPropInteractSize", prop_defs[PropId::OfxParamPropInteractSize], false, true, false }, + { "OfxParamPropInteractSizeAspect", prop_defs[PropId::OfxParamPropInteractSizeAspect], false, true, false }, + { "OfxParamPropInteractMinimumSize", prop_defs[PropId::OfxParamPropInteractMinimumSize], false, true, false }, + { "OfxParamPropInteractPreferedSize", prop_defs[PropId::OfxParamPropInteractPreferedSize], false, true, false }, + { "OfxParamPropHasHostOverlayHandle", prop_defs[PropId::OfxParamPropHasHostOverlayHandle], false, true, false }, + { "kOfxParamPropUseHostOverlayHandle", prop_defs[PropId::OfxParamPropUseHostOverlayHandle], false, true, false }, + { "OfxParamPropDefault", prop_defs[PropId::OfxParamPropDefault], false, true, false }, + { "OfxParamPropAnimates", prop_defs[PropId::OfxParamPropAnimates], false, true, false }, + { "OfxParamPropIsAnimating", prop_defs[PropId::OfxParamPropIsAnimating], true, false, false }, + { "OfxParamPropIsAutoKeying", prop_defs[PropId::OfxParamPropIsAutoKeying], true, false, false }, + { "OfxParamPropPersistant", prop_defs[PropId::OfxParamPropPersistant], false, true, false }, + { "OfxParamPropEvaluateOnChange", prop_defs[PropId::OfxParamPropEvaluateOnChange], false, true, false }, + { "OfxParamPropPluginMayWrite", prop_defs[PropId::OfxParamPropPluginMayWrite], false, true, false }, + { "OfxParamPropCacheInvalidation", prop_defs[PropId::OfxParamPropCacheInvalidation], false, true, false }, + { "OfxParamPropCanUndo", prop_defs[PropId::OfxParamPropCanUndo], false, true, false }, + { "OfxParamPropMin", prop_defs[PropId::OfxParamPropMin], false, true, false }, + { "OfxParamPropMax", prop_defs[PropId::OfxParamPropMax], false, true, false }, + { "OfxParamPropDisplayMin", prop_defs[PropId::OfxParamPropDisplayMin], false, true, false }, + { "OfxParamPropDisplayMax", prop_defs[PropId::OfxParamPropDisplayMax], false, true, false } } }, +}; + +// Actions +static inline const std::array actions { + "CustomParamInterpFunc", + "OfxActionBeginInstanceChanged", + "OfxActionBeginInstanceEdit", + "OfxActionCreateInstance", + "OfxActionDescribe", + "OfxActionDestroyInstance", + "OfxActionEndInstanceChanged", + "OfxActionEndInstanceEdit", + "OfxActionInstanceChanged", + "OfxActionLoad", + "OfxActionPurgeCaches", + "OfxActionSyncPrivateData", + "OfxActionUnload", + "OfxImageEffectActionBeginSequenceRender", + "OfxImageEffectActionDescribeInContext", + "OfxImageEffectActionEndSequenceRender", + "OfxImageEffectActionGetClipPreferences", + "OfxImageEffectActionGetFramesNeeded", + "OfxImageEffectActionGetOutputColourspace", + "OfxImageEffectActionGetRegionOfDefinition", + "OfxImageEffectActionGetRegionsOfInterest", + "OfxImageEffectActionGetTimeDomain", + "OfxImageEffectActionIsIdentity", + "OfxImageEffectActionRender", + "OfxInteractActionDraw", + "OfxInteractActionGainFocus", + "OfxInteractActionKeyDown", + "OfxInteractActionKeyRepeat", + "OfxInteractActionKeyUp", + "OfxInteractActionLoseFocus", + "OfxInteractActionPenDown", + "OfxInteractActionPenMotion", + "OfxInteractActionPenUp", +}; + +// Properties for action args +static inline const std::map, std::vector> action_props { +// CustomParamInterpFunc.inArgs +{ { "CustomParamInterpFunc", "inArgs" }, + { "OfxParamPropCustomValue", + "OfxParamPropInterpolationAmount", + "OfxParamPropInterpolationTime" } }, +// CustomParamInterpFunc.outArgs +{ { "CustomParamInterpFunc", "outArgs" }, + { "OfxParamPropCustomValue", + "OfxParamPropInterpolationTime" } }, +// OfxActionBeginInstanceChanged.inArgs +{ { "OfxActionBeginInstanceChanged", "inArgs" }, + { "OfxPropChangeReason" } }, +// OfxActionEndInstanceChanged.inArgs +{ { "OfxActionEndInstanceChanged", "inArgs" }, + { "OfxPropChangeReason" } }, +// OfxActionInstanceChanged.inArgs +{ { "OfxActionInstanceChanged", "inArgs" }, + { "OfxImageEffectPropRenderScale", + "OfxPropChangeReason", + "OfxPropName", + "OfxPropTime", + "OfxPropType" } }, +// OfxImageEffectActionBeginSequenceRender.inArgs +{ { "OfxImageEffectActionBeginSequenceRender", "inArgs" }, + { "OfxImageEffectPropCudaEnabled", + "OfxImageEffectPropCudaRenderSupported", + "OfxImageEffectPropCudaStream", + "OfxImageEffectPropCudaStreamSupported", + "OfxImageEffectPropFrameRange", + "OfxImageEffectPropFrameStep", + "OfxImageEffectPropInteractiveRenderStatus", + "OfxImageEffectPropInteractiveRenderStatus", + "OfxImageEffectPropMetalCommandQueue", + "OfxImageEffectPropMetalEnabled", + "OfxImageEffectPropMetalRenderSupported", + "OfxImageEffectPropNoSpatialAwareness", + "OfxImageEffectPropOpenCLCommandQueue", + "OfxImageEffectPropOpenCLEnabled", + "OfxImageEffectPropOpenCLImage", + "OfxImageEffectPropOpenCLRenderSupported", + "OfxImageEffectPropOpenCLSupported", + "OfxImageEffectPropOpenGLEnabled", + "OfxImageEffectPropOpenGLTextureIndex", + "OfxImageEffectPropOpenGLTextureTarget", + "OfxImageEffectPropRenderScale", + "OfxImageEffectPropSequentialRenderStatus", + "OfxPropIsInteractive" } }, +// OfxImageEffectActionDescribeInContext.inArgs +{ { "OfxImageEffectActionDescribeInContext", "inArgs" }, + { "OfxImageEffectPropContext" } }, +// OfxImageEffectActionEndSequenceRender.inArgs +{ { "OfxImageEffectActionEndSequenceRender", "inArgs" }, + { "OfxImageEffectPropCudaEnabled", + "OfxImageEffectPropCudaRenderSupported", + "OfxImageEffectPropCudaStream", + "OfxImageEffectPropCudaStreamSupported", + "OfxImageEffectPropFrameRange", + "OfxImageEffectPropFrameStep", + "OfxImageEffectPropInteractiveRenderStatus", + "OfxImageEffectPropInteractiveRenderStatus", + "OfxImageEffectPropMetalCommandQueue", + "OfxImageEffectPropMetalEnabled", + "OfxImageEffectPropMetalRenderSupported", + "OfxImageEffectPropOpenCLCommandQueue", + "OfxImageEffectPropOpenCLEnabled", + "OfxImageEffectPropOpenCLImage", + "OfxImageEffectPropOpenCLRenderSupported", + "OfxImageEffectPropOpenCLSupported", + "OfxImageEffectPropOpenGLEnabled", + "OfxImageEffectPropOpenGLTextureIndex", + "OfxImageEffectPropOpenGLTextureTarget", + "OfxImageEffectPropRenderScale", + "OfxImageEffectPropSequentialRenderStatus", + "OfxPropIsInteractive" } }, +// OfxImageEffectActionGetClipPreferences.outArgs +{ { "OfxImageEffectActionGetClipPreferences", "outArgs" }, + { "OfxImageClipPropContinuousSamples", + "OfxImageClipPropFieldOrder", + "OfxImageEffectFrameVarying", + "OfxImageEffectPropFrameRate", + "OfxImageEffectPropPreMultiplication" } }, +// OfxImageEffectActionGetFramesNeeded.inArgs +{ { "OfxImageEffectActionGetFramesNeeded", "inArgs" }, + { "OfxPropTime" } }, +// OfxImageEffectActionGetFramesNeeded.outArgs +{ { "OfxImageEffectActionGetFramesNeeded", "outArgs" }, + { "OfxImageEffectPropFrameRange" } }, +// OfxImageEffectActionGetOutputColourspace.inArgs +{ { "OfxImageEffectActionGetOutputColourspace", "inArgs" }, + { "OfxImageClipPropPreferredColourspaces" } }, +// OfxImageEffectActionGetOutputColourspace.outArgs +{ { "OfxImageEffectActionGetOutputColourspace", "outArgs" }, + { "OfxImageClipPropColourspace" } }, +// OfxImageEffectActionGetRegionOfDefinition.inArgs +{ { "OfxImageEffectActionGetRegionOfDefinition", "inArgs" }, + { "OfxImageEffectPropRenderScale", + "OfxPropTime" } }, +// OfxImageEffectActionGetRegionOfDefinition.outArgs +{ { "OfxImageEffectActionGetRegionOfDefinition", "outArgs" }, + { "OfxImageEffectPropRegionOfDefinition" } }, +// OfxImageEffectActionGetRegionsOfInterest.inArgs +{ { "OfxImageEffectActionGetRegionsOfInterest", "inArgs" }, + { "OfxImageEffectPropRegionOfInterest", + "OfxImageEffectPropRenderScale", + "OfxPropTime" } }, +// OfxImageEffectActionGetTimeDomain.outArgs +{ { "OfxImageEffectActionGetTimeDomain", "outArgs" }, + { "OfxImageEffectPropFrameRange" } }, +// OfxImageEffectActionIsIdentity.inArgs +{ { "OfxImageEffectActionIsIdentity", "inArgs" }, + { "OfxImageEffectPropFieldToRender", + "OfxImageEffectPropRenderScale", + "OfxImageEffectPropRenderWindow", + "OfxPropTime" } }, +// OfxImageEffectActionRender.inArgs +{ { "OfxImageEffectActionRender", "inArgs" }, + { "OfxImageEffectPropCudaEnabled", + "OfxImageEffectPropCudaRenderSupported", + "OfxImageEffectPropCudaStream", + "OfxImageEffectPropCudaStreamSupported", + "OfxImageEffectPropInteractiveRenderStatus", + "OfxImageEffectPropMetalCommandQueue", + "OfxImageEffectPropMetalEnabled", + "OfxImageEffectPropMetalRenderSupported", + "OfxImageEffectPropNoSpatialAwareness", + "OfxImageEffectPropOpenCLCommandQueue", + "OfxImageEffectPropOpenCLEnabled", + "OfxImageEffectPropOpenCLImage", + "OfxImageEffectPropOpenCLRenderSupported", + "OfxImageEffectPropOpenCLSupported", + "OfxImageEffectPropOpenGLEnabled", + "OfxImageEffectPropOpenGLTextureIndex", + "OfxImageEffectPropOpenGLTextureTarget", + "OfxImageEffectPropRenderQualityDraft", + "OfxImageEffectPropSequentialRenderStatus", + "OfxPropTime" } }, +// OfxInteractActionDraw.inArgs +{ { "OfxInteractActionDraw", "inArgs" }, + { "OfxImageEffectPropRenderScale", + "OfxInteractPropBackgroundColour", + "OfxInteractPropDrawContext", + "OfxInteractPropPixelScale", + "OfxPropEffectInstance", + "OfxPropTime" } }, +// OfxInteractActionGainFocus.inArgs +{ { "OfxInteractActionGainFocus", "inArgs" }, + { "OfxImageEffectPropRenderScale", + "OfxInteractPropBackgroundColour", + "OfxInteractPropPixelScale", + "OfxPropEffectInstance", + "OfxPropTime" } }, +// OfxInteractActionKeyDown.inArgs +{ { "OfxInteractActionKeyDown", "inArgs" }, + { "OfxImageEffectPropRenderScale", + "OfxPropEffectInstance", + "OfxPropTime", + "kOfxPropKeyString", + "kOfxPropKeySym" } }, +// OfxInteractActionKeyRepeat.inArgs +{ { "OfxInteractActionKeyRepeat", "inArgs" }, + { "OfxImageEffectPropRenderScale", + "OfxPropEffectInstance", + "OfxPropTime", + "kOfxPropKeyString", + "kOfxPropKeySym" } }, +// OfxInteractActionKeyUp.inArgs +{ { "OfxInteractActionKeyUp", "inArgs" }, + { "OfxImageEffectPropRenderScale", + "OfxPropEffectInstance", + "OfxPropTime", + "kOfxPropKeyString", + "kOfxPropKeySym" } }, +// OfxInteractActionLoseFocus.inArgs +{ { "OfxInteractActionLoseFocus", "inArgs" }, + { "OfxImageEffectPropRenderScale", + "OfxInteractPropBackgroundColour", + "OfxInteractPropPixelScale", + "OfxPropEffectInstance", + "OfxPropTime" } }, +// OfxInteractActionPenDown.inArgs +{ { "OfxInteractActionPenDown", "inArgs" }, + { "OfxImageEffectPropRenderScale", + "OfxInteractPropBackgroundColour", + "OfxInteractPropPenPosition", + "OfxInteractPropPenPressure", + "OfxInteractPropPenViewportPosition", + "OfxInteractPropPixelScale", + "OfxPropEffectInstance", + "OfxPropTime" } }, +// OfxInteractActionPenMotion.inArgs +{ { "OfxInteractActionPenMotion", "inArgs" }, + { "OfxImageEffectPropRenderScale", + "OfxInteractPropBackgroundColour", + "OfxInteractPropPenPosition", + "OfxInteractPropPenPressure", + "OfxInteractPropPenViewportPosition", + "OfxInteractPropPixelScale", + "OfxPropEffectInstance", + "OfxPropTime" } }, +// OfxInteractActionPenUp.inArgs +{ { "OfxInteractActionPenUp", "inArgs" }, + { "OfxImageEffectPropRenderScale", + "OfxInteractPropBackgroundColour", + "OfxInteractPropPenPosition", + "OfxInteractPropPenPressure", + "OfxInteractPropPenViewportPosition", + "OfxInteractPropPixelScale", + "OfxPropEffectInstance", + "OfxPropTime" } }, +}; + +// Static asserts for standard action names +static_assert(std::string_view("OfxActionBeginInstanceChanged") == std::string_view(kOfxActionBeginInstanceChanged)); +static_assert(std::string_view("OfxActionBeginInstanceEdit") == std::string_view(kOfxActionBeginInstanceEdit)); +static_assert(std::string_view("OfxActionCreateInstance") == std::string_view(kOfxActionCreateInstance)); +static_assert(std::string_view("OfxActionDescribe") == std::string_view(kOfxActionDescribe)); +static_assert(std::string_view("OfxActionDestroyInstance") == std::string_view(kOfxActionDestroyInstance)); +static_assert(std::string_view("OfxActionEndInstanceChanged") == std::string_view(kOfxActionEndInstanceChanged)); +static_assert(std::string_view("OfxActionEndInstanceEdit") == std::string_view(kOfxActionEndInstanceEdit)); +static_assert(std::string_view("OfxActionInstanceChanged") == std::string_view(kOfxActionInstanceChanged)); +static_assert(std::string_view("OfxActionLoad") == std::string_view(kOfxActionLoad)); +static_assert(std::string_view("OfxActionPurgeCaches") == std::string_view(kOfxActionPurgeCaches)); +static_assert(std::string_view("OfxActionSyncPrivateData") == std::string_view(kOfxActionSyncPrivateData)); +static_assert(std::string_view("OfxActionUnload") == std::string_view(kOfxActionUnload)); +static_assert(std::string_view("OfxImageEffectActionBeginSequenceRender") == std::string_view(kOfxImageEffectActionBeginSequenceRender)); +static_assert(std::string_view("OfxImageEffectActionDescribeInContext") == std::string_view(kOfxImageEffectActionDescribeInContext)); +static_assert(std::string_view("OfxImageEffectActionEndSequenceRender") == std::string_view(kOfxImageEffectActionEndSequenceRender)); +static_assert(std::string_view("OfxImageEffectActionGetClipPreferences") == std::string_view(kOfxImageEffectActionGetClipPreferences)); +static_assert(std::string_view("OfxImageEffectActionGetFramesNeeded") == std::string_view(kOfxImageEffectActionGetFramesNeeded)); +static_assert(std::string_view("OfxImageEffectActionGetOutputColourspace") == std::string_view(kOfxImageEffectActionGetOutputColourspace)); +static_assert(std::string_view("OfxImageEffectActionGetRegionOfDefinition") == std::string_view(kOfxImageEffectActionGetRegionOfDefinition)); +static_assert(std::string_view("OfxImageEffectActionGetRegionsOfInterest") == std::string_view(kOfxImageEffectActionGetRegionsOfInterest)); +static_assert(std::string_view("OfxImageEffectActionGetTimeDomain") == std::string_view(kOfxImageEffectActionGetTimeDomain)); +static_assert(std::string_view("OfxImageEffectActionIsIdentity") == std::string_view(kOfxImageEffectActionIsIdentity)); +static_assert(std::string_view("OfxImageEffectActionRender") == std::string_view(kOfxImageEffectActionRender)); +static_assert(std::string_view("OfxInteractActionDraw") == std::string_view(kOfxInteractActionDraw)); +static_assert(std::string_view("OfxInteractActionGainFocus") == std::string_view(kOfxInteractActionGainFocus)); +static_assert(std::string_view("OfxInteractActionKeyDown") == std::string_view(kOfxInteractActionKeyDown)); +static_assert(std::string_view("OfxInteractActionKeyRepeat") == std::string_view(kOfxInteractActionKeyRepeat)); +static_assert(std::string_view("OfxInteractActionKeyUp") == std::string_view(kOfxInteractActionKeyUp)); +static_assert(std::string_view("OfxInteractActionLoseFocus") == std::string_view(kOfxInteractActionLoseFocus)); +static_assert(std::string_view("OfxInteractActionPenDown") == std::string_view(kOfxInteractActionPenDown)); +static_assert(std::string_view("OfxInteractActionPenMotion") == std::string_view(kOfxInteractActionPenMotion)); +static_assert(std::string_view("OfxInteractActionPenUp") == std::string_view(kOfxInteractActionPenUp)); +} // namespace openfx diff --git a/openfx-cpp/include/openfx/ofxPropsMetadata.h b/openfx-cpp/include/openfx/ofxPropsMetadata.h new file mode 100644 index 000000000..c81dbd698 --- /dev/null +++ b/openfx-cpp/include/openfx/ofxPropsMetadata.h @@ -0,0 +1,1240 @@ +// Copyright OpenFX and contributors to the OpenFX project. +// SPDX-License-Identifier: BSD-3-Clause +// NOTE: This file is auto-generated by gen-props.py. DO NOT EDIT. + +#pragma once + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "ofxSpan.h" + +namespace openfx { +enum class PropType { + Int, + Double, + Enum, + Bool, + String, + Pointer +}; + +// Each prop has a PropId:: enum, a runtime-accessible PropDef struct, and a compile-time PropTraits. +// These can be used by Support/include/PropsAccess.h for type-safe property access. + +//Property ID enum for compile-time lookup and type safety +enum class PropId { + OfxImageClipPropColourspace, // 0 + OfxImageClipPropConnected, // 1 + OfxImageClipPropContinuousSamples, // 2 + OfxImageClipPropFieldExtraction, // 3 + OfxImageClipPropFieldOrder, // 4 + OfxImageClipPropIsMask, // 5 + OfxImageClipPropOptional, // 6 + OfxImageClipPropPreferredColourspaces, // 7 + OfxImageClipPropUnmappedComponents, // 8 + OfxImageClipPropUnmappedPixelDepth, // 9 + OfxImageEffectFrameVarying, // 10 + OfxImageEffectHostPropIsBackground, // 11 + OfxImageEffectHostPropNativeOrigin, // 12 + OfxImageEffectInstancePropEffectDuration, // 13 + OfxImageEffectInstancePropSequentialRender, // 14 + OfxImageEffectPluginPropFieldRenderTwiceAlways, // 15 + OfxImageEffectPluginPropGrouping, // 16 + OfxImageEffectPluginPropHostFrameThreading, // 17 + OfxImageEffectPluginPropOverlayInteractV1, // 18 + OfxImageEffectPluginPropOverlayInteractV2, // 19 + OfxImageEffectPluginPropSingleInstance, // 20 + OfxImageEffectPluginRenderThreadSafety, // 21 + OfxImageEffectPropClipPreferencesSlaveParam, // 22 + OfxImageEffectPropColourManagementAvailableConfigs, // 23 + OfxImageEffectPropColourManagementConfig, // 24 + OfxImageEffectPropColourManagementStyle, // 25 + OfxImageEffectPropComponents, // 26 + OfxImageEffectPropContext, // 27 + OfxImageEffectPropCudaEnabled, // 28 + OfxImageEffectPropCudaRenderSupported, // 29 + OfxImageEffectPropCudaStream, // 30 + OfxImageEffectPropCudaStreamSupported, // 31 + OfxImageEffectPropDisplayColourspace, // 32 + OfxImageEffectPropFieldToRender, // 33 + OfxImageEffectPropFrameRange, // 34 + OfxImageEffectPropFrameRate, // 35 + OfxImageEffectPropFrameStep, // 36 + OfxImageEffectPropInAnalysis, // 37 + OfxImageEffectPropInteractiveRenderStatus, // 38 + OfxImageEffectPropMetalCommandQueue, // 39 + OfxImageEffectPropMetalEnabled, // 40 + OfxImageEffectPropMetalRenderSupported, // 41 + OfxImageEffectPropMultipleClipDepths, // 42 + OfxImageEffectPropNoSpatialAwareness, // 43 + OfxImageEffectPropOCIOConfig, // 44 + OfxImageEffectPropOCIODisplay, // 45 + OfxImageEffectPropOCIOView, // 46 + OfxImageEffectPropOpenCLCommandQueue, // 47 + OfxImageEffectPropOpenCLEnabled, // 48 + OfxImageEffectPropOpenCLImage, // 49 + OfxImageEffectPropOpenCLRenderSupported, // 50 + OfxImageEffectPropOpenCLSupported, // 51 + OfxImageEffectPropOpenGLEnabled, // 52 + OfxImageEffectPropOpenGLRenderSupported, // 53 + OfxImageEffectPropOpenGLTextureIndex, // 54 + OfxImageEffectPropOpenGLTextureTarget, // 55 + OfxImageEffectPropPixelAspectRatio, // 56 + OfxImageEffectPropPixelDepth, // 57 + OfxImageEffectPropPluginHandle, // 58 + OfxImageEffectPropPreMultiplication, // 59 + OfxImageEffectPropProjectExtent, // 60 + OfxImageEffectPropProjectOffset, // 61 + OfxImageEffectPropProjectSize, // 62 + OfxImageEffectPropRegionOfDefinition, // 63 + OfxImageEffectPropRegionOfInterest, // 64 + OfxImageEffectPropRenderQualityDraft, // 65 + OfxImageEffectPropRenderScale, // 66 + OfxImageEffectPropRenderWindow, // 67 + OfxImageEffectPropSequentialRenderStatus, // 68 + OfxImageEffectPropSetableFielding, // 69 + OfxImageEffectPropSetableFrameRate, // 70 + OfxImageEffectPropSupportedComponents, // 71 + OfxImageEffectPropSupportedContexts, // 72 + OfxImageEffectPropSupportedPixelDepths, // 73 + OfxImageEffectPropSupportsMultiResolution, // 74 + OfxImageEffectPropSupportsMultipleClipPARs, // 75 + OfxImageEffectPropSupportsOverlays, // 76 + OfxImageEffectPropSupportsTiles, // 77 + OfxImageEffectPropTemporalClipAccess, // 78 + OfxImageEffectPropUnmappedFrameRange, // 79 + OfxImageEffectPropUnmappedFrameRate, // 80 + OfxImagePropBounds, // 81 + OfxImagePropData, // 82 + OfxImagePropField, // 83 + OfxImagePropPixelAspectRatio, // 84 + OfxImagePropRegionOfDefinition, // 85 + OfxImagePropRowBytes, // 86 + OfxImagePropUniqueIdentifier, // 87 + OfxInteractPropBackgroundColour, // 88 + OfxInteractPropBitDepth, // 89 + OfxInteractPropDrawContext, // 90 + OfxInteractPropHasAlpha, // 91 + OfxInteractPropPenPosition, // 92 + OfxInteractPropPenPressure, // 93 + OfxInteractPropPenViewportPosition, // 94 + OfxInteractPropPixelScale, // 95 + OfxInteractPropSlaveToParam, // 96 + OfxInteractPropSuggestedColour, // 97 + OfxInteractPropViewport, // 98 + OfxOpenGLPropPixelDepth, // 99 + OfxParamHostPropMaxPages, // 100 + OfxParamHostPropMaxParameters, // 101 + OfxParamHostPropPageRowColumnCount, // 102 + OfxParamHostPropSupportsBooleanAnimation, // 103 + OfxParamHostPropSupportsChoiceAnimation, // 104 + OfxParamHostPropSupportsCustomAnimation, // 105 + OfxParamHostPropSupportsCustomInteract, // 106 + OfxParamHostPropSupportsParametricAnimation, // 107 + OfxParamHostPropSupportsStrChoice, // 108 + OfxParamHostPropSupportsStrChoiceAnimation, // 109 + OfxParamHostPropSupportsStringAnimation, // 110 + OfxParamPropAnimates, // 111 + OfxParamPropCacheInvalidation, // 112 + OfxParamPropCanUndo, // 113 + OfxParamPropChoiceEnum, // 114 + OfxParamPropChoiceOption, // 115 + OfxParamPropChoiceOrder, // 116 + OfxParamPropCustomCallbackV1, // 117 + OfxParamPropCustomValue, // 118 + OfxParamPropDataPtr, // 119 + OfxParamPropDefault, // 120 + OfxParamPropDefaultCoordinateSystem, // 121 + OfxParamPropDigits, // 122 + OfxParamPropDimensionLabel, // 123 + OfxParamPropDisplayMax, // 124 + OfxParamPropDisplayMin, // 125 + OfxParamPropDoubleType, // 126 + OfxParamPropEnabled, // 127 + OfxParamPropEvaluateOnChange, // 128 + OfxParamPropGroupOpen, // 129 + OfxParamPropHasHostOverlayHandle, // 130 + OfxParamPropHint, // 131 + OfxParamPropIncrement, // 132 + OfxParamPropInteractMinimumSize, // 133 + OfxParamPropInteractPreferedSize, // 134 + OfxParamPropInteractSize, // 135 + OfxParamPropInteractSizeAspect, // 136 + OfxParamPropInteractV1, // 137 + OfxParamPropInterpolationAmount, // 138 + OfxParamPropInterpolationTime, // 139 + OfxParamPropIsAnimating, // 140 + OfxParamPropIsAutoKeying, // 141 + OfxParamPropMax, // 142 + OfxParamPropMin, // 143 + OfxParamPropPageChild, // 144 + OfxParamPropParametricDimension, // 145 + OfxParamPropParametricInteractBackground, // 146 + OfxParamPropParametricRange, // 147 + OfxParamPropParametricUIColour, // 148 + OfxParamPropParent, // 149 + OfxParamPropPersistant, // 150 + OfxParamPropPluginMayWrite, // 151 + OfxParamPropScriptName, // 152 + OfxParamPropSecret, // 153 + OfxParamPropShowTimeMarker, // 154 + OfxParamPropStringFilePathExists, // 155 + OfxParamPropStringMode, // 156 + OfxParamPropType, // 157 + OfxPluginPropFilePath, // 158 + OfxPluginPropParamPageOrder, // 159 + OfxPropAPIVersion, // 160 + OfxPropChangeReason, // 161 + OfxPropEffectInstance, // 162 + OfxPropHostOSHandle, // 163 + OfxPropIcon, // 164 + OfxPropInstanceData, // 165 + OfxPropIsInteractive, // 166 + OfxPropLabel, // 167 + OfxPropLongLabel, // 168 + OfxPropName, // 169 + OfxPropParamSetNeedsSyncing, // 170 + OfxPropPluginDescription, // 171 + OfxPropShortLabel, // 172 + OfxPropTime, // 173 + OfxPropType, // 174 + OfxPropVersion, // 175 + OfxPropVersionLabel, // 176 + OfxParamPropUseHostOverlayHandle, // 177 (orig name: OfxParamPropUseHostOverlayHandle) + OfxPropKeyString, // 178 (orig name: OfxPropKeyString) + OfxPropKeySym, // 179 (orig name: OfxPropKeySym) + NProps // 180 +}; // PropId + +// Separate arrays for enum-values for enum props, to keep everything constexpr +namespace prop_enum_values { +constexpr std::array OfxImageClipPropFieldExtraction = + {"OfxImageFieldNone","OfxImageFieldLower","OfxImageFieldUpper","OfxImageFieldBoth","OfxImageFieldSingle","OfxImageFieldDoubled"}; +constexpr std::array OfxImageClipPropFieldOrder = + {"OfxImageFieldNone","OfxImageFieldLower","OfxImageFieldUpper"}; +constexpr std::array OfxImageClipPropUnmappedComponents = + {"OfxImageComponentNone","OfxImageComponentRGBA","OfxImageComponentRGB","OfxImageComponentAlpha"}; +constexpr std::array OfxImageClipPropUnmappedPixelDepth = + {"OfxBitDepthNone","OfxBitDepthByte","OfxBitDepthShort","OfxBitDepthHalf","OfxBitDepthFloat"}; +constexpr std::array OfxImageEffectHostPropNativeOrigin = + {"OfxImageEffectHostPropNativeOriginBottomLeft","OfxImageEffectHostPropNativeOriginTopLeft","OfxImageEffectHostPropNativeOriginCenter"}; +constexpr std::array OfxImageEffectPluginRenderThreadSafety = + {"OfxImageEffectRenderUnsafe","OfxImageEffectRenderInstanceSafe","OfxImageEffectRenderFullySafe"}; +constexpr std::array OfxImageEffectPropColourManagementStyle = + {"OfxImageEffectPropColourManagementNone","OfxImageEffectPropColourManagementBasic","OfxImageEffectPropColourManagementCore","OfxImageEffectPropColourManagementFull","OfxImageEffectPropColourManagementOCIO"}; +constexpr std::array OfxImageEffectPropComponents = + {"OfxImageComponentNone","OfxImageComponentRGBA","OfxImageComponentRGB","OfxImageComponentAlpha"}; +constexpr std::array OfxImageEffectPropContext = + {"OfxImageEffectContextGenerator","OfxImageEffectContextFilter","OfxImageEffectContextTransition","OfxImageEffectContextPaint","OfxImageEffectContextGeneral","OfxImageEffectContextRetimer"}; +constexpr std::array OfxImageEffectPropCudaRenderSupported = + {"false","true","needed"}; +constexpr std::array OfxImageEffectPropCudaStreamSupported = + {"false","true","needed"}; +constexpr std::array OfxImageEffectPropFieldToRender = + {"OfxImageFieldNone","OfxImageFieldBoth","OfxImageFieldLower","OfxImageFieldUpper"}; +constexpr std::array OfxImageEffectPropMetalRenderSupported = + {"false","true","needed"}; +constexpr std::array OfxImageEffectPropNoSpatialAwareness = + {"false","true"}; +constexpr std::array OfxImageEffectPropOpenCLRenderSupported = + {"false","true","needed"}; +constexpr std::array OfxImageEffectPropOpenCLSupported = + {"false","true"}; +constexpr std::array OfxImageEffectPropOpenGLRenderSupported = + {"false","true","needed"}; +constexpr std::array OfxImageEffectPropPixelDepth = + {"OfxBitDepthNone","OfxBitDepthByte","OfxBitDepthShort","OfxBitDepthHalf","OfxBitDepthFloat"}; +constexpr std::array OfxImageEffectPropPreMultiplication = + {"OfxImageOpaque","OfxImagePreMultiplied","OfxImageUnPreMultiplied"}; +constexpr std::array OfxImageEffectPropSupportedComponents = + {"OfxImageComponentNone","OfxImageComponentRGBA","OfxImageComponentRGB","OfxImageComponentAlpha"}; +constexpr std::array OfxImageEffectPropSupportedContexts = + {"OfxImageEffectContextGenerator","OfxImageEffectContextFilter","OfxImageEffectContextTransition","OfxImageEffectContextPaint","OfxImageEffectContextGeneral","OfxImageEffectContextRetimer"}; +constexpr std::array OfxImageEffectPropSupportedPixelDepths = + {"OfxBitDepthNone","OfxBitDepthByte","OfxBitDepthShort","OfxBitDepthHalf","OfxBitDepthFloat"}; +constexpr std::array OfxImagePropField = + {"OfxImageFieldNone","OfxImageFieldBoth","OfxImageFieldLower","OfxImageFieldUpper"}; +constexpr std::array OfxOpenGLPropPixelDepth = + {"OfxBitDepthNone","OfxBitDepthByte","OfxBitDepthShort","OfxBitDepthHalf","OfxBitDepthFloat"}; +constexpr std::array OfxParamPropCacheInvalidation = + {"OfxParamInvalidateValueChange","OfxParamInvalidateValueChangeToEnd","OfxParamInvalidateAll"}; +constexpr std::array OfxParamPropDefaultCoordinateSystem = + {"OfxParamCoordinatesCanonical","OfxParamCoordinatesNormalised"}; +constexpr std::array OfxParamPropDoubleType = + {"OfxParamDoubleTypePlain","OfxParamDoubleTypeAngle","OfxParamDoubleTypeScale","OfxParamDoubleTypeTime","OfxParamDoubleTypeAbsoluteTime","OfxParamDoubleTypeX","OfxParamDoubleTypeXAbsolute","OfxParamDoubleTypeY","OfxParamDoubleTypeYAbsolute","OfxParamDoubleTypeXY","OfxParamDoubleTypeXYAbsolute"}; +constexpr std::array OfxParamPropStringMode = + {"OfxParamStringIsSingleLine","OfxParamStringIsMultiLine","OfxParamStringIsFilePath","OfxParamStringIsDirectoryPath","OfxParamStringIsLabel","OfxParamStringIsRichTextFormat"}; +constexpr std::array OfxPropChangeReason = + {"OfxChangeUserEdited","OfxChangePluginEdited","OfxChangeTime"}; +} // namespace prop_enum_values + + +// Property type arrays for spans (generated before PropDef) +namespace prop_type_arrays { +static constexpr PropType OfxImageClipPropColourspace_types[] = {PropType::String}; +static constexpr PropType OfxImageClipPropConnected_types[] = {PropType::Bool}; +static constexpr PropType OfxImageClipPropContinuousSamples_types[] = {PropType::Bool}; +static constexpr PropType OfxImageClipPropFieldExtraction_types[] = {PropType::Enum}; +static constexpr PropType OfxImageClipPropFieldOrder_types[] = {PropType::Enum}; +static constexpr PropType OfxImageClipPropIsMask_types[] = {PropType::Bool}; +static constexpr PropType OfxImageClipPropOptional_types[] = {PropType::Bool}; +static constexpr PropType OfxImageClipPropPreferredColourspaces_types[] = {PropType::String}; +static constexpr PropType OfxImageClipPropUnmappedComponents_types[] = {PropType::Enum}; +static constexpr PropType OfxImageClipPropUnmappedPixelDepth_types[] = {PropType::Enum}; +static constexpr PropType OfxImageEffectFrameVarying_types[] = {PropType::Bool}; +static constexpr PropType OfxImageEffectHostPropIsBackground_types[] = {PropType::Bool}; +static constexpr PropType OfxImageEffectHostPropNativeOrigin_types[] = {PropType::Enum}; +static constexpr PropType OfxImageEffectInstancePropEffectDuration_types[] = {PropType::Double}; +static constexpr PropType OfxImageEffectInstancePropSequentialRender_types[] = {PropType::Bool}; +static constexpr PropType OfxImageEffectPluginPropFieldRenderTwiceAlways_types[] = {PropType::Bool}; +static constexpr PropType OfxImageEffectPluginPropGrouping_types[] = {PropType::String}; +static constexpr PropType OfxImageEffectPluginPropHostFrameThreading_types[] = {PropType::Bool}; +static constexpr PropType OfxImageEffectPluginPropOverlayInteractV1_types[] = {PropType::Pointer}; +static constexpr PropType OfxImageEffectPluginPropOverlayInteractV2_types[] = {PropType::Pointer}; +static constexpr PropType OfxImageEffectPluginPropSingleInstance_types[] = {PropType::Bool}; +static constexpr PropType OfxImageEffectPluginRenderThreadSafety_types[] = {PropType::Enum}; +static constexpr PropType OfxImageEffectPropClipPreferencesSlaveParam_types[] = {PropType::String}; +static constexpr PropType OfxImageEffectPropColourManagementAvailableConfigs_types[] = {PropType::String}; +static constexpr PropType OfxImageEffectPropColourManagementConfig_types[] = {PropType::String}; +static constexpr PropType OfxImageEffectPropColourManagementStyle_types[] = {PropType::Enum}; +static constexpr PropType OfxImageEffectPropComponents_types[] = {PropType::Enum}; +static constexpr PropType OfxImageEffectPropContext_types[] = {PropType::Enum}; +static constexpr PropType OfxImageEffectPropCudaEnabled_types[] = {PropType::Bool}; +static constexpr PropType OfxImageEffectPropCudaRenderSupported_types[] = {PropType::Enum}; +static constexpr PropType OfxImageEffectPropCudaStream_types[] = {PropType::Pointer}; +static constexpr PropType OfxImageEffectPropCudaStreamSupported_types[] = {PropType::Enum}; +static constexpr PropType OfxImageEffectPropDisplayColourspace_types[] = {PropType::String}; +static constexpr PropType OfxImageEffectPropFieldToRender_types[] = {PropType::Enum}; +static constexpr PropType OfxImageEffectPropFrameRange_types[] = {PropType::Double}; +static constexpr PropType OfxImageEffectPropFrameRate_types[] = {PropType::Double}; +static constexpr PropType OfxImageEffectPropFrameStep_types[] = {PropType::Double}; +static constexpr PropType OfxImageEffectPropInAnalysis_types[] = {PropType::Bool}; +static constexpr PropType OfxImageEffectPropInteractiveRenderStatus_types[] = {PropType::Bool}; +static constexpr PropType OfxImageEffectPropMetalCommandQueue_types[] = {PropType::Pointer}; +static constexpr PropType OfxImageEffectPropMetalEnabled_types[] = {PropType::Bool}; +static constexpr PropType OfxImageEffectPropMetalRenderSupported_types[] = {PropType::Enum}; +static constexpr PropType OfxImageEffectPropMultipleClipDepths_types[] = {PropType::Bool}; +static constexpr PropType OfxImageEffectPropNoSpatialAwareness_types[] = {PropType::Enum}; +static constexpr PropType OfxImageEffectPropOCIOConfig_types[] = {PropType::String}; +static constexpr PropType OfxImageEffectPropOCIODisplay_types[] = {PropType::String}; +static constexpr PropType OfxImageEffectPropOCIOView_types[] = {PropType::String}; +static constexpr PropType OfxImageEffectPropOpenCLCommandQueue_types[] = {PropType::Pointer}; +static constexpr PropType OfxImageEffectPropOpenCLEnabled_types[] = {PropType::Bool}; +static constexpr PropType OfxImageEffectPropOpenCLImage_types[] = {PropType::Pointer}; +static constexpr PropType OfxImageEffectPropOpenCLRenderSupported_types[] = {PropType::Enum}; +static constexpr PropType OfxImageEffectPropOpenCLSupported_types[] = {PropType::Enum}; +static constexpr PropType OfxImageEffectPropOpenGLEnabled_types[] = {PropType::Bool}; +static constexpr PropType OfxImageEffectPropOpenGLRenderSupported_types[] = {PropType::Enum}; +static constexpr PropType OfxImageEffectPropOpenGLTextureIndex_types[] = {PropType::Int}; +static constexpr PropType OfxImageEffectPropOpenGLTextureTarget_types[] = {PropType::Int}; +static constexpr PropType OfxImageEffectPropPixelAspectRatio_types[] = {PropType::Double}; +static constexpr PropType OfxImageEffectPropPixelDepth_types[] = {PropType::Enum}; +static constexpr PropType OfxImageEffectPropPluginHandle_types[] = {PropType::Pointer}; +static constexpr PropType OfxImageEffectPropPreMultiplication_types[] = {PropType::Enum}; +static constexpr PropType OfxImageEffectPropProjectExtent_types[] = {PropType::Double}; +static constexpr PropType OfxImageEffectPropProjectOffset_types[] = {PropType::Double}; +static constexpr PropType OfxImageEffectPropProjectSize_types[] = {PropType::Double}; +static constexpr PropType OfxImageEffectPropRegionOfDefinition_types[] = {PropType::Double}; +static constexpr PropType OfxImageEffectPropRegionOfInterest_types[] = {PropType::Double}; +static constexpr PropType OfxImageEffectPropRenderQualityDraft_types[] = {PropType::Bool}; +static constexpr PropType OfxImageEffectPropRenderScale_types[] = {PropType::Double}; +static constexpr PropType OfxImageEffectPropRenderWindow_types[] = {PropType::Int}; +static constexpr PropType OfxImageEffectPropSequentialRenderStatus_types[] = {PropType::Bool}; +static constexpr PropType OfxImageEffectPropSetableFielding_types[] = {PropType::Bool}; +static constexpr PropType OfxImageEffectPropSetableFrameRate_types[] = {PropType::Bool}; +static constexpr PropType OfxImageEffectPropSupportedComponents_types[] = {PropType::Enum}; +static constexpr PropType OfxImageEffectPropSupportedContexts_types[] = {PropType::Enum}; +static constexpr PropType OfxImageEffectPropSupportedPixelDepths_types[] = {PropType::Enum}; +static constexpr PropType OfxImageEffectPropSupportsMultiResolution_types[] = {PropType::Bool}; +static constexpr PropType OfxImageEffectPropSupportsMultipleClipPARs_types[] = {PropType::Bool}; +static constexpr PropType OfxImageEffectPropSupportsOverlays_types[] = {PropType::Bool}; +static constexpr PropType OfxImageEffectPropSupportsTiles_types[] = {PropType::Bool}; +static constexpr PropType OfxImageEffectPropTemporalClipAccess_types[] = {PropType::Bool}; +static constexpr PropType OfxImageEffectPropUnmappedFrameRange_types[] = {PropType::Double}; +static constexpr PropType OfxImageEffectPropUnmappedFrameRate_types[] = {PropType::Double}; +static constexpr PropType OfxImagePropBounds_types[] = {PropType::Int}; +static constexpr PropType OfxImagePropData_types[] = {PropType::Pointer}; +static constexpr PropType OfxImagePropField_types[] = {PropType::Enum}; +static constexpr PropType OfxImagePropPixelAspectRatio_types[] = {PropType::Double}; +static constexpr PropType OfxImagePropRegionOfDefinition_types[] = {PropType::Int}; +static constexpr PropType OfxImagePropRowBytes_types[] = {PropType::Int}; +static constexpr PropType OfxImagePropUniqueIdentifier_types[] = {PropType::String}; +static constexpr PropType OfxInteractPropBackgroundColour_types[] = {PropType::Double}; +static constexpr PropType OfxInteractPropBitDepth_types[] = {PropType::Int}; +static constexpr PropType OfxInteractPropDrawContext_types[] = {PropType::Pointer}; +static constexpr PropType OfxInteractPropHasAlpha_types[] = {PropType::Bool}; +static constexpr PropType OfxInteractPropPenPosition_types[] = {PropType::Double}; +static constexpr PropType OfxInteractPropPenPressure_types[] = {PropType::Double}; +static constexpr PropType OfxInteractPropPenViewportPosition_types[] = {PropType::Int}; +static constexpr PropType OfxInteractPropPixelScale_types[] = {PropType::Double}; +static constexpr PropType OfxInteractPropSlaveToParam_types[] = {PropType::String}; +static constexpr PropType OfxInteractPropSuggestedColour_types[] = {PropType::Double}; +static constexpr PropType OfxInteractPropViewport_types[] = {PropType::Int}; +static constexpr PropType OfxOpenGLPropPixelDepth_types[] = {PropType::Enum}; +static constexpr PropType OfxParamHostPropMaxPages_types[] = {PropType::Int}; +static constexpr PropType OfxParamHostPropMaxParameters_types[] = {PropType::Int}; +static constexpr PropType OfxParamHostPropPageRowColumnCount_types[] = {PropType::Int}; +static constexpr PropType OfxParamHostPropSupportsBooleanAnimation_types[] = {PropType::Bool}; +static constexpr PropType OfxParamHostPropSupportsChoiceAnimation_types[] = {PropType::Bool}; +static constexpr PropType OfxParamHostPropSupportsCustomAnimation_types[] = {PropType::Bool}; +static constexpr PropType OfxParamHostPropSupportsCustomInteract_types[] = {PropType::Bool}; +static constexpr PropType OfxParamHostPropSupportsParametricAnimation_types[] = {PropType::Bool}; +static constexpr PropType OfxParamHostPropSupportsStrChoice_types[] = {PropType::Bool}; +static constexpr PropType OfxParamHostPropSupportsStrChoiceAnimation_types[] = {PropType::Bool}; +static constexpr PropType OfxParamHostPropSupportsStringAnimation_types[] = {PropType::Bool}; +static constexpr PropType OfxParamPropAnimates_types[] = {PropType::Bool}; +static constexpr PropType OfxParamPropCacheInvalidation_types[] = {PropType::Enum}; +static constexpr PropType OfxParamPropCanUndo_types[] = {PropType::Bool}; +static constexpr PropType OfxParamPropChoiceEnum_types[] = {PropType::Bool}; +static constexpr PropType OfxParamPropChoiceOption_types[] = {PropType::String}; +static constexpr PropType OfxParamPropChoiceOrder_types[] = {PropType::Int}; +static constexpr PropType OfxParamPropCustomCallbackV1_types[] = {PropType::Pointer}; +static constexpr PropType OfxParamPropCustomValue_types[] = {PropType::String}; +static constexpr PropType OfxParamPropDataPtr_types[] = {PropType::Pointer}; +static constexpr PropType OfxParamPropDefault_types[] = {PropType::Int,PropType::Double,PropType::String,PropType::Pointer}; +static constexpr PropType OfxParamPropDefaultCoordinateSystem_types[] = {PropType::Enum}; +static constexpr PropType OfxParamPropDigits_types[] = {PropType::Int}; +static constexpr PropType OfxParamPropDimensionLabel_types[] = {PropType::String}; +static constexpr PropType OfxParamPropDisplayMax_types[] = {PropType::Int,PropType::Double}; +static constexpr PropType OfxParamPropDisplayMin_types[] = {PropType::Int,PropType::Double}; +static constexpr PropType OfxParamPropDoubleType_types[] = {PropType::Enum}; +static constexpr PropType OfxParamPropEnabled_types[] = {PropType::Bool}; +static constexpr PropType OfxParamPropEvaluateOnChange_types[] = {PropType::Bool}; +static constexpr PropType OfxParamPropGroupOpen_types[] = {PropType::Bool}; +static constexpr PropType OfxParamPropHasHostOverlayHandle_types[] = {PropType::Bool}; +static constexpr PropType OfxParamPropHint_types[] = {PropType::String}; +static constexpr PropType OfxParamPropIncrement_types[] = {PropType::Double}; +static constexpr PropType OfxParamPropInteractMinimumSize_types[] = {PropType::Double}; +static constexpr PropType OfxParamPropInteractPreferedSize_types[] = {PropType::Int}; +static constexpr PropType OfxParamPropInteractSize_types[] = {PropType::Double}; +static constexpr PropType OfxParamPropInteractSizeAspect_types[] = {PropType::Double}; +static constexpr PropType OfxParamPropInteractV1_types[] = {PropType::Pointer}; +static constexpr PropType OfxParamPropInterpolationAmount_types[] = {PropType::Double}; +static constexpr PropType OfxParamPropInterpolationTime_types[] = {PropType::Double}; +static constexpr PropType OfxParamPropIsAnimating_types[] = {PropType::Bool}; +static constexpr PropType OfxParamPropIsAutoKeying_types[] = {PropType::Bool}; +static constexpr PropType OfxParamPropMax_types[] = {PropType::Int,PropType::Double}; +static constexpr PropType OfxParamPropMin_types[] = {PropType::Int,PropType::Double}; +static constexpr PropType OfxParamPropPageChild_types[] = {PropType::String}; +static constexpr PropType OfxParamPropParametricDimension_types[] = {PropType::Int}; +static constexpr PropType OfxParamPropParametricInteractBackground_types[] = {PropType::Pointer}; +static constexpr PropType OfxParamPropParametricRange_types[] = {PropType::Double}; +static constexpr PropType OfxParamPropParametricUIColour_types[] = {PropType::Double}; +static constexpr PropType OfxParamPropParent_types[] = {PropType::String}; +static constexpr PropType OfxParamPropPersistant_types[] = {PropType::Bool}; +static constexpr PropType OfxParamPropPluginMayWrite_types[] = {PropType::Bool}; +static constexpr PropType OfxParamPropScriptName_types[] = {PropType::String}; +static constexpr PropType OfxParamPropSecret_types[] = {PropType::Bool}; +static constexpr PropType OfxParamPropShowTimeMarker_types[] = {PropType::Bool}; +static constexpr PropType OfxParamPropStringFilePathExists_types[] = {PropType::Bool}; +static constexpr PropType OfxParamPropStringMode_types[] = {PropType::Enum}; +static constexpr PropType OfxParamPropType_types[] = {PropType::String}; +static constexpr PropType OfxPluginPropFilePath_types[] = {PropType::String}; +static constexpr PropType OfxPluginPropParamPageOrder_types[] = {PropType::String}; +static constexpr PropType OfxPropAPIVersion_types[] = {PropType::Int}; +static constexpr PropType OfxPropChangeReason_types[] = {PropType::Enum}; +static constexpr PropType OfxPropEffectInstance_types[] = {PropType::Pointer}; +static constexpr PropType OfxPropHostOSHandle_types[] = {PropType::Pointer}; +static constexpr PropType OfxPropIcon_types[] = {PropType::String}; +static constexpr PropType OfxPropInstanceData_types[] = {PropType::Pointer}; +static constexpr PropType OfxPropIsInteractive_types[] = {PropType::Bool}; +static constexpr PropType OfxPropLabel_types[] = {PropType::String}; +static constexpr PropType OfxPropLongLabel_types[] = {PropType::String}; +static constexpr PropType OfxPropName_types[] = {PropType::String}; +static constexpr PropType OfxPropParamSetNeedsSyncing_types[] = {PropType::Bool}; +static constexpr PropType OfxPropPluginDescription_types[] = {PropType::String}; +static constexpr PropType OfxPropShortLabel_types[] = {PropType::String}; +static constexpr PropType OfxPropTime_types[] = {PropType::Double}; +static constexpr PropType OfxPropType_types[] = {PropType::String}; +static constexpr PropType OfxPropVersion_types[] = {PropType::Int}; +static constexpr PropType OfxPropVersionLabel_types[] = {PropType::String}; +static constexpr PropType kOfxParamPropUseHostOverlayHandle_types[] = {PropType::Bool}; +static constexpr PropType kOfxPropKeyString_types[] = {PropType::String}; +static constexpr PropType kOfxPropKeySym_types[] = {PropType::Int}; +} // namespace prop_type_arrays + + +struct PropDef { + const char* name; // Property name + openfx::span supportedTypes; // Supported data types + int dimension; // Property dimension (0 for variable) + openfx::span enumValues; // Valid values for enum properties +}; + +// Array type for storing all PropDefs, indexed by PropId for simplicity +template +struct PropDefsArray { + static constexpr size_t Size = static_cast(MaxValue); + std::array data; + + // constexpr T& operator[](PropId index) { + // return data[static_cast(index)]; + // } + + constexpr const T& operator[](PropId index) const { + return data[static_cast(index)]; + } + constexpr const T& operator[](size_t index) const { + return data[index]; + } +}; + +// Property definitions +static inline constexpr PropDefsArray prop_defs = { + {{ +{ "OfxImageClipPropColourspace", + openfx::span(prop_type_arrays::OfxImageClipPropColourspace_types, 1), 1, openfx::span()}, +{ "OfxImageClipPropConnected", + openfx::span(prop_type_arrays::OfxImageClipPropConnected_types, 1), 1, openfx::span()}, +{ "OfxImageClipPropContinuousSamples", + openfx::span(prop_type_arrays::OfxImageClipPropContinuousSamples_types, 1), 1, openfx::span()}, +{ "OfxImageClipPropFieldExtraction", + openfx::span(prop_type_arrays::OfxImageClipPropFieldExtraction_types, 1), 1, openfx::span(prop_enum_values::OfxImageClipPropFieldExtraction.data(), prop_enum_values::OfxImageClipPropFieldExtraction.size())}, +{ "OfxImageClipPropFieldOrder", + openfx::span(prop_type_arrays::OfxImageClipPropFieldOrder_types, 1), 1, openfx::span(prop_enum_values::OfxImageClipPropFieldOrder.data(), prop_enum_values::OfxImageClipPropFieldOrder.size())}, +{ "OfxImageClipPropIsMask", + openfx::span(prop_type_arrays::OfxImageClipPropIsMask_types, 1), 1, openfx::span()}, +{ "OfxImageClipPropOptional", + openfx::span(prop_type_arrays::OfxImageClipPropOptional_types, 1), 1, openfx::span()}, +{ "OfxImageClipPropPreferredColourspaces", + openfx::span(prop_type_arrays::OfxImageClipPropPreferredColourspaces_types, 1), 0, openfx::span()}, +{ "OfxImageClipPropUnmappedComponents", + openfx::span(prop_type_arrays::OfxImageClipPropUnmappedComponents_types, 1), 1, openfx::span(prop_enum_values::OfxImageClipPropUnmappedComponents.data(), prop_enum_values::OfxImageClipPropUnmappedComponents.size())}, +{ "OfxImageClipPropUnmappedPixelDepth", + openfx::span(prop_type_arrays::OfxImageClipPropUnmappedPixelDepth_types, 1), 1, openfx::span(prop_enum_values::OfxImageClipPropUnmappedPixelDepth.data(), prop_enum_values::OfxImageClipPropUnmappedPixelDepth.size())}, +{ "OfxImageEffectFrameVarying", + openfx::span(prop_type_arrays::OfxImageEffectFrameVarying_types, 1), 1, openfx::span()}, +{ "OfxImageEffectHostPropIsBackground", + openfx::span(prop_type_arrays::OfxImageEffectHostPropIsBackground_types, 1), 1, openfx::span()}, +{ "OfxImageEffectHostPropNativeOrigin", + openfx::span(prop_type_arrays::OfxImageEffectHostPropNativeOrigin_types, 1), 1, openfx::span(prop_enum_values::OfxImageEffectHostPropNativeOrigin.data(), prop_enum_values::OfxImageEffectHostPropNativeOrigin.size())}, +{ "OfxImageEffectInstancePropEffectDuration", + openfx::span(prop_type_arrays::OfxImageEffectInstancePropEffectDuration_types, 1), 1, openfx::span()}, +{ "OfxImageEffectInstancePropSequentialRender", + openfx::span(prop_type_arrays::OfxImageEffectInstancePropSequentialRender_types, 1), 1, openfx::span()}, +{ "OfxImageEffectPluginPropFieldRenderTwiceAlways", + openfx::span(prop_type_arrays::OfxImageEffectPluginPropFieldRenderTwiceAlways_types, 1), 1, openfx::span()}, +{ "OfxImageEffectPluginPropGrouping", + openfx::span(prop_type_arrays::OfxImageEffectPluginPropGrouping_types, 1), 1, openfx::span()}, +{ "OfxImageEffectPluginPropHostFrameThreading", + openfx::span(prop_type_arrays::OfxImageEffectPluginPropHostFrameThreading_types, 1), 1, openfx::span()}, +{ "OfxImageEffectPluginPropOverlayInteractV1", + openfx::span(prop_type_arrays::OfxImageEffectPluginPropOverlayInteractV1_types, 1), 1, openfx::span()}, +{ "OfxImageEffectPluginPropOverlayInteractV2", + openfx::span(prop_type_arrays::OfxImageEffectPluginPropOverlayInteractV2_types, 1), 1, openfx::span()}, +{ "OfxImageEffectPluginPropSingleInstance", + openfx::span(prop_type_arrays::OfxImageEffectPluginPropSingleInstance_types, 1), 1, openfx::span()}, +{ "OfxImageEffectPluginRenderThreadSafety", + openfx::span(prop_type_arrays::OfxImageEffectPluginRenderThreadSafety_types, 1), 1, openfx::span(prop_enum_values::OfxImageEffectPluginRenderThreadSafety.data(), prop_enum_values::OfxImageEffectPluginRenderThreadSafety.size())}, +{ "OfxImageEffectPropClipPreferencesSlaveParam", + openfx::span(prop_type_arrays::OfxImageEffectPropClipPreferencesSlaveParam_types, 1), 0, openfx::span()}, +{ "OfxImageEffectPropColourManagementAvailableConfigs", + openfx::span(prop_type_arrays::OfxImageEffectPropColourManagementAvailableConfigs_types, 1), 0, openfx::span()}, +{ "OfxImageEffectPropColourManagementConfig", + openfx::span(prop_type_arrays::OfxImageEffectPropColourManagementConfig_types, 1), 1, openfx::span()}, +{ "OfxImageEffectPropColourManagementStyle", + openfx::span(prop_type_arrays::OfxImageEffectPropColourManagementStyle_types, 1), 1, openfx::span(prop_enum_values::OfxImageEffectPropColourManagementStyle.data(), prop_enum_values::OfxImageEffectPropColourManagementStyle.size())}, +{ "OfxImageEffectPropComponents", + openfx::span(prop_type_arrays::OfxImageEffectPropComponents_types, 1), 1, openfx::span(prop_enum_values::OfxImageEffectPropComponents.data(), prop_enum_values::OfxImageEffectPropComponents.size())}, +{ "OfxImageEffectPropContext", + openfx::span(prop_type_arrays::OfxImageEffectPropContext_types, 1), 1, openfx::span(prop_enum_values::OfxImageEffectPropContext.data(), prop_enum_values::OfxImageEffectPropContext.size())}, +{ "OfxImageEffectPropCudaEnabled", + openfx::span(prop_type_arrays::OfxImageEffectPropCudaEnabled_types, 1), 1, openfx::span()}, +{ "OfxImageEffectPropCudaRenderSupported", + openfx::span(prop_type_arrays::OfxImageEffectPropCudaRenderSupported_types, 1), 1, openfx::span(prop_enum_values::OfxImageEffectPropCudaRenderSupported.data(), prop_enum_values::OfxImageEffectPropCudaRenderSupported.size())}, +{ "OfxImageEffectPropCudaStream", + openfx::span(prop_type_arrays::OfxImageEffectPropCudaStream_types, 1), 1, openfx::span()}, +{ "OfxImageEffectPropCudaStreamSupported", + openfx::span(prop_type_arrays::OfxImageEffectPropCudaStreamSupported_types, 1), 1, openfx::span(prop_enum_values::OfxImageEffectPropCudaStreamSupported.data(), prop_enum_values::OfxImageEffectPropCudaStreamSupported.size())}, +{ "OfxImageEffectPropDisplayColourspace", + openfx::span(prop_type_arrays::OfxImageEffectPropDisplayColourspace_types, 1), 1, openfx::span()}, +{ "OfxImageEffectPropFieldToRender", + openfx::span(prop_type_arrays::OfxImageEffectPropFieldToRender_types, 1), 1, openfx::span(prop_enum_values::OfxImageEffectPropFieldToRender.data(), prop_enum_values::OfxImageEffectPropFieldToRender.size())}, +{ "OfxImageEffectPropFrameRange", + openfx::span(prop_type_arrays::OfxImageEffectPropFrameRange_types, 1), 2, openfx::span()}, +{ "OfxImageEffectPropFrameRate", + openfx::span(prop_type_arrays::OfxImageEffectPropFrameRate_types, 1), 1, openfx::span()}, +{ "OfxImageEffectPropFrameStep", + openfx::span(prop_type_arrays::OfxImageEffectPropFrameStep_types, 1), 1, openfx::span()}, +{ "OfxImageEffectPropInAnalysis", + openfx::span(prop_type_arrays::OfxImageEffectPropInAnalysis_types, 1), 1, openfx::span()}, +{ "OfxImageEffectPropInteractiveRenderStatus", + openfx::span(prop_type_arrays::OfxImageEffectPropInteractiveRenderStatus_types, 1), 1, openfx::span()}, +{ "OfxImageEffectPropMetalCommandQueue", + openfx::span(prop_type_arrays::OfxImageEffectPropMetalCommandQueue_types, 1), 1, openfx::span()}, +{ "OfxImageEffectPropMetalEnabled", + openfx::span(prop_type_arrays::OfxImageEffectPropMetalEnabled_types, 1), 1, openfx::span()}, +{ "OfxImageEffectPropMetalRenderSupported", + openfx::span(prop_type_arrays::OfxImageEffectPropMetalRenderSupported_types, 1), 1, openfx::span(prop_enum_values::OfxImageEffectPropMetalRenderSupported.data(), prop_enum_values::OfxImageEffectPropMetalRenderSupported.size())}, +{ "OfxImageEffectPropMultipleClipDepths", + openfx::span(prop_type_arrays::OfxImageEffectPropMultipleClipDepths_types, 1), 1, openfx::span()}, +{ "OfxImageEffectPropNoSpatialAwareness", + openfx::span(prop_type_arrays::OfxImageEffectPropNoSpatialAwareness_types, 1), 1, openfx::span(prop_enum_values::OfxImageEffectPropNoSpatialAwareness.data(), prop_enum_values::OfxImageEffectPropNoSpatialAwareness.size())}, +{ "OfxImageEffectPropOCIOConfig", + openfx::span(prop_type_arrays::OfxImageEffectPropOCIOConfig_types, 1), 1, openfx::span()}, +{ "OfxImageEffectPropOCIODisplay", + openfx::span(prop_type_arrays::OfxImageEffectPropOCIODisplay_types, 1), 1, openfx::span()}, +{ "OfxImageEffectPropOCIOView", + openfx::span(prop_type_arrays::OfxImageEffectPropOCIOView_types, 1), 1, openfx::span()}, +{ "OfxImageEffectPropOpenCLCommandQueue", + openfx::span(prop_type_arrays::OfxImageEffectPropOpenCLCommandQueue_types, 1), 1, openfx::span()}, +{ "OfxImageEffectPropOpenCLEnabled", + openfx::span(prop_type_arrays::OfxImageEffectPropOpenCLEnabled_types, 1), 1, openfx::span()}, +{ "OfxImageEffectPropOpenCLImage", + openfx::span(prop_type_arrays::OfxImageEffectPropOpenCLImage_types, 1), 1, openfx::span()}, +{ "OfxImageEffectPropOpenCLRenderSupported", + openfx::span(prop_type_arrays::OfxImageEffectPropOpenCLRenderSupported_types, 1), 1, openfx::span(prop_enum_values::OfxImageEffectPropOpenCLRenderSupported.data(), prop_enum_values::OfxImageEffectPropOpenCLRenderSupported.size())}, +{ "OfxImageEffectPropOpenCLSupported", + openfx::span(prop_type_arrays::OfxImageEffectPropOpenCLSupported_types, 1), 1, openfx::span(prop_enum_values::OfxImageEffectPropOpenCLSupported.data(), prop_enum_values::OfxImageEffectPropOpenCLSupported.size())}, +{ "OfxImageEffectPropOpenGLEnabled", + openfx::span(prop_type_arrays::OfxImageEffectPropOpenGLEnabled_types, 1), 1, openfx::span()}, +{ "OfxImageEffectPropOpenGLRenderSupported", + openfx::span(prop_type_arrays::OfxImageEffectPropOpenGLRenderSupported_types, 1), 1, openfx::span(prop_enum_values::OfxImageEffectPropOpenGLRenderSupported.data(), prop_enum_values::OfxImageEffectPropOpenGLRenderSupported.size())}, +{ "OfxImageEffectPropOpenGLTextureIndex", + openfx::span(prop_type_arrays::OfxImageEffectPropOpenGLTextureIndex_types, 1), 1, openfx::span()}, +{ "OfxImageEffectPropOpenGLTextureTarget", + openfx::span(prop_type_arrays::OfxImageEffectPropOpenGLTextureTarget_types, 1), 1, openfx::span()}, +{ "OfxImageEffectPropPixelAspectRatio", + openfx::span(prop_type_arrays::OfxImageEffectPropPixelAspectRatio_types, 1), 1, openfx::span()}, +{ "OfxImageEffectPropPixelDepth", + openfx::span(prop_type_arrays::OfxImageEffectPropPixelDepth_types, 1), 1, openfx::span(prop_enum_values::OfxImageEffectPropPixelDepth.data(), prop_enum_values::OfxImageEffectPropPixelDepth.size())}, +{ "OfxImageEffectPropPluginHandle", + openfx::span(prop_type_arrays::OfxImageEffectPropPluginHandle_types, 1), 1, openfx::span()}, +{ "OfxImageEffectPropPreMultiplication", + openfx::span(prop_type_arrays::OfxImageEffectPropPreMultiplication_types, 1), 1, openfx::span(prop_enum_values::OfxImageEffectPropPreMultiplication.data(), prop_enum_values::OfxImageEffectPropPreMultiplication.size())}, +{ "OfxImageEffectPropProjectExtent", + openfx::span(prop_type_arrays::OfxImageEffectPropProjectExtent_types, 1), 2, openfx::span()}, +{ "OfxImageEffectPropProjectOffset", + openfx::span(prop_type_arrays::OfxImageEffectPropProjectOffset_types, 1), 2, openfx::span()}, +{ "OfxImageEffectPropProjectSize", + openfx::span(prop_type_arrays::OfxImageEffectPropProjectSize_types, 1), 2, openfx::span()}, +{ "OfxImageEffectPropRegionOfDefinition", + openfx::span(prop_type_arrays::OfxImageEffectPropRegionOfDefinition_types, 1), 4, openfx::span()}, +{ "OfxImageEffectPropRegionOfInterest", + openfx::span(prop_type_arrays::OfxImageEffectPropRegionOfInterest_types, 1), 4, openfx::span()}, +{ "OfxImageEffectPropRenderQualityDraft", + openfx::span(prop_type_arrays::OfxImageEffectPropRenderQualityDraft_types, 1), 1, openfx::span()}, +{ "OfxImageEffectPropRenderScale", + openfx::span(prop_type_arrays::OfxImageEffectPropRenderScale_types, 1), 2, openfx::span()}, +{ "OfxImageEffectPropRenderWindow", + openfx::span(prop_type_arrays::OfxImageEffectPropRenderWindow_types, 1), 4, openfx::span()}, +{ "OfxImageEffectPropSequentialRenderStatus", + openfx::span(prop_type_arrays::OfxImageEffectPropSequentialRenderStatus_types, 1), 1, openfx::span()}, +{ "OfxImageEffectPropSetableFielding", + openfx::span(prop_type_arrays::OfxImageEffectPropSetableFielding_types, 1), 1, openfx::span()}, +{ "OfxImageEffectPropSetableFrameRate", + openfx::span(prop_type_arrays::OfxImageEffectPropSetableFrameRate_types, 1), 1, openfx::span()}, +{ "OfxImageEffectPropSupportedComponents", + openfx::span(prop_type_arrays::OfxImageEffectPropSupportedComponents_types, 1), 0, openfx::span(prop_enum_values::OfxImageEffectPropSupportedComponents.data(), prop_enum_values::OfxImageEffectPropSupportedComponents.size())}, +{ "OfxImageEffectPropSupportedContexts", + openfx::span(prop_type_arrays::OfxImageEffectPropSupportedContexts_types, 1), 0, openfx::span(prop_enum_values::OfxImageEffectPropSupportedContexts.data(), prop_enum_values::OfxImageEffectPropSupportedContexts.size())}, +{ "OfxImageEffectPropSupportedPixelDepths", + openfx::span(prop_type_arrays::OfxImageEffectPropSupportedPixelDepths_types, 1), 0, openfx::span(prop_enum_values::OfxImageEffectPropSupportedPixelDepths.data(), prop_enum_values::OfxImageEffectPropSupportedPixelDepths.size())}, +{ "OfxImageEffectPropSupportsMultiResolution", + openfx::span(prop_type_arrays::OfxImageEffectPropSupportsMultiResolution_types, 1), 1, openfx::span()}, +{ "OfxImageEffectPropSupportsMultipleClipPARs", + openfx::span(prop_type_arrays::OfxImageEffectPropSupportsMultipleClipPARs_types, 1), 1, openfx::span()}, +{ "OfxImageEffectPropSupportsOverlays", + openfx::span(prop_type_arrays::OfxImageEffectPropSupportsOverlays_types, 1), 1, openfx::span()}, +{ "OfxImageEffectPropSupportsTiles", + openfx::span(prop_type_arrays::OfxImageEffectPropSupportsTiles_types, 1), 1, openfx::span()}, +{ "OfxImageEffectPropTemporalClipAccess", + openfx::span(prop_type_arrays::OfxImageEffectPropTemporalClipAccess_types, 1), 1, openfx::span()}, +{ "OfxImageEffectPropUnmappedFrameRange", + openfx::span(prop_type_arrays::OfxImageEffectPropUnmappedFrameRange_types, 1), 2, openfx::span()}, +{ "OfxImageEffectPropUnmappedFrameRate", + openfx::span(prop_type_arrays::OfxImageEffectPropUnmappedFrameRate_types, 1), 1, openfx::span()}, +{ "OfxImagePropBounds", + openfx::span(prop_type_arrays::OfxImagePropBounds_types, 1), 4, openfx::span()}, +{ "OfxImagePropData", + openfx::span(prop_type_arrays::OfxImagePropData_types, 1), 1, openfx::span()}, +{ "OfxImagePropField", + openfx::span(prop_type_arrays::OfxImagePropField_types, 1), 1, openfx::span(prop_enum_values::OfxImagePropField.data(), prop_enum_values::OfxImagePropField.size())}, +{ "OfxImagePropPixelAspectRatio", + openfx::span(prop_type_arrays::OfxImagePropPixelAspectRatio_types, 1), 1, openfx::span()}, +{ "OfxImagePropRegionOfDefinition", + openfx::span(prop_type_arrays::OfxImagePropRegionOfDefinition_types, 1), 4, openfx::span()}, +{ "OfxImagePropRowBytes", + openfx::span(prop_type_arrays::OfxImagePropRowBytes_types, 1), 1, openfx::span()}, +{ "OfxImagePropUniqueIdentifier", + openfx::span(prop_type_arrays::OfxImagePropUniqueIdentifier_types, 1), 1, openfx::span()}, +{ "OfxInteractPropBackgroundColour", + openfx::span(prop_type_arrays::OfxInteractPropBackgroundColour_types, 1), 3, openfx::span()}, +{ "OfxInteractPropBitDepth", + openfx::span(prop_type_arrays::OfxInteractPropBitDepth_types, 1), 1, openfx::span()}, +{ "OfxInteractPropDrawContext", + openfx::span(prop_type_arrays::OfxInteractPropDrawContext_types, 1), 1, openfx::span()}, +{ "OfxInteractPropHasAlpha", + openfx::span(prop_type_arrays::OfxInteractPropHasAlpha_types, 1), 1, openfx::span()}, +{ "OfxInteractPropPenPosition", + openfx::span(prop_type_arrays::OfxInteractPropPenPosition_types, 1), 2, openfx::span()}, +{ "OfxInteractPropPenPressure", + openfx::span(prop_type_arrays::OfxInteractPropPenPressure_types, 1), 1, openfx::span()}, +{ "OfxInteractPropPenViewportPosition", + openfx::span(prop_type_arrays::OfxInteractPropPenViewportPosition_types, 1), 2, openfx::span()}, +{ "OfxInteractPropPixelScale", + openfx::span(prop_type_arrays::OfxInteractPropPixelScale_types, 1), 2, openfx::span()}, +{ "OfxInteractPropSlaveToParam", + openfx::span(prop_type_arrays::OfxInteractPropSlaveToParam_types, 1), 0, openfx::span()}, +{ "OfxInteractPropSuggestedColour", + openfx::span(prop_type_arrays::OfxInteractPropSuggestedColour_types, 1), 3, openfx::span()}, +{ "OfxInteractPropViewport", + openfx::span(prop_type_arrays::OfxInteractPropViewport_types, 1), 2, openfx::span()}, +{ "OfxOpenGLPropPixelDepth", + openfx::span(prop_type_arrays::OfxOpenGLPropPixelDepth_types, 1), 0, openfx::span(prop_enum_values::OfxOpenGLPropPixelDepth.data(), prop_enum_values::OfxOpenGLPropPixelDepth.size())}, +{ "OfxParamHostPropMaxPages", + openfx::span(prop_type_arrays::OfxParamHostPropMaxPages_types, 1), 1, openfx::span()}, +{ "OfxParamHostPropMaxParameters", + openfx::span(prop_type_arrays::OfxParamHostPropMaxParameters_types, 1), 1, openfx::span()}, +{ "OfxParamHostPropPageRowColumnCount", + openfx::span(prop_type_arrays::OfxParamHostPropPageRowColumnCount_types, 1), 2, openfx::span()}, +{ "OfxParamHostPropSupportsBooleanAnimation", + openfx::span(prop_type_arrays::OfxParamHostPropSupportsBooleanAnimation_types, 1), 1, openfx::span()}, +{ "OfxParamHostPropSupportsChoiceAnimation", + openfx::span(prop_type_arrays::OfxParamHostPropSupportsChoiceAnimation_types, 1), 1, openfx::span()}, +{ "OfxParamHostPropSupportsCustomAnimation", + openfx::span(prop_type_arrays::OfxParamHostPropSupportsCustomAnimation_types, 1), 1, openfx::span()}, +{ "OfxParamHostPropSupportsCustomInteract", + openfx::span(prop_type_arrays::OfxParamHostPropSupportsCustomInteract_types, 1), 1, openfx::span()}, +{ "OfxParamHostPropSupportsParametricAnimation", + openfx::span(prop_type_arrays::OfxParamHostPropSupportsParametricAnimation_types, 1), 1, openfx::span()}, +{ "OfxParamHostPropSupportsStrChoice", + openfx::span(prop_type_arrays::OfxParamHostPropSupportsStrChoice_types, 1), 1, openfx::span()}, +{ "OfxParamHostPropSupportsStrChoiceAnimation", + openfx::span(prop_type_arrays::OfxParamHostPropSupportsStrChoiceAnimation_types, 1), 1, openfx::span()}, +{ "OfxParamHostPropSupportsStringAnimation", + openfx::span(prop_type_arrays::OfxParamHostPropSupportsStringAnimation_types, 1), 1, openfx::span()}, +{ "OfxParamPropAnimates", + openfx::span(prop_type_arrays::OfxParamPropAnimates_types, 1), 1, openfx::span()}, +{ "OfxParamPropCacheInvalidation", + openfx::span(prop_type_arrays::OfxParamPropCacheInvalidation_types, 1), 1, openfx::span(prop_enum_values::OfxParamPropCacheInvalidation.data(), prop_enum_values::OfxParamPropCacheInvalidation.size())}, +{ "OfxParamPropCanUndo", + openfx::span(prop_type_arrays::OfxParamPropCanUndo_types, 1), 1, openfx::span()}, +{ "OfxParamPropChoiceEnum", + openfx::span(prop_type_arrays::OfxParamPropChoiceEnum_types, 1), 1, openfx::span()}, +{ "OfxParamPropChoiceOption", + openfx::span(prop_type_arrays::OfxParamPropChoiceOption_types, 1), 0, openfx::span()}, +{ "OfxParamPropChoiceOrder", + openfx::span(prop_type_arrays::OfxParamPropChoiceOrder_types, 1), 0, openfx::span()}, +{ "OfxParamPropCustomCallbackV1", + openfx::span(prop_type_arrays::OfxParamPropCustomCallbackV1_types, 1), 1, openfx::span()}, +{ "OfxParamPropCustomValue", + openfx::span(prop_type_arrays::OfxParamPropCustomValue_types, 1), 2, openfx::span()}, +{ "OfxParamPropDataPtr", + openfx::span(prop_type_arrays::OfxParamPropDataPtr_types, 1), 1, openfx::span()}, +{ "OfxParamPropDefault", + openfx::span(prop_type_arrays::OfxParamPropDefault_types, 4), 0, openfx::span()}, +{ "OfxParamPropDefaultCoordinateSystem", + openfx::span(prop_type_arrays::OfxParamPropDefaultCoordinateSystem_types, 1), 1, openfx::span(prop_enum_values::OfxParamPropDefaultCoordinateSystem.data(), prop_enum_values::OfxParamPropDefaultCoordinateSystem.size())}, +{ "OfxParamPropDigits", + openfx::span(prop_type_arrays::OfxParamPropDigits_types, 1), 1, openfx::span()}, +{ "OfxParamPropDimensionLabel", + openfx::span(prop_type_arrays::OfxParamPropDimensionLabel_types, 1), 1, openfx::span()}, +{ "OfxParamPropDisplayMax", + openfx::span(prop_type_arrays::OfxParamPropDisplayMax_types, 2), 0, openfx::span()}, +{ "OfxParamPropDisplayMin", + openfx::span(prop_type_arrays::OfxParamPropDisplayMin_types, 2), 0, openfx::span()}, +{ "OfxParamPropDoubleType", + openfx::span(prop_type_arrays::OfxParamPropDoubleType_types, 1), 1, openfx::span(prop_enum_values::OfxParamPropDoubleType.data(), prop_enum_values::OfxParamPropDoubleType.size())}, +{ "OfxParamPropEnabled", + openfx::span(prop_type_arrays::OfxParamPropEnabled_types, 1), 1, openfx::span()}, +{ "OfxParamPropEvaluateOnChange", + openfx::span(prop_type_arrays::OfxParamPropEvaluateOnChange_types, 1), 1, openfx::span()}, +{ "OfxParamPropGroupOpen", + openfx::span(prop_type_arrays::OfxParamPropGroupOpen_types, 1), 1, openfx::span()}, +{ "OfxParamPropHasHostOverlayHandle", + openfx::span(prop_type_arrays::OfxParamPropHasHostOverlayHandle_types, 1), 1, openfx::span()}, +{ "OfxParamPropHint", + openfx::span(prop_type_arrays::OfxParamPropHint_types, 1), 1, openfx::span()}, +{ "OfxParamPropIncrement", + openfx::span(prop_type_arrays::OfxParamPropIncrement_types, 1), 1, openfx::span()}, +{ "OfxParamPropInteractMinimumSize", + openfx::span(prop_type_arrays::OfxParamPropInteractMinimumSize_types, 1), 2, openfx::span()}, +{ "OfxParamPropInteractPreferedSize", + openfx::span(prop_type_arrays::OfxParamPropInteractPreferedSize_types, 1), 2, openfx::span()}, +{ "OfxParamPropInteractSize", + openfx::span(prop_type_arrays::OfxParamPropInteractSize_types, 1), 2, openfx::span()}, +{ "OfxParamPropInteractSizeAspect", + openfx::span(prop_type_arrays::OfxParamPropInteractSizeAspect_types, 1), 1, openfx::span()}, +{ "OfxParamPropInteractV1", + openfx::span(prop_type_arrays::OfxParamPropInteractV1_types, 1), 1, openfx::span()}, +{ "OfxParamPropInterpolationAmount", + openfx::span(prop_type_arrays::OfxParamPropInterpolationAmount_types, 1), 1, openfx::span()}, +{ "OfxParamPropInterpolationTime", + openfx::span(prop_type_arrays::OfxParamPropInterpolationTime_types, 1), 2, openfx::span()}, +{ "OfxParamPropIsAnimating", + openfx::span(prop_type_arrays::OfxParamPropIsAnimating_types, 1), 1, openfx::span()}, +{ "OfxParamPropIsAutoKeying", + openfx::span(prop_type_arrays::OfxParamPropIsAutoKeying_types, 1), 1, openfx::span()}, +{ "OfxParamPropMax", + openfx::span(prop_type_arrays::OfxParamPropMax_types, 2), 0, openfx::span()}, +{ "OfxParamPropMin", + openfx::span(prop_type_arrays::OfxParamPropMin_types, 2), 0, openfx::span()}, +{ "OfxParamPropPageChild", + openfx::span(prop_type_arrays::OfxParamPropPageChild_types, 1), 0, openfx::span()}, +{ "OfxParamPropParametricDimension", + openfx::span(prop_type_arrays::OfxParamPropParametricDimension_types, 1), 1, openfx::span()}, +{ "OfxParamPropParametricInteractBackground", + openfx::span(prop_type_arrays::OfxParamPropParametricInteractBackground_types, 1), 1, openfx::span()}, +{ "OfxParamPropParametricRange", + openfx::span(prop_type_arrays::OfxParamPropParametricRange_types, 1), 2, openfx::span()}, +{ "OfxParamPropParametricUIColour", + openfx::span(prop_type_arrays::OfxParamPropParametricUIColour_types, 1), 0, openfx::span()}, +{ "OfxParamPropParent", + openfx::span(prop_type_arrays::OfxParamPropParent_types, 1), 1, openfx::span()}, +{ "OfxParamPropPersistant", + openfx::span(prop_type_arrays::OfxParamPropPersistant_types, 1), 1, openfx::span()}, +{ "OfxParamPropPluginMayWrite", + openfx::span(prop_type_arrays::OfxParamPropPluginMayWrite_types, 1), 1, openfx::span()}, +{ "OfxParamPropScriptName", + openfx::span(prop_type_arrays::OfxParamPropScriptName_types, 1), 1, openfx::span()}, +{ "OfxParamPropSecret", + openfx::span(prop_type_arrays::OfxParamPropSecret_types, 1), 1, openfx::span()}, +{ "OfxParamPropShowTimeMarker", + openfx::span(prop_type_arrays::OfxParamPropShowTimeMarker_types, 1), 1, openfx::span()}, +{ "OfxParamPropStringFilePathExists", + openfx::span(prop_type_arrays::OfxParamPropStringFilePathExists_types, 1), 1, openfx::span()}, +{ "OfxParamPropStringMode", + openfx::span(prop_type_arrays::OfxParamPropStringMode_types, 1), 1, openfx::span(prop_enum_values::OfxParamPropStringMode.data(), prop_enum_values::OfxParamPropStringMode.size())}, +{ "OfxParamPropType", + openfx::span(prop_type_arrays::OfxParamPropType_types, 1), 1, openfx::span()}, +{ "OfxPluginPropFilePath", + openfx::span(prop_type_arrays::OfxPluginPropFilePath_types, 1), 1, openfx::span()}, +{ "OfxPluginPropParamPageOrder", + openfx::span(prop_type_arrays::OfxPluginPropParamPageOrder_types, 1), 0, openfx::span()}, +{ "OfxPropAPIVersion", + openfx::span(prop_type_arrays::OfxPropAPIVersion_types, 1), 0, openfx::span()}, +{ "OfxPropChangeReason", + openfx::span(prop_type_arrays::OfxPropChangeReason_types, 1), 1, openfx::span(prop_enum_values::OfxPropChangeReason.data(), prop_enum_values::OfxPropChangeReason.size())}, +{ "OfxPropEffectInstance", + openfx::span(prop_type_arrays::OfxPropEffectInstance_types, 1), 1, openfx::span()}, +{ "OfxPropHostOSHandle", + openfx::span(prop_type_arrays::OfxPropHostOSHandle_types, 1), 1, openfx::span()}, +{ "OfxPropIcon", + openfx::span(prop_type_arrays::OfxPropIcon_types, 1), 2, openfx::span()}, +{ "OfxPropInstanceData", + openfx::span(prop_type_arrays::OfxPropInstanceData_types, 1), 1, openfx::span()}, +{ "OfxPropIsInteractive", + openfx::span(prop_type_arrays::OfxPropIsInteractive_types, 1), 1, openfx::span()}, +{ "OfxPropLabel", + openfx::span(prop_type_arrays::OfxPropLabel_types, 1), 1, openfx::span()}, +{ "OfxPropLongLabel", + openfx::span(prop_type_arrays::OfxPropLongLabel_types, 1), 1, openfx::span()}, +{ "OfxPropName", + openfx::span(prop_type_arrays::OfxPropName_types, 1), 1, openfx::span()}, +{ "OfxPropParamSetNeedsSyncing", + openfx::span(prop_type_arrays::OfxPropParamSetNeedsSyncing_types, 1), 1, openfx::span()}, +{ "OfxPropPluginDescription", + openfx::span(prop_type_arrays::OfxPropPluginDescription_types, 1), 1, openfx::span()}, +{ "OfxPropShortLabel", + openfx::span(prop_type_arrays::OfxPropShortLabel_types, 1), 1, openfx::span()}, +{ "OfxPropTime", + openfx::span(prop_type_arrays::OfxPropTime_types, 1), 1, openfx::span()}, +{ "OfxPropType", + openfx::span(prop_type_arrays::OfxPropType_types, 1), 1, openfx::span()}, +{ "OfxPropVersion", + openfx::span(prop_type_arrays::OfxPropVersion_types, 1), 0, openfx::span()}, +{ "OfxPropVersionLabel", + openfx::span(prop_type_arrays::OfxPropVersionLabel_types, 1), 1, openfx::span()}, +{ "kOfxParamPropUseHostOverlayHandle", + openfx::span(prop_type_arrays::kOfxParamPropUseHostOverlayHandle_types, 1), 1, openfx::span()}, +{ "kOfxPropKeyString", + openfx::span(prop_type_arrays::kOfxPropKeyString_types, 1), 1, openfx::span()}, +{ "kOfxPropKeySym", + openfx::span(prop_type_arrays::kOfxPropKeySym_types, 1), 1, openfx::span()}, + }} +}; + + +//Template specializations for each property +namespace properties { + +// Base template struct for property traits +template +struct PropTraits; + +#define DEFINE_PROP_TRAITS(id, _type, _is_multitype) \ +template<> \ +struct PropTraits { \ + using type = _type; \ + static constexpr bool is_multitype = _is_multitype; \ + static constexpr const PropDef& def = prop_defs[PropId::id]; \ +} + +DEFINE_PROP_TRAITS(OfxImageClipPropColourspace, const char *, false); +DEFINE_PROP_TRAITS(OfxImageClipPropConnected, bool, false); +DEFINE_PROP_TRAITS(OfxImageClipPropContinuousSamples, bool, false); +DEFINE_PROP_TRAITS(OfxImageClipPropFieldExtraction, const char *, false); +DEFINE_PROP_TRAITS(OfxImageClipPropFieldOrder, const char *, false); +DEFINE_PROP_TRAITS(OfxImageClipPropIsMask, bool, false); +DEFINE_PROP_TRAITS(OfxImageClipPropOptional, bool, false); +DEFINE_PROP_TRAITS(OfxImageClipPropPreferredColourspaces, const char *, false); +DEFINE_PROP_TRAITS(OfxImageClipPropUnmappedComponents, const char *, false); +DEFINE_PROP_TRAITS(OfxImageClipPropUnmappedPixelDepth, const char *, false); +DEFINE_PROP_TRAITS(OfxImageEffectFrameVarying, bool, false); +DEFINE_PROP_TRAITS(OfxImageEffectHostPropIsBackground, bool, false); +DEFINE_PROP_TRAITS(OfxImageEffectHostPropNativeOrigin, const char *, false); +DEFINE_PROP_TRAITS(OfxImageEffectInstancePropEffectDuration, double, false); +DEFINE_PROP_TRAITS(OfxImageEffectInstancePropSequentialRender, bool, false); +DEFINE_PROP_TRAITS(OfxImageEffectPluginPropFieldRenderTwiceAlways, bool, false); +DEFINE_PROP_TRAITS(OfxImageEffectPluginPropGrouping, const char *, false); +DEFINE_PROP_TRAITS(OfxImageEffectPluginPropHostFrameThreading, bool, false); +DEFINE_PROP_TRAITS(OfxImageEffectPluginPropOverlayInteractV1, void *, false); +DEFINE_PROP_TRAITS(OfxImageEffectPluginPropOverlayInteractV2, void *, false); +DEFINE_PROP_TRAITS(OfxImageEffectPluginPropSingleInstance, bool, false); +DEFINE_PROP_TRAITS(OfxImageEffectPluginRenderThreadSafety, const char *, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropClipPreferencesSlaveParam, const char *, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropColourManagementAvailableConfigs, const char *, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropColourManagementConfig, const char *, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropColourManagementStyle, const char *, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropComponents, const char *, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropContext, const char *, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropCudaEnabled, bool, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropCudaRenderSupported, const char *, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropCudaStream, void *, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropCudaStreamSupported, const char *, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropDisplayColourspace, const char *, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropFieldToRender, const char *, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropFrameRange, double, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropFrameRate, double, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropFrameStep, double, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropInAnalysis, bool, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropInteractiveRenderStatus, bool, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropMetalCommandQueue, void *, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropMetalEnabled, bool, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropMetalRenderSupported, const char *, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropMultipleClipDepths, bool, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropNoSpatialAwareness, const char *, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropOCIOConfig, const char *, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropOCIODisplay, const char *, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropOCIOView, const char *, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropOpenCLCommandQueue, void *, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropOpenCLEnabled, bool, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropOpenCLImage, void *, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropOpenCLRenderSupported, const char *, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropOpenCLSupported, const char *, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropOpenGLEnabled, bool, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropOpenGLRenderSupported, const char *, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropOpenGLTextureIndex, int, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropOpenGLTextureTarget, int, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropPixelAspectRatio, double, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropPixelDepth, const char *, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropPluginHandle, void *, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropPreMultiplication, const char *, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropProjectExtent, double, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropProjectOffset, double, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropProjectSize, double, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropRegionOfDefinition, double, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropRegionOfInterest, double, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropRenderQualityDraft, bool, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropRenderScale, double, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropRenderWindow, int, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropSequentialRenderStatus, bool, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropSetableFielding, bool, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropSetableFrameRate, bool, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropSupportedComponents, const char *, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropSupportedContexts, const char *, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropSupportedPixelDepths, const char *, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropSupportsMultiResolution, bool, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropSupportsMultipleClipPARs, bool, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropSupportsOverlays, bool, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropSupportsTiles, bool, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropTemporalClipAccess, bool, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropUnmappedFrameRange, double, false); +DEFINE_PROP_TRAITS(OfxImageEffectPropUnmappedFrameRate, double, false); +DEFINE_PROP_TRAITS(OfxImagePropBounds, int, false); +DEFINE_PROP_TRAITS(OfxImagePropData, void *, false); +DEFINE_PROP_TRAITS(OfxImagePropField, const char *, false); +DEFINE_PROP_TRAITS(OfxImagePropPixelAspectRatio, double, false); +DEFINE_PROP_TRAITS(OfxImagePropRegionOfDefinition, int, false); +DEFINE_PROP_TRAITS(OfxImagePropRowBytes, int, false); +DEFINE_PROP_TRAITS(OfxImagePropUniqueIdentifier, const char *, false); +DEFINE_PROP_TRAITS(OfxInteractPropBackgroundColour, double, false); +DEFINE_PROP_TRAITS(OfxInteractPropBitDepth, int, false); +DEFINE_PROP_TRAITS(OfxInteractPropDrawContext, void *, false); +DEFINE_PROP_TRAITS(OfxInteractPropHasAlpha, bool, false); +DEFINE_PROP_TRAITS(OfxInteractPropPenPosition, double, false); +DEFINE_PROP_TRAITS(OfxInteractPropPenPressure, double, false); +DEFINE_PROP_TRAITS(OfxInteractPropPenViewportPosition, int, false); +DEFINE_PROP_TRAITS(OfxInteractPropPixelScale, double, false); +DEFINE_PROP_TRAITS(OfxInteractPropSlaveToParam, const char *, false); +DEFINE_PROP_TRAITS(OfxInteractPropSuggestedColour, double, false); +DEFINE_PROP_TRAITS(OfxInteractPropViewport, int, false); +DEFINE_PROP_TRAITS(OfxOpenGLPropPixelDepth, const char *, false); +DEFINE_PROP_TRAITS(OfxParamHostPropMaxPages, int, false); +DEFINE_PROP_TRAITS(OfxParamHostPropMaxParameters, int, false); +DEFINE_PROP_TRAITS(OfxParamHostPropPageRowColumnCount, int, false); +DEFINE_PROP_TRAITS(OfxParamHostPropSupportsBooleanAnimation, bool, false); +DEFINE_PROP_TRAITS(OfxParamHostPropSupportsChoiceAnimation, bool, false); +DEFINE_PROP_TRAITS(OfxParamHostPropSupportsCustomAnimation, bool, false); +DEFINE_PROP_TRAITS(OfxParamHostPropSupportsCustomInteract, bool, false); +DEFINE_PROP_TRAITS(OfxParamHostPropSupportsParametricAnimation, bool, false); +DEFINE_PROP_TRAITS(OfxParamHostPropSupportsStrChoice, bool, false); +DEFINE_PROP_TRAITS(OfxParamHostPropSupportsStrChoiceAnimation, bool, false); +DEFINE_PROP_TRAITS(OfxParamHostPropSupportsStringAnimation, bool, false); +DEFINE_PROP_TRAITS(OfxParamPropAnimates, bool, false); +DEFINE_PROP_TRAITS(OfxParamPropCacheInvalidation, const char *, false); +DEFINE_PROP_TRAITS(OfxParamPropCanUndo, bool, false); +DEFINE_PROP_TRAITS(OfxParamPropChoiceEnum, bool, false); +DEFINE_PROP_TRAITS(OfxParamPropChoiceOption, const char *, false); +DEFINE_PROP_TRAITS(OfxParamPropChoiceOrder, int, false); +DEFINE_PROP_TRAITS(OfxParamPropCustomCallbackV1, void *, false); +DEFINE_PROP_TRAITS(OfxParamPropCustomValue, const char *, false); +DEFINE_PROP_TRAITS(OfxParamPropDataPtr, void *, false); +DEFINE_PROP_TRAITS(OfxParamPropDefault, int, true); +DEFINE_PROP_TRAITS(OfxParamPropDefaultCoordinateSystem, const char *, false); +DEFINE_PROP_TRAITS(OfxParamPropDigits, int, false); +DEFINE_PROP_TRAITS(OfxParamPropDimensionLabel, const char *, false); +DEFINE_PROP_TRAITS(OfxParamPropDisplayMax, int, true); +DEFINE_PROP_TRAITS(OfxParamPropDisplayMin, int, true); +DEFINE_PROP_TRAITS(OfxParamPropDoubleType, const char *, false); +DEFINE_PROP_TRAITS(OfxParamPropEnabled, bool, false); +DEFINE_PROP_TRAITS(OfxParamPropEvaluateOnChange, bool, false); +DEFINE_PROP_TRAITS(OfxParamPropGroupOpen, bool, false); +DEFINE_PROP_TRAITS(OfxParamPropHasHostOverlayHandle, bool, false); +DEFINE_PROP_TRAITS(OfxParamPropHint, const char *, false); +DEFINE_PROP_TRAITS(OfxParamPropIncrement, double, false); +DEFINE_PROP_TRAITS(OfxParamPropInteractMinimumSize, double, false); +DEFINE_PROP_TRAITS(OfxParamPropInteractPreferedSize, int, false); +DEFINE_PROP_TRAITS(OfxParamPropInteractSize, double, false); +DEFINE_PROP_TRAITS(OfxParamPropInteractSizeAspect, double, false); +DEFINE_PROP_TRAITS(OfxParamPropInteractV1, void *, false); +DEFINE_PROP_TRAITS(OfxParamPropInterpolationAmount, double, false); +DEFINE_PROP_TRAITS(OfxParamPropInterpolationTime, double, false); +DEFINE_PROP_TRAITS(OfxParamPropIsAnimating, bool, false); +DEFINE_PROP_TRAITS(OfxParamPropIsAutoKeying, bool, false); +DEFINE_PROP_TRAITS(OfxParamPropMax, int, true); +DEFINE_PROP_TRAITS(OfxParamPropMin, int, true); +DEFINE_PROP_TRAITS(OfxParamPropPageChild, const char *, false); +DEFINE_PROP_TRAITS(OfxParamPropParametricDimension, int, false); +DEFINE_PROP_TRAITS(OfxParamPropParametricInteractBackground, void *, false); +DEFINE_PROP_TRAITS(OfxParamPropParametricRange, double, false); +DEFINE_PROP_TRAITS(OfxParamPropParametricUIColour, double, false); +DEFINE_PROP_TRAITS(OfxParamPropParent, const char *, false); +DEFINE_PROP_TRAITS(OfxParamPropPersistant, bool, false); +DEFINE_PROP_TRAITS(OfxParamPropPluginMayWrite, bool, false); +DEFINE_PROP_TRAITS(OfxParamPropScriptName, const char *, false); +DEFINE_PROP_TRAITS(OfxParamPropSecret, bool, false); +DEFINE_PROP_TRAITS(OfxParamPropShowTimeMarker, bool, false); +DEFINE_PROP_TRAITS(OfxParamPropStringFilePathExists, bool, false); +DEFINE_PROP_TRAITS(OfxParamPropStringMode, const char *, false); +DEFINE_PROP_TRAITS(OfxParamPropType, const char *, false); +DEFINE_PROP_TRAITS(OfxPluginPropFilePath, const char *, false); +DEFINE_PROP_TRAITS(OfxPluginPropParamPageOrder, const char *, false); +DEFINE_PROP_TRAITS(OfxPropAPIVersion, int, false); +DEFINE_PROP_TRAITS(OfxPropChangeReason, const char *, false); +DEFINE_PROP_TRAITS(OfxPropEffectInstance, void *, false); +DEFINE_PROP_TRAITS(OfxPropHostOSHandle, void *, false); +DEFINE_PROP_TRAITS(OfxPropIcon, const char *, false); +DEFINE_PROP_TRAITS(OfxPropInstanceData, void *, false); +DEFINE_PROP_TRAITS(OfxPropIsInteractive, bool, false); +DEFINE_PROP_TRAITS(OfxPropLabel, const char *, false); +DEFINE_PROP_TRAITS(OfxPropLongLabel, const char *, false); +DEFINE_PROP_TRAITS(OfxPropName, const char *, false); +DEFINE_PROP_TRAITS(OfxPropParamSetNeedsSyncing, bool, false); +DEFINE_PROP_TRAITS(OfxPropPluginDescription, const char *, false); +DEFINE_PROP_TRAITS(OfxPropShortLabel, const char *, false); +DEFINE_PROP_TRAITS(OfxPropTime, double, false); +DEFINE_PROP_TRAITS(OfxPropType, const char *, false); +DEFINE_PROP_TRAITS(OfxPropVersion, int, false); +DEFINE_PROP_TRAITS(OfxPropVersionLabel, const char *, false); +DEFINE_PROP_TRAITS(OfxParamPropUseHostOverlayHandle, bool, false); +DEFINE_PROP_TRAITS(OfxPropKeyString, const char *, false); +DEFINE_PROP_TRAITS(OfxPropKeySym, int, false); +} // namespace properties + +// Static asserts to check #define names vs. strings +namespace assertions { +using std::string_view; + +static_assert(string_view("OfxImageClipPropColourspace") == string_view(kOfxImageClipPropColourspace)); +static_assert(string_view("OfxImageClipPropConnected") == string_view(kOfxImageClipPropConnected)); +static_assert(string_view("OfxImageClipPropContinuousSamples") == string_view(kOfxImageClipPropContinuousSamples)); +static_assert(string_view("OfxImageClipPropFieldExtraction") == string_view(kOfxImageClipPropFieldExtraction)); +static_assert(string_view("OfxImageClipPropFieldOrder") == string_view(kOfxImageClipPropFieldOrder)); +static_assert(string_view("OfxImageClipPropIsMask") == string_view(kOfxImageClipPropIsMask)); +static_assert(string_view("OfxImageClipPropOptional") == string_view(kOfxImageClipPropOptional)); +static_assert(string_view("OfxImageClipPropPreferredColourspaces") == string_view(kOfxImageClipPropPreferredColourspaces)); +static_assert(string_view("OfxImageClipPropUnmappedComponents") == string_view(kOfxImageClipPropUnmappedComponents)); +static_assert(string_view("OfxImageClipPropUnmappedPixelDepth") == string_view(kOfxImageClipPropUnmappedPixelDepth)); +static_assert(string_view("OfxImageEffectFrameVarying") == string_view(kOfxImageEffectFrameVarying)); +static_assert(string_view("OfxImageEffectHostPropIsBackground") == string_view(kOfxImageEffectHostPropIsBackground)); +static_assert(string_view("OfxImageEffectHostPropNativeOrigin") == string_view(kOfxImageEffectHostPropNativeOrigin)); +static_assert(string_view("OfxImageEffectInstancePropEffectDuration") == string_view(kOfxImageEffectInstancePropEffectDuration)); +static_assert(string_view("OfxImageEffectInstancePropSequentialRender") == string_view(kOfxImageEffectInstancePropSequentialRender)); +static_assert(string_view("OfxImageEffectPluginPropFieldRenderTwiceAlways") == string_view(kOfxImageEffectPluginPropFieldRenderTwiceAlways)); +static_assert(string_view("OfxImageEffectPluginPropGrouping") == string_view(kOfxImageEffectPluginPropGrouping)); +static_assert(string_view("OfxImageEffectPluginPropHostFrameThreading") == string_view(kOfxImageEffectPluginPropHostFrameThreading)); +static_assert(string_view("OfxImageEffectPluginPropOverlayInteractV1") == string_view(kOfxImageEffectPluginPropOverlayInteractV1)); +static_assert(string_view("OfxImageEffectPluginPropOverlayInteractV2") == string_view(kOfxImageEffectPluginPropOverlayInteractV2)); +static_assert(string_view("OfxImageEffectPluginPropSingleInstance") == string_view(kOfxImageEffectPluginPropSingleInstance)); +static_assert(string_view("OfxImageEffectPluginRenderThreadSafety") == string_view(kOfxImageEffectPluginRenderThreadSafety)); +static_assert(string_view("OfxImageEffectPropClipPreferencesSlaveParam") == string_view(kOfxImageEffectPropClipPreferencesSlaveParam)); +static_assert(string_view("OfxImageEffectPropColourManagementAvailableConfigs") == string_view(kOfxImageEffectPropColourManagementAvailableConfigs)); +static_assert(string_view("OfxImageEffectPropColourManagementConfig") == string_view(kOfxImageEffectPropColourManagementConfig)); +static_assert(string_view("OfxImageEffectPropColourManagementStyle") == string_view(kOfxImageEffectPropColourManagementStyle)); +static_assert(string_view("OfxImageEffectPropComponents") == string_view(kOfxImageEffectPropComponents)); +static_assert(string_view("OfxImageEffectPropContext") == string_view(kOfxImageEffectPropContext)); +static_assert(string_view("OfxImageEffectPropCudaEnabled") == string_view(kOfxImageEffectPropCudaEnabled)); +static_assert(string_view("OfxImageEffectPropCudaRenderSupported") == string_view(kOfxImageEffectPropCudaRenderSupported)); +static_assert(string_view("OfxImageEffectPropCudaStream") == string_view(kOfxImageEffectPropCudaStream)); +static_assert(string_view("OfxImageEffectPropCudaStreamSupported") == string_view(kOfxImageEffectPropCudaStreamSupported)); +static_assert(string_view("OfxImageEffectPropDisplayColourspace") == string_view(kOfxImageEffectPropDisplayColourspace)); +static_assert(string_view("OfxImageEffectPropFieldToRender") == string_view(kOfxImageEffectPropFieldToRender)); +static_assert(string_view("OfxImageEffectPropFrameRange") == string_view(kOfxImageEffectPropFrameRange)); +static_assert(string_view("OfxImageEffectPropFrameRate") == string_view(kOfxImageEffectPropFrameRate)); +static_assert(string_view("OfxImageEffectPropFrameStep") == string_view(kOfxImageEffectPropFrameStep)); +static_assert(string_view("OfxImageEffectPropInAnalysis") == string_view(kOfxImageEffectPropInAnalysis)); +static_assert(string_view("OfxImageEffectPropInteractiveRenderStatus") == string_view(kOfxImageEffectPropInteractiveRenderStatus)); +static_assert(string_view("OfxImageEffectPropMetalCommandQueue") == string_view(kOfxImageEffectPropMetalCommandQueue)); +static_assert(string_view("OfxImageEffectPropMetalEnabled") == string_view(kOfxImageEffectPropMetalEnabled)); +static_assert(string_view("OfxImageEffectPropMetalRenderSupported") == string_view(kOfxImageEffectPropMetalRenderSupported)); +static_assert(string_view("OfxImageEffectPropMultipleClipDepths") == string_view(kOfxImageEffectPropSupportsMultipleClipDepths)); +static_assert(string_view("OfxImageEffectPropNoSpatialAwareness") == string_view(kOfxImageEffectPropNoSpatialAwareness)); +static_assert(string_view("OfxImageEffectPropOCIOConfig") == string_view(kOfxImageEffectPropOCIOConfig)); +static_assert(string_view("OfxImageEffectPropOCIODisplay") == string_view(kOfxImageEffectPropOCIODisplay)); +static_assert(string_view("OfxImageEffectPropOCIOView") == string_view(kOfxImageEffectPropOCIOView)); +static_assert(string_view("OfxImageEffectPropOpenCLCommandQueue") == string_view(kOfxImageEffectPropOpenCLCommandQueue)); +static_assert(string_view("OfxImageEffectPropOpenCLEnabled") == string_view(kOfxImageEffectPropOpenCLEnabled)); +static_assert(string_view("OfxImageEffectPropOpenCLImage") == string_view(kOfxImageEffectPropOpenCLImage)); +static_assert(string_view("OfxImageEffectPropOpenCLRenderSupported") == string_view(kOfxImageEffectPropOpenCLRenderSupported)); +static_assert(string_view("OfxImageEffectPropOpenCLSupported") == string_view(kOfxImageEffectPropOpenCLSupported)); +static_assert(string_view("OfxImageEffectPropOpenGLEnabled") == string_view(kOfxImageEffectPropOpenGLEnabled)); +static_assert(string_view("OfxImageEffectPropOpenGLRenderSupported") == string_view(kOfxImageEffectPropOpenGLRenderSupported)); +static_assert(string_view("OfxImageEffectPropOpenGLTextureIndex") == string_view(kOfxImageEffectPropOpenGLTextureIndex)); +static_assert(string_view("OfxImageEffectPropOpenGLTextureTarget") == string_view(kOfxImageEffectPropOpenGLTextureTarget)); +static_assert(string_view("OfxImageEffectPropPixelAspectRatio") == string_view(kOfxImageEffectPropProjectPixelAspectRatio)); +static_assert(string_view("OfxImageEffectPropPixelDepth") == string_view(kOfxImageEffectPropPixelDepth)); +static_assert(string_view("OfxImageEffectPropPluginHandle") == string_view(kOfxImageEffectPropPluginHandle)); +static_assert(string_view("OfxImageEffectPropPreMultiplication") == string_view(kOfxImageEffectPropPreMultiplication)); +static_assert(string_view("OfxImageEffectPropProjectExtent") == string_view(kOfxImageEffectPropProjectExtent)); +static_assert(string_view("OfxImageEffectPropProjectOffset") == string_view(kOfxImageEffectPropProjectOffset)); +static_assert(string_view("OfxImageEffectPropProjectSize") == string_view(kOfxImageEffectPropProjectSize)); +static_assert(string_view("OfxImageEffectPropRegionOfDefinition") == string_view(kOfxImageEffectPropRegionOfDefinition)); +static_assert(string_view("OfxImageEffectPropRegionOfInterest") == string_view(kOfxImageEffectPropRegionOfInterest)); +static_assert(string_view("OfxImageEffectPropRenderQualityDraft") == string_view(kOfxImageEffectPropRenderQualityDraft)); +static_assert(string_view("OfxImageEffectPropRenderScale") == string_view(kOfxImageEffectPropRenderScale)); +static_assert(string_view("OfxImageEffectPropRenderWindow") == string_view(kOfxImageEffectPropRenderWindow)); +static_assert(string_view("OfxImageEffectPropSequentialRenderStatus") == string_view(kOfxImageEffectPropSequentialRenderStatus)); +static_assert(string_view("OfxImageEffectPropSetableFielding") == string_view(kOfxImageEffectPropSetableFielding)); +static_assert(string_view("OfxImageEffectPropSetableFrameRate") == string_view(kOfxImageEffectPropSetableFrameRate)); +static_assert(string_view("OfxImageEffectPropSupportedComponents") == string_view(kOfxImageEffectPropSupportedComponents)); +static_assert(string_view("OfxImageEffectPropSupportedContexts") == string_view(kOfxImageEffectPropSupportedContexts)); +static_assert(string_view("OfxImageEffectPropSupportedPixelDepths") == string_view(kOfxImageEffectPropSupportedPixelDepths)); +static_assert(string_view("OfxImageEffectPropSupportsMultiResolution") == string_view(kOfxImageEffectPropSupportsMultiResolution)); +static_assert(string_view("OfxImageEffectPropSupportsMultipleClipPARs") == string_view(kOfxImageEffectPropSupportsMultipleClipPARs)); +static_assert(string_view("OfxImageEffectPropSupportsOverlays") == string_view(kOfxImageEffectPropSupportsOverlays)); +static_assert(string_view("OfxImageEffectPropSupportsTiles") == string_view(kOfxImageEffectPropSupportsTiles)); +static_assert(string_view("OfxImageEffectPropTemporalClipAccess") == string_view(kOfxImageEffectPropTemporalClipAccess)); +static_assert(string_view("OfxImageEffectPropUnmappedFrameRange") == string_view(kOfxImageEffectPropUnmappedFrameRange)); +static_assert(string_view("OfxImageEffectPropUnmappedFrameRate") == string_view(kOfxImageEffectPropUnmappedFrameRate)); +static_assert(string_view("OfxImagePropBounds") == string_view(kOfxImagePropBounds)); +static_assert(string_view("OfxImagePropData") == string_view(kOfxImagePropData)); +static_assert(string_view("OfxImagePropField") == string_view(kOfxImagePropField)); +static_assert(string_view("OfxImagePropPixelAspectRatio") == string_view(kOfxImagePropPixelAspectRatio)); +static_assert(string_view("OfxImagePropRegionOfDefinition") == string_view(kOfxImagePropRegionOfDefinition)); +static_assert(string_view("OfxImagePropRowBytes") == string_view(kOfxImagePropRowBytes)); +static_assert(string_view("OfxImagePropUniqueIdentifier") == string_view(kOfxImagePropUniqueIdentifier)); +static_assert(string_view("OfxInteractPropBackgroundColour") == string_view(kOfxInteractPropBackgroundColour)); +static_assert(string_view("OfxInteractPropBitDepth") == string_view(kOfxInteractPropBitDepth)); +static_assert(string_view("OfxInteractPropDrawContext") == string_view(kOfxInteractPropDrawContext)); +static_assert(string_view("OfxInteractPropHasAlpha") == string_view(kOfxInteractPropHasAlpha)); +static_assert(string_view("OfxInteractPropPenPosition") == string_view(kOfxInteractPropPenPosition)); +static_assert(string_view("OfxInteractPropPenPressure") == string_view(kOfxInteractPropPenPressure)); +static_assert(string_view("OfxInteractPropPenViewportPosition") == string_view(kOfxInteractPropPenViewportPosition)); +static_assert(string_view("OfxInteractPropPixelScale") == string_view(kOfxInteractPropPixelScale)); +static_assert(string_view("OfxInteractPropSlaveToParam") == string_view(kOfxInteractPropSlaveToParam)); +static_assert(string_view("OfxInteractPropSuggestedColour") == string_view(kOfxInteractPropSuggestedColour)); +static_assert(string_view("OfxInteractPropViewport") == string_view(kOfxInteractPropViewportSize)); +static_assert(string_view("OfxOpenGLPropPixelDepth") == string_view(kOfxOpenGLPropPixelDepth)); +static_assert(string_view("OfxParamHostPropMaxPages") == string_view(kOfxParamHostPropMaxPages)); +static_assert(string_view("OfxParamHostPropMaxParameters") == string_view(kOfxParamHostPropMaxParameters)); +static_assert(string_view("OfxParamHostPropPageRowColumnCount") == string_view(kOfxParamHostPropPageRowColumnCount)); +static_assert(string_view("OfxParamHostPropSupportsBooleanAnimation") == string_view(kOfxParamHostPropSupportsBooleanAnimation)); +static_assert(string_view("OfxParamHostPropSupportsChoiceAnimation") == string_view(kOfxParamHostPropSupportsChoiceAnimation)); +static_assert(string_view("OfxParamHostPropSupportsCustomAnimation") == string_view(kOfxParamHostPropSupportsCustomAnimation)); +static_assert(string_view("OfxParamHostPropSupportsCustomInteract") == string_view(kOfxParamHostPropSupportsCustomInteract)); +static_assert(string_view("OfxParamHostPropSupportsParametricAnimation") == string_view(kOfxParamHostPropSupportsParametricAnimation)); +static_assert(string_view("OfxParamHostPropSupportsStrChoice") == string_view(kOfxParamHostPropSupportsStrChoice)); +static_assert(string_view("OfxParamHostPropSupportsStrChoiceAnimation") == string_view(kOfxParamHostPropSupportsStrChoiceAnimation)); +static_assert(string_view("OfxParamHostPropSupportsStringAnimation") == string_view(kOfxParamHostPropSupportsStringAnimation)); +static_assert(string_view("OfxParamPropAnimates") == string_view(kOfxParamPropAnimates)); +static_assert(string_view("OfxParamPropCacheInvalidation") == string_view(kOfxParamPropCacheInvalidation)); +static_assert(string_view("OfxParamPropCanUndo") == string_view(kOfxParamPropCanUndo)); +static_assert(string_view("OfxParamPropChoiceEnum") == string_view(kOfxParamPropChoiceEnum)); +static_assert(string_view("OfxParamPropChoiceOption") == string_view(kOfxParamPropChoiceOption)); +static_assert(string_view("OfxParamPropChoiceOrder") == string_view(kOfxParamPropChoiceOrder)); +static_assert(string_view("OfxParamPropCustomCallbackV1") == string_view(kOfxParamPropCustomInterpCallbackV1)); +static_assert(string_view("OfxParamPropCustomValue") == string_view(kOfxParamPropCustomValue)); +static_assert(string_view("OfxParamPropDataPtr") == string_view(kOfxParamPropDataPtr)); +static_assert(string_view("OfxParamPropDefault") == string_view(kOfxParamPropDefault)); +static_assert(string_view("OfxParamPropDefaultCoordinateSystem") == string_view(kOfxParamPropDefaultCoordinateSystem)); +static_assert(string_view("OfxParamPropDigits") == string_view(kOfxParamPropDigits)); +static_assert(string_view("OfxParamPropDimensionLabel") == string_view(kOfxParamPropDimensionLabel)); +static_assert(string_view("OfxParamPropDisplayMax") == string_view(kOfxParamPropDisplayMax)); +static_assert(string_view("OfxParamPropDisplayMin") == string_view(kOfxParamPropDisplayMin)); +static_assert(string_view("OfxParamPropDoubleType") == string_view(kOfxParamPropDoubleType)); +static_assert(string_view("OfxParamPropEnabled") == string_view(kOfxParamPropEnabled)); +static_assert(string_view("OfxParamPropEvaluateOnChange") == string_view(kOfxParamPropEvaluateOnChange)); +static_assert(string_view("OfxParamPropGroupOpen") == string_view(kOfxParamPropGroupOpen)); +static_assert(string_view("OfxParamPropHasHostOverlayHandle") == string_view(kOfxParamPropHasHostOverlayHandle)); +static_assert(string_view("OfxParamPropHint") == string_view(kOfxParamPropHint)); +static_assert(string_view("OfxParamPropIncrement") == string_view(kOfxParamPropIncrement)); +static_assert(string_view("OfxParamPropInteractMinimumSize") == string_view(kOfxParamPropInteractMinimumSize)); +static_assert(string_view("OfxParamPropInteractPreferedSize") == string_view(kOfxParamPropInteractPreferedSize)); +static_assert(string_view("OfxParamPropInteractSize") == string_view(kOfxParamPropInteractSize)); +static_assert(string_view("OfxParamPropInteractSizeAspect") == string_view(kOfxParamPropInteractSizeAspect)); +static_assert(string_view("OfxParamPropInteractV1") == string_view(kOfxParamPropInteractV1)); +static_assert(string_view("OfxParamPropInterpolationAmount") == string_view(kOfxParamPropInterpolationAmount)); +static_assert(string_view("OfxParamPropInterpolationTime") == string_view(kOfxParamPropInterpolationTime)); +static_assert(string_view("OfxParamPropIsAnimating") == string_view(kOfxParamPropIsAnimating)); +static_assert(string_view("OfxParamPropIsAutoKeying") == string_view(kOfxParamPropIsAutoKeying)); +static_assert(string_view("OfxParamPropMax") == string_view(kOfxParamPropMax)); +static_assert(string_view("OfxParamPropMin") == string_view(kOfxParamPropMin)); +static_assert(string_view("OfxParamPropPageChild") == string_view(kOfxParamPropPageChild)); +static_assert(string_view("OfxParamPropParametricDimension") == string_view(kOfxParamPropParametricDimension)); +static_assert(string_view("OfxParamPropParametricInteractBackground") == string_view(kOfxParamPropParametricInteractBackground)); +static_assert(string_view("OfxParamPropParametricRange") == string_view(kOfxParamPropParametricRange)); +static_assert(string_view("OfxParamPropParametricUIColour") == string_view(kOfxParamPropParametricUIColour)); +static_assert(string_view("OfxParamPropParent") == string_view(kOfxParamPropParent)); +static_assert(string_view("OfxParamPropPersistant") == string_view(kOfxParamPropPersistant)); +static_assert(string_view("OfxParamPropPluginMayWrite") == string_view(kOfxParamPropPluginMayWrite)); +static_assert(string_view("OfxParamPropScriptName") == string_view(kOfxParamPropScriptName)); +static_assert(string_view("OfxParamPropSecret") == string_view(kOfxParamPropSecret)); +static_assert(string_view("OfxParamPropShowTimeMarker") == string_view(kOfxParamPropShowTimeMarker)); +static_assert(string_view("OfxParamPropStringFilePathExists") == string_view(kOfxParamPropStringFilePathExists)); +static_assert(string_view("OfxParamPropStringMode") == string_view(kOfxParamPropStringMode)); +static_assert(string_view("OfxParamPropType") == string_view(kOfxParamPropType)); +static_assert(string_view("OfxPluginPropFilePath") == string_view(kOfxPluginPropFilePath)); +static_assert(string_view("OfxPluginPropParamPageOrder") == string_view(kOfxPluginPropParamPageOrder)); +static_assert(string_view("OfxPropAPIVersion") == string_view(kOfxPropAPIVersion)); +static_assert(string_view("OfxPropChangeReason") == string_view(kOfxPropChangeReason)); +static_assert(string_view("OfxPropEffectInstance") == string_view(kOfxPropEffectInstance)); +static_assert(string_view("OfxPropHostOSHandle") == string_view(kOfxPropHostOSHandle)); +static_assert(string_view("OfxPropIcon") == string_view(kOfxPropIcon)); +static_assert(string_view("OfxPropInstanceData") == string_view(kOfxPropInstanceData)); +static_assert(string_view("OfxPropIsInteractive") == string_view(kOfxPropIsInteractive)); +static_assert(string_view("OfxPropLabel") == string_view(kOfxPropLabel)); +static_assert(string_view("OfxPropLongLabel") == string_view(kOfxPropLongLabel)); +static_assert(string_view("OfxPropName") == string_view(kOfxPropName)); +static_assert(string_view("OfxPropParamSetNeedsSyncing") == string_view(kOfxPropParamSetNeedsSyncing)); +static_assert(string_view("OfxPropPluginDescription") == string_view(kOfxPropPluginDescription)); +static_assert(string_view("OfxPropShortLabel") == string_view(kOfxPropShortLabel)); +static_assert(string_view("OfxPropTime") == string_view(kOfxPropTime)); +static_assert(string_view("OfxPropType") == string_view(kOfxPropType)); +static_assert(string_view("OfxPropVersion") == string_view(kOfxPropVersion)); +static_assert(string_view("OfxPropVersionLabel") == string_view(kOfxPropVersionLabel)); +static_assert(string_view("kOfxParamPropUseHostOverlayHandle") == string_view(kOfxParamPropUseHostOverlayHandle)); +static_assert(string_view("kOfxPropKeyString") == string_view(kOfxPropKeyString)); +static_assert(string_view("kOfxPropKeySym") == string_view(kOfxPropKeySym)); +} // namespace assertions +} // namespace openfx diff --git a/openfx-cpp/include/openfx/ofxSpan.h b/openfx-cpp/include/openfx/ofxSpan.h new file mode 100644 index 000000000..cdcfc1b4e --- /dev/null +++ b/openfx-cpp/include/openfx/ofxSpan.h @@ -0,0 +1,138 @@ +// Copyright OpenFX and contributors to the OpenFX project. +// SPDX-License-Identifier: BSD-3-Clause + +#pragma once + +/** + * @file ofxSpan.h + * @brief Provides std::span or compatible implementation for all C++ versions + * + * This header provides a span type (non-owning view over contiguous sequences) + * that works with C++17 and later. In C++20+, it uses std::span. For earlier + * versions, it uses tcbrindle/span from the Conan package tcb-span. + * + * The tcb-span package is automatically provided via Conan dependencies. + * See https://github.com/tcbrindle/span for more information. + * + * Usage: + * openfx::span values = myVector; + * openfx::span writable = myArray; + * for (auto v : values) { ... } + */ + +// Use std::span if available (C++20+) +#if __cplusplus >= 202002L && __has_include() + #include + namespace openfx { + template + using span = std::span; + + inline constexpr std::size_t dynamic_extent = std::dynamic_extent; + } + #define OPENFX_HAS_STD_SPAN 1 + +// Otherwise use tcbrindle/span for C++11/14/17 (via Conan package tcb-span) +#else + // The tcb-span Conan package provides tcb/span.hpp + // You can override this by defining OPENFX_SPAN_HEADER before including this file: + // #define OPENFX_SPAN_HEADER "my_span.hpp" + + #ifndef OPENFX_SPAN_HEADER + #define OPENFX_SPAN_HEADER + #endif + + // Configure tcbrindle/span to use openfx namespace + #define TCB_SPAN_NAMESPACE_NAME openfx + #include OPENFX_SPAN_HEADER + #undef TCB_SPAN_NAMESPACE_NAME + + // Note: tcbrindle/span already defines openfx::span, openfx::dynamic_extent, + // and openfx::make_span helpers + #define OPENFX_HAS_STD_SPAN 0 +#endif + +// Only define make_span helpers when using std::span (C++20+) +// tcbrindle/span already provides these in the openfx namespace +#if OPENFX_HAS_STD_SPAN +namespace openfx { + +/** + * @brief Helper to create a span from a C-style array with size + * + * Usage: + * const char* items[] = {"a", "b", "c"}; + * auto s = make_span(items, 3); + */ +template +constexpr span make_span(T* ptr, std::size_t count) noexcept { + return span(ptr, count); +} + +/** + * @brief Helper to create a span from a C-style array + * + * Usage: + * const char* items[] = {"a", "b", "c"}; + * auto s = make_span(items); // Size deduced as 3 + */ +template +constexpr span make_span(T (&arr)[N]) noexcept { + return span(arr); +} + +/** + * @brief Helper to create a span from a container (vector, array, etc.) + * + * Usage: + * std::vector v = {1, 2, 3}; + * auto s = make_span(v); + */ +template +constexpr auto make_span(Container& cont) noexcept + -> span { + return span(cont); +} + +template +constexpr auto make_span(const Container& cont) noexcept + -> span { + return span(cont); +} + +} // namespace openfx +#endif // OPENFX_HAS_STD_SPAN + +/** + * Usage Examples: + * + * // From vector: + * std::vector vec = {1, 2, 3}; + * openfx::span s1 = vec; + * + * // From array: + * std::array arr = {1.0, 2.0, 3.0, 4.0}; + * openfx::span s2 = arr; + * + * // From C-style array: + * const char* items[] = {"a", "b", "c"}; + * openfx::span s3 = openfx::make_span(items, 3); + * + * // Range-for: + * for (auto item : s3) { + * // process item + * } + * + * // Bounds-checked access (debug mode with tcbrindle/span): + * auto first = s1[0]; // OK + * auto oob = s1[100]; // Throws/asserts in debug mode + * + * // Named accessors: + * auto front = s1.front(); + * auto back = s1.back(); + * bool empty = s1.empty(); + * size_t size = s1.size(); + * + * // Subspans: + * auto first_two = s1.subspan(0, 2); + * auto last_two = s1.subspan(s1.size() - 2); + */ diff --git a/openfx-cpp/include/openfx/ofxStatusStrings.h b/openfx-cpp/include/openfx/ofxStatusStrings.h new file mode 100644 index 000000000..82c3251b2 --- /dev/null +++ b/openfx-cpp/include/openfx/ofxStatusStrings.h @@ -0,0 +1,56 @@ +/**************************************************************/ +/* */ +/* Copyright 2025 Dark Star Systems, Inc. */ +/* All Rights Reserved. */ +/* */ +/**************************************************************/ + +#pragma once + +#include +#include + +inline const char *ofxStatusToString(OfxStatus s) { + switch (s) { + case kOfxStatOK: + return "kOfxStatOK"; + case kOfxStatFailed: + return "kOfxStatFailed"; + case kOfxStatErrFatal: + return "kOfxStatErrFatal"; + case kOfxStatErrUnknown: + return "kOfxStatErrUnknown"; + case kOfxStatErrMissingHostFeature: + return "kOfxStatErrMissingHostFeature"; + case kOfxStatErrUnsupported: + return "kOfxStatErrUnsupported"; + case kOfxStatErrExists: + return "kOfxStatErrExists"; + case kOfxStatErrFormat: + return "kOfxStatErrFormat"; + case kOfxStatErrMemory: + return "kOfxStatErrMemory"; + case kOfxStatErrBadHandle: + return "kOfxStatErrBadHandle"; + case kOfxStatErrBadIndex: + return "kOfxStatErrBadIndex"; + case kOfxStatErrValue: + return "kOfxStatErrValue"; + case kOfxStatReplyYes: + return "kOfxStatReplyYes"; + case kOfxStatReplyNo: + return "kOfxStatReplyNo"; + case kOfxStatReplyDefault: + return "kOfxStatReplyDefault"; + + case kOfxStatErrImageFormat: + return "kOfxStatErrImageFormat"; + + case kOfxStatGPUOutOfMemory: + return "kOfxStatGPUOutOfMemory"; + case kOfxStatGPURenderFailed: + return "kOfxStatGPURenderFailed"; + default: + return "Unknown OFX Status"; + } +} diff --git a/openfx-cpp/include/openfx/ofxSuites.h b/openfx-cpp/include/openfx/ofxSuites.h new file mode 100644 index 000000000..a5d642888 --- /dev/null +++ b/openfx-cpp/include/openfx/ofxSuites.h @@ -0,0 +1,166 @@ +/**************************************************************/ +/* */ +/* Copyright 2025 GoPro, Inc. */ +/* All Rights Reserved. */ +/* */ +/**************************************************************/ + +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +/*** + Usage: + + === Adding suites in onLoad: + + openfx::SuiteContainer gSuites; + + OfxStatus OnLoad() { + OfxParameterSuiteV1* paramSuite = + static_cast(gHost->fetchSuite(gHost->host, kOfxParameterSuite, 1)); + if (paramSuite) + gSuites.add(kOfxParameterSuite, 1, paramSuite); + + // or use the convenience macro: + OPENFX_FETCH_SUITE(gSuites, kOfxParameterSuite, 1, OfxParameterSuiteV1); + OPENFX_FETCH_SUITE(gSuites, kOfxPropertySuite, 1, OfxPropertySuiteV1); + // ... + } + + In both cases, missing suites will be null, Use gSuites.has() to check. + + === Getting suites: + auto paramSuite = gSuites.get(); + auto propSuite = gSuites.get(); + auto myCustomSuite = gSuites.get("customSuiteName"); + if (suites.has()) { + // ... + } +*/ + +// Use this in onLoad action to fetch suites and store them in the suites container +#define OPENFX_FETCH_SUITE(container, suiteName, suiteVersion, suiteType) \ + do { \ + const suiteType* suite = \ + static_cast(gHost->fetchSuite(gHost->host, suiteName, suiteVersion)); \ + if (suite) { \ + container.add(suiteName, suiteVersion, suite); \ + } \ + } while (0) + +namespace openfx { + +namespace detail { +struct SuiteKey { + std::string name; + int version; + + SuiteKey(const std::string& n, int v) : name(n), version(v) {} + + bool operator==(const SuiteKey& other) const { + return name == other.name && version == other.version; + } +}; + +// Hash a SuiteKey +struct SuiteKeyHash { + size_t operator()(const SuiteKey& key) const { + return std::hash()(key.name) ^ (std::hash()(key.version) << 1); + } +}; + +} // namespace detail + +struct SuiteContainer { + std::unordered_map suites; + + template + const T* get(const std::string& name, int version) const { + auto it = suites.find({name, version}); + return (it != suites.end()) ? static_cast(it->second) : nullptr; + } + + template + const T* get() const { + // Default impl, to be specialized for different suite types + assert((false && "Calling generic SuiteContainer.get with no suite name")); + return nullptr; // Default implementation returns nullptr + } + + // Check if suite is registered in the container + bool has(const std::string& name, int version) const { + return suites.find({name, version}) != suites.end(); + } + + template + bool has() const { + // Will be specialized just like get() + assert((false && "Calling generic SuiteContainer.has with no suite name")); + return false; + } + + template + void add(const std::string& name, int version, T* suite) { + suites[{name, version}] = static_cast(suite); + } +}; + +// Macro to define `get` and `has` specializations for a suite +#define DEFINE_SUITE(suiteType, suiteName, suiteVersion) \ + template <> \ + inline const suiteType* SuiteContainer::get() const { \ + try { \ + return static_cast(suites.at({suiteName, suiteVersion})); \ + } catch (std::out_of_range & e) { \ + return nullptr; \ + } \ + } \ + template <> \ + inline const suiteType* SuiteContainer::get() const { \ + try { \ + return static_cast(suites.at({suiteName, suiteVersion})); \ + } catch (std::out_of_range & e) { \ + return nullptr; \ + } \ + } \ + template <> \ + inline bool SuiteContainer::has() const { \ + return suites.find({suiteName, suiteVersion}) != suites.end(); \ + } + +// Define specializations for standard OFX suites +DEFINE_SUITE(OfxTimeLineSuiteV1, kOfxTimeLineSuite, 1); +DEFINE_SUITE(OfxParameterSuiteV1, kOfxParameterSuite, 1); +DEFINE_SUITE(OfxPropertySuiteV1, kOfxPropertySuite, 1); +DEFINE_SUITE(OfxDialogSuiteV1, kOfxDialogSuite, 1); +DEFINE_SUITE(OfxMessageSuiteV1, kOfxMessageSuite, 1); +DEFINE_SUITE(OfxMessageSuiteV2, kOfxMessageSuite, 2); +DEFINE_SUITE(OfxParametricParameterSuiteV1, kOfxParametricParameterSuite, 1); +DEFINE_SUITE(OfxMultiThreadSuiteV1, kOfxMultiThreadSuite, 1); +DEFINE_SUITE(OfxProgressSuiteV1, kOfxProgressSuite, 1); +DEFINE_SUITE(OfxProgressSuiteV2, kOfxProgressSuite, 2); +DEFINE_SUITE(OfxImageEffectOpenGLRenderSuiteV1, kOfxOpenGLRenderSuite, 1); +DEFINE_SUITE(OfxOpenCLProgramSuiteV1, kOfxOpenCLProgramSuite, 1); +DEFINE_SUITE(OfxMemorySuiteV1, kOfxMemorySuite, 1); +DEFINE_SUITE(OfxImageEffectSuiteV1, kOfxImageEffectSuite, 1); +DEFINE_SUITE(OfxDrawSuiteV1, kOfxDrawSuite, 1); +DEFINE_SUITE(OfxInteractSuiteV1, kOfxInteractSuite, 1); + +#undef DEFINE_SUITE + +} // namespace openfx diff --git a/scripts/build-cmake.sh b/scripts/build-cmake.sh index 24fd12e6c..03940e87f 100755 --- a/scripts/build-cmake.sh +++ b/scripts/build-cmake.sh @@ -123,16 +123,16 @@ fi # Install dependencies, set up build dir, and generate build files. -echo === Running conan to install dependencies +echo '=== Running conan to install dependencies' [[ $USE_OPENCL ]] && conan_opts="$conan_opts -o use_opencl=True" $CONAN install ${GENERATOR_OPTION} -s build_type=$BUILDTYPE -pr:b=default --build=missing . $conan_opts -echo === Running cmake +echo '=== Running cmake' # Generate the build files [[ $USE_OPENCL ]] && cmake_opts="$cmake_opts -DOFX_SUPPORTS_OPENCLRENDER=TRUE" cmake --preset ${PRESET_NAME} -DBUILD_EXAMPLE_PLUGINS=TRUE $cmake_opts $ARGS -echo === Building and installing plugins and support libs +echo '=== Building and installing plugins and support libs' cmake --build ${CMAKE_BUILD_DIR} --target install --config $BUILDTYPE --parallel $VERBOSE set +x diff --git a/scripts/gen-props-doc.py b/scripts/gen-props-doc.py new file mode 100755 index 000000000..c97e91859 --- /dev/null +++ b/scripts/gen-props-doc.py @@ -0,0 +1,416 @@ +#!/usr/bin/env python3 +# Copyright OpenFX and contributors to the OpenFX project. +# SPDX-License-Identifier: BSD-3-Clause + +# /// script +# requires-python = ">=3.11" +# dependencies = [ +# "pyyaml>=1.0", +# ] +# /// + +import os +import sys +import argparse +import yaml +import logging +from pathlib import Path +from collections import defaultdict + +# Set up basic configuration for logging +logging.basicConfig( + level=logging.INFO, # Log level: DEBUG, INFO, WARNING, ERROR, CRITICAL + format='%(levelname)s: %(message)s', # Format of the log messages + datefmt='%Y-%m-%d %H:%M:%S' # Date format +) + +def get_def(name: str, defs): + if name.endswith('_REF'): + defname = name.replace("_REF", "_DEF") + return defs[defname] + else: + return [name] + +def expand_set_props(props_by_set): + """Expand refs in props_by_sets. + YAML can't interpolate a list, so we do it here, using + our own method: + - A prop set may end with _DEF in which case it's just a definition + containing a list of prop names. + - A prop *name* may be _REF which means to interpolate the + corresponding DEF list into this set's props. + Returns a new props_by_set with DEFs removed and all lists interpolated. + """ + # First get all the list defs + defs = {} + sets = {} + for key, value in props_by_set.items(): + if key.endswith('_DEF'): + defs[key] = value # should be a list to be interpolated + else: + sets[key] = value + for key in sets: + if not sets[key].get('props'): + pass # do nothing, no expansion needed in inArgs/outArgs for now + else: + sets[key]['props'] = [item for element in sets[key]['props'] \ + for item in get_def(element, defs)] + return sets + +def props_for_set(pset, props_by_set, name_only=True): + """Generator yielding all props for the given prop set (not used for actions). + This implements the options override scheme, parsing the prop name etc. + If not name_only, yields a dict of name and other options. + """ + import re + + if not props_by_set[pset].get('props'): + return + + # All the default options for this propset. Merged into each prop. + propset_options = props_by_set[pset].copy() + propset_options.pop('props', None) + + for p in props_by_set[pset]['props']: + # Parse p, of form NAME | key=value,key=value + if '|' in p: + parts = p.split('|', 1) + name = parts[0].strip() + key_values_str = parts[1].strip() + + if name_only: + yield name + else: + # Parse key/value pairs, apply defaults, and include name + options = {} + if key_values_str: + key_values = key_values_str.split(',') + for kv in key_values: + if '=' in kv: + k, v = kv.split('=', 1) + options[k.strip()] = v.strip() + + yield {**propset_options, **options, **{"name": name}} + else: + # Simple property name with no options + if name_only: + yield p + else: + yield {**propset_options, **{"name": p}} + +def get_cname(propname, props_metadata): + """Get the C `#define` name for a property name. + + Look up the special cname in props_metadata, or in the normal + case just prepend "k". + """ + return props_metadata[propname].get('cname', "k" + propname) + +def generate_property_documentation(props_metadata, props_by_set, outfile_path): + """Generate RST documentation for all properties + + This creates a comprehensive property reference that includes: + - Property name + - C #define name + - Type and dimension + - Property sets where it's used + - Description (if available) + - Valid values (for enums) + - Link to Doxygen documentation + """ + with open(outfile_path, 'w') as outfile: + outfile.write(".. _propertiesReferenceGenerated:\n") + outfile.write("Properties Reference (Generated)\n") + outfile.write("==============================\n\n") + outfile.write("This reference is auto-generated from property definitions in the OpenFX source code.\n") + outfile.write("It provides a structured view of properties with their types, dimensions, and where they are used.\n") + outfile.write("For each property, a link to the detailed Doxygen documentation is provided when available.\n\n") + + # Create a mapping from property to the sets that use it + prop_to_sets = defaultdict(list) + for pset in props_by_set: + for prop in props_for_set(pset, props_by_set): + prop_to_sets[prop].append(pset) + + # Process properties by type + types = { + 'int': 'Integer', + 'double': 'Double', + 'string': 'String', + 'bool': 'Boolean', + 'enum': 'Enumeration', + 'pointer': 'Pointer' + } + + # Group properties by type + for type_key, type_name in sorted(types.items()): + type_props = [p for p in props_metadata if props_metadata[p].get('type') == type_key or + (isinstance(props_metadata[p].get('type'), list) and type_key in props_metadata[p].get('type'))] + + if not type_props: + continue + + outfile.write(f"\n{type_name} Properties\n{'-' * len(type_name) + '-----------'}\n\n") + + for prop in sorted(type_props): + # Get metadata + metadata = props_metadata[prop] + cname = get_cname(prop, props_metadata) + + # Write property name and C define name + outfile.write(f".. _prop_{prop}:\n\n") + outfile.write(f"**{prop}**\n") + outfile.write(f"{'^' * len(prop)}\n\n") + + # Link to the corresponding Doxygen documentation + outfile.write(f"- **C #define**: :c:macro:`{cname}`\n") + + # Write type and dimension + if isinstance(metadata.get('type'), list): + types_str = ', '.join(metadata.get('type')) + outfile.write(f"- **Type**: Multiple types: {types_str}\n") + else: + outfile.write(f"- **Type**: {metadata.get('type', 'unknown')}\n") + + dim = metadata.get('dimension', 'unknown') + if dim == 0: + outfile.write(f"- **Dimension**: Variable (0 or more)\n") + else: + outfile.write(f"- **Dimension**: {dim}\n") + + # Write property sets where this is used + if prop in prop_to_sets: + sets_str = ', '.join([f':ref:`{s} `' for s in sorted(prop_to_sets[prop])]) + outfile.write(f"- **Used in Property Sets**: {sets_str}\n") + + # Write valid values for enums + if metadata.get('type') == 'enum' and metadata.get('values'): + outfile.write("- **Valid Values**:\n") + for value in metadata.get('values'): + outfile.write(f" - ``{value}``\n") + + # Write additional metadata + if metadata.get('default'): + outfile.write(f"- **Default**: {metadata.get('default')}\n") + + if metadata.get('introduced'): + outfile.write(f"- **Introduced in**: version {metadata.get('introduced')}\n") + + if metadata.get('deprecated'): + outfile.write(f"- **Deprecated in**: version {metadata.get('deprecated')}\n") + + # Add direct link to Doxygen documentation for detailed info + outfile.write(f"- **Doc**: For detailed doc, see :c:macro:`{cname}`.\n") + + outfile.write("\n") + +def generate_action_args_documentation(action_data, props_metadata, props_by_set_doc): + """Generate documentation for action arguments (inArgs/outArgs).""" + action_section = [] + + action_section.append("\nActions Property Sets\n-------------------\n\n") + action_section.append("Actions in OFX have input and output property sets that are used to pass data between the host and plugin.\n") + action_section.append("For each action, the required input properties (passed from host to plugin) and output properties ") + action_section.append("(set by the plugin for the host to read) are documented.\n\n") + + # Add a quick reference table of contents for all actions + action_section.append("**Actions Quick Reference**\n\n") + for action_name in sorted(action_data.keys()): + action_section.append(f"* :ref:`{action_name} `\n") + action_section.append("\n") + + for action_name in sorted(action_data.keys()): + # Create a section for this action + action_section.append(f".. _action_{action_name}:\n\n") + action_section.append(f"**{action_name}**\n") + action_section.append(f"{'^' * len(action_name)}\n\n") + has_args = False + + # Document inArgs (input properties) + if action_data[action_name].get('inArgs'): + has_args = True + action_section.append(f"**Input Arguments**\n\n") + + for prop in action_data[action_name]['inArgs']: + metadata = props_metadata.get(prop) + if not metadata: + action_section.append(f"- ``{prop}`` - (No metadata available)\n") + continue + + # Determine type display + if isinstance(metadata.get('type'), list): + type_str = '/'.join(metadata.get('type')) + else: + type_str = metadata.get('type', 'unknown') + + # Get dimension + dim = metadata.get('dimension', 'unknown') + if dim == 0: + dim_str = "Variable" + else: + dim_str = str(dim) + + # Get C name + cname = get_cname(prop, props_metadata) + + # Write property entry with link to full definition and Doxygen reference + action_section.append(f"- :ref:`{prop} ` - Type: {type_str}, Dimension: {dim_str} (:c:macro:`{cname}`)\n") + + action_section.append("\n") + + # Document outArgs (output properties) + if action_data[action_name].get('outArgs'): + has_args = True + action_section.append(f"**Output Arguments**\n\n") + + for prop in action_data[action_name]['outArgs']: + metadata = props_metadata.get(prop) + if not metadata: + action_section.append(f"- ``{prop}`` - (No metadata available)\n") + continue + + # Determine type display + if isinstance(metadata.get('type'), list): + type_str = '/'.join(metadata.get('type')) + else: + type_str = metadata.get('type', 'unknown') + + # Get dimension + dim = metadata.get('dimension', 'unknown') + if dim == 0: + dim_str = "Variable" + else: + dim_str = str(dim) + + # Get C name + cname = get_cname(prop, props_metadata) + + # Write property entry with link to full definition and Doxygen reference + action_section.append(f"- :ref:`{prop} ` - Type: {type_str}, Dimension: {dim_str} (doc: :c:macro:`{cname}`)\n") + + action_section.append("\n") + if not has_args: + action_section.append(f"-- no in/out args --\n\n") + return ''.join(action_section) + +def generate_property_set_documentation(props_by_set, props_metadata, actions_data, outfile_path): + """Generate RST documentation for property sets and action property sets + + This creates documentation on property sets and the properties they contain, + as well as action property sets (inArgs/outArgs) + """ + with open(outfile_path, 'w') as outfile: + outfile.write(".. _propertySetReferenceGenerated:\n") + outfile.write("Property Sets Reference (Generated)\n") + outfile.write("==================================\n\n") + outfile.write("This reference is auto-generated from property set definitions in the OpenFX source code.\n") + outfile.write("It provides an overview of property sets and their associated properties.\n") + outfile.write("For each property, a link to its detailed description in the :doc:`Properties Reference (Generated) ` is provided.\n\n") + + # First document the regular property sets + outfile.write("Regular Property Sets\n--------------------\n\n") + outfile.write("These property sets represent collections of properties associated with various OpenFX objects.\n\n") + + # Build a table of contents for the property sets + outfile.write("**Property Sets Quick Reference**\n\n") + for pset in sorted(props_by_set.keys()): + if not pset.endswith('_DEF'): + outfile.write(f"* :ref:`{pset} `\n") + outfile.write("\n") + + for pset in sorted(props_by_set.keys()): + # Skip DEF sets as they're just for internal organization + if pset.endswith('_DEF'): + continue + + outfile.write(f".. _propset_{pset}:\n\n") + outfile.write(f"**{pset}**\n") + outfile.write(f"{'^' * len(pset)}\n\n") + + # Write access information + write_access = props_by_set[pset].get('write', 'unknown') + outfile.write(f"- **Write Access**: {write_access}\n\n") + + # List all properties in this set + outfile.write("**Properties**\n\n") + + props_list = list(props_for_set(pset, props_by_set)) + if not props_list: + outfile.write("No properties defined for this set.\n\n") + continue + + for prop in sorted(props_list): + metadata = props_metadata.get(prop) + if not metadata: + continue + + # Determine type display + if isinstance(metadata.get('type'), list): + type_str = '/'.join(metadata.get('type')) + else: + type_str = metadata.get('type', 'unknown') + + # Get dimension + dim = metadata.get('dimension', 'unknown') + if dim == 0: + dim_str = "Variable" + else: + dim_str = str(dim) + + # Get C name + cname = get_cname(prop, props_metadata) + + # Write property entry with link to full definition and Doxygen doc reference + outfile.write(f"- :ref:`{prop} ` - Type: {type_str}, Dimension: {dim_str} (doc: :c:macro:`{cname}`)\n") + + outfile.write("\n") + + # Now add the Action property sets section + action_docs = generate_action_args_documentation(actions_data, props_metadata, props_by_set) + outfile.write(action_docs) + +def main(): + script_dir = os.path.dirname(os.path.abspath(__file__)) + include_dir = Path(script_dir).parent / 'include' + doc_ref_dir = Path(script_dir).parent / 'Documentation/sources/Reference' + + # Default output paths + props_doc_path = doc_ref_dir / 'ofxPropertiesReferenceGenerated.rst' + propsets_doc_path = doc_ref_dir / 'ofxPropertySetsGenerated.rst' + + parser = argparse.ArgumentParser(description="Generate RST documentation from OpenFX properties YAML") + parser.add_argument('--props-file', default=include_dir/'ofx-props.yml', + help="Path to the ofx-props.yml file") + parser.add_argument('--props-doc', default=props_doc_path, + help="Output path for properties documentation") + parser.add_argument('--propsets-doc', default=propsets_doc_path, + help="Output path for property sets documentation") + parser.add_argument('-v', '--verbose', action='store_true', + help="Enable verbose output") + + args = parser.parse_args() + + if args.verbose: + logging.info(f"Reading properties from {args.props_file}") + + # Load property definitions + with open(args.props_file, 'r') as props_file: + props_data = yaml.safe_load(props_file) + + props_by_set = expand_set_props(props_data['propertySets']) + props_metadata = props_data['properties'] + actions_data = props_data.get('Actions', {}) + + if args.verbose: + logging.info(f"Generating property documentation in {args.props_doc}") + generate_property_documentation(props_metadata, props_by_set, args.props_doc) + + if args.verbose: + logging.info(f"Generating property sets documentation in {args.propsets_doc}") + generate_property_set_documentation(props_by_set, props_metadata, actions_data, args.propsets_doc) + + if args.verbose: + logging.info("Documentation generation complete") + +if __name__ == "__main__": + main() diff --git a/scripts/gen-props.py b/scripts/gen-props.py new file mode 100644 index 000000000..89161b9e0 --- /dev/null +++ b/scripts/gen-props.py @@ -0,0 +1,949 @@ +# Copyright OpenFX and contributors to the OpenFX project. +# SPDX-License-Identifier: BSD-3-Clause + +# /// script +# requires-python = ">=3.11" +# dependencies = [ +# "pyyaml>=1.0", +# ] +# /// + +import os +import re +import sys +import difflib +import argparse +import yaml +import logging +from pathlib import Path +from collections.abc import Iterable + +# Set up basic configuration for logging +logging.basicConfig( + level=logging.INFO, # Log level: DEBUG, INFO, WARNING, ERROR, CRITICAL + format='%(levelname)s: %(message)s', # Format of the log messages + datefmt='%Y-%m-%d %H:%M:%S' # Date format +) + +# Global vars and config + +generated_source_header = """// Copyright OpenFX and contributors to the OpenFX project. +// SPDX-License-Identifier: BSD-3-Clause +// NOTE: This file is auto-generated by gen-props.py. DO NOT EDIT. +""" + + +def getPropertiesFromFile(path): + """Get all OpenFX property definitions from C header file. + + Uses a heuristic to identify property #define lines: + anything starting with '#define' and containing 'Prop' in the name. + """ + props = set() + with open(path) as f: + try: + lines = f.readlines() + except UnicodeDecodeError as e: + logging.error(f'error reading {path}: {e}') + raise e + for l in lines: + # Detect lines that correspond to a property definition, e.g: + # #define kOfxPropLala "OfxPropLala" + splits=l.split() + if len(splits) < 3: + continue + if splits[0] != '#define': + continue + # ignore these + nonProperties = ('kOfxPropertySuite', + # prop values, not props + 'kOfxImageEffectPropColourManagementNone', + 'kOfxImageEffectPropColourManagementBasic', + 'kOfxImageEffectPropColourManagementCore', + 'kOfxImageEffectPropColourManagementFull', + 'kOfxImageEffectPropColourManagementOCIO', + ) + if splits[1] in nonProperties: + continue + # these are props, as well as anything with Prop in the name + badlyNamedProperties = ("kOfxImageEffectFrameVarying", + "kOfxImageEffectPluginRenderThreadSafety") + if 'Prop' in splits[1] \ + or any(s in splits[1] for s in badlyNamedProperties): + props.add(splits[1]) + return props + +def getPropertiesFromDir(dir): + """ + Recursively get all property definitions from source files in a dir. + """ + + extensions = {'.c', '.h', '.cxx', '.hxx', '.cpp', '.hpp'} + + props = set() + for root, _dirs, files in os.walk(dir): + for file in files: + # Get the file extension + file_extension = os.path.splitext(file)[1] + + if file_extension in extensions: + file_path = os.path.join(root, file) + props |= getPropertiesFromFile(file_path) + return list(props) + +def get_def(name: str, defs): + if name.endswith('_REF'): + defname = name.replace("_REF", "_DEF") + return defs[defname] + else: + return [name] + +def expand_set_props(props_by_set): + """Expand refs in props_by_sets. + YAML can't interpolate a list, so we do it here, using + our own method: + - A prop set may end with _DEF in which case it's just a definition + containing a list of prop names. + - A prop *name* may be _REF which means to interpolate the + corresponding DEF list into this set's props. + Returns a new props_by_set with DEFs removed and all lists interpolated. + """ + # First get all the list defs + defs = {} + sets = {} + for key, value in props_by_set.items(): + if key.endswith('_DEF'): + defs[key] = value # should be a list to be interpolated + else: + sets[key] = value + for key in sets: + if not sets[key].get('props'): + pass # do nothing, no expansion needed in inArgs/outArgs for now + else: + sets[key]['props'] = [item for element in sets[key]['props'] \ + for item in get_def(element, defs)] + return sets + +def actions_to_propsets(props_by_action): + """Convert action argument property sets to the same format as regular property sets. + + Actions have the structure: + ActionName: + inArgs: [prop1, prop2, ...] + outArgs: [prop3, prop4, ...] + + We convert this to property sets named like: + ImageEffectActionDescribeInContext_InArgs: {props: [prop1, prop2, ...], write: 'host'} + ImageEffectActionDescribeInContext_OutArgs: {props: [prop3, prop4, ...], write: 'plugin'} + + The class names are full action names minus "Ofx" prefix, matching C API names. + """ + result = {} + + for action_name, args in props_by_action.items(): + # Remove "Ofx" prefix to get class-friendly name that matches C API + # OfxImageEffectActionDescribeInContext -> ImageEffectActionDescribeInContext + # OfxActionLoad -> ActionLoad + # OfxInteractActionDraw -> InteractActionDraw + simple_name = action_name + if simple_name.startswith('Ofx'): + simple_name = simple_name[3:] # Remove "Ofx" prefix + + # Generate InArgs property set + if 'inArgs' in args and args['inArgs']: + key = f"{simple_name}_InArgs" + result[key] = { + 'props': args['inArgs'], + 'write': 'host' # inArgs are written by host, read by plugin + } + + # Generate OutArgs property set + if 'outArgs' in args and args['outArgs']: + key = f"{simple_name}_OutArgs" + result[key] = { + 'props': args['outArgs'], + 'write': 'plugin' # outArgs are written by plugin, read by host + } + + return result + +def get_cname(propname, props_metadata): + """Get the C `#define` name for a property name. + + Look up the special cname in props_metadata, or in the normal + case just prepend "k". + """ + return props_metadata[propname].get('cname', "k" + propname) + +def get_prop_id(propname): + """HACK ALERT: a few props' names (string values) start with k. + Those are also the #define names. If we use those as PropId enum + values, they'll get expanded into the strings which will lead to + compile errors. This means the names to be looked up always don't + have the "k". We could prefix them or something but this should be + OK. """ + if propname.startswith("k"): + return propname[1:] + return propname + +def find_stringname(cname, props_metadata): + """Try to find the actual string corresponding to the C #define name. + This may be slow; looks through all the metadata for a matching + "cname", otherwise strips "k". + """ + for p in props_metadata: + if props_metadata[p].get('cname') == cname: + return p + if cname.startswith("k"): + return cname[1:] + return "unknown-stringname-for-" + cname + +def find_missing(all_props, props_metadata): + """Find and print all mismatches between prop defs and metadata. + + Returns 0 if no errors. + """ + errs = 0 + for p in sorted(all_props): # constants from #include files, with "k" prefix + stringval = find_stringname(p, props_metadata) + if not props_metadata.get(stringval): + logging.error(f"No YAML metadata found for {p}") + errs += 1 + for p in sorted(props_metadata): + cname = get_cname(p, props_metadata) + if cname not in all_props: + logging.error(f"No prop definition found for '{p}' in source/include") + matches = difflib.get_close_matches(p, all_props, 3, 0.9) + if matches: + logging.info(f" Did you mean: {matches}") + errs += 1 + return errs + +def props_for_set(pset, props_by_set, name_only=True): + """Generator yielding all props for the given prop set (not used for actions). + This implements the options override scheme, parsing the prop name etc. + If not name_only, yields a dict of name and other options. + """ + if not props_by_set[pset].get('props'): + return + # All the default options for this propset. Merged into each prop. + propset_options = props_by_set[pset].copy() + propset_options.pop('props', None) + for p in props_by_set[pset]['props']: + # Parse p, of form NAME | key=value,key=value + pattern = r'^\s*(\w+)\s*\|\s*([\w\s,=]*)$' + match = re.match(pattern, p) + if not match: + if name_only: + yield p + else: + yield {**propset_options, **{"name": p}} + continue + name = match.group(1) + if name_only: + yield name + else: + # parse key/value pairs, apply defaults, and include name + key_values_str = match.group(2).strip() + if not key_values_str: + options = {} + else: + # Handle both "optional" shorthand and "key=value" format + # "optional" is shorthand for "host_optional=true" + if key_values_str == 'optional': + options = {'host_optional': 'true'} + else: + key_value_pattern = r'(\w+)=([\w-]+)' + options = dict(re.findall(key_value_pattern, key_values_str)) + yield {**propset_options, **options, **{"name": name}} + +def check_props_by_set(props_by_set, props_by_action, props_metadata): + """Find and print all mismatches between prop set specs, props, and metadata. + + * Each prop name in props_by_set should have a match in props_metadata + Note that props_by_pset may have multiple levels, e.g. inArgs for an action. + Returns 0 if no errors. + """ + errs = 0 + for pset in sorted(props_by_set): + for p in props_for_set(pset, props_by_set): + if not props_metadata.get(p): + logging.error(f"No props metadata found for {pset}.{p}") + errs += 1 + for pset in sorted(props_by_action): + # For actions, the value of props_by_set[pset] is a dict, each + # (e.g. inArgs, outArgs) containing a list of props. + for subset in sorted(props_by_action[pset]): + if not props_by_action[pset][subset]: + continue + for p in props_by_action[pset][subset]: + if not props_metadata.get(p): + logging.error(f"No props metadata found for action {pset}.{subset}.{p}") + errs += 1 + return errs + +def check_props_used_by_set(props_by_set, props_by_action, props_metadata): + """Find and print all mismatches between prop set specs, props, and metadata. + + * Each prop name in props_metadata should be used in at least one set. + Returns 0 if no errors. + """ + errs = 0 + for prop in props_metadata: + found = 0 + for pset in props_by_set: + for set_prop in props_for_set(pset, props_by_set): + if set_prop == prop: + found += 1 + for pset in props_by_action: + # inArgs/outArgs + for subset in sorted(props_by_action[pset]): + if not props_by_action[pset][subset]: + continue + for set_prop in props_by_action[pset][subset]: + if set_prop == prop: + found += 1 + if not found and not props_metadata[prop].get('deprecated'): + logging.error(f"Prop {prop} not used in any prop set in YML file") + return errs + +def gen_props_metadata(props_metadata, outfile_path: Path): + """Generate a header file with metadata for each prop""" + with open(outfile_path, 'w') as outfile: + outfile.write(generated_source_header) + outfile.write(""" +#pragma once + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "ofxSpan.h" + +namespace openfx { +enum class PropType { + Int, + Double, + Enum, + Bool, + String, + Pointer +}; + +// Each prop has a PropId:: enum, a runtime-accessible PropDef struct, and a compile-time PropTraits. +// These can be used by Support/include/PropsAccess.h for type-safe property access. + +""") + outfile.write(f"//Property ID enum for compile-time lookup and type safety\n") + outfile.write(f"enum class PropId {{\n") + id = 0 + for p in sorted(props_metadata): + pname = get_prop_id(p) + orig_name_msg = '' + if pname != p: + orig_name_msg = f" (orig name: {pname})" + outfile.write(f" {pname}, // {id}{orig_name_msg}\n") + id += 1 + outfile.write(f" NProps // {id}\n") + outfile.write("}; // PropId\n\n") + + # Property enum values (for enums only) + + outfile.write("// Separate arrays for enum-values for enum props, to keep everything constexpr\n") + outfile.write("namespace prop_enum_values {\n") + for p in sorted(props_metadata): + md = props_metadata[p] + if md['type'] == 'enum': + values = "{" + ",".join(f'\"{v}\"' for v in md['values']) + "}" + outfile.write(f"constexpr std::array {p} =\n {values};\n") + outfile.write("} // namespace prop_enum_values\n"); + + # Property definitions + + outfile.write(""" + +// Property type arrays for spans (generated before PropDef) +namespace prop_type_arrays { +""") + # Generate type arrays for each property + for p in sorted(props_metadata): + md = props_metadata[p] + types = md.get('type') + if isinstance(types, str): + types = (types,) + prop_type_defs = "{" + ",".join(f'PropType::{t.capitalize()}' for t in types) + "}" + outfile.write(f"static constexpr PropType {p}_types[] = {prop_type_defs};\n") + outfile.write("} // namespace prop_type_arrays\n\n") + + outfile.write(""" +struct PropDef { + const char* name; // Property name + openfx::span supportedTypes; // Supported data types + int dimension; // Property dimension (0 for variable) + openfx::span enumValues; // Valid values for enum properties +}; + +// Array type for storing all PropDefs, indexed by PropId for simplicity +template +struct PropDefsArray { + static constexpr size_t Size = static_cast(MaxValue); + std::array data; + + // constexpr T& operator[](PropId index) { + // return data[static_cast(index)]; + // } + + constexpr const T& operator[](PropId index) const { + return data[static_cast(index)]; + } + constexpr const T& operator[](size_t index) const { + return data[index]; + } +}; + +// Property definitions +static inline constexpr PropDefsArray prop_defs = { + {{ +""") + + for p in sorted(props_metadata): + try: + # name (id field removed - it was never used) + prop_def = f"{{ \"{p}\",\n " + md = props_metadata[p] + types = md.get('type') + if isinstance(types, str): # make it always a list + types = (types,) + # types - use span pointing to type array + type_count = len(types) + prop_def += f"openfx::span(prop_type_arrays::{p}_types, {type_count}), " + # dimension + prop_def += f"{md['dimension']}, " + # enum values - use span + if md['type'] == 'enum': + assert isinstance(md['values'], list) + prop_def += f"openfx::span(prop_enum_values::{p}.data(), prop_enum_values::{p}.size())" + else: + prop_def += "openfx::span()" + prop_def += "},\n" + outfile.write(prop_def) + except Exception as e: + logging.error(f"Error: {p} is missing metadata? {e}") + raise(e) + outfile.write(" }}\n};\n\n") + + outfile.write(""" +//Template specializations for each property +namespace properties { + +// Base template struct for property traits +template +struct PropTraits; + +#define DEFINE_PROP_TRAITS(id, _type, _is_multitype) \\ +template<> \\ +struct PropTraits { \\ + using type = _type; \\ + static constexpr bool is_multitype = _is_multitype; \\ + static constexpr const PropDef& def = prop_defs[PropId::id]; \\ +} + +""") + + for p in sorted(props_metadata): + try: + md = props_metadata[p] + types = md.get('type') + if isinstance(types, str): # make it always a list + types = (types,) + ctypes = { + "string": "const char *", + "enum": "const char *", + "int": "int", + "bool": "bool", + "double": "double", + "pointer": "void *", + } + is_multitype_bool = "true" if len(types) > 1 else "false" + outfile.write(f"DEFINE_PROP_TRAITS({get_prop_id(p)}, {ctypes[types[0]]}, {is_multitype_bool});\n") + except Exception as e: + logging.error(f"Error: {p} is missing metadata? {e}") + raise(e) + + outfile.write("} // namespace properties\n\n") + # Generate static asserts to ensure our constants match the string values + outfile.write("// Static asserts to check #define names vs. strings\n") + outfile.write("namespace assertions {\nusing std::string_view;\n\n") + for p in sorted(props_metadata): + cname = get_cname(p, props_metadata) + outfile.write(f"static_assert(string_view(\"{p}\") == string_view({cname}));\n") + + outfile.write("} // namespace assertions\n") + outfile.write("} // namespace openfx\n") + + + +def gen_props_by_set(props_by_set, props_by_action, outfile_path: Path): + """Generate a header file with definitions of all prop sets, including their props""" + with open(outfile_path, 'w') as outfile: + outfile.write(generated_source_header) + outfile.write(""" +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "ofxPropsMetadata.h" +// #include + +namespace openfx { + +struct Prop { + const char *name; + const PropDef &def; + bool host_write; + bool plugin_write; + bool host_optional; + + Prop(const char *n, const PropDef &d, bool hw, bool pw, bool ho) + : name(n), def(d), host_write(hw), plugin_write(pw), host_optional(ho) {} +}; + +""") + outfile.write("// Properties for property sets\n") + outfile.write("static inline const std::map> prop_sets {\n") + + for pset in sorted(props_by_set.keys()): + propdefs = [] + for p in props_for_set(pset, props_by_set, False): + host_write = 'true' if p['write'] in ('host', 'all') else 'false' + plugin_write = 'true' if p['write'] in ('plugin', 'all') else 'false' + host_optional = 'true' if p.get('host_optional') == 'true' else 'false' + propdefs.append(f"{{ \"{p['name']}\", prop_defs[PropId::{get_prop_id(p['name'])}], {host_write}, {plugin_write}, {host_optional} }}") + propdefs_str = ",\n ".join(propdefs) + outfile.write(f"// {pset}\n{{ \"{pset}\", {{\n {propdefs_str} }} }},\n") + outfile.write("};\n\n") + + actions = sorted(props_by_action.keys()) + + outfile.write("// Actions\n") + outfile.write(f"static inline const std::array actions {{\n") + for pset in actions: + if not pset.startswith("kOfx"): + pset = '"' + pset + '"' # quote if it's not a known constant + outfile.write(f" {pset},\n") + outfile.write("};\n\n") + + outfile.write("// Properties for action args\n") + outfile.write("static inline const std::map, std::vector> action_props {\n") + for pset in actions: + for subset in props_by_action[pset]: + if not props_by_action[pset][subset]: + continue + propnames = ",\n ".join(sorted([f'"{p}"' for p in props_by_action[pset][subset]])) + if not pset.startswith("kOfx"): + psetname = '"' + pset + '"' # quote if it's not a known constant + else: + psetname = pset + outfile.write(f"// {pset}.{subset}\n") + outfile.write(f"{{ {{ {psetname}, \"{subset}\" }},\n {{ {propnames} }} }},\n") + + outfile.write("};\n\n") + + outfile.write("// Static asserts for standard action names\n") + for pset in actions: + if not pset.startswith("Ofx"): + continue + outfile.write(f"static_assert(std::string_view(\"{pset}\") == std::string_view(k{pset}));\n") + + outfile.write("} // namespace openfx\n") + + +def gen_propset_accessors(props_by_set, props_metadata, outfile_path: Path, for_host=False): + """Generate type-safe accessor classes for each property set. + + Args: + for_host: If True, generate host accessors (setters for host_write, getters for plugin_write). + If False, generate plugin accessors (getters for host_write, setters for plugin_write). + """ + + def get_prop_id(propname): + """Get PropId enum name from property name.""" + if propname.startswith('k'): + # kOfxParamPropUseHostOverlayHandle -> OfxParamPropUseHostOverlayHandle + return propname[1:] + return propname + + def prop_to_method_name(propname): + """Convert property name to method name.""" + # Strip prefixes: OfxPropLabel -> Label, OfxImageEffectPropContext -> Context + name = propname + if name.startswith('Ofx'): + # Remove Ofx prefix + name = name[3:] + # Remove category prefixes like ImageEffect, ImageClip, Param, etc. + for prefix in ['ImageEffect', 'ImageClip', 'Param', 'Image', 'Plugin', 'OpenGL']: + if name.startswith(prefix + 'Prop'): + name = name[len(prefix) + 4:] # +4 for "Prop" + break + else: + # Just remove Prop if it's there + if name.startswith('Prop'): + name = name[4:] + elif name.startswith('kOfx'): + # Handle kOfxParamPropUseHostOverlayHandle -> UseHostOverlayHandle + name = name[1:] # Remove 'k' + name = prop_to_method_name(name) # Recursive call + + # Convert first letter to lowercase for getter + if name: + name = name[0].lower() + name[1:] + return name + + def get_cpp_type(prop_def, include_array=True): + """Get C++ type for a property.""" + types = prop_def.get('type') + if isinstance(types, str): + types = [types] + + dimension = prop_def['dimension'] + + # Map OpenFX types to C++ types + type_map = { + 'string': 'const char*', + 'int': 'int', + 'double': 'double', + 'pointer': 'void*', + 'bool': 'bool', + 'enum': 'const char*' + } + + cpp_type = type_map.get(types[0], 'void*') + + # If dimension > 1, return array type + if include_array and dimension > 1: + return f'std::array<{cpp_type}, {dimension}>' + + return cpp_type + + with open(outfile_path, 'w') as outfile: + outfile.write(generated_source_header) + target = "HOST" if for_host else "PLUGIN" + outfile.write(f""" +#pragma once + +#include +#include +#include "ofxPropsAccess.h" +#include "ofxPropsMetadata.h" + +namespace openfx {{ + +// Type-safe property set accessor classes for {target}S +// +// These wrapper classes provide convenient, type-safe access to property sets. +// - For plugins: getters for host-written properties, setters for plugin-written properties +// - For hosts: setters for host-written properties, getters for plugin-written properties +// +// Usage: +// PropertyAccessor accessor(handle, propSuite); +// EffectDescriptor desc(accessor); +// desc.setLabel("My Effect"); // Type-safe setter +// auto label = desc.label(); // Type-safe getter + +// Base class for property set accessors +class PropertySetAccessor {{ +protected: + PropertyAccessor& props_; +public: + explicit PropertySetAccessor(PropertyAccessor& p) : props_(p) {{}} + + // Access to underlying PropertyAccessor for advanced use + PropertyAccessor& props() {{ return props_; }} + const PropertyAccessor& props() const {{ return props_; }} +}}; + +""") + + # Generate a class for each property set + for pset_name in sorted(props_by_set.keys()): + # Derive class name from property set name + class_name = pset_name.replace(' ', '') + + outfile.write(f"// Property set accessor for: {pset_name}\n") + outfile.write(f"class {class_name} : public PropertySetAccessor {{\n") + outfile.write("public:\n") + outfile.write(f" using PropertySetAccessor::PropertySetAccessor;\n\n") + + # Track which methods we've generated to avoid duplicates + generated_methods = set() + + # Generate methods for each property + for prop in props_for_set(pset_name, props_by_set, name_only=False): + propname = prop['name'] + write_access = prop['write'] + is_host_optional = prop.get('host_optional') == 'true' + + # Get property metadata + if propname not in props_metadata: + continue + + prop_def = props_metadata[propname] + method_name = prop_to_method_name(propname) + prop_id = get_prop_id(propname) + + # Skip if we've already generated this method + if method_name in generated_methods: + continue + generated_methods.add(method_name) + + # Default for error_if_missing based on whether property is optional + # Optional properties default to not erroring, required ones do + error_default = 'false' if is_host_optional else 'true' + + # Check if this is a multi-type property + types = prop_def.get('type') + if isinstance(types, str): + types = [types] + is_multitype = len(types) > 1 + + dimension = prop_def['dimension'] + cpp_type = get_cpp_type(prop_def, include_array=False) if not is_multitype else None + + # Determine what to generate based on for_host flag + # For plugins: getters for host-written, setters for plugin-written + # For hosts: setters for host-written, getters for plugin-written + generate_getter = False + generate_setter = False + + if for_host: + # Host accessors: host sets, host reads plugin-written + if write_access in ('host', 'all'): + generate_setter = True + if write_access in ('plugin', 'all'): + generate_getter = True + else: + # Plugin accessors: plugin reads host-written, plugin sets + if write_access in ('host', 'all'): + generate_getter = True + if write_access in ('plugin', 'all'): + generate_setter = True + + # Generate getter + if generate_getter: + if is_multitype: + # Multi-type property - generate templated getter + outfile.write(f" // Multi-type property (supports: {', '.join(types)})\n") + outfile.write(f" template\n") + if dimension == 1: + # Dimension 1: exactly one value, no index needed + outfile.write(f" T {method_name}(bool error_if_missing = {error_default}) const {{\n") + outfile.write(f" return props_.get(0, error_if_missing);\n") + else: + # Dimension 0 or > 1: include index parameter + outfile.write(f" T {method_name}(int index = 0, bool error_if_missing = {error_default}) const {{\n") + outfile.write(f" return props_.get(index, error_if_missing);\n") + outfile.write(f" }}\n\n") + + # Also provide getAll for multi-type (returns vector) + if dimension != 1: # dimension 0 or > 1 + outfile.write(f" template\n") + outfile.write(f" std::vector {method_name}All() const {{\n") + outfile.write(f" return props_.getAll();\n") + outfile.write(f" }}\n\n") + else: + # Single-type property + if dimension == 1: + # Dimension 1: exactly one value, no index needed + outfile.write(f" {cpp_type} {method_name}(bool error_if_missing = {error_default}) const {{\n") + outfile.write(f" return props_.get(0, error_if_missing);\n") + outfile.write(f" }}\n\n") + elif dimension == 0: + # Dimension 0: variable dimension, include index + outfile.write(f" {cpp_type} {method_name}(int index = 0, bool error_if_missing = {error_default}) const {{\n") + outfile.write(f" return props_.get(index, error_if_missing);\n") + outfile.write(f" }}\n\n") + else: + # Dimension > 1: array getter + array_type = get_cpp_type(prop_def, include_array=True) + outfile.write(f" {array_type} {method_name}() const {{\n") + outfile.write(f" return props_.getAll();\n") + outfile.write(f" }}\n\n") + + # Generate setter + if generate_setter: + setter_name = 'set' + method_name[0].upper() + method_name[1:] + + if is_multitype: + # Multi-type property - generate templated setter + outfile.write(f" // Multi-type property (supports: {', '.join(types)})\n") + outfile.write(f" template\n") + if dimension == 1: + # Dimension 1: exactly one value, no index needed + outfile.write(f" {class_name}& {setter_name}(T value, bool error_if_missing = {error_default}) {{\n") + outfile.write(f" props_.set(value, 0, error_if_missing);\n") + outfile.write(f" return *this;\n") + else: + # Dimension 0 or > 1: include index parameter + outfile.write(f" {class_name}& {setter_name}(T value, int index = 0, bool error_if_missing = {error_default}) {{\n") + outfile.write(f" props_.set(value, index, error_if_missing);\n") + outfile.write(f" return *this;\n") + outfile.write(f" }}\n\n") + + # Also provide setAll for multi-type + if dimension != 1: # dimension 0 or > 1 + outfile.write(f" // Set all values from a container (vector, array, span, etc.)\n") + outfile.write(f" // SFINAE: only enabled for container types (not scalars)\n") + outfile.write(f" template && !std::is_pointer_v>>\n") + outfile.write(f" {class_name}& {setter_name}(const Container& values, bool error_if_missing = {error_default}) {{\n") + outfile.write(f" props_.setAllTyped(values, error_if_missing);\n") + outfile.write(f" return *this;\n") + outfile.write(f" }}\n\n") + + # Also provide initializer_list overload for multi-type + outfile.write(f" // Set all values from an initializer list (e.g., {{1, 2, 3}})\n") + outfile.write(f" template\n") + outfile.write(f" {class_name}& {setter_name}(std::initializer_list values, bool error_if_missing = {error_default}) {{\n") + outfile.write(f" props_.setAllTyped(values, error_if_missing);\n") + outfile.write(f" return *this;\n") + outfile.write(f" }}\n\n") + else: + # Single-type property + if dimension == 1: + # Dimension 1: exactly one value, no index needed + outfile.write(f" {class_name}& {setter_name}({cpp_type} value, bool error_if_missing = {error_default}) {{\n") + outfile.write(f" props_.set(value, 0, error_if_missing);\n") + outfile.write(f" return *this;\n") + outfile.write(f" }}\n\n") + elif dimension == 0: + # Dimension 0: variable dimension, include index + outfile.write(f" {class_name}& {setter_name}({cpp_type} value, int index = 0, bool error_if_missing = {error_default}) {{\n") + outfile.write(f" props_.set(value, index, error_if_missing);\n") + outfile.write(f" return *this;\n") + outfile.write(f" }}\n\n") + + # Also generate a container/span setter for dimension 0 + outfile.write(f" // Set all values from a container (vector, array, span, etc.)\n") + outfile.write(f" // SFINAE: only enabled for container types (not scalars)\n") + outfile.write(f" template && !std::is_pointer_v>>\n") + outfile.write(f" {class_name}& {setter_name}(const Container& values, bool error_if_missing = {error_default}) {{\n") + outfile.write(f" props_.setAll(values, error_if_missing);\n") + outfile.write(f" return *this;\n") + outfile.write(f" }}\n\n") + + # Also generate an initializer_list overload for dimension 0 + outfile.write(f" // Set all values from an initializer list (e.g., {{1, 2, 3}})\n") + outfile.write(f" {class_name}& {setter_name}(std::initializer_list<{cpp_type}> values, bool error_if_missing = {error_default}) {{\n") + outfile.write(f" props_.setAll(values, error_if_missing);\n") + outfile.write(f" return *this;\n") + outfile.write(f" }}\n\n") + else: + # Dimension > 1: array setter + array_type = get_cpp_type(prop_def, include_array=True) + outfile.write(f" {class_name}& {setter_name}(const {array_type}& values, bool error_if_missing = {error_default}) {{\n") + outfile.write(f" props_.setAll(values, error_if_missing);\n") + outfile.write(f" return *this;\n") + outfile.write(f" }}\n\n") + + # Also generate an initializer_list overload for dimension > 1 + outfile.write(f" // Set all values from an initializer list (e.g., {{1, 2}})\n") + outfile.write(f" {class_name}& {setter_name}(std::initializer_list<{cpp_type}> values, bool error_if_missing = {error_default}) {{\n") + outfile.write(f" props_.setAll(values, error_if_missing);\n") + outfile.write(f" return *this;\n") + outfile.write(f" }}\n\n") + + outfile.write("};\n\n") + + outfile.write("} // namespace openfx\n") + + +def main(args): + script_dir = os.path.dirname(os.path.abspath(__file__)) + include_dir = Path(script_dir).parent / 'include' + all_props = getPropertiesFromDir(include_dir) + logging.info(f'Got {len(all_props)} props from "include" dir') + + with open(include_dir / 'ofx-props.yml', 'r') as props_file: + props_data = yaml.safe_load(props_file) + props_by_set = expand_set_props(props_data['propertySets']) + props_by_action = props_data['Actions'] + props_metadata = props_data['properties'] + + # Convert action argument property sets to the same format as regular property sets + action_propsets = actions_to_propsets(props_by_action) + + # Merge action property sets with regular property sets for accessor generation + all_propsets = {**props_by_set, **action_propsets} + + if args.verbose: + print("\n=== Checking ofx-props.yml: should map 1:1 to props found in source/header files") + errs = find_missing(all_props, props_metadata) + if not errs and args.verbose: + print(" ✔️ ALL OK") + + if args.verbose: + print("\n=== Checking ofx-props.yml: every prop in a set should have metadata in the YML file") + errs = check_props_by_set(props_by_set, props_by_action, props_metadata) + if not errs and args.verbose: + print(" ✔️ ALL OK") + + if args.verbose: + print("\n=== Checking ofx-props.yml: every prop should be used in in at least one set in the YML file") + errs = check_props_used_by_set(props_by_set, props_by_action, props_metadata) + if not errs and args.verbose: + print(" ✔️ ALL OK") + + if args.verbose: + print(f"=== Generating {args.props_metadata}") + gen_props_metadata(props_metadata, dest_path / args.props_metadata) + + if args.verbose: + print(f"=== Generating props by set header {args.props_by_set}") + gen_props_by_set(props_by_set, props_by_action, dest_path / args.props_by_set) + + if args.verbose: + print(f"=== Generating property set accessor classes for plugins: {args.propset_accessors}") + gen_propset_accessors(all_propsets, props_metadata, dest_path / args.propset_accessors, for_host=False) + + if args.verbose: + print(f"=== Generating property set accessor classes for hosts: {args.propset_accessors_host}") + gen_propset_accessors(all_propsets, props_metadata, dest_path / args.propset_accessors_host, for_host=True) + +if __name__ == "__main__": + script_dir = os.path.dirname(os.path.abspath(__file__)) + dest_path = Path(script_dir).parent / 'openfx-cpp/include/openfx' + parser = argparse.ArgumentParser(description="Check OpenFX properties and generate ancillary data structures", + formatter_class=argparse.ArgumentDefaultsHelpFormatter) + + # Define arguments here + parser.add_argument('-v', '--verbose', action='store_true', help='Enable verbose mode') + parser.add_argument('--props-metadata', default=dest_path/"ofxPropsMetadata.h", + help="Generate property metadata into this file") + parser.add_argument('--props-by-set', default=dest_path/"ofxPropsBySet.h", + help="Generate props by set metadata into this file") + parser.add_argument('--propset-accessors', default=dest_path/"ofxPropSetAccessors.h", + help="Generate property set accessor classes for plugins into this file") + parser.add_argument('--propset-accessors-host', default=dest_path/"ofxPropSetAccessorsHost.h", + help="Generate property set accessor classes for hosts into this file") + + # Parse the arguments + args = parser.parse_args() + + # Call the main function with parsed arguments + main(args) diff --git a/test_package/CMakeLists.txt b/test_package/CMakeLists.txt index 4ba66c09c..65cff0e32 100644 --- a/test_package/CMakeLists.txt +++ b/test_package/CMakeLists.txt @@ -5,12 +5,18 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON) find_package(openfx CONFIG REQUIRED) -add_executable(test_package src/test_package.cpp) +add_library(test_package SHARED src/invert.cpp) target_include_directories(test_package PUBLIC ${openfx_INCLUDE_DIRS}) -target_link_libraries(test_package openfx::HostSupport) +target_link_libraries(test_package openfx::Api) -file(GLOB_RECURSE PLUGIN_SOURCES "../Support/Plugins/Invert/*.cpp") -add_ofx_plugin(invert_plugin ../Support/Plugins/Invert) -target_sources(invert_plugin PUBLIC ${PLUGIN_SOURCES}) -target_include_directories(invert_plugin PUBLIC ${openfx_INCLUDE_DIRS}) -target_link_libraries(invert_plugin openfx::Support) \ No newline at end of file +if(WIN32) + set_target_properties(test_package PROPERTIES SUFFIX ".ofx") +else() + set_target_properties(test_package PROPERTIES PREFIX "" SUFFIX ".ofx") +endif() + +# file(GLOB_RECURSE PLUGIN_SOURCES "../Support/Plugins/Invert/*.cpp") +# add_ofx_plugin(invert_plugin ../Support/Plugins/Invert) +# target_sources(invert_plugin PUBLIC ${PLUGIN_SOURCES}) +# target_include_directories(invert_plugin PUBLIC ${openfx_INCLUDE_DIRS}) +# target_link_libraries(invert_plugin openfx::Support) diff --git a/test_package/conanfile.py b/test_package/conanfile.py index 5ba62a7d9..0a252cc4f 100644 --- a/test_package/conanfile.py +++ b/test_package/conanfile.py @@ -66,7 +66,5 @@ def layout(self): cmake_layout(self) def test(self): - if can_run(self): - # Run the test_package binary in an environment where the OFX_PLUGIN_PATH environment variable is defined. - cmd = os.path.join(self.build_folder, self.cpp.build.bindir, "test_package") - self.run(cmd, env=["conanrun", "ofx_plugin_dir"]) + # Skip execution -- we only care that the plugin builds + pass diff --git a/test_package/src/invert.cpp b/test_package/src/invert.cpp new file mode 100644 index 000000000..17aeed7fd --- /dev/null +++ b/test_package/src/invert.cpp @@ -0,0 +1,288 @@ +// Copyright OpenFX and contributors to the OpenFX project. +// SPDX-License-Identifier: BSD-3-Clause + + +/* + Ofx Example plugin that show a very simple plugin that inverts an image. + + It is meant to illustrate certain features of the API, as opposed to being a perfectly + crafted piece of image processing software. + + The main features are + - basic plugin definition + - basic property usage + - basic image access and rendering + */ +#include +#include +#include +#include "ofxImageEffect.h" +#include "ofxMemory.h" +#include "ofxMultiThread.h" +#include "ofxPixels.h" + +#if defined __APPLE__ || defined __linux__ || defined __FreeBSD__ +# define EXPORT __attribute__((visibility("default"))) +#elif defined _WIN32 +# define EXPORT OfxExport +#else +# error Not building on your operating system quite yet +#endif + +// pointers to various bits of the host +OfxHost *gHost; +OfxImageEffectSuiteV1 *gEffectHost = 0; +OfxPropertySuiteV1 *gPropHost = 0; + +// look up a pixel in the image, does bounds checking to see if it is in the image rectangle +inline OfxRGBAColourB * +pixelAddress(OfxRGBAColourB *img, OfxRectI rect, int x, int y, int bytesPerLine) +{ + if(x < rect.x1 || x >= rect.x2 || y < rect.y1 || y > rect.y2) + return 0; + OfxRGBAColourB *pix = (OfxRGBAColourB *) (((char *) img) + (y - rect.y1) * bytesPerLine); + pix += x - rect.x1; + return pix; +} + +// throws this if it can't fetch an image +class NoImageEx {}; + +// the process code that the host sees +static OfxStatus render(OfxImageEffectHandle instance, + OfxPropertySetHandle inArgs, + OfxPropertySetHandle /*outArgs*/) +{ + // get the render window and the time from the inArgs + OfxTime time; + OfxRectI renderWindow; + OfxStatus status = kOfxStatOK; + + gPropHost->propGetDouble(inArgs, kOfxPropTime, 0, &time); + gPropHost->propGetIntN(inArgs, kOfxImageEffectPropRenderWindow, 4, &renderWindow.x1); + + // fetch output clip + OfxImageClipHandle outputClip; + gEffectHost->clipGetHandle(instance, kOfxImageEffectOutputClipName, &outputClip, 0); + + + OfxPropertySetHandle outputImg = NULL, sourceImg = NULL; + try { + // fetch image to render into from that clip + OfxPropertySetHandle outputImg; + if(gEffectHost->clipGetImage(outputClip, time, NULL, &outputImg) != kOfxStatOK) { + throw NoImageEx(); + } + + // fetch output image info from that handle + int dstRowBytes; + OfxRectI dstRect; + void *dstPtr; + gPropHost->propGetInt(outputImg, kOfxImagePropRowBytes, 0, &dstRowBytes); + gPropHost->propGetIntN(outputImg, kOfxImagePropBounds, 4, &dstRect.x1); + gPropHost->propGetInt(outputImg, kOfxImagePropRowBytes, 0, &dstRowBytes); + gPropHost->propGetPointer(outputImg, kOfxImagePropData, 0, &dstPtr); + + // fetch main input clip + OfxImageClipHandle sourceClip; + gEffectHost->clipGetHandle(instance, kOfxImageEffectSimpleSourceClipName, &sourceClip, 0); + + // fetch image at render time from that clip + if (gEffectHost->clipGetImage(sourceClip, time, NULL, &sourceImg) != kOfxStatOK) { + throw NoImageEx(); + } + + // fetch image info out of that handle + int srcRowBytes; + OfxRectI srcRect; + void *srcPtr; + gPropHost->propGetInt(sourceImg, kOfxImagePropRowBytes, 0, &srcRowBytes); + gPropHost->propGetIntN(sourceImg, kOfxImagePropBounds, 4, &srcRect.x1); + gPropHost->propGetInt(sourceImg, kOfxImagePropRowBytes, 0, &srcRowBytes); + gPropHost->propGetPointer(sourceImg, kOfxImagePropData, 0, &srcPtr); + + // cast data pointers to 8 bit RGBA + OfxRGBAColourB *src = (OfxRGBAColourB *) srcPtr; + OfxRGBAColourB *dst = (OfxRGBAColourB *) dstPtr; + + // and do some inverting + for(int y = renderWindow.y1; y < renderWindow.y2; y++) { + if(gEffectHost->abort(instance)) break; + + OfxRGBAColourB *dstPix = pixelAddress(dst, dstRect, renderWindow.x1, y, dstRowBytes); + + for(int x = renderWindow.x1; x < renderWindow.x2; x++) { + + OfxRGBAColourB *srcPix = pixelAddress(src, srcRect, x, y, srcRowBytes); + + if(srcPix) { + dstPix->r = 255 - srcPix->r; + dstPix->g = 255 - srcPix->g; + dstPix->b = 255 - srcPix->b; + dstPix->a = 255 - srcPix->a; + } + else { + dstPix->r = 0; + dstPix->g = 0; + dstPix->b = 0; + dstPix->a = 0; + } + dstPix++; + } + } + + // we are finished with the source images so release them + } + catch(NoImageEx &) { + // if we were interrupted, the failed fetch is fine, just return kOfxStatOK + // otherwise, something weird happened + if(!gEffectHost->abort(instance)) { + status = kOfxStatFailed; + } + } + + if(sourceImg) + gEffectHost->clipReleaseImage(sourceImg); + if(outputImg) + gEffectHost->clipReleaseImage(outputImg); + + // all was well + return status; +} + +// describe the plugin in context +static OfxStatus +describeInContext( OfxImageEffectHandle effect, OfxPropertySetHandle /*inArgs*/) +{ + OfxPropertySetHandle props; + // define the single output clip in both contexts + gEffectHost->clipDefine(effect, kOfxImageEffectOutputClipName, &props); + + // set the component types we can handle on out output + gPropHost->propSetString(props, kOfxImageEffectPropSupportedComponents, 0, kOfxImageComponentRGBA); + + // define the single source clip in both contexts + gEffectHost->clipDefine(effect, kOfxImageEffectSimpleSourceClipName, &props); + + // set the component types we can handle on our main input + gPropHost->propSetString(props, kOfxImageEffectPropSupportedComponents, 0, kOfxImageComponentRGBA); + + return kOfxStatOK; +} + +//////////////////////////////////////////////////////////////////////////////// +// the plugin's description routine +static OfxStatus +describe(OfxImageEffectHandle effect) +{ + // get the property handle for the plugin + OfxPropertySetHandle effectProps; + gEffectHost->getPropertySet(effect, &effectProps); + + // say we cannot support multiple pixel depths and let the clip preferences action deal with it all. + gPropHost->propSetInt(effectProps, kOfxImageEffectPropSupportsMultipleClipDepths, 0, 0); + + // set the bit depths the plugin can handle + gPropHost->propSetString(effectProps, kOfxImageEffectPropSupportedPixelDepths, 0, kOfxBitDepthByte); + + // set plugin label and the group it belongs to + gPropHost->propSetString(effectProps, kOfxPropLabel, 0, "OFX Invert Example"); + gPropHost->propSetString(effectProps, kOfxImageEffectPluginPropGrouping, 0, "OFX Example"); + + // define the contexts we can be used in + gPropHost->propSetString(effectProps, kOfxImageEffectPropSupportedContexts, 0, kOfxImageEffectContextFilter); + + return kOfxStatOK; +} + +//////////////////////////////////////////////////////////////////////////////// +// Called at load +static OfxStatus +onLoad(void) +{ + // fetch the host suites out of the global host pointer + if(!gHost) return kOfxStatErrMissingHostFeature; + + gEffectHost = (OfxImageEffectSuiteV1 *) gHost->fetchSuite(gHost->host, kOfxImageEffectSuite, 1); + gPropHost = (OfxPropertySuiteV1 *) gHost->fetchSuite(gHost->host, kOfxPropertySuite, 1); + if(!gEffectHost || !gPropHost) + return kOfxStatErrMissingHostFeature; + return kOfxStatOK; +} + +//////////////////////////////////////////////////////////////////////////////// +// The main entry point function +static OfxStatus +pluginMain(const char *action, const void *handle, OfxPropertySetHandle inArgs, OfxPropertySetHandle outArgs) +{ + try { + // cast to appropriate type + OfxImageEffectHandle effect = (OfxImageEffectHandle) handle; + + if(strcmp(action, kOfxActionLoad) == 0) { + return onLoad(); + } + else if(strcmp(action, kOfxActionDescribe) == 0) { + return describe(effect); + } + else if(strcmp(action, kOfxImageEffectActionDescribeInContext) == 0) { + return describeInContext(effect, inArgs); + } + else if(strcmp(action, kOfxImageEffectActionRender) == 0) { + return render(effect, inArgs, outArgs); + } + } catch (std::bad_alloc) { + // catch memory + //std::cout << "OFX Plugin Memory error." << std::endl; + return kOfxStatErrMemory; + } catch ( const std::exception& e ) { + // standard exceptions + //std::cout << "OFX Plugin error: " << e.what() << std::endl; + return kOfxStatErrUnknown; + } catch (int err) { + // ho hum, gone wrong somehow + return err; + } catch ( ... ) { + // everything else + //std::cout << "OFX Plugin error" << std::endl; + return kOfxStatErrUnknown; + } + + // other actions to take the default value + return kOfxStatReplyDefault; +} + +// function to set the host structure +static void +setHostFunc(OfxHost *hostStruct) +{ + gHost = hostStruct; +} + +//////////////////////////////////////////////////////////////////////////////// +// the plugin struct +static OfxPlugin basicPlugin = +{ + kOfxImageEffectPluginApi, + 1, + "uk.co.thefoundry.OfxInvertExample", + 1, + 0, + setHostFunc, + pluginMain +}; + +// the two mandated functions +EXPORT OfxPlugin * +OfxGetPlugin(int nth) +{ + if(nth == 0) + return &basicPlugin; + return 0; +} + +EXPORT int +OfxGetNumberOfPlugins(void) +{ + return 1; +} diff --git a/test_package/src/test_package.cpp b/test_package/src/test_package.cpp deleted file mode 100644 index 80f6376b4..000000000 --- a/test_package/src/test_package.cpp +++ /dev/null @@ -1,114 +0,0 @@ -// Copyright OpenFX and contributors to the OpenFX project. -// SPDX-License-Identifier: BSD-3-Clause - -#include - -#include "ofxhPluginCache.h" -#include "ofxhPropertySuite.h" -#include "ofxhImageEffectAPI.h" - -class MyHost : public OFX::Host::ImageEffect::Host -{ -public : - OFX::Host::ImageEffect::Instance* newInstance(void* clientData, - OFX::Host::ImageEffect::ImageEffectPlugin* plugin, - OFX::Host::ImageEffect::Descriptor& desc, - const std::string& context) override - { - return nullptr; - } - - OFX::Host::ImageEffect::Descriptor *makeDescriptor(OFX::Host::ImageEffect::ImageEffectPlugin* plugin) override - { - return new OFX::Host::ImageEffect::Descriptor(plugin); - } - - OFX::Host::ImageEffect::Descriptor *makeDescriptor(const OFX::Host::ImageEffect::Descriptor &rootContext, - OFX::Host::ImageEffect::ImageEffectPlugin *plugin) override - { - return new OFX::Host::ImageEffect::Descriptor(rootContext, plugin); - } - - OFX::Host::ImageEffect::Descriptor *makeDescriptor(const std::string &bundlePath, - OFX::Host::ImageEffect::ImageEffectPlugin *plugin) override - { - return new OFX::Host::ImageEffect::Descriptor(bundlePath, plugin); - } - - /// vmessage - OfxStatus vmessage(const char* type, - const char* id, - const char* format, - va_list args) override - { - OfxStatus status = kOfxStatOK; - - const char *prefix = "Message : "; - if (strcmp(type, kOfxMessageLog) == 0) { - prefix = "Log : "; - } - else if(strcmp(type, kOfxMessageFatal) == 0 || - strcmp(type, kOfxMessageError) == 0) { - prefix = "Error : "; - } - else if(strcmp(type, kOfxMessageQuestion) == 0) { - prefix = "Question : "; - status = kOfxStatReplyYes; - } - - fputs(prefix, stdout); - vprintf(format, args); - printf("\n"); - - return status; - } - - OfxStatus setPersistentMessage(const char* type, - const char* id, - const char* format, - va_list args) override - { - return vmessage(type, id, format, args); - } - - OfxStatus clearPersistentMessage() override - { - return kOfxStatOK; - } - -#ifdef OFX_SUPPORTS_OPENGLRENDER - /// @see OfxImageEffectOpenGLRenderSuiteV1.flushResources() - OfxStatus flushOpenGLResources() const override { return kOfxStatFailed; }; -#endif -}; - -int main(int argc, char **argv) -{ - OFX::Host::PluginCache::getPluginCache()->setCacheVersion("testPackageV1"); - MyHost myHost; - OFX::Host::ImageEffect::PluginCache imageEffectPluginCache(myHost); - imageEffectPluginCache.registerInCache(*OFX::Host::PluginCache::getPluginCache()); - - OFX::Host::PluginCache::getPluginCache()->scanPluginFiles(); - - // Search for the invert plugin to make sure we can successfully load a plugin built with - // this package. - bool found_invert_plugin = false; - for (const auto* plugin : OFX::Host::PluginCache::getPluginCache()->getPlugins()) { - if (plugin->getIdentifier() == "net.sf.openfx.invertPlugin") { - found_invert_plugin = true; - break; - } - } - - imageEffectPluginCache.dumpToStdOut(); - - OFX::Host::PluginCache::clearPluginCache(); - - if (!found_invert_plugin) { - printf("Failed to find plugin.\n"); - return 1; - } - - return 0; -}