X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fpdf%2FGFXOutputDev.cc;h=ef441b4ccc1acbf9e28808bca5a2fc804b2dbb41;hb=44b96036f984be2cfdf899f1d6de94230cb4c922;hp=3dcaed97cfbd8cc993887fcd002d535d896c4548;hpb=9f378b70ff01b6210e67d1b72b5ca3871016e3d7;p=swftools.git diff --git a/lib/pdf/GFXOutputDev.cc b/lib/pdf/GFXOutputDev.cc index 3dcaed9..ef441b4 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; @@ -572,8 +572,10 @@ 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(); + this->dashPattern = 0; memset(states, 0, sizeof(states)); this->featurewarnings = 0; @@ -591,6 +593,10 @@ 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")) { @@ -999,6 +1005,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; } @@ -1083,6 +1091,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; @@ -1223,6 +1233,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) { @@ -1781,10 +1794,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; } } @@ -2035,7 +2056,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; @@ -2060,12 +2081,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; @@ -2081,15 +2103,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); } @@ -2154,7 +2176,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]; @@ -2222,7 +2244,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; @@ -2259,7 +2281,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; @@ -2301,9 +2323,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); @@ -2378,7 +2400,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;