Skip to content

Commit

Permalink
Add reference updating
Browse files Browse the repository at this point in the history
  • Loading branch information
ThomasWilshaw committed Sep 30, 2024
1 parent 8f1456b commit 37371f5
Show file tree
Hide file tree
Showing 5 changed files with 92 additions and 51 deletions.
12 changes: 7 additions & 5 deletions tcolour/Colourimetry.py
Original file line number Diff line number Diff line change
@@ -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

Expand Down Expand Up @@ -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
Expand All @@ -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:
Expand Down
115 changes: 75 additions & 40 deletions tcolour/tcolour.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand All @@ -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"""
Expand Down
4 changes: 4 additions & 0 deletions tests/context.py
Original file line number Diff line number Diff line change
@@ -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
4 changes: 2 additions & 2 deletions tests/files/tcolor_test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
8 changes: 4 additions & 4 deletions tests/test_Colourimetry.py
Original file line number Diff line number Diff line change
@@ -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())

Expand All @@ -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())

0 comments on commit 37371f5

Please sign in to comment.