symbian-qemu-0.9.1-12/python-2.6.1/Lib/plat-irix6/jpeg.py
author johnathan.white@2718R8BGH51.accenture.com
Mon, 08 Mar 2010 18:45:03 +0000
changeset 46 b6935a90ca64
parent 1 2fb8b9db1c86
permissions -rw-r--r--
Modify framebuffer and NGA framebuffer to read screen size from board model dtb file. Optimise memory usuage of frame buffer Add example minigui application with hooks to profiler (which writes results to S:\). Modified NGA framebuffer to run its own dfc queue at high priority

# 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)