diff options
-rw-r--r-- | fitz/res_shade.c | 53 |
1 files changed, 20 insertions, 33 deletions
diff --git a/fitz/res_shade.c b/fitz/res_shade.c index 0369830d..732855ed 100644 --- a/fitz/res_shade.c +++ b/fitz/res_shade.c @@ -646,9 +646,9 @@ static void fz_mesh_type6_process(fz_context *ctx, fz_shade *shade, const fz_matrix *ctm, fz_mesh_processor *painter) { fz_stream *stream = fz_open_compressed_buffer(ctx, shade->buffer); - int haspatch, hasprevpatch; - float prevc[4][FZ_MAX_COLORS]; - fz_point prevp[12]; + float color_storage[2][4][FZ_MAX_COLORS]; + fz_point point_storage[2][12]; + int store = 0; int ncomp = painter->ncomp; int i, k; int bpflag = shade->u.m.bpflag; @@ -663,14 +663,16 @@ fz_mesh_type6_process(fz_context *ctx, fz_shade *shade, const fz_matrix *ctm, fz fz_try(ctx) { - hasprevpatch = 0; + float (*prevc)[FZ_MAX_COLORS] = NULL; + fz_point *prevp = NULL; while (!fz_is_eof_bits(stream)) { - float c[4][FZ_MAX_COLORS]; - fz_point v[12]; + float (*c)[FZ_MAX_COLORS] = color_storage[store]; + fz_point *v = point_storage[store]; int startcolor; int startpt; int flag; + tensor_patch patch; flag = fz_read_bits(stream, bpflag); @@ -698,13 +700,10 @@ fz_mesh_type6_process(fz_context *ctx, fz_shade *shade, const fz_matrix *ctm, fz c[i][k] = read_sample(stream, bpcomp, c0[k], c1[k]); } - haspatch = 0; - if (flag == 0) { - haspatch = 1; } - else if (flag == 1 && hasprevpatch) + else if (flag == 1 && prevc) { v[0] = prevp[3]; v[1] = prevp[4]; @@ -712,10 +711,8 @@ fz_mesh_type6_process(fz_context *ctx, fz_shade *shade, const fz_matrix *ctm, fz v[3] = prevp[6]; memcpy(c[0], prevc[1], ncomp * sizeof(float)); memcpy(c[1], prevc[2], ncomp * sizeof(float)); - - haspatch = 1; } - else if (flag == 2 && hasprevpatch) + else if (flag == 2 && prevc) { v[0] = prevp[6]; v[1] = prevp[7]; @@ -723,10 +720,8 @@ fz_mesh_type6_process(fz_context *ctx, fz_shade *shade, const fz_matrix *ctm, fz v[3] = prevp[9]; memcpy(c[0], prevc[2], ncomp * sizeof(float)); memcpy(c[1], prevc[3], ncomp * sizeof(float)); - - haspatch = 1; } - else if (flag == 3 && hasprevpatch) + else if (flag == 3 && prevc) { v[0] = prevp[ 9]; v[1] = prevp[10]; @@ -734,29 +729,21 @@ fz_mesh_type6_process(fz_context *ctx, fz_shade *shade, const fz_matrix *ctm, fz v[3] = prevp[ 0]; memcpy(c[0], prevc[3], ncomp * sizeof(float)); memcpy(c[1], prevc[0], ncomp * sizeof(float)); - - haspatch = 1; } + else + continue; - if (haspatch) - { - tensor_patch patch; - - make_tensor_patch(&patch, 6, v); - - for (i = 0; i < 4; i++) - memcpy(patch.color[i], c[i], ncomp * sizeof(float)); - draw_patch(painter, &patch, SUBDIV, SUBDIV); + make_tensor_patch(&patch, 6, v); - for (i = 0; i < 12; i++) - prevp[i] = v[i]; + for (i = 0; i < 4; i++) + memcpy(patch.color[i], c[i], ncomp * sizeof(float)); - for (i = 0; i < 4; i++) - memcpy(prevc[i], c[i], ncomp * sizeof(float)); + draw_patch(painter, &patch, SUBDIV, SUBDIV); - hasprevpatch = 1; - } + prevp = v; + prevc = c; + store ^= 1; } } fz_always(ctx) |