X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=pdf2swf%2Fswfoutput.cc;h=dcba00745b75a6585a89bd02c68f1de42362c082;hb=50c757db52590bc2e187d2728271346b34677217;hp=9f91f988708e068829a8cd144bc6455565526106;hpb=840427b181387c01b2509416806049cda0b539fc;p=swftools.git diff --git a/pdf2swf/swfoutput.cc b/pdf2swf/swfoutput.cc index 9f91f98..dcba007 100644 --- a/pdf2swf/swfoutput.cc +++ b/pdf2swf/swfoutput.cc @@ -56,33 +56,28 @@ struct fontlist_t fontlist_t*next; }; -static struct _config -{ - int opennewwindow; - int ignoredraworder; - int drawonlyshapes; - int jpegquality; - int storeallcharacters; - int enablezlib; - int insertstoptag; - int flashversion; - int splinemaxerror; - int fontsplinemaxerror; - int filloverlap; - int protect; - float minlinewidth; -} config; +int config_opennewwindow=0; +int config_ignoredraworder=0; +int config_drawonlyshapes=0; +int config_jpegquality=85; +int config_storeallcharacters=0; +int config_enablezlib=0; +int config_insertstoptag=0; +int config_flashversion=5; +int config_splinemaxerror=1; +int config_fontsplinemaxerror=1; +int config_filloverlap=0; +int config_protect=0; +float config_minlinewidth=0.05; typedef struct _swfoutput_internal { - fontlist_t* fontlist; char storefont; - int flag_protected; - - char* filename; - SWF swf; + + MATRIX page_matrix; + TAG *tag; int currentswfid; int depth; @@ -118,31 +113,13 @@ typedef struct _swfoutput_internal int firstpage; } swfoutput_internal; -static int global_init; - static swfoutput_internal* init_internal_struct() { swfoutput_internal*i = (swfoutput_internal*)malloc(sizeof(swfoutput_internal)); memset(i, 0, sizeof(swfoutput_internal)); - if(!global_init) { - config.opennewwindow=0; - config.ignoredraworder=0; - config.drawonlyshapes=0; - config.jpegquality=85; - config.storeallcharacters=0; - config.enablezlib=0; - config.insertstoptag=0; - config.flashversion=5; - config.splinemaxerror=1; - config.fontsplinemaxerror=1; - config.filloverlap=0; - config.minlinewidth=0.05; - } i->storefont = 0; - i->flag_protected = 0; - i->filename = 0; i->currentswfid = 0; i->depth = 1; i->startdepth = 1; @@ -303,10 +280,10 @@ static void spline(struct swfoutput*obj, TAG*tag,plotxy p0,plotxy p1,plotxy p2,p if(i->storefont) { /* fonts use a different approximation than shapes */ - num = cspline_approximate(&c, q, config.fontsplinemaxerror/20.0, APPROXIMATE_RECURSIVE_BINARY); + num = cspline_approximate(&c, q, config_fontsplinemaxerror/20.0, APPROXIMATE_RECURSIVE_BINARY); //num = cspline_approximate(&c, q, 10.0, APPROXIMATE_INFLECTION); } else { - num = cspline_approximate(&c, q, config.splinemaxerror/20.0, APPROXIMATE_RECURSIVE_BINARY); + num = cspline_approximate(&c, q, config_splinemaxerror/20.0, APPROXIMATE_RECURSIVE_BINARY); } for(t=0;ttype == SWF_PATHTYPE_MOVE) { //if(!init && fill && obj->drawmode != DRAWMODE_EOFILL && !ignoredraworder) { - if(config.filloverlap && !init && i->fill && obj->drawmode != DRAWMODE_EOFILL) { + if(config_filloverlap && !init && i->fill && obj->drawmode != DRAWMODE_EOFILL) { /* drawmode=FILL (not EOFILL) means that seperate shapes do not cancel each other out. On SWF side, we need to start a new shape for each @@ -1179,7 +1156,11 @@ 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++,&obj->fontmatrix,NULL,NULL); + //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); i->textid = -1; } @@ -1195,12 +1176,13 @@ void swfoutput_drawpath(swfoutput*obj, SWF_OUTLINE*outline, /* Multiple polygons in one shape don't overlap correctly, so we better start a new shape here if the polygon is filled */ - if(i->shapeid>=0 && i->fill && !config.ignoredraworder) { + if(i->shapeid>=0 && i->fill && !config_ignoredraworder) { endshape(obj,0); } - if(i->shapeid<0) + if(i->shapeid<0) { startshape(obj); + } if(!i->fill) stopFill(obj); @@ -1313,7 +1295,7 @@ void swfoutput_setfont(struct swfoutput*obj, char*fontid, char*filename) swf_FontSetID(swffont, ++i->currentswfid); - if(screenloglevel >= LOGLEVEL_DEBUG) { + if(getScreenLogLevel() >= LOGLEVEL_DEBUG) { // print font information msg(" Font %s (%s)",swffont->name, filename); msg(" | ID: %d", swffont->id); @@ -1416,7 +1398,7 @@ static void endpage(struct swfoutput*obj) while(i->clippos) swfoutput_endclip(obj); - if(config.insertstoptag) { + if(config_insertstoptag) { ActionTAG*atag=0; atag = action_Stop(atag); atag = action_End(atag); @@ -1426,12 +1408,16 @@ static void endpage(struct swfoutput*obj) i->tag = swf_InsertTag(i->tag,ST_SHOWFRAME); } -void swfoutput_newpage(struct swfoutput*obj, int pageNum, int x1, int y1, int x2, int y2) +void swfoutput_newpage(struct swfoutput*obj, int pageNum, int movex, int movey, int x1, int y1, int x2, int y2) { swfoutput_internal*i = (swfoutput_internal*)obj->internal; if(!i->firstpage) endpage(obj); + swf_GetMatrix(0, &i->page_matrix); + i->page_matrix.tx = movex*20; + i->page_matrix.ty = movey*20; + for(i->depth--;i->depth>=i->startdepth;i->depth--) { i->tag = swf_InsertTag(i->tag,ST_REMOVEOBJECT2); swf_SetU16(i->tag,i->depth); @@ -1492,13 +1478,13 @@ void swfoutput_newpage(struct swfoutput*obj, int pageNum, int x1, int y1, int x2 i->lastpagesize.xmax = x2; i->lastpagesize.ymin = y1; i->lastpagesize.ymax = y2; - swf_ExpandRect2(&i->swf.movieSize, &i->lastpagesize); + swf_ExpandRect2(&obj->swf.movieSize, &i->lastpagesize); i->firstpage = 0; } /* initialize the swf writer */ -void swfoutput_init(struct swfoutput* obj, char*_filename) +void swfoutput_init(struct swfoutput* obj) { memset(obj, 0, sizeof(struct swfoutput)); obj->internal = init_internal_struct(); @@ -1507,37 +1493,31 @@ void swfoutput_init(struct swfoutput* obj, char*_filename) SRECT r; RGBA rgb; - i->filename = _filename; msg(" initializing swf output for size %d*%d\n", i->sizex,i->sizey); obj->swffont = 0; obj->drawmode = -1; - memset(&i->swf,0x00,sizeof(SWF)); + memset(&obj->swf,0x00,sizeof(SWF)); memset(&i->lastpagesize,0x00,sizeof(SRECT)); - i->swf.fileVersion = config.flashversion; - i->swf.frameRate = 0x0040; // 1 frame per 4 seconds - i->swf.movieSize.xmin = 0; - i->swf.movieSize.ymin = 0; - i->swf.movieSize.xmax = 0; - i->swf.movieSize.ymax = 0; + obj->swf.fileVersion = config_flashversion; + obj->swf.frameRate = 0x0040; // 1 frame per 4 seconds + obj->swf.movieSize.xmin = 0; + obj->swf.movieSize.ymin = 0; + obj->swf.movieSize.xmax = 0; + obj->swf.movieSize.ymax = 0; - i->swf.firstTag = swf_InsertTag(NULL,ST_SETBACKGROUNDCOLOR); - i->tag = i->swf.firstTag; + obj->swf.firstTag = swf_InsertTag(NULL,ST_SETBACKGROUNDCOLOR); + i->tag = obj->swf.firstTag; rgb.a = rgb.r = rgb.g = rgb.b = 0xff; swf_SetRGB(i->tag,&rgb); i->startdepth = i->depth = 0; -} - -void swfoutput_setprotected(struct swfoutput*obj) //write PROTECT tag -{ - swfoutput_internal*i = (swfoutput_internal*)obj->internal; - if(!i->flag_protected) + + if(config_protect) i->tag = swf_InsertTag(i->tag, ST_PROTECT); - i->flag_protected = 1; } static void startshape(struct swfoutput*obj) @@ -1623,6 +1603,7 @@ void cancelshape(swfoutput*obj) TAG*todel = i->tag; i->tag = i->tag->prev; swf_DeleteTag(todel); + if(i->shape) {swf_ShapeFree(i->shape);i->shape=0;} i->shapeid = -1; i->bboxrectpos = -1; } @@ -1633,7 +1614,7 @@ void fixAreas(swfoutput*obj) if(!i->shapeisempty && i->fill && (i->bboxrect.xmin == i->bboxrect.xmax || i->bboxrect.ymin == i->bboxrect.ymax) && - config.minlinewidth >= 0.001 + config_minlinewidth >= 0.001 ) { msg(" Shape has size 0: width=%.2f height=%.2f", (i->bboxrect.xmax-i->bboxrect.xmin)/20.0, @@ -1653,7 +1634,7 @@ void fixAreas(swfoutput*obj) int save_width = i->linewidth; obj->strokergb = obj->fillrgb; - i->linewidth = (int)(config.minlinewidth*20); + i->linewidth = (int)(config_minlinewidth*20); if(i->linewidth==0) i->linewidth = 1; startshape(obj); @@ -1667,6 +1648,19 @@ void fixAreas(swfoutput*obj) } +static void endshape_noput(swfoutput*obj) +{ + swfoutput_internal*i = (swfoutput_internal*)obj->internal; + if(i->shapeid<0) + return; + //changeRect(obj, i->tag, i->bboxrectpos, &i->bboxrect); + i->shapeid = -1; + if(i->shape) { + swf_ShapeFree(i->shape); + i->shape=0; + } +} + static void endshape(swfoutput*obj, int clipdepth) { swfoutput_internal*i = (swfoutput_internal*)obj->internal; @@ -1690,22 +1684,25 @@ static void endshape(swfoutput*obj, int clipdepth) changeRect(obj, i->tag, i->bboxrectpos, &i->bboxrect); i->tag = swf_InsertTag(i->tag,ST_PLACEOBJECT2); + if(clipdepth) - swf_ObjectPlaceClip(i->tag,i->shapeid,i->depth++,NULL,NULL,NULL,clipdepth); + swf_ObjectPlaceClip(i->tag,i->shapeid,i->depth++,&i->page_matrix,NULL,NULL,clipdepth); else - swf_ObjectPlace(i->tag,i->shapeid,/*depth*/i->depth++,NULL,NULL,NULL); + swf_ObjectPlace(i->tag,i->shapeid,/*depth*/i->depth++,&i->page_matrix,NULL,NULL); + swf_ShapeFree(i->shape); + i->shape = 0; i->shapeid = -1; i->bboxrectpos = -1; } -void swfoutput_save(struct swfoutput* obj) +int swfoutput_save(struct swfoutput* obj, char*filename) { swfoutput_internal*i = (swfoutput_internal*)obj->internal; endpage(obj); fontlist_t *tmp,*iterator = i->fontlist; while(iterator) { - TAG*mtag = i->swf.firstTag; + TAG*mtag = obj->swf.firstTag; if(iterator->swffont) { mtag = swf_InsertTag(mtag, ST_DEFINEFONT2); /*if(!storeallcharacters) @@ -1717,50 +1714,53 @@ void swfoutput_save(struct swfoutput* obj) } int fi; - if(!i->filename) - return; - if(i->filename) - fi = open(i->filename, O_BINARY|O_CREAT|O_TRUNC|O_WRONLY, 0777); + if(filename) + fi = open(filename, O_BINARY|O_CREAT|O_TRUNC|O_WRONLY, 0777); else fi = 1; // stdout if(fi<=0) { - msg(" Could not create \"%s\". ", FIXNULL(i->filename)); - exit(1); + msg(" Could not create \"%s\". ", FIXNULL(filename)); + return 0; } i->tag = swf_InsertTag(i->tag,ST_END); - if(config.enablezlib || config.flashversion>=6) { - if FAILED(swf_WriteSWC(fi,&i->swf)) + if(config_enablezlib || config_flashversion>=6) { + if FAILED(swf_WriteSWC(fi,&obj->swf)) msg(" WriteSWC() failed.\n"); } else { - if FAILED(swf_WriteSWF(fi,&i->swf)) + if FAILED(swf_WriteSWF(fi,&obj->swf)) msg(" WriteSWF() failed.\n"); } - if(i->filename) + if(filename) close(fi); msg(" SWF written\n"); + return 1; } /* Perform cleaning up, complete the swf, and write it out. */ void swfoutput_destroy(struct swfoutput* obj) { swfoutput_internal*i = (swfoutput_internal*)obj->internal; - - swfoutput_save(obj); + if(!i) { + /* not initialized yet- nothing to destroy */ + return; + } fontlist_t *tmp,*iterator = i->fontlist; while(iterator) { if(iterator->swffont) { - swf_FontFree(iterator->swffont); + swf_FontFree(iterator->swffont);iterator->swffont=0; } tmp = iterator; iterator = iterator->next; delete tmp; } - free(i); + swf_FreeTags(&obj->swf); + + free(i);i=0; memset(obj, 0, sizeof(swfoutput)); } @@ -1850,7 +1850,8 @@ void swfoutput_startclip(swfoutput*obj, SWF_OUTLINE*outline, struct swfmatrix*m) i->clipshapes[i->clippos] = i->shapeid; i->clipdepths[i->clippos] = i->depth++; i->clippos++; - i->shapeid = -1; + + endshape_noput(obj); } void swfoutput_endclip(swfoutput*obj) @@ -1866,7 +1867,7 @@ void swfoutput_endclip(swfoutput*obj) return; } i->clippos--; - swf_ObjectPlaceClip(i->cliptags[i->clippos],i->clipshapes[i->clippos],i->clipdepths[i->clippos],NULL,NULL,NULL,i->depth++); + swf_ObjectPlaceClip(i->cliptags[i->clippos],i->clipshapes[i->clippos],i->clipdepths[i->clippos],&i->page_matrix,NULL,NULL,i->depth++); } static void drawlink(struct swfoutput*obj, ActionTAG*,ActionTAG*, swfcoord*points, char mouseover); @@ -1890,7 +1891,7 @@ void swfoutput_linktourl(struct swfoutput*obj, char*url, swfcoord*points) if(i->textid>=0) endtext(obj); - if(config.opennewwindow) + if(config_opennewwindow) actions = action_GetUrl(0, url, "_parent"); else actions = action_GetUrl(0, url, "_this"); @@ -2090,14 +2091,18 @@ static void drawlink(struct swfoutput*obj, ActionTAG*actions1, ActionTAG*actions i->tag = swf_InsertTag(i->tag,ST_PLACEOBJECT2); if(posx!=0 || posy!=0) { + SPOINT p; + p.x = (int)(posx*20); + p.y = (int)(posy*20); + p = swf_TurnPoint(p, &i->page_matrix); MATRIX m; - swf_GetMatrix(0,&m); - m.tx = (int)(posx*20); - m.ty = (int)(posy*20); + m = i->page_matrix; + m.tx = p.x; + m.ty = p.y; swf_ObjectPlace(i->tag, buttonid, i->depth++,&m,0,0); } else { - swf_ObjectPlace(i->tag, buttonid, i->depth++,0,0,0); + swf_ObjectPlace(i->tag, buttonid, i->depth++,&i->page_matrix,0,0); } } @@ -2153,20 +2158,21 @@ static void drawimage(struct swfoutput*obj, int bitid, int sizex,int sizey, /* shape */ myshapeid = ++i->currentswfid; i->tag = swf_InsertTag(i->tag,ST_DEFINESHAPE); - swf_ShapeNew(&i->shape); + SHAPE*shape; + swf_ShapeNew(&shape); //lsid = ShapeAddLineStyle(shape,linewidth,&obj->strokergb); //fsid = ShapeAddSolidFillStyle(shape,&obj->fillrgb); - fsid = swf_ShapeAddBitmapFillStyle(i->shape,&m,bitid,1); + fsid = swf_ShapeAddBitmapFillStyle(shape,&m,bitid,1); swf_SetU16(i->tag, myshapeid); r.xmin = (int)(xmin*20); r.ymin = (int)(ymin*20); r.xmax = (int)(xmax*20); r.ymax = (int)(ymax*20); swf_SetRect(i->tag,&r); - swf_SetShapeStyles(i->tag,i->shape); - swf_ShapeCountBits(i->shape,NULL,NULL); - swf_SetShapeBits(i->tag,i->shape); - swf_ShapeSetAll(i->tag,i->shape,/*x*/0,/*y*/0,lsid,fsid,0); + swf_SetShapeStyles(i->tag,shape); + swf_ShapeCountBits(shape,NULL,NULL); + swf_SetShapeBits(i->tag,shape); + swf_ShapeSetAll(i->tag,shape,/*x*/0,/*y*/0,lsid,fsid,0); i->swflastx = i->swflasty = 0; moveto(obj, i->tag, p1); lineto(obj, i->tag, p2); @@ -2180,10 +2186,12 @@ static void drawimage(struct swfoutput*obj, int bitid, int sizex,int sizey, ShapeSetLine (tag, shape, 0,-y*20); ShapeSetLine (tag, shape, -x*20,0);*/ swf_ShapeSetEnd(i->tag); + swf_ShapeFree(shape); /* instance */ i->tag = swf_InsertTag(i->tag,ST_PLACEOBJECT2); - swf_ObjectPlace(i->tag,myshapeid,/*depth*/i->depth++,NULL,NULL,NULL); + + swf_ObjectPlace(i->tag,myshapeid,/*depth*/i->depth++,&i->page_matrix,NULL,NULL); } int swfoutput_drawimagejpeg_old(struct swfoutput*obj, char*filename, int sizex,int sizey, @@ -2203,7 +2211,7 @@ int swfoutput_drawimagejpeg_old(struct swfoutput*obj, char*filename, int sizex,i oldtag = i->tag; i->tag = swf_InsertTag(i->tag,ST_DEFINEBITSJPEG2); swf_SetU16(i->tag, bitid); - if(swf_SetJPEGBits(i->tag, filename, config.jpegquality)<0) { + if(swf_SetJPEGBits(i->tag, filename, config_jpegquality)<0) { swf_DeleteTag(i->tag); i->tag = oldtag; return -1; @@ -2232,7 +2240,7 @@ int swfoutput_drawimagejpeg(struct swfoutput*obj, RGBA*mem, int sizex,int sizey, oldtag = i->tag; i->tag = swf_InsertTag(i->tag,ST_DEFINEBITSJPEG2); swf_SetU16(i->tag, bitid); - swf_SetJPEGBits2(i->tag,sizex,sizey,mem,config.jpegquality); + swf_SetJPEGBits2(i->tag,sizex,sizey,mem,config_jpegquality); drawimage(obj, bitid, sizex, sizey, x1,y1,x2,y2,x3,y3,x4,y4); return bitid; } @@ -2329,42 +2337,42 @@ void swfoutput_drawimageagain(struct swfoutput*obj, int id, int sizex,int sizey, void swfoutput_setparameter(char*name, char*value) { if(!strcmp(name, "drawonlyshapes")) { - config.drawonlyshapes = atoi(value); + config_drawonlyshapes = atoi(value); } else if(!strcmp(name, "ignoredraworder")) { - config.ignoredraworder = atoi(value); + config_ignoredraworder = atoi(value); } else if(!strcmp(name, "filloverlap")) { - config.filloverlap = atoi(value); + config_filloverlap = atoi(value); } else if(!strcmp(name, "linksopennewwindow")) { - config.opennewwindow = atoi(value); + config_opennewwindow = atoi(value); } else if(!strcmp(name, "opennewwindow")) { - config.opennewwindow = atoi(value); + config_opennewwindow = atoi(value); } else if(!strcmp(name, "storeallcharacters")) { - config.storeallcharacters = atoi(value); + config_storeallcharacters = atoi(value); } else if(!strcmp(name, "enablezlib")) { - config.enablezlib = atoi(value); + config_enablezlib = atoi(value); } else if(!strcmp(name, "insertstop")) { - config.insertstoptag = atoi(value); + config_insertstoptag = atoi(value); } else if(!strcmp(name, "protected")) { - config.protect = atoi(value); + config_protect = atoi(value); } else if(!strcmp(name, "flashversion")) { - config.flashversion = atoi(value); + config_flashversion = atoi(value); } else if(!strcmp(name, "minlinewidth")) { - config.minlinewidth = atof(value); + config_minlinewidth = atof(value); } else if(!strcmp(name, "jpegquality")) { int val = atoi(value); if(val<0) val=0; if(val>100) val=100; - config.jpegquality = val; + config_jpegquality = val; } else if(!strcmp(name, "splinequality")) { int v = atoi(value); v = 500-(v*5); // 100% = 0.25 pixel, 0% = 25 pixel if(v<1) v = 1; - config.splinemaxerror = v; + config_splinemaxerror = v; } else if(!strcmp(name, "fontquality")) { int v = atoi(value); v = 500-(v*5); // 100% = 0.25 pixel, 0% = 25 pixel if(v<1) v = 1; - config.fontsplinemaxerror = v; + config_fontsplinemaxerror = v; } else { fprintf(stderr, "unknown parameter: %s (=%s)\n", name, value); }