X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=pdf2swf%2FSWFOutputDev.cc;h=75d19e6bcf619dd99504ccd70e024488d42344cd;hb=6d22f1376c2fcad7c872db608630468d3abcca23;hp=23cb0c361d0d19a36b6172757f716fe77ccb5e53;hpb=cbed1e057fe9ac1422573371f20f9416b218effe;p=swftools.git diff --git a/pdf2swf/SWFOutputDev.cc b/pdf2swf/SWFOutputDev.cc index 23cb0c3..75d19e6 100644 --- a/pdf2swf/SWFOutputDev.cc +++ b/pdf2swf/SWFOutputDev.cc @@ -23,6 +23,12 @@ #include #include #include "../config.h" +#ifdef HAVE_DIRENT_H +#include +#endif +#ifdef HAVE_SYS_STAT_H +#include +#endif #ifdef HAVE_FONTCONFIG_H #include #endif @@ -71,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; @@ -104,8 +112,8 @@ struct mapping { {"ZapfDingbats", "d050000l"}}; class SWFOutputDev: public OutputDev { - struct swfoutput output; int outputstarted; + struct swfoutput output; public: // Constructor. @@ -117,7 +125,9 @@ public: void setMove(int x,int y); void setClip(int x1,int y1,int x2,int y2); - void save(char*filename); + int save(char*filename); + + void getDimensions(int*x1,int*y1,int*x2,int*y2); //----- get info about output device @@ -341,6 +351,13 @@ void SWFOutputDev::setClip(int x1,int y1,int x2,int y2) this->user_clipx2 = x2; this->user_clipy2 = 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; +} static char*getFontID(GfxFont*font) { @@ -685,7 +702,7 @@ void SWFOutputDev::stroke(GfxState *state) m.m12 = 0; m.m13 = 0; m.m23 = 0; SWF_OUTLINE*outline = gfxPath_to_SWF_OUTLINE(state, path); - if(screenloglevel >= LOGLEVEL_TRACE) { + if(getLogLevel() >= LOGLEVEL_TRACE) { msg(" stroke\n"); dump_outline(outline); } @@ -721,7 +738,7 @@ void SWFOutputDev::fill(GfxState *state) m.m12 = 0; m.m13 = 0; m.m23 = 0; SWF_OUTLINE*outline = gfxPath_to_SWF_OUTLINE(state, path); - if(screenloglevel >= LOGLEVEL_TRACE) { + if(getLogLevel() >= LOGLEVEL_TRACE) { msg(" fill\n"); dump_outline(outline); } @@ -738,7 +755,7 @@ void SWFOutputDev::eoFill(GfxState *state) m.m12 = 0; m.m13 = 0; m.m23 = 0; SWF_OUTLINE*outline = gfxPath_to_SWF_OUTLINE(state, path); - if(screenloglevel >= LOGLEVEL_TRACE) { + if(getLogLevel() >= LOGLEVEL_TRACE) { msg(" eofill\n"); dump_outline(outline); } @@ -756,7 +773,7 @@ void SWFOutputDev::clip(GfxState *state) m.m13 = 0; m.m23 = 0; SWF_OUTLINE*outline = gfxPath_to_SWF_OUTLINE(state, path); - if(screenloglevel >= LOGLEVEL_TRACE) { + if(getLogLevel() >= LOGLEVEL_TRACE) { msg(" clip\n"); dump_outline(outline); } @@ -773,7 +790,7 @@ void SWFOutputDev::eoClip(GfxState *state) m.m12 = 0; m.m13 = 0; m.m23 = 0; SWF_OUTLINE*outline = gfxPath_to_SWF_OUTLINE(state, path); - if(screenloglevel >= LOGLEVEL_TRACE) { + if(getLogLevel() >= LOGLEVEL_TRACE) { msg(" eoclip\n"); dump_outline(outline); } @@ -782,9 +799,9 @@ void SWFOutputDev::eoClip(GfxState *state) clipping[clippos] ++; free_outline(outline); } -void SWFOutputDev::save(char*filename) +int SWFOutputDev::save(char*filename) { - swfoutput_save(&output, filename); + return swfoutput_save(&output, filename); } SWFOutputDev::~SWFOutputDev() @@ -1293,6 +1310,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; @@ -1300,25 +1320,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) { @@ -1327,6 +1360,7 @@ char* searchForSuitableFont(GfxFont*gfxFont) if(nfn) fontname = strdup(nfn+1); else fontname = filename; } + msg(" FontConfig: Returning \"%s\"", fontname); } else { // initialize patterns FcPatternDestroy(pattern); @@ -1334,22 +1368,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); @@ -1361,6 +1401,7 @@ char* searchForSuitableFont(GfxFont*gfxFont) if(nfn) fontname = strdup(nfn+1); else fontname = filename; } + msg(" FontConfig: Returning \"%s\"", fontname); } } @@ -1894,10 +1935,17 @@ static void printInfoDate(Dict *infoDict, char *key, char *fmt) { void pdfswf_setparameter(char*name, char*value) { + msg(" setting parameter %s to \"%s\"", name, value); if(!strcmp(name, "caplinewidth")) { caplinewidth = atof(value); } else if(!strcmp(name, "zoom")) { zoom = 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); } @@ -1914,6 +1962,82 @@ void pdfswf_addfont(char*filename) } } +static char* dirseparator() +{ +#ifdef WIN32 + return "\\"; +#else + return "/"; +#endif +} + +void pdfswf_addlanguagedir(char*dir) +{ + if(!globalParams) + globalParams = new GlobalParams(""); + + msg(" Adding %s to language pack directories", dir); + + int l; + FILE*fi = 0; + 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", config_file); + return; + } + globalParams->parseFile(new GString(config_file), fi); + fclose(fi); +} + +void pdfswf_addfontdir(char*dirname) +{ +#ifdef HAVE_DIRENT_H + msg(" Adding %s to font directories", dirname); + DIR*dir = opendir(dirname); + if(!dir) { + msg(" Couldn't open directory %s\n", dirname); + return; + } + struct dirent*ent; + while(1) { + ent = readdir (dir); + if (!ent) + break; + int l; + char*name = ent->d_name; + char type = 0; + if(!name) continue; + l=strlen(name); + if(l<4) + continue; + if(!strncasecmp(&name[l-4], ".pfa", 4)) + type=1; + if(!strncasecmp(&name[l-4], ".pfb", 4)) + type=3; + if(!strncasecmp(&name[l-4], ".ttf", 4)) + type=2; + if(type) + { + char*fontname = (char*)malloc(strlen(dirname)+strlen(name)+2); + strcpy(fontname, dirname); + strcat(fontname, dirseparator()); + strcat(fontname, name); + msg(" Adding %s to fonts", fontname); + pdfswf_addfont(fontname); + } + } + closedir(dir); +#else + msg(" No dirent.h- unable to add font dir %s", dir); +#endif +} + + typedef struct _pdf_doc_internal { int protect; @@ -1940,7 +2064,8 @@ pdf_doc_t* pdf_init(char*filename, char*userPassword) Object info; // read config file - globalParams = new GlobalParams(""); + if(!globalParams) + globalParams = new GlobalParams(""); // open PDF file if (userPassword && userPassword[0]) { @@ -1959,7 +2084,7 @@ pdf_doc_t* pdf_init(char*filename, char*userPassword) // print doc info i->doc->getDocInfo(&info); if (info.isDict() && - (screenloglevel>=LOGLEVEL_NOTICE)) { + (getScreenLogLevel()>=LOGLEVEL_NOTICE)) { printInfoString(info.getDict(), "Title", "Title: %s\n"); printInfoString(info.getDict(), "Subject", "Subject: %s\n"); printInfoString(info.getDict(), "Keywords", "Keywords: %s\n"); @@ -1987,8 +2112,8 @@ pdf_doc_t* pdf_init(char*filename, char*userPassword) i->protect = 0; if (i->doc->isEncrypted()) { if(!i->doc->okToCopy()) { - printf("PDF disallows copying. Terminating.\n"); - exit(1); //bail out + printf("PDF disallows copying.\n"); + return 0; } if(!i->doc->okToChange() || !i->doc->okToAddNotes()) i->protect = 1; @@ -2017,7 +2142,7 @@ class MemCheck { public: ~MemCheck() { - delete globalParams; + delete globalParams;globalParams=0; Object::memCheck(stderr); gMemReport(stderr); } @@ -2078,10 +2203,12 @@ void swf_output_setparameter(swf_output_t*swf_output, char*name, char*value) pdfswf_setparameter(name, value); } -void swf_output_save(swf_output_t*swf, char*filename) +int swf_output_save(swf_output_t*swf, char*filename) { swf_output_internal_t*i= (swf_output_internal_t*)swf->internal; - i->outputDev->save(filename); + int ret = i->outputDev->save(filename); + i->outputDev->getDimensions(&swf->x1, &swf->y1, &swf->x2, &swf->y2); + return ret; } void swf_output_destroy(swf_output_t*output) @@ -2092,10 +2219,10 @@ void swf_output_destroy(swf_output_t*output) free(output); } -void pdf_page_render2(pdf_page_t*page, swf_output_t*output) +void pdf_page_render2(pdf_page_t*page, swf_output_t*swf) { pdf_doc_internal_t*pi = (pdf_doc_internal_t*)page->parent->internal; - swf_output_internal_t*si = (swf_output_internal_t*)output->internal; + swf_output_internal_t*si = (swf_output_internal_t*)swf->internal; if(pi->protect) { swfoutput_setparameter("protect", "1"); @@ -2106,6 +2233,7 @@ void pdf_page_render2(pdf_page_t*page, swf_output_t*output) #else pi->doc->displayPage((OutputDev*)si->outputDev, page->nr, zoom, zoom, /*rotate*/0, true, /*doLinks*/(int)1); #endif + si->outputDev->getDimensions(&swf->x1, &swf->y1, &swf->x2, &swf->y2); } void pdf_page_rendersection(pdf_page_t*page, swf_output_t*output, int x, int y, int x1, int y1, int x2, int y2)