From 0e482bea37ed1f38e592247984b6e064158c8ea1 Mon Sep 17 00:00:00 2001 From: Matthias Kramm Date: Fri, 16 Jan 2009 13:15:12 -0800 Subject: [PATCH] moved all fields valid for more than one page out of the class --- lib/pdf/GFXOutputDev.cc | 167 +++++------------------------------------------ lib/pdf/GFXOutputDev.h | 13 ++-- 2 files changed, 25 insertions(+), 155 deletions(-) diff --git a/lib/pdf/GFXOutputDev.cc b/lib/pdf/GFXOutputDev.cc index b8cc3f4..def11a6 100644 --- a/lib/pdf/GFXOutputDev.cc +++ b/lib/pdf/GFXOutputDev.cc @@ -155,21 +155,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 +174,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) @@ -597,10 +588,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 +615,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) @@ -1294,7 +1279,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 +1656,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 +1712,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 +1799,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 +1862,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(); @@ -1987,16 +1889,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->gfxfont; + device->addfont(device, current_gfxfont); free(id); updateFontMatrix(state); @@ -2611,32 +2506,6 @@ void addGlobalFontDir(const char*dirname) #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, diff --git a/lib/pdf/GFXOutputDev.h b/lib/pdf/GFXOutputDev.h index 063aff6..9cca56d 100644 --- a/lib/pdf/GFXOutputDev.h +++ b/lib/pdf/GFXOutputDev.h @@ -46,14 +46,11 @@ void addGlobalFontDir(const char*dirname); class GFXOutputGlobals { public: feature_t*featurewarnings; - gfxfontlist_t*gfxfontlist; + int textmodeinfo; // did we write "Text will be rendered as polygon" yet? int jpeginfo; // did we write "File contains jpegs" yet? int pbminfo; // did we write "File contains jpegs" yet? int linkinfo; // did we write "File contains links" yet? - int*pages; - int pagebuflen; - int pagepos; GFXOutputGlobals(); ~GFXOutputGlobals(); @@ -198,8 +195,6 @@ public: virtual void type3D0(GfxState *state, double wx, double wy); virtual void type3D1(GfxState *state, double wx, double wy, double llx, double lly, double urx, double ury); - virtual void preparePage(int pdfpage, int outputpage); - char* searchForSuitableFont(GfxFont*gfxFont); void finish(); @@ -216,6 +211,8 @@ public: //virtual void setVectorAntialias(GBool vaa) {} //virtual void psXObject(Stream *psStream, Stream *level1Stream) {} + virtual void setPageMap(int*pagemap, int pagemap_len); + private: gfxline_t* gfxPath_to_gfxline(GfxState*state, GfxPath*path, int closed, int user_movex, int user_movey); @@ -240,6 +237,10 @@ public: char* substituteFont(GfxFont*gfxFont, char*oldname); char* writeEmbeddedFontToFile(XRef*ref, GfxFont*font); + /* for page mapping */ + int* page2page; + int num_pages; + int currentpage; char outer_clip_box; //whether the page clip box is still on -- 1.7.10.4