+
+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);
+#else
+ w->write(w, img->data, img->width*img->height*sizeof(gfxcolor_t));
+#endif
+#ifdef STATS
+ state->size_images += w->pos - oldpos;
+#endif
+}
+static gfximage_t readImage(reader_t*r, state_t*state)