X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fpdf%2FGFXOutputDev.cc;h=7f19c2487ba9729d09857356404aed5f6e3531c7;hb=6253f8a29f12eea01da9c5e41af4ece65b0ac19b;hp=f2074b810fe68ed9e0709581ab3217d75c78f640;hpb=56a7509ae89bc94b5291a51e441cc839db2fedc4;p=swftools.git diff --git a/lib/pdf/GFXOutputDev.cc b/lib/pdf/GFXOutputDev.cc index f2074b8..7f19c24 100644 --- a/lib/pdf/GFXOutputDev.cc +++ b/lib/pdf/GFXOutputDev.cc @@ -540,7 +540,7 @@ GFXOutputDev::GFXOutputDev(InfoOutputDev*info, PDFDoc*doc) this->info = info; this->doc = doc; this->xref = doc->getXRef(); - + this->jpeginfo = 0; this->textmodeinfo = 0; this->linkinfo = 0; @@ -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; @@ -571,6 +572,7 @@ GFXOutputDev::GFXOutputDev(InfoOutputDev*info, PDFDoc*doc) this->config_extrafontdata = 0; this->config_fontquality = 10; this->config_optimize_polygons = 0; + this->config_multiply = 1; this->gfxfontlist = gfxfontlist_create(); @@ -590,8 +592,14 @@ void GFXOutputDev::setParameter(const char*key, const char*value) this->config_extrafontdata = atoi(value); } else if(!strcmp(key,"convertgradients")) { this->config_convertgradients = atoi(value); + } else if(!strcmp(key,"multiply")) { + this->config_multiply = atoi(value); + if(this->config_multiply<1) + 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) @@ -996,6 +1004,8 @@ GBool GFXOutputDev::axialShadedFill(GfxState *state, GfxAxialShading *shading) m.ty = (y0 + y1)/2 - 0.5; device->fillgradient(device, &p1, g, gfxgradient_linear, &m); + + free(g); return gTrue; } @@ -1080,6 +1090,8 @@ void GFXOutputDev::strokeGfxline(GfxState *state, gfxline_t*line, int flags) msg(" | phase: %f", this->dashStart); for(t=0;tdashLength;t++) { dash[t] = (float)this->dashPattern[t] * f; + if(!dash[t]) + dash[t] = 1e-37; msg(" | d%-3d: %f", t, this->dashPattern[t]); } dash[this->dashLength] = -1; @@ -1220,6 +1232,9 @@ GFXOutputDev::~GFXOutputDev() 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) { @@ -1778,10 +1793,18 @@ void GFXOutputDev::restoreState(GfxState *state) { void GFXOutputDev::updateLineDash(GfxState *state) { - state->getLineDash(&this->dashPattern, &this->dashLength, &this->dashStart); + if(this->dashPattern) { + free(this->dashPattern);this->dashPattern = 0; + } + double *pattern = 0; + state->getLineDash(&pattern, &this->dashLength, &this->dashStart); msg(" updateLineDash, %d dashes", this->dashLength); if(!this->dashLength) { this->dashPattern = 0; + } else { + double*p = (double*)malloc(this->dashLength*sizeof(this->dashPattern[0])); + memcpy(p, pattern, this->dashLength*sizeof(this->dashPattern[0])); + this->dashPattern = p; } } @@ -1842,7 +1865,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 +1874,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 +1923,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 +1983,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); } @@ -2016,7 +2055,7 @@ static void drawimage(gfxdevice_t*dev, gfxcolor_t* data, int sizex,int sizey, double x1,double y1, double x2,double y2, double x3,double y3, - double x4,double y4, int type) + double x4,double y4, int type, int multiply) { gfxcolor_t*newpic=0; @@ -2041,12 +2080,13 @@ static void drawimage(gfxdevice_t*dev, gfxcolor_t* data, int sizex,int sizey, p5.x = (int)(p5.x*20)/20.0; p5.y = (int)(p5.y*20)/20.0; } - + gfxmatrix_t m; m.m00 = (p4.x-p1.x)/sizex; m.m10 = (p2.x-p1.x)/sizey; m.m01 = (p4.y-p1.y)/sizex; m.m11 = (p2.y-p1.y)/sizey; - m.tx = p1.x - 0.5; - m.ty = p1.y - 0.5; + + m.tx = p1.x - 0.5*multiply; + m.ty = p1.y - 0.5*multiply; gfximage_t img; img.data = (gfxcolor_t*)data; @@ -2062,15 +2102,15 @@ static void drawimage(gfxdevice_t*dev, gfxcolor_t* data, int sizex,int sizey, } void drawimagejpeg(gfxdevice_t*dev, gfxcolor_t*mem, int sizex,int sizey, - double x1,double y1, double x2,double y2, double x3,double y3, double x4,double y4) + double x1,double y1, double x2,double y2, double x3,double y3, double x4,double y4, int multiply) { - drawimage(dev,mem,sizex,sizey,x1,y1,x2,y2,x3,y3,x4,y4, IMAGE_TYPE_JPEG); + drawimage(dev,mem,sizex,sizey,x1,y1,x2,y2,x3,y3,x4,y4, IMAGE_TYPE_JPEG, multiply); } void drawimagelossless(gfxdevice_t*dev, gfxcolor_t*mem, int sizex,int sizey, - double x1,double y1, double x2,double y2, double x3,double y3, double x4,double y4) + double x1,double y1, double x2,double y2, double x3,double y3, double x4,double y4, int multiply) { - drawimage(dev,mem,sizex,sizey,x1,y1,x2,y2,x3,y3,x4,y4, IMAGE_TYPE_LOSSLESS); + drawimage(dev,mem,sizex,sizey,x1,y1,x2,y2,x3,y3,x4,y4, IMAGE_TYPE_LOSSLESS, multiply); } @@ -2203,7 +2243,7 @@ void GFXOutputDev::drawGeneralImage(GfxState *state, Object *ref, Stream *str, buf[0]=1-buf[0]; pic[width*y+x] = buf[0]; } - + if(type3active) { unsigned char*pic2 = 0; numpalette = 16; @@ -2240,7 +2280,7 @@ void GFXOutputDev::drawGeneralImage(GfxState *state, Object *ref, Stream *str, pic2[width*y+x] = pal[pic[y*width+x]]; } } - drawimagelossless(device, pic2, width, height, x1,y1,x2,y2,x3,y3,x4,y4); + drawimagelossless(device, pic2, width, height, x1,y1,x2,y2,x3,y3,x4,y4, config_multiply); delete[] pic2; delete[] pic; delete imgStr; @@ -2282,9 +2322,9 @@ void GFXOutputDev::drawGeneralImage(GfxState *state, Object *ref, Stream *str, } } if(str->getKind()==strDCT) - drawimagejpeg(device, pic, width, height, x1,y1,x2,y2,x3,y3,x4,y4); + drawimagejpeg(device, pic, width, height, x1,y1,x2,y2,x3,y3,x4,y4, config_multiply); else - drawimagelossless(device, pic, width, height, x1,y1,x2,y2,x3,y3,x4,y4); + drawimagelossless(device, pic, width, height, x1,y1,x2,y2,x3,y3,x4,y4, config_multiply); delete[] pic; delete imgStr; if(maskbitmap) free(maskbitmap); @@ -2359,7 +2399,7 @@ void GFXOutputDev::drawGeneralImage(GfxState *state, Object *ref, Stream *str, height = maskHeight; } } - drawimagelossless(device, pic, width, height, x1,y1,x2,y2,x3,y3,x4,y4); + drawimagelossless(device, pic, width, height, x1,y1,x2,y2,x3,y3,x4,y4, config_multiply); delete[] pic; delete imgStr; @@ -2571,17 +2611,20 @@ void GFXOutputDev::preparePage(int pdfpage, int outputpage) 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)); - } 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;