X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=pdf2swf%2FSWFOutputDev.cc;h=2728dcb24d87889f252dc3e0a713b89bdbfbef2e;hb=3c7543d9d855058db64c4655d3f672cf8e0adb09;hp=5186af38a9964f6f3894fc8cfb0515ff33e8a659;hpb=efbba601c7536de1aa75f2b429989797da7e2c5d;p=swftools.git diff --git a/pdf2swf/SWFOutputDev.cc b/pdf2swf/SWFOutputDev.cc index 5186af3..2728dcb 100644 --- a/pdf2swf/SWFOutputDev.cc +++ b/pdf2swf/SWFOutputDev.cc @@ -77,6 +77,8 @@ typedef struct _fontfile static fontfile_t fonts[2048]; static int fontnum = 0; +static int config_use_fontconfig = 1; + // swf <-> pdf pages // TODO: move into pdf_doc_t static int*pages = 0; @@ -86,6 +88,7 @@ static int pagepos = 0; /* config */ static double caplinewidth = 3.0; static int zoom = 72; /* xpdf: 86 */ +static int forceType0Fonts = 0; static void printInfoString(Dict *infoDict, char *key, char *fmt); static void printInfoDate(Dict *infoDict, char *key, char *fmt); @@ -124,6 +127,8 @@ public: void setClip(int x1,int y1,int x2,int y2); int save(char*filename); + void pagefeed(); + void* getSWF(); void getDimensions(int*x1,int*y1,int*x2,int*y2); @@ -351,10 +356,7 @@ void SWFOutputDev::setClip(int x1,int y1,int x2,int y2) } void SWFOutputDev::getDimensions(int*x1,int*y1,int*x2,int*y2) { - if(x1) *x1 = output.swf.movieSize.xmin/20; - if(y1) *y1 = output.swf.movieSize.ymin/20; - if(x2) *x2 = output.swf.movieSize.xmax/20; - if(y2) *y2 = output.swf.movieSize.ymax/20; + return swfoutput_getdimensions(&output, x1,y1,x2,y2); } static char*getFontID(GfxFont*font) @@ -797,10 +799,20 @@ void SWFOutputDev::eoClip(GfxState *state) clipping[clippos] ++; free_outline(outline); } + +/* pass through functions for swf_output */ int SWFOutputDev::save(char*filename) { return swfoutput_save(&output, filename); } +void SWFOutputDev::pagefeed() +{ + swfoutput_pagefeed(&output); +} +void* SWFOutputDev::getSWF() +{ + return (void*)swfoutput_get(&output); +} SWFOutputDev::~SWFOutputDev() { @@ -844,7 +856,7 @@ void SWFOutputDev::drawChar(GfxState *state, double x, double y, // check for invisible text -- this is used by Acrobat Capture if ((state->getRender() & 3) == 3) return; - + Gushort *CIDToGIDMap = 0; GfxFont*font = state->getFont(); if(font->getType() == fontType3) { @@ -857,20 +869,29 @@ void SWFOutputDev::drawChar(GfxState *state, double x, double y, state->transform(x, y, &x1, &y1); Unicode u=0; - if(_u && uLen) + char*name=0; + + if(_u && uLen) { u = *_u; + if (u) { + int t; + /* find out char name from unicode index + TODO: should be precomputed + */ + for(t=0;tisCIDFont() && u) { + if(font->isCIDFont()) { GfxCIDFont*cfont = (GfxCIDFont*)font; - int t; - for(t=0;tgetType() == fontCIDType2) { + CIDToGIDMap = cfont->getCIDToGID(); } } else { Gfx8BitFont*font8; @@ -879,13 +900,14 @@ void SWFOutputDev::drawChar(GfxState *state, double x, double y, if(enc && enc[c]) name = enc[c]; } - - msg(" drawChar(%f,%f,c='%c' (%d),u=%d <%d>) CID=%d name=\"%s\"\n",x,y,(c&127)>=32?c:'?',c,u, uLen, font->isCIDFont(), FIXNULL(name)); - - /*x1 = (int)(x1+0.5); - y1 = (int)(y1+0.5);*/ - - int ret = swfoutput_drawchar(&output, x1, y1, name, c, u); + + if (CIDToGIDMap) { + msg(" drawChar(%f, %f, c='%c' (%d), GID=%d, u=%d <%d>) CID=%d name=\"%s\"\n", x, y, (c&127)>=32?c:'?', c, CIDToGIDMap[c], u, uLen, font->isCIDFont(), FIXNULL(name)); + swfoutput_drawchar(&output, x1, y1, name, CIDToGIDMap[c], u); + } else { + msg(" drawChar(%f,%f,c='%c' (%d), u=%d <%d>) CID=%d name=\"%s\"\n",x,y,(c&127)>=32?c:'?',c,u, uLen, font->isCIDFont(), FIXNULL(name)); + swfoutput_drawchar(&output, x1, y1, name, c, u); + } } void SWFOutputDev::endString(GfxState *state) { @@ -935,10 +957,10 @@ void SWFOutputDev::startPage(int pageNum, GfxState *state, double crop_x1, doubl /* apply user clip box */ if(user_clipx1|user_clipy1|user_clipx2|user_clipy2) { - if(user_clipx1 > x1) x1 = user_clipx1; - if(user_clipx2 < x2) x2 = user_clipx2; - if(user_clipy1 > y1) y1 = user_clipy1; - if(user_clipy2 < y2) y2 = user_clipy2; + /*if(user_clipx1 > x1)*/ x1 = user_clipx1; + /*if(user_clipx2 < x2)*/ x2 = user_clipx2; + /*if(user_clipy1 > y1)*/ y1 = user_clipy1; + /*if(user_clipy2 < y2)*/ y2 = user_clipy2; } if(!outputstarted) { @@ -1239,9 +1261,11 @@ char*SWFOutputDev::writeEmbeddedFontToFile(XRef*ref, GfxFont*font) } #ifdef XPDF_101 Type1CFontFile *cvt = new Type1CFontFile(fontBuf, fontLen); + if(!cvt) return 0; cvt->convertToType1(f); #else FoFiType1C *cvt = FoFiType1C::make(fontBuf, fontLen); + if(!cvt) return 0; cvt->convertToType1(NULL, gTrue, FoFiWrite, f); #endif //cvt->convertToCIDType0("test", f); @@ -1308,6 +1332,9 @@ char* searchForSuitableFont(GfxFont*gfxFont) char*name = getFontName(gfxFont); char*fontname = 0; char*filename = 0; + + if(!config_use_fontconfig) + return 0; #ifdef HAVE_FONTCONFIG FcPattern *pattern, *match; @@ -1315,25 +1342,38 @@ char* searchForSuitableFont(GfxFont*gfxFont) FcChar8 *v; static int fcinitcalled = false; + + msg(" searchForSuitableFont(%s)", name); // call init ony once if (!fcinitcalled) { + msg(" Initializing FontConfig..."); fcinitcalled = true; - FcInit(); //leaks + if(FcInit()) { + msg(" FontConfig Initialization failed. Disabling."); + config_use_fontconfig = 0; + return 0; + } + msg(" ...initialized FontConfig"); } + msg(" FontConfig: Create \"%s\" Family Pattern", name); pattern = FcPatternBuild(NULL, FC_FAMILY, FcTypeString, name, NULL); if (gfxFont->isItalic()) // check for italic + msg(" FontConfig: Adding Italic Slant"); FcPatternAddInteger(pattern, FC_SLANT, FC_SLANT_ITALIC); if (gfxFont->isBold()) // check for bold + msg(" FontConfig: Adding Bold Weight"); FcPatternAddInteger(pattern, FC_WEIGHT, FC_WEIGHT_BOLD); + msg(" FontConfig: Try to match..."); // configure and match using the original font name FcConfigSubstitute(0, pattern, FcMatchPattern); FcDefaultSubstitute(pattern); match = FcFontMatch(0, pattern, &result); if (FcPatternGetString(match, "family", 0, &v) == FcResultMatch) { + msg(" FontConfig: family=%s", (char*)v); // if we get an exact match if (strcmp((char *)v, name) == 0) { if (FcPatternGetString(match, "file", 0, &v) == FcResultMatch) { @@ -1342,6 +1382,7 @@ char* searchForSuitableFont(GfxFont*gfxFont) if(nfn) fontname = strdup(nfn+1); else fontname = filename; } + msg(" FontConfig: Returning \"%s\"", fontname); } else { // initialize patterns FcPatternDestroy(pattern); @@ -1349,22 +1390,28 @@ char* searchForSuitableFont(GfxFont*gfxFont) // now match against serif etc. if (gfxFont->isSerif()) { + msg(" FontConfig: Create Serif Family Pattern"); pattern = FcPatternBuild (NULL, FC_FAMILY, FcTypeString, "serif", NULL); } else if (gfxFont->isFixedWidth()) { + msg(" FontConfig: Create Monospace Family Pattern"); pattern = FcPatternBuild (NULL, FC_FAMILY, FcTypeString, "monospace", NULL); } else { + msg(" FontConfig: Create Sans Family Pattern"); pattern = FcPatternBuild (NULL, FC_FAMILY, FcTypeString, "sans", NULL); } // check for italic if (gfxFont->isItalic()) { + msg(" FontConfig: Adding Italic Slant"); int bb = FcPatternAddInteger(pattern, FC_SLANT, FC_SLANT_ITALIC); } // check for bold if (gfxFont->isBold()) { + msg(" FontConfig: Adding Bold Weight"); int bb = FcPatternAddInteger(pattern, FC_WEIGHT, FC_WEIGHT_BOLD); } + msg(" FontConfig: Try to match... (2)"); // configure and match using serif etc FcConfigSubstitute (0, pattern, FcMatchPattern); FcDefaultSubstitute (pattern); @@ -1376,6 +1423,7 @@ char* searchForSuitableFont(GfxFont*gfxFont) if(nfn) fontname = strdup(nfn+1); else fontname = filename; } + msg(" FontConfig: Returning \"%s\"", fontname); } } @@ -1403,6 +1451,10 @@ char* SWFOutputDev::substituteFont(GfxFont*gfxFont, char* oldname) fontname = "Times-Roman"; } filename = searchFont(fontname); + if(!filename) { + msg(" Couldn't find font %s- did you install the default fonts?"); + return 0; + } if(substitutepos>=sizeof(substitutesource)/sizeof(char*)) { msg(" Too many fonts in file."); @@ -1502,7 +1554,7 @@ void SWFOutputDev::updateFont(GfxState *state) if(embedded && (gfxFont->getType() == fontType1 || gfxFont->getType() == fontType1C || - //gfxFont->getType() == fontCIDType0C || + (gfxFont->getType() == fontCIDType0C && forceType0Fonts) || gfxFont->getType() == fontTrueType || gfxFont->getType() == fontCIDType2 )) @@ -1914,10 +1966,14 @@ void pdfswf_setparameter(char*name, char*value) caplinewidth = atof(value); } else if(!strcmp(name, "zoom")) { zoom = atoi(value); + } else if(!strcmp(name, "forceType0Fonts")) { + forceType0Fonts = atoi(value); } else if(!strcmp(name, "fontdir")) { pdfswf_addfontdir(value); } else if(!strcmp(name, "languagedir")) { pdfswf_addlanguagedir(value); + } else if(!strcmp(name, "fontconfig")) { + config_use_fontconfig = atoi(value); } else { swfoutput_setparameter(name, value); } @@ -1952,14 +2008,14 @@ void pdfswf_addlanguagedir(char*dir) int l; FILE*fi = 0; - char* config_file = (char*)malloc(strlen(dir)+256); + char* config_file = (char*)malloc(strlen(dir) + 1 + sizeof("add-to-xpdfrc")); strcpy(config_file, dir); strcat(config_file, dirseparator()); strcat(config_file, "add-to-xpdfrc"); fi = fopen(config_file, "rb"); if(!fi) { - msg(" Could not open %s"); + msg(" Could not open %s", config_file); return; } globalParams->parseFile(new GString(config_file), fi); @@ -2005,7 +2061,7 @@ void pdfswf_addfontdir(char*dirname) } closedir(dir); #else - msg(" No dirent.h- unable to add font dir %s"); + msg(" No dirent.h- unable to add font dir %s", dir); #endif } @@ -2175,6 +2231,13 @@ void swf_output_setparameter(swf_output_t*swf_output, char*name, char*value) pdfswf_setparameter(name, value); } +void swf_output_pagefeed(swf_output_t*swf) +{ + swf_output_internal_t*i= (swf_output_internal_t*)swf->internal; + i->outputDev->pagefeed(); + i->outputDev->getDimensions(&swf->x1, &swf->y1, &swf->x2, &swf->y2); +} + int swf_output_save(swf_output_t*swf, char*filename) { swf_output_internal_t*i= (swf_output_internal_t*)swf->internal; @@ -2183,6 +2246,14 @@ int swf_output_save(swf_output_t*swf, char*filename) return ret; } +void* swf_output_get(swf_output_t*swf) +{ + swf_output_internal_t*i= (swf_output_internal_t*)swf->internal; + void* ret = i->outputDev->getSWF(); + i->outputDev->getDimensions(&swf->x1, &swf->y1, &swf->x2, &swf->y2); + return ret; +} + void swf_output_destroy(swf_output_t*output) { swf_output_internal_t*i = (swf_output_internal_t*)output->internal;