From bdfb216f7fa59be87b0300e7d6d1c53a751b796c Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Sat, 4 Dec 2010 23:33:02 +0000 Subject: Support 3-d sampled functions. --- mupdf/pdf_function.c | 41 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/mupdf/pdf_function.c b/mupdf/pdf_function.c index a44e545d..869f10d0 100644 --- a/mupdf/pdf_function.c +++ b/mupdf/pdf_function.c @@ -1134,10 +1134,13 @@ evalsamplefunc(pdf_function *func, float *in, float *out) else if (func->m == 2) { - float a = func->u.sa.samples[(e0[0] + e0[1] * func->u.sa.size[0]) * func->n + i]; - float b = func->u.sa.samples[(e1[0] + e0[1] * func->u.sa.size[0]) * func->n + i]; - float c = func->u.sa.samples[(e0[0] + e1[1] * func->u.sa.size[0]) * func->n + i]; - float d = func->u.sa.samples[(e1[0] + e1[1] * func->u.sa.size[0]) * func->n + i]; + int s0 = func->n; + int s1 = s0 * func->u.sa.size[0]; + + float a = func->u.sa.samples[e0[0] * s0 + e0[1] * s1 + i]; + float b = func->u.sa.samples[e1[0] * s0 + e0[1] * s1 + i]; + float c = func->u.sa.samples[e0[0] * s0 + e1[1] * s1 + i]; + float d = func->u.sa.samples[e1[0] * s0 + e1[1] * s1 + i]; float ab = a + (b - a) * efrac[0]; float cd = c + (d - c) * efrac[0]; @@ -1147,6 +1150,36 @@ evalsamplefunc(pdf_function *func, float *in, float *out) out[i] = CLAMP(out[i], func->range[i][0], func->range[i][1]); } + else if (func->m == 3) + { + int s0 = func->n; + int s1 = s0 * func->u.sa.size[0]; + int s2 = s1 * func->u.sa.size[1]; + + float a = func->u.sa.samples[e0[0] * s0 + e0[1] * s1 + e0[2] * s2 + i]; + float b = func->u.sa.samples[e1[0] * s0 + e0[1] * s1 + e0[2] * s2 + i]; + float c = func->u.sa.samples[e0[0] * s0 + e1[1] * s1 + e0[2] * s2 + i]; + float d = func->u.sa.samples[e1[0] * s0 + e1[1] * s1 + e0[2] * s2 + i]; + + float ab = a + (b - a) * efrac[0]; + float cd = c + (d - c) * efrac[0]; + float abcd = ab + (cd - ab) * efrac[1]; + + float e = func->u.sa.samples[e0[0] * s0 + e0[1] * s1 + e1[2] * s2 + i]; + float f = func->u.sa.samples[e1[0] * s0 + e0[1] * s1 + e1[2] * s2 + i]; + float g = func->u.sa.samples[e0[0] * s0 + e1[1] * s1 + e1[2] * s2 + i]; + float h = func->u.sa.samples[e1[0] * s0 + e1[1] * s1 + e1[2] * s2 + i]; + + float ef = e + (f - e) * efrac[0]; + float gh = g + (h - g) * efrac[0]; + float efgh = ef + (gh - ef) * efrac[1]; + + float abcdefgh = abcd + (efgh - abcd) * efrac[2]; + + out[i] = LERP(abcdefgh, 0, 1, func->u.sa.decode[i][0], func->u.sa.decode[i][1]); + out[i] = CLAMP(out[i], func->range[i][0], func->range[i][1]); + } + else { return fz_throw("sampled %d-d functions not implemented", func->m); -- cgit v1.2.3