diff options
Diffstat (limited to 'mupdf/shade2.c')
-rw-r--r-- | mupdf/shade2.c | 70 |
1 files changed, 52 insertions, 18 deletions
diff --git a/mupdf/shade2.c b/mupdf/shade2.c index 459933b6..8871b6bf 100644 --- a/mupdf/shade2.c +++ b/mupdf/shade2.c @@ -8,6 +8,7 @@ pdf_buildt2shademesh(fz_shade *shade, pdf_xref *xref, fz_obj *shading, fz_error *error; float x0, y0, x1, y1; float t0, t1; + int e0, e1; fz_obj *obj; pdf_function *func; @@ -30,21 +31,35 @@ pdf_buildt2shademesh(fz_shade *shade, pdf_xref *xref, fz_obj *shading, t1 = 1.; } + obj = fz_dictgets(shading, "Extend"); + if (obj) { + e0 = fz_tobool(fz_arrayget(obj, 0)); + e1 = fz_tobool(fz_arrayget(obj, 1)); + } else { + e0 = 0; + e1 = 0; + } + pdf_logshade("domain %g %g\n", t0, t1); + pdf_logshade("extend %d %d\n", e0, e1); pdf_loadshadefunction(shade, xref, shading, t0, t1); - shade->meshlen = 2; + shade->meshlen = 2 + e0 *2 + e1 * 2; shade->mesh = (float*) malloc(sizeof(float) * 3*3 * shade->meshlen); float theta; - theta = atan2(x1 - x0, y1 - y0); + theta = atan2(y1 - y0, x1 - x0); + theta += M_PI / 2.0; pdf_logshade("theta=%g\n", theta); fz_point p1, p2, p3, p4; + fz_point ep1, ep2, ep3, ep4; + float dist; + dist = hypot(x1 - x0, y1 - y0); -#define BIGNUM 10000 +#define BIGNUM 1000 p1.x = x0 + BIGNUM * cos(theta); p1.y = y0 + BIGNUM * sin(theta); @@ -55,27 +70,46 @@ pdf_buildt2shademesh(fz_shade *shade, pdf_xref *xref, fz_obj *shading, p4.x = x1 - BIGNUM * cos(theta); p4.y = y1 - BIGNUM * sin(theta); + ep1.x = p1.x - (x1 - x0) / dist * BIGNUM; + ep1.y = p1.y - (y1 - y0) / dist * BIGNUM; + ep2.x = p2.x + (x1 - x0) / dist * BIGNUM; + ep2.y = p2.y + (y1 - y0) / dist * BIGNUM; + ep3.x = p3.x - (x1 - x0) / dist * BIGNUM; + ep3.y = p3.y - (y1 - y0) / dist * BIGNUM; + ep4.x = p4.x + (x1 - x0) / dist * BIGNUM; + ep4.y = p4.y + (y1 - y0) / dist * BIGNUM; + pdf_logshade("p1 %g %g\n", p1.x, p1.y); pdf_logshade("p2 %g %g\n", p2.x, p2.y); pdf_logshade("p3 %g %g\n", p3.x, p3.y); pdf_logshade("p4 %g %g\n", p4.x, p4.y); - pdf_setmeshvalue(shade->mesh, 0, p1.x, p1.y, 0); - pdf_setmeshvalue(shade->mesh, 1, p2.x, p2.y, 1); - pdf_setmeshvalue(shade->mesh, 2, p4.x, p4.y, 1); - pdf_setmeshvalue(shade->mesh, 3, p1.x, p1.y, 0); - pdf_setmeshvalue(shade->mesh, 4, p4.x, p4.y, 1); - pdf_setmeshvalue(shade->mesh, 5, p3.x, p3.y, 0); - - /* - if (shade->extend) { - e0 = fz_toint(fz_arrayget(shade->extend, 0)); - e1 = fz_toint(fz_arrayget(shade->extend, 1)); - } else { - e0 = 0; - e1 = 0; + int n = 0; + + pdf_setmeshvalue(shade->mesh, n++, p1.x, p1.y, 0); + pdf_setmeshvalue(shade->mesh, n++, p2.x, p2.y, 1); + pdf_setmeshvalue(shade->mesh, n++, p4.x, p4.y, 1); + pdf_setmeshvalue(shade->mesh, n++, p1.x, p1.y, 0); + pdf_setmeshvalue(shade->mesh, n++, p4.x, p4.y, 1); + pdf_setmeshvalue(shade->mesh, n++, p3.x, p3.y, 0); + + if (e0) { + pdf_setmeshvalue(shade->mesh, n++, ep1.x, ep1.y, 0); + pdf_setmeshvalue(shade->mesh, n++, p1.x, p1.y, 0); + pdf_setmeshvalue(shade->mesh, n++, p3.x, p3.y, 0); + pdf_setmeshvalue(shade->mesh, n++, ep1.x, ep1.y, 0); + pdf_setmeshvalue(shade->mesh, n++, p3.x, p3.y, 0); + pdf_setmeshvalue(shade->mesh, n++, ep3.x, ep3.y, 0); + } + + if (e1) { + pdf_setmeshvalue(shade->mesh, n++, p2.x, p2.y, 1); + pdf_setmeshvalue(shade->mesh, n++, ep2.x, ep2.y, 1); + pdf_setmeshvalue(shade->mesh, n++, ep4.x, ep4.y, 1); + pdf_setmeshvalue(shade->mesh, n++, p2.x, p2.y, 1); + pdf_setmeshvalue(shade->mesh, n++, ep4.x, ep4.y, 1); + pdf_setmeshvalue(shade->mesh, n++, p4.x, p4.y, 1); } - */ pdf_logshade("}\n"); |