diff options
Diffstat (limited to 'intern/opencolorio/fallback_impl.cc')
-rw-r--r-- | intern/opencolorio/fallback_impl.cc | 366 |
1 files changed, 71 insertions, 295 deletions
diff --git a/intern/opencolorio/fallback_impl.cc b/intern/opencolorio/fallback_impl.cc index a6b93ac4959..9bbc9843e9d 100644 --- a/intern/opencolorio/fallback_impl.cc +++ b/intern/opencolorio/fallback_impl.cc @@ -34,7 +34,7 @@ using std::max; enum TransformType { TRANSFORM_LINEAR_TO_SRGB, TRANSFORM_SRGB_TO_LINEAR, - TRANSFORM_MATRIX, + TRANSFORM_SCALE, TRANSFORM_EXPONENT, TRANSFORM_UNKNOWN, }; @@ -53,147 +53,72 @@ typedef struct OCIO_PackedImageDescription { } OCIO_PackedImageDescription; struct FallbackTransform { - FallbackTransform() : type(TRANSFORM_UNKNOWN), linear_transform(NULL), display_transform(NULL) + FallbackTransform() : type(TRANSFORM_UNKNOWN), scale(1.0f), exponent(1.0f) { } virtual ~FallbackTransform() { - delete linear_transform; - delete display_transform; } void applyRGB(float *pixel) { if (type == TRANSFORM_LINEAR_TO_SRGB) { - applyLinearRGB(pixel); + pixel[0] *= scale; + pixel[1] *= scale; + pixel[2] *= scale; + linearrgb_to_srgb_v3_v3(pixel, pixel); - applyDisplayRGB(pixel); + + pixel[0] = powf(max(0.0f, pixel[0]), exponent); + pixel[1] = powf(max(0.0f, pixel[1]), exponent); + pixel[2] = powf(max(0.0f, pixel[2]), exponent); } else if (type == TRANSFORM_SRGB_TO_LINEAR) { srgb_to_linearrgb_v3_v3(pixel, pixel); } else if (type == TRANSFORM_EXPONENT) { - pixel[0] = powf(max(0.0f, pixel[0]), exponent[0]); - pixel[1] = powf(max(0.0f, pixel[1]), exponent[1]); - pixel[2] = powf(max(0.0f, pixel[2]), exponent[2]); + pixel[0] = powf(max(0.0f, pixel[0]), exponent); + pixel[1] = powf(max(0.0f, pixel[1]), exponent); + pixel[2] = powf(max(0.0f, pixel[2]), exponent); } - else if (type == TRANSFORM_MATRIX) { - float r = pixel[0]; - float g = pixel[1]; - float b = pixel[2]; - pixel[0] = r * matrix[0] + g * matrix[1] + b * matrix[2]; - pixel[1] = r * matrix[4] + g * matrix[5] + b * matrix[6]; - pixel[2] = r * matrix[8] + g * matrix[9] + b * matrix[10]; - pixel[0] += offset[0]; - pixel[1] += offset[1]; - pixel[2] += offset[2]; + else if (type == TRANSFORM_SCALE) { + pixel[0] *= scale; + pixel[1] *= scale; + pixel[2] *= scale; } } void applyRGBA(float *pixel) { - if (type == TRANSFORM_LINEAR_TO_SRGB) { - applyLinearRGBA(pixel); - linearrgb_to_srgb_v4(pixel, pixel); - applyDisplayRGBA(pixel); - } - else if (type == TRANSFORM_SRGB_TO_LINEAR) { - srgb_to_linearrgb_v4(pixel, pixel); - } - else if (type == TRANSFORM_EXPONENT) { - pixel[0] = powf(max(0.0f, pixel[0]), exponent[0]); - pixel[1] = powf(max(0.0f, pixel[1]), exponent[1]); - pixel[2] = powf(max(0.0f, pixel[2]), exponent[2]); - pixel[3] = powf(max(0.0f, pixel[3]), exponent[3]); - } - else if (type == TRANSFORM_MATRIX) { - float r = pixel[0]; - float g = pixel[1]; - float b = pixel[2]; - float a = pixel[3]; - pixel[0] = r * matrix[0] + g * matrix[1] + b * matrix[2] + a * matrix[3]; - pixel[1] = r * matrix[4] + g * matrix[5] + b * matrix[6] + a * matrix[7]; - pixel[2] = r * matrix[8] + g * matrix[9] + b * matrix[10] + a * matrix[11]; - pixel[3] = r * matrix[12] + g * matrix[13] + b * matrix[14] + a * matrix[15]; - pixel[0] += offset[0]; - pixel[1] += offset[1]; - pixel[2] += offset[2]; - pixel[3] += offset[3]; - } - } - - void applyLinearRGB(float *pixel) - { - if (linear_transform != NULL) { - linear_transform->applyRGB(pixel); - } - } - - void applyLinearRGBA(float *pixel) - { - if (linear_transform != NULL) { - linear_transform->applyRGBA(pixel); - } - } - - void applyDisplayRGB(float *pixel) - { - if (display_transform != NULL) { - display_transform->applyRGB(pixel); - } - } - - void applyDisplayRGBA(float *pixel) - { - if (display_transform != NULL) { - display_transform->applyRGBA(pixel); - } + applyRGB(pixel); } TransformType type; - FallbackTransform *linear_transform; - FallbackTransform *display_transform; + /* Scale transform. */ + float scale; /* Exponent transform. */ - float exponent[4]; - /* Matrix transform. */ - float matrix[16]; - float offset[4]; + float exponent; MEM_CXX_CLASS_ALLOC_FUNCS("FallbackTransform"); }; -struct FallbackGroupTransform : FallbackTransform { - ~FallbackGroupTransform() - { - for (auto transform : list) { - delete transform; - } - } - std::vector<FallbackTransform *> list; -}; - struct FallbackProcessor { - FallbackProcessor() : transform(NULL) + FallbackProcessor(const FallbackTransform &transform) : transform(transform) { } - ~FallbackProcessor() - { - delete transform; - } - void applyRGB(float *pixel) { - transform->applyRGB(pixel); + transform.applyRGB(pixel); } void applyRGBA(float *pixel) { - transform->applyRGBA(pixel); + transform.applyRGBA(pixel); } - FallbackTransform *transform; + FallbackTransform transform; MEM_CXX_CLASS_ALLOC_FUNCS("FallbackProcessor"); }; @@ -403,30 +328,35 @@ OCIO_ConstProcessorRcPtr *FallbackImpl::configGetProcessorWithNames(OCIO_ConstCo { OCIO_ConstColorSpaceRcPtr *cs_src = configGetColorSpace(config, srcName); OCIO_ConstColorSpaceRcPtr *cs_dst = configGetColorSpace(config, dstName); - FallbackTransform *transform = new FallbackTransform(); + FallbackTransform transform; if (cs_src == COLORSPACE_LINEAR && cs_dst == COLORSPACE_SRGB) { - transform->type = TRANSFORM_LINEAR_TO_SRGB; + transform.type = TRANSFORM_LINEAR_TO_SRGB; } else if (cs_src == COLORSPACE_SRGB && cs_dst == COLORSPACE_LINEAR) { - transform->type = TRANSFORM_SRGB_TO_LINEAR; + transform.type = TRANSFORM_SRGB_TO_LINEAR; } else { - transform->type = TRANSFORM_UNKNOWN; + transform.type = TRANSFORM_UNKNOWN; } - FallbackProcessor *processor = new FallbackProcessor(); - processor->transform = transform; - return (OCIO_ConstProcessorRcPtr *)processor; + return (OCIO_ConstProcessorRcPtr *)new FallbackProcessor(transform); +} + +OCIO_ConstCPUProcessorRcPtr *FallbackImpl::processorGetCPUProcessor( + OCIO_ConstProcessorRcPtr *processor) +{ + /* Just make a copy of the processor so that we are compatible with OCIO + * which does need it as a separate object. */ + FallbackProcessor *fallback_processor = (FallbackProcessor *)processor; + return (OCIO_ConstCPUProcessorRcPtr *)new FallbackProcessor(*fallback_processor); } -OCIO_ConstProcessorRcPtr *FallbackImpl::configGetProcessor(OCIO_ConstConfigRcPtr * /*config*/, - OCIO_ConstTransformRcPtr *transform) +void FallbackImpl::processorRelease(OCIO_ConstProcessorRcPtr *processor) { - FallbackProcessor *processor = new FallbackProcessor(); - processor->transform = (FallbackTransform *)transform; - return (OCIO_ConstProcessorRcPtr *)processor; + delete (FallbackProcessor *)(processor); } -void FallbackImpl::processorApply(OCIO_ConstProcessorRcPtr *processor, OCIO_PackedImageDesc *img) +void FallbackImpl::cpuProcessorApply(OCIO_ConstCPUProcessorRcPtr *cpu_processor, + OCIO_PackedImageDesc *img) { /* OCIO_TODO stride not respected, channels must be 3 or 4 */ OCIO_PackedImageDescription *desc = (OCIO_PackedImageDescription *)img; @@ -441,15 +371,15 @@ void FallbackImpl::processorApply(OCIO_ConstProcessorRcPtr *processor, OCIO_Pack float *pixel = pixels + channels * (y * width + x); if (channels == 4) - processorApplyRGBA(processor, pixel); + cpuProcessorApplyRGBA(cpu_processor, pixel); else if (channels == 3) - processorApplyRGB(processor, pixel); + cpuProcessorApplyRGB(cpu_processor, pixel); } } } -void FallbackImpl::processorApply_predivide(OCIO_ConstProcessorRcPtr *processor, - OCIO_PackedImageDesc *img) +void FallbackImpl::cpuProcessorApply_predivide(OCIO_ConstCPUProcessorRcPtr *cpu_processor, + OCIO_PackedImageDesc *img) { /* OCIO_TODO stride not respected, channels must be 3 or 4 */ OCIO_PackedImageDescription *desc = (OCIO_PackedImageDescription *)img; @@ -464,27 +394,28 @@ void FallbackImpl::processorApply_predivide(OCIO_ConstProcessorRcPtr *processor, float *pixel = pixels + channels * (y * width + x); if (channels == 4) - processorApplyRGBA_predivide(processor, pixel); + cpuProcessorApplyRGBA_predivide(cpu_processor, pixel); else if (channels == 3) - processorApplyRGB(processor, pixel); + cpuProcessorApplyRGB(cpu_processor, pixel); } } } -void FallbackImpl::processorApplyRGB(OCIO_ConstProcessorRcPtr *processor, float *pixel) +void FallbackImpl::cpuProcessorApplyRGB(OCIO_ConstCPUProcessorRcPtr *cpu_processor, float *pixel) { - ((FallbackProcessor *)processor)->applyRGB(pixel); + ((FallbackProcessor *)cpu_processor)->applyRGB(pixel); } -void FallbackImpl::processorApplyRGBA(OCIO_ConstProcessorRcPtr *processor, float *pixel) +void FallbackImpl::cpuProcessorApplyRGBA(OCIO_ConstCPUProcessorRcPtr *cpu_processor, float *pixel) { - ((FallbackProcessor *)processor)->applyRGBA(pixel); + ((FallbackProcessor *)cpu_processor)->applyRGBA(pixel); } -void FallbackImpl::processorApplyRGBA_predivide(OCIO_ConstProcessorRcPtr *processor, float *pixel) +void FallbackImpl::cpuProcessorApplyRGBA_predivide(OCIO_ConstCPUProcessorRcPtr *cpu_processor, + float *pixel) { if (pixel[3] == 1.0f || pixel[3] == 0.0f) { - processorApplyRGBA(processor, pixel); + cpuProcessorApplyRGBA(cpu_processor, pixel); } else { float alpha, inv_alpha; @@ -496,7 +427,7 @@ void FallbackImpl::processorApplyRGBA_predivide(OCIO_ConstProcessorRcPtr *proces pixel[1] *= inv_alpha; pixel[2] *= inv_alpha; - processorApplyRGBA(processor, pixel); + cpuProcessorApplyRGBA(cpu_processor, pixel); pixel[0] *= alpha; pixel[1] *= alpha; @@ -504,9 +435,9 @@ void FallbackImpl::processorApplyRGBA_predivide(OCIO_ConstProcessorRcPtr *proces } } -void FallbackImpl::processorRelease(OCIO_ConstProcessorRcPtr *processor) +void FallbackImpl::cpuProcessorRelease(OCIO_ConstCPUProcessorRcPtr *cpu_processor) { - delete (FallbackProcessor *)(processor); + delete (FallbackProcessor *)(cpu_processor); } const char *FallbackImpl::colorSpaceGetName(OCIO_ConstColorSpaceRcPtr *cs) @@ -530,54 +461,20 @@ const char *FallbackImpl::colorSpaceGetFamily(OCIO_ConstColorSpaceRcPtr * /*cs*/ return ""; } -OCIO_DisplayTransformRcPtr *FallbackImpl::createDisplayTransform(void) -{ - FallbackTransform *transform = new FallbackTransform(); - transform->type = TRANSFORM_LINEAR_TO_SRGB; - return (OCIO_DisplayTransformRcPtr *)transform; -} - -void FallbackImpl::displayTransformSetInputColorSpaceName(OCIO_DisplayTransformRcPtr * /*dt*/, - const char * /*name*/) -{ -} - -void FallbackImpl::displayTransformSetDisplay(OCIO_DisplayTransformRcPtr * /*dt*/, - const char * /*name*/) -{ -} - -void FallbackImpl::displayTransformSetView(OCIO_DisplayTransformRcPtr * /*dt*/, - const char * /*name*/) -{ -} - -void FallbackImpl::displayTransformSetDisplayCC(OCIO_DisplayTransformRcPtr *dt, - OCIO_ConstTransformRcPtr *et) -{ - FallbackTransform *transform = (FallbackTransform *)dt; - transform->display_transform = (FallbackTransform *)et; -} - -void FallbackImpl::displayTransformSetLinearCC(OCIO_DisplayTransformRcPtr *dt, - OCIO_ConstTransformRcPtr *et) -{ - FallbackTransform *transform = (FallbackTransform *)dt; - transform->linear_transform = (FallbackTransform *)et; -} - -void FallbackImpl::displayTransformSetLooksOverride(OCIO_DisplayTransformRcPtr * /*dt*/, - const char * /*looks*/) -{ -} - -void FallbackImpl::displayTransformSetLooksOverrideEnabled(OCIO_DisplayTransformRcPtr * /*dt*/, - bool /*enabled*/) +OCIO_ConstProcessorRcPtr *FallbackImpl::createDisplayProcessor(OCIO_ConstConfigRcPtr * /*config*/, + const char * /*input*/, + const char * /*view*/, + const char * /*display*/, + const char * /*look*/, + const float scale, + const float exponent) { -} + FallbackTransform transform; + transform.type = TRANSFORM_LINEAR_TO_SRGB; + transform.scale = scale; + transform.exponent = exponent; -void FallbackImpl::displayTransformRelease(OCIO_DisplayTransformRcPtr * /*dt*/) -{ + return (OCIO_ConstProcessorRcPtr *)new FallbackProcessor(transform); } OCIO_PackedImageDesc *FallbackImpl::createOCIO_PackedImageDesc(float *data, @@ -605,127 +502,6 @@ void FallbackImpl::OCIO_PackedImageDescRelease(OCIO_PackedImageDesc *id) MEM_freeN(id); } -OCIO_GroupTransformRcPtr *FallbackImpl::createGroupTransform(void) -{ - FallbackTransform *transform = new FallbackGroupTransform(); - transform->type = TRANSFORM_UNKNOWN; - return (OCIO_GroupTransformRcPtr *)transform; -} - -void FallbackImpl::groupTransformSetDirection(OCIO_GroupTransformRcPtr * /*gt*/, - const bool /*forward */) -{ -} - -void FallbackImpl::groupTransformPushBack(OCIO_GroupTransformRcPtr *gt, - OCIO_ConstTransformRcPtr *transform) -{ - FallbackGroupTransform *group = (FallbackGroupTransform *)gt; - group->list.push_back((FallbackTransform *)transform); -} - -void FallbackImpl::groupTransformRelease(OCIO_GroupTransformRcPtr * /*gt*/) -{ -} - -OCIO_ColorSpaceTransformRcPtr *FallbackImpl::createColorSpaceTransform(void) -{ - FallbackTransform *transform = new FallbackTransform(); - transform->type = TRANSFORM_UNKNOWN; - return (OCIO_ColorSpaceTransformRcPtr *)transform; -} - -void FallbackImpl::colorSpaceTransformSetSrc(OCIO_ColorSpaceTransformRcPtr * /*ct*/, - const char * /*name*/) -{ -} - -void FallbackImpl::colorSpaceTransformRelease(OCIO_ColorSpaceTransformRcPtr * /*ct*/) -{ -} - -OCIO_ExponentTransformRcPtr *FallbackImpl::createExponentTransform(void) -{ - FallbackTransform *transform = new FallbackTransform(); - transform->type = TRANSFORM_EXPONENT; - return (OCIO_ExponentTransformRcPtr *)transform; -} - -void FallbackImpl::exponentTransformSetValue(OCIO_ExponentTransformRcPtr *et, - const float *exponent) -{ - FallbackTransform *transform = (FallbackTransform *)et; - copy_v4_v4(transform->exponent, exponent); -} - -void FallbackImpl::exponentTransformRelease(OCIO_ExponentTransformRcPtr * /*et*/) -{ -} - -OCIO_MatrixTransformRcPtr *FallbackImpl::createMatrixTransform(void) -{ - FallbackTransform *transform = new FallbackTransform(); - transform->type = TRANSFORM_MATRIX; - return (OCIO_MatrixTransformRcPtr *)transform; -} - -void FallbackImpl::matrixTransformSetValue(OCIO_MatrixTransformRcPtr *mt, - const float *m44, - const float *offset4) -{ - FallbackTransform *transform = (FallbackTransform *)mt; - copy_m4_m4((float(*)[4])transform->matrix, (float(*)[4])m44); - copy_v4_v4(transform->offset, offset4); -} - -void FallbackImpl::matrixTransformRelease(OCIO_MatrixTransformRcPtr * /*mt*/) -{ -} - -void FallbackImpl::matrixTransformScale(float *m44, float *offset4, const float *scale4) -{ - if (scale4 == NULL) { - return; - } - if (m44 != NULL) { - memset(m44, 0, 16 * sizeof(float)); - m44[0] = scale4[0]; - m44[5] = scale4[1]; - m44[10] = scale4[2]; - m44[15] = scale4[3]; - } - if (offset4 != NULL) { - offset4[0] = 0.0f; - offset4[1] = 0.0f; - offset4[2] = 0.0f; - offset4[3] = 0.0f; - } -} - -bool FallbackImpl::supportGLSLDraw(void) -{ - return false; -} - -bool FallbackImpl::setupGLSLDraw(struct OCIO_GLSLDrawState ** /*state_r*/, - OCIO_ConstProcessorRcPtr * /*ocio_processor_scene_to_ui*/, - OCIO_ConstProcessorRcPtr * /*ocio_processor_ui_to_display*/, - OCIO_CurveMappingSettings * /*curve_mapping_settings*/, - float /*dither*/, - bool /*predivide*/, - bool /*overlay*/) -{ - return false; -} - -void FallbackImpl::finishGLSLDraw(OCIO_GLSLDrawState * /*state*/) -{ -} - -void FallbackImpl::freeGLState(struct OCIO_GLSLDrawState * /*state_r*/) -{ -} - const char *FallbackImpl::getVersionString(void) { return "fallback"; |