X-Git-Url: http://git.asbjorn.biz/?p=swftools.git;a=blobdiff_plain;f=lib%2Fpdf%2FGFXOutputDev.cc;h=def11a62d8617bf14851db440908a4b5d2b52234;hp=7f19c2487ba9729d09857356404aed5f6e3531c7;hb=0e482bea37ed1f38e592247984b6e064158c8ea1;hpb=6253f8a29f12eea01da9c5e41af4ece65b0ac19b diff --git a/lib/pdf/GFXOutputDev.cc b/lib/pdf/GFXOutputDev.cc index 7f19c24..def11a6 100644 --- a/lib/pdf/GFXOutputDev.cc +++ b/lib/pdf/GFXOutputDev.cc @@ -151,19 +151,43 @@ static void dbg(const char*format, ...) fflush(stdout); } +GFXOutputGlobals*gfxglobals=0; -void GFXOutputDev::showfeature(const char*feature, char fully, char warn) +GFXOutputGlobals::GFXOutputGlobals() +{ + this->featurewarnings = 0; + this->jpeginfo = 0; + this->textmodeinfo = 0; + this->linkinfo = 0; + this->pbminfo = 0; +} +GFXOutputGlobals::~GFXOutputGlobals() { feature_t*f = this->featurewarnings; while(f) { + feature_t*next = f->next; + if(f->string) { + free(f->string);f->string =0; + } + f->next = 0; + free(f); + f = next; + } + this->featurewarnings = 0; +} + +void GFXOutputDev::showfeature(const char*feature, char fully, char warn) +{ + feature_t*f = gfxglobals->featurewarnings; + while(f) { if(!strcmp(feature, f->string)) return; f = f->next; } f = (feature_t*)malloc(sizeof(feature_t)); f->string = strdup(feature); - f->next = this->featurewarnings; - this->featurewarnings = f; + f->next = gfxglobals->featurewarnings; + gfxglobals->featurewarnings = f; if(warn) { msg(" %s not yet %ssupported!",feature,fully?"fully ":""); if(this->config_break_on_warning) { @@ -294,7 +318,7 @@ static int config_use_fontconfig = 1; static int fcinitcalled = 0; GFXGlobalParams::GFXGlobalParams() -: GlobalParams("") +: GlobalParams((char*)"") { //setupBaseFonts(char *dir); //not tested yet } @@ -537,19 +561,16 @@ DisplayFontParam *GFXGlobalParams::getDisplayFont(GString *fontName) GFXOutputDev::GFXOutputDev(InfoOutputDev*info, PDFDoc*doc) { + if(!gfxglobals) + gfxglobals = new GFXOutputGlobals(); + this->info = info; this->doc = doc; this->xref = doc->getXRef(); - this->jpeginfo = 0; - this->textmodeinfo = 0; - this->linkinfo = 0; - this->pbminfo = 0; this->type3active = 0; this->statepos = 0; this->xref = 0; - this->substitutepos = 0; - this->type3Warning = 0; this->user_movex = 0; this->user_movey = 0; this->clipmovex = 0; @@ -561,23 +582,19 @@ GFXOutputDev::GFXOutputDev(InfoOutputDev*info, PDFDoc*doc) this->current_text_stroke = 0; this->current_text_clip = 0; this->outer_clip_box = 0; - this->pages = 0; - this->pagebuflen = 0; - this->pagepos = 0; this->config_bigchar=0; this->config_convertgradients=1; this->config_break_on_warning=0; 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->gfxfontlist = gfxfontlist_create(); + this->dashPattern = 0; + this->page2page = 0; + this->num_pages = 0; memset(states, 0, sizeof(states)); - this->featurewarnings = 0; }; void GFXOutputDev::setParameter(const char*key, const char*value) @@ -598,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) @@ -1228,27 +1238,9 @@ void GFXOutputDev::finish() GFXOutputDev::~GFXOutputDev() { finish(); - - if(this->pages) { - free(this->pages); this->pages = 0; - } if(this->dashPattern) { free(this->dashPattern);this->dashPattern = 0; } - - feature_t*f = this->featurewarnings; - while(f) { - feature_t*next = f->next; - if(f->string) { - free(f->string);f->string =0; - } - f->next = 0; - free(f); - f = next; - } - this->featurewarnings = 0; - - gfxfontlist_free(this->gfxfontlist, 1);this->gfxfontlist = 0; }; GBool GFXOutputDev::upsideDown() { @@ -1287,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(); @@ -1372,15 +1363,15 @@ void GFXOutputDev::drawChar(GfxState *state, double x, double y, gfxmatrix_t m = this->current_font_matrix; this->transformXY(state, x-originX, y-originY, &m.tx, &m.ty); - m.tx += originX; m.ty += originY; + //m.tx += originX; m.ty += originY; if(render == RENDER_FILL || render == RENDER_INVISIBLE) { device->drawchar(device, current_gfxfont, glyphid, &col, &m); } else { msg(" Drawing glyph %d as shape", charid); - if(!textmodeinfo) { + if(!gfxglobals->textmodeinfo) { msg(" Some texts will be rendered as shape"); - textmodeinfo = 1; + gfxglobals->textmodeinfo = 1; } gfxline_t*glyph = current_gfxfont->glyphs[glyphid].line; gfxline_t*tglyph = gfxline_clone(glyph); @@ -1665,8 +1656,9 @@ void GFXOutputDev::processLink(Link *link, Catalog *catalog) } else if(strstr(s, "last") || strstr(s, "end")) { - if(pages && pagepos>0) - page = pages[pagepos-1]; + if(this->page2page && this->num_pages) { + page = this->page2page[this->num_pages-1]; + } } else if(strstr(s, "first") || strstr(s, "top")) { @@ -1714,25 +1706,25 @@ void GFXOutputDev::processLink(Link *link, Catalog *catalog) msg(" drawlink s=%s", s); - if(!linkinfo && (page || s)) + if(!gfxglobals->linkinfo && (page || s)) { msg(" File contains links"); - linkinfo = 1; + gfxglobals->linkinfo = 1; } - if(page>0) - { + if(page>0) { int t; int lpage = -1; - for(t=1;t<=pagepos;t++) { - if(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); @@ -1807,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) { @@ -1864,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(); @@ -1980,16 +1889,9 @@ void GFXOutputDev::updateFont(GfxState *state) if(!this->current_fontinfo->seen) { dumpFontInfo("", gfxFont); } - - gfxfont_t*font = gfxfontlist_findfont(this->gfxfontlist,id); - if(!font) { - font = this->createGfxFont(gfxFont, current_fontinfo); - font->id = strdup(id); - this->gfxfontlist = gfxfontlist_addfont(this->gfxfontlist, font); - } - device->addfont(device, font); - current_gfxfont = font; + current_gfxfont = this->current_fontinfo->gfxfont; + device->addfont(device, current_gfxfont); free(id); updateFontMatrix(state); @@ -2175,7 +2077,7 @@ void GFXOutputDev::drawGeneralImage(GfxState *state, Object *ref, Stream *str, imgStr = new ImageStream(str, width, ncomps,bits); imgStr->reset(); - if(!width || !height || (height<=1 && width<=1 && maskWidth<=1 && maskHeight<=1)) + if(!width || !height || ((height+width)<=1 && (maskWidth+maskHeight)<=1)) { msg(" Ignoring %d by %d image", width, height); unsigned char buf[8]; @@ -2205,17 +2107,17 @@ void GFXOutputDev::drawGeneralImage(GfxState *state, Object *ref, Stream *str, x4 = (int)(x4);y4 = (int)(y4); } - if(!pbminfo && !(str->getKind()==strDCT)) { + if(!gfxglobals->pbminfo && !(str->getKind()==strDCT)) { if(!type3active) { msg(" File contains pbm pictures %s",mask?"(masked)":""); - pbminfo = 1; + gfxglobals->pbminfo = 1; } if(mask) msg(" drawing %d by %d masked picture", width, height); } - if(!jpeginfo && (str->getKind()==strDCT)) { + if(!gfxglobals->jpeginfo && (str->getKind()==strDCT)) { msg(" File contains jpeg pictures"); - jpeginfo = 1; + gfxglobals->jpeginfo = 1; } if(mask) { @@ -2604,32 +2506,6 @@ void addGlobalFontDir(const char*dirname) #endif } -void GFXOutputDev::preparePage(int pdfpage, int outputpage) -{ - if(pdfpage < 0) - return; - - if(!this->pages) { - this->pagebuflen = 1024; - if(pdfpage > this->pagebuflen) - this->pagebuflen = pdfpage+1; - this->pages = (int*)malloc(this->pagebuflen*sizeof(int)); - memset(this->pages, -1, this->pagebuflen*sizeof(int)); - } - - while(pdfpage >= this->pagebuflen) - { - int oldlen = this->pagebuflen; - this->pagebuflen+=1024; - this->pages = (int*)realloc(this->pages, this->pagebuflen*sizeof(int)); - memset(&this->pages[oldlen], -1, (this->pagebuflen-oldlen)*sizeof(int)); - } - - this->pages[pdfpage] = outputpage; - if(pdfpage>this->pagepos) - this->pagepos = pdfpage; -} - void GFXOutputDev::beginTransparencyGroup(GfxState *state, double *bbox, GfxColorSpace *blendingColorSpace, GBool isolated, GBool knockout,