public version 0.2
[OpenColorIO-Configs.git] / aces_1.0.1 / python / aces_ocio / colorspaces / panasonic_gh4.py
index 1d0c95b..bf7ef1d 100644 (file)
@@ -5,7 +5,7 @@
 Implements support for *Panasonic GH4* colorspaces conversions and transfer
 functions based on empirical data.
 """
-from panasonic_gh4_data import *
+from panasonic_gh4_data import *
 
 import numpy as np
 from scipy import interpolate
@@ -170,22 +170,18 @@ styles = {
     254.96413793103449, 255.0, 255.0, 255.0, 255.0, 255.0, 255.0]
 }
 
-def prepare_photostyle_to_linear(style, corr=None, debug_plot=False):
+def prepare_photostyle_to_linear(style, legal_range=False, debug_plot=False):
 
-    # 18% gray card correction
+    # 18% gray card exposure offset
     corr = 16.5
-    
-    #if not corr:
-    #    if style == 'V-Log':
-    #        corr = 16.5
-    #    else:
-    #        #corr = 17.3
-    #        corr = 16.5
 
     exp = np.linspace( (corr-39)/3.0, corr/3.0, 40)
     l = np.power(2, exp) * 0.18
     vals = np.array(styles[style])
-    vals = vals/255
+    if legal_range:
+        vals = vals/255.0 * (235-16)/255.0 + 16/255.0
+    else:
+        vals = vals/255.0
 
     # remove visible edges at some exposure values
     print 'DIR:', dir()
@@ -220,7 +216,8 @@ def create_gh4_style(gamut,
                      lut_directory,
                      lut_resolution_1d,
                      aliases,
-                     style=None,
+                     legal_range,
+                     style,
                      variant=''):
     """
     Creates colorspace covering the conversion from GH4 picture styles 
@@ -238,6 +235,8 @@ def create_gh4_style(gamut,
         The resolution of generated 1D LUTs
     aliases : list of str
         Aliases for this colorspace
+    legal_range: bool
+        Add legal range shaper
     style : str
         Associated Photo Style
     variant : str
@@ -249,18 +248,24 @@ def create_gh4_style(gamut,
     A ColorSpace container class referencing the LUTs, matrices 
     and identifying information for the requested colorspace.
     """
-
-    name = ('GH4-%s - GH4-%s-Gamut %s' % (transfer_function, gamut, variant)).strip()
+    
+    if legal_range:
+        legal_str = 'Legal range '
+    else:
+        legal_str = ''
+        
+    name = ('%sGH4-%s - GH4-%s-Gamut %s' % ( legal_str, transfer_function,
+                                            gamut, variant)).strip()
     if transfer_function == '':
         name = ('Linear - GH4-%s-Gamut %s' % (gamut, variant)).strip()
     if gamut == '':
-        name = 'Curve - GH4-%s' % transfer_function
+        name = 'Curve - %sGH4-%s' % (legal_str, transfer_function)
 
     cs = ColorSpace(name)
     cs.description = name
     cs.aliases = aliases
     cs.equality_group = ''
-    cs.family = 'Input/Panasonic/GH4'
+    cs.family = 'Input/Panasonic/GH4 %s' %style
     cs.is_data = False
 
     # A linear space needs allocation variables
@@ -271,11 +276,13 @@ def create_gh4_style(gamut,
     cs.to_reference_transforms = []
 
     if transfer_function != '':
-        f = prepare_photostyle_to_linear(transfer_function)
+
+        if legal_range:
+            lut = 'gh4_%s_legal_to_linear.spi1d' % transfer_function.lower()
+        else:
+            lut = 'gh4_%s_to_linear.spi1d' % transfer_function.lower()
+        f = prepare_photostyle_to_linear(transfer_function, legal_range)
         
-        #data = array.array('f', '\0' * lut_resolution_1d * 4)
-        #for c in range(lut_resolution_1d):
-        #    data[c] = v_log_to_linear(float(c) / (lut_resolution_1d - 1))
         dom = np.linspace(0.0, 1.0, lut_resolution_1d)
         data = f(dom)
 
@@ -290,7 +297,6 @@ def create_gh4_style(gamut,
             else:
                 data[i] = data_max
         
-        lut = 'gh4_%s_to_linear.spi1d' % transfer_function
         genlut.write_SPI_1d(
             os.path.join(lut_directory, lut),
             0.0,
@@ -354,15 +360,18 @@ def create_gh4_style(gamut,
             return cs
 
         if variant == ('Calibrated'):
-            # wb = [0.]*16
-            # wb[0] = calibration_wb[style][0]
-            # wb[5] = calibration_wb[style][1]
-            # wb[10] = calibration_wb[style][2]
-            # wb[15] = 1.0
-            # cs.to_reference_transforms.append({
-            #     'type': 'matrix',
-            #     'matrix': wb,
-            #     'direction': 'forward'})
+            wb = [0.]*16
+            wb[0] = 1/calibration_wb[style][0]
+            wb[5] = 1/calibration_wb[style][1]
+            wb[10] = 1/calibration_wb[style][2]
+            wb[15] = 1.0
+            cs.to_reference_transforms.append({
+                'type': 'matrix',
+                'matrix': wb,
+                'direction': 'forward'})
+
+            # calibrat_matrices = clibration_matrices_argyll
+            
             cs.to_reference_transforms.append({
                 'type': 'matrix',
                 'matrix': (calibration_matrices[style][0] + [0.0] +
@@ -376,14 +385,14 @@ def create_gh4_style(gamut,
         # colour.chromatic_adaptation_matrix_VonKries(
         #   colour.xy_to_XYZ(colour.ILLUMINANTS[
         #     'CIE 1931 2 Degree Standard Observer']['D50']),
-        #   colour.xy_to_XYZ(colour.V_GAMUT_COLOURSPACE.whitepoint),
+        #   colour.xy_to_XYZ(colour.ACES_2065_1_COLOURSPACE.whitepoint),
         #   'CAT02')
         
         cs.to_reference_transforms.append({
             'type': 'matrix',
-            'matrix': [ 0.95991641, -0.02931741,  0.06566143, 0.0,
-                        -0.02119542,  0.99887268,  0.02613247, 0.0,
-                        0.00137075,  0.00443593,  1.31260073, 0.0,
+            'matrix': [ 9.71197151e-01,  -2.17328334e-02,  4.59761326e-02, 0.0,
+                        -1.56890302e-02,  1.00002082e+00,  1.83070138e-02, 0.0,
+                        9.70076767e-04,   3.08175255e-03,  1.21767128e+00, 0.0,
                         0, 0, 0, 1.0],
             'direction': 'forward'})
 
@@ -446,101 +455,89 @@ def create_colorspaces(lut_directory, lut_resolution_1d):
     
     styles_sort = styles.keys()
     styles_sort.sort()
-    
-    for style in styles_sort: 
 
-        # Full conversion
-        style_1 = create_gh4_style(
-            style,
-            style, 
-            lut_directory,
-            lut_resolution_1d,
-            ['gh4_%s_gh4_gamut' % style.lower().replace('-','_')])
-        colorspaces.append(style_1)
-
-        # Linearization Only
-        style_2 = create_gh4_style(
-            '',
-            style,
-            lut_directory,
-            lut_resolution_1d,
-            ['crv_gh4_%s' % style.lower().replace('-','_')])
-        colorspaces.append(style_2)
-
-        # Linearization and XYZ conversion
-        style_3 = create_gh4_style(
-            '%s' % style,
-            style,
-            lut_directory,
-            lut_resolution_1d,
-            ['gh4_%s_xyz' % style.lower().replace('-','_')],
-            variant='XYZ')
-        colorspaces.append(style_3)
-
-        # Primaries Only
-        style_4 = create_gh4_style(
-            style,
-            '',
-            lut_directory,
-            lut_resolution_1d,
-            ['lin_gh4_%s_gamut' % style.lower().replace('-','_')])
-        colorspaces.append(style_4)
+    for legal_range in [True, False]:
+        
+        for style in styles_sort: 
 
-        if style != 'BW':
-            
-            # Full conversion calibrated
-            style_5 = create_gh4_style(
-                '%s' % style,
+            if legal_range:
+                lower_style='%s_legal' % style.lower().replace('-','_')
+            else:
+                lower_style='%s' % style.lower().replace('-','_')
+
+            # Full conversion
+            style_1 = create_gh4_style(
+                style,
                 style, 
                 lut_directory,
                 lut_resolution_1d,
-                ['gh4_%s_gh4_calibrated_gamut'% style.lower().replace('-','_')],
-                style,
-                variant='Calibrated')
-            colorspaces.append(style_5)
+                ['gh4_%s_gh4_gamut' % lower_style],
+                legal_range=legal_range,
+                style=style)
+            colorspaces.append(style_1)
 
-            # Primaries Only calibrated
-            style_6 = create_gh4_style(
-                '%s-Calibrated' % style,
+            # Linearization Only
+            style_2 = create_gh4_style(
                 '',
+                style,
                 lut_directory,
                 lut_resolution_1d,
-                ['lin_gh4_%s_calibrated_gamut'%style.lower().replace('-','_')],
+                ['crv_gh4_%s' % lower_style],
+                legal_range=legal_range,
+                style=style)
+            colorspaces.append(style_2)
+
+            # # Linearization and XYZ conversion
+            # # only necessary for matrix calculation
+            #
+            # style_3 = create_gh4_style(
+            #     style,
+            #     style,
+            #     lut_directory,
+            #     lut_resolution_1d,
+            #     ['gh4_%s_xyz' % lower_style],
+            #     legal_range=legal_range,
+            #     style=style,
+            #     variant='XYZ')
+            # colorspaces.append(style_3)
+
+            # Primaries Only
+            style_4 = create_gh4_style(
                 style,
-                variant='Calibrated')
-            colorspaces.append(style_6)
+                '',
+                lut_directory,
+                lut_resolution_1d,
+                ['lin_gh4_%s_gamut' % lower_style],
+                legal_range=legal_range,
+                style=style
+            )
+            colorspaces.append(style_4)
+
+            if style != 'BW':
+
+                # Full conversion calibrated
+                style_5 = create_gh4_style(
+                    style,
+                    style, 
+                    lut_directory,
+                    lut_resolution_1d,
+                    ['gh4_%s_gh4_calibrated_gamut'% lower_style],
+                    legal_range=legal_range,
+                    style=style,
+                    variant='Calibrated')
+                colorspaces.append(style_5)
+
+                # Primaries Only calibrated
+                style_6 = create_gh4_style(
+                    style,
+                    '',
+                    lut_directory,
+                    lut_resolution_1d,
+                    ['lin_gh4_%s_calibrated_gamut'%lower_style],
+                    legal_range=legal_range,
+                    style=style,
+                    variant='Calibrated')
+                colorspaces.append(style_6)
 
             
     return colorspaces
-
-calibration_matrices = {
-    
-'Cinelike-D': [[1.165504, 0.251869, -0.118313],
-                [-0.369525, 1.80097, -0.096786],
-                [-0.05245, 0.097669, 1.326889]],
- 'Cinelike-V': [[1.060891, 0.353566, -0.102382],
-                [-0.460172, 1.927755, -0.122295],
-                [-0.129601, 0.137134, 1.373328]],
- 'Custom': [[0.946141, 0.485274, -0.087787],
-            [-0.555203, 2.05073, -0.100206],
-            [-0.128126, 0.12821, 1.426733]],
- 'Natural': [[0.874551, 0.439286, -0.085863],
-             [-0.516138, 1.916301, -0.11907],
-             [-0.071172, 0.056567, 1.347203]],
- 'Portrait': [[0.660386, 0.650877, -0.060211],
-              [-0.600758, 1.998228, -0.085769],
-              [-0.110666, 0.124363, 1.339439]],
- 'Scenery': [[0.812315, 0.534553, -0.098869],
-             [-0.542253, 1.934419, -0.071867],
-             [-0.123626, 0.142352, 1.292352]],
- 'Standard': [[0.886056, 0.415669, -0.073317],
-              [-0.482919, 1.84707, -0.088924],
-              [-0.117718, 0.126855, 1.321097]],
- 'V-Log': [[1.127527, 0.284008, -0.033005],
-           [-0.192653, 1.619262, -0.030388],
-           [-0.080181, 0.057527, 1.39992]],
- 'Vivid': [[0.754924, 0.526196, -0.061668],
-           [-0.503233, 1.851748, -0.065254],
-           [-0.197153, 0.267533, 1.212053]]
-
-}