X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fpdf%2FGFXOutputDev.cc;h=881236c91bfb42306b7933036ab40319ba7b964b;hb=ec4d810db18537d3cf9a5be624f0b7ebebdd0e1a;hp=88fa7288c623cbb6aa7066cf3d30d7c6b321a461;hpb=1328e56e38a5148fb51eb0225c5570bc6d4645b4;p=swftools.git diff --git a/lib/pdf/GFXOutputDev.cc b/lib/pdf/GFXOutputDev.cc index 88fa728..881236c 100644 --- a/lib/pdf/GFXOutputDev.cc +++ b/lib/pdf/GFXOutputDev.cc @@ -73,13 +73,13 @@ #include "../devices/polyops.h" #include "../devices/render.h" -#include "../art/libart.h" - #include "../png.h" #include "fonts.h" #include +#define SQRT2 1.41421356237309504880 + typedef struct _fontfile { const char*filename; @@ -1026,14 +1026,13 @@ void GFXOutputDev::endPage() device->endclip(device); outer_clip_box = 0; } - if(this->dashPattern) { - free(this->dashPattern); - this->dashPattern = 0; - } + this->dashPattern = 0; /* notice: we're not fully done yet with this page- there might still be a few calls to drawLink() yet to come */ } +static inline double sqr(double x) {return x*x;} + #define STROKE_FILL 1 #define STROKE_CLIP 2 void GFXOutputDev::strokeGfxline(GfxState *state, gfxline_t*line, int flags) @@ -1067,13 +1066,29 @@ void GFXOutputDev::strokeGfxline(GfxState *state, gfxline_t*line, int flags) gfxline_t*line2 = 0; - if(0 && this->dashLength && this->dashPattern) { + if(this->dashLength && this->dashPattern) { float * dash = (float*)malloc(sizeof(float)*(this->dashLength+1)); int t; + + /* try to find out how much the transformation matrix would + stretch the dashes, and factor that into the dash lengths. + This is not the entirely correct approach- it would be + better to first convert the path to an unscaled version, + then apply dashing, and then transform the path using + the current transformation matrix. However there are few + PDFs which actually stretch a dashed path in a non-orthonormal + way */ + double tx1, ty1, tx2, ty2; + this->transformXY(state, 0, 0, &tx1, &ty1); + this->transformXY(state, 1, 1, &tx2, &ty2); + double f = sqrt(sqr(tx2-tx1)+sqr(ty2-ty1)) / SQRT2; + + f = 1.0; //disable dash length transform for now + msg(" %d dashes", this->dashLength); msg(" | phase: %f", this->dashStart); for(t=0;tdashLength;t++) { - dash[t] = (float)this->dashPattern[t]; + dash[t] = (float)this->dashPattern[t] * f; msg(" | d%-3d: %f", t, this->dashPattern[t]); } dash[this->dashLength] = -1; @@ -1081,7 +1096,7 @@ void GFXOutputDev::strokeGfxline(GfxState *state, gfxline_t*line, int flags) dump_outline(line); } - line2 = gfxtool_dash_line(line, dash, (float)this->dashStart); + line2 = gfxtool_dash_line(line, dash, (float)(this->dashStart*f)); line = line2; free(dash); msg(" After dashing:"); @@ -1113,7 +1128,7 @@ void GFXOutputDev::strokeGfxline(GfxState *state, gfxline_t*line, int flags) } else { device->fill(device, gfxline, &col); } - free(gfxline); + gfxline_free(gfxline); gfxpoly_free(poly); } else { if(flags&STROKE_CLIP) @@ -1724,7 +1739,7 @@ void GFXOutputDev::processLink(Link *link, Catalog *catalog) } void GFXOutputDev::saveState(GfxState *state) { - dbg("saveState");dbgindent+=2; + dbg("saveState"); dbgindent+=2; msg(" saveState"); updateAll(state); @@ -2546,11 +2561,11 @@ void GFXOutputDev::beginTransparencyGroup(GfxState *state, double *bbox, GBool forSoftMask) { const char*colormodename = ""; - + if(blendingColorSpace) { colormodename = GfxColorSpace::getColorSpaceModeName(blendingColorSpace->getMode()); } - dbg("beginTransparencyGroup %.1f/%.1f/%.1f/%.1f %s isolated=%d knockout=%d forsoftmask=%d", bbox[0],bbox[1],bbox[2],bbox[3], colormodename, isolated, knockout, forSoftMask); + dbg("beginTransparencyGroup device=%08x %.1f/%.1f/%.1f/%.1f %s isolated=%d knockout=%d forsoftmask=%d", device, bbox[0],bbox[1],bbox[2],bbox[3], colormodename, isolated, knockout, forSoftMask); msg(" beginTransparencyGroup %.1f/%.1f/%.1f/%.1f %s isolated=%d knockout=%d forsoftmask=%d", bbox[0],bbox[1],bbox[2],bbox[3], colormodename, isolated, knockout, forSoftMask); //states[statepos].createsoftmask |= forSoftMask; @@ -2628,8 +2643,14 @@ void GFXOutputDev::paintTransparencyGroup(GfxState *state, double *bbox) void GFXOutputDev::setSoftMask(GfxState *state, double *bbox, GBool alpha, Function *transferFunc, GfxColor *rgb) { + if(states[statepos].softmask) { + /* shouldn't happen, but *does* happen */ + clearSoftMask(state); + } + /* alpha = 1: retrieve mask values from alpha layer alpha = 0: retrieve mask values from luminance */ + dbg("setSoftMask %.1f/%.1f/%.1f/%.1f alpha=%d backdrop=%02x%02x%02x", bbox[0], bbox[1], bbox[2], bbox[3], alpha, colToByte(rgb->c[0]), colToByte(rgb->c[1]), colToByte(rgb->c[2])); msg(" setSoftMask %.1f/%.1f/%.1f/%.1f alpha=%d backdrop=%02x%02x%02x", @@ -2643,7 +2664,7 @@ void GFXOutputDev::setSoftMask(GfxState *state, double *bbox, GBool alpha, Funct this->device = (gfxdevice_t*)rfx_calloc(sizeof(gfxdevice_t)); gfxdevice_record_init(this->device); - dbg("softmaskrecording is %08x at statepos %d\n", states[statepos].softmaskrecording, statepos); + dbg("softmaskrecording is %08x (dev=%08x) at statepos %d\n", states[statepos].softmaskrecording, this->device, statepos); states[statepos].softmask = 1; states[statepos].softmask_alpha = alpha; @@ -2666,7 +2687,7 @@ void GFXOutputDev::clearSoftMask(GfxState *state) return; states[statepos].softmask = 0; dbg("clearSoftMask statepos=%d", statepos); - msg(" clearSoftMask"); + msg(" clearSoftMask statepos=%d", statepos); if(!states[statepos].softmaskrecording || strcmp(this->device->name, "record")) { msg(" Error in softmask/tgroup ordering");