def static_full_sizes(width, height, tilesize):
    """Generator for scaled-down full image sizes.

    Positional arguments:
    width -- width of full size image
    height -- height of full size image
    tilesize -- width and height of tiles

    Yields [sw,sh], the size for each full-region tile that is less than
    the tilesize. This includes tiles up to the full image size if that
    is smaller than the tilesize.
    """
    # FIXME - Not sure what correct algorithm is for this, from
    # observation of Openseadragon it seems that one keeps halving
    # the pixel size of the full image until until both width and
    # height are less than the tile size. After that all subsequent
    # halving of the image size are used, all the way down to 1,1.
    # It seems that without these reduced size full-region images,
    # OpenSeadragon will not display any unzoomed image in small windows.
    #
    # I do not understand the algorithm that OpenSeadragon uses (or
    # know where it is in the code) to decide how small a version of
    # the complete image to request. It seems that there is a bug in
    # OpenSeadragon here because in some cases it requests images
    # of size 1,1 multiple times, which is anyway a useless image.
    for level in range(0, 20):
        factor = 2.0**level
        sw = int(width / factor + 0.5)
        sh = int(height / factor + 0.5)
        if (sw < tilesize and sh < tilesize):
            if (sw < 1 or sh < 1):
                break
            yield([sw, sh])
Generator for scaled-down full image sizes.

    Positional arguments:
    width -- width of full size image
    height -- height of full size image
    tilesize -- width and height of tiles

    Yields [sw,sh], the size for each full-region tile that is less than
    the tilesize. This includes tiles up to the full image size if that
    is smaller than the tilesize.