summaryrefslogtreecommitdiffstats
path: root/Demo/sgi
diff options
context:
space:
mode:
Diffstat (limited to 'Demo/sgi')
-rwxr-xr-xDemo/sgi/video/imgconv.py84
1 files changed, 81 insertions, 3 deletions
diff --git a/Demo/sgi/video/imgconv.py b/Demo/sgi/video/imgconv.py
index a3a5d19..3990ae1 100755
--- a/Demo/sgi/video/imgconv.py
+++ b/Demo/sgi/video/imgconv.py
@@ -18,8 +18,14 @@ converters = [ \
('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) \
]
+built = {}
+
def addconverter(fcs, tcs, lossy, func):
for i in range(len(converters)):
ifcs, itcs, irtn, ilossy = converters[i]
@@ -29,10 +35,82 @@ def addconverter(fcs, tcs, lossy, func):
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
- raise error, 'Sorry, that conversion is not implemented'
-
+ #
+ # 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().init(list)
+ args.append(cl.convert)
+ return args
+
+class RtConverters():
+ def init(self, list):
+ self.list = list
+ return self
+
+ def convert(self, img, w, h):
+ for cv in self.list:
+ img = cv(img, w, h)
+ return img