X-Git-Url: http://users.mur.at/ms/git/gitweb/?a=blobdiff_plain;f=aces_1.0.0%2Fpython%2Faces_ocio%2Fcolorspaces%2Faces.py;h=1157b5754919e34adfaa6bdeef03beb748b9e60d;hb=07d70535fd63c090b57c754758a0b2ae3ff121ac;hp=fee627414b5f1d9dafff58f716488ea53f3869d9;hpb=922767a1d6567ea91b98b1796436e94ada818813;p=OpenColorIO-Configs.git diff --git a/aces_1.0.0/python/aces_ocio/colorspaces/aces.py b/aces_1.0.0/python/aces_ocio/colorspaces/aces.py index fee6274..1157b57 100644 --- a/aces_1.0.0/python/aces_ocio/colorspaces/aces.py +++ b/aces_1.0.0/python/aces_ocio/colorspaces/aces.py @@ -26,7 +26,6 @@ from aces_ocio.utilities import ( sanitize, compact) - __author__ = 'ACES Developers' __copyright__ = 'Copyright (C) 2014 - 2015 - ACES Developers' __license__ = '' @@ -92,7 +91,7 @@ def create_ACES(): aces2065_1.description = ( 'The Academy Color Encoding System reference color space') aces2065_1.equality_group = '' - aces2065_1.aliases = ["lin_ap0", "aces"] + aces2065_1.aliases = ['lin_ap0', 'aces'] aces2065_1.family = 'ACES' aces2065_1.is_data = False aces2065_1.allocation_type = ocio.Constants.ALLOCATION_LG2 @@ -125,16 +124,23 @@ def create_ACEScc(aces_ctl_directory, cs = ColorSpace(name) cs.description = 'The %s color space' % name - cs.aliases = ["acescc_ap1"] + cs.aliases = ['acescc', 'acescc_ap1'] cs.equality_group = '' cs.family = 'ACES' cs.is_data = False cs.allocation_type = ocio.Constants.ALLOCATION_UNIFORM cs.allocation_vars = [min_value, max_value] + cs.aces_transform_id = 'ACEScsc.ACEScc_to_ACES.a1.0.0' ctls = [os.path.join(aces_ctl_directory, 'ACEScc', - 'ACEScsc.ACEScc_to_ACES.a1.0.0.ctl')] + 'ACEScsc.ACEScc_to_ACES.a1.0.0.ctl'), + # This transform gets back to the *AP1* primaries. + # Useful as the 1d LUT is only covering the transfer function. + # The primaries switch is covered by the matrix below: + os.path.join(aces_ctl_directory, + 'ACEScg', + 'ACEScsc.ACES_to_ACEScg.a1.0.0.ctl')] lut = '%s_to_linear.spi1d' % name lut = sanitize(lut) @@ -146,7 +152,7 @@ def create_ACEScc(aces_ctl_directory, 'float', input_scale, 1, - {'transferFunctionOnly': 1}, + {}, cleanup, aces_ctl_directory, min_value, @@ -191,11 +197,13 @@ def create_ACESproxy(aces_ctl_directory, cs = ColorSpace(name) cs.description = 'The %s color space' % name - cs.aliases = ["acesproxy_ap1"] + cs.aliases = ['acesproxy', 'acesproxy_ap1'] cs.equality_group = '' cs.family = 'ACES' cs.is_data = False + cs.aces_transform_id = 'ACEScsc.ACESproxy10i_to_ACES.a1.0.0' + ctls = [os.path.join(aces_ctl_directory, 'ACESproxy', 'ACEScsc.ACESproxy10i_to_ACES.a1.0.0.ctl'), @@ -213,8 +221,8 @@ def create_ACESproxy(aces_ctl_directory, os.path.join(lut_directory, lut), ctls, lut_resolution_1d, - 'uint16', - 64, + 'float', + 1, 1, {}, cleanup, @@ -264,13 +272,15 @@ def create_ACEScg(aces_ctl_directory, cs = ColorSpace(name) cs.description = 'The %s color space' % name - cs.aliases = ["lin_ap1"] + cs.aliases = ['acescg', 'lin_ap1'] cs.equality_group = '' cs.family = 'ACES' cs.is_data = False cs.allocation_type = ocio.Constants.ALLOCATION_LG2 cs.allocation_vars = [-8, 5, 0.00390625] + cs.aces_transform_id = 'ACEScsc.ACEScg_to_ACES.a1.0.0' + cs.to_reference_transforms = [] # *AP1* primaries to *AP0* primaries. @@ -280,6 +290,13 @@ def create_ACEScg(aces_ctl_directory, 'direction': 'forward'}) cs.from_reference_transforms = [] + + # *AP1* primaries to *AP0* primaries. + cs.from_reference_transforms.append({ + 'type': 'matrix', + 'matrix': mat44_from_mat33(ACES_AP0_TO_AP1), + 'direction': 'forward'}) + return cs @@ -307,12 +324,14 @@ def create_ADX(lut_directory, name = '%s%s' % (name, bit_depth) cs = ColorSpace(name) cs.description = '%s color space - used for film scans' % name - cs.aliases = ["adx%s" % str(bit_depth)] + cs.aliases = ['adx%s' % str(bit_depth)] cs.equality_group = '' cs.family = 'ADX' cs.is_data = False if bit_depth == 10: + cs.aces_transform_id = 'ACEScsc.ADX10_to_ACES.a1.0.0' + cs.bit_depth = ocio.Constants.BIT_DEPTH_UINT10 ADX_to_CDD = [1023 / 500, 0, 0, 0, 0, 1023 / 500, 0, 0, @@ -320,6 +339,8 @@ def create_ADX(lut_directory, 0, 0, 0, 1] offset = [-95 / 500, -95 / 500, -95 / 500, 0] elif bit_depth == 16: + cs.aces_transform_id = 'ACEScsc.ADX16_to_ACES.a1.0.0' + cs.bit_depth = ocio.Constants.BIT_DEPTH_UINT16 ADX_to_CDD = [65535 / 8000, 0, 0, 0, 0, 65535 / 8000, 0, 0, @@ -443,7 +464,7 @@ def create_generic_log(aces_ctl_directory, lut_resolution_1d, cleanup, name='log', - aliases=[], + aliases=None, min_value=0, max_value=1, input_scale=1, @@ -464,6 +485,9 @@ def create_generic_log(aces_ctl_directory, *Generic Log* colorspace. """ + if aliases is None: + aliases = [] + cs = ColorSpace(name) cs.description = 'The %s color space' % name cs.aliases = aliases @@ -474,7 +498,7 @@ def create_generic_log(aces_ctl_directory, ctls = [os.path.join( aces_ctl_directory, 'utilities', - 'ACESlib.OCIO_shaper_log2_to_lin_param.a1.0.0.ctl')] + 'ACESlib.Log2_to_Lin_param.a1.0.0.ctl')] lut = '%s_to_linear.spi1d' % name lut = sanitize(lut) @@ -514,10 +538,13 @@ def create_dolbypq(aces_CTL_directory, lut_resolution_1d, cleanup, name='pq', - aliases=[], + aliases=None, min_value=0.0, max_value=1.0, input_scale=1.0): + if aliases is None: + aliases = [] + cs = ColorSpace(name) cs.description = 'The %s color space' % name cs.aliases = aliases @@ -528,7 +555,7 @@ def create_dolbypq(aces_CTL_directory, ctls = [os.path.join( aces_CTL_directory, 'utilities', - 'ACESlib.OCIO_shaper_dolbypq_to_lin.a1.0.0.ctl')] + 'ACESlib.DolbyPQ_to_Lin.a1.0.0.ctl')] lut = '%s_to_linear.spi1d' % name lut = sanitize(lut) @@ -565,13 +592,16 @@ def create_dolbypq_scaled(aces_CTL_directory, lut_resolution_1d, cleanup, name='pq', - aliases=[], + aliases=None, min_value=0.0, max_value=1.0, input_scale=1.0, middle_grey=0.18, min_exposure=-6.0, max_exposure=6.5): + if aliases is None: + aliases = [] + cs = ColorSpace(name) cs.description = 'The %s color space' % name cs.aliases = aliases @@ -582,7 +612,7 @@ def create_dolbypq_scaled(aces_CTL_directory, ctls = [os.path.join( aces_CTL_directory, 'utilities', - 'ACESlib.OCIO_shaper_dolbypq_to_lin_param.a1.0.0.ctl')] + 'ACESlib.DolbyPQ_to_lin_param.a1.0.0.ctl')] lut = '%s_to_linear.spi1d' % name lut = sanitize(lut) @@ -650,6 +680,7 @@ def create_ACES_LMT(lmt_name, cs.is_data = False cs.allocation_type = ocio.Constants.ALLOCATION_LG2 cs.allocation_vars = [-8, 5, 0.00390625] + cs.aces_transform_id = lmt_values['transformID'] pprint.pprint(lmt_values) @@ -795,10 +826,10 @@ def create_LMTs(aces_ctl_directory, lmt_shaper_name, os.path.join('%s', 'utilities', - 'ACESlib.OCIO_shaper_log2_to_lin_param.a1.0.0.ctl'), + 'ACESlib.Log2_to_Lin_param.a1.0.0.ctl'), os.path.join('%s', 'utilities', - 'ACESlib.OCIO_shaper_lin_to_log2_param.a1.0.0.ctl'), + 'ACESlib.Lin_to_Log2_param.a1.0.0.ctl'), shaper_input_scale_generic_log2, lmt_params] @@ -806,7 +837,7 @@ def create_LMTs(aces_ctl_directory, print(sorted_LMTs) for lmt in sorted_LMTs: lmt_name, lmt_values = lmt - lmt_aliases = ["look_%s" % compact(lmt_values['transformUserName'])] + lmt_aliases = ['look_%s' % compact(lmt_values['transformUserName'])] cs = create_ACES_LMT( lmt_values['transformUserName'], lmt_values, @@ -859,6 +890,8 @@ def create_ACES_RRT_plus_ODT(odt_name, cs.family = 'Output' cs.is_data = False + cs.aces_transform_id = odt_values['transformID'] + pprint.pprint(odt_values) # Generating the *shaper* transform. @@ -1021,7 +1054,7 @@ def create_ODTs(aces_ctl_directory, # Defining the *Log 2* shaper. log2_shaper_name = shaper_name - log2_shaper_name_aliases = ["crv_%s" % compact(log2_shaper_name)] + log2_shaper_name_aliases = ['crv_%s' % compact(log2_shaper_name)] log2_params = { 'middleGrey': 0.18, 'minExposure': -6, @@ -1046,20 +1079,21 @@ def create_ODTs(aces_ctl_directory, log2_shaper_name, os.path.join('%s', 'utilities', - 'ACESlib.OCIO_shaper_log2_to_lin_param.a1.0.0.ctl'), + 'ACESlib.Log2_to_Lin_param.a1.0.0.ctl'), os.path.join('%s', 'utilities', - 'ACESlib.OCIO_shaper_lin_to_log2_param.a1.0.0.ctl'), + 'ACESlib.Lin_to_Log2_param.a1.0.0.ctl'), shaper_input_scale_generic_log2, log2_params] shaper_data[log2_shaper_name] = log2_shaper_data # Space with a more user-friendly name. Direct copy otherwise. - log2_shaper_copy_name = "Log2 Shaper" + log2_shaper_copy_name = 'Log2 Shaper' log2_shaper_copy_colorspace = ColorSpace(log2_shaper_copy_name) log2_shaper_copy_colorspace.description = 'The %s color space' % log2_shaper_copy_name - log2_shaper_copy_colorspace.aliases = ["crv_%s" % compact(log2_shaper_copy_name)] + log2_shaper_copy_colorspace.aliases = [ + 'crv_%s' % compact(log2_shaper_copy_name)] log2_shaper_copy_colorspace.equality_group = log2_shaper_copy_name log2_shaper_copy_colorspace.family = log2_shaper_colorspace.family log2_shaper_copy_colorspace.is_data = log2_shaper_colorspace.is_data @@ -1070,11 +1104,11 @@ def create_ODTs(aces_ctl_directory, colorspaces.append(log2_shaper_copy_colorspace) # Defining the *Log2 shaper that includes the AP1* primaries. - log2_shaper_api1_name = "%s - AP1" % "Log2 Shaper" + log2_shaper_api1_name = '%s - AP1' % 'Log2 Shaper' log2_shaper_api1_colorspace = ColorSpace(log2_shaper_api1_name) log2_shaper_api1_colorspace.description = 'The %s color space' % log2_shaper_api1_name log2_shaper_api1_colorspace.aliases = [ - "%s_ap1" % compact(log2_shaper_copy_name)] + '%s_ap1' % compact(log2_shaper_copy_name)] log2_shaper_api1_colorspace.equality_group = log2_shaper_api1_name log2_shaper_api1_colorspace.family = log2_shaper_colorspace.family log2_shaper_api1_colorspace.is_data = log2_shaper_colorspace.is_data @@ -1093,10 +1127,10 @@ def create_ODTs(aces_ctl_directory, # Defining the *Log2 shaper that includes the AP1* primaries. # Named with 'shaper_name' variable. Needed for some LUT baking steps. - shaper_api1_name = "%s - AP1" % shaper_name + shaper_api1_name = '%s - AP1' % shaper_name shaper_api1_colorspace = ColorSpace(shaper_api1_name) shaper_api1_colorspace.description = 'The %s color space' % shaper_api1_name - shaper_api1_colorspace.aliases = ["%s_ap1" % compact(shaper_name)] + shaper_api1_colorspace.aliases = ['%s_ap1' % compact(shaper_name)] shaper_api1_colorspace.equality_group = shaper_api1_name shaper_api1_colorspace.family = log2_shaper_colorspace.family shaper_api1_colorspace.is_data = log2_shaper_colorspace.is_data @@ -1108,8 +1142,8 @@ def create_ODTs(aces_ctl_directory, # Define the base *Dolby PQ Shaper* # - dolbypq_shaper_name = "Dolby PQ 10000" - dolbypq_shaper_name_aliases = ["crv_%s" % "dolbypq_10000"] + dolbypq_shaper_name = 'Dolby PQ 10000' + dolbypq_shaper_name_aliases = ['crv_%s' % 'dolbypq_10000'] dolbypq_shaper_colorspace = create_dolbypq( aces_ctl_directory, @@ -1125,10 +1159,10 @@ def create_ODTs(aces_ctl_directory, dolbypq_shaper_name, os.path.join('%s', 'utilities', - 'ACESlib.OCIO_shaper_dolbypq_to_lin.a1.0.0.ctl'), + 'ACESlib.DolbyPQ_to_Lin.a1.0.0.ctl'), os.path.join('%s', 'utilities', - 'ACESlib.OCIO_shaper_lin_to_dolbypq.a1.0.0.ctl'), + 'ACESlib.Lin_to_DolbyPQ.a1.0.0.ctl'), 1.0, {}] @@ -1136,8 +1170,8 @@ def create_ODTs(aces_ctl_directory, # Define the *Dolby PQ Shaper that considers a fixed linear range* # - dolbypq_scaled_shaper_name = "Dolby PQ Scaled" - dolbypq_scaled_shaper_name_aliases = ["crv_%s" % "dolbypq_scaled"] + dolbypq_scaled_shaper_name = 'Dolby PQ Scaled' + dolbypq_scaled_shaper_name_aliases = ['crv_%s' % 'dolbypq_scaled'] dolbypq_scaled_shaper_colorspace = create_dolbypq_scaled( aces_ctl_directory, @@ -1153,10 +1187,10 @@ def create_ODTs(aces_ctl_directory, dolbypq_scaled_shaper_name, os.path.join('%s', 'utilities', - 'ACESlib.OCIO_shaper_dolbypq_to_lin_param.a1.0.0.ctl'), + 'ACESlib.DolbyPQ_to_Lin_param.a1.0.0.ctl'), os.path.join('%s', 'utilities', - 'ACESlib.OCIO_shaper_lin_to_dolbypq_param.a1.0.0.ctl'), + 'ACESlib.Lin_to_DolbyPQ_param.a1.0.0.ctl'), 1.0, log2_params] @@ -1174,17 +1208,22 @@ def create_ODTs(aces_ctl_directory, for odt in sorted_odts: (odt_name, odt_values) = odt - # Generating legal range transform for *ODTs* that can generate + # Generating only full range transform for *ODTs* that can generate # either *legal* or *full* output. + + # Uncomment these lines and the lower section and flip the 'legalRange' value to 1 + # to recover the old behavior, where both legal and full range LUTs were generated if odt_values['transformHasFullLegalSwitch']: - odt_name_legal = '%s - Legal' % odt_values['transformUserName'] - else: - odt_name_legal = odt_values['transformUserName'] + # odt_name_legal = '%s - Legal' % odt_values['transformUserName'] + odt_legal['legalRange'] = 0 + # else: + # odt_name_legal = odt_values['transformUserName'] + + odt_name_legal = odt_values['transformUserName'] odt_legal = odt_values.copy() - odt_legal['legalRange'] = 1 - odt_aliases = ["out_%s" % compact(odt_name_legal)] + odt_aliases = ['out_%s' % compact(odt_name_legal)] cs = create_ACES_RRT_plus_ODT( odt_name_legal, @@ -1199,11 +1238,11 @@ def create_ODTs(aces_ctl_directory, colorspaces.append(cs) displays[odt_name_legal] = { - 'Linear': linear_display_space, + 'Raw': linear_display_space, 'Log': log_display_space, 'Output Transform': cs} - + """ # Generating full range transform for *ODTs* that can generate # either *legal* or *full* output. if odt_values['transformHasFullLegalSwitch']: @@ -1213,7 +1252,7 @@ def create_ODTs(aces_ctl_directory, odt_full = odt_values.copy() odt_full['legalRange'] = 0 - odt_full_aliases = ["out_%s" % compact(odt_name_full)] + odt_full_aliases = ['out_%s' % compact(odt_name_full)] cs_full = create_ACES_RRT_plus_ODT( odt_name_full, @@ -1228,9 +1267,10 @@ def create_ODTs(aces_ctl_directory, colorspaces.append(cs_full) displays[odt_name_full] = { - 'Linear': linear_display_space, + 'Raw': linear_display_space, 'Log': log_display_space, 'Output Transform': cs_full} + """ return (colorspaces, displays) @@ -1263,8 +1303,8 @@ def get_transform_info(ctl_transform): # Figuring out if this transform has options for processing full and legal range transform_full_legal_switch = False for line in lines: - if line.strip() == "input varying int legalRange = 0": - # print( "%s has legal range flag" % transform_user_name) + if line.strip() == 'input varying int legalRange = 0': + # print( '%s has legal range flag' % transform_user_name) transform_full_legal_switch = True break @@ -1515,7 +1555,7 @@ def create_colorspaces(aces_ctl_directory, colorspaces.extend(odts) # Wish there was an automatic way to get this from the CTL - defaultDisplay = "sRGB (D60 sim.)" + defaultDisplay = 'sRGB (D60 sim.)' roles = {'color_picking': ACEScg.name, 'color_timing': ACEScc.name,