forked from RomanHargrave/displaycal
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathccmx.py
109 lines (99 loc) · 3.17 KB
/
ccmx.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# -*- coding: utf-8 -*-
from __future__ import with_statement # Python 2.5
import codecs
import json
import os
import sys
import time
CCMX_TEMPLATE = '''CCMX
DESCRIPTOR "%(Name)s"
KEYWORD "INSTRUMENT"
INSTRUMENT "%(Device)s"
KEYWORD "DISPLAY"
DISPLAY "%(Display)s"
KEYWORD "DISPLAY_TYPE_BASE_ID"
DISPLAY_TYPE_BASE_ID "1"
KEYWORD "REFERENCE"
REFERENCE "%(ReferenceDevice)s"
ORIGINATOR "%(Originator)s"
CREATED "%(DateTime)s"
KEYWORD "COLOR_REP"
COLOR_REP "XYZ"
NUMBER_OF_FIELDS 3
BEGIN_DATA_FORMAT
XYZ_X XYZ_Y XYZ_Z
END_DATA_FORMAT
NUMBER_OF_SETS 3
BEGIN_DATA
%(MatrixXYZ)s
END_DATA
'''
def convert_devicecorrections_to_ccmx(path, target_dir):
""" Convert iColorDisplay DeviceCorrections.txt to individual Argyll CCMX files """
with codecs.open(path, 'r', 'utf8') as devcorrections_file:
lines = devcorrections_file.read().strip().splitlines()
# Convert to JSON
# The DeviceCorrections.txt format is as follows, so a conversion is pretty
# straightforward:
# "Description here, e.g. Instrument X for Monitor Y" =
# {
# Name = "Description here, e.g. Instrument X for Monitor Y"
# Device = "Instrument X"
# Display = "Monitor Y"
# ReferenceDevice = "eye-one Pro Rev.D"
# MatrixXYZ = "3 3 1482250784 1.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0 "
# }
# "Description here, e.g. Instrument X for Monitor Y" =
# {
# Name = "Description here, e.g. Instrument X for Monitor Y"
# Device = "Instrument X"
# Display = "Monitor Y"
# ReferenceDevice = "eye-one Pro Rev.D"
# MatrixXYZ = "3 3 1482250784 1.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0 "
# }
# ...etc.
# NOTE: The first three numbers in MatrixXYZ are irrelevant for our purposes.
for i, line in enumerate(lines):
parts = line.strip().split('=')
if len(parts) == 2:
for j, part in enumerate(parts):
part = part.strip()
if part and not part.startswith('"') and not part.endswith('"'):
parts[j] = '"%s"' % part
if parts[-1].strip() not in('', '{') and i < len(lines) - 1:
parts[-1] += ','
lines[i] = ':'.join(parts)
devcorrections_data = '{%s}' % ''.join(lines).replace(',}', '}')
# Parse JSON
devcorrections = json.loads(devcorrections_data)
# Convert to ccmx
imported = 0
skipped = 0
for name, devcorrection in devcorrections.iteritems():
values = {'DateTime': time.strftime('%a %b %d %H:%M:%S %Y'),
'Originator': "Quato iColorDisplay",
'Name': "%s & %s" % (devcorrection.get("Device"),
devcorrection.get("Display"))}
for key in ('Device', 'Display', 'ReferenceDevice', 'MatrixXYZ'):
value = devcorrection.get(key)
if value is None:
break
if key == 'MatrixXYZ':
# The first three numbers in the matrix are irrelevant for our
# purposes (see format example above).
matrix = value.split()[3:]
value = '\n'.join([' '.join(part) for part in (matrix[0:3],
matrix[3:6],
matrix[6:9])])
values[key] = value
if value is None:
skipped += 1
continue
imported += 1
with codecs.open(os.path.join(target_dir, name + '.ccmx'), 'w',
'utf8') as ccmx:
ccmx.write(CCMX_TEMPLATE % values)
return imported, skipped
if __name__ == '__main__':
convert_devicecorrections_to_ccmx(sys.argv[1],
os.path.dirname(sys.argv[1]))