class FormatException(Exception):
    pass

def pil_dimensions(im):
    from PIL import Image

    i = Image.open(im.asPath())
    return i.size

def rsvg_dimensions(im):
    import rsvg, glib

    try:
        handle = rsvg.Handle(im.asPath())
        # 1pt = 1.25px
        return handle.props.width*1.25, handle.props.height*1.25
    except glib.GError, e:
        raise FormatException(e)

def get_dimensions(im):
    """Returns a tuple (width, height) for the image in the given Intermed."""
    assert im.getExtension() in MEASURABLE_FORMATS, ("Unknown format: "
                                                     + im.getExtension())
    return MEASURABLE_FORMATS[im.getExtension()](im)

def get_measurable_format(format):
    if format in MEASURABLE_FORMATS:
        return format
    elif format in VECTOR_FORMATS:
        return '.svg'
    else:
        return '.png'

PIL_WRITABLE_FORMATS = ('.png', '.jpg', '.gif', '.tiff', '.bmp',
                        '.ppm', '.xbm')
PIL_READ_ONLY_FORMATS = ('.xpm', '.ico')
PIL_RASTER_FORMATS = PIL_WRITABLE_FORMATS + PIL_READ_ONLY_FORMATS

PSTOEDIT_READABLE_FORMATS = ('.eps', '.epdf')

RASTER_FORMATS = PIL_RASTER_FORMATS
VECTOR_FORMATS = PSTOEDIT_READABLE_FORMATS

MEASURABLE_FORMATS = {'.svg': rsvg_dimensions}
for f in PIL_RASTER_FORMATS:
    MEASURABLE_FORMATS[f] = pil_dimensions
