diff options
-rw-r--r-- | mupdf/shade1.c | 114 |
1 files changed, 60 insertions, 54 deletions
diff --git a/mupdf/shade1.c b/mupdf/shade1.c index c9146361..ed81821a 100644 --- a/mupdf/shade1.c +++ b/mupdf/shade1.c @@ -1,37 +1,7 @@ #include <fitz.h> #include <mupdf.h> -fz_error * -loadshadefunction(fz_shade *shade, pdf_xref *xref, fz_obj *dict, - float x0, float x1, float y0, float y1) -{ - fz_error *error; - float t[2]; - fz_obj *obj; - pdf_function *func; - int x, y; - - shade->usefunction = 1; - - obj = fz_dictgets(dict, "Function"); - error = pdf_loadfunction(&func, xref, obj); - if (error) - return error; - - for (y = 0; y < 16; ++y) - { - t[1] = y0 + (y / 15.0) * (y1 - y0); - for (x = 0; x < 16; ++x) - { - t[0] = x0 + (x / 15.0) * (x1 - x0); - error = pdf_evalfunction(func, t, 2, shade->function[y*16+x], shade->cs->n); - if (error) - return error; - } - } - - return nil; -} +#define NSEGS 32 fz_error * pdf_loadtype1shade(fz_shade *shade, pdf_xref *xref, fz_obj *dict, fz_obj *ref) @@ -39,6 +9,8 @@ pdf_loadtype1shade(fz_shade *shade, pdf_xref *xref, fz_obj *dict, fz_obj *ref) fz_error *error; fz_obj *obj; fz_matrix matrix; + pdf_function *func; + int xx, yy; float x, y; float xn, yn; @@ -49,10 +21,18 @@ pdf_loadtype1shade(fz_shade *shade, pdf_xref *xref, fz_obj *dict, fz_obj *ref) pdf_logshade("load type1 shade {\n"); obj = fz_dictgets(dict, "Domain"); - x0 = fz_toreal(fz_arrayget(obj, 0)); - x1 = fz_toreal(fz_arrayget(obj, 1)); - y0 = fz_toreal(fz_arrayget(obj, 2)); - y1 = fz_toreal(fz_arrayget(obj, 3)); + if (obj) { + x0 = fz_toreal(fz_arrayget(obj, 0)); + x1 = fz_toreal(fz_arrayget(obj, 1)); + y0 = fz_toreal(fz_arrayget(obj, 2)); + y1 = fz_toreal(fz_arrayget(obj, 3)); + } + else { + x0 = 0; + x1 = 1.0; + y0 = 0; + y1 = 1.0; + } pdf_logshade("domain %g %g %g %g\n", x0, x1, y0, y1); @@ -62,35 +42,61 @@ pdf_loadtype1shade(fz_shade *shade, pdf_xref *xref, fz_obj *dict, fz_obj *ref) matrix = pdf_tomatrix(obj); pdf_logshade("matrix [%g %g %g %g %g %g]\n", matrix.a, matrix.b, matrix.c, matrix.d, matrix.e, matrix.f); - shade->matrix = fz_concat(matrix, shade->matrix); - } + } + else + matrix = fz_identity(); + + obj = fz_dictgets(dict, "Function"); + error = pdf_loadfunction(&func, xref, obj); + if (error) + return error; + + shade->usefunction = 0; - error = loadshadefunction(shade, xref, dict, x0, x1, y0, y1); if (error) return error; - shade->meshlen = 512; - shade->mesh = fz_malloc(sizeof(float) * 3*3 * shade->meshlen); + shade->meshlen = NSEGS * NSEGS * 2; + shade->mesh = fz_malloc(sizeof(float) * (2 + shade->cs->n) * 3 * shade->meshlen); if (!shade->mesh) return fz_outofmem; n = 0; - for (yy = 0; yy < 16; ++yy) + for (yy = 0; yy < NSEGS; ++yy) { - y = y0 + (y1 - y0) * yy / 16.0; - yn = y0 + (y1 - y0) * (yy + 1) / 16.0; - for (xx = 0; xx < 16; ++xx) + y = y0 + (y1 - y0) * yy / (float)NSEGS; + yn = y0 + (y1 - y0) * (yy + 1) / (float)NSEGS; + for (xx = 0; xx < NSEGS; ++xx) { - x = x0 + (x1 - x0) * (xx / 16.0); - xn = x0 + (x1 - x0) * (xx + 1) / 16.0; - - t = (yy * 16 + xx) / 255.; - pdf_setmeshvalue(shade->mesh, n++, x, y, t); - pdf_setmeshvalue(shade->mesh, n++, xn, y, t); - pdf_setmeshvalue(shade->mesh, n++, xn, yn, t); - pdf_setmeshvalue(shade->mesh, n++, x, y, t); - pdf_setmeshvalue(shade->mesh, n++, xn, yn, t); - pdf_setmeshvalue(shade->mesh, n++, x, yn, t); + x = x0 + (x1 - x0) * (xx / (float)NSEGS); + xn = x0 + (x1 - x0) * (xx + 1) / (float)NSEGS; + +#define ADD_VERTEX(xx, yy) \ + {\ + fz_point p;\ + p.x = xx;\ + p.y = yy;\ + p = fz_transformpoint(matrix, p);\ + shade->mesh[n++] = p.x;\ + shade->mesh[n++] = p.y;\ + \ + float cp[2], cv[FZ_MAXCOLORS];\ + cp[0] = xx;\ + cp[1] = yy;\ + error = pdf_evalfunction(func, cp, 2, cv, shade->cs->n);\ + \ + for (int c = 0; c < shade->cs->n; ++c) {\ + shade->mesh[n++] = cv[c];\ + }\ + }\ + + ADD_VERTEX(x, y); + ADD_VERTEX(xn, y); + ADD_VERTEX(xn, yn); + + ADD_VERTEX(x, y); + ADD_VERTEX(xn, yn); + ADD_VERTEX(x, yn); } } |