summaryrefslogtreecommitdiff
path: root/render
diff options
context:
space:
mode:
Diffstat (limited to 'render')
-rw-r--r--render/glyphcache.c8
-rw-r--r--render/render.c16
-rw-r--r--render/renderimage.c71
-rw-r--r--render/rendertext.c16
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)