summaryrefslogtreecommitdiff
path: root/fitz/res_shade.c
diff options
context:
space:
mode:
authorRobin Watts <robin.watts@artifex.com>2013-04-16 13:38:50 +0100
committerRobin Watts <robin.watts@artifex.com>2013-04-16 15:31:22 +0100
commitcf6c041d80d1bd5d47707300190255204bebcc1f (patch)
tree4cd03cddf2b35fc9d05acabe873daf923d5982b5 /fitz/res_shade.c
parent52ded6dcabb7f2d43f90ec06d5ad77314186fd56 (diff)
downloadmupdf-cf6c041d80d1bd5d47707300190255204bebcc1f.tar.xz
Avoid more needless copying in mesh processing
Apply the same optimisations to mesh type 6 as were just applied to mesh type 7.
Diffstat (limited to 'fitz/res_shade.c')
-rw-r--r--fitz/res_shade.c53
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)