X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=pdf2swf%2FSWFOutputDev.cc;h=10e0ffe4ce43afaff2890b4ab3324301a7f8e514;hb=07acff35bba49807c780b18aa2ed11d7417409d7;hp=73711af52ae00c54c6fe480e09057e0839d53a4c;hpb=41e2677f86bb98be45f5cf8d82abbb3b95e5f043;p=swftools.git diff --git a/pdf2swf/SWFOutputDev.cc b/pdf2swf/SWFOutputDev.cc index 73711af..10e0ffe 100644 --- a/pdf2swf/SWFOutputDev.cc +++ b/pdf2swf/SWFOutputDev.cc @@ -22,8 +22,9 @@ #include #include #include -#include +#include "../config.h" //xpdf header files +#include "config.h" #include "gfile.h" #include "GString.h" #include "gmem.h" @@ -36,10 +37,11 @@ #include "Page.h" #include "PDFDoc.h" #include "Error.h" -#include "config.h" #include "OutputDev.h" #include "GfxState.h" #include "GfxFont.h" +#include "CharCodeToUnicode.h" +#include "NameToUnicodeTable.h" #include "FontFile.h" #include "GlobalParams.h" //swftools header files @@ -49,6 +51,10 @@ extern "C" { #include "ttf2pt1.h" } +#define logf logarithmf // logf is also used by ../lib/log.h +#include +#undef logf + static PDFDoc*doc = 0; static char* swffilename = 0; int numpages; @@ -436,6 +442,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(); @@ -578,35 +592,57 @@ int charcounter = 0; void SWFOutputDev::drawChar(GfxState *state, double x, double y, double dx, double dy, double originX, double originY, - CharCode c, Unicode *u, int uLen) + CharCode c, Unicode *_u, int uLen) { logf(" drawChar(%f,%f,%f,%f,'%c')\n",x,y,dx,dy,c); + // check for invisible text -- this is used by Acrobat Capture - if ((state->getRender() & 3) != 3) - { - GfxFont*font = state->getFont(); - Gfx8BitFont*font8; - if(font->isCIDFont()) { - logf(" CID Font"); - return; - } - if(font->getType() == fontType3) { - /* type 3 chars are passed primarily as graphics */ - return; - } - font8 = (Gfx8BitFont*)font; - - char**enc=font8->getEncoding(); - - double x1,y1; - x1 = x; - y1 = y; - state->transform(x, y, &x1, &y1); - - if(enc[c]) - swfoutput_drawchar(&output, x1, y1, enc[c], c); - else - logf(" couldn't get name for character %02x from Encoding", c); + if ((state->getRender() & 3) == 3) + return; + + GfxFont*font = state->getFont(); + + if(font->getType() == fontType3) { + /* type 3 chars are passed primarily as graphics */ + return; + } + double x1,y1; + x1 = x; + y1 = y; + state->transform(x, y, &x1, &y1); + + if(font->isCIDFont()) { + GfxCIDFont*cfont = (GfxCIDFont*)font; + Unicode u=0; + char*name=0; + if(_u) + u = *_u; + if(u) { + int t; + for(t=0;tgetName()->getCString(), + cfont->getType());*/ + + if(name) + swfoutput_drawchar(&output, x1, y1, name, c); + else + logf(" couldn't get name for CID character %02x from Encoding", c); + } else { + Gfx8BitFont*font8; + font8 = (Gfx8BitFont*)font; + char**enc=font8->getEncoding(); + + if(enc && enc[c]) + swfoutput_drawchar(&output, x1, y1, enc[c], c); + else { + logf(" couldn't get name for character %02x from Encoding", c); + } } } @@ -716,24 +752,27 @@ void SWFOutputDev::drawLink(Link *link, Catalog *catalog) LinkNamed*l = (LinkNamed*)action; GString*name = l->getName(); if(name) { - s = name->lowerCase()->getCString(); - named = name->getCString(); - if(strstr(s, "next") || strstr(s, "forward")) - { - page = currentpage + 1; - } - else if(strstr(s, "prev") || strstr(s, "back")) - { - page = currentpage - 1; - } - else if(strstr(s, "last") || strstr(s, "end")) - { - page = pages[pagepos-1]; //:) - } - else if(strstr(s, "first") || strstr(s, "top")) - { - page = 1; - } + s = name->lowerCase()->getCString(); + named = name->getCString(); + if(!strchr(s,':')) + { + if(strstr(s, "next") || strstr(s, "forward")) + { + page = currentpage + 1; + } + else if(strstr(s, "prev") || strstr(s, "back")) + { + page = currentpage - 1; + } + else if(strstr(s, "last") || strstr(s, "end")) + { + page = pages[pagepos-1]; //:) + } + else if(strstr(s, "first") || strstr(s, "top")) + { + page = 1; + } + } } } break; @@ -819,6 +858,7 @@ int SWFOutputDev::searchT1Font(char*name) int i; int mapid=-1; char*filename=0; + for(i=0;i Loading extra font %s from %s\n", FIXNULL(fontname), FIXNULL(T1_GetFontFileName(i))); } + 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); @@ -856,7 +897,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; } } @@ -905,6 +946,7 @@ char*SWFOutputDev::writeEmbeddedFontToFile(XRef*ref, GfxFont*font) ret = font->getEmbeddedFontID(&embRef); if(!ret) { + logf(" Didn't get embedded font id"); /* not embedded- the caller should now search the font directories for this font */ return 0; @@ -931,15 +973,38 @@ 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(); } fclose(f); - if(font->getType() == fontTrueType) + if(font->getType() == fontTrueType || + font->getType() == fontCIDType2) { if(!ttfinfo) { logf(" File contains TrueType fonts"); @@ -984,6 +1049,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."); @@ -1162,11 +1228,11 @@ void SWFOutputDev::updateFont(GfxState *state) Ref embRef; GBool embedded = gfxFont->getEmbeddedFontID(&embRef); if(embedded) { - if (!gfxFont->isCIDFont() && - (gfxFont->getType() == fontType1 || - gfxFont->getType() == fontType1C || - gfxFont->getType() == fontTrueType)) { - + if (gfxFont->getType() == fontType1 || + gfxFont->getType() == fontType1C || + gfxFont->getType() == fontTrueType || + gfxFont->getType() == fontCIDType2) + { fileName = writeEmbeddedFontToFile(xref, gfxFont); if(!fileName) { logf(" Couldn't write font to file"); @@ -1182,19 +1248,29 @@ void SWFOutputDev::updateFont(GfxState *state) } } else { - showFontError(gfxFont,0); - fontname = substituteFont(gfxFont, fontname); + /* in case the font is embedded, but has an + unsupported format, we just look through the + font directories */ + int newt1id = searchT1Font(fontname); + if(newt1id<0) { + showFontError(gfxFont,0); + fontname = substituteFont(gfxFont, fontname); + } else + this->t1id = newt1id; } } else { 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) { @@ -1735,6 +1811,11 @@ void pdfswf_insertstop() insertstoptag = 1; } +void pdfswf_setversion(int n) +{ + flashversion = n; +} + int closed=0; void pdfswf_close() {