This file is indexed.

/usr/lib/python2.7/dist-packages/dispcalGUI/ccmx.py is in dispcalgui 1.7.1.6-1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

 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
# -*- coding: utf-8 -*-

from __future__ import with_statement  # Python 2.5
import codecs
import os
import sys
import time

import demjson


CCMX_TEMPLATE = '''CCMX   

DESCRIPTOR "%(Name)s"
KEYWORD "INSTRUMENT"
INSTRUMENT "%(Device)s"
KEYWORD "DISPLAY"
DISPLAY "%(Display)s"
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 = demjson.decode(devcorrections_data)
	# Convert to ccmx
	for name, devcorrection in devcorrections.iteritems():
		values = {'DateTime': time.strftime('%a %b %d %H:%M:%S %Y'),
				  'Originator': "Quato iColorDisplay"}
		for key in ('Name', 'Device', 'Display', 'ReferenceDevice', 'MatrixXYZ'):
			value = devcorrection[key]
			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
		with codecs.open(os.path.join(target_dir, name + '.ccmx'), 'w', 
						 'utf8') as ccmx:
			ccmx.write(CCMX_TEMPLATE % values)


if __name__ == '__main__':
	convert_devicecorrections_to_ccmx(sys.argv[1], 
									  os.path.dirname(sys.argv[1]))