typedef struct _internal {
gfxfontlist_t* fontlist;
writer_t w;
+ int cliplevel;
} internal_t;
typedef struct _internal_result {
msg("<trace> record: %08x STARTCLIP\n", dev);
writer_writeU8(&i->w, OP_STARTCLIP);
dumpLine(&i->w, line);
+ i->cliplevel++;
}
static void record_endclip(struct _gfxdevice*dev)
internal_t*i = (internal_t*)dev->internal;
msg("<trace> record: %08x ENDCLIP\n", dev);
writer_writeU8(&i->w, OP_ENDCLIP);
+ i->cliplevel--;
+ if(i->cliplevel<0) {
+ msg("<error> record: endclip() without startclip()");
+ }
}
static void record_fill(struct _gfxdevice*dev, gfxline_t*line, gfxcolor_t*color)
static void record_addfont(struct _gfxdevice*dev, gfxfont_t*font)
{
internal_t*i = (internal_t*)dev->internal;
- msg("<trace> record: %08x ADDFONT\n", dev);
- writer_writeU8(&i->w, OP_ADDFONT);
- dumpFont(&i->w, font);
- i->fontlist = gfxfontlist_addfont(i->fontlist, font);
+ msg("<trace> record: %08x ADDFONT %s\n", dev);
+ if(font && !gfxfontlist_hasfont(i->fontlist, font)) {
+ writer_writeU8(&i->w, OP_ADDFONT);
+ dumpFont(&i->w, font);
+ i->fontlist = gfxfontlist_addfont(i->fontlist, font);
+ }
}
static void record_drawchar(struct _gfxdevice*dev, gfxfont_t*font, int glyphnr, gfxcolor_t*color, gfxmatrix_t*matrix)
internal_t*i = (internal_t*)dev->internal;
if(font && !gfxfontlist_hasfont(i->fontlist, font)) {
record_addfont(dev, font);
- i->fontlist = gfxfontlist_addfont(i->fontlist, font);
}
msg("<trace> record: %08x DRAWCHAR %d\n", glyphnr, dev);
unsigned char op = reader_readU8(r);
switch(op) {
case OP_END:
- msg("<trace> replay: END");
+ r->dealloc(r);
+
+ {
+ gfxfontlist_t*l = fontlist;
+ while(l) {
+ l = l->next;
+ }
+ }
+
+ gfxfontlist_free(fontlist, 1);
return;
case OP_SETPARAM: {
msg("<trace> replay: SETPARAM");
gfxline_t* line = readLine(r);
gfxcxform_t* cxform = readCXForm(r);
out->fillbitmap(out, line, &img, &matrix, cxform);
+ gfxline_free(line);
if(cxform)
free(cxform);
free(img.data);img.data=0;
}
}
}
- r->dealloc(r);
- gfxfontlist_free(fontlist, 1);
+ msg("<error> No END token in gfx recording");
}
void gfxresult_record_replay(gfxresult_t*result, gfxdevice_t*device)
{
static gfxresult_t* record_finish(struct _gfxdevice*dev)
{
internal_t*i = (internal_t*)dev->internal;
- msg("<trace> record: %08x END\n", dev);
+ msg("<trace> record: %08x END", dev);
+
+ if(i->cliplevel) {
+ msg("<error> Warning: unclosed cliplevels");
+ }
writer_writeU8(&i->w, OP_END);
writer_init_growingmemwriter(&i->w, 1048576);
i->fontlist = gfxfontlist_create();
+ i->cliplevel = 0;
dev->setparameter = record_setparameter;
dev->startpage = record_startpage;