diff -r 77330e43c855 -r 2a2d2d6f6f80 pngtile/render.py --- a/pngtile/render.py Mon Sep 15 01:23:01 2014 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,245 +0,0 @@ -""" - Rendering output -""" - -import os, os.path - -## Settings -# width of a tile -TILE_WIDTH = 256 -TILE_HEIGHT = 256 - -# max. output resolution to allow -MAX_PIXELS = 1920 * 1200 - -def dir_url (prefix, name, item) : - """ - Join together an absolute URL prefix, an optional directory name, and a directory item - """ - - url = prefix - - if name : - url += '/' + name - - url += '/' + item - - return url - -def dir_list (dir_path) : - """ - Yield a series of directory items to show for the given dir - """ - - # link to parent - yield '..' - - for item in os.listdir(dir_path) : - path = os.path.join(dir_path, item) - - # skip dotfiles - if item.startswith('.') : - continue - - # show dirs - if os.path.isdir(path) : - yield item - - # examine ext - base, ext = os.path.splitext(path) - - # show .png files with a .cache file - if ext == '.png' and os.path.exists(base + '.cache') : - yield item - - -### Render HTML data -def dir_html (prefix, name, path) : - """ - Directory index - """ - - name = name.rstrip('/') - - return """\ - - - Index of %(dir)s - - - -

Index of %(dir)s

- - - -""" % dict( - prefix = prefix, - dir = '/' + name, - - listing = "\n".join( - #
  • link - """
  • %(name)s
  • """ % dict( - # URL to dir - url = dir_url(prefix, name, item), - - # item name - name = item, - ) for item in dir_list(path) - ), - ) - -def img_html (prefix, name, image) : - """ - HTML for image - """ - - # a little slow, but not so bad - two stats(), heh - info = image.info() - img_width, img_height = info['img_width'], info['img_height'] - - return """\ - - - %(title)s - - - - - - - -
    -
    -
    - - - -
    - -
    - -
    - Loading... -
    -
    -
    - - - -""" % dict( - title = name, - prefix = prefix, - tile_url = prefix + '/' + name, - - tile_width = TILE_WIDTH, - tile_height = TILE_HEIGHT, - - img_width = img_width, - img_height = img_height, - ) - - -# threshold to cache images on - only images with a source data region *larger* than this are cached -CACHE_THRESHOLD = 512 * 512 - -def scale_by_zoom (val, zoom) : - """ - Scale dimension by zoom factor - - zl > 0 -> bigger - zl < 0 -> smaller - """ - - if zoom > 0 : - return val << zoom - - elif zoom > 0 : - return val >> -zoom - - else : - return val - -### Image caching -def check_cache_threshold (width, height, zl) : - """ - Checks if a tile with the given dimensions should be cached - """ - - return (scale_by_zoom(width, zl) * scale_by_zoom(height, zl)) > CACHE_THRESHOLD - -def render_raw (image, width, height, x, y, zl) : - """ - Render and return tile - """ - - return image.tile_mem( - width, height, - x, y, zl - ) - -def render_cache (cache, image, width, height, x, y, zl) : - """ - Perform a cached render of the given tile - """ - - if cache : - # cache key - key = "tl_%d:%d_%d:%d:%d_%s" % (x, y, width, height, zl, image.path) - - # lookup - data = cache.get(key) - - else : - # oops, no cache - data = None - - if not data : - # cache miss, render - data = render_raw(image, width, height, x, y, zl) - - if cache : - # store - cache.add(key, data) - - # ok - return data - -### Render PNG Data -def img_png_tile (image, x, y, zoom, cache) : - """ - Render given tile, returning PNG data - """ - - # remap coordinates by zoom - x = scale_by_zoom(x, zoom) - y = scale_by_zoom(y, zoom) - - # do we want to cache this? - if check_cache_threshold(TILE_WIDTH, TILE_HEIGHT, zoom) : - # go via the cache - return render_cache(cache, image, TILE_WIDTH, TILE_HEIGHT, x, y, zoom) - - else : - # just go raw - return render_raw(image, TILE_WIDTH, TILE_HEIGHT, x, y, zoom) - -def img_png_region (image, cx, cy, zoom, width, height, cache) : - """ - Render arbitrary tile, returning PNG data - """ - - x = scale_by_zoom(cx - width / 2, zoom) - y = scale_by_zoom(cy - height / 2, zoom) - - # safely limit - if width * height > MAX_PIXELS : - raise ValueError("Image size: %d * %d > %d" % (width, height, MAX_PIXELS)) - - # these images are always cached - return render_cache(cache, image, width, height, x, y, zoom) -