diff options
Diffstat (limited to 'render')
-rw-r--r-- | render/glyphcache.c | 8 | ||||
-rw-r--r-- | render/render.c | 16 | ||||
-rw-r--r-- | render/renderimage.c | 71 | ||||
-rw-r--r-- | render/rendertext.c | 16 |
4 files changed, 48 insertions, 63 deletions
diff --git a/render/glyphcache.c b/render/glyphcache.c index e92b472e..ec77e857 100644 --- a/render/glyphcache.c +++ b/render/glyphcache.c @@ -310,8 +310,8 @@ fz_renderglyph(fz_glyphcache *arena, fz_glyph *glyph, fz_font *font, int cid, fz key.b = ctm.b * 65536; key.c = ctm.c * 65536; key.d = ctm.d * 65536; - key.e = (ctm.e - floor(ctm.e)) * HSUBPIX; - key.f = (ctm.f - floor(ctm.f)) * VSUBPIX; + key.e = (ctm.e - fz_floor(ctm.e)) * HSUBPIX; + key.f = (ctm.f - fz_floor(ctm.f)) * VSUBPIX; val = hashfind(arena, &key); if (val) @@ -328,8 +328,8 @@ fz_renderglyph(fz_glyphcache *arena, fz_glyph *glyph, fz_font *font, int cid, fz return nil; } - ctm.e = floor(ctm.e) + key.e / HSUBPIX; - ctm.f = floor(ctm.f) + key.f / HSUBPIX; + ctm.e = fz_floor(ctm.e) + key.e / HSUBPIX; + ctm.f = fz_floor(ctm.f) + key.f / HSUBPIX; error = font->render(glyph, font, cid, ctm); if (error) diff --git a/render/render.c b/render/render.c index fd3e0620..dd4b543d 100644 --- a/render/render.c +++ b/render/render.c @@ -77,6 +77,8 @@ fz_rendercolor(fz_renderer *gc, fz_colornode *color, fz_matrix ctm) printf("render color\n"); + assert(gc->model); + fz_convertcolor(color->cs, color->samples, gc->model, rgb); gc->r = rgb[0] * 255; gc->g = rgb[1] * 255; @@ -146,7 +148,7 @@ fz_renderover(fz_renderer *gc, fz_overnode *over, fz_matrix ctm) { printf("begin over accumulator\n"); oldacc = gc->acc; - error = fz_newpixmap(&gc->acc, gc->x, gc->y, gc->w, gc->h, 4); + error = fz_newpixmap(&gc->acc, gc->x, gc->y, gc->w, gc->h, gc->model ? 4 : 1); if (error) return error; fz_clearpixmap(gc->acc); @@ -285,14 +287,14 @@ fz_rendertree(fz_pixmap **outp, fz_renderer *gc, fz_tree *tree, fz_matrix ctm, f { 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); + gc->x = fz_floor(bbox.min.x); + gc->y = fz_floor(bbox.min.y); + gc->w = fz_ceil(bbox.max.x) - fz_floor(bbox.min.x); + gc->h = fz_ceil(bbox.max.y) - fz_floor(bbox.min.y); /* compensate for rounding */ - ctm.e -= bbox.min.x - floor(bbox.min.x); - ctm.f -= bbox.min.y - floor(bbox.min.y); + ctm.e -= bbox.min.x - gc->x; + ctm.f -= bbox.min.y - gc->y; printf("render tree\n"); diff --git a/render/renderimage.c b/render/renderimage.c index 73b45e0c..e2c98eb1 100644 --- a/render/renderimage.c +++ b/render/renderimage.c @@ -9,10 +9,10 @@ void fz_gammapixmap(fz_pixmap *pix, float gamma); static inline int getcomp(fz_pixmap *pix, int u, int v, int k) { -// if (u < 0 || u >= pix->w) -// return 0; -// if (v < 0 || v >= pix->h) -// return 0; + if (u < 0 || u >= pix->w) + return 0; + if (v < 0 || v >= pix->h) + return 0; u = CLAMP(u, 0, pix->w - 1); v = CLAMP(v, 0, pix->h - 1); return pix->samples[ (v * pix->w + u) * pix->n + k ]; @@ -38,18 +38,21 @@ static inline int sampleimage(fz_pixmap *pix, int u, int v, int k) static inline void drawscan(fz_matrix *invmat, fz_pixmap *dst, fz_pixmap *src, int y, int x0, int x1) { - int x, k; + unsigned char *d; + int k, n; int u = (invmat->a * x0 + invmat->c * y + invmat->e) * 65536; int v = (invmat->b * x0 + invmat->d * y + invmat->f) * 65536; int du = invmat->a * 65536; int dv = invmat->b * 65536; - for (x = x0; x < x1; x++) + n = x1 - x0; + d = dst->samples + ((y - dst->y) * dst->w + (x0 - dst->x)) * dst->n; + + while (n--) { for (k = 0; k < src->n; k++) - dst->samples[ (y * dst->w + x) * dst->n + k ] - = sampleimage(src, u, v, k); + *d++ = sampleimage(src, u, v, k); u += du; v += dv; } @@ -98,13 +101,11 @@ static fz_error * drawtile(fz_renderer *gc, fz_pixmap *out, fz_pixmap *tile, fz_matrix ctm, int over) { static const fz_point rect[4] = { {0, 0}, {0, 1}, {1, 1}, {1, 0} }; - fz_error *error; - fz_gel *gel = gc->gel; - fz_ael *ael = gc->ael; fz_matrix imgmat; fz_matrix invmat; fz_point v[4]; - int i, e, y, x0, x1; + int top, bot, x0, x1, y; + int i; imgmat.a = 1.0 / tile->w; imgmat.b = 0.0; @@ -116,41 +117,23 @@ drawtile(fz_renderer *gc, fz_pixmap *out, fz_pixmap *tile, fz_matrix ctm, int ov for (i = 0; i < 4; i++) v[i] = fz_transformpoint(ctm, rect[i]); - fz_resetgel(gel, 1, 1); - fz_insertgel(gel, v[0].x, v[0].y, v[1].x, v[1].y); - fz_insertgel(gel, v[1].x, v[1].y, v[2].x, v[2].y); - fz_insertgel(gel, v[2].x, v[2].y, v[3].x, v[3].y); - fz_insertgel(gel, v[3].x, v[3].y, v[0].x, v[0].y); - fz_sortgel(gel); - e = 0; - y = gel->edges[0].y; + top = fz_floor(MIN4(v[0].y, v[1].y, v[2].y, v[3].y)) - 1; + bot = fz_ceil(MAX4(v[0].y, v[1].y, v[2].y, v[3].y)) + 1; + x0 = fz_floor(MIN4(v[0].x, v[1].x, v[2].x, v[3].x)) - 1; + x1 = fz_ceil(MAX4(v[0].x, v[1].x, v[2].x, v[3].x)) + 1; - while (ael->len > 0 || e < gel->len) - { - error = fz_insertael(ael, gel, y, &e); - if (error) - return error; - - x0 = ael->edges[0]->x; - x1 = ael->edges[ael->len - 1]->x; + top = CLAMP(top, out->y, out->y + out->h - 1); + bot = CLAMP(bot, out->y, out->y + out->h - 1); + x0 = CLAMP(x0, out->x, out->x + out->w - 1); + x1 = CLAMP(x1, out->x, out->x + out->w - 1); - if (y >= out->y && y < out->y + out->h) - { - x0 = CLAMP(x0, out->x, out->x + out->w - 1); - x1 = CLAMP(x1, out->x, out->x + out->w - 1); - if (over && tile->n == 4) - overscanrgb(&invmat, out, tile, y, x0, x1); - else - drawscan(&invmat, out, tile, y, x0, x1); - } - - fz_advanceael(ael); - - if (ael->len > 0) - y ++; - else if (e < gel->len) - y = gel->edges[e].y; + for (y = top; y <= bot; y++) + { + if (over && tile->n == 4) + overscanrgb(&invmat, out, tile, y, x0, x1); + else + drawscan(&invmat, out, tile, y, x0, x1); } return nil; diff --git a/render/rendertext.c b/render/rendertext.c index 1a3c49db..6819ccd8 100644 --- a/render/rendertext.c +++ b/render/rendertext.c @@ -78,11 +78,11 @@ fz_rendertext(fz_renderer *gc, fz_textnode *text, fz_matrix ctm) tm.f = y; trm = fz_concat(tm, ctm); - ix = floor(trm.e); - iy = floor(trm.f); + ix = fz_floor(trm.e); + iy = fz_floor(trm.f); - trm.e = (trm.e - floor(trm.e)); - trm.f = (trm.f - floor(trm.f)); + trm.e = (trm.e - fz_floor(trm.e)); + trm.f = (trm.f - fz_floor(trm.f)); error = fz_renderglyph(gc->cache, &gl, text->font, g, trm); if (error) @@ -121,11 +121,11 @@ fz_rendercolortext(fz_renderer *gc, fz_textnode *text, fz_colornode *color, fz_m tm.f = y; trm = fz_concat(tm, ctm); - ix = floor(trm.e); - iy = floor(trm.f); + ix = fz_floor(trm.e); + iy = fz_floor(trm.f); - trm.e = (trm.e - floor(trm.e)); - trm.f = (trm.f - floor(trm.f)); + trm.e = (trm.e - fz_floor(trm.e)); + trm.f = (trm.f - fz_floor(trm.f)); error = fz_renderglyph(gc->cache, &gl, text->font, g, trm); if (error) |