diff --git a/unittest/CMakeLists.txt b/unittest/CMakeLists.txt index bb1de53..2493a74 100644 --- a/unittest/CMakeLists.txt +++ b/unittest/CMakeLists.txt @@ -4,5 +4,6 @@ add_subdirectory(IlmImfCtl) if (CTL_BUILD_TOOLS) add_subdirectory(ctlrender) add_subdirectory(exrdpx) + add_subdirectory(exr_ctl_exr) endif() diff --git a/unittest/exr_ctl_exr/CMakeLists.txt b/unittest/exr_ctl_exr/CMakeLists.txt new file mode 100644 index 0000000..34189cc --- /dev/null +++ b/unittest/exr_ctl_exr/CMakeLists.txt @@ -0,0 +1,31 @@ +if(NOT DEFINED EXR_CTL_EXR_BUILD_DIR) + set(EXR_CTL_EXR_BUILD_DIR "${CMAKE_BINARY_DIR}/OpenEXR_CTL/exr_ctl_exr") + message("exr_ctl_exr build director: ${EXR_CTL_EXR_BUILD_DIR}") +endif() + +if(NOT DEFINED EXR_CTL_EXR_EXECUTABLE_PATH) + set(EXR_CTL_EXR_EXECUTABLE_PATH "${EXR_CTL_EXR_BUILD_DIR}/exr_ctl_exr") + message("exr_ctl_exr test executable: ${EXR_CTL_EXR_EXECUTABLE_PATH}") +endif() + +set(EXR_CTL_EXR_OUTPUT_FOLDER "${CMAKE_BINARY_DIR}/unittest/exr_ctl_exr/output") +message("exr_ctl_exr test output folder will be created at: ${EXR_CTL_EXR_OUTPUT_FOLDER}") +add_custom_target(exr-ctl-exr-build-time-make-directory ALL + COMMAND ${CMAKE_COMMAND} -E make_directory ${EXR_CTL_EXR_OUTPUT_FOLDER}) + +set(TEST_FILES "${PROJECT_SOURCE_DIR}/unittest/exr_ctl_exr") + +# copy CTL files to build folder +add_custom_target( + exr-ctl-exr-build-time-copy-CTL-file1 ALL + COMMAND ${CMAKE_COMMAND} -E copy + ${TEST_FILES}/change_saturation.ctl + "${EXR_CTL_EXR_BUILD_DIR}") + +if(OpenEXR_FOUND) + + add_test(NAME "exr-ctl-exr-noargs" COMMAND ${EXR_CTL_EXR_EXECUTABLE_PATH} -C change_saturation "${TEST_FILES}/marci-512.exr" "${EXR_CTL_EXR_OUTPUT_FOLDER}/exr-ctl-exr-noargs.exr" WORKING_DIRECTORY "${EXR_CTL_EXR_BUILD_DIR}") + # set CTL_MODULE_PATH environment variable before running exr_ctl_exr + #set_property(TEST "exr-ctl-exr-noargs" PROPERTY ENVIRONMENT_MODIFICATION "CTL_MODULE_PATH=./") + +endif() diff --git a/unittest/exr_ctl_exr/change_saturation.ctl b/unittest/exr_ctl_exr/change_saturation.ctl new file mode 100644 index 0000000..33914a5 --- /dev/null +++ b/unittest/exr_ctl_exr/change_saturation.ctl @@ -0,0 +1,131 @@ +/////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2013 Academy of Motion Picture Arts and Sciences +// ("A.M.P.A.S."). Portions contributed by others as indicated. +// All rights reserved. +// +// A worldwide, royalty-free, non-exclusive right to copy, modify, create +// derivatives, and use, in source and binary forms, is hereby granted, +// subject to acceptance of this license. Performance of any of the +// aforementioned acts indicates acceptance to be bound by the following +// terms and conditions: +// +// * Copies of source code, in whole or in part, must retain the +// above copyright notice, this list of conditions and the +// Disclaimer of Warranty. +// +// * Use in binary form must retain the above copyright notice, +// this list of conditions and the Disclaimer of Warranty in the +// documentation and/or other materials provided with the distribution. +// +// * Nothing in this license shall be deemed to grant any rights to +// trademarks, copyrights, patents, trade secrets or any other +// intellectual property of A.M.P.A.S. or any contributors, except +// as expressly stated herein. +// +// * Neither the name "A.M.P.A.S." nor the name of any other +// contributors to this software may be used to endorse or promote +// products derivative of or based on this software without express +// prior written permission of A.M.P.A.S. or the contributors, as +// appropriate. +// +// This license shall be construed pursuant to the laws of the State of +// California, and any disputes related thereto shall be subject to the +// jurisdiction of the courts therein. +// +// Disclaimer of Warranty: THIS SOFTWARE IS PROVIDED BY A.M.P.A.S. AND +// CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +// BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT ARE DISCLAIMED. IN NO +// EVENT SHALL A.M.P.A.S., OR ANY CONTRIBUTORS OR DISTRIBUTORS, BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, RESITUTIONARY, +// OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. +// +// WITHOUT LIMITING THE GENERALITY OF THE FOREGOING, THE ACADEMY +// SPECIFICALLY DISCLAIMS ANY REPRESENTATIONS OR WARRANTIES WHATSOEVER +// RELATED TO PATENT OR OTHER INTELLECTUAL PROPERTY RIGHTS IN THE ACADEMY +// COLOR ENCODING SYSTEM, OR APPLICATIONS THEREOF, HELD BY PARTIES OTHER +// THAN A.M.P.A.S., WHETHER DISCLOSED OR UNDISCLOSED. +/////////////////////////////////////////////////////////////////////////// + +// +// Function change_saturation() saturates or desaturates an RGB image by +// converting the pixels to CIELAB, multiplying the a* and b* components +// by a caller-supplied factor, sScale, and converting back to RGB. +// +// Parameters: +// +// R, G, B Input pixel value +// +// ROut, GOut, BOut Output pixel value +// +// sScale Saturation scale factor: +// sScale > 1 increases saturation, +// 0 <= sScale < 1 decreases saturation, +// +// chromaticities CIE (x,y) coordinates of the primaries +// and white point for the input and output +// pixels +// +// whiteLuminance Luminance of pixels with R = G = B = 1 +// +// adoptedNeutral CIE (x,y) coordinates of the white stimulus +// for RGB-to-LAB and LAB-to-RGB conversion. +// Decreasing or increasing saturation makes +// the pixel colors move towards or away from +// the adoptedNeutral value. +// + +void +change_saturation + (output varying half ROut, + output varying half GOut, + output varying half BOut, + varying half R, + varying half G, + varying half B, + float adoptedNeutral[2], + Chromaticities chromaticities, + float whiteLuminance = 1.0, + float sScale = 1.0) +{ + // + // Compute the XYZ coordinates of the white stimulus. + // + + float XYZn[3]; + XYZn[0] = adoptedNeutral[0] * whiteLuminance / adoptedNeutral[1]; + XYZn[1] = whiteLuminance; + XYZn[2] = whiteLuminance / adoptedNeutral[1] - XYZn[0] - whiteLuminance; + + // + // Convert input RGB value first to XYZ, then to LAB + // + + float toXYZ[4][4] = RGBtoXYZ (chromaticities, whiteLuminance); + float RGB[3] = {R, G, B}; + float XYZ[3] = mult_f3_f44 (RGB, toXYZ); + float Lab[3] = XYZtoLab (XYZ, XYZn); + + // + // Change saturation by scaling the a* and b* coordinates. + // + + Lab[1] = Lab[1] * sScale; + Lab[2] = Lab[2] * sScale; + + // + // Convert back to XYZ and then to RGB + // + + XYZ = LabtoXYZ (Lab, XYZn); + float toRGB[4][4] = XYZtoRGB (chromaticities, whiteLuminance); + RGB = mult_f3_f44 (XYZ, toRGB); + ROut = RGB[0]; + GOut = RGB[1]; + BOut = RGB[2]; +} diff --git a/unittest/exr_ctl_exr/marci-512.exr b/unittest/exr_ctl_exr/marci-512.exr new file mode 100644 index 0000000..04ce5a5 Binary files /dev/null and b/unittest/exr_ctl_exr/marci-512.exr differ