| 
									
										
										
										
											1993-12-29 16:35:41 +00:00
										 |  |  | # Implement 'jpeg' interface using SGI's compression library | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # XXX Options 'smooth' and 'optimize' are ignored. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # XXX It appears that compressing grayscale images doesn't work right; | 
					
						
							|  |  |  | # XXX the resulting file causes weirdness. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-08-18 14:59:33 +00:00
										 |  |  | class error(Exception): | 
					
						
							|  |  |  | 	pass | 
					
						
							| 
									
										
										
										
											1993-12-29 16:35:41 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | options = {'quality': 75, 'optimize': 0, 'smooth': 0, 'forcegray': 0} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | comp = None | 
					
						
							|  |  |  | decomp = None | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def compress(imgdata, width, height, bytesperpixel): | 
					
						
							|  |  |  | 	global comp | 
					
						
							| 
									
										
										
										
											1998-08-07 15:28:23 +00:00
										 |  |  | 	import cl | 
					
						
							|  |  |  | 	if comp is None: comp = cl.OpenCompressor(cl.JPEG) | 
					
						
							| 
									
										
										
										
											1993-12-29 16:35:41 +00:00
										 |  |  | 	if bytesperpixel == 1: | 
					
						
							| 
									
										
										
										
											1998-08-07 15:28:23 +00:00
										 |  |  | 		format = cl.GRAYSCALE | 
					
						
							| 
									
										
										
										
											1993-12-29 16:35:41 +00:00
										 |  |  | 	elif bytesperpixel == 4: | 
					
						
							| 
									
										
										
										
											1998-08-07 15:28:23 +00:00
										 |  |  | 		format = cl.RGBX | 
					
						
							| 
									
										
										
										
											1993-12-29 16:35:41 +00:00
										 |  |  | 	if options['forcegray']: | 
					
						
							| 
									
										
										
										
											1998-08-07 15:28:23 +00:00
										 |  |  | 		iformat = cl.GRAYSCALE | 
					
						
							| 
									
										
										
										
											1993-12-29 16:35:41 +00:00
										 |  |  | 	else: | 
					
						
							| 
									
										
										
										
											1998-08-07 15:28:23 +00:00
										 |  |  | 		iformat = cl.YUV | 
					
						
							| 
									
										
										
										
											1993-12-29 16:35:41 +00:00
										 |  |  | 	# XXX How to support 'optimize'? | 
					
						
							| 
									
										
										
										
											1998-08-07 15:28:23 +00:00
										 |  |  | 	params = [cl.IMAGE_WIDTH, width, cl.IMAGE_HEIGHT, height, \ | 
					
						
							|  |  |  | 		  cl.ORIGINAL_FORMAT, format, \ | 
					
						
							|  |  |  | 		  cl.ORIENTATION, cl.BOTTOM_UP, \ | 
					
						
							|  |  |  | 		  cl.QUALITY_FACTOR, options['quality'], \ | 
					
						
							|  |  |  | 		  cl.INTERNAL_FORMAT, iformat, \ | 
					
						
							| 
									
										
										
										
											1993-12-29 16:35:41 +00:00
										 |  |  | 		 ] | 
					
						
							|  |  |  | 	comp.SetParams(params) | 
					
						
							|  |  |  | 	jpegdata = comp.Compress(1, imgdata) | 
					
						
							|  |  |  | 	return jpegdata | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def decompress(jpegdata): | 
					
						
							|  |  |  | 	global decomp | 
					
						
							| 
									
										
										
										
											1998-08-07 15:28:23 +00:00
										 |  |  | 	import cl | 
					
						
							|  |  |  | 	if decomp is None: decomp = cl.OpenDecompressor(cl.JPEG) | 
					
						
							| 
									
										
										
										
											1993-12-29 16:35:41 +00:00
										 |  |  | 	headersize = decomp.ReadHeader(jpegdata) | 
					
						
							| 
									
										
										
										
											1998-08-07 15:28:23 +00:00
										 |  |  | 	params = [cl.IMAGE_WIDTH, 0, cl.IMAGE_HEIGHT, 0, cl.INTERNAL_FORMAT, 0] | 
					
						
							| 
									
										
										
										
											1993-12-29 16:35:41 +00:00
										 |  |  | 	decomp.GetParams(params) | 
					
						
							|  |  |  | 	width, height, format = params[1], params[3], params[5] | 
					
						
							| 
									
										
										
										
											1998-08-07 15:28:23 +00:00
										 |  |  | 	if format == cl.GRAYSCALE or options['forcegray']: | 
					
						
							|  |  |  | 		format = cl.GRAYSCALE | 
					
						
							| 
									
										
										
										
											1993-12-29 16:35:41 +00:00
										 |  |  | 		bytesperpixel = 1 | 
					
						
							|  |  |  | 	else: | 
					
						
							| 
									
										
										
										
											1998-08-07 15:28:23 +00:00
										 |  |  | 		format = cl.RGBX | 
					
						
							| 
									
										
										
										
											1993-12-29 16:35:41 +00:00
										 |  |  | 		bytesperpixel = 4 | 
					
						
							|  |  |  | 	# XXX How to support 'smooth'? | 
					
						
							| 
									
										
										
										
											1998-08-07 15:28:23 +00:00
										 |  |  | 	params = [cl.ORIGINAL_FORMAT, format, \ | 
					
						
							|  |  |  | 		  cl.ORIENTATION, cl.BOTTOM_UP, \ | 
					
						
							|  |  |  | 		  cl.FRAME_BUFFER_SIZE, width*height*bytesperpixel] | 
					
						
							| 
									
										
										
										
											1993-12-29 16:35:41 +00:00
										 |  |  | 	decomp.SetParams(params) | 
					
						
							|  |  |  | 	imgdata = decomp.Decompress(1, jpegdata) | 
					
						
							|  |  |  | 	return imgdata, width, height, bytesperpixel | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def setoption(name, value): | 
					
						
							| 
									
										
										
										
											2000-12-12 23:11:42 +00:00
										 |  |  | 	if type(value) is not type(0): | 
					
						
							| 
									
										
										
										
											1993-12-29 16:35:41 +00:00
										 |  |  | 		raise TypeError, 'jpeg.setoption: numeric options only' | 
					
						
							|  |  |  | 	if name == 'forcegrey': | 
					
						
							|  |  |  | 		name = 'forcegray' | 
					
						
							|  |  |  | 	if not options.has_key(name): | 
					
						
							|  |  |  | 		raise KeyError, 'jpeg.setoption: unknown option name' | 
					
						
							|  |  |  | 	options[name] = int(value) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test(): | 
					
						
							|  |  |  | 	import sys | 
					
						
							|  |  |  | 	if sys.argv[1:2] == ['-g']: | 
					
						
							|  |  |  | 		del sys.argv[1] | 
					
						
							|  |  |  | 		setoption('forcegray', 1) | 
					
						
							|  |  |  | 	if not sys.argv[1:]: | 
					
						
							|  |  |  | 		sys.argv.append('/usr/local/images/data/jpg/asterix.jpg') | 
					
						
							|  |  |  | 	for file in sys.argv[1:]: | 
					
						
							|  |  |  | 		show(file) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def show(file): | 
					
						
							|  |  |  | 	import gl, GL, DEVICE | 
					
						
							|  |  |  | 	jpegdata = open(file, 'r').read() | 
					
						
							|  |  |  | 	imgdata, width, height, bytesperpixel = decompress(jpegdata) | 
					
						
							|  |  |  | 	gl.foreground() | 
					
						
							|  |  |  | 	gl.prefsize(width, height) | 
					
						
							|  |  |  | 	win = gl.winopen(file) | 
					
						
							|  |  |  | 	if bytesperpixel == 1: | 
					
						
							|  |  |  | 		gl.cmode() | 
					
						
							|  |  |  | 		gl.pixmode(GL.PM_SIZE, 8) | 
					
						
							|  |  |  | 		gl.gconfig() | 
					
						
							|  |  |  | 		for i in range(256): | 
					
						
							|  |  |  | 			gl.mapcolor(i, i, i, i) | 
					
						
							|  |  |  | 	else: | 
					
						
							|  |  |  | 		gl.RGBmode() | 
					
						
							|  |  |  | 		gl.pixmode(GL.PM_SIZE, 32) | 
					
						
							|  |  |  | 		gl.gconfig() | 
					
						
							|  |  |  | 	gl.qdevice(DEVICE.REDRAW) | 
					
						
							|  |  |  | 	gl.qdevice(DEVICE.ESCKEY) | 
					
						
							|  |  |  | 	gl.qdevice(DEVICE.WINQUIT) | 
					
						
							|  |  |  | 	gl.qdevice(DEVICE.WINSHUT) | 
					
						
							|  |  |  | 	gl.lrectwrite(0, 0, width-1, height-1, imgdata) | 
					
						
							|  |  |  | 	while 1: | 
					
						
							|  |  |  | 		dev, val = gl.qread() | 
					
						
							|  |  |  | 		if dev in (DEVICE.ESCKEY, DEVICE.WINSHUT, DEVICE.WINQUIT): | 
					
						
							|  |  |  | 			break | 
					
						
							|  |  |  | 		if dev == DEVICE.REDRAW: | 
					
						
							|  |  |  | 			gl.lrectwrite(0, 0, width-1, height-1, imgdata) | 
					
						
							|  |  |  | 	gl.winclose(win) | 
					
						
							|  |  |  | 	# Now test the compression and write the result to a fixed filename | 
					
						
							|  |  |  | 	newjpegdata = compress(imgdata, width, height, bytesperpixel) | 
					
						
							|  |  |  | 	open('/tmp/j.jpg', 'w').write(newjpegdata) |