static void record_startpage(struct _gfxdevice*dev, int width, int height) { internal_t*i = (internal_t*)dev->internal; msg("<trace> record: %08x STARTPAGE\n", dev); writer_writeU8(&i->w, OP_STARTPAGE); writer_writeU16(&i->w, width); writer_writeU16(&i->w, height); }
static void dumpImage(writer_t*w, state_t*state, gfximage_t*img) { int oldpos = w->pos; writer_writeU16(w, img->width); writer_writeU16(w, img->height); #ifdef COMPRESS_IMAGES //35.3% images (2027305 bytes) (with filter, Z_BEST_COMPRESSION) //39.9% images (2458904 bytes) (with filter, Z_BEST_SPEED) //45.2% images (3055340 bytes) (without filter) //45.9% images (3149247 bytes) (without filter, 5) //48.0% images (3480495 bytes) (with filter, fastlz) //48.0% images (3488650 bytes) (without filter, Z_BEST_SPEED) //55.3% images (4665889 bytes) (without filter, fastlz level 2) //55.6% images (4726334 bytes) (without filter, fastlz level 1) //83.0% images (18091804 bytes) (no compression) gfxcolor_t*image; #ifdef FILTER_IMAGES unsigned char*filter = malloc(img->height); int y; image = malloc(img->width*img->height*sizeof(gfxcolor_t)); for(y=0;y<img->height;y++) { filter[y] = png_apply_filter_32( (void*)&image[y*img->width], (void*)&img->data[y*img->width], img->width, y); } #else image = img->data; #endif int size = img->width*img->height; uLongf compressdata_size = compressBound(size*sizeof(gfxcolor_t)); void*compressdata = malloc(compressdata_size); #ifdef HAVE_FASTLZ compressdata_size = fastlz_compress_level(2, (void*)image, size*sizeof(gfxcolor_t), compressdata); #else compress2(compressdata, &compressdata_size, (void*)image, sizeof(gfxcolor_t)*size, Z_BEST_SPEED); #endif writer_writeU32(w, compressdata_size); #ifdef FILTER_IMAGES w->write(w, filter, img->height); free(filter); free(image); #endif w->write(w, compressdata, compressdata_size); free(compressdata); #else w->write(w, img->data, img->width*img->height*sizeof(gfxcolor_t)); #endif #ifdef STATS state->size_images += w->pos - oldpos; #endif }