git.asbjorn.biz
/
swftools.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
added jpeg_get_size function
[swftools.git]
/
lib
/
devices
/
record.c
diff --git
a/lib/devices/record.c
b/lib/devices/record.c
index
4365230
..
fb1c5a9
100644
(file)
--- a/
lib/devices/record.c
+++ b/
lib/devices/record.c
@@
-45,6
+45,8
@@
#include "record.h"
//#define STATS
#include "record.h"
//#define STATS
+#define COMPRESS_IMAGES
+//#define FILTER_IMAGES
typedef struct _state {
char*last_string[16];
typedef struct _state {
char*last_string[16];
@@
-95,6
+97,7
@@
typedef struct _internal_result {
#define OP_FINISH 0x0d
#define FLAG_SAME_AS_LAST 0x10
#define OP_FINISH 0x0d
#define FLAG_SAME_AS_LAST 0x10
+#define FLAG_ZERO_FONT 0x20
#define LINE_MOVETO 0x0e
#define LINE_LINETO 0x0f
#define LINE_MOVETO 0x0e
#define LINE_LINETO 0x0f
@@
-169,41
+172,52
@@
static gfxline_t* readLine(reader_t*r, state_t*s)
return start;
}
return start;
}
-#define COMPRESS_IMAGES
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
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
- //45.2% images (3055340 bytes) (without filter)
- //39.9% images (2458904 bytes) (with filter, Z_BEST_SPEED)
//35.3% images (2027305 bytes) (with filter, Z_BEST_COMPRESSION)
//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 (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;
unsigned char*filter = malloc(img->height);
int y;
- gfxcolor_t*image = malloc(img->width*img->height*sizeof(gfxcolor_t));
+ 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);
}
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
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(1, (void*)image, size*sizeof(gfxcolor_t), compressdata);
+ 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);
#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);
w->write(w, filter, img->height);
- w->write(w, compressdata, compressdata_size);
- free(image);
free(filter);
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
#else
w->write(w, img->data, img->width*img->height*sizeof(gfxcolor_t));
#endif
@@
-221,16
+235,19
@@
static gfximage_t readImage(reader_t*r, state_t*state)
#ifdef COMPRESS_IMAGES
uLongf compressdata_size = reader_readU32(r);
void*compressdata = malloc(compressdata_size);
#ifdef COMPRESS_IMAGES
uLongf compressdata_size = reader_readU32(r);
void*compressdata = malloc(compressdata_size);
+# ifdef FILTER_IMAGES
unsigned char*filter = malloc(img.height);
r->read(r, filter, img.height);
unsigned char*filter = malloc(img.height);
r->read(r, filter, img.height);
+# endif
r->read(r, compressdata, compressdata_size);
r->read(r, compressdata, compressdata_size);
-#ifdef HAVE_FASTLZ
+# ifdef HAVE_FASTLZ
fastlz_decompress(compressdata, compressdata_size, (void*)img.data, size);
fastlz_decompress(compressdata, compressdata_size, (void*)img.data, size);
-#else
+# else
uncompress((void*)img.data, &size, compressdata, compressdata_size);
uncompress((void*)img.data, &size, compressdata, compressdata_size);
-#endif
+# endif
+# ifdef FILTER_IMAGES
int y;
unsigned char*line = malloc(img.width*sizeof(gfxcolor_t));
for(y=0;y<img.height;y++) {
int y;
unsigned char*line = malloc(img.width*sizeof(gfxcolor_t));
for(y=0;y<img.height;y++) {
@@
-239,7
+256,10
@@
static gfximage_t readImage(reader_t*r, state_t*state)
line, img.width);
memcpy(&img.data[y*img.width], line, img.width*sizeof(gfxcolor_t));
}
line, img.width);
memcpy(&img.data[y*img.width], line, img.width*sizeof(gfxcolor_t));
}
+ free(line);
free(filter);
free(filter);
+# endif
+
#else
r->read(r, img.data, size);
#endif
#else
r->read(r, img.data, size);
#endif
@@
-560,16
+580,22
@@
static void record_drawchar(struct _gfxdevice*dev, gfxfont_t*font, int glyphnr,
}
msg("<trace> record: %08x DRAWCHAR %d\n", glyphnr, dev);
}
msg("<trace> record: %08x DRAWCHAR %d\n", glyphnr, dev);
- const char*font_id = font->id?font->id:"*NULL*";
+ const char*font_id = (font&&font->id)?font->id:"*NULL*";
gfxmatrix_t*l = &i->state.last_matrix[OP_DRAWCHAR];
gfxmatrix_t*l = &i->state.last_matrix[OP_DRAWCHAR];
+ U8 flags = 0;
+ if(!font)
+ flags |= FLAG_ZERO_FONT;
+
char same_font = i->state.last_string[OP_DRAWCHAR] && !strcmp(i->state.last_string[OP_DRAWCHAR], font_id);
char same_matrix = (l->m00 == matrix->m00) && (l->m01 == matrix->m01) && (l->m10 == matrix->m10) && (l->m11 == matrix->m11);
char same_color = !memcmp(color, &i->state.last_color[OP_DRAWCHAR], sizeof(gfxcolor_t));
char same_font = i->state.last_string[OP_DRAWCHAR] && !strcmp(i->state.last_string[OP_DRAWCHAR], font_id);
char same_matrix = (l->m00 == matrix->m00) && (l->m01 == matrix->m01) && (l->m10 == matrix->m10) && (l->m11 == matrix->m11);
char same_color = !memcmp(color, &i->state.last_color[OP_DRAWCHAR], sizeof(gfxcolor_t));
- U8 flags = 0;
+
+ /* FIXME
if(same_font && same_matrix && same_color)
flags |= FLAG_SAME_AS_LAST;
if(same_font && same_matrix && same_color)
flags |= FLAG_SAME_AS_LAST;
+ */
writer_writeU8(&i->w, OP_DRAWCHAR|flags);
writer_writeU32(&i->w, glyphnr);
writer_writeU8(&i->w, OP_DRAWCHAR|flags);
writer_writeU32(&i->w, glyphnr);
@@
-578,7
+604,8
@@
static void record_drawchar(struct _gfxdevice*dev, gfxfont_t*font, int glyphnr,
#endif
if(!(flags&FLAG_SAME_AS_LAST)) {
#endif
if(!(flags&FLAG_SAME_AS_LAST)) {
- writer_writeString(&i->w, font_id);
+ if(!(flags&FLAG_ZERO_FONT))
+ writer_writeString(&i->w, font_id);
dumpColor(&i->w, &i->state, color);
dumpMatrix(&i->w, &i->state, matrix);
i->state.last_string[OP_DRAWCHAR] = strdup(font_id);
dumpColor(&i->w, &i->state, color);
dumpMatrix(&i->w, &i->state, matrix);
i->state.last_string[OP_DRAWCHAR] = strdup(font_id);
@@
-757,7
+784,9
@@
static void replay(struct _gfxdevice*dev, gfxdevice_t*out, reader_t*r)
case OP_DRAWCHAR: {
U32 glyph = reader_readU32(r);
gfxmatrix_t m = {1,0,0, 0,1,0};
case OP_DRAWCHAR: {
U32 glyph = reader_readU32(r);
gfxmatrix_t m = {1,0,0, 0,1,0};
- char* id = read_string(r, &state, op, flags);
+ char* id = 0;
+ if(!(flags&FLAG_ZERO_FONT))
+ id = read_string(r, &state, op, flags);
gfxcolor_t color = read_color(r, &state, op, flags);
gfxmatrix_t matrix = read_matrix(r, &state, op, flags);
gfxcolor_t color = read_color(r, &state, op, flags);
gfxmatrix_t matrix = read_matrix(r, &state, op, flags);
@@
-767,7
+796,8
@@
static void replay(struct _gfxdevice*dev, gfxdevice_t*out, reader_t*r)
}
msg("<trace> replay: DRAWCHAR font=%s glyph=%d", id, glyph);
out->drawchar(out, font, glyph, &color, &matrix);
}
msg("<trace> replay: DRAWCHAR font=%s glyph=%d", id, glyph);
out->drawchar(out, font, glyph, &color, &matrix);
- free(id);
+ if(id)
+ free(id);
break;
}
}
break;
}
}