diff options
author | Tor Andersson <tor@ghostscript.com> | 2004-10-19 08:21:10 +0200 |
---|---|---|
committer | Tor Andersson <tor@ghostscript.com> | 2004-10-19 08:21:10 +0200 |
commit | 4d9498561d4a73ffa2389e9fecd8893ff823a95c (patch) | |
tree | c25e45034de17227f9652f1375c8b2c473b76757 /render/pixmap.c | |
parent | 117725ec61dc4953f4070dacfb2aab7024a7df36 (diff) | |
download | mupdf-4d9498561d4a73ffa2389e9fecd8893ff823a95c.tar.xz |
8-bit rendering and span scissoring
Diffstat (limited to 'render/pixmap.c')
-rw-r--r-- | render/pixmap.c | 70 |
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++); } } } |