diff options
Diffstat (limited to 'render')
-rw-r--r-- | render/pixmap.c | 42 | ||||
-rw-r--r-- | render/render.c | 2 | ||||
-rw-r--r-- | render/renderimage.c | 25 |
3 files changed, 45 insertions, 24 deletions
diff --git a/render/pixmap.c b/render/pixmap.c index 634fe8f6..ed64769f 100644 --- a/render/pixmap.c +++ b/render/pixmap.c @@ -82,25 +82,46 @@ fz_blendover(fz_pixmap *src, fz_pixmap *dst) { int x, y, k; - assert(dst->n == src->n); + assert(dst->n == src->n || src->n == 1); assert(dst->w == src->w); assert(dst->h == src->h); unsigned char *s = src->samples; unsigned char *d = dst->samples; - for (y = 0; y < dst->h; y++) + if (dst->n == src->n) { - for (x = 0; x < dst->w; x++) + for (y = 0; y < dst->h; y++) { - int sa = s[0]; - int ssa = 255 - sa; + for (x = 0; x < dst->w; x++) + { + int sa = s[0]; + int ssa = 255 - sa; - for (k = 0; k < dst->n; k++) - d[k] = s[k] + fz_mul255(d[k], ssa); + for (k = 0; k < dst->n; k++) + d[k] = s[k] + fz_mul255(d[k], ssa); - s += src->n; - d += dst->n; + s += src->n; + d += dst->n; + } + } + } + else if (src->n == 1) + { + for (y = 0; y < dst->h; y++) + { + for (x = 0; x < dst->w; x++) + { + int sa = s[0]; + int ssa = 255 - sa; + + d[0] = s[0] + fz_mul255(d[0], ssa); + for (k = 1; k < dst->n; k++) + d[k] = 0 + fz_mul255(d[k], ssa); + + s += src->n; + d += dst->n; + } } } } @@ -111,7 +132,6 @@ fz_blendmask(fz_pixmap *dst, fz_pixmap *src, fz_pixmap *msk) int x, y, k; assert(src->n == dst->n); - assert(msk->n == 1); unsigned char *d = dst->samples; unsigned char *s = src->samples; @@ -125,7 +145,7 @@ fz_blendmask(fz_pixmap *dst, fz_pixmap *src, fz_pixmap *msk) { *d++ = fz_mul255(*s++, *m); } - m++; + m += msk->n; } } } diff --git a/render/render.c b/render/render.c index dd4b543d..e1e0e04d 100644 --- a/render/render.c +++ b/render/render.c @@ -277,6 +277,8 @@ fz_rendernode(fz_renderer *gc, fz_node *node, fz_matrix ctm) return fz_rendertext(gc, (fz_textnode*)node, ctm); case FZ_NIMAGE: return fz_renderimage(gc, (fz_imagenode*)node, ctm); + case FZ_NLINK: + return fz_rendernode(gc, ((fz_linknode*)node)->tree->root, ctm); default: return nil; } diff --git a/render/renderimage.c b/render/renderimage.c index e2c98eb1..e4daae57 100644 --- a/render/renderimage.c +++ b/render/renderimage.c @@ -5,7 +5,6 @@ void fz_gammapixmap(fz_pixmap *pix, float gamma); #define LERP(a,b,t) (a + (((b - a) * t) >> 16)) -#define OUTSIDE(x,a,b) (x < a || x >= b) static inline int getcomp(fz_pixmap *pix, int u, int v, int k) { @@ -13,8 +12,8 @@ static inline int getcomp(fz_pixmap *pix, int u, int v, int k) return 0; if (v < 0 || v >= pix->h) return 0; - u = CLAMP(u, 0, pix->w - 1); - v = CLAMP(v, 0, pix->h - 1); +// u = CLAMP(u, 0, pix->w - 1); +// v = CLAMP(v, 0, pix->h - 1); return pix->samples[ (v * pix->w + u) * pix->n + k ]; } @@ -75,10 +74,10 @@ overscanrgb(fz_matrix *invmat, fz_pixmap *dst, fz_pixmap *src, int y, int x0, in int sg = sampleimage(src, u, v, 2); int sb = sampleimage(src, u, v, 3); - int da = dst->samples[ (y * dst->w + x) * dst->n + 0 ]; - int dr = dst->samples[ (y * dst->w + x) * dst->n + 1 ]; - int dg = dst->samples[ (y * dst->w + x) * dst->n + 2 ]; - int db = dst->samples[ (y * dst->w + x) * dst->n + 3 ]; + int da = dst->samples[ ((y-dst->y) * dst->w + x-dst->x) * dst->n + 0 ]; + int dr = dst->samples[ ((y-dst->y) * dst->w + x-dst->x) * dst->n + 1 ]; + int dg = dst->samples[ ((y-dst->y) * dst->w + x-dst->x) * dst->n + 2 ]; + int db = dst->samples[ ((y-dst->y) * dst->w + x-dst->x) * dst->n + 3 ]; int ssa = 255 - sa; @@ -87,10 +86,10 @@ overscanrgb(fz_matrix *invmat, fz_pixmap *dst, fz_pixmap *src, int y, int x0, in dg = sg + fz_mul255(dg, ssa); db = sb + fz_mul255(db, ssa); - dst->samples[ (y * dst->w + x) * dst->n + 0 ] = sa; - dst->samples[ (y * dst->w + x) * dst->n + 1 ] = sr; - dst->samples[ (y * dst->w + x) * dst->n + 2 ] = sg; - dst->samples[ (y * dst->w + x) * dst->n + 3 ] = sb; + dst->samples[ ((y-dst->y) * dst->w + x-dst->x) * dst->n + 0 ] = da; + dst->samples[ ((y-dst->y) * dst->w + x-dst->x) * dst->n + 1 ] = dr; + dst->samples[ ((y-dst->y) * dst->w + x-dst->x) * dst->n + 2 ] = dg; + dst->samples[ ((y-dst->y) * dst->w + x-dst->x) * dst->n + 3 ] = db; u += du; v += dv; @@ -131,9 +130,9 @@ drawtile(fz_renderer *gc, fz_pixmap *out, fz_pixmap *tile, fz_matrix ctm, int ov for (y = top; y <= bot; y++) { if (over && tile->n == 4) - overscanrgb(&invmat, out, tile, y, x0, x1); + overscanrgb(&invmat, out, tile, y, x0, x1 + 1); else - drawscan(&invmat, out, tile, y, x0, x1); + drawscan(&invmat, out, tile, y, x0, x1 + 1); } return nil; |