X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=pdf2swf%2FSWFOutputDev.cc;h=0357f50dbbd23d05453c230db32bd164a2474caf;hb=5fc373d518344e738a735a2d0c08fdf8273623e1;hp=64d07da5639872445948472451876d0d9eb2c8e3;hpb=16ad05687b928ff8071118d69dc0e2bf52c7872f;p=swftools.git diff --git a/pdf2swf/SWFOutputDev.cc b/pdf2swf/SWFOutputDev.cc index 64d07da..0357f50 100644 --- a/pdf2swf/SWFOutputDev.cc +++ b/pdf2swf/SWFOutputDev.cc @@ -34,13 +34,13 @@ #include "Catalog.h" #include "Page.h" #include "PDFDoc.h" -#include "Params.h" #include "Error.h" #include "config.h" #include "OutputDev.h" #include "GfxState.h" #include "GfxFont.h" #include "FontFile.h" +#include "GlobalParams.h" //swftools header files #include "swfoutput.h" extern "C" { @@ -131,9 +131,13 @@ public: // Does this device use drawChar() or drawString()? virtual GBool useDrawChar(); + + virtual GBool interpretType3Chars() {return gFalse;} //----- initialization and control + void startDoc(XRef *xref); + // Start a page. virtual void startPage(int pageNum, GfxState *state) ; @@ -172,9 +176,9 @@ public: virtual void beginString(GfxState *state, GString *s) ; virtual void endString(GfxState *state) ; virtual void drawChar(GfxState *state, double x, double y, - double dx, double dy, Guchar c) ; - virtual void drawChar16(GfxState *state, double x, double y, - double dx, double dy, int c) ; + double dx, double dy, + double originX, double originY, + CharCode code, Unicode *u, int uLen); //----- image drawing virtual void drawImageMask(GfxState *state, Object *ref, Stream *str, @@ -182,7 +186,7 @@ public: GBool inlineImg); virtual void drawImage(GfxState *state, Object *ref, Stream *str, int width, int height, GfxImageColorMap *colorMap, - GBool inlineImg); + int *maskColors, GBool inlineImg); private: void drawGeneralImage(GfxState *state, Object *ref, Stream *str, @@ -191,9 +195,11 @@ public: int clipping[64]; int clippos; + XRef*xref; + int searchT1Font(char*name); char* substituteFont(GfxFont*gfxFont, char*oldname); - char* writeEmbeddedFontToFile(GfxFont*font); + char* writeEmbeddedFontToFile(XRef*ref, GfxFont*font); int t1id; int jpeginfo; // did we write "File contains jpegs" yet? int pbminfo; // did we write "File contains jpegs" yet? @@ -319,15 +325,15 @@ int lastdumppos = 0; */ void showFontError(GfxFont*font, int nr) { - Ref r=font->getID(); + Ref*r=font->getID(); int t; for(t=0;tnum) break; if(t < lastdumppos) return; if(lastdumpposnum; if(nr == 0) logf(" The following font caused problems:"); else if(nr == 1) @@ -340,24 +346,22 @@ void showFontError(GfxFont*font, int nr) void dumpFontInfo(char*loglevel, GfxFont*font) { GString *gstr; - char*name; + char*name = 0; gstr = font->getName(); - Ref r=font->getID(); - logf("%s=========== %s (ID:%d,%d) ==========\n", loglevel, gstr?FIXNULL(gstr->getCString()):"(unknown font)", r.num,r.gen); + Ref* r=font->getID(); + logf("%s=========== %s (ID:%d,%d) ==========\n", loglevel, gstr?FIXNULL(gstr->getCString()):"(unknown font)", r->num,r->gen); gstr = font->getTag(); if(gstr) logf("%sTag: %s\n", loglevel, FIXNULL(gstr->getCString())); - if(font->is16Bit()) logf("%sis 16 bit\n", loglevel); + + if(font->isCIDFont()) logf("%sis CID font\n", loglevel); GfxFontType type=font->getType(); switch(type) { case fontUnknownType: logf("%sType: unknown\n",loglevel); break; - case fontType0: - logf("%sType: 0\n",loglevel); - break; case fontType1: logf("%sType: 1\n",loglevel); break; @@ -370,11 +374,21 @@ void dumpFontInfo(char*loglevel, GfxFont*font) case fontTrueType: logf("%sType: TrueType\n",loglevel); break; + case fontCIDType0: + logf("%sType: CIDType0\n",loglevel); + break; + case fontCIDType0C: + logf("%sType: CIDType0C\n",loglevel); + break; + case fontCIDType2: + logf("%sType: CIDType2\n",loglevel); + break; } Ref embRef; GBool embedded = font->getEmbeddedFontID(&embRef); - name = font->getEmbeddedFontName(); + if(font->getEmbeddedFontName()) + name = font->getEmbeddedFontName()->getCString(); if(embedded) logf("%sEmbedded name: %s id: %d\n",loglevel, FIXNULL(name), embRef.num); @@ -402,6 +416,7 @@ SWFOutputDev::SWFOutputDev() clippos = 0; clipping[clippos] = 0; outputstarted = 0; + xref = 0; // printf("SWFOutputDev::SWFOutputDev() \n"); }; @@ -552,32 +567,37 @@ void SWFOutputDev::beginString(GfxState *state, GString *s) } int charcounter = 0; -void SWFOutputDev::drawChar(GfxState *state, double x, double y, double dx, double dy, Guchar c) +void SWFOutputDev::drawChar(GfxState *state, double x, double y, + double dx, double dy, + double originX, double originY, + 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) { - FontEncoding*enc=state->getFont()->getEncoding(); + GfxFont*font = state->getFont(); + Gfx8BitFont*font8; + if(font->isCIDFont()) { + logf(" CID Font"); + return; + } + font8 = (Gfx8BitFont*)font; + + char**enc=font8->getEncoding(); double x1,y1; x1 = x; y1 = y; state->transform(x, y, &x1, &y1); - if(enc->getCharName(c)) - swfoutput_drawchar(&output, x1, y1, enc->getCharName(c), c); + if(enc[c]) + swfoutput_drawchar(&output, x1, y1, enc[c], c); else logf(" couldn't get name for character %02x from Encoding", c); } } -void SWFOutputDev::drawChar16(GfxState *state, double x, double y, double dx, double dy, int c) -{ - printf(" drawChar16(%f,%f,%f,%f,%08x)\n",x,y,dx,dy,c); - exit(1); -} - void SWFOutputDev::endString(GfxState *state) { logf(" endstring\n"); @@ -841,38 +861,45 @@ void SWFOutputDev::updateStrokeColor(GfxState *state) (char)(rgb.b*255), (char)(opaq*255)); } -char*SWFOutputDev::writeEmbeddedFontToFile(GfxFont*font) +char*SWFOutputDev::writeEmbeddedFontToFile(XRef*ref, GfxFont*font) { char*tmpFileName = NULL; FILE *f; int c; char *fontBuf; int fontLen; - Type1CFontConverter *cvt; + Type1CFontFile *cvt; Ref embRef; Object refObj, strObj; tmpFileName = "/tmp/tmpfont"; - font->getEmbeddedFontID(&embRef); + int ret; + + ret = font->getEmbeddedFontID(&embRef); + if(!ret) { + /* not embedded- the caller should now search the font + directories for this font */ + return 0; + } f = fopen(tmpFileName, "wb"); if (!f) { logf(" Couldn't create temporary Type 1 font file"); - return 0; + return 0; } if (font->getType() == fontType1C) { - if (!(fontBuf = font->readEmbFontFile(&fontLen))) { + if (!(fontBuf = font->readEmbFontFile(xref, &fontLen))) { fclose(f); logf(" Couldn't read embedded font file"); return 0; } - cvt = new Type1CFontConverter(fontBuf, fontLen, f); - cvt->convert(); + cvt = new Type1CFontFile(fontBuf, fontLen); + cvt->convertToType1(f); delete cvt; gfree(fontBuf); } else { font->getEmbeddedFontID(&embRef); refObj.initRef(embRef.num, embRef.gen); - refObj.fetch(&strObj); + refObj.fetch(ref, &strObj); refObj.free(); strObj.streamReset(); while ((c = strObj.streamGetChar()) != EOF) { @@ -901,7 +928,7 @@ char*SWFOutputDev::writeEmbeddedFontToFile(GfxFont*font) tmpFileName = strdup(name2); } - return tmpFileName; + return tmpFileName; } char* gfxFontName(GfxFont* gfxFont) @@ -913,8 +940,8 @@ char* gfxFontName(GfxFont* gfxFont) } else { char buf[32]; - Ref r=gfxFont->getID(); - sprintf(buf, "UFONT%d", r.num); + Ref*r=gfxFont->getID(); + sprintf(buf, "UFONT%d", r->num); return strdup(buf); } } @@ -925,7 +952,25 @@ int substitutepos = 0; char* SWFOutputDev::substituteFont(GfxFont*gfxFont, char* oldname) { - //substitute font +/* ------------------------------ V1 */ + + char*fontname = "Times-Roman"; + this->t1id = searchT1Font(fontname); + if(substitutepos>=sizeof(substitutesource)/sizeof(char*)) { + logf(" Too many fonts in file."); + exit(1); + } + if(oldname) { + substitutesource[substitutepos] = oldname; + substitutetarget[substitutepos] = fontname; + logf(" substituting %s -> %s", FIXNULL(oldname), FIXNULL(fontname)); + substitutepos ++; + } + return fontname; + +/* ------------------------------ V2 */ + +/* //substitute font char* fontname = 0; double m11, m12, m21, m22; int index; @@ -939,7 +984,7 @@ char* SWFOutputDev::substituteFont(GfxFont*gfxFont, char* oldname) // printf("%d %s\n", t, gfxFont->getCharName(t)); showFontError(gfxFont, 1); - if (!gfxFont->is16Bit()) { + if(1) { //if (!gfxFont->isCIDFont()) { FIXME: xpdf 1.01 does not have is16Bit() if(gfxFont->isSymbolic()) { if(fontname && (strstr(fontname,"ing"))) //Dingbats, Wingdings etc. index = 16; @@ -1009,7 +1054,7 @@ char* SWFOutputDev::substituteFont(GfxFont*gfxFont, char* oldname) logf(" substituting %s -> %s", FIXNULL(oldname), FIXNULL(fontname)); substitutepos ++; } - return fontname; + return fontname;*/ } void unlinkfont(char* filename) @@ -1041,6 +1086,12 @@ void unlinkfont(char* filename) } } +void SWFOutputDev::startDoc(XRef *xref) +{ + this->xref = xref; +} + + void SWFOutputDev::updateFont(GfxState *state) { GfxFont*gfxFont = state->getFont(); @@ -1052,6 +1103,9 @@ void SWFOutputDev::updateFont(GfxState *state) char * fontname = gfxFontName(gfxFont); int t; + /* first, look if we substituted this font before- + this way, we don't initialize the T1 Fonts + too often */ for(t=0;t", gfxFont); + + /* now either load the font, or find a substitution */ Ref embRef; GBool embedded = gfxFont->getEmbeddedFontID(&embRef); if(embedded) { - if (!gfxFont->is16Bit() && + if (!gfxFont->isCIDFont() && (gfxFont->getType() == fontType1 || gfxFont->getType() == fontType1C || gfxFont->getType() == fontTrueType)) { - fileName = writeEmbeddedFontToFile(gfxFont); + fileName = writeEmbeddedFontToFile(xref, gfxFont); if(!fileName) { logf(" Couldn't write font to file"); showFontError(gfxFont,0); @@ -1341,11 +1399,13 @@ void SWFOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str, } void SWFOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, - int width, int height, - GfxImageColorMap *colorMap, GBool inlineImg) + int width, int height, GfxImageColorMap *colorMap, + int *maskColors, GBool inlineImg) { - logf(" drawImage %dx%d, %s, inline=%d", width, height, - colorMap?"colorMap":"no colorMap", inlineImg); + logf(" drawImage %dx%d, %s %s, inline=%d", width, height, + colorMap?"colorMap":"no colorMap", + maskColors?"maskColors":"no maskColors", + inlineImg); if(colorMap) logf(" colorMap pixcomps:%d bits:%d mode:%d\n", colorMap->getNumPixelComps(), colorMap->getBits(),colorMap->getColorSpace()->getMode()); @@ -1401,14 +1461,11 @@ void pdfswf_init(char*filename, char*userPassword) GString *fileName = new GString(filename); GString *userPW; Object info; - // init error file - errorInit(); // read config file - initParams(xpdfConfigFile); + globalParams = new GlobalParams(""); // open PDF file - xref = NULL; if (userPassword && userPassword[0]) { userPW = new GString(userPassword); } else { @@ -1470,6 +1527,7 @@ void pdfswf_init(char*filename, char*userPassword) output = new SWFOutputDev(); + output->startDoc(doc->getXRef()); } void pdfswf_drawonlyshapes() @@ -1547,7 +1605,7 @@ void pdfswf_close() logf(" pdfswf.cc: pdfswf_close()"); delete output; delete doc; - freeParams(); + //freeParams(); // check for memory leaks Object::memCheck(stderr); gMemReport(stderr);