this->info = info;
this->doc = doc;
this->xref = doc->getXRef();
-
+
this->jpeginfo = 0;
this->textmodeinfo = 0;
this->linkinfo = 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_extrafontdata = 0;
this->config_fontquality = 10;
this->config_optimize_polygons = 0;
+ this->config_multiply = 1;
this->gfxfontlist = gfxfontlist_create();
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)
m.ty = (y0 + y1)/2 - 0.5;
device->fillgradient(device, &p1, g, gfxgradient_linear, &m);
+
+ free(g);
return gTrue;
}
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) {
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("<debug> 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;
}
}
}
-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));
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;t<src->num_glyphs;t++) {
if(src->glyphs[t]) {
SplashPath*path = src->glyphs[t]->path;
// (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("<warning> 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++;
}
}
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);
}
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;
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;
}
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);
}
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];
buf[0]=1-buf[0];
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;
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;
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;xx<x2;xx++)
+ for(yy=y1;yy<y2;yy++) {
+ alpha += maskbitmap[yy*maskWidth+xx];
+ count ++;
+ }
+ if(count) {
+ pic[width*y+x].a = alpha / count;
+ } else {
+ pic[width*y+x].a = maskbitmap[y1*maskWidth+x1];
+ }
}
}
}
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);
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;
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;