X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fpdf%2FGFXOutputDev.cc;h=2d80cb24e2e7c3fe3b1e51e190f2961151e911c5;hb=580c48fef10df9184cf2728338e89f7db0fef2f5;hp=b0d11692ae2c9d5ae21bed36db482344c8aab7a1;hpb=d46619a310dd04066cc117e904b84785d1a0cd51;p=swftools.git diff --git a/lib/pdf/GFXOutputDev.cc b/lib/pdf/GFXOutputDev.cc index b0d1169..2d80cb2 100644 --- a/lib/pdf/GFXOutputDev.cc +++ b/lib/pdf/GFXOutputDev.cc @@ -599,7 +599,8 @@ GFXOutputDev::GFXOutputDev(InfoOutputDev*info, PDFDoc*doc) this->config_remapunicode=0; this->config_transparent=0; this->config_extrafontdata = 0; - this->config_optimize_polygons = 0; + this->config_drawonlyshapes = 0; + this->config_disable_polygon_conversion = 0; this->config_multiply = 1; this->page2page = 0; this->num_pages = 0; @@ -615,6 +616,8 @@ void GFXOutputDev::setParameter(const char*key, const char*value) this->config_remapunicode = atoi(value); } else if(!strcmp(key,"transparent")) { this->config_transparent = atoi(value); + } else if(!strcmp(key,"drawonlyshapes")) { + this->config_drawonlyshapes = atoi(value); } else if(!strcmp(key,"extrafontdata")) { this->config_extrafontdata = atoi(value); } else if(!strcmp(key,"convertgradients")) { @@ -623,8 +626,8 @@ void GFXOutputDev::setParameter(const char*key, const char*value) 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,"disable_polygon_conversion")) { + this->config_disable_polygon_conversion = atoi(value); } } @@ -1180,8 +1183,8 @@ void GFXOutputDev::strokeGfxline(GfxState *state, gfxline_t*line, int flags) } if(flags&STROKE_FILL) { - gfxpoly_t* poly = gfxpoly_strokeToPoly(line, width, capType, joinType, miterLimit); - gfxline_t*gfxline = gfxpoly_to_gfxline(poly); + gfxpoly_t* poly = gfxpoly_from_stroke(line, width, capType, joinType, miterLimit, DEFAULT_GRID); + gfxline_t*gfxline = gfxline_from_gfxpoly(poly); if(getLogLevel() >= LOGLEVEL_TRACE) { dump_outline(gfxline); } @@ -1195,7 +1198,7 @@ void GFXOutputDev::strokeGfxline(GfxState *state, gfxline_t*line, int flags) device->fill(device, gfxline, &col); } gfxline_free(gfxline); - gfxpoly_free(poly); + gfxpoly_destroy(poly); } else { if(flags&STROKE_CLIP) msg(" Stroke&clip not supported at the same time"); @@ -1219,20 +1222,21 @@ gfxcolor_t getFillColor(GfxState * state) return col; } -void GFXOutputDev::fillGfxLine(GfxState *state, gfxline_t*line) +void GFXOutputDev::fillGfxLine(GfxState *state, gfxline_t*line, char evenodd) { gfxcolor_t col = getFillColor(state); if(getLogLevel() >= LOGLEVEL_TRACE) { - msg(" fill %02x%02x%02x%02x", col.r, col.g, col.b, col.a); + msg(" %sfill %02x%02x%02x%02x%s", evenodd?"eo":"", col.r, col.g, col.b, col.a); dump_outline(line); } device->fill(device, line, &col); } -void GFXOutputDev::clipToGfxLine(GfxState *state, gfxline_t*line) +void GFXOutputDev::clipToGfxLine(GfxState *state, gfxline_t*line, char evenodd) { if(getLogLevel() >= LOGLEVEL_TRACE) { + msg(" %sclip", evenodd?"eo":""); dump_outline(line); } gfxbbox_t bbox = gfxline_getbbox(line); @@ -1247,12 +1251,12 @@ void GFXOutputDev::clip(GfxState *state) GfxPath * path = state->getPath(); msg(" clip"); gfxline_t*line = gfxPath_to_gfxline(state, path, 1, user_movex + clipmovex, user_movey + clipmovey); - if(config_optimize_polygons) { - gfxline_t*line2 = gfxline_circularToEvenOdd(line); + if(!config_disable_polygon_conversion) { + gfxline_t*line2 = gfxpoly_circular_to_evenodd(line, DEFAULT_GRID); gfxline_free(line); line = line2; } - clipToGfxLine(state, line); + clipToGfxLine(state, line, 0); gfxline_free(line); } @@ -1260,7 +1264,7 @@ void GFXOutputDev::eoClip(GfxState *state) { GfxPath * path = state->getPath(); gfxline_t*line = gfxPath_to_gfxline(state, path, 1, user_movex + clipmovex, user_movey + clipmovey); - clipToGfxLine(state, line); + clipToGfxLine(state, line, 1); gfxline_free(line); } void GFXOutputDev::clipToStrokePath(GfxState *state) @@ -1415,7 +1419,7 @@ void GFXOutputDev::drawChar(GfxState *state, double x, double y, msg(" drawChar(%f,%f,c='%c' (%d), u=%d <%d>) CID=%d render=%d glyphid=%d font=%08x",m.tx,m.ty,(charid&127)>=32?charid:'?', charid, u, uLen, font->isCIDFont(), render, glyphid, current_gfxfont); - if(render == RENDER_FILL || render == RENDER_INVISIBLE) { + if((render == RENDER_FILL && !config_drawonlyshapes) || render == RENDER_INVISIBLE) { device->drawchar(device, current_gfxfont, glyphid, &col, &m); } else { msg(" Drawing glyph %d as shape", charid); @@ -1453,11 +1457,11 @@ void GFXOutputDev::endString(GfxState *state) however */ device->setparameter(device, "mark","TXT"); if((render&3) == RENDER_FILL) { - fillGfxLine(state, current_text_stroke); + fillGfxLine(state, current_text_stroke, 0); gfxline_free(current_text_stroke); current_text_stroke = 0; } else if((render&3) == RENDER_FILLSTROKE) { - fillGfxLine(state, current_text_stroke); + fillGfxLine(state, current_text_stroke, 0); strokeGfxline(state, current_text_stroke,0); gfxline_free(current_text_stroke); current_text_stroke = 0; @@ -1477,7 +1481,7 @@ void GFXOutputDev::endTextObject(GfxState *state) if(current_text_clip) { device->setparameter(device, "mark","TXT"); - clipToGfxLine(state, current_text_clip); + clipToGfxLine(state, current_text_clip, 0); device->setparameter(device, "mark",""); gfxline_free(current_text_clip); current_text_clip = 0; @@ -2468,12 +2472,12 @@ void GFXOutputDev::fill(GfxState *state) GfxPath * path = state->getPath(); gfxline_t*line= gfxPath_to_gfxline(state, path, 1, user_movex + clipmovex, user_movey + clipmovey); - if(config_optimize_polygons) { - gfxline_t*line2 = gfxline_circularToEvenOdd(line); + if(!config_disable_polygon_conversion) { + gfxline_t*line2 = gfxpoly_circular_to_evenodd(line, DEFAULT_GRID); gfxline_free(line); line = line2; } - fillGfxLine(state, line); + fillGfxLine(state, line, 0); gfxline_free(line); } @@ -2484,7 +2488,7 @@ void GFXOutputDev::eoFill(GfxState *state) GfxPath * path = state->getPath(); gfxline_t*line= gfxPath_to_gfxline(state, path, 1, user_movex + clipmovex, user_movey + clipmovey); - fillGfxLine(state, line); + fillGfxLine(state, line, 1); gfxline_free(line); } @@ -2504,8 +2508,8 @@ void addGlobalFont(const char*filename) memset(f, 0, sizeof(fontfile_t)); f->filename = filename; int len = strlen(filename); - char*r1 = strrchr(filename, '/'); - char*r2 = strrchr(filename, '\\'); + char*r1 = strrchr((char*)filename, '/'); + char*r2 = strrchr((char*)filename, '\\'); if(r2>r1) r1 = r2; if(r1) {