symbian-qemu-0.9.1-12/python-2.6.1/Lib/plat-irix6/jpeg.py
author Gareth Stockwell <gareth.stockwell@accenture.com>
Wed, 22 Sep 2010 15:40:40 +0100
branchgraphics-phase-3
changeset 111 345f1c88c950
parent 1 2fb8b9db1c86
permissions -rw-r--r--
Fixes to syborg-graphicswrapper.vcproj These changes allow syborg-graphicswrapper to link against the hostthreadadapter and khronosapiwrapper libraries built by the graphics.simulator component. The .vcproj file uses relative paths, which requires that the following three packages are laid out as follows: os/ graphics adapt/ graphics.simulator qemu

# 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.
from warnings import warnpy3k
warnpy3k("the jpeg module has been removed in Python 3.0", stacklevel=2)
del warnpy3k

class error(Exception):
    pass

options = {'quality': 75, 'optimize': 0, 'smooth': 0, 'forcegray': 0}

comp = None
decomp = None

def compress(imgdata, width, height, bytesperpixel):
    global comp
    import cl
    if comp is None: comp = cl.OpenCompressor(cl.JPEG)
    if bytesperpixel == 1:
        format = cl.GRAYSCALE
    elif bytesperpixel == 4:
        format = cl.RGBX
    if options['forcegray']:
        iformat = cl.GRAYSCALE
    else:
        iformat = cl.YUV
    # XXX How to support 'optimize'?
    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,
             ]
    comp.SetParams(params)
    jpegdata = comp.Compress(1, imgdata)
    return jpegdata

def decompress(jpegdata):
    global decomp
    import cl
    if decomp is None: decomp = cl.OpenDecompressor(cl.JPEG)
    headersize = decomp.ReadHeader(jpegdata)
    params = [cl.IMAGE_WIDTH, 0, cl.IMAGE_HEIGHT, 0, cl.INTERNAL_FORMAT, 0]
    decomp.GetParams(params)
    width, height, format = params[1], params[3], params[5]
    if format == cl.GRAYSCALE or options['forcegray']:
        format = cl.GRAYSCALE
        bytesperpixel = 1
    else:
        format = cl.RGBX
        bytesperpixel = 4
    # XXX How to support 'smooth'?
    params = [cl.ORIGINAL_FORMAT, format,
              cl.ORIENTATION, cl.BOTTOM_UP,
              cl.FRAME_BUFFER_SIZE, width*height*bytesperpixel]
    decomp.SetParams(params)
    imgdata = decomp.Decompress(1, jpegdata)
    return imgdata, width, height, bytesperpixel

def setoption(name, value):
    if type(value) is not type(0):
        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)