diff options
author | Tor Andersson <tor@ghostscript.com> | 2004-10-11 10:42:05 +0200 |
---|---|---|
committer | Tor Andersson <tor@ghostscript.com> | 2004-10-11 10:42:05 +0200 |
commit | 358811630686460d6b0a96021a1bcb4c3124fb03 (patch) | |
tree | 08a0049753ead2cd063723fddd0dd241740769df /render/render.c | |
parent | bd77c6880a7cf32e20865fb0cdb6816df0e6f775 (diff) | |
download | mupdf-358811630686460d6b0a96021a1bcb4c3124fb03.tar.xz |
cleaned up xref object and stream api
Diffstat (limited to 'render/render.c')
-rw-r--r-- | render/render.c | 190 |
1 files changed, 167 insertions, 23 deletions
diff --git a/render/render.c b/render/render.c index bb875ee3..d7359d90 100644 --- a/render/render.c +++ b/render/render.c @@ -1,10 +1,16 @@ #include <fitz.h> +enum { NONE, OVER, MASK }; + struct fz_renderer_s { fz_glyphcache *cache; fz_gel *gel; fz_ael *ael; + int mode; + int x, y, w, h; + fz_pixmap *tmp; + fz_pixmap *acc; }; fz_error * @@ -20,6 +26,9 @@ fz_newrenderer(fz_renderer **gcp) gc->cache = nil; gc->gel = nil; gc->ael = nil; + gc->mode = NONE; + gc->tmp = nil; + gc->acc = nil; error = fz_newglyphcache(&gc->cache, 1024, 65536); if (error) @@ -56,50 +65,118 @@ fz_freerenderer(fz_renderer *gc) fz_freegel(gc->gel); if (gc->ael) fz_freeael(gc->ael); + if (gc->tmp) + fz_droppixmap(gc->tmp); + if (gc->acc) + fz_droppixmap(gc->acc); fz_free(gc); } fz_error * -fz_renderover(fz_renderer *gc, fz_overnode *over, fz_matrix ctm, fz_pixmap *out) +fz_renderover(fz_renderer *gc, fz_overnode *over, fz_matrix ctm) { fz_error *error; fz_node *node; + int oldmode; + + oldmode = gc->mode; + gc->mode = OVER; + +printf("renderover ; acc=3,1\n"); + + error = fz_newpixmap(&gc->acc, gc->x, gc->y, gc->w, gc->h, 3, 1); + if (error) + return error; + + fz_clearpixmap(gc->acc); for (node = over->super.child; node; node = node->next) { - error = fz_rendernode(gc, node, ctm, out); + gc->tmp = nil; + error = fz_rendernode(gc, node, ctm); if (error) return error; + if (gc->tmp) + { +printf(" over -> %d,%d\n", gc->tmp->n, gc->tmp->a); + fz_blendover(gc->acc, gc->tmp, gc->acc); + fz_droppixmap(gc->tmp); + } +else printf(" -> nil\n"); } + gc->tmp = gc->acc; + gc->acc = nil; + + gc->mode = oldmode; + return nil; } fz_error * -fz_rendermask(fz_renderer *gc, fz_masknode *mask, fz_matrix ctm, fz_pixmap *out) +fz_rendermask(fz_renderer *gc, fz_masknode *mask, fz_matrix ctm) { fz_error *error; - fz_node *node; + fz_pixmap *colorpix; + fz_pixmap *shapepix; + fz_node *color; + fz_node *shape; + int oldmode; - for (node = mask->super.child; node; node = node->next) - { - error = fz_rendernode(gc, node, ctm, out); - if (error) - return error; - } + color = mask->super.child; + shape = color->next; + +// if (fz_ispathnode(shape) && fz_iscolornode(color)) +// return rcolorpath(gc, shape, color, ctm); +// if (fz_istextnode(shape) && fz_iscolornode(color)) +// return rcolortext(gc, shape, color, ctm); + + oldmode = gc->mode; + gc->mode = MASK; + +printf("rendermask\n"); + + gc->tmp = nil; + error = fz_rendernode(gc, color, ctm); + if (error) + return error; + colorpix = gc->tmp; + +printf(" -> color %d,%d\n", colorpix->n, colorpix->a); + + gc->tmp = nil; + error = fz_rendernode(gc, shape, ctm); + if (error) + return error; + shapepix = gc->tmp; + +printf(" -> shape %d,%d\n", shapepix->n, shapepix->a); + + error = fz_newpixmap(&gc->tmp, gc->x, gc->y, gc->w, gc->h, colorpix->n, 1); + if (error) + return error; + +printf(" -> blend %d,%d\n", gc->tmp->n, gc->tmp->a); + + fz_blendmask(gc->tmp, colorpix, shapepix); + + fz_droppixmap(shapepix); + fz_droppixmap(colorpix); + + gc->mode = oldmode; return nil; } fz_error * -fz_rendertransform(fz_renderer *gc, fz_transformnode *transform, fz_matrix ctm, fz_pixmap *out) +fz_rendertransform(fz_renderer *gc, fz_transformnode *transform, fz_matrix ctm) { +printf("rendertransform\n"); ctm = fz_concat(ctm, transform->m); - return fz_rendernode(gc, transform->super.child, ctm, out); + return fz_rendernode(gc, transform->super.child, ctm); } - -void composite(fz_pixmap *out, fz_glyph *gl, int xo, int yo) +static void blitglyph(fz_pixmap *out, fz_glyph *gl, int xo, int yo) { int sx, sy, dx, dy, a, b, c; @@ -107,8 +184,8 @@ void composite(fz_pixmap *out, fz_glyph *gl, int xo, int yo) { for (sx = 0; sx < gl->w; sx++) { - dx = xo + sx + gl->lsb; - dy = yo - sy + gl->top; + dx = xo + sx + gl->lsb - out->x; + dy = yo - sy + gl->top - out->y; if (dx < 0) continue; if (dy < 0) continue; @@ -124,7 +201,7 @@ void composite(fz_pixmap *out, fz_glyph *gl, int xo, int yo) } fz_error * -fz_rendertext(fz_renderer *gc, fz_textnode *text, fz_matrix ctm, fz_pixmap *out) +fz_rendertext(fz_renderer *gc, fz_textnode *text, fz_matrix ctm) { fz_error *error; fz_glyph gl; @@ -132,6 +209,12 @@ fz_rendertext(fz_renderer *gc, fz_textnode *text, fz_matrix ctm, fz_pixmap *out) int g, i, ix, iy; fz_matrix tm, trm; +printf("rendertext ; tmp=0,1\n"); + + error = fz_newpixmap(&gc->tmp, gc->x, gc->y, gc->w, gc->h, 0, 1); + if (error) + return error; + tm = text->trm; for (i = 0; i < text->len; i++) @@ -154,30 +237,91 @@ fz_rendertext(fz_renderer *gc, fz_textnode *text, fz_matrix ctm, fz_pixmap *out) if (error) return error; - composite(out, &gl, ix, iy); + blitglyph(gc->tmp, &gl, ix, iy); } return nil; } fz_error * -fz_rendernode(fz_renderer *gc, fz_node *node, fz_matrix ctm, fz_pixmap *out) +fz_renderpath(fz_renderer *gc, fz_pathnode *path, fz_matrix ctm) { +printf("renderpath ; tmp=nil\n"); + return nil; +} + +fz_error * +fz_rendercolor(fz_renderer *gc, fz_colornode *color, fz_matrix ctm) +{ + fz_error *error; + short r = color->r * (1 << 14); + short g = color->g * (1 << 14); + short b = color->b * (1 << 14); + int x, y; + +printf("rendercolor %d %d %d ; tmp=3,0\n", r, g, b); + + error = fz_newpixmap(&gc->tmp, gc->x, gc->y, gc->w, gc->h, 3, 0); + if (error) + return error; + + for (y = 0; y < gc->tmp->h; y++) + { + short *p = &gc->tmp->samples[y * gc->tmp->stride]; + for (x = 0; x < gc->tmp->w; x++) + { + *p++ = r; + *p++ = g; + *p++ = b; + } + } + + return nil; +} + +fz_error * +fz_rendernode(fz_renderer *gc, fz_node *node, fz_matrix ctm) +{ + assert(gc->tmp == nil); + if (!node) return nil; switch (node->kind) { case FZ_NOVER: - return fz_renderover(gc, (fz_overnode*)node, ctm, out); + return fz_renderover(gc, (fz_overnode*)node, ctm); case FZ_NMASK: - return fz_rendermask(gc, (fz_masknode*)node, ctm, out); + return fz_rendermask(gc, (fz_masknode*)node, ctm); case FZ_NTRANSFORM: - return fz_rendertransform(gc, (fz_transformnode*)node, ctm, out); + return fz_rendertransform(gc, (fz_transformnode*)node, ctm); + case FZ_NCOLOR: + return fz_rendercolor(gc, (fz_colornode*)node, ctm); + case FZ_NPATH: + return fz_renderpath(gc, (fz_pathnode*)node, ctm); case FZ_NTEXT: - return fz_rendertext(gc, (fz_textnode*)node, ctm, out); + return fz_rendertext(gc, (fz_textnode*)node, ctm); default: return nil; } } +fz_error * +fz_rendertree(fz_pixmap **outp, fz_renderer *gc, fz_tree *tree, fz_matrix ctm, fz_rect bbox) +{ + fz_error *error; + + gc->x = floor(bbox.min.x); + gc->y = floor(bbox.min.y); + gc->w = ceil(bbox.max.x) - floor(bbox.min.x); + gc->h = ceil(bbox.max.y) - floor(bbox.min.y); + + error = fz_rendernode(gc, tree->root, ctm); + if (error) + return error; + + *outp = gc->tmp; + + return nil; +} + |