X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=pdf2swf%2FSWFOutputDev.cc;h=193dd44898c5e22d1bf94e51dd874571114d9e4f;hb=813c13d3a6050b4f081356b3f4b7edc3282c1162;hp=070e34aa9debef17a95bd2a4b5a48c25c4c3703f;hpb=8fd13edea1571f100db08fc5c19d08808a6ead1b;p=swftools.git diff --git a/pdf2swf/SWFOutputDev.cc b/pdf2swf/SWFOutputDev.cc index 070e34a..193dd44 100644 --- a/pdf2swf/SWFOutputDev.cc +++ b/pdf2swf/SWFOutputDev.cc @@ -22,7 +22,9 @@ #include #include #include +#include "../config.h" //xpdf header files +#include "config.h" #include "gfile.h" #include "GString.h" #include "gmem.h" @@ -35,7 +37,6 @@ #include "Page.h" #include "PDFDoc.h" #include "Error.h" -#include "config.h" #include "OutputDev.h" #include "GfxState.h" #include "GfxFont.h" @@ -64,6 +65,8 @@ int*pages = 0; int pagebuflen = 0; int pagepos = 0; +double caplinewidth = 3.0; + static void printInfoString(Dict *infoDict, char *key, char *fmt); static void printInfoDate(Dict *infoDict, char *key, char *fmt); @@ -160,6 +163,8 @@ public: virtual void updateFillColor(GfxState *state); virtual void updateStrokeColor(GfxState *state); virtual void updateLineWidth(GfxState *state); + virtual void updateLineJoin(GfxState *state); + virtual void updateLineCap(GfxState *state); virtual void updateAll(GfxState *state) { @@ -167,6 +172,8 @@ public: updateFillColor(state); updateStrokeColor(state); updateLineWidth(state); + updateLineJoin(state); + updateLineCap(state); }; //----- path painting @@ -441,6 +448,14 @@ T1_OUTLINE* gfxPath_to_T1_OUTLINE(GfxState*state, GfxPath*path) bezierpathsegment*outline = start = new bezierpathsegment(); int cpos = 0; double lastx=0,lasty=0; + if(!num) { + logf(" empty path"); + outline->type = T1_PATHTYPE_MOVE; + outline->dest.x = 0; + outline->dest.y = 0; + outline->link = 0; + return (T1_OUTLINE*)outline; + } for(t = 0; t < num; t++) { GfxSubpath *subpath = path->getSubpath(t); int subnum = subpath->getNumPoints(); @@ -500,12 +515,40 @@ void SWFOutputDev::stroke(GfxState *state) { logf(" stroke\n"); GfxPath * path = state->getPath(); + int lineCap = state->getLineCap(); // 0=butt, 1=round 2=square + int lineJoin = state->getLineJoin(); // 0=miter, 1=round 2=bevel + double miterLimit = state->getMiterLimit(); + double width = state->getTransformedLineWidth(); struct swfmatrix m; + GfxRGB rgb; + double opaq = state->getStrokeOpacity(); + state->getStrokeRGB(&rgb); + m.m11 = 1; m.m21 = 0; m.m22 = 1; m.m12 = 0; m.m13 = 0; m.m23 = 0; T1_OUTLINE*outline = gfxPath_to_T1_OUTLINE(state, path); - swfoutput_setdrawmode(&output, DRAWMODE_STROKE); - swfoutput_drawpath(&output, outline, &m); + + lineJoin = 1; // other line joins are not yet supported by the swf encoder + // TODO: support bevel joints + + if(((lineCap==1) && (lineJoin==1)) || width<=caplinewidth) { + /* FIXME- if the path is smaller than 2 segments, we could ignore + lineJoin */ + swfoutput_setdrawmode(&output, DRAWMODE_STROKE); + swfoutput_drawpath(&output, outline, &m); + } else { + swfoutput_setfillcolor(&output, (char)(rgb.r*255), (char)(rgb.g*255), + (char)(rgb.b*255), (char)(opaq*255)); + + //swfoutput_setlinewidth(&output, 1.0); //only for debugging + //swfoutput_setstrokecolor(&output, 0, 255, 0, 255); //likewise, see below + //swfoutput_setfillcolor(&output, 255, 0, 0, 255); //likewise, see below + + swfoutput_drawpath2poly(&output, outline, &m, lineJoin, lineCap, width, miterLimit); + updateLineWidth(state); //reset + updateStrokeColor(state); //reset + updateFillColor(state); //reset + } } void SWFOutputDev::fill(GfxState *state) { @@ -880,7 +923,7 @@ int SWFOutputDev::searchT1Font(char*name) } if(fontname && !strcmp(name, fontname)) { - logf(" Extra font %s is being used.\n", fontname); + logf(" Extra font %d, \"%s\" is being used.\n", i, fontname); return i; } fontname = T1_GetFontFileName(i); @@ -888,7 +931,7 @@ int SWFOutputDev::searchT1Font(char*name) fontname = strrchr(fontname,'/')+1; if(strstr(fontname, name)) { - logf(" Extra font %s is being used.\n", fontname); + logf(" Extra font %d, \"%s\" is being used.\n", i, fontname); return i; } } @@ -902,6 +945,16 @@ void SWFOutputDev::updateLineWidth(GfxState *state) swfoutput_setlinewidth(&output, width); } +void SWFOutputDev::updateLineCap(GfxState *state) +{ + int c = state->getLineCap(); +} + +void SWFOutputDev::updateLineJoin(GfxState *state) +{ + int j = state->getLineJoin(); +} + void SWFOutputDev::updateFillColor(GfxState *state) { GfxRGB rgb; @@ -964,8 +1017,30 @@ char*SWFOutputDev::writeEmbeddedFontToFile(XRef*ref, GfxFont*font) refObj.fetch(ref, &strObj); refObj.free(); strObj.streamReset(); - while ((c = strObj.streamGetChar()) != EOF) { - fputc(c, f); + int f4[4]; + char f4c[4]; + int t; + for(t=0;t<4;t++) { + f4[t] = strObj.streamGetChar(); + f4c[t] = (char)f4[t]; + if(f4[t] == EOF) + break; + } + if(t==4) { + if(!strncmp(f4c, "true", 4)) { + /* some weird TTF fonts don't start with 0,1,0,0 but with "true". + Change this on the fly */ + f4[0] = f4[2] = f4[3] = 0; + f4[1] = 1; + } + fputc(f4[0], f); + fputc(f4[1], f); + fputc(f4[2], f); + fputc(f4[3], f); + + while ((c = strObj.streamGetChar()) != EOF) { + fputc(c, f); + } } strObj.streamClose(); strObj.free(); @@ -1018,6 +1093,7 @@ char* SWFOutputDev::substituteFont(GfxFont*gfxFont, char* oldname) /* ------------------------------ V1 */ char*fontname = "Times-Roman"; + logf(" substituteFont(,%s)", FIXNULL(oldname)); this->t1id = searchT1Font(fontname); if(substitutepos>=sizeof(substitutesource)/sizeof(char*)) { logf(" Too many fonts in file."); @@ -1230,12 +1306,15 @@ void SWFOutputDev::updateFont(GfxState *state) if(fontname) { int newt1id = searchT1Font(fontname); if(newt1id<0) { + showFontError(gfxFont,1); fontname = substituteFont(gfxFont, fontname); } else this->t1id = newt1id; } - else + else { + showFontError(gfxFont,1); fontname = substituteFont(gfxFont, fontname); + } } if(t1id<0) { @@ -1702,6 +1781,46 @@ void pdfswf_init(char*filename, char*userPassword) output->startDoc(doc->getXRef()); } +void pdfswf_setparameter(char*name, char*value) +{ + if(!strcmp(name, "drawonlyshapes")) { + drawonlyshapes = atoi(value); + } else if(!strcmp(name, "ignoredraworder")) { + ignoredraworder = atoi(value); + } else if(!strcmp(name, "linksopennewwindow")) { + opennewwindow = atoi(value); + } else if(!strcmp(name, "storeallcharacters")) { + storeallcharacters = atoi(value); + } else if(!strcmp(name, "enablezlib")) { + enablezlib = atoi(value); + } else if(!strcmp(name, "insertstop")) { + insertstoptag = atoi(value); + } else if(!strcmp(name, "flashversion")) { + flashversion = atoi(value); + } else if(!strcmp(name, "jpegquality")) { + int val = atoi(value); + if(val<0) val=0; + if(val>100) val=100; + jpegquality = val; + } else if(!strcmp(name, "outputfilename")) { + swffilename = value; + } else if(!strcmp(name, "caplinewidth")) { + caplinewidth = atof(value); + } 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; + 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; + fontsplinemaxerror = v; + } else { + fprintf(stderr, "unknown parameter: %s (=%s)\n", name, value); + } +} + void pdfswf_drawonlyshapes() { drawonlyshapes = 1; @@ -1739,6 +1858,16 @@ void pdfswf_setoutputfilename(char*_filename) swffilename = _filename; } +void pdfswf_insertstop() +{ + insertstoptag = 1; +} + +void pdfswf_setversion(int n) +{ + flashversion = n; +} + void pdfswf_convertpage(int page) { @@ -1770,17 +1899,6 @@ int pdfswf_numpages() { return doc->getNumPages(); } - -void pdfswf_insertstop() -{ - insertstoptag = 1; -} - -void pdfswf_setversion(int n) -{ - flashversion = n; -} - int closed=0; void pdfswf_close() {