summaryrefslogtreecommitdiff
path: root/render
diff options
context:
space:
mode:
Diffstat (limited to 'render')
-rw-r--r--render/pixmap.c42
-rw-r--r--render/render.c2
-rw-r--r--render/renderimage.c25
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;