diff options
author | Tor Andersson <tor@ghostscript.com> | 2010-12-04 23:33:02 +0000 |
---|---|---|
committer | Tor Andersson <tor@ghostscript.com> | 2010-12-04 23:33:02 +0000 |
commit | bdfb216f7fa59be87b0300e7d6d1c53a751b796c (patch) | |
tree | 9912fb8be337d4dc380ed3dd2f5b0b67689d4f95 | |
parent | d62f4a4cb145b5da1ae38bea340fbc9e903f6612 (diff) | |
download | mupdf-bdfb216f7fa59be87b0300e7d6d1c53a751b796c.tar.xz |
Support 3-d sampled functions.
-rw-r--r-- | mupdf/pdf_function.c | 41 |
1 files 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); |