/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