X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=pdf2swf%2Fswfoutput.cc;h=f8554611e60710db9b2a062a688cc65f763353c1;hb=cce86d4b24360a411145935ab6375e324ebec1c1;hp=febad8654ce87a467cacaa59586574315caeb821;hpb=cfd29645a1de39239b8c16fd2621997fc07f4284;p=swftools.git diff --git a/pdf2swf/swfoutput.cc b/pdf2swf/swfoutput.cc index febad86..f855461 100644 --- a/pdf2swf/swfoutput.cc +++ b/pdf2swf/swfoutput.cc @@ -59,6 +59,7 @@ struct fontlist_t fontlist_t*next; }; +double config_dumpfonts=0; double config_ppmsubpixels=0; double config_jpegsubpixels=0; int config_opennewwindow=1; @@ -73,6 +74,7 @@ int config_splinemaxerror=1; int config_fontsplinemaxerror=1; int config_filloverlap=0; int config_protect=0; +int config_bboxvars=0; float config_minlinewidth=0.05; double config_caplinewidth=1; @@ -137,6 +139,8 @@ typedef struct _swfoutput_internal int firstpage; char pagefinished; + char overflow; + /* during the transition to the gfxdevice interface: a device which uses this swfoutput as target */ gfxdevice_t device; @@ -161,6 +165,7 @@ static swfoutput_internal* init_internal_struct() i->storefont = 0; i->currentswfid = 0; i->depth = 0; + i->overflow = 0; i->startdepth = 0; i->linewidth = 0; i->shapeid = -1; @@ -206,9 +211,21 @@ static U16 getNewID(struct swfoutput* obj) if(!id_error) msg(" ID Table overflow"); id_error=1; + i->overflow = 1; } return ++i->currentswfid; } +static U16 getNewDepth(struct swfoutput* obj) +{ + swfoutput_internal*i = (swfoutput_internal*)obj->internal; + if(i->depth == 65535) { + if(!id_error) + msg(" Depth Table overflow"); + id_error=1; + i->overflow = 1; + } + return ++i->depth; +} static void startshape(struct swfoutput* obj); static void starttext(struct swfoutput* obj); @@ -698,6 +715,9 @@ static void putcharacter(struct swfoutput*obj, int fontid, int charid, int x,int If we set it to low, however, the char positions will be inaccurate */ #define FONT_INTERNAL_SIZE 4 +static int font_active = 0; +static char* font_active_filename = 0; + /* process a character. */ static int drawchar(struct swfoutput*obj, SWFFONT *swffont, char*character, int charnr, int u, swfmatrix*m, gfxcolor_t*col) { @@ -708,6 +728,16 @@ static int drawchar(struct swfoutput*obj, SWFFONT *swffont, char*character, int } int charid = getCharID(swffont, charnr, character, u); + if(font_active) { + char buf[1024]; + sprintf(buf, "%s.usage", font_active_filename); + FILE*fi = fopen(buf, "ab+"); + if(fi) { + fprintf(fi, "%d %d %d %s\n", charnr, u, charid, character); + fclose(fi); + } else + msg(" Couldn't write to %s", buf); + } if(charid<0) { msg(" Didn't find character '%s' (c=%d,u=%d) in current charset (%s, %d characters)", @@ -798,11 +828,10 @@ static void endtext(swfoutput*obj) putcharacters(obj, i->tag); swf_SetU8(i->tag,0); i->tag = swf_InsertTag(i->tag,ST_PLACEOBJECT2); - //swf_ObjectPlace(i->tag,i->textid,/*depth*/i->depth++,&i->page_matrix,NULL,NULL); MATRIX m2; swf_MatrixJoin(&m2,&obj->fontmatrix, &i->page_matrix); - swf_ObjectPlace(i->tag,i->textid,/*depth*/++i->depth,&m2,NULL,NULL); + swf_ObjectPlace(i->tag,i->textid,getNewDepth(obj),&m2,NULL,NULL); i->textid = -1; } @@ -852,11 +881,11 @@ int getCharID(SWFFONT *font, int charnr, char *charname, int u) return -1; } - /* set's the t1 font index of the font to use for swfoutput_drawchar(). */ void swfoutput_setfont(struct swfoutput*obj, char*fontid, char*filename) { swfoutput_internal*i = (swfoutput_internal*)obj->internal; + font_active = 0; fontlist_t*last=0,*iterator; if(!fontid) { msg(" No fontid"); @@ -888,6 +917,11 @@ void swfoutput_setfont(struct swfoutput*obj, char*fontid, char*filename) swf_SetLoadFontParameters(64,/*skip unused*/0,/*full unicode*/1); SWFFONT*swffont = swf_LoadFont(filename); + if(config_dumpfonts) { + font_active = 1; + font_active_filename = strdup(filename); + } + if(swffont == 0) { msg(" Couldn't load font %s (%s)", fontid, filename); swffont = swf_LoadFont(0); @@ -913,6 +947,10 @@ void swfoutput_setfont(struct swfoutput*obj, char*fontid, char*filename) swffont->encoding = 255; } } + + if(swffont->encoding != FONT_ENCODING_UNICODE && swffont->encoding != 255) { + msg(" Non-unicode mapping for font %s (%s)", fontid, filename); + } swf_FontSetID(swffont, getNewID(obj)); @@ -1072,9 +1110,9 @@ static void setBackground(struct swfoutput*obj, int x1, int y1, int x2, int y2) swf_ShapeSetEnd(i->tag); swf_ShapeFree(s); i->tag = swf_InsertTag(i->tag, ST_PLACEOBJECT2); - swf_ObjectPlace(i->tag,shapeid,++i->depth,0,0,0); + swf_ObjectPlace(i->tag,shapeid,getNewDepth(obj),0,0,0); i->tag = swf_InsertTag(i->tag, ST_PLACEOBJECT2); - swf_ObjectPlaceClip(i->tag,shapeid,++i->depth,0,0,0,65535); + swf_ObjectPlaceClip(i->tag,shapeid,getNewDepth(obj),0,0,0,65535); i->cliptag = i->tag; } @@ -1335,7 +1373,7 @@ static void endshape(swfoutput*obj) msg(" Placing shape id %d", i->shapeid); i->tag = swf_InsertTag(i->tag,ST_PLACEOBJECT2); - swf_ObjectPlace(i->tag,i->shapeid,/*depth*/++i->depth,&i->page_matrix,NULL,NULL); + swf_ObjectPlace(i->tag,i->shapeid,getNewDepth(obj),&i->page_matrix,NULL,NULL); swf_ShapeFree(i->shape); i->shape = 0; @@ -1360,6 +1398,22 @@ static void endshape(swfoutput*obj) }*/ } +void wipeSWF(SWF*swf) +{ + TAG*tag = swf->firstTag; + while(tag) { + TAG*next = tag->next; + if(tag->id != ST_SETBACKGROUNDCOLOR && + tag->id != ST_END && + tag->id != ST_DOACTION && + tag->id != ST_SHOWFRAME) { + swf_DeleteTag(tag); + } + tag = next; + } +} + + void swfoutput_finalize(struct swfoutput*obj) { swfoutput_internal*i = (swfoutput_internal*)obj->internal; @@ -1367,6 +1421,32 @@ void swfoutput_finalize(struct swfoutput*obj) if(i->tag && i->tag->id == ST_END) return; //already done + if(config_bboxvars) { + TAG* tag = swf_InsertTag(i->swf.firstTag, ST_DOACTION); + ActionTAG*a = 0; + a = action_PushString(a, "xmin"); + a = action_PushFloat(a, i->swf.movieSize.xmin / 20.0); + a = action_SetVariable(a); + a = action_PushString(a, "ymin"); + a = action_PushFloat(a, i->swf.movieSize.ymin / 20.0); + a = action_SetVariable(a); + a = action_PushString(a, "xmax"); + a = action_PushFloat(a, i->swf.movieSize.xmax / 20.0); + a = action_SetVariable(a); + a = action_PushString(a, "ymax"); + a = action_PushFloat(a, i->swf.movieSize.ymax / 20.0); + a = action_SetVariable(a); + a = action_PushString(a, "width"); + a = action_PushFloat(a, (i->swf.movieSize.xmax - i->swf.movieSize.xmin) / 20.0); + a = action_SetVariable(a); + a = action_PushString(a, "height"); + a = action_PushFloat(a, (i->swf.movieSize.ymax - i->swf.movieSize.ymin) / 20.0); + a = action_SetVariable(a); + a = action_End(a); + swf_ActionSet(tag, a); + swf_ActionFree(a); + } + if(i->frameno == i->lastframeno) // fix: add missing pagefeed swfoutput_pagefeed(obj); @@ -1393,6 +1473,10 @@ void swfoutput_finalize(struct swfoutput*obj) swf_DeleteTag(tag); tag = prev; } + + if(i->overflow) { + wipeSWF(&i->swf); + } } SWF* swfoutput_get(struct swfoutput*obj) @@ -1739,9 +1823,9 @@ static void drawlink(struct swfoutput*obj, ActionTAG*actions1, ActionTAG*actions m = i->page_matrix; m.tx = p.x; m.ty = p.y; - swf_ObjectPlace(i->tag, buttonid, ++i->depth,&m,0,0); + swf_ObjectPlace(i->tag, buttonid, getNewDepth(obj),&m,0,0); } else { - swf_ObjectPlace(i->tag, buttonid, ++i->depth,&i->page_matrix,0,0); + swf_ObjectPlace(i->tag, buttonid, getNewDepth(obj),&i->page_matrix,0,0); } } @@ -1935,6 +2019,8 @@ void swfoutput_setparameter(char*name, char*value) config_storeallcharacters = atoi(value); } else if(!strcmp(name, "enablezlib")) { config_enablezlib = atoi(value); + } else if(!strcmp(name, "bboxvars")) { + config_bboxvars = atoi(value); } else if(!strcmp(name, "insertstop")) { config_insertstoptag = atoi(value); } else if(!strcmp(name, "protected")) { @@ -1945,6 +2031,8 @@ void swfoutput_setparameter(char*name, char*value) config_minlinewidth = atof(value); } else if(!strcmp(name, "caplinewidth")) { config_caplinewidth = atof(value); + } else if(!strcmp(name, "dumpfonts")) { + config_dumpfonts = atoi(value); } else if(!strcmp(name, "jpegquality")) { int val = atoi(value); if(val<0) val=0; @@ -2097,12 +2185,20 @@ gfxline_t* SVPtogfxline(ArtSVP*svp) } } +/* TODO */ +static int imageInCache(swfoutput*obj, void*data, int width, int height) +{ + return -1; +} +static void addImageToCache(swfoutput*obj, void*data, int width, int height) +{ +} + static int add_image(swfoutput_internal*i, gfximage_t*img, int targetwidth, int targetheight, int* newwidth, int* newheight) { swfoutput*obj = i->obj; RGBA*newpic = 0; RGBA*mem = (RGBA*)img->data; - int bitid = getNewID(obj); int sizex = img->width; int sizey = img->height; @@ -2160,11 +2256,19 @@ static int add_image(swfoutput_internal*i, gfximage_t*img, int targetwidth, int } printf("\n");*/ - i->tag = swf_AddImage(i->tag, bitid, mem, sizex, sizey, config_jpegquality); + int bitid = -1; + int cacheid = imageInCache(obj, mem, sizex, sizey); + + if(cacheid<=0) { + bitid = getNewID(obj); + i->tag = swf_AddImage(i->tag, bitid, mem, sizex, sizey, config_jpegquality); + addImageToCache(obj, mem, sizex, sizey); + } else { + bitid = cacheid; + } if(newpic) free(newpic); - return bitid; } @@ -2225,7 +2329,7 @@ void swf_fillbitmap(gfxdevice_t*dev, gfxline_t*line, gfximage_t*img, gfxmatrix_t i->tag = swf_InsertTag(i->tag,ST_PLACEOBJECT2); CXFORM cxform2 = gfxcxform_to_cxform(cxform); - swf_ObjectPlace(i->tag,myshapeid,/*depth*/++i->depth,&i->page_matrix,&cxform2,NULL); + swf_ObjectPlace(i->tag,myshapeid,getNewDepth(obj),&i->page_matrix,&cxform2,NULL); } void swf_startclip(gfxdevice_t*dev, gfxline_t*line) @@ -2266,7 +2370,7 @@ void swf_startclip(gfxdevice_t*dev, gfxline_t*line) i->tag = swf_InsertTag(i->tag,ST_PLACEOBJECT2); i->cliptags[i->clippos] = i->tag; i->clipshapes[i->clippos] = myshapeid; - i->clipdepths[i->clippos] = ++i->depth; + i->clipdepths[i->clippos] = getNewDepth(obj); i->clippos++; }