From 37371f5e7de31af8a77b0c4a66f5b5c9fbb03655 Mon Sep 17 00:00:00 2001 From: Thomas Wilshaw Date: Mon, 30 Sep 2024 13:24:14 +0100 Subject: [PATCH] Add reference updating --- tcolour/Colourimetry.py | 12 ++-- tcolour/tcolour.py | 115 +++++++++++++++++++++++------------ tests/context.py | 4 ++ tests/files/tcolor_test.yaml | 4 +- tests/test_Colourimetry.py | 8 +-- 5 files changed, 92 insertions(+), 51 deletions(-) create mode 100644 tests/context.py diff --git a/tcolour/Colourimetry.py b/tcolour/Colourimetry.py index 4b44ffe..0b60f68 100644 --- a/tcolour/Colourimetry.py +++ b/tcolour/Colourimetry.py @@ -1,16 +1,20 @@ from enum import Enum +import TransferCharacteristic as TC class RGBPrimaries(): """Defines a set of three RGB primaries using the CIE xy coordinate system.""" - def __init__(self, r=[], g=[], b=[]) -> None: + def __init__(self, r=[], g=[], b=[], reference="") -> None: self.r = r self.g = g self.b = b + self.reference = reference def valid(self) -> bool: if not self.r or not self.g or not self.b: return False + if self.reference: + return False return True @@ -39,7 +43,7 @@ class Colourimetry: """ def __init__(self, descriptor:str="", rgb_primaries:RGBPrimaries=RGBPrimaries(), achromatic:list=[], - transfer_characteristic=None, hints:list=[], alias:list=[], + transfer_characteristic=TC.TransferCharacteristic(), hints:list=[], alias:list=[], cie_version:CIEVersion=None) -> None: self.descriptor = descriptor self.primaries = rgb_primaries @@ -61,10 +65,8 @@ def colourspace_valid(self) -> bool: return False if not self.achromatic_valid(): return False - if self.transfer_characteristic is None: - return False if not self.transfer_characteristic.valid(): - return True + return False return True def __repr__(self) -> str: diff --git a/tcolour/tcolour.py b/tcolour/tcolour.py index 8247674..918f977 100644 --- a/tcolour/tcolour.py +++ b/tcolour/tcolour.py @@ -58,50 +58,84 @@ def transfer_charactersitc_from_YAML(self, yaml_input): except KeyError as e: print("YAML ERROR: ", e) + def colourimetry_from_YAML(self,name, yaml_colourimetry): + new_colourimetry_set = Colourimetry.Colourimetry() + new_colourimetry_set.descriptor = name + + if "RGB Primaries" in yaml_colourimetry: + primaries = yaml_colourimetry["RGB Primaries"] + if type(primaries) is dict: + new_colourimetry_set.primaries = self.RGBPrimaries_from_YAML(primaries) + elif type(primaries) is str: + new_colourimetry_set.primaries = Colourimetry.RGBPrimaries(reference=primaries) + else: + new_colourimetry_set.primaries = primaries + + if "Achromatic Centroid" in yaml_colourimetry: + achromatic_centroid = yaml_colourimetry["Achromatic Centroid"] + if type(achromatic_centroid) is dict: + new_colourimetry_set.achromatic = self.achromatic_centroid_from_YAML(achromatic_centroid) + else: + new_colourimetry_set.achromatic = achromatic_centroid + + if "Transfer Characteristic" in yaml_colourimetry: + transfer_characteristic = yaml_colourimetry["Transfer Characteristic"] + if type(transfer_characteristic) is list: + new_colourimetry_set.transfer_characteristic = self.transfer_charactersitc_from_YAML(transfer_characteristic) + else: + new_colourimetry_set.transfer_characteristic = TransferCharacteristic.TransferCharacteristic() + + if "Hints" in yaml_colourimetry: + new_colourimetry_set.hints = yaml_colourimetry["Hints"] + + if "Alias" in yaml_colourimetry: + new_colourimetry_set.alias = yaml_colourimetry["Alias"] + + if "CIE Version" in yaml_colourimetry: + new_colourimetry_set.cie_version = yaml_colourimetry["CIE Version"] + + return new_colourimetry_set def parse_data(self, data:list): """Parse the YAML data""" for id, idx in enumerate(data): - try: - new_colourimetry_set = Colourimetry.Colourimetry() - name = list(data[id].keys())[0] - colour_space = data[id][name] - - new_colourimetry_set.descriptor = name - - if "RGB Primaries" in colour_space: - primaries = colour_space["RGB Primaries"] - if type(primaries) is dict: - new_colourimetry_set.primaries = self.RGBPrimaries_from_YAML(primaries) - else: - new_colourimetry_set.primaries = primaries - - if "Achromatic Centroid" in colour_space: - achromatic_centroid = colour_space["Achromatic Centroid"] - if type(achromatic_centroid) is dict: - new_colourimetry_set.achromatic = self.achromatic_centroid_from_YAML(achromatic_centroid) - else: - new_colourimetry_set.achromatic = achromatic_centroid - - if "Transfer Characteristic" in colour_space: - transfer_characteristic = colour_space["Transfer Characteristic"] - if type(transfer_characteristic) is list: - new_colourimetry_set.transfer_characteristic = self.transfer_charactersitc_from_YAML(transfer_characteristic) - else: - new_colourimetry_set.transfer_characteristic = transfer_characteristic - - if "Hints" in colour_space: - new_colourimetry_set.hints = colour_space["Hints"] - - if "Alias" in colour_space: - new_colourimetry_set.alias = colour_space["Alias"] - - if "CIE Version" in colour_space: - new_colourimetry_set.cie_version = colour_space["CIE Version"] - - self.config[str(name)] = new_colourimetry_set - except Exception as e: - print(e, "Skipping this Colourimetry chunk") + + name = list(data[id].keys())[0] + yaml_colourimetry = data[id][name] + + if name in self.config: + print("WARNING: Colour space repeated (" + name + ")") + print("Only Alias and Hints can be merged. To redifine colourimetry lease delete the chunk and re add") + new_colourimetry = self.colourimetry_from_YAML(name, yaml_colourimetry) + existing_colourimetry = self.config[name] + + #print(existing_colourimetry) + + existing_colourimetry.hints = existing_colourimetry.hints + new_colourimetry.hints + existing_colourimetry.alias = existing_colourimetry.alias + new_colourimetry.alias + else: + try: + self.config[str(name)] = self.colourimetry_from_YAML(name, yaml_colourimetry) + except Exception as e: + print(e, "Skipping this Colourimetry chunk") + + def update_references(self): + """Loop through the config and update any references""" + + for key, value in self.config.items(): + value:Colourimetry + # TODO: Make recursive maybe? + if not value.primaries.valid(): + if value.primaries.reference: + self.config[key].primaries = self.config[value.primaries.reference].primaries + + if not value.achromatic_valid(): + if type(value.achromatic) is str: + self.config[key].achromatic = self.config[value.achromatic].achromatic + + if not value.transfer_characteristic.valid(): + pass + #print(key) def add_colour_space(self, colour_space): @@ -110,6 +144,7 @@ def add_colour_space(self, colour_space): with open(colour_space, 'r') as file: data = yaml.safe_load(file) self.parse_data(data) + self.update_references() def print_colourimetry(self, descriptor): """Pretty prints the colourimetry data set for the given descriptor""" diff --git a/tests/context.py b/tests/context.py new file mode 100644 index 0000000..2d23dee --- /dev/null +++ b/tests/context.py @@ -0,0 +1,4 @@ +import os +import sys +sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..\\tcolour'))) +import tcolour.tcolour as tc diff --git a/tests/files/tcolor_test.yaml b/tests/files/tcolor_test.yaml index dfe3ccf..075e539 100644 --- a/tests/files/tcolor_test.yaml +++ b/tests/files/tcolor_test.yaml @@ -29,8 +29,8 @@ Achromatic Centroid: {x: 0.3127, y: 0.3290} - sRGB Presentation: - RGB Primaries: BT.709 Primaries, - Achromatic Centroid: D65 White, + RGB Primaries: BT.709 Primaries + Achromatic Centroid: D65 White Transfer Characteristic: - Type: Sequence - Sequence: diff --git a/tests/test_Colourimetry.py b/tests/test_Colourimetry.py index 20aa0b2..f151c29 100644 --- a/tests/test_Colourimetry.py +++ b/tests/test_Colourimetry.py @@ -1,10 +1,10 @@ import unittest -from tcolour import Colourimetry -from tcolour import TransferCharacteristic as tc +import sys +from .context import tc class TestColourimetry(unittest.TestCase): def test_valid(self): - col = Colourimetry.Colourimetry() + col = tc.Colourimetry.Colourimetry() # Should be invalid as nothing is set self.assertFalse(col.colourspace_valid()) @@ -18,5 +18,5 @@ def test_valid(self): # Should be invalid as still missing TC self.assertFalse(col.colourspace_valid()) - col.transfer_characteristic = tc.TransferCharacteristicPower(parameters={'a': 2.2}) + col.transfer_characteristic = tc.TransferCharacteristic.TransferCharacteristicPower(parameters={'a': 2.2}) self.assertTrue(col.colourspace_valid()) \ No newline at end of file