Max 5 API Reference
00001 /* 00002 * jit.transfer.linear.c 00003 * 00004 * Copyright 2001-2005 - Cycling '74 00005 * Derek Gerstmann - derek@cycling74.com 00006 * 00007 * functor for a linear transfer function (aka linear interpolation) 00008 * 00009 */ 00010 00011 // -------------------------------------------------------------------------- 00012 00013 #include "jit.common.h" 00014 #include "jit.functor.h" 00015 00016 // -------------------------------------------------------------------------- 00017 00018 typedef struct _jit_functor_transfer_linear 00019 { 00020 t_jit_object ob; 00021 double low; 00022 double high; 00023 } t_jit_functor_transfer_linear; 00024 00025 // -------------------------------------------------------------------------- 00026 00027 t_jit_object *jit_functor_transfer_linear_new(void); 00028 t_jit_err jit_functor_transfer_linear_free(t_jit_functor_transfer_linear *x); 00029 t_jit_err jit_functor_transfer_linear_low(t_jit_functor_transfer_linear *x, void *attr, long argc, t_atom *argv); 00030 t_jit_err jit_functor_transfer_linear_high(t_jit_functor_transfer_linear *x, void *attr, long argc, t_atom *argv); 00031 t_jit_err jit_functor_transfer_linear_recalc(t_jit_functor_transfer_linear *x); 00032 00033 long jit_functor_transfer_linear_eval_fixed(t_jit_functor_transfer_linear *x, long dimcount, long *vals); 00034 float jit_functor_transfer_linear_eval_float32(t_jit_functor_transfer_linear *x, long dimcount, float *vals); 00035 double jit_functor_transfer_linear_eval_float64(t_jit_functor_transfer_linear *x, long dimcount, double *vals); 00036 00037 long jit_functor_transfer_linear_eval_fixed_scalar(t_jit_functor_transfer_linear *x, long val); 00038 float jit_functor_transfer_linear_eval_float32_scalar(t_jit_functor_transfer_linear *x, float val); 00039 double jit_functor_transfer_linear_eval_float64_scalar(t_jit_functor_transfer_linear *x, double val); 00040 00041 t_class * _jit_functor_transfer_linear_class; 00042 00043 // -------------------------------------------------------------------------- 00044 00045 t_jit_err jit_functor_transfer_linear_init(void) 00046 { 00047 t_jit_object *attr; 00048 00049 // create functor class 00050 _jit_functor_transfer_linear_class = jit_class_new("jit_functor_transfer_linear", 00051 (method)jit_functor_transfer_linear_new,(method)jit_functor_transfer_linear_free, 00052 sizeof(t_jit_functor_transfer_linear),0L); 00053 00054 // add attribute methods 00055 attr = jit_object_new(_jit_sym_jit_attr_offset,"low",_jit_sym_float64,0, 00056 (method)0L,(method)jit_functor_transfer_linear_low,calcoffset(t_jit_functor_transfer_linear,low)); 00057 jit_class_addattr(_jit_functor_transfer_linear_class,attr); 00058 attr = jit_object_new(_jit_sym_jit_attr_offset,"high",_jit_sym_float64,0, 00059 (method)0L,(method)jit_functor_transfer_linear_high,calcoffset(t_jit_functor_transfer_linear,high)); 00060 jit_class_addattr(_jit_functor_transfer_linear_class,attr); 00061 00062 // add evaluation methods 00063 jit_class_addmethod(_jit_functor_transfer_linear_class, 00064 (method)jit_functor_transfer_linear_eval_fixed, "evalfixed", A_CANT, 0L); 00065 jit_class_addmethod(_jit_functor_transfer_linear_class, 00066 (method)jit_functor_transfer_linear_eval_float32, "evalfloat32", A_CANT, 0L); 00067 jit_class_addmethod(_jit_functor_transfer_linear_class, 00068 (method)jit_functor_transfer_linear_eval_float64, "evalfloat64", A_CANT, 0L); 00069 00070 // add to functor registry 00071 jit_functor_setup_class(_jit_functor_transfer_linear_class,"transfer","linear"); 00072 jit_class_register(_jit_functor_transfer_linear_class); 00073 return JIT_ERR_NONE; 00074 } 00075 00076 t_jit_object *jit_functor_transfer_linear_new(void) 00077 { 00078 t_jit_functor_transfer_linear *x; 00079 00080 if (x = (t_jit_functor_transfer_linear *)jit_object_alloc(_jit_functor_transfer_linear_class)) { 00081 00082 // initialization 00083 x->low = 0.0; 00084 x->high = 1.0; 00085 jit_functor_transfer_linear_recalc(x); 00086 } 00087 00088 return (t_jit_object *)x; 00089 } 00090 00091 t_jit_err jit_functor_transfer_linear_free(t_jit_functor_transfer_linear *x) 00092 { 00093 return JIT_ERR_NONE; 00094 } 00095 00096 // -------------------------------------------------------------------------- 00097 00098 t_jit_err jit_functor_transfer_linear_low( 00099 t_jit_functor_transfer_linear *x, void *attr, long argc, t_atom *argv) 00100 { 00101 double v; 00102 00103 if (x) { 00104 v=jit_atom_getfloat(argv); 00105 if (x->low != v) { 00106 x->low = v; 00107 jit_functor_transfer_linear_recalc(x); 00108 } 00109 return JIT_ERR_NONE; 00110 } 00111 return JIT_ERR_INVALID_PTR; 00112 } 00113 00114 t_jit_err jit_functor_transfer_linear_high( 00115 t_jit_functor_transfer_linear *x, void *attr, long argc, t_atom *argv) 00116 { 00117 double v; 00118 00119 if (x) { 00120 v=jit_atom_getfloat(argv); 00121 if (x->high != v) { 00122 x->high = v; 00123 jit_functor_transfer_linear_recalc(x); 00124 } 00125 return JIT_ERR_NONE; 00126 } 00127 return JIT_ERR_INVALID_PTR; 00128 } 00129 00130 t_jit_err jit_functor_transfer_linear_recalc(t_jit_functor_transfer_linear *x) 00131 { 00132 // calculate intermediary values for efficiency 00133 double t; 00134 if(x->low > x->high) 00135 { 00136 t = x->low; 00137 x->low = x->high; 00138 x->high = t; 00139 } 00140 return JIT_ERR_NONE; 00141 } 00142 00143 // ----------------------------------------------------------------------------- 00144 // vector evaluation functions 00145 // ----------------------------------------------------------------------------- 00146 00147 long jit_functor_transfer_linear_eval_fixed( 00148 t_jit_functor_transfer_linear *x, long dimcount, long *vals) 00149 { 00150 return jit_functor_eval_fixed_with_float64((t_jit_object *)x,dimcount,vals, 00151 (t_jit_functor_float64_sig)jit_functor_transfer_linear_eval_float64); 00152 } 00153 00154 float jit_functor_transfer_linear_eval_float32( 00155 t_jit_functor_transfer_linear *x, long dimcount, float *vals) 00156 { 00157 return jit_functor_eval_float32_with_scalar_product((t_jit_object *)x,dimcount,vals, 00158 (t_jit_functor_float32_scalar_sig)jit_functor_transfer_linear_eval_float32_scalar); 00159 } 00160 00161 double jit_functor_transfer_linear_eval_float64( 00162 t_jit_functor_transfer_linear *x, long dimcount, double *vals) 00163 { 00164 return jit_functor_eval_float64_with_scalar_product((t_jit_object *)x,dimcount,vals, 00165 (t_jit_functor_float64_scalar_sig)jit_functor_transfer_linear_eval_float64_scalar); 00166 } 00167 00168 // ----------------------------------------------------------------------------- 00169 // scalar evaluation functions 00170 // ----------------------------------------------------------------------------- 00171 00172 long jit_functor_transfer_linear_eval_fixed_scalar( 00173 t_jit_functor_transfer_linear *x, long val) 00174 { 00175 return FloatToFixed(jit_functor_transfer_linear_eval_float32_scalar(x,FixedToFloat(val))); 00176 } 00177 00178 float jit_functor_transfer_linear_eval_float32_scalar( 00179 t_jit_functor_transfer_linear *x, float val) 00180 { 00181 return x->low + val * (x->high - x->low); 00182 } 00183 00184 double jit_functor_transfer_linear_eval_float64_scalar( 00185 t_jit_functor_transfer_linear *x, double val) 00186 { 00187 return x->low + val * (x->high - x->low); 00188 } 00189 00190 // -----------------------------------------------------------------------------
Copyright © 2008, Cycling '74