| 
									
										
										
										
											1993-02-25 14:20:13 +00:00
										 |  |  | # Class to grab frames from a window. | 
					
						
							|  |  |  | # (This has fewer user-settable parameters than Displayer.) | 
					
						
							|  |  |  | # It is the caller's responsibility to initialize the window and to | 
					
						
							|  |  |  | # ensure that it is current when using grabframe() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import gl, GL | 
					
						
							|  |  |  | import VFile | 
					
						
							|  |  |  | import GET | 
					
						
							|  |  |  | from VFile import Error | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class VGrabber(VFile.VideoParams): | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1993-12-17 15:11:41 +00:00
										 |  |  | 	# XXX The constructor of VideoParams is just fine, for now | 
					
						
							| 
									
										
										
										
											1993-02-25 14:20:13 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	# Grab a frame. | 
					
						
							|  |  |  | 	# Return (data, chromdata) just like getnextframe(). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	def grabframe(self): | 
					
						
							|  |  |  | 		grabber = choose_grabber(self.format) | 
					
						
							|  |  |  | 		return grabber(self.width, self.height, self.packfactor) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Choose one of the grabber functions below based upon a color system name | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def choose_grabber(format): | 
					
						
							|  |  |  | 	try: | 
					
						
							|  |  |  | 		return eval('grab_' + format) | 
					
						
							|  |  |  | 	except: | 
					
						
							|  |  |  | 		raise Error, 'Unknown color system: ' + `format` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Routines to grab data, per color system (only a few really supported). | 
					
						
							|  |  |  | # (These functions are used via eval with a constructed argument!) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def grab_rgb(w, h, pf): | 
					
						
							|  |  |  | 	if gl.getdisplaymode() <> GET.DMRGB: | 
					
						
							|  |  |  | 		raise Error, 'Sorry, can only grab rgb in single-buf rgbmode' | 
					
						
							|  |  |  | 	if pf <> (1, 1): | 
					
						
							|  |  |  | 		raise Error, 'Sorry, only grab rgb with packfactor (1,1)' | 
					
						
							|  |  |  | 	return gl.lrectread(0, 0, w-1, h-1), None | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def grab_rgb8(w, h, pf): | 
					
						
							|  |  |  | 	if gl.getdisplaymode() <> GET.DMRGB: | 
					
						
							|  |  |  | 		raise Error, 'Sorry, can only grab rgb8 in single-buf rgbmode' | 
					
						
							|  |  |  | 	if pf <> (1, 1): | 
					
						
							|  |  |  | 		raise Error, 'Sorry, can only grab rgb8 with packfactor (1,1)' | 
					
						
							|  |  |  | 	if not VFile.is_entry_indigo(): | 
					
						
							|  |  |  | 		raise Error, 'Sorry, can only grab rgb8 on entry level Indigo' | 
					
						
							|  |  |  | 	# XXX Dirty Dirty here. | 
					
						
							|  |  |  | 	# XXX Set buffer to cmap mode, grab image and set it back. | 
					
						
							|  |  |  | 	gl.cmode() | 
					
						
							|  |  |  | 	gl.gconfig() | 
					
						
							|  |  |  | 	gl.pixmode(GL.PM_SIZE, 8) | 
					
						
							|  |  |  | 	data = gl.lrectread(0, 0, w-1, h-1) | 
					
						
							|  |  |  | 	data = data[:w*h]	# BUG FIX for python lrectread | 
					
						
							|  |  |  | 	gl.RGBmode() | 
					
						
							|  |  |  | 	gl.gconfig() | 
					
						
							|  |  |  | 	gl.pixmode(GL.PM_SIZE, 32) | 
					
						
							|  |  |  | 	return data, None | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def grab_grey(w, h, pf): | 
					
						
							|  |  |  | 	raise Error, 'Sorry, grabbing grey not implemented' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def grab_yiq(w, h, pf): | 
					
						
							|  |  |  | 	raise Error, 'Sorry, grabbing yiq not implemented' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def grab_hls(w, h, pf): | 
					
						
							|  |  |  | 	raise Error, 'Sorry, grabbing hls not implemented' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def grab_hsv(w, h, pf): | 
					
						
							|  |  |  | 	raise Error, 'Sorry, grabbing hsv not implemented' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def grab_jpeg(w, h, pf): | 
					
						
							| 
									
										
										
										
											1993-06-08 12:47:20 +00:00
										 |  |  | 	data, dummy = grab_rgb(w, h, pf) | 
					
						
							|  |  |  | 	import jpeg | 
					
						
							|  |  |  | 	data = jpeg.compress(data, w, h, 4) | 
					
						
							|  |  |  | 	return data, None | 
					
						
							| 
									
										
										
										
											1993-02-25 14:20:13 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def grab_jpeggrey(w, h, pf): | 
					
						
							|  |  |  | 	raise Error, 'sorry, grabbing jpeggrey not implemented' |