X-Git-Url: http://git.asbjorn.biz/?p=swftools.git;a=blobdiff_plain;f=lib%2Fpdf%2FGFXOutputDev.cc;h=13f70877cc5e3f2450fce79a1bdcb64a3cad2be7;hp=c35cb3971c3262d01363e8a172e5057f96cb1846;hb=9e1987ca321def20b6f756bb5955d41c78c45c05;hpb=77329c490e5346658e4878f065022abb64df5324 diff --git a/lib/pdf/GFXOutputDev.cc b/lib/pdf/GFXOutputDev.cc index c35cb39..13f7087 100644 --- a/lib/pdf/GFXOutputDev.cc +++ b/lib/pdf/GFXOutputDev.cc @@ -105,6 +105,7 @@ struct fontentry { char*pfb; int pfblen; char*fullfilename; + DisplayFontParam *dfp; } pdf2t1map[] ={ {"Times-Roman", "n021003l", n021003l_afm, n021003l_afm_len, n021003l_pfb, n021003l_pfb_len}, {"Times-Italic", "n021023l", n021023l_afm, n021023l_afm_len, n021023l_pfb, n021023l_pfb_len}, @@ -371,6 +372,11 @@ static char fc_ismatch(FcPattern*match, char*family, char*style) } #endif +static inline char islowercase(char c) +{ + return (c>='a' && c<='z'); +} + char* fontconfig_searchForFont(char*name) { #ifdef HAVE_FONTCONFIG @@ -468,20 +474,36 @@ char* fontconfig_searchForFont(char*name) } char*family = strdup(name); - char*style = 0; - char*dash = strchr(family, '-'); - if(!dash) dash = strchr(family, ','); + int len = strlen(family); + char*styles[] = {"Medium", "Regular", "Bold", "Italic", "Black", "Narrow"}; + char*style = 0; + int t; + for(t=0;tl+1 && !strcmp(family+len-l, styles[t]) && islowercase(family[len-l-1])) { + style = styles[t]; + family[len-l]=0; + break; + } + } + if(!style) { + char*dash = strchr(family, '-'); + if(!dash) dash = strchr(family, ','); + if(dash) { + *dash = 0; + style = dash+1; + } + } FcPattern*pattern = 0; - if(dash) { - *dash = 0; - style = dash+1; + if(style) { msg(" FontConfig: Looking for font %s (family=%s style=%s)", name, family, style); pattern = FcPatternBuild(NULL, FC_OUTLINE, FcTypeBool, FcTrue, FC_SCALABLE, FcTypeBool, FcTrue, FC_FAMILY, FcTypeString, family, FC_STYLE, FcTypeString, style, NULL); } else { msg(" FontConfig: Looking for font %s (family=%s)", name, family); pattern = FcPatternBuild(NULL, FC_OUTLINE, FcTypeBool, FcTrue, FC_SCALABLE, FcTypeBool, FcTrue, FC_FAMILY, FcTypeString, family, NULL); } + pattern = FcPatternBuild(NULL, FC_OUTLINE, FcTypeBool, FcTrue, FC_SCALABLE, FcTypeBool, FcTrue, FC_FAMILY, FcTypeString, family, NULL); FcResult result; FcConfigSubstitute(0, pattern, FcMatchPattern); @@ -543,10 +565,11 @@ DisplayFontParam *GFXGlobalParams::getDisplayFont(GString *fontName) } else { msg(" Storing standard PDF font %s at %s", name, pdf2t1map[t].fullfilename); } + DisplayFontParam *dfp = new DisplayFontParam(new GString(fontName), displayFontT1); + dfp->t1.fileName = new GString(pdf2t1map[t].fullfilename); + pdf2t1map[t].dfp = dfp; } - DisplayFontParam *dfp = new DisplayFontParam(new GString(fontName), displayFontT1); - dfp->t1.fileName = new GString(pdf2t1map[t].fullfilename); - return dfp; + return pdf2t1map[t].dfp; } } @@ -627,6 +650,7 @@ GFXOutputDev::GFXOutputDev(InfoOutputDev*info, PDFDoc*doc) this->config_drawonlyshapes = 0; this->config_disable_polygon_conversion = 0; this->config_multiply = 1; + this->config_detectspaces = 1; this->config_linkdatafile = 0; this->page2page = 0; this->num_pages = 0; @@ -644,6 +668,8 @@ void GFXOutputDev::setParameter(const char*key, const char*value) this->config_transparent = atoi(value); } else if(!strcmp(key,"drawonlyshapes")) { this->config_drawonlyshapes = atoi(value); + } else if(!strcmp(key,"detectspaces")) { + this->config_detectspaces = atoi(value); } else if(!strcmp(key,"extrafontdata")) { this->config_extrafontdata = atoi(value); } else if(!strcmp(key,"linkdatafile")) { @@ -996,7 +1022,8 @@ GBool GFXOutputDev::radialShadedFill(GfxState *state, GfxRadialShading *shading) colToByte(color2.c[0]), colToByte(color2.c[1]), colToByte(color2.c[2])); infofeature("radial shaded fills"); - gfxgradient_t*g = (gfxgradient_t*)malloc(sizeof(gfxgradient_t)*3); + gfxgradient_t gr[3]; + gfxgradient_t*g = &gr[0]; g[0].next = &g[1]; g[1].next = &g[2]; g[2].next = 0; @@ -1452,7 +1479,7 @@ void GFXOutputDev::drawChar(GfxState *state, double x, double y, (render == RENDER_INVISIBLE)) { int space = this->current_fontinfo->space_char; - if(config_extrafontdata && space>=0 && m.m00 && !m.m01) { + if(config_extrafontdata && config_detectspaces && space>=0 && m.m00 && !m.m01) { /* space char detection */ if(last_char_gfxfont == current_gfxfont && last_char_y == m.ty && @@ -2663,7 +2690,7 @@ void GFXOutputDev::beginTransparencyGroup(GfxState *state, double *bbox, this->device = (gfxdevice_t*)rfx_calloc(sizeof(gfxdevice_t)); dbg("this->device now %p (old: %p)", this->device, states[statepos].olddevice); - gfxdevice_record_init(this->device); + gfxdevice_record_init(this->device, 0); /*if(!forSoftMask) { ////??? state->setFillOpacity(0.0); @@ -2727,7 +2754,7 @@ void GFXOutputDev::paintTransparencyGroup(GfxState *state, double *bbox) gfxdevice_t ops; dbg("this->device=%p, this->device->name=%s\n", this->device, this->device->name); gfxdevice_ops_init(&ops, this->device, alpha); - gfxresult_record_replay(grouprecording, &ops); + gfxresult_record_replay(grouprecording, &ops, 0); ops.finish(&ops); } grouprecording->destroy(grouprecording); @@ -2760,7 +2787,7 @@ void GFXOutputDev::setSoftMask(GfxState *state, double *bbox, GBool alpha, Funct } states[statepos].olddevice = this->device; this->device = (gfxdevice_t*)rfx_calloc(sizeof(gfxdevice_t)); - gfxdevice_record_init(this->device); + gfxdevice_record_init(this->device, 0); dbg("softmaskrecording is %p (dev=%p) at statepos %d\n", states[statepos].softmaskrecording, this->device, statepos); @@ -2799,15 +2826,15 @@ void GFXOutputDev::clearSoftMask(GfxState *state) /* get outline of all objects below the soft mask */ gfxdevice_t uniondev; gfxdevice_union_init(&uniondev, 0); - gfxresult_record_replay(below, &uniondev); + gfxresult_record_replay(below, &uniondev, 0); gfxline_t*belowoutline = gfxdevice_union_getunion(&uniondev); uniondev.finish(&uniondev); gfxbbox_t bbox = gfxline_getbbox(belowoutline); gfxline_free(belowoutline);belowoutline=0; #if 0 this->device->startclip(this->device, belowoutline); - gfxresult_record_replay(below, this->device); - gfxresult_record_replay(mask, this->device); + gfxresult_record_replay(below, this->device, 0); + gfxresult_record_replay(mask, this->device, 0); this->device->endclip(this->device); #endif @@ -2822,7 +2849,7 @@ void GFXOutputDev::clearSoftMask(GfxState *state) } belowrender.setparameter(&belowrender, "antialize", "2"); belowrender.startpage(&belowrender, width, height); - gfxresult_record_replay(below, &belowrender); + gfxresult_record_replay(below, &belowrender, 0); belowrender.endpage(&belowrender); gfxresult_t* belowresult = belowrender.finish(&belowrender); gfximage_t* belowimg = (gfximage_t*)belowresult->get(belowresult,"page0"); @@ -2831,7 +2858,7 @@ void GFXOutputDev::clearSoftMask(GfxState *state) gfxdevice_t maskrender; gfxdevice_render_init(&maskrender); maskrender.startpage(&maskrender, width, height); - gfxresult_record_replay(mask, &maskrender); + gfxresult_record_replay(mask, &maskrender, 0); maskrender.endpage(&maskrender); gfxresult_t* maskresult = maskrender.finish(&maskrender); gfximage_t* maskimg = (gfximage_t*)maskresult->get(maskresult,"page0");