Home | History | Annotate | Download | only in plat-irix5
      1 # Implement 'jpeg' interface using SGI's compression library
      2 
      3 # XXX Options 'smooth' and 'optimize' are ignored.
      4 
      5 # XXX It appears that compressing grayscale images doesn't work right;
      6 # XXX the resulting file causes weirdness.
      7 from warnings import warnpy3k
      8 warnpy3k("the jpeg module has been removed in Python 3.0", stacklevel=2)
      9 del warnpy3k
     10 
     11 class error(Exception):
     12     pass
     13 
     14 options = {'quality': 75, 'optimize': 0, 'smooth': 0, 'forcegray': 0}
     15 
     16 comp = None
     17 decomp = None
     18 
     19 def compress(imgdata, width, height, bytesperpixel):
     20     global comp
     21     import cl
     22     if comp is None: comp = cl.OpenCompressor(cl.JPEG)
     23     if bytesperpixel == 1:
     24         format = cl.GRAYSCALE
     25     elif bytesperpixel == 4:
     26         format = cl.RGBX
     27     if options['forcegray']:
     28         iformat = cl.GRAYSCALE
     29     else:
     30         iformat = cl.YUV
     31     # XXX How to support 'optimize'?
     32     params = [cl.IMAGE_WIDTH, width, cl.IMAGE_HEIGHT, height, \
     33               cl.ORIGINAL_FORMAT, format, \
     34               cl.ORIENTATION, cl.BOTTOM_UP, \
     35               cl.QUALITY_FACTOR, options['quality'], \
     36               cl.INTERNAL_FORMAT, iformat, \
     37              ]
     38     comp.SetParams(params)
     39     jpegdata = comp.Compress(1, imgdata)
     40     return jpegdata
     41 
     42 def decompress(jpegdata):
     43     global decomp
     44     import cl
     45     if decomp is None: decomp = cl.OpenDecompressor(cl.JPEG)
     46     headersize = decomp.ReadHeader(jpegdata)
     47     params = [cl.IMAGE_WIDTH, 0, cl.IMAGE_HEIGHT, 0, cl.INTERNAL_FORMAT, 0]
     48     decomp.GetParams(params)
     49     width, height, format = params[1], params[3], params[5]
     50     if format == cl.GRAYSCALE or options['forcegray']:
     51         format = cl.GRAYSCALE
     52         bytesperpixel = 1
     53     else:
     54         format = cl.RGBX
     55         bytesperpixel = 4
     56     # XXX How to support 'smooth'?
     57     params = [cl.ORIGINAL_FORMAT, format, \
     58               cl.ORIENTATION, cl.BOTTOM_UP, \
     59               cl.FRAME_BUFFER_SIZE, width*height*bytesperpixel]
     60     decomp.SetParams(params)
     61     imgdata = decomp.Decompress(1, jpegdata)
     62     return imgdata, width, height, bytesperpixel
     63 
     64 def setoption(name, value):
     65     if type(value) is not type(0):
     66         raise TypeError, 'jpeg.setoption: numeric options only'
     67     if name == 'forcegrey':
     68         name = 'forcegray'
     69     if not options.has_key(name):
     70         raise KeyError, 'jpeg.setoption: unknown option name'
     71     options[name] = int(value)
     72 
     73 def test():
     74     import sys
     75     if sys.argv[1:2] == ['-g']:
     76         del sys.argv[1]
     77         setoption('forcegray', 1)
     78     if not sys.argv[1:]:
     79         sys.argv.append('/usr/local/images/data/jpg/asterix.jpg')
     80     for file in sys.argv[1:]:
     81         show(file)
     82 
     83 def show(file):
     84     import gl, GL, DEVICE
     85     jpegdata = open(file, 'r').read()
     86     imgdata, width, height, bytesperpixel = decompress(jpegdata)
     87     gl.foreground()
     88     gl.prefsize(width, height)
     89     win = gl.winopen(file)
     90     if bytesperpixel == 1:
     91         gl.cmode()
     92         gl.pixmode(GL.PM_SIZE, 8)
     93         gl.gconfig()
     94         for i in range(256):
     95             gl.mapcolor(i, i, i, i)
     96     else:
     97         gl.RGBmode()
     98         gl.pixmode(GL.PM_SIZE, 32)
     99         gl.gconfig()
    100     gl.qdevice(DEVICE.REDRAW)
    101     gl.qdevice(DEVICE.ESCKEY)
    102     gl.qdevice(DEVICE.WINQUIT)
    103     gl.qdevice(DEVICE.WINSHUT)
    104     gl.lrectwrite(0, 0, width-1, height-1, imgdata)
    105     while 1:
    106         dev, val = gl.qread()
    107         if dev in (DEVICE.ESCKEY, DEVICE.WINSHUT, DEVICE.WINQUIT):
    108             break
    109         if dev == DEVICE.REDRAW:
    110             gl.lrectwrite(0, 0, width-1, height-1, imgdata)
    111     gl.winclose(win)
    112     # Now test the compression and write the result to a fixed filename
    113     newjpegdata = compress(imgdata, width, height, bytesperpixel)
    114     open('/tmp/j.jpg', 'w').write(newjpegdata)
    115