terom@30: cdef extern from "errno.h" : terom@30: extern int errno terom@30: terom@30: cdef extern from "string.h" : terom@30: char* strerror (int err) terom@30: terom@30: cimport stdio terom@30: cimport stdlib terom@30: cimport python_string terom@30: terom@30: cdef extern from "Python.h" : terom@30: int PyFile_Check (object p) terom@30: stdio.FILE* PyFile_AsFile (object p) terom@30: void PyFile_IncUseCount (object p) terom@30: void PyFile_DecUseCount (object p) terom@30: terom@30: cdef extern from "pngtile.h" : terom@30: struct pt_ctx : terom@30: pass terom@30: terom@30: struct pt_image : terom@30: pass terom@30: terom@30: enum pt_open_mode : terom@30: PT_OPEN_UPDATE terom@30: terom@30: enum pt_cache_status : terom@30: PT_CACHE_ERROR terom@30: PT_CACHE_FRESH terom@30: PT_CACHE_NONE terom@30: PT_CACHE_STALE terom@30: terom@30: struct pt_image_info : terom@30: size_t width, height terom@30: terom@30: struct pt_tile_info : terom@30: size_t width, height terom@30: size_t x, y terom@34: int zoom terom@30: terom@30: int pt_image_open (pt_image **image_ptr, pt_ctx *ctx, char *png_path, int cache_mode) terom@30: int pt_image_info_func "pt_image_info" (pt_image *image, pt_image_info **info_ptr) terom@30: int pt_image_status (pt_image *image) terom@30: int pt_image_update (pt_image *image) terom@30: int pt_image_tile_file (pt_image *image, pt_tile_info *info, stdio.FILE *out) terom@30: int pt_image_tile_mem (pt_image *image, pt_tile_info *info, char **buf_ptr, size_t *len_ptr) terom@30: void pt_image_destroy (pt_image *image) terom@30: terom@30: char* pt_strerror (int err) terom@30: terom@30: OPEN_UPDATE = PT_OPEN_UPDATE terom@30: CACHE_ERROR = PT_CACHE_ERROR terom@30: CACHE_FRESH = PT_CACHE_FRESH terom@30: CACHE_NONE = PT_CACHE_NONE terom@30: CACHE_STALE = PT_CACHE_STALE terom@30: terom@30: class Error (BaseException) : terom@30: pass terom@30: terom@30: cdef int trap_err (char *op, int ret) except -1 : terom@30: if ret < 0 : terom@30: raise Error("%s: %s: %s" % (op, pt_strerror(ret), strerror(errno))) terom@30: terom@30: else : terom@30: return ret terom@30: terom@30: cdef class Image : terom@30: cdef pt_image *image terom@30: terom@30: def __cinit__ (self, char *png_path, int cache_mode = 0) : terom@30: trap_err("pt_image_open", terom@30: pt_image_open(&self.image, NULL, png_path, cache_mode) terom@30: ) terom@30: terom@30: def info (self) : terom@30: cdef pt_image_info *image_info terom@30: terom@30: trap_err("pt_image_info", terom@30: pt_image_info_func(self.image, &image_info) terom@30: ) terom@30: terom@30: return (image_info.width, image_info.height) terom@30: terom@30: def status (self) : terom@30: return trap_err("pt_image_status", terom@30: pt_image_status(self.image) terom@30: ) terom@30: terom@30: def update (self) : terom@30: trap_err("pt_image_update", terom@30: pt_image_update(self.image) terom@30: ) terom@30: terom@34: def tile_file (self, size_t width, size_t height, size_t x, size_t y, int zoom, object out) : terom@30: cdef stdio.FILE *outf terom@30: cdef pt_tile_info ti terom@30: terom@30: if not PyFile_Check(out) : terom@30: raise TypeError("out: must be a file object") terom@30: terom@30: outf = PyFile_AsFile(out) terom@30: terom@30: if not outf : terom@30: raise TypeError("out: must have a FILE*") terom@30: terom@30: ti.width = width terom@30: ti.height = height terom@30: ti.x = x terom@30: ti.y = y terom@34: ti.zoom = zoom terom@30: terom@30: trap_err("pt_image_tile_file", terom@30: pt_image_tile_file(self.image, &ti, outf) terom@30: ) terom@30: terom@34: def tile_mem (self, size_t width, size_t height, size_t x, size_t y, int zoom) : terom@30: cdef pt_tile_info ti terom@30: cdef char *buf terom@30: cdef size_t len terom@30: terom@30: ti.width = width terom@30: ti.height = height terom@30: ti.x = x terom@30: ti.y = y terom@34: ti.zoom = zoom terom@30: terom@30: # render and return ptr to buffer terom@30: trap_err("pt_image_tile_mem", terom@30: pt_image_tile_mem(self.image, &ti, &buf, &len) terom@30: ) terom@30: terom@30: # copy buffer as str... terom@30: data = python_string.PyString_FromStringAndSize(buf, len) terom@30: terom@30: # drop buffer... terom@30: stdlib.free(buf) terom@30: terom@30: return data terom@30: terom@30: def __dealloc__ (self) : terom@30: if self.image : terom@30: pt_image_destroy(self.image) terom@30: