init python:
    whitespace_dict = {}
    with renpy.file("images.whitespace") as fp:
        line = fp.readline()
        while line:
            path, area = line.strip("\r\n").split(':')
            whitespace_dict[path] = map(int, area.split(','))
            line = fp.readline()

    def crop_whitespace(path):
        # Return box from whitespace_dict, or calculate and store it
        if path in whitespace_dict:
            box = whitespace_dict[path]
        else:
            surf = Image(path).load()
            box = tuple(surf.get_bounding_rect())
            whitespace_dict[path] = box
        return box

    def crop_image_zoom(path, xsize, ysize, grayscale=False):
        x, y, w, h = crop_whitespace(path)
        matrix = SaturationMatrix(0) if grayscale else None
        sprite = Image(path)

        return Transform(sprite, crop=(x, y, w, h), xsize=xsize, ysize=ysize, fit="contain", matrixcolor=matrix, subpixel=True)

    def get_zoom(image, size):
        if isinstance(image, basestring):
            image = Image(image)

        r = renpy.render(image, 800, 800, 0, 0)
        x, y = r.get_size()
        xsize, ysize = size

        return min(ysize / y, xsize / x)