summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mupdf/shade1.c114
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);
}
}