summaryrefslogtreecommitdiffstats
path: root/Demo/sgi/video/imgconv.py
blob: 8fc98b4abba182e7e4c2f50e8bd7f231fffe14a9 (plain)
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
import imageop

error = 'imgconv.error'

LOSSY = 1
NOT_LOSSY = 0

def null(img, x, y):
	return img
	
def mono2grey(img, x, y):
	return imageop.mono2grey(img, x, y, 0, 255)

def grey2jpeggrey(img, x, y):
	import jpeg
	return jpeg.compress(img, x, y, 1)

def rgb2jpeg(img, x, y):
	import jpeg
	return jpeg.compress(img, x, y, 4)

def jpeggrey2grey(img, width, height):
	import jpeg
	data, width, height, bytesperpixel = jpeg.decompress(img)
	if bytesperpixel <> 1: raise RuntimeError, 'not greyscale jpeg'
	return data

def jpeg2rgb(img, width, height):
	import jpeg
	data, width, height, bytesperpixel = jpeg.decompress(img)
	if bytesperpixel <> 4: raise RuntimeError, 'not rgb jpeg'
	return data

converters = [ \
	  ('grey',  'grey4', imageop.grey2grey4,   LOSSY), \
	  ('grey',  'grey2', imageop.dither2grey2, LOSSY), \
	  ('grey',  'mono',  imageop.dither2mono,  LOSSY), \
	  ('mono',  'grey',  mono2grey,            NOT_LOSSY), \
	  ('grey2', 'grey',  imageop.grey22grey,   NOT_LOSSY), \
	  ('grey4', 'grey',  imageop.grey42grey,   NOT_LOSSY), \
	  ('rgb',   'rgb8',  imageop.rgb2rgb8,     LOSSY), \
	  ('rgb8',  'rgb',   imageop.rgb82rgb,     NOT_LOSSY), \
	  ('rgb',   'grey',  imageop.rgb2grey,     LOSSY), \
	  ('grey',  'rgb',   imageop.grey2rgb,     NOT_LOSSY), \
	  ('jpeggrey','grey',jpeggrey2grey,        NOT_LOSSY), \
	  ('grey',  'jpeggrey',grey2jpeggrey,      LOSSY), \
	  ('jpeg',  'rgb',   jpeg2rgb,             NOT_LOSSY), \
	  ('rgb',   'jpeg',  rgb2jpeg,             LOSSY), \
]

built = {}

def addconverter(fcs, tcs, lossy, func):
	for i in range(len(converters)):
		ifcs, itcs, irtn, ilossy = converters[i]
		if (fcs, tcs) == (ifcs, itcs):
			converters[i] = (fcs, tcs, func, lossy)
			return
	converters.append((fcs,tcs,lossy,func))

def getconverter(fcs, tcs):
	#
	# If formats are the same return the dummy converter
	#
	if fcs == tcs: return null
	#
	# Otherwise, if we have a converter return that one
	#
	for ifcs, itcs, irtn, ilossy in converters:
		if (fcs, tcs) == (ifcs, itcs):
			return irtn
	#
	# Finally, we try to create a converter
	#
	if not built.has_key(fcs):
		built[fcs] = enumerate_converters(fcs)
	if not built[fcs].has_key(tcs):
		raise error, 'Sorry, conversion from '+fcs+' to '+tcs+ \
			  ' is not implemented'
	if len(built[fcs][tcs]) == 3:
		#
		# Converter not instantiated yet
		#
		built[fcs][tcs].append(instantiate_converter(built[fcs][tcs]))
	cf = built[fcs][tcs][3]
	return cf

def enumerate_converters(fcs):
	cvs = {}
	formats = [fcs]
	steps = 0
	while 1:
		workdone = 0
		for ifcs, itcs, irtn, ilossy in converters:
			if ifcs == fcs:
				template = [ilossy, 1, [irtn]]
			elif cvs.has_key(ifcs):
				template = cvs[ifcs][:]
				template[2] = template[2][:]
				if ilossy:
					template[0] = ilossy
				template[1] = template[1] + 1
				template[2].append(irtn)
			else:
				continue
			if not cvs.has_key(itcs):
				cvs[itcs] = template
				workdone = 1
			else:
				previous = cvs[itcs]
				if template < previous:
					cvs[itcs] = template
					workdone = 1
		if not workdone:
			break
		steps = steps + 1
		if steps > len(converters):
			print '------------------loop in emunerate_converters--------'
			print 'CONVERTERS:'
			print converters
			print 'RESULTS:'
			print cvs
			raise error, 'Internal error - loop'
	return cvs

def instantiate_converter(args):
	list = args[2]
	cl = RtConverters(list)
	args.append(cl.convert)
	return args

class RtConverters:
	def __init__(self, list):
		self.list = list

	def convert(self, img, w, h):
		for cv in self.list:
			img = cv(img, w, h)
		return img