@@ -52,7 +52,138 @@ def conv_rgb8(rgb,d1,d2):
52
52
# xorigin, yorigin
53
53
# fallback
54
54
55
- class VinFile :
55
+
56
+
57
+ # XXX it's a total mess now -- VFile is a new base class
58
+ # XXX to support common functionality (e.g. showframe)
59
+
60
+ class VFile :
61
+
62
+ #
63
+ # getinfo returns all info pertaining to a film. The returned tuple
64
+ # can be passed to VoutFile.setinfo()
65
+ #
66
+ def getinfo (self ):
67
+ return (self .format , self .width , self .height , self .packfactor ,\
68
+ self .c0bits , self .c1bits , self .c2bits , self .offset , \
69
+ self .chrompack )
70
+
71
+ # reopen() raises Error if the header is bad (which can only
72
+ # happen if the file was written to since opened).
73
+
74
+ def reopen (self ):
75
+ self .fp .seek (0 )
76
+ x = self .initfp (self .fp , self .filename )
77
+
78
+ def setconvcolor (self ):
79
+ try :
80
+ self .convcolor = eval ('conv_' + self .format )
81
+ except :
82
+ raise Error , \
83
+ self .filename + ': unknown colorsys ' + self .format
84
+
85
+ def showframe (self , data , chromdata ):
86
+ w , h , pf = self .width , self .height , self .packfactor
87
+ if not self .colormapinited :
88
+ self .initcolormap ()
89
+ factor = self .magnify
90
+ if pf : factor = factor * pf
91
+ if chromdata and not self .skipchrom :
92
+ cp = self .chrompack
93
+ cw = (w + cp - 1 )/ cp
94
+ ch = (h + cp - 1 )/ cp
95
+ gl .rectzoom (factor * cp , factor * cp )
96
+ gl .pixmode (GL .PM_SIZE , 16 )
97
+ gl .writemask (self .mask - ((1 << self .c0bits ) - 1 ))
98
+ gl .lrectwrite (self .xorigin , self .yorigin , \
99
+ self .xorigin + cw - 1 , self .yorigin + ch - 1 , \
100
+ chromdata )
101
+ #
102
+ if pf :
103
+ gl .writemask ((1 << self .c0bits ) - 1 )
104
+ gl .pixmode (GL .PM_SIZE , 8 )
105
+ gl .rectzoom (factor , factor )
106
+ w = w / pf
107
+ h = h / pf
108
+ gl .lrectwrite (self .xorigin , self .yorigin , \
109
+ self .xorigin + w - 1 , self .yorigin + h - 1 , data )
110
+
111
+ def initcolormap (self ):
112
+ self .colormapinited = 1
113
+ if self .format == 'rgb' :
114
+ gl .RGBmode ()
115
+ gl .gconfig ()
116
+ gl .RGBcolor (200 , 200 , 200 )
117
+ gl .clear ()
118
+ return
119
+ gl .cmode ()
120
+ gl .gconfig ()
121
+ self .skipchrom = 0
122
+ if not self .quiet :
123
+ sys .stderr .write ('Initializing color map...' )
124
+ self .initcmap ()
125
+ if not self .quiet :
126
+ sys .stderr .write (' Done.\n ' )
127
+ if self .offset == 0 :
128
+ gl .color (0x800 )
129
+ gl .clear ()
130
+ self .mask = 0x7ff
131
+ else :
132
+ self .mask = 0xfff
133
+ gl .clear ()
134
+
135
+
136
+ def initcmap (self ):
137
+ maxbits = gl .getgdesc (GL .GD_BITS_NORM_SNG_CMODE )
138
+ if maxbits > 11 :
139
+ maxbits = 11
140
+ c0bits , c1bits , c2bits = self .c0bits , self .c1bits , self .c2bits
141
+ if c0bits + c1bits + c2bits > maxbits :
142
+ if self .fallback and c0bits < maxbits :
143
+ # Cannot display film in this mode, use mono
144
+ self .skipchrom = 1
145
+ c1bits = c2bits = 0
146
+ self .convcolor = conv_grey
147
+ else :
148
+ raise Error , 'Sorry, ' + `maxbits` + \
149
+ ' bits max on this machine'
150
+ maxc0 = 1 << c0bits
151
+ maxc1 = 1 << c1bits
152
+ maxc2 = 1 << c2bits
153
+ if self .offset == 0 and maxbits == 11 :
154
+ offset = 2048
155
+ else :
156
+ offset = self .offset
157
+ if maxbits <> 11 :
158
+ offset = offset & ((1 << maxbits )- 1 )
159
+ #for i in range(512, MAXMAP):
160
+ # gl.mapcolor(i, 0, 0, 0)
161
+ #void = gl.qtest() # Should be gl.gflush()
162
+ for c0 in range (maxc0 ):
163
+ c0v = c0 / float (maxc0 - 1 )
164
+ for c1 in range (maxc1 ):
165
+ if maxc1 == 1 :
166
+ c1v = 0
167
+ else :
168
+ c1v = c1 / float (maxc1 - 1 )
169
+ for c2 in range (maxc2 ):
170
+ if maxc2 == 1 :
171
+ c2v = 0
172
+ else :
173
+ c2v = c2 / float (maxc2 - 1 )
174
+ index = offset + c0 + (c1 << c0bits ) + \
175
+ (c2 << (c0bits + c1bits ))
176
+ rv , gv , bv = self .convcolor ( \
177
+ c0v , c1v , c2v )
178
+ r , g , b = int (rv * 255.0 ), \
179
+ int (gv * 255.0 ), int (bv * 255.0 )
180
+ if index < MAXMAP :
181
+ gl .mapcolor (index , r , g , b )
182
+ void = gl .gflush ()
183
+
184
+
185
+
186
+ class VinFile (VFile ):
56
187
57
188
# init() and initfp() raise Error if the header is bad.
58
189
# init() raises whatever open() raises if the file can't be opened.
@@ -122,11 +253,7 @@ def initfp(self, fp, filename):
122
253
raise Error , \
123
254
self .filename + ': bad 3.0 color info'
124
255
125
- try :
126
- self .convcolor = eval ('conv_' + self .format )
127
- except :
128
- raise Error , \
129
- self .filename + ': unknown colorsys ' + self .format
256
+ self .setconvcolor ()
130
257
#
131
258
line = self .fp .readline ()
132
259
try :
@@ -162,23 +289,6 @@ def close(self):
162
289
self .fp .close ()
163
290
self .fp = None
164
291
165
-
166
- #
167
- # getinfo returns all info pertaining to a film. The returned tuple
168
- # can be passed to VoutFile.setinfo()
169
- #
170
- def getinfo (self ):
171
- return (self .format , self .width , self .height , self .packfactor ,\
172
- self .c0bits , self .c1bits , self .c2bits , self .offset , \
173
- self .chrompack )
174
-
175
- # reopen() raises Error if the header is bad (which can only
176
- # happen if the file was written to since opened).
177
-
178
- def reopen (self ):
179
- self .fp .seek (0 )
180
- x = self .initfp (self .fp , self .filename )
181
-
182
292
def rewind (self ):
183
293
if self .hascache :
184
294
self .frameno = 0
@@ -270,105 +380,6 @@ def shownextframe(self):
270
380
self .showframe (data , chromdata )
271
381
return time
272
382
273
- def showframe (self , data , chromdata ):
274
- w , h , pf = self .width , self .height , self .packfactor
275
- if not self .colormapinited :
276
- self .initcolormap ()
277
- factor = self .magnify
278
- if pf : factor = factor * pf
279
- if chromdata and not self .skipchrom :
280
- cp = self .chrompack
281
- cw = (w + cp - 1 )/ cp
282
- ch = (h + cp - 1 )/ cp
283
- gl .rectzoom (factor * cp , factor * cp )
284
- gl .pixmode (GL .PM_SIZE , 16 )
285
- gl .writemask (self .mask - ((1 << self .c0bits ) - 1 ))
286
- gl .lrectwrite (self .xorigin , self .yorigin , \
287
- self .xorigin + cw - 1 , self .yorigin + ch - 1 , \
288
- chromdata )
289
- #
290
- if pf :
291
- gl .writemask ((1 << self .c0bits ) - 1 )
292
- gl .pixmode (GL .PM_SIZE , 8 )
293
- gl .rectzoom (factor , factor )
294
- w = w / pf
295
- h = h / pf
296
- gl .lrectwrite (self .xorigin , self .yorigin , \
297
- self .xorigin + w - 1 , self .yorigin + h - 1 , data )
298
-
299
- def initcolormap (self ):
300
- self .colormapinited = 1
301
- if self .format == 'rgb' :
302
- gl .RGBmode ()
303
- gl .gconfig ()
304
- gl .RGBcolor (200 , 200 , 200 )
305
- gl .clear ()
306
- return
307
- gl .cmode ()
308
- gl .gconfig ()
309
- self .skipchrom = 0
310
- if not self .quiet :
311
- sys .stderr .write ('Initializing color map...' )
312
- self .initcmap ()
313
- if not self .quiet :
314
- sys .stderr .write (' Done.\n ' )
315
- if self .offset == 0 :
316
- gl .color (0x800 )
317
- gl .clear ()
318
- self .mask = 0x7ff
319
- else :
320
- self .mask = 0xfff
321
- gl .clear ()
322
-
323
-
324
- def initcmap (self ):
325
- maxbits = gl .getgdesc (GL .GD_BITS_NORM_SNG_CMODE )
326
- if maxbits > 11 :
327
- maxbits = 11
328
- c0bits , c1bits , c2bits = self .c0bits , self .c1bits , self .c2bits
329
- if c0bits + c1bits + c2bits > maxbits :
330
- if self .fallback and c0bits < maxbits :
331
- # Cannot display film in this mode, use mono
332
- self .skipchrom = 1
333
- c1bits = c2bits = 0
334
- self .convcolor = conv_grey
335
- else :
336
- raise Error , 'Sorry, ' + `maxbits` + \
337
- ' bits max on this machine'
338
- maxc0 = 1 << c0bits
339
- maxc1 = 1 << c1bits
340
- maxc2 = 1 << c2bits
341
- if self .offset == 0 and maxbits == 11 :
342
- offset = 2048
343
- else :
344
- offset = self .offset
345
- if maxbits <> 11 :
346
- offset = offset & ((1 << maxbits )- 1 )
347
- #for i in range(512, MAXMAP):
348
- # gl.mapcolor(i, 0, 0, 0)
349
- #void = gl.qtest() # Should be gl.gflush()
350
- for c0 in range (maxc0 ):
351
- c0v = c0 / float (maxc0 - 1 )
352
- for c1 in range (maxc1 ):
353
- if maxc1 == 1 :
354
- c1v = 0
355
- else :
356
- c1v = c1 / float (maxc1 - 1 )
357
- for c2 in range (maxc2 ):
358
- if maxc2 == 1 :
359
- c2v = 0
360
- else :
361
- c2v = c2 / float (maxc2 - 1 )
362
- index = offset + c0 + (c1 << c0bits ) + \
363
- (c2 << (c0bits + c1bits ))
364
- rv , gv , bv = self .convcolor ( \
365
- c0v , c1v , c2v )
366
- r , g , b = int (rv * 255.0 ), \
367
- int (gv * 255.0 ), int (bv * 255.0 )
368
- if index < MAXMAP :
369
- gl .mapcolor (index , r , g , b )
370
- void = gl .gflush ()
371
-
372
383
#
373
384
# A set of routines to grab images from windows
374
385
#
@@ -417,7 +428,7 @@ def grab_hsv(w, h, pf):
417
428
# Notably it will accept almost any garbage and write it to the video
418
429
# output file
419
430
#
420
- class VoutFile :
431
+ class VoutFile ( VFile ) :
421
432
def init (self , filename ):
422
433
if filename == '-' :
423
434
return self .initfp (sys .stdout , filename )
@@ -434,21 +445,21 @@ def initfp(self, fp, filename):
434
445
self .offset = 0
435
446
self .chrompack = 0
436
447
self .headerwritten = 0
448
+ self .quiet = 0
449
+ self .magnify = 1
450
+ self .setconvcolor ()
451
+ self .xorigin = self .yorigin = 0
437
452
return self
438
453
439
454
def close (self ):
440
455
self .fp .close ()
441
456
x = self .initfp (None , None )
442
457
443
- def getinfo (self ):
444
- return (self .format , self .width , self .height , self .packfactor ,\
445
- self .c0bits , self .c1bits , self .c2bits , self .offset , \
446
- self .chrompack )
447
-
448
458
def setinfo (self , values ):
449
459
self .format , self .width , self .height , self .packfactor ,\
450
460
self .c0bits , self .c1bits , self .c2bits , self .offset , \
451
461
self .chrompack = values
462
+ self .setconvcolor ()
452
463
453
464
def writeheader (self ):
454
465
self .headerwritten = 1
0 commit comments