X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=pdf2swf%2FSWFOutputDev.cc;h=c1d9548a09025118208c08053936f0d3a0e125ca;hb=2a022ef62bce6268cbcbde6d5ffbc14d037713d9;hp=766bd6be544f1af23ff727a2dd6fd8902409e055;hpb=fc554a43712b76d16b41ec77dd311b4a78b1ef6b;p=swftools.git diff --git a/pdf2swf/SWFOutputDev.cc b/pdf2swf/SWFOutputDev.cc index 766bd6b..c1d9548 100644 --- a/pdf2swf/SWFOutputDev.cc +++ b/pdf2swf/SWFOutputDev.cc @@ -21,6 +21,7 @@ #include #include #include +#include //xpdf header files #include "GString.h" #include "gmem.h" @@ -45,7 +46,7 @@ extern "C" { #include "../lib/log.h" } -static char* filename = 0; +static char* swffilename = 0; static void printInfoString(Dict *infoDict, char *key, char *fmt); static void printInfoDate(Dict *infoDict, char *key, char *fmt); @@ -216,12 +217,16 @@ public: GBool inlineImg); private: + void drawGeneralImage(GfxState *state, Object *ref, Stream *str, + int width, int height, GfxImageColorMap*colorMap, GBool invert, + GBool inlineImg, int mask); int clipping[32]; int clippos; int setT1Font(char*name,FontEncoding*enc); - int initT1Font(int id, FontEncoding*encoding); int t1id; + int jpeginfo; // did we write "Page contains jpegs" yet? + int pbminfo; // did we write "Page contains jpegs" yet? }; char mybuf[1024]; @@ -365,7 +370,7 @@ void dumpFontInfo(char*loglevel, GfxFont*font) char*name; gstr = font->getName(); Ref r=font->getID(); - logf("%s=========== %s (ID:%d) ==========\n", loglevel, gstr?gstr->getCString():"(unknown font)", r.num); + logf("%s=========== %s (ID:%d,%d) ==========\n", loglevel, gstr?gstr->getCString():"(unknown font)", r.num,r.gen); gstr = font->getTag(); if(gstr) @@ -393,9 +398,12 @@ void dumpFontInfo(char*loglevel, GfxFont*font) logf("%sType: TrueType\n",loglevel); break; } + + Ref embRef; + GBool embedded = font->getEmbeddedFontID(&embRef); name = font->getEmbeddedFontName(); - if(name) - logf("%sEmbedded name: %s\n",loglevel, name); + if(embedded) + logf("%sEmbedded name: %s id: %d\n",loglevel, name, embRef.num); gstr = font->getExtFontFile(); if(gstr) @@ -485,55 +493,56 @@ T1_OUTLINE* gfxPath_to_T1_OUTLINE(GfxState*state, GfxPath*path) void SWFOutputDev::stroke(GfxState *state) { - logf(" %s stroke\n",gfxstate2str(state)); + logf(" stroke\n"); GfxPath * path = state->getPath(); struct swfmatrix m; m.m11 = 1; m.m21 = 0; m.m22 = 1; - m.m21 = 0; m.m13 = 0; m.m23 = 0; + 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); } void SWFOutputDev::fill(GfxState *state) { - logf(" %s fill\n",gfxstate2str(state)); + logf(" fill\n"); GfxPath * path = state->getPath(); struct swfmatrix m; m.m11 = 1; m.m21 = 0; m.m22 = 1; - m.m21 = 0; m.m13 = 0; m.m23 = 0; + m.m12 = 0; m.m13 = 0; m.m23 = 0; T1_OUTLINE*outline = gfxPath_to_T1_OUTLINE(state, path); swfoutput_setdrawmode(&output, DRAWMODE_FILL); swfoutput_drawpath(&output, outline, &m); } void SWFOutputDev::eoFill(GfxState *state) { - logf(" %s eofill\n",gfxstate2str(state)); + logf(" eofill\n"); GfxPath * path = state->getPath(); struct swfmatrix m; m.m11 = 1; m.m21 = 0; m.m22 = 1; - m.m21 = 0; m.m13 = 0; m.m23 = 0; + m.m12 = 0; m.m13 = 0; m.m23 = 0; T1_OUTLINE*outline = gfxPath_to_T1_OUTLINE(state, path); swfoutput_setdrawmode(&output, DRAWMODE_EOFILL); swfoutput_drawpath(&output, outline, &m); } void SWFOutputDev::clip(GfxState *state) { - logf(" %s clip\n",gfxstate2str(state)); + logf(" clip\n"); GfxPath * path = state->getPath(); struct swfmatrix m; - m.m11 = 1; m.m21 = 0; m.m22 = 1; - m.m21 = 0; m.m13 = 0; m.m23 = 0; + m.m11 = 1; m.m22 = 1; + m.m12 = 0; m.m21 = 0; + m.m13 = 0; m.m23 = 0; T1_OUTLINE*outline = gfxPath_to_T1_OUTLINE(state, path); swfoutput_startclip(&output, outline, &m); clipping[clippos] = 1; } void SWFOutputDev::eoClip(GfxState *state) { - logf(" %s eoclip\n",gfxstate2str(state)); + logf(" eoclip\n"); GfxPath * path = state->getPath(); struct swfmatrix m; m.m11 = 1; m.m21 = 0; m.m22 = 1; - m.m21 = 0; m.m13 = 0; m.m23 = 0; + m.m12 = 0; m.m13 = 0; m.m23 = 0; T1_OUTLINE*outline = gfxPath_to_T1_OUTLINE(state, path); swfoutput_startclip(&output, outline, &m); clipping[clippos] = 1; @@ -558,17 +567,17 @@ GBool SWFOutputDev::useDrawChar() void SWFOutputDev::beginString(GfxState *state, GString *s) { double m11,m21,m12,m22; - logf(" %s beginstring \"%s\"\n", gfxstate2str(state), s->getCString()); + logf(" beginstring \"%s\"\n", s->getCString()); state->getFontTransMat(&m11, &m12, &m21, &m22); m11 *= state->getHorizScaling(); m21 *= state->getHorizScaling(); - swfoutput_setfontmatrix(&output,m11,-m12,m21,-m22); + swfoutput_setfontmatrix(&output, m11, -m12, m21, -m22); } int charcounter = 0; void SWFOutputDev::drawChar(GfxState *state, double x, double y, double dx, double dy, Guchar c) { - logf(" %s drawChar(%f,%f,%f,%f,'%c')\n",gfxstate2str(state), x,y,dx,dy,c); + 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) { @@ -579,31 +588,33 @@ void SWFOutputDev::drawChar(GfxState *state, double x, double y, double dx, doub y1 = y; state->transform(x, y, &x1, &y1); - swfoutput_drawchar(&output, x1, y1, c); + swfoutput_drawchar(&output, x1, y1, enc->getCharName(c)); } } void SWFOutputDev::drawChar16(GfxState *state, double x, double y, double dx, double dy, int c) { - printf(" %s drawChar16(%f,%f,%f,%f,%08x)\n",gfxstate2str(state), x,y,dx,dy,c); + printf(" drawChar16(%f,%f,%f,%f,%08x)\n",x,y,dx,dy,c); exit(1); } void SWFOutputDev::endString(GfxState *state) { - logf(" %s endstring\n", gfxstate2str(state)); + logf(" endstring\n"); } void SWFOutputDev::startPage(int pageNum, GfxState *state) { double x1,y1,x2,y2; - logf(" %s, startPage %d\n", gfxstate2str(state), pageNum); + logf(" startPage %d\n", pageNum); logf(" processing page %d", pageNum); + jpeginfo = 0; + pbminfo = 0; state->transform(state->getX1(),state->getY1(),&x1,&y1); state->transform(state->getX2(),state->getY2(),&x2,&y2); if(!outputstarted) { - swfoutput_init(&output, filename, abs((int)(x2-x1)),abs((int)(y2-y1))); + swfoutput_init(&output, swffilename, abs((int)(x2-x1)),abs((int)(y2-y1))); outputstarted = 1; } else @@ -678,14 +689,14 @@ void SWFOutputDev::drawLink(Link *link, Catalog *catalog) } void SWFOutputDev::saveState(GfxState *state) { - logf(" %s saveState\n", gfxstate2str(state)); + logf(" saveState\n"); updateAll(state); clippos ++; clipping[clippos] = 0; }; void SWFOutputDev::restoreState(GfxState *state) { - logf(" %s restoreState\n", gfxstate2str(state)); + logf(" restoreState\n"); updateAll(state); if(clipping[clippos]) swfoutput_endclip(&output); @@ -722,45 +733,7 @@ int SWFOutputDev::setT1Font(char*name, FontEncoding*encoding) if(id<0) return 0; - initT1Font(id, encoding); -} - -int SWFOutputDev::initT1Font(int id, FontEncoding*encoding) -{ - int encStrSize; - char *encPtr; - int i; - T1_DeleteFont(id); - T1_LoadFont(id); - /* reencode the font: - * This is the only way to get the unmapped characters - * from t1lib - */ - encStrSize = 0; - for (i = 0; i < 256 && i < encoding->getSize(); ++i) { - if (encoding->getCharName(i)) { - encStrSize += strlen(encoding->getCharName(i)) + 1; - } - } - char**enc = (char **)gmalloc(257 * sizeof(char *)); - char*encStr = (char *)gmalloc(encStrSize * sizeof(char)); - encPtr = encStr; - for (i = 0; i < 256 && i < encoding->getSize(); ++i) { - if (encoding->getCharName(i)) { - strcpy(encPtr, encoding->getCharName(i)); - enc[i] = encPtr; - encPtr += strlen(encPtr) + 1; - } else { - enc[i] = ".notdef"; - } - } - for (; i < 256; ++i) { - enc[i] = ".notdef"; - } - enc[256] = "custom"; - int ret=T1_ReencodeFont(id, enc); - t1id = id; - return 1; + this->t1id = id; } void SWFOutputDev::updateLineWidth(GfxState *state) @@ -789,57 +762,37 @@ void SWFOutputDev::updateStrokeColor(GfxState *state) (char)(rgb.b*255), (char)(opaq*255)); } -void SWFOutputDev::updateFont(GfxState *state) { - double m11, m12, m21, m22; - char * fontname = 0; - GfxFont*gfxFont = state->getFont(); - char * filename; - - if (!gfxFont) { - return; - } - // look for Type 3 font - if (!type3Warning && gfxFont->getType() == fontType3) { - type3Warning = gTrue; - showFontError(gfxFont, 2); - } - //dumpFontInfo (gfxFont); - +char*writeEmbeddedFontToFile(GfxFont*font) +{ + char*tmpFileName = NULL; + char*fileName = NULL; + FILE *f; + int c; + char *fontBuf; + int fontLen; + Type1CFontConverter *cvt; + Ref embRef; + Object refObj, strObj; + tmpFileName = "/tmp/tmpfont"; + font->getEmbeddedFontID(&embRef); - Ref embRef; - GBool embedded = gfxFont->getEmbeddedFontID(&embRef); - if(embedded) { - char*tmpFileName = NULL; - char*fileName = NULL; - FILE *f; - char *fontBuf; - int fontLen; - Type1CFontConverter *cvt; - Ref embRef; - Object refObj, strObj; - int c; - if (!gfxFont->is16Bit() && - (gfxFont->getType() == fontType1 || - gfxFont->getType() == fontType1C) && - gfxFont->getEmbeddedFontID(&embRef)) { - tmpFileName = "tmpfont"; f = fopen(tmpFileName, "wb"); if (!f) { logf(" Couldn't create temporary Type 1 font file"); - return; + return 0; } - if (gfxFont->getType() == fontType1C) { - if (!(fontBuf = gfxFont->readEmbFontFile(&fontLen))) { + if (font->getType() == fontType1C) { + if (!(fontBuf = font->readEmbFontFile(&fontLen))) { fclose(f); logf(" Couldn't read embedded font file"); - return ; + return 0; } cvt = new Type1CFontConverter(fontBuf, fontLen, f); cvt->convert(); delete cvt; gfree(fontBuf); } else { - gfxFont->getEmbeddedFontID(&embRef); + font->getEmbeddedFontID(&embRef); refObj.initRef(embRef.num, embRef.gen); refObj.fetch(&strObj); refObj.free(); @@ -854,15 +807,67 @@ void SWFOutputDev::updateFont(GfxState *state) { fileName = tmpFileName; if(!fileName) { logf(" Embedded font writer didn't create a file"); - return ; + return 0; + } + return fileName; +} + +char* gfxFontName(GfxFont* gfxFont) +{ + GString *gstr; + gstr = gfxFont->getName(); + if(gstr) { + return gstr->getCString(); } + else { + char buf[32]; + Ref r=gfxFont->getID(); + sprintf(buf, "UFONT%d", r.num); + return strdup(buf); + } +} + +void SWFOutputDev::updateFont(GfxState *state) +{ + double m11, m12, m21, m22; + char * fontname = 0; + GfxFont*gfxFont = state->getFont(); + char * fileName = 0; + + if (!gfxFont) { + return; + } + + if(swfoutput_queryfont(&output, gfxFontName(gfxFont))) + { + swfoutput_setfont(&output, gfxFontName(gfxFont), -1, 0); + return; + } + + // look for Type 3 font + if (!type3Warning && gfxFont->getType() == fontType3) { + type3Warning = gTrue; + showFontError(gfxFont, 2); + } + //dumpFontInfo ("", gfxFont); + + Ref embRef; + GBool embedded = gfxFont->getEmbeddedFontID(&embRef); + if(embedded) { + if (!gfxFont->is16Bit() && + (gfxFont->getType() == fontType1 || + gfxFont->getType() == fontType1C)) { + + fileName = writeEmbeddedFontToFile(gfxFont); + if(!fileName) + return ; } else { showFontError(gfxFont,0); return ; } + t1id = T1_AddFont(fileName); - initT1Font(t1id, gfxFont->getEncoding()); } else { fontname = NULL; if(gfxFont->getName()) { @@ -934,12 +939,15 @@ void SWFOutputDev::updateFont(GfxState *state) { } } - swfoutput_setfont(&output,t1id); + swfoutput_setfont(&output,gfxFontName(gfxFont),t1id, fileName); + if(fileName) + unlink(fileName); } -void SWFOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str, - int width, int height, GBool invert, - GBool inlineImg) { +void SWFOutputDev::drawGeneralImage(GfxState *state, Object *ref, Stream *str, + int width, int height, GfxImageColorMap*colorMap, GBool invert, + GBool inlineImg, int mask) +{ FILE *fi; int c; char fileName[128]; @@ -949,9 +957,16 @@ void SWFOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str, state->transform(1, 0, &x3, &y3); state->transform(1, 1, &x4, &y4); - if (str->getKind() == strDCT) { + if (str->getKind() == strDCT && + (colorMap->getNumPixelComps() == 3 || !mask) ) + { sprintf(fileName, "/tmp/tmp%08x.jpg",lrand48()); - logf(" Found picture. Temporary storage is %s", fileName); + logf(" Found jpeg. Temporary storage is %s", fileName); + if(!jpeginfo) + { + logf(" Page contains jpeg pictures"); + jpeginfo = 1; + } if (!(fi = fopen(fileName, "wb"))) { logf(" Couldn't open temporary image file '%s'", fileName); return; @@ -962,40 +977,28 @@ void SWFOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str, fputc(c, fi); fclose(fi); swfoutput_drawimagefile(&output, fileName, width, height, x1,y1,x2,y2,x3,y3,x4,y4); + unlink(fileName); } else { - logf(" File contains pbm pictures."); + if(!pbminfo) + { + logf(" Page contains pbm pictures"); + pbminfo = 1; + } } } +void SWFOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str, + int width, int height, GBool invert, + GBool inlineImg) +{ + drawGeneralImage(state,ref,str,width,height,0,invert,inlineImg,1); +} + void SWFOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, int width, int height, - GfxImageColorMap *colorMap, GBool inlineImg) { - FILE *fi; - int c; - char fileName[128]; - double x1,y1,x2,y2,x3,y3,x4,y4; - state->transform(0, 1, &x1, &y1); - state->transform(0, 0, &x2, &y2); - state->transform(1, 0, &x3, &y3); - state->transform(1, 1, &x4, &y4); - - if (str->getKind() == strDCT && - colorMap->getNumPixelComps() == 3) { - sprintf(fileName, "/tmp/tmp%08x.jpg", lrand48()); - logf(" Found picture. Temporary storage is %s", fileName); - if (!(fi = fopen(fileName, "wb"))) { - error(-1, "Couldn't open temporary image file '%s'", fileName); - return; - } - str = ((DCTStream *)str)->getRawStream(); - str->reset(); - while ((c = str->getChar()) != EOF) - fputc(c, fi); - fclose(fi); - swfoutput_drawimagefile(&output, fileName, width, height, x1,y1,x2,y2,x3,y3,x4,y4); - } else { - logf(" File contains pbm pictures."); - } + GfxImageColorMap *colorMap, GBool inlineImg) +{ + drawGeneralImage(state,ref,str,width,height,colorMap,0,inlineImg,0); } PDFDoc*doc = 0; @@ -1076,9 +1079,26 @@ void pdfswf_init(char*filename, char*userPassword) output = new SWFOutputDev(); } +void pdfswf_drawonlyshapes() +{ + drawonlyshapes = 1; +} + +void pdfswf_ignoredraworder() +{ + ignoredraworder = 1; +} + +void pdfswf_jpegquality(int val) +{ + if(val<0) val=0; + if(val>100) val=100; + jpegquality = val; +} + void pdfswf_setoutputfilename(char*_filename) { - filename = _filename; + swffilename = _filename; } void pdfswf_convertpage(int page) @@ -1091,11 +1111,12 @@ int pdfswf_numpages() return doc->getNumPages(); } +int closed=0; void pdfswf_close() { - delete doc; + logf(" pdfswf.cc: pdfswf_close()"); delete output; - + delete doc; freeParams(); // check for memory leaks Object::memCheck(stderr);