| |
| /pliant/graphic/misc/vector.pli |
| |
| 1 |
# gcc -O2 -shared -s -o vector.so -u vector_mul_add -u vector_apply_grid vector.c | |
| 2 |
module "/pliant/language/context.pli" | |
| 3 |
module "/pliant/admin/file.pli" | |
| 4 |
module "/pliant/language/unsafe.pli" | |
| 5 |
| |
| 6 |
constant use_dll os_api="linux" and (file_query "/pliant/graphic/misc/vector.so" standard)=defined | |
| 7 |
constant gamut_maximum_dimension 32 | |
| 8 |
| |
| 9 |
| |
| 10 |
function vector_mul_add n f v s | |
| 11 |
arg Int n ; arg Float f ; arg (Array Float32 gamut_maximum_dimension) v ; arg Int n ; arg_rw (Array Float32 gamut_maximum_dimension) s | |
| 12 |
if use_dll | |
| 13 |
external "/pliant/pliant/graphic/misc/vector.so" "vector_mul_add" | |
| 14 |
else | |
| 15 |
for (var Int d) 0 n-1 | |
| 16 |
s d += f*v:d | |
| 17 |
| |
| 18 |
| |
| 19 |
function vector_apply_grid sdim ddim steps grid src dest -> compute | |
| 20 |
arg Int sdim ddim steps ; arg Address grid src dest ; arg Int compute | |
| 21 |
if use_dll | |
| 22 |
external "/pliant/pliant/graphic/misc/vector.so" "vector_apply_grid" | |
| 23 |
else | |
| 24 |
var Int base := 0 | |
| 25 |
var Int n := 0 | |
| 26 |
var (Array Int gamut_maximum_dimension) gs | |
| 27 |
var (Array Float32 gamut_maximum_dimension) remain | |
| 28 |
var Int unit := 1 | |
| 29 |
for (var Int d) 0 sdim-1 | |
| 30 |
var Int v := src map uInt8 d | |
| 31 |
if v=0 | |
| 32 |
void | |
| 33 |
eif v=255 | |
| 34 |
base += (steps-1)*unit | |
| 35 |
else | |
| 36 |
var Int i := min v*(steps-1)\255 steps-2 | |
| 37 |
gs n := unit | |
| 38 |
base += i*unit | |
| 39 |
remain n := ( v - i*255\(steps-1) ) / ( (i+1)*255\(steps-1) - i*255\(steps-1) ) | |
| 40 |
n += 1 | |
| 41 |
unit *= steps | |
| 42 |
for (var Int d) 0 ddim-1 | |
| 43 |
dest map Float32 d := 0 | |
| 44 |
for (var Int u) 0 2^n-1 | |
| 45 |
var Int index := base ; var Float f := 1 | |
| 46 |
for (var Int d) 0 n-1 | |
| 47 |
if (u .and. 2^d)<>0 | |
| 48 |
index += gs d | |
| 49 |
f *= remain d | |
| 50 |
else | |
| 51 |
f *= 1-remain:d | |
| 52 |
var Pointer:(Array Float32 gamut_maximum_dimension) p :> (grid translate Float32 index*ddim) map (Array Float32 gamut_maximum_dimension) | |
| 53 |
if p:0=undefined | |
| 54 |
return index | |
| 55 |
for (var Int d) 0 ddim-1 | |
| 56 |
dest map Float32 d += f*p:d | |
| 57 |
compute := -1 | |
| 58 |
| |
| 59 |
| |
| 60 |
export vector_mul_add vector_apply_grid | |
| |