X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fpdf%2FGFXOutputDev.cc;h=93eda131034ede986de2636b3eeb0b63cdbc3bfb;hb=e8732af08c0ea32ee3b0292c28bba6fd4c1de91a;hp=b8cc3f4af30902583ec1b51613227ef82a5a569b;hpb=36bc7214626310b6ab79d9246cdec806c2da55ca;p=swftools.git diff --git a/lib/pdf/GFXOutputDev.cc b/lib/pdf/GFXOutputDev.cc index b8cc3f4..93eda13 100644 --- a/lib/pdf/GFXOutputDev.cc +++ b/lib/pdf/GFXOutputDev.cc @@ -97,8 +97,6 @@ static int fontnum = 0; /* config */ -static char* lastfontdir = 0; - struct fontentry { const char*pdffont; const char*filename; @@ -155,21 +153,14 @@ GFXOutputGlobals*gfxglobals=0; GFXOutputGlobals::GFXOutputGlobals() { - this->pages = 0; - this->pagebuflen = 0; - this->pagepos = 0; this->featurewarnings = 0; this->jpeginfo = 0; this->textmodeinfo = 0; this->linkinfo = 0; this->pbminfo = 0; - this->gfxfontlist = gfxfontlist_create(); } GFXOutputGlobals::~GFXOutputGlobals() { - if(this->pages) { - free(this->pages); this->pages = 0; - } feature_t*f = this->featurewarnings; while(f) { feature_t*next = f->next; @@ -181,8 +172,6 @@ GFXOutputGlobals::~GFXOutputGlobals() f = next; } this->featurewarnings = 0; - - gfxfontlist_free(this->gfxfontlist, 1);this->gfxfontlist = 0; } void GFXOutputDev::showfeature(const char*feature, char fully, char warn) @@ -425,6 +414,14 @@ char* fontconfig_searchForFont(char*name) config_use_fontconfig = 0; return 0; } + + /* add external fonts to fontconfig's config, too. */ + fontfile_t*fd = global_fonts; + while(fd) { + FcConfigAppFontAddFile(config, (FcChar8*)fd->filename); + fd = fd->next; + } + FcFontSet * set = FcConfigGetFonts(config, FcSetSystem); msg(" FontConfig initialized. Found %d fonts", set?set->nfont:0); if(!set || !set->nfont) { @@ -533,7 +530,9 @@ DisplayFontParam *GFXGlobalParams::getDisplayFont(GString *fontName) int bestlen = 0x7fffffff; const char*bestfilename = 0; - + +#ifndef HAVE_FONTCONFIG + /* if we don't have fontconfig, try a simple filename-comparison approach */ fontfile_t*f = global_fonts; while(f) { if(strstr(f->filename, name)) { @@ -544,6 +543,7 @@ DisplayFontParam *GFXGlobalParams::getDisplayFont(GString *fontName) } f = f->next; } +#endif /* if we didn't find anything up to now, try looking for the font via fontconfig */ @@ -555,6 +555,7 @@ DisplayFontParam *GFXGlobalParams::getDisplayFont(GString *fontName) } if(filename) { + msg(" Font %s maps to %s\n", name, filename); DisplayFontParamKind kind = detectFontType(filename); DisplayFontParam *dfp = new DisplayFontParam(new GString(fontName), kind); if(kind == displayFontTT) { @@ -588,6 +589,7 @@ GFXOutputDev::GFXOutputDev(InfoOutputDev*info, PDFDoc*doc) this->user_clipy1 = 0; this->user_clipx2 = 0; this->user_clipy2 = 0; + this->current_fontinfo = 0; this->current_text_stroke = 0; this->current_text_clip = 0; this->outer_clip_box = 0; @@ -597,10 +599,11 @@ GFXOutputDev::GFXOutputDev(InfoOutputDev*info, PDFDoc*doc) this->config_remapunicode=0; this->config_transparent=0; this->config_extrafontdata = 0; - this->config_fontquality = 10; this->config_optimize_polygons = 0; this->config_multiply = 1; this->dashPattern = 0; + this->page2page = 0; + this->num_pages = 0; memset(states, 0, sizeof(states)); }; @@ -623,14 +626,7 @@ void GFXOutputDev::setParameter(const char*key, const char*value) this->config_multiply=1; } else if(!strcmp(key,"optimize_polygons")) { this->config_optimize_polygons = atoi(value); - } else if(!strcmp(key,"bigchar")) { - this->config_bigchar = atoi(value); - } else if(!strcmp(key,"fontquality")) { - this->config_fontquality = atof(value); - if(this->config_fontquality<=1) - this->config_fontquality=1; } - } void GFXOutputDev::setDevice(gfxdevice_t*dev) @@ -777,6 +773,13 @@ static void dumpFontInfo(const char*loglevel, GfxFont*font) void dump_outline(gfxline_t*line) { + /*gfxbbox_t*r = gfxline_isrectangle(line); + if(!r) + printf("is not a rectangle\n"); + else + printf("is a rectangle: (%f,%f)-(%f-%f)\n", r->xmin, r->ymin, r->xmax, r->ymax); + */ + while(line) { if(line->type == gfx_moveTo) { msg(" | moveTo %.2f %.2f", line->x,line->y); @@ -1294,7 +1297,6 @@ char* makeStringPrintable(char*str) tmp_printstr[len] = 0; return tmp_printstr; } -#define INTERNAL_FONT_SIZE 1024.0 void GFXOutputDev::updateFontMatrix(GfxState*state) { double* ctm = state->getCTM(); @@ -1672,8 +1674,9 @@ void GFXOutputDev::processLink(Link *link, Catalog *catalog) } else if(strstr(s, "last") || strstr(s, "end")) { - if(gfxglobals->pages && gfxglobals->pagepos>0) - page = gfxglobals->pages[gfxglobals->pagepos-1]; + if(this->page2page && this->num_pages) { + page = this->page2page[this->num_pages-1]; + } } else if(strstr(s, "first") || strstr(s, "top")) { @@ -1727,19 +1730,19 @@ void GFXOutputDev::processLink(Link *link, Catalog *catalog) gfxglobals->linkinfo = 1; } - if(page>0) - { + if(page>0) { int t; int lpage = -1; - for(t=1;t<=gfxglobals->pagepos;t++) { - if(gfxglobals->pages[t]==page) { + for(t=1;t<=this->num_pages;t++) { + if(this->page2page[t]==page) { lpage = t; break; } } if(lpage<0) { lpage = page; - } + } + char buf[80]; sprintf(buf, "page%d", lpage); device->drawlink(device, points, buf); @@ -1814,6 +1817,12 @@ void GFXOutputDev::updateLineDash(GfxState *state) this->dashPattern = p; } } + +void GFXOutputDev::setPageMap(int*page2page, int num_pages) +{ + this->page2page = page2page; + this->num_pages = num_pages; +} void GFXOutputDev::updateLineWidth(GfxState *state) { @@ -1871,95 +1880,6 @@ void GFXOutputDev::updateStrokeColor(GfxState *state) state->getStrokeRGB(&rgb); } - -gfxfont_t* GFXOutputDev::createGfxFont(GfxFont*xpdffont, FontInfo*src) -{ - gfxfont_t*font = (gfxfont_t*)malloc(sizeof(gfxfont_t)); - memset(font, 0, sizeof(gfxfont_t)); - - font->glyphs = (gfxglyph_t*)malloc(sizeof(gfxglyph_t)*src->num_glyphs); - memset(font->glyphs, 0, sizeof(gfxglyph_t)*src->num_glyphs); - font->id = 0; - int t; - - double quality = (INTERNAL_FONT_SIZE * 200 / config_fontquality) / src->max_size; - double scale = 1; - //printf("%d glyphs\n", font->num_glyphs); - font->num_glyphs = 0; - font->ascent = fabs(src->descender); - font->descent = fabs(src->ascender); - - for(t=0;tnum_glyphs;t++) { - if(src->glyphs[t]) { - SplashPath*path = src->glyphs[t]->path; - int len = path?path->getLength():0; - //printf("glyph %d) %08x (%d line segments)\n", t, path, len); - gfxglyph_t*glyph = &font->glyphs[font->num_glyphs]; - src->glyphs[t]->glyphid = font->num_glyphs; - glyph->unicode = src->glyphs[t]->unicode; - if(glyph->unicode >= font->max_unicode) - font->max_unicode = glyph->unicode+1; - gfxdrawer_t drawer; - gfxdrawer_target_gfxline(&drawer); - int s; - int count = 0; - double xmax = 0; - for(s=0;sgetPoint(s, &x, &y, &f); - if(!s || x > xmax) - xmax = x; - if(f&splashPathFirst) { - drawer.moveTo(&drawer, x*scale, y*scale); - } - if(f&splashPathCurve) { - double x2,y2; - path->getPoint(++s, &x2, &y2, &f); - if(f&splashPathCurve) { - double x3,y3; - path->getPoint(++s, &x3, &y3, &f); - gfxdraw_cubicTo(&drawer, x*scale, y*scale, x2*scale, y2*scale, x3*scale, y3*scale, quality); - } else { - drawer.splineTo(&drawer, x*scale, y*scale, x2*scale, y2*scale); - } - } else { - drawer.lineTo(&drawer, x*scale, y*scale); - } - // printf("%f %f %s %s\n", x, y, (f&splashPathCurve)?"curve":"", - // (f&splashPathFirst)?"first":"", - // (f&splashPathLast)?"last":""); - } - - glyph->line = (gfxline_t*)drawer.result(&drawer); - if(src->glyphs[t]->advance>0) { - glyph->advance = src->glyphs[t]->advance; - } else { - msg(" Approximating advance value for glyph %d", t); - glyph->advance = xmax*scale; - } - if(this->config_bigchar) { - double max = src->glyphs[t]->advance_max; - if(max>0 && max > glyph->advance) { - glyph->advance = max; - } - } - - font->num_glyphs++; - } - } - font->unicode2glyph = (int*)malloc(sizeof(int)*font->max_unicode); - memset(font->unicode2glyph, -1, sizeof(int)*font->max_unicode); - for(t=0;tnum_glyphs;t++) { - if(font->glyphs[t].unicode>0 && font->glyphs[t].unicodemax_unicode) { - font->unicode2glyph[font->glyphs[t].unicode] = t; - } - - } - msg(" %d glyphs.", t, font->num_glyphs); - return font; -} - void GFXOutputDev::updateFont(GfxState *state) { GfxFont* gfxFont = state->getFont(); @@ -1980,6 +1900,7 @@ void GFXOutputDev::updateFont(GfxState *state) } this->current_fontinfo = this->info->getFont(id); + if(!this->current_fontinfo) { msg(" Internal Error: no fontinfo for font %s", id); return; @@ -1987,16 +1908,9 @@ void GFXOutputDev::updateFont(GfxState *state) if(!this->current_fontinfo->seen) { dumpFontInfo("", gfxFont); } - - gfxfont_t*font = gfxfontlist_findfont(gfxglobals->gfxfontlist,id); - if(!font) { - font = this->createGfxFont(gfxFont, current_fontinfo); - font->id = strdup(id); - gfxglobals->gfxfontlist = gfxfontlist_addfont(gfxglobals->gfxfontlist, font); - } - device->addfont(device, font); - current_gfxfont = font; + current_gfxfont = this->current_fontinfo->getGfxFont(); + device->addfont(device, current_gfxfont); free(id); updateFontMatrix(state); @@ -2541,7 +2455,7 @@ void addGlobalFont(const char*filename) } f->len = len; - msg(" Adding font \"%s\".", filename); + msg(" Adding font \"%s\".", filename); if(global_fonts_next) { global_fonts_next->next = f; global_fonts_next = global_fonts_next->next; @@ -2572,14 +2486,13 @@ void addGlobalLanguageDir(const char*dir) void addGlobalFontDir(const char*dirname) { #ifdef HAVE_DIRENT_H - msg(" Adding %s to font directories", dirname); - lastfontdir = strdup(dirname); DIR*dir = opendir(dirname); if(!dir) { msg(" Couldn't open directory %s", dirname); return; } struct dirent*ent; + int fonts = 0; while(1) { ent = readdir (dir); if (!ent) @@ -2603,40 +2516,16 @@ void addGlobalFontDir(const char*dirname) strcat(fontname, dirseparator()); strcat(fontname, name); addGlobalFont(fontname); + fonts++; } } + msg(" Added %s to font directories (%d fonts)", dirname, fonts); closedir(dir); #else - msg(" No dirent.h- unable to add font dir %s", dirname); + msg(" No dirent.h"); #endif } -void GFXOutputDev::preparePage(int pdfpage, int outputpage) -{ - if(pdfpage < 0) - return; - - if(!gfxglobals->pages) { - gfxglobals->pagebuflen = 1024; - if(pdfpage > gfxglobals->pagebuflen) - gfxglobals->pagebuflen = pdfpage+1; - gfxglobals->pages = (int*)malloc(gfxglobals->pagebuflen*sizeof(int)); - memset(gfxglobals->pages, -1, gfxglobals->pagebuflen*sizeof(int)); - } - - while(pdfpage >= gfxglobals->pagebuflen) - { - int oldlen = gfxglobals->pagebuflen; - gfxglobals->pagebuflen+=1024; - gfxglobals->pages = (int*)realloc(gfxglobals->pages, gfxglobals->pagebuflen*sizeof(int)); - memset(&gfxglobals->pages[oldlen], -1, (gfxglobals->pagebuflen-oldlen)*sizeof(int)); - } - - gfxglobals->pages[pdfpage] = outputpage; - if(pdfpage > gfxglobals->pagepos) - gfxglobals->pagepos = pdfpage; -} - void GFXOutputDev::beginTransparencyGroup(GfxState *state, double *bbox, GfxColorSpace *blendingColorSpace, GBool isolated, GBool knockout,