diff --git a/intern/opencolorio/fallback_impl.cc b/intern/opencolorio/fallback_impl.cc index 17faff1d893..fe0a3cdf37b 100644 --- a/intern/opencolorio/fallback_impl.cc +++ b/intern/opencolorio/fallback_impl.cc @@ -77,6 +77,12 @@ struct FallbackTransform { applyRGB(pixel); } + bool isNoOp() + { + /* Rely on the short-circuiting based on name-space comparison in the IMB_colormanagement. */ + return false; + } + TransformType type; /* Scale transform. */ float scale; @@ -99,6 +105,11 @@ struct FallbackProcessor { transform.applyRGBA(pixel); } + bool isNoOp() + { + return transform.isNoOp(); + } + FallbackTransform transform; MEM_CXX_CLASS_ALLOC_FUNCS("FallbackProcessor"); @@ -337,6 +348,11 @@ void FallbackImpl::processorRelease(OCIO_ConstProcessorRcPtr *processor) delete (FallbackProcessor *)(processor); } +bool FallbackImpl::cpuProcessorIsNoOp(OCIO_ConstCPUProcessorRcPtr *cpu_processor) +{ + return ((FallbackProcessor *)cpu_processor)->isNoOp(); +} + void FallbackImpl::cpuProcessorApply(OCIO_ConstCPUProcessorRcPtr *cpu_processor, OCIO_PackedImageDesc *img) { diff --git a/intern/opencolorio/ocio_capi.cc b/intern/opencolorio/ocio_capi.cc index 33ea7be7dd1..031f4ec1451 100644 --- a/intern/opencolorio/ocio_capi.cc +++ b/intern/opencolorio/ocio_capi.cc @@ -189,6 +189,11 @@ OCIO_ConstCPUProcessorRcPtr *OCIO_processorGetCPUProcessor(OCIO_ConstProcessorRc return impl->processorGetCPUProcessor(processor); } +bool OCIO_cpuProcessorIsNoOp(OCIO_ConstCPUProcessorRcPtr *cpu_processor) +{ + return impl->cpuProcessorIsNoOp(cpu_processor); +} + void OCIO_cpuProcessorApply(OCIO_ConstCPUProcessorRcPtr *cpu_processor, OCIO_PackedImageDesc *img) { impl->cpuProcessorApply(cpu_processor, img); diff --git a/intern/opencolorio/ocio_capi.h b/intern/opencolorio/ocio_capi.h index 6097189cb7c..3b3108cf676 100644 --- a/intern/opencolorio/ocio_capi.h +++ b/intern/opencolorio/ocio_capi.h @@ -151,6 +151,7 @@ OCIO_ConstProcessorRcPtr *OCIO_configGetProcessorWithNames(OCIO_ConstConfigRcPtr void OCIO_processorRelease(OCIO_ConstProcessorRcPtr *cpu_processor); OCIO_ConstCPUProcessorRcPtr *OCIO_processorGetCPUProcessor(OCIO_ConstProcessorRcPtr *processor); +bool OCIO_cpuProcessorIsNoOp(OCIO_ConstCPUProcessorRcPtr *cpu_processor); void OCIO_cpuProcessorApply(OCIO_ConstCPUProcessorRcPtr *cpu_processor, struct OCIO_PackedImageDesc *img); void OCIO_cpuProcessorApply_predivide(OCIO_ConstCPUProcessorRcPtr *cpu_processor, diff --git a/intern/opencolorio/ocio_impl.cc b/intern/opencolorio/ocio_impl.cc index f28ca0af786..a94a90e1d0f 100644 --- a/intern/opencolorio/ocio_impl.cc +++ b/intern/opencolorio/ocio_impl.cc @@ -590,6 +590,11 @@ void OCIOImpl::cpuProcessorApply_predivide(OCIO_ConstCPUProcessorRcPtr *cpu_proc } } +bool OCIOImpl::cpuProcessorIsNoOp(OCIO_ConstCPUProcessorRcPtr *cpu_processor) +{ + return (*(ConstCPUProcessorRcPtr *)cpu_processor)->isNoOp(); +} + void OCIOImpl::cpuProcessorApplyRGB(OCIO_ConstCPUProcessorRcPtr *cpu_processor, float *pixel) { (*(ConstCPUProcessorRcPtr *)cpu_processor)->applyRGB(pixel); diff --git a/intern/opencolorio/ocio_impl.h b/intern/opencolorio/ocio_impl.h index 4f334c0344d..28f9fa88336 100644 --- a/intern/opencolorio/ocio_impl.h +++ b/intern/opencolorio/ocio_impl.h @@ -63,6 +63,7 @@ class IOCIOImpl { virtual void processorRelease(OCIO_ConstProcessorRcPtr *processor) = 0; virtual OCIO_ConstCPUProcessorRcPtr *processorGetCPUProcessor(OCIO_ConstProcessorRcPtr *p) = 0; + virtual bool cpuProcessorIsNoOp(OCIO_ConstCPUProcessorRcPtr *cpu_processor) = 0; virtual void cpuProcessorApply(OCIO_ConstCPUProcessorRcPtr *cpu_processor, OCIO_PackedImageDesc *img) = 0; virtual void cpuProcessorApply_predivide(OCIO_ConstCPUProcessorRcPtr *cpu_processor, @@ -177,6 +178,7 @@ class FallbackImpl : public IOCIOImpl { void processorRelease(OCIO_ConstProcessorRcPtr *processor); OCIO_ConstCPUProcessorRcPtr *processorGetCPUProcessor(OCIO_ConstProcessorRcPtr *processor); + bool cpuProcessorIsNoOp(OCIO_ConstCPUProcessorRcPtr *cpu_processor); void cpuProcessorApply(OCIO_ConstCPUProcessorRcPtr *cpu_processor, OCIO_PackedImageDesc *img); void cpuProcessorApply_predivide(OCIO_ConstCPUProcessorRcPtr *cpu_processor, OCIO_PackedImageDesc *img); @@ -267,6 +269,7 @@ class OCIOImpl : public IOCIOImpl { void processorRelease(OCIO_ConstProcessorRcPtr *processor); OCIO_ConstCPUProcessorRcPtr *processorGetCPUProcessor(OCIO_ConstProcessorRcPtr *processor); + bool cpuProcessorIsNoOp(OCIO_ConstCPUProcessorRcPtr *cpu_processor); void cpuProcessorApply(OCIO_ConstCPUProcessorRcPtr *cpu_processor, OCIO_PackedImageDesc *img); void cpuProcessorApply_predivide(OCIO_ConstCPUProcessorRcPtr *cpu_processor, OCIO_PackedImageDesc *img); diff --git a/source/blender/imbuf/IMB_colormanagement.h b/source/blender/imbuf/IMB_colormanagement.h index 497fd5f3f7a..b77302bcda9 100644 --- a/source/blender/imbuf/IMB_colormanagement.h +++ b/source/blender/imbuf/IMB_colormanagement.h @@ -421,6 +421,7 @@ struct ColormanageProcessor *IMB_colormanagement_display_processor_new( const struct ColorManagedDisplaySettings *display_settings); struct ColormanageProcessor *IMB_colormanagement_colorspace_processor_new( const char *from_colorspace, const char *to_colorspace); +bool IMB_colormanagement_processor_is_noop(struct ColormanageProcessor *cm_processor); void IMB_colormanagement_processor_apply_v4(struct ColormanageProcessor *cm_processor, float pixel[4]); void IMB_colormanagement_processor_apply_v4_predivide(struct ColormanageProcessor *cm_processor, diff --git a/source/blender/imbuf/intern/colormanagement.cc b/source/blender/imbuf/intern/colormanagement.cc index 802f98849c2..b5ce05ee444 100644 --- a/source/blender/imbuf/intern/colormanagement.cc +++ b/source/blender/imbuf/intern/colormanagement.cc @@ -1930,8 +1930,6 @@ static void colormanagement_transform_ex(uchar *byte_buffer, bool predivide, bool do_threaded) { - ColormanageProcessor *cm_processor; - if (from_colorspace[0] == '\0') { return; } @@ -1943,7 +1941,12 @@ static void colormanagement_transform_ex(uchar *byte_buffer, return; } - cm_processor = IMB_colormanagement_colorspace_processor_new(from_colorspace, to_colorspace); + ColormanageProcessor *cm_processor = IMB_colormanagement_colorspace_processor_new( + from_colorspace, to_colorspace); + if (IMB_colormanagement_processor_is_noop(cm_processor)) { + IMB_colormanagement_processor_free(cm_processor); + return; + } if (do_threaded) { processor_transform_apply_threaded( @@ -3851,6 +3854,18 @@ ColormanageProcessor *IMB_colormanagement_colorspace_processor_new(const char *f return cm_processor; } +bool IMB_colormanagement_processor_is_noop(ColormanageProcessor *cm_processor) +{ + if (cm_processor->curve_mapping) { + /* Consider processor which has curve mapping as a non no-op. + * This is mainly for the simplicity of the check, since the current cases where this function + * is used the curve mapping is never assigned. */ + return false; + } + + return OCIO_cpuProcessorIsNoOp(cm_processor->cpu_processor); +} + void IMB_colormanagement_processor_apply_v4(ColormanageProcessor *cm_processor, float pixel[4]) { if (cm_processor->curve_mapping) {