diff options
author | Robin Watts <robin.watts@artifex.com> | 2010-06-29 21:56:34 +0200 |
---|---|---|
committer | Robin Watts <robin.watts@artifex.com> | 2010-06-29 21:56:34 +0200 |
commit | 7748021cc09a52fbb12fc33d7e84806890394249 (patch) | |
tree | 692a594b52bb72b55247a0db7b1095783d552b17 /fitz | |
parent | d9661dcb35f70cbd5019db4320cd24d6dbae584a (diff) | |
download | mupdf-7748021cc09a52fbb12fc33d7e84806890394249.tar.xz |
Move over to RGBA instead of ARGB. Add missing gray-alpha 'duff' functions.
Diffstat (limited to 'fitz')
-rw-r--r-- | fitz/dev_draw.c | 69 | ||||
-rw-r--r-- | fitz/filt_predict.c | 4 | ||||
-rw-r--r-- | fitz/fitz_base.h | 14 | ||||
-rw-r--r-- | fitz/fitz_draw.h | 6 | ||||
-rw-r--r-- | fitz/res_colorspace.c | 4 |
5 files changed, 52 insertions, 45 deletions
diff --git a/fitz/dev_draw.c b/fitz/dev_draw.c index 871c41c1..6050c09f 100644 --- a/fitz/dev_draw.c +++ b/fitz/dev_draw.c @@ -59,6 +59,8 @@ blendmaskover(fz_pixmap *src, fz_pixmap *msk, fz_pixmap *dst) if (src->n == 1 && msk->n == 1 && dst->n == 1) fz_duff_1i1o1(sp, src->w, mp, msk->w, dp, dst->w, w, h); + else if (src->n == 2 && msk->n == 1 && dst->n == 2) + fz_duff_2i1o2(sp, src->w * 2, mp, msk->w, dp, dst->w * 2, w, h); else if (src->n == 4 && msk->n == 1 && dst->n == 4) fz_duff_4i1o4(sp, src->w * 4, mp, msk->w, dp, dst->w * 4, w, h); else if (src->n == dst->n) @@ -76,8 +78,8 @@ fz_drawfillpath(void *user, fz_path *path, int evenodd, fz_matrix ctm, fz_drawdevice *dev = user; float expansion = fz_matrixexpansion(ctm); float flatness = 0.3f / expansion; - unsigned char argb[FZ_MAXCOLORS + 1]; - float rgb[FZ_MAXCOLORS]; + unsigned char colorbv[FZ_MAXCOLORS + 1]; + float colorfv[FZ_MAXCOLORS]; fz_bbox bbox; int i; @@ -93,11 +95,11 @@ fz_drawfillpath(void *user, fz_path *path, int evenodd, fz_matrix ctm, if (dev->model) { - fz_convertcolor(colorspace, color, dev->model, rgb); - argb[0] = alpha * 255; + fz_convertcolor(colorspace, color, dev->model, colorfv); for (i = 0; i < dev->model->n; i++) - argb[i + 1] = rgb[i] * 255; - fz_scanconvert(dev->gel, dev->ael, evenodd, bbox, dev->dest, argb, nil, nil); + colorbv[i] = colorfv[i] * 255; + colorbv[i] = alpha * 255; + fz_scanconvert(dev->gel, dev->ael, evenodd, bbox, dev->dest, colorbv, nil, nil); } else { @@ -113,8 +115,8 @@ fz_drawstrokepath(void *user, fz_path *path, fz_strokestate *stroke, fz_matrix c float expansion = fz_matrixexpansion(ctm); float flatness = 0.3f / expansion; float linewidth = stroke->linewidth; - unsigned char argb[FZ_MAXCOLORS + 1]; - float rgb[FZ_MAXCOLORS]; + unsigned char colorbv[FZ_MAXCOLORS + 1]; + float colorfv[FZ_MAXCOLORS]; fz_bbox bbox; int i; @@ -136,11 +138,11 @@ fz_drawstrokepath(void *user, fz_path *path, fz_strokestate *stroke, fz_matrix c if (dev->model) { - fz_convertcolor(colorspace, color, dev->model, rgb); - argb[0] = alpha * 255; + fz_convertcolor(colorspace, color, dev->model, colorfv); for (i = 0; i < dev->model->n; i++) - argb[i + 1] = rgb[i] * 255; - fz_scanconvert(dev->gel, dev->ael, 0, bbox, dev->dest, argb, nil, nil); + colorbv[i] = colorfv[i] * 255; + colorbv[i] = alpha * 255; + fz_scanconvert(dev->gel, dev->ael, 0, bbox, dev->dest, colorbv, nil, nil); } else { @@ -243,7 +245,7 @@ fz_drawclipstrokepath(void *user, fz_path *path, fz_strokestate *stroke, fz_matr } static void -drawglyph(unsigned char *argb, fz_pixmap *dst, fz_pixmap *src, int xorig, int yorig, fz_bbox scissor) +drawglyph(unsigned char *colorbv, fz_pixmap *dst, fz_pixmap *src, int xorig, int yorig, fz_bbox scissor) { unsigned char *dp, *sp; int w, h; @@ -281,10 +283,10 @@ drawglyph(unsigned char *argb, fz_pixmap *dst, fz_pixmap *src, int xorig, int yo switch (dst->n) { case 2: - fz_text_w2i1o2(argb, sp, src->w, dp, dst->w * 2, w, h); + fz_text_w2i1o2(colorbv, sp, src->w, dp, dst->w * 2, w, h); break; case 4: - fz_text_w4i1o4(argb, sp, src->w, dp, dst->w * 4, w, h); + fz_text_w4i1o4(colorbv, sp, src->w, dp, dst->w * 4, w, h); break; default: assert("Write fz_text_wni1on" != NULL); @@ -300,18 +302,18 @@ fz_drawfilltext(void *user, fz_text *text, fz_matrix ctm, fz_colorspace *colorspace, float *color, float alpha) { fz_drawdevice *dev = user; - unsigned char argb[FZ_MAXCOLORS + 1]; - float rgb[FZ_MAXCOLORS]; + unsigned char colorbv[FZ_MAXCOLORS + 1]; + float colorfv[FZ_MAXCOLORS]; fz_matrix tm, trm; fz_pixmap *glyph; int i, x, y, gid; if (dev->model) { - fz_convertcolor(colorspace, color, dev->model, rgb); - argb[0] = alpha * 255; + fz_convertcolor(colorspace, color, dev->model, colorfv); for (i = 0; i < dev->model->n; i++) - argb[i + 1] = rgb[i] * 255; + colorbv[i] = colorfv[i] * 255; + colorbv[i] = alpha * 255; } tm = text->trm; @@ -334,7 +336,7 @@ fz_drawfilltext(void *user, fz_text *text, fz_matrix ctm, if (glyph) { if (dev->model) - drawglyph(argb, dev->dest, glyph, x, y, dev->scissor); + drawglyph(colorbv, dev->dest, glyph, x, y, dev->scissor); else drawglyph(nil, dev->dest, glyph, x, y, dev->scissor); fz_droppixmap(glyph); @@ -448,8 +450,8 @@ fz_drawfillshade(void *user, fz_shade *shade, fz_matrix ctm) fz_pixmap *dest = dev->dest; fz_rect bounds; fz_bbox bbox; - float rgb[FZ_MAXCOLORS]; - unsigned char argb[FZ_MAXCOLORS + 1]; + float colorfv[FZ_MAXCOLORS]; + unsigned char colorbv[FZ_MAXCOLORS + 1]; unsigned char *s; int x, y; @@ -470,17 +472,18 @@ fz_drawfillshade(void *user, fz_shade *shade, fz_matrix ctm) { /* FIXME: Could use optimisation */ int i, n = dev->model->n + 1; - fz_convertcolor(shade->cs, shade->background, dev->model, rgb); - argb[n] = 255; + + fz_convertcolor(shade->cs, shade->background, dev->model, colorfv); + colorbv[0] = 255; for (i = 1; i < n; i++) - argb[n-i] = rgb[i-1] * 255; + colorbv[n-i] = colorfv[i-1] * 255; for (y = bbox.y0; y < bbox.y1; y++) { s = dest->samples + ((bbox.x0 - dest->x) + (y - dest->y) * dest->w) * dest->n; for (x = bbox.x0; x < bbox.x1; x++) { for (i = n; i > 0; i--) - *s++ = argb[i]; + *s++ = colorbv[i]; } } } @@ -587,8 +590,8 @@ fz_drawfillimagemask(void *user, fz_pixmap *image, fz_matrix ctm, fz_colorspace *colorspace, float *color, float alpha) { fz_drawdevice *dev = user; - unsigned char argb[FZ_MAXCOLORS + 1]; - float rgb[FZ_MAXCOLORS]; + unsigned char colorbv[FZ_MAXCOLORS + 1]; + float colorfv[FZ_MAXCOLORS]; fz_bbox bbox; int dx, dy; fz_pixmap *scaled = nil; @@ -608,11 +611,11 @@ fz_drawfillimagemask(void *user, fz_pixmap *image, fz_matrix ctm, if (dev->dest->colorspace) { - fz_convertcolor(colorspace, color, dev->model, rgb); - argb[0] = alpha * 255; + fz_convertcolor(colorspace, color, dev->model, colorfv); for (i = 0; i < dev->model->n; i++) - argb[i + 1] = rgb[i] * 255; - fz_scanconvert(dev->gel, dev->ael, 0, bbox, dev->dest, argb, image, &invmat); + colorbv[i] = colorfv[i] * 255; + colorbv[i] = alpha * 255; + fz_scanconvert(dev->gel, dev->ael, 0, bbox, dev->dest, colorbv, image, &invmat); } else { diff --git a/fitz/filt_predict.c b/fitz/filt_predict.c index a39231fb..07470647 100644 --- a/fitz/filt_predict.c +++ b/fitz/filt_predict.c @@ -165,8 +165,8 @@ fz_predictpng(fz_predict *p, unsigned char *in, unsigned char *out, int predicto } for (i = p->stride - bpp; i > 0; i--) { - *out = *in++ + out[-bpp]; - out++; + *out = *in++ + out[-bpp]; + out++; } break; case 2: diff --git a/fitz/fitz_base.h b/fitz/fitz_base.h index 4d48ac7d..c3b1f4a2 100644 --- a/fitz/fitz_base.h +++ b/fitz/fitz_base.h @@ -39,8 +39,6 @@ extern int gettimeofday(struct timeval *tv, struct timezone *tz); -#define restrict - #define inline __inline #define __func__ __FUNCTION__ @@ -53,14 +51,18 @@ extern int gettimeofday(struct timeval *tv, struct timezone *tz); #define vsnprintf _vsnprintf #endif -#else /* C99 or close enough */ +#else /* unix or close enough */ + +#include <unistd.h> + +#endif +#ifndef _C99 #ifdef __GNUC__ #define restrict __restrict +#else +#define restrict #endif - -#include <unistd.h> - #endif /* diff --git a/fitz/fitz_draw.h b/fitz/fitz_draw.h index abd94a1e..0e13a831 100644 --- a/fitz/fitz_draw.h +++ b/fitz/fitz_draw.h @@ -38,13 +38,14 @@ typedef enum fz_blendkind_e } fz_blendkind; /* -pixmaps have n components per pixel. the first is always alpha. +pixmaps have n components per pixel. the last is always alpha. premultiplied alpha when rendering, but non-premultiplied for colorspace conversions and rescaling. */ extern fz_colorspace *pdf_devicegray; extern fz_colorspace *pdf_devicergb; +extern fz_colorspace *pdf_devicebgr; extern fz_colorspace *pdf_devicecmyk; extern fz_colorspace *pdf_devicelab; extern fz_colorspace *pdf_devicepattern; @@ -451,7 +452,7 @@ fz_ael * fz_newael(void); void fz_freeael(fz_ael *ael); fz_error fz_scanconvert(fz_gel *gel, fz_ael *ael, int eofill, - fz_bbox clip, fz_pixmap *pix, unsigned char *argb, fz_pixmap *image, fz_matrix *invmat); + fz_bbox clip, fz_pixmap *pix, unsigned char *colorbv, fz_pixmap *image, fz_matrix *invmat); void fz_fillpath(fz_gel *gel, fz_path *path, fz_matrix ctm, float flatness); void fz_strokepath(fz_gel *gel, fz_path *path, fz_strokestate *stroke, fz_matrix ctm, float flatness, float linewidth); @@ -484,6 +485,7 @@ extern void (*fz_duff_nimon)(unsigned char*,int,int,unsigned char*,int,int,unsig extern void (*fz_duff_1o1)(unsigned char*,int,unsigned char*,int,int,int); extern void (*fz_duff_4o4)(unsigned char*,int,unsigned char*,int,int,int); extern void (*fz_duff_1i1o1)(unsigned char*,int,unsigned char*,int,unsigned char*,int,int,int); +extern void (*fz_duff_2i1o2)(unsigned char*,int,unsigned char*,int,unsigned char*,int,int,int); extern void (*fz_duff_4i1o4)(unsigned char*,int,unsigned char*,int,unsigned char*,int,int,int); extern void (*fz_path_1o1)(unsigned char*,unsigned char,int,unsigned char*); diff --git a/fitz/res_colorspace.c b/fitz/res_colorspace.c index c30ea7c4..79ca8ff4 100644 --- a/fitz/res_colorspace.c +++ b/fitz/res_colorspace.c @@ -72,8 +72,6 @@ fz_stdconvpixmap(fz_colorspace *srcs, fz_pixmap *src, fz_colorspace *dsts, fz_pi { for (x = 0; x < src->w; x++) { - *d++ = *s++; - for (k = 0; k < src->n - 1; k++) srcv[k] = *s++ / 255.0f; @@ -81,6 +79,8 @@ fz_stdconvpixmap(fz_colorspace *srcs, fz_pixmap *src, fz_colorspace *dsts, fz_pi for (k = 0; k < dst->n - 1; k++) *d++ = dstv[k] * 255; + + *d++ = *s++; } } } |