X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fpdf%2FGFXOutputDev.cc;h=3dcaed97cfbd8cc993887fcd002d535d896c4548;hb=9f378b70ff01b6210e67d1b72b5ca3871016e3d7;hp=3d5725d4b18f276722eb37740bfb371bd259d0f6;hpb=53206a6ffa652bc3e867836c9c88e55a17ca0ebf;p=swftools.git diff --git a/lib/pdf/GFXOutputDev.cc b/lib/pdf/GFXOutputDev.cc index 3d5725d..3dcaed9 100644 --- a/lib/pdf/GFXOutputDev.cc +++ b/lib/pdf/GFXOutputDev.cc @@ -564,6 +564,7 @@ GFXOutputDev::GFXOutputDev(InfoOutputDev*info, PDFDoc*doc) 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; @@ -592,6 +593,8 @@ void GFXOutputDev::setParameter(const char*key, const char*value) this->config_convertgradients = atoi(value); } 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) @@ -1842,7 +1845,7 @@ void GFXOutputDev::updateStrokeColor(GfxState *state) } -static gfxfont_t* createGfxFont(GfxFont*xpdffont, FontInfo*src, double config_fontquality) +gfxfont_t* GFXOutputDev::createGfxFont(GfxFont*xpdffont, FontInfo*src) { gfxfont_t*font = (gfxfont_t*)malloc(sizeof(gfxfont_t)); memset(font, 0, sizeof(gfxfont_t)); @@ -1851,11 +1854,14 @@ static gfxfont_t* createGfxFont(GfxFont*xpdffont, FontInfo*src, double config_fo 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; @@ -1897,8 +1903,21 @@ static gfxfont_t* createGfxFont(GfxFont*xpdffont, FontInfo*src, double config_fo // (f&splashPathFirst)?"first":"", // (f&splashPathLast)?"last":""); } + glyph->line = (gfxline_t*)drawer.result(&drawer); - glyph->advance = xmax*scale; // we don't know the real advance value, so this'll have to do + 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++; } } @@ -1944,7 +1963,7 @@ void GFXOutputDev::updateFont(GfxState *state) gfxfont_t*font = gfxfontlist_findfont(this->gfxfontlist,id); if(!font) { - font = createGfxFont(gfxFont, current_fontinfo, this->config_fontquality); + font = this->createGfxFont(gfxFont, current_fontinfo); font->id = strdup(id); this->gfxfontlist = gfxfontlist_addfont(this->gfxfontlist, font); } @@ -2079,6 +2098,8 @@ void GFXOutputDev::drawGeneralImage(GfxState *state, Object *ref, Stream *str, GBool inlineImg, int mask, int*maskColors, Stream *maskStr, int maskWidth, int maskHeight, GBool maskInvert, GfxImageColorMap*maskColorMap) { + /* the code in this function is *old*. It's not pretty, but it works. */ + double x1,y1,x2,y2,x3,y3,x4,y4; ImageStream *imgStr; Guchar pixBuf[4]; @@ -2202,10 +2223,6 @@ void GFXOutputDev::drawGeneralImage(GfxState *state, Object *ref, Stream *str, pic[width*y+x] = buf[0]; } - /* the size of the drawn image is added to the identifier - as the same image may require different bitmaps if displayed - at different sizes (due to antialiasing): */ - int found = -1; if(type3active) { unsigned char*pic2 = 0; numpalette = 16; @@ -2263,7 +2280,23 @@ void GFXOutputDev::drawGeneralImage(GfxState *state, Object *ref, Stream *str, pic[width*y+x].b = (unsigned char)(colToByte(rgb.b)); pic[width*y+x].a = 255;//(U8)(rgb.a * 255 + 0.5); if(maskbitmap) { - pic[width*y+x].a = maskbitmap[(y*maskHeight/height)*maskWidth+(x*maskWidth/width)]; + int x1 = x*maskWidth/width; + int y1 = y*maskHeight/height; + int x2 = (x+1)*maskWidth/width; + int y2 = (y+1)*maskHeight/height; + int xx,yy; + unsigned int alpha=0; + unsigned int count=0; + for(xx=x1;xxpages) { 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)); - } else { - 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)); - } } + + 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;