summaryrefslogtreecommitdiff
path: root/render/pixmap.c
diff options
context:
space:
mode:
authorTor Andersson <tor@ghostscript.com>2004-10-19 08:21:10 +0200
committerTor Andersson <tor@ghostscript.com>2004-10-19 08:21:10 +0200
commit4d9498561d4a73ffa2389e9fecd8893ff823a95c (patch)
treec25e45034de17227f9652f1375c8b2c473b76757 /render/pixmap.c
parent117725ec61dc4953f4070dacfb2aab7024a7df36 (diff)
downloadmupdf-4d9498561d4a73ffa2389e9fecd8893ff823a95c.tar.xz
8-bit rendering and span scissoring
Diffstat (limited to 'render/pixmap.c')
-rw-r--r--render/pixmap.c70
1 files changed, 40 insertions, 30 deletions
diff --git a/render/pixmap.c b/render/pixmap.c
index 5dd8bcda..84a542b9 100644
--- a/render/pixmap.c
+++ b/render/pixmap.c
@@ -18,13 +18,13 @@ fz_newpixmap(fz_pixmap **pixp, fz_colorspace *cs, int x, int y, int w, int h, in
pix->a = a;
pix->stride = (pix->n + pix->a) * pix->w;
- pix->samples = fz_malloc(sizeof(short) * pix->stride * pix->h);
+ pix->samples = fz_malloc(sizeof(unsigned char) * pix->stride * pix->h);
if (!pix->samples) {
fz_free(pix);
return fz_outofmem;
}
- memset(pix->samples, 0, sizeof(short) * pix->stride * pix->h);
+ memset(pix->samples, 0, sizeof(unsigned char) * pix->stride * pix->h);
return nil;
}
@@ -39,7 +39,7 @@ fz_freepixmap(fz_pixmap *pix)
void
fz_clearpixmap(fz_pixmap *pix)
{
- memset(pix->samples, 0, sizeof(short) * pix->stride * pix->h);
+ memset(pix->samples, 0, sizeof(unsigned char) * pix->stride * pix->h);
}
void
@@ -47,37 +47,47 @@ fz_debugpixmap(fz_pixmap *pix)
{
int x, y;
- FILE *f = fopen("out.ppm", "w");
+ FILE *ppm = fopen("out.ppm", "w");
+ FILE *pgm = fopen("out.pgm", "w");
+
+ fprintf(ppm, "P6\n%d %d\n255\n", pix->w, pix->h);
+ fprintf(pgm, "P5\n%d %d\n255\n", pix->w, pix->h);
if (pix->n == 3 && pix->a == 1)
{
- fprintf(f, "P6\n%d %d\n255\n", pix->w, pix->h);
for (y = 0; y < pix->h; y++)
for (x = 0; x < pix->w; x++)
{
- int r = (pix->samples[x * 4 + y * pix->stride + 0] * 255) >> 14;
- int g = (pix->samples[x * 4 + y * pix->stride + 1] * 255) >> 14;
- int b = (pix->samples[x * 4 + y * pix->stride + 2] * 255) >> 14;
- int a = (pix->samples[x * 4 + y * pix->stride + 3] * 255) >> 14;
- putc(((r * a) / 255) + (255 - a), f);
- putc(((g * a) / 255) + (255 - a), f);
- putc(((b * a) / 255) + (255 - a), f);
- // putc(a, f);
- // putc(a, f);
- // putc(a, f);
+ int r = pix->samples[x * 4 + y * pix->stride + 0];
+ int g = pix->samples[x * 4 + y * pix->stride + 1];
+ int b = pix->samples[x * 4 + y * pix->stride + 2];
+ int a = pix->samples[x * 4 + y * pix->stride + 3];
+
+ //putc(r, ppm);
+ //putc(g, ppm);
+ //putc(b, ppm);
+ putc(((r * a) / 255) + (255 - a), ppm);
+ putc(((g * a) / 255) + (255 - a), ppm);
+ putc(((b * a) / 255) + (255 - a), ppm);
+
+ putc(a, pgm);
}
}
else if (pix->n == 0 && pix->a == 1)
{
- fprintf(f, "P5\n%d %d\n255\n", pix->w, pix->h);
for (y = 0; y < pix->h; y++)
for (x = 0; x < pix->w; x++)
{
- int a = (pix->samples[x + y * pix->stride] * 255) >> 14;
- putc(a, f);
+ int a = pix->samples[x + y * pix->stride];
+ putc(0, ppm);
+ putc(0, ppm);
+ putc(0, ppm);
+ putc(a, pgm);
}
}
- fclose(f);
+
+ fclose(ppm);
+ fclose(pgm);
}
void
@@ -92,18 +102,18 @@ fz_blendover(fz_pixmap *src, fz_pixmap *dst)
for (y = 0; y < dst->h; y++)
{
- short *s = &src->samples[y * src->stride];
- short *d = &dst->samples[y * dst->stride];
+ unsigned char *s = &src->samples[y * src->stride];
+ unsigned char *d = &dst->samples[y * dst->stride];
for (x = 0; x < dst->w; x++)
{
int sa = s[3];
- int ssa = (1 << 14) - sa;
+ int ssa = 255 - sa;
- d[0] = ((s[0] * sa) >> 14) + ((d[0] * ssa) >> 14);
- d[1] = ((s[1] * sa) >> 14) + ((d[1] * ssa) >> 14);
- d[2] = ((s[2] * sa) >> 14) + ((d[2] * ssa) >> 14);
- d[3] = sa + ((ssa * d[3]) >> 14);
+ d[0] = fz_mul255(s[0], sa) + fz_mul255(d[0], ssa);
+ d[1] = fz_mul255(s[1], sa) + fz_mul255(d[1], ssa);
+ d[2] = fz_mul255(s[2], sa) + fz_mul255(d[2], ssa);
+ d[3] = sa + fz_mul255(d[3], ssa);
s += 4;
d += 4;
@@ -124,15 +134,15 @@ fz_blendmask(fz_pixmap *dst, fz_pixmap *src, fz_pixmap *msk)
for (y = 0; y < dst->h; y++)
{
- short *d = &dst->samples[y * dst->stride];
- short *s = &src->samples[y * src->stride];
- short *m = &msk->samples[y * msk->stride];
+ unsigned char *d = &dst->samples[y * dst->stride];
+ unsigned char *s = &src->samples[y * src->stride];
+ unsigned char *m = &msk->samples[y * msk->stride];
for (x = 0; x < dst->w; x++)
{
for (k = 0; k < dst->n; k++)
*d++ = *s++;
- *d++ = (*m++ * *s++) >> 14;
+ *d++ = fz_mul255(*m++, *s++);
}
}
}