diff options
Diffstat (limited to 'fitz')
-rw-r--r-- | fitz/dev_draw.c | 65 | ||||
-rw-r--r-- | fitz/dev_list.c | 18 | ||||
-rw-r--r-- | fitz/dev_null.c | 6 | ||||
-rw-r--r-- | fitz/dev_trace.c | 14 | ||||
-rw-r--r-- | fitz/fitz.h | 6 |
5 files changed, 81 insertions, 28 deletions
diff --git a/fitz/dev_draw.c b/fitz/dev_draw.c index 95d479ab..1947af4f 100644 --- a/fitz/dev_draw.c +++ b/fitz/dev_draw.c @@ -488,7 +488,7 @@ fz_drawignoretext(void *user, fz_text *text, fz_matrix ctm) } static void -fz_drawfillshade(void *user, fz_shade *shade, fz_matrix ctm) +fz_drawfillshade(void *user, fz_shade *shade, fz_matrix ctm, float alpha) { fz_drawdevice *dev = user; fz_colorspace *model = dev->dest->colorspace; @@ -517,6 +517,12 @@ fz_drawfillshade(void *user, fz_shade *shade, fz_matrix ctm) return; } + if (alpha < 1) + { + dest = fz_newpixmapwithrect(dev->dest->colorspace, bbox); + fz_clearpixmap(dest, 0); + } + if (shade->usebackground) { unsigned char *s; @@ -538,7 +544,13 @@ fz_drawfillshade(void *user, fz_shade *shade, fz_matrix ctm) } } - fz_rendershade(shade, ctm, dev->dest, bbox); + fz_rendershade(shade, ctm, dest, bbox); + + if (alpha < 1) + { + fz_blendpixmapswithalpha(dev->dest, dest, alpha); + fz_droppixmap(dest); + } } static int @@ -552,7 +564,7 @@ fz_calcimagescale(fz_pixmap *image, fz_matrix ctm, int *dx, int *dy) } static void -fz_drawfillimage(void *user, fz_pixmap *image, fz_matrix ctm) +fz_drawfillimage(void *user, fz_pixmap *image, fz_matrix ctm, float alpha) { fz_drawdevice *dev = user; fz_colorspace *model = dev->dest->colorspace; @@ -592,7 +604,21 @@ fz_drawfillimage(void *user, fz_pixmap *image, fz_matrix ctm) } #endif - fz_blendimage(dev->dest, dev->scissor, image, ctm); + if (alpha < 1) + { + fz_pixmap *temp; + fz_bbox bbox; + bbox = fz_roundrect(fz_transformrect(ctm, fz_unitrect)); + bbox = fz_intersectbbox(bbox, dev->scissor); + temp = fz_newpixmapwithrect(dev->dest->colorspace, bbox); + fz_blendimage(temp, bbox, image, ctm); + fz_blendpixmapswithalpha(dev->dest, temp, alpha); + fz_droppixmap(temp); + } + else + { + fz_blendimage(dev->dest, dev->scissor, image, ctm); + } if (scaled) fz_droppixmap(scaled); @@ -812,7 +838,7 @@ fz_drawendmask(void *user) } static void -fz_drawbegingroup(void *user, fz_rect rect, int isolated, int knockout, fz_blendmode blendmode) +fz_drawbegingroup(void *user, fz_rect rect, int isolated, int knockout, fz_blendmode blendmode, float alpha) { fz_drawdevice *dev = user; fz_colorspace *model = dev->dest->colorspace; @@ -831,6 +857,7 @@ fz_drawbegingroup(void *user, fz_rect rect, int isolated, int knockout, fz_blend fz_clearpixmap(dest, 0); + dev->stack[dev->top].alpha = alpha; dev->stack[dev->top].blendmode = blendmode; dev->stack[dev->top].scissor = dev->scissor; dev->stack[dev->top].dest = dev->dest; @@ -846,14 +873,40 @@ fz_drawendgroup(void *user) fz_drawdevice *dev = user; fz_pixmap *group = dev->dest; fz_blendmode blendmode; + float alpha; if (dev->top > 0) { dev->top--; + alpha = dev->stack[dev->top].alpha; blendmode = dev->stack[dev->top].blendmode; dev->dest = dev->stack[dev->top].dest; dev->scissor = dev->stack[dev->top].scissor; - fz_blendpixmapswithmode(dev->dest, group, blendmode); + + /* TODO: blend mode + constant alpha */ + if (blendmode == FZ_BNORMAL) + { + if (alpha < 1) + fz_blendpixmapswithalpha(dev->dest, group, alpha); + else + fz_blendpixmaps(dev->dest, group); + } + else + { + if (alpha < 1) + { + unsigned char *p = group->samples; + int n = group->w * group->h * group->n; + int a = alpha * 255; + while (n--) + { + *p = fz_mul255(*p, a); + p++; + } + } + fz_blendpixmapswithmode(dev->dest, group, blendmode); + } + fz_droppixmap(group); } } diff --git a/fitz/dev_list.c b/fitz/dev_list.c index 65c2c731..4dcd1470 100644 --- a/fitz/dev_list.c +++ b/fitz/dev_list.c @@ -210,20 +210,20 @@ fz_listpopclip(void *user) } static void -fz_listfillshade(void *user, fz_shade *shade, fz_matrix ctm) +fz_listfillshade(void *user, fz_shade *shade, fz_matrix ctm, float alpha) { fz_displaynode *node; - node = fz_newdisplaynode(FZ_CMDFILLSHADE, ctm, nil, nil, 0); + node = fz_newdisplaynode(FZ_CMDFILLSHADE, ctm, nil, nil, alpha); node->rect = fz_boundshade(shade, ctm); node->item.shade = fz_keepshade(shade); fz_appenddisplaynode(user, node); } static void -fz_listfillimage(void *user, fz_pixmap *image, fz_matrix ctm) +fz_listfillimage(void *user, fz_pixmap *image, fz_matrix ctm, float alpha) { fz_displaynode *node; - node = fz_newdisplaynode(FZ_CMDFILLIMAGE, ctm, nil, nil, 0); + node = fz_newdisplaynode(FZ_CMDFILLIMAGE, ctm, nil, nil, alpha); node->rect = fz_transformrect(ctm, fz_unitrect); node->item.image = fz_keeppixmap(image); fz_appenddisplaynode(user, node); @@ -269,10 +269,10 @@ fz_listendmask(void *user) } static void -fz_listbegingroup(void *user, fz_rect rect, int isolated, int knockout, fz_blendmode blendmode) +fz_listbegingroup(void *user, fz_rect rect, int isolated, int knockout, fz_blendmode blendmode, float alpha) { fz_displaynode *node; - node = fz_newdisplaynode(FZ_CMDBEGINGROUP, fz_identity, nil, nil, 0); + node = fz_newdisplaynode(FZ_CMDBEGINGROUP, fz_identity, nil, nil, alpha); node->rect = rect; node->item.blendmode = blendmode; node->flag |= isolated ? ISOLATED : 0; @@ -383,10 +383,10 @@ fz_executedisplaylist(fz_displaylist *list, fz_device *dev, fz_matrix topctm) dev->ignoretext(dev->user, node->item.text, ctm); break; case FZ_CMDFILLSHADE: - dev->fillshade(dev->user, node->item.shade, ctm); + dev->fillshade(dev->user, node->item.shade, ctm, node->alpha); break; case FZ_CMDFILLIMAGE: - dev->fillimage(dev->user, node->item.image, ctm); + dev->fillimage(dev->user, node->item.image, ctm, node->alpha); break; case FZ_CMDFILLIMAGEMASK: dev->fillimagemask(dev->user, node->item.image, ctm, @@ -409,7 +409,7 @@ fz_executedisplaylist(fz_displaylist *list, fz_device *dev, fz_matrix topctm) bbox = fz_transformrect(topctm, node->rect); dev->begingroup(dev->user, bbox, node->flag & ISOLATED, node->flag & KNOCKOUT, - node->item.blendmode); + node->item.blendmode, node->alpha); break; case FZ_CMDENDGROUP: dev->endgroup(dev->user); diff --git a/fitz/dev_null.c b/fitz/dev_null.c index 336d2e8d..c48cc2aa 100644 --- a/fitz/dev_null.c +++ b/fitz/dev_null.c @@ -11,13 +11,13 @@ static void fz_nullcliptext(void *user, fz_text *text, fz_matrix ctm, int accumu static void fz_nullclipstroketext(void *user, fz_text *text, fz_strokestate *stroke, fz_matrix ctm) {} static void fz_nullignoretext(void *user, fz_text *text, fz_matrix ctm) {} static void fz_nullpopclip(void *user) {} -static void fz_nullfillshade(void *user, fz_shade *shade, fz_matrix ctm) {} -static void fz_nullfillimage(void *user, fz_pixmap *image, fz_matrix ctm) {} +static void fz_nullfillshade(void *user, fz_shade *shade, fz_matrix ctm, float alpha) {} +static void fz_nullfillimage(void *user, fz_pixmap *image, fz_matrix ctm, float alpha) {} static void fz_nullfillimagemask(void *user, fz_pixmap *image, fz_matrix ctm, fz_colorspace *colorspace, float *color, float alpha) {} static void fz_nullclipimagemask(void *user, fz_pixmap *image, fz_matrix ctm) {} static void fz_nullbeginmask(void *user, fz_rect r, int luminosity, fz_colorspace *cs, float *bc) {} static void fz_nullendmask(void *user) {} -static void fz_nullbegingroup(void *user, fz_rect r, int isolated, int knockout, fz_blendmode blendmode) {} +static void fz_nullbegingroup(void *user, fz_rect r, int isolated, int knockout, fz_blendmode blendmode, float alpha) {} static void fz_nullendgroup(void *user) {} fz_device * diff --git a/fitz/dev_trace.c b/fitz/dev_trace.c index cdd71135..b6b73fd7 100644 --- a/fitz/dev_trace.c +++ b/fitz/dev_trace.c @@ -187,17 +187,17 @@ fz_traceignoretext(void *user, fz_text *text, fz_matrix ctm) } static void -fz_tracefillimage(void *user, fz_pixmap *image, fz_matrix ctm) +fz_tracefillimage(void *user, fz_pixmap *image, fz_matrix ctm, float alpha) { - printf("<fillimage "); + printf("<fillimage alpha=\"%g\" ", alpha); fz_tracematrix(ctm); printf("/>\n"); } static void -fz_tracefillshade(void *user, fz_shade *shade, fz_matrix ctm) +fz_tracefillshade(void *user, fz_shade *shade, fz_matrix ctm, float alpha) { - printf("<fillshade "); + printf("<fillshade alpha=\"%g\" ", alpha); fz_tracematrix(ctm); printf("/>\n"); } @@ -245,11 +245,11 @@ fz_traceendmask(void *user) } static void -fz_tracebegingroup(void *user, fz_rect bbox, int isolated, int knockout, fz_blendmode blendmode) +fz_tracebegingroup(void *user, fz_rect bbox, int isolated, int knockout, fz_blendmode blendmode, float alpha) { - printf("<group bbox=\"%g %g %g %g\" isolated=\"%d\" knockout=\"%d\" blendmode=\"%s\">\n", + printf("<group bbox=\"%g %g %g %g\" isolated=\"%d\" knockout=\"%d\" blendmode=\"%s\" alpha=\"%g\">\n", bbox.x0, bbox.y0, bbox.x1, bbox.y1, - isolated, knockout, fz_blendnames[blendmode]); + isolated, knockout, fz_blendnames[blendmode], alpha); } static void diff --git a/fitz/fitz.h b/fitz/fitz.h index 140f2f60..bff0ce70 100644 --- a/fitz/fitz.h +++ b/fitz/fitz.h @@ -1014,8 +1014,8 @@ struct fz_device_s void (*clipstroketext)(void *, fz_text *, fz_strokestate *, fz_matrix); void (*ignoretext)(void *, fz_text *, fz_matrix); - void (*fillshade)(void *, fz_shade *shd, fz_matrix ctm); - void (*fillimage)(void *, fz_pixmap *img, fz_matrix ctm); + void (*fillshade)(void *, fz_shade *shd, fz_matrix ctm, float alpha); + void (*fillimage)(void *, fz_pixmap *img, fz_matrix ctm, float alpha); void (*fillimagemask)(void *, fz_pixmap *img, fz_matrix ctm, fz_colorspace *, float *color, float alpha); void (*clipimagemask)(void *, fz_pixmap *img, fz_matrix ctm); @@ -1023,7 +1023,7 @@ struct fz_device_s void (*beginmask)(void *, fz_rect, int luminosity, fz_colorspace *cs, float *bc); void (*endmask)(void *); - void (*begingroup)(void *, fz_rect, int isolated, int knockout, fz_blendmode blendmode); + void (*begingroup)(void *, fz_rect, int isolated, int knockout, fz_blendmode blendmode, float alpha); void (*endgroup)(void *); }; |