color_tools.constants

Immutable color science constants from international standards.

These values are defined by CIE (International Commission on Illumination), sRGB specification, and various color difference formulas. They should never be modified as they represent fundamental color science.

class color_tools.constants.ColorConstants[source]

Bases: object

Immutable color science constants from international standards.

These values are defined by CIE (International Commission on Illumination), sRGB specification, and various color difference formulas. They should never be modified as they represent fundamental color science.

D65_WHITE_X = 95.047
D65_WHITE_Y = 100.0
D65_WHITE_Z = 108.883
SRGB_TO_XYZ_R = (0.4124564, 0.3575761, 0.1804375)
SRGB_TO_XYZ_G = (0.2126729, 0.7151522, 0.072175)
SRGB_TO_XYZ_B = (0.0193339, 0.119192, 0.9503041)
XYZ_TO_SRGB_X = (3.2404542, -1.5371385, -0.4985314)
XYZ_TO_SRGB_Y = (-0.969266, 1.8760108, 0.041556)
XYZ_TO_SRGB_Z = (0.0556434, -0.2040259, 1.0572252)
SRGB_GAMMA_THRESHOLD = 0.04045
SRGB_GAMMA_LINEAR_SCALE = 12.92
SRGB_GAMMA_OFFSET = 0.055
SRGB_GAMMA_DIVISOR = 1.055
SRGB_GAMMA_POWER = 2.4
SRGB_INV_GAMMA_THRESHOLD = 0.0031308
LAB_DELTA = 0.20689655172413793
LAB_KAPPA = 116.0
LAB_OFFSET = 16.0
LAB_A_SCALE = 500.0
LAB_B_SCALE = 200.0
DE94_K1 = 0.045
DE94_K2 = 0.015
DE2000_POW7_BASE = 25.0
DE2000_HUE_OFFSET_1 = 30.0
DE2000_HUE_WEIGHT_1 = 0.17
DE2000_HUE_MULT_2 = 2.0
DE2000_HUE_WEIGHT_2 = 0.24
DE2000_HUE_MULT_3 = 3.0
DE2000_HUE_OFFSET_3 = 6.0
DE2000_HUE_WEIGHT_3 = 0.32
DE2000_HUE_MULT_4 = 4.0
DE2000_HUE_OFFSET_4 = 63.0
DE2000_HUE_WEIGHT_4 = 0.2
DE2000_DRO_MULT = 30.0
DE2000_DRO_CENTER = 275.0
DE2000_DRO_DIVISOR = 25.0
DE2000_L_WEIGHT = 0.015
DE2000_L_OFFSET = 50.0
DE2000_L_DIVISOR = 20.0
DE2000_C_WEIGHT = 0.045
DE2000_H_WEIGHT = 0.015
CMC_L_THRESHOLD = 16.0
CMC_L_LOW = 0.511
CMC_L_SCALE = 0.040975
CMC_L_DIVISOR = 0.01765
CMC_C_SCALE = 0.0638
CMC_C_DIVISOR = 0.0131
CMC_C_OFFSET = 0.638
CMC_HUE_MIN = 164.0
CMC_HUE_MAX = 345.0
CMC_T_IN_RANGE = 0.56
CMC_T_COS_MULT_IN = 0.2
CMC_T_HUE_OFFSET_IN = 168.0
CMC_T_OUT_RANGE = 0.36
CMC_T_COS_MULT_OUT = 0.4
CMC_T_HUE_OFFSET_OUT = 35.0
CMC_F_POWER = 4.0
CMC_F_DIVISOR = 1900.0
CMC_L_DEFAULT = 2.0
CMC_C_DEFAULT = 1.0
HUE_CIRCLE_DEGREES = 360.0
HUE_HALF_CIRCLE_DEGREES = 180.0
RGB_MIN = 0
RGB_MAX = 255
NORMALIZED_MIN = 0.0
NORMALIZED_MAX = 1.0
XYZ_SCALE_FACTOR = 100.0
WIN_HSL_MAX = 240.0
AB_MIN = -128.0
AB_MAX = 127.0
CHROMA_MIN = 0.0
CHROMA_MAX = 181.0
COLORS_JSON_FILENAME = 'colors.json'
FILAMENTS_JSON_FILENAME = 'filaments.json'
MAKER_SYNONYMS_JSON_FILENAME = 'maker_synonyms.json'
LAB_DELTA_CUBED = 0.008856451679035631
LAB_F_SCALE = 0.12841854934601665
LAB_F_OFFSET = 0.13793103448275862
classmethod verify_integrity()[source]

Verify that constants haven’t been modified.

Return type:

bool

Returns:

True if all constants match expected values, False if tampered with.

COLORS_JSON_HASH = 'dc8ce5769a2186008af540c03159d3f24a72e5effc9ce5b611c8b4374da19ffd'
FILAMENTS_JSON_HASH = '8e3e178cf824b7e1bcf34b67bfa929e462964334c79069073806a9a959f3536e'
MAKER_SYNONYMS_JSON_HASH = '27488f9dfa37d661a0d5c0f73d1680aea22ab909f1c94fe1dd576b7902245c81'
APPLE2_PALETTE_HASH = 'd5374e50f76312799c031a8f64fe9537cac2d903c59dbc09f0760e8f5bb581fe'
CGA4_PALETTE_HASH = '62624dbeef28b664feca10afe3901b52b2335395134aba88ea21f955f0d17b7d'
CGA16_PALETTE_HASH = 'd189b3004d20a343105d01b03c71d437077e34bb8d25fc074487c35c8490a329'
COMMODORE64_PALETTE_HASH = 'c4502abaed781535de55f3042cca4d7b3653c5eeb4cec3ecb30f591bfbfdfcca'
CRAYOLA_PALETTE_HASH = '65bf4add677a7a8667114b8f813b8afdd6b8e92e8cef1458e53b4a8cd716a4a3'
EGA16_PALETTE_HASH = 'd189b3004d20a343105d01b03c71d437077e34bb8d25fc074487c35c8490a329'
EGA64_PALETTE_HASH = '2159e51f89cca4a4fb43a2d80bea030f3d7cd0cc5e1eacd25eb95f0ce2027e7f'
GAMEBOY_PALETTE_HASH = 'e2911baed15b4d56a27313b6be506c3a1f57bee3b01ecd2ca5995b512822da9b'
GAMEBOY_COLOR_PALETTE_HASH = '5c98dd69be991f445aabafe21a0bdddabc8f6e98aa728724e3d0e72a445aadde'
GAMEBOY_DMG_PALETTE_HASH = '042d7cfd7b94f8719aa01603ddf5b0d9c73ae59b04e27295132ddac13142e968'
GAMEBOY_GBL_PALETTE_HASH = 'f2b6a573b09c1efa3529e79f281dcb0ed4e5c788cb10e51526c60e6e5d928231'
GAMEBOY_MGB_PALETTE_HASH = '7c556e05e13adcfce0e7aec06ded6c7871acee63771e520319afa67e07080027'
MACINTOSH_PALETTE_HASH = 'e9b5bce3ce2eda12dec5793b4eb3c588a92d53e8d6ecaf4fa310998fe2dd1ddd'
NES_PALETTE_HASH = '3021573a00b158fb6cf694e6546b236c2ec6862d52e08cc860f32d983e1f0a59'
SMS_PALETTE_HASH = '95010c348c2f77a209544170da29ee7f5bfccacbcd32ed33c36cb7ef269f72e8'
TANDY16_PALETTE_HASH = '820f2f1dcdd3acd7130a88247b09e6bf969779a08c97091800db19c1748f1a03'
VGA_PALETTE_HASH = '9eb6055508d5523ceafbb4abe3d2921f09bc61b20485da1052e4d4fd653a5d00'
VIRTUALBOY_PALETTE_HASH = '218854f6dc6506649e6ff14f92f56ff996b7c01a36c916b0374880c8524c40a9'
WEB_PALETTE_HASH = 'ba4ad53ece01d2f1338ae13221aa04e5c342519d7750d948458074001a465e7d'
USER_COLORS_JSON_FILENAME = 'user/user-colors.json'
USER_FILAMENTS_JSON_FILENAME = 'user/user-filaments.json'
USER_SYNONYMS_JSON_FILENAME = 'user/user-synonyms.json'
MATRICES_EXPECTED_HASH = 'd177316ade5146a084bb5b92d693c3f9c62ec593fde9b6face567dbd8a633df5'
static verify_data_file(filepath, expected_hash)[source]

Verify integrity of a data file using SHA-256 hash.

Parameters:
  • filepath (Path) – Path to the data file to verify

  • expected_hash (str) – Expected SHA-256 hash of the file contents

Return type:

bool

Returns:

True if file hash matches expected hash, False otherwise

classmethod verify_all_data_files(data_dir=None)[source]

Verify integrity of all core data files.

Parameters:

data_dir (Path | None) – Directory containing data files. If None, uses package data directory.

Return type:

tuple[bool, list[str]]

Returns:

Tuple of (all_valid, list_of_errors) - all_valid: True if all files pass verification - list_of_errors: List of error messages for any failed verifications

classmethod verify_matrices_integrity()[source]

Verify that transformation matrices haven’t been modified.

Return type:

bool

Returns:

True if all matrices match expected values, False if tampered with.

classmethod generate_user_data_hash(file_path)[source]

Generate SHA-256 hash for a user data file.

Parameters:

file_path (Path | str) – Path to user data file

Return type:

str

Returns:

SHA-256 hash of the file contents

Raises:

FileNotFoundError – If file doesn’t exist

classmethod save_user_data_hash(file_path, hash_value=None)[source]

Save SHA-256 hash for a user data file to a .sha256 file.

Parameters:
  • file_path (Path | str) – Path to user data file

  • hash_value (str | None) – Optional pre-computed hash. If None, will compute from file.

Return type:

Path

Returns:

Path to the created .sha256 file

Raises:

FileNotFoundError – If file doesn’t exist

classmethod verify_user_data_file(file_path)[source]

Verify user data file against its .sha256 file if it exists.

Parameters:

file_path (Path | str) – Path to user data file

Return type:

tuple[bool, str | None]

Returns:

Tuple of (is_valid, error_message) - is_valid: True if file is valid or no hash file exists - error_message: None if valid, error description if invalid

classmethod verify_all_user_data(data_dir=None)[source]

Verify integrity of all user data files in the user/ subdirectory.

Only files with corresponding .sha256 files are verified.

Parameters:

data_dir (Path | str | None) – Optional custom data directory. If None, uses package data directory.

Return type:

tuple[bool, list[str]]

Returns:

Tuple of (all_valid, list_of_errors) - all_valid: True if all files with hash files pass verification - list_of_errors: List of error messages for any failed verifications