diff -r 4b440fa03183 -r 766df7c9b90d src/lib/cache.c --- a/src/lib/cache.c Mon Dec 28 20:43:33 2009 +0200 +++ b/src/lib/cache.c Mon Dec 28 22:31:33 2009 +0200 @@ -1,5 +1,6 @@ #include "cache.h" #include "shared/util.h" +#include "shared/log.h" // only LOG_DEBUG #include #include @@ -8,6 +9,7 @@ #include #include #include +#include @@ -97,7 +99,7 @@ * * XXX: needs locking */ -static int pt_cache_open_read (struct pt_cache *cache, int *fd_ptr) +static int pt_cache_open_read_fd (struct pt_cache *cache, int *fd_ptr) { int fd; @@ -114,7 +116,7 @@ /** * Open the .tmp cache file as an fd for writing */ -static int pt_cache_open_tmp (struct pt_cache *cache, int *fd_ptr) +static int pt_cache_open_tmp_fd (struct pt_cache *cache, int *fd_ptr) { int fd; char tmp_path[1024]; @@ -150,8 +152,7 @@ void *addr; // determine prot - if (cache->mode & PT_IMG_READ) - prot |= PROT_READ; + prot |= PROT_READ; if (cache->mode & PT_IMG_WRITE) prot |= PROT_WRITE; @@ -207,7 +208,7 @@ } // open as .tmp - if (pt_cache_open_tmp(cache, &cache->fd)) + if (pt_cache_open_tmp_fd(cache, &cache->fd)) return -1; // calculate data size @@ -269,15 +270,37 @@ header.bit_depth = png_get_bit_depth(png, info); header.color_type = png_get_color_type(png, info); + log_debug("width=%u, height=%u, bit_depth=%u, color_type=%u", + header.width, header.height, header.bit_depth, header.color_type + ); + // fill in other info header.row_bytes = png_get_rowbytes(png, info); + log_debug("row_bytes=%u", header.row_bytes); + + // palette etc. + if (header.color_type == PNG_COLOR_TYPE_PALETTE) { + int num_palette; + png_colorp palette; + + if (png_get_PLTE(png, info, &palette, &num_palette) == 0) + // XXX: PLTE chunk not read? + return -1; + + assert(num_palette <= PNG_MAX_PALETTE_LENGTH); + + // copy + header.num_palette = num_palette; + memcpy(&header.palette, palette, num_palette * sizeof(*palette)); + + log_debug("num_palette=%u", num_palette); + } + // create .tmp and write out header if (pt_cache_open_create(cache, &header)) return -1; - // XXX: pallette etc. - // write out raw image data a row at a time for (size_t row = 0; row < header.height; row++) { // read row data, non-interlaced