X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fpdf%2FGFXOutputDev.cc;h=deb6f0a6c3622395f66bde381b18578b9008620f;hb=339d6e2778383e1eb7807e0cc16f2e93e402e877;hp=b8cc3f4af30902583ec1b51613227ef82a5a569b;hpb=36bc7214626310b6ab79d9246cdec806c2da55ca;p=swftools.git diff --git a/lib/pdf/GFXOutputDev.cc b/lib/pdf/GFXOutputDev.cc index b8cc3f4..deb6f0a 100644 --- a/lib/pdf/GFXOutputDev.cc +++ b/lib/pdf/GFXOutputDev.cc @@ -93,12 +93,13 @@ typedef struct _fontfile static fontfile_t* global_fonts = 0; static fontfile_t* global_fonts_next = 0; +static fontfile_t* global_fontdirs = 0; +static fontfile_t* global_fontdirs_next = 0; + static int fontnum = 0; /* config */ -static char* lastfontdir = 0; - struct fontentry { const char*pdffont; const char*filename; @@ -155,21 +156,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 +175,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) @@ -403,6 +395,17 @@ char* fontconfig_searchForFont(char*name) fprintf(fi, "WINDOWSFONTDIR\n"); #endif fprintf(fi, "~/.fonts\n"); + + /* add external font dirs to fontconfig's config. Maybe fc will make more out + of them than we did + FIXME: we don't do that yet if there's a system config file + */ + fontfile_t*fd = global_fontdirs; + while(fd) { + fprintf(fi, "%s\n", fd->filename); + fd = fd->next; + } + #ifdef WIN32 fprintf(fi, "WINDOWSTEMPDIR_FONTCONFIG_CACHE\n"); #endif @@ -533,7 +536,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 approach */ fontfile_t*f = global_fonts; while(f) { if(strstr(f->filename, name)) { @@ -544,6 +549,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 +561,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 +595,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 +605,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 +632,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 +779,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 +1303,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 +1680,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 +1736,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 +1823,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 +1886,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 +1906,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 +1914,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); @@ -2573,7 +2493,6 @@ 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); @@ -2607,34 +2526,18 @@ void addGlobalFontDir(const char*dirname) } 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)); + + fontfile_t* f = (fontfile_t*)malloc(sizeof(fontfile_t)); + memset(f, 0, sizeof(fontfile_t)); + f->filename = dirname; + if(global_fontdirs_next) { + global_fontdirs_next->next = f; + global_fontdirs_next = global_fontdirs_next->next; + } else { + global_fontdirs_next = global_fontdirs = f; } - - gfxglobals->pages[pdfpage] = outputpage; - if(pdfpage > gfxglobals->pagepos) - gfxglobals->pagepos = pdfpage; } void GFXOutputDev::beginTransparencyGroup(GfxState *state, double *bbox,