static void pdf_load_type5_shade(fz_shade *shade, pdf_document *xref, pdf_obj *dict, int funcs, pdf_function **func) { fz_context *ctx = xref->ctx; struct mesh_params p; struct vertex *buf, *ref; int first; int ncomp; int i, k; fz_stream *stream; pdf_load_mesh_params(xref, dict, &p); if (funcs > 0) { ncomp = 1; pdf_sample_shade_function(ctx, shade, funcs, func, p.c0[0], p.c1[0]); } else ncomp = shade->colorspace->n; ref = fz_malloc_array(ctx, p.vprow, sizeof(struct vertex)); buf = fz_malloc_array(ctx, p.vprow, sizeof(struct vertex)); first = 1; stream = pdf_open_stream(xref, pdf_to_num(dict), pdf_to_gen(dict)); while (!fz_is_eof_bits(stream)) { for (i = 0; i < p.vprow; i++) { buf[i].x = read_sample(stream, p.bpcoord, p.x0, p.x1); buf[i].y = read_sample(stream, p.bpcoord, p.y0, p.y1); for (k = 0; k < ncomp; k++) buf[i].c[k] = read_sample(stream, p.bpcomp, p.c0[k], p.c1[k]); } if (!first) for (i = 0; i < p.vprow - 1; i++) pdf_add_quad(ctx, shade, &ref[i], &ref[i+1], &buf[i+1], &buf[i]); memcpy(ref, buf, p.vprow * sizeof(struct vertex)); first = 0; } fz_free(ctx, ref); fz_free(ctx, buf); fz_close(stream); }
static void pdf_load_type5_shade(fz_shade *shade, pdf_xref *xref, fz_obj *dict, int funcs, pdf_function **func, fz_stream *stream) { struct mesh_params p; struct vertex *buf, *ref; int first; int ncomp; int i, k; pdf_load_mesh_params(xref, dict, &p); if (funcs > 0) { ncomp = 1; pdf_sample_shade_function(shade, funcs, func, p.c0[0], p.c1[0]); } else ncomp = shade->colorspace->n; ref = fz_calloc(p.vprow, sizeof(struct vertex)); buf = fz_calloc(p.vprow, sizeof(struct vertex)); first = 1; while (!fz_is_eof_bits(stream)) { for (i = 0; i < p.vprow; i++) { buf[i].x = read_sample(stream, p.bpcoord, p.x0, p.x1); buf[i].y = read_sample(stream, p.bpcoord, p.y0, p.y1); for (k = 0; k < ncomp; k++) buf[i].c[k] = read_sample(stream, p.bpcomp, p.c0[k], p.c1[k]); } if (!first) for (i = 0; i < p.vprow - 1; i++) pdf_add_quad(shade, &ref[i], &ref[i+1], &buf[i+1], &buf[i]); memcpy(ref, buf, p.vprow * sizeof(struct vertex)); first = 0; } free(ref); free(buf); }
static void triangulate_patch(fz_context *ctx, pdf_tensor_patch p, fz_shade *shade) { struct vertex v0, v1, v2, v3; v0.x = p.pole[0][0].x; v0.y = p.pole[0][0].y; memcpy(v0.c, p.color[0], sizeof(v0.c)); v1.x = p.pole[0][3].x; v1.y = p.pole[0][3].y; memcpy(v1.c, p.color[1], sizeof(v1.c)); v2.x = p.pole[3][3].x; v2.y = p.pole[3][3].y; memcpy(v2.c, p.color[2], sizeof(v2.c)); v3.x = p.pole[3][0].x; v3.y = p.pole[3][0].y; memcpy(v3.c, p.color[3], sizeof(v3.c)); pdf_add_quad(ctx, shade, &v0, &v1, &v2, &v3); }
static void pdf_load_function_based_shading(fz_shade *shade, pdf_document *xref, pdf_obj *dict, pdf_function *func) { pdf_obj *obj; float x0, y0, x1, y1; fz_matrix matrix; struct vertex v[4]; int xx, yy; float x, y; float xn, yn; int i; fz_context *ctx = xref->ctx; x0 = y0 = 0; x1 = y1 = 1; obj = pdf_dict_gets(dict, "Domain"); if (pdf_array_len(obj) == 4) { x0 = pdf_to_real(pdf_array_get(obj, 0)); x1 = pdf_to_real(pdf_array_get(obj, 1)); y0 = pdf_to_real(pdf_array_get(obj, 2)); y1 = pdf_to_real(pdf_array_get(obj, 3)); } matrix = fz_identity; obj = pdf_dict_gets(dict, "Matrix"); if (pdf_array_len(obj) == 6) matrix = pdf_to_matrix(ctx, obj); for (yy = 0; yy < FUNSEGS; yy++) { y = y0 + (y1 - y0) * yy / FUNSEGS; yn = y0 + (y1 - y0) * (yy + 1) / FUNSEGS; for (xx = 0; xx < FUNSEGS; xx++) { x = x0 + (x1 - x0) * xx / FUNSEGS; xn = x0 + (x1 - x0) * (xx + 1) / FUNSEGS; v[0].x = x; v[0].y = y; v[1].x = xn; v[1].y = y; v[2].x = xn; v[2].y = yn; v[3].x = x; v[3].y = yn; for (i = 0; i < 4; i++) { fz_point pt; float fv[2]; fv[0] = v[i].x; fv[1] = v[i].y; pdf_eval_function(ctx, func, fv, 2, v[i].c, shade->colorspace->n); pt.x = v[i].x; pt.y = v[i].y; pt = fz_transform_point(matrix, pt); v[i].x = pt.x; v[i].y = pt.y; } pdf_add_quad(ctx, shade, &v[0], &v[1], &v[2], &v[3]); } } }