Max 5 API Reference
00001 /* 00002 * jit.transfer.solarize.c 00003 * 00004 * Copyright 2001-2005 - Cycling '74 00005 * Derek Gerstmann - derek@cycling74.com 00006 * 00007 * functor for a solarize transfer function (aka solarize 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_solarize 00019 { 00020 t_jit_object ob; 00021 t_jit_functor_combined_value threshold; // middle threshold 00022 t_jit_functor_combined_value scale; // scale factor for result 00023 00024 } t_jit_functor_transfer_solarize; 00025 00026 // -------------------------------------------------------------------------- 00027 00028 t_jit_object *jit_functor_transfer_solarize_new(void); 00029 t_jit_err jit_functor_transfer_solarize_free(t_jit_functor_transfer_solarize *x); 00030 t_jit_err jit_functor_transfer_solarize_scale(t_jit_functor_transfer_solarize *x, void *attr, long argc, t_atom *argv); 00031 t_jit_err jit_functor_transfer_solarize_threshold(t_jit_functor_transfer_solarize *x, void *attr, long argc, t_atom *argv); 00032 t_jit_err jit_functor_transfer_solarize_recalc(t_jit_functor_transfer_solarize *x); 00033 00034 long jit_functor_transfer_solarize_eval_fixed(t_jit_functor_transfer_solarize *x, long dimcount, long *vals); 00035 float jit_functor_transfer_solarize_eval_float32(t_jit_functor_transfer_solarize *x, long dimcount, float *vals); 00036 double jit_functor_transfer_solarize_eval_float64(t_jit_functor_transfer_solarize *x, long dimcount, double *vals); 00037 00038 long jit_functor_transfer_solarize_eval_fixed_scalar(t_jit_functor_transfer_solarize *x, long val); 00039 float jit_functor_transfer_solarize_eval_float32_scalar(t_jit_functor_transfer_solarize *x, float val); 00040 double jit_functor_transfer_solarize_eval_float64_scalar(t_jit_functor_transfer_solarize *x, double val); 00041 00042 t_class * _jit_functor_transfer_solarize_class; 00043 00044 // -------------------------------------------------------------------------- 00045 00046 t_jit_err jit_functor_transfer_solarize_init(void) 00047 { 00048 t_jit_object *attr; 00049 00050 // create functor class 00051 _jit_functor_transfer_solarize_class = jit_class_new("jit_functor_transfer_solarize", 00052 (method)jit_functor_transfer_solarize_new, (method)jit_functor_transfer_solarize_free, 00053 sizeof(t_jit_functor_transfer_solarize), 0L); 00054 00055 // add attribute methods 00056 attr = jit_object_new(_jit_sym_jit_attr_offset, "threshold", _jit_sym_float64, 0, 00057 (method)0L, (method)jit_functor_transfer_solarize_threshold, calcoffset(t_jit_functor_transfer_solarize, threshold.float64)); 00058 jit_class_addattr(_jit_functor_transfer_solarize_class, attr); 00059 attr = jit_object_new(_jit_sym_jit_attr_offset, "scale", _jit_sym_float64, 0, 00060 (method)0L, (method)jit_functor_transfer_solarize_scale, calcoffset(t_jit_functor_transfer_solarize, scale.float64)); 00061 jit_class_addattr(_jit_functor_transfer_solarize_class, attr); 00062 00063 // add evaluation methods 00064 jit_class_addmethod(_jit_functor_transfer_solarize_class, 00065 (method)jit_functor_transfer_solarize_eval_fixed, "evalfixed", A_CANT, 0L); 00066 jit_class_addmethod(_jit_functor_transfer_solarize_class, 00067 (method)jit_functor_transfer_solarize_eval_float32, "evalfloat32", A_CANT, 0L); 00068 jit_class_addmethod(_jit_functor_transfer_solarize_class, 00069 (method)jit_functor_transfer_solarize_eval_float64, "evalfloat64", A_CANT, 0L); 00070 00071 // add to functor registry 00072 jit_functor_setup_class(_jit_functor_transfer_solarize_class, "transfer", "solarize"); 00073 jit_class_register(_jit_functor_transfer_solarize_class); 00074 return JIT_ERR_NONE; 00075 } 00076 00077 t_jit_object *jit_functor_transfer_solarize_new(void) 00078 { 00079 t_jit_functor_transfer_solarize *x; 00080 00081 if (x = (t_jit_functor_transfer_solarize *)jit_object_alloc(_jit_functor_transfer_solarize_class)) 00082 { 00083 00084 // initialization 00085 JIT_FUNCTOR_COMBINED_VALUE_SETALL(x->threshold, 0.5); 00086 JIT_FUNCTOR_COMBINED_VALUE_SETALL(x->scale, 2.0); 00087 jit_functor_transfer_solarize_recalc(x); 00088 } 00089 00090 return (t_jit_object *)x; 00091 } 00092 00093 t_jit_err jit_functor_transfer_solarize_free(t_jit_functor_transfer_solarize *x) 00094 { 00095 return JIT_ERR_NONE; 00096 } 00097 00098 // -------------------------------------------------------------------------- 00099 00100 t_jit_err jit_functor_transfer_solarize_threshold( 00101 t_jit_functor_transfer_solarize *x, void *attr, long argc, t_atom *argv) 00102 { 00103 double v; 00104 00105 if (x) { 00106 v = jit_atom_getfloat(argv); 00107 if (x->threshold.float64 != v) { 00108 00109 // copy and convert 00110 JIT_FUNCTOR_COMBINED_VALUE_SETALL(x->threshold, v); 00111 jit_functor_transfer_solarize_recalc(x); 00112 } 00113 return JIT_ERR_NONE; 00114 } 00115 return JIT_ERR_INVALID_PTR; 00116 } 00117 00118 t_jit_err jit_functor_transfer_solarize_scale( 00119 t_jit_functor_transfer_solarize *x, void *attr, long argc, t_atom *argv) 00120 { 00121 double v; 00122 00123 if (x) { 00124 v = jit_atom_getfloat(argv); 00125 if (x->scale.float64 != v) { 00126 00127 // copy and convert 00128 JIT_FUNCTOR_COMBINED_VALUE_SETALL(x->scale, v); 00129 jit_functor_transfer_solarize_recalc(x); 00130 } 00131 return JIT_ERR_NONE; 00132 } 00133 return JIT_ERR_INVALID_PTR; 00134 } 00135 00136 t_jit_err jit_functor_transfer_solarize_recalc(t_jit_functor_transfer_solarize *x) 00137 { 00138 // calculate intermediary values for efficiency 00139 return JIT_ERR_NONE; 00140 } 00141 00142 // ----------------------------------------------------------------------------- 00143 // vector evaluation functions 00144 // ----------------------------------------------------------------------------- 00145 00146 long jit_functor_transfer_solarize_eval_fixed( 00147 t_jit_functor_transfer_solarize *x, long dimcount, long *vals) 00148 { 00149 return jit_functor_eval_fixed_with_float64((t_jit_object *)x, dimcount, vals, 00150 (t_jit_functor_float64_sig)jit_functor_transfer_solarize_eval_float64); 00151 } 00152 00153 float jit_functor_transfer_solarize_eval_float32( 00154 t_jit_functor_transfer_solarize *x, long dimcount, float *vals) 00155 { 00156 return jit_functor_eval_float32_with_scalar_product((t_jit_object *)x, dimcount, vals, 00157 (t_jit_functor_float32_scalar_sig)jit_functor_transfer_solarize_eval_float32_scalar); 00158 } 00159 00160 double jit_functor_transfer_solarize_eval_float64( 00161 t_jit_functor_transfer_solarize *x, long dimcount, double *vals) 00162 { 00163 return jit_functor_eval_float64_with_scalar_product((t_jit_object *)x, dimcount, vals, 00164 (t_jit_functor_float64_scalar_sig)jit_functor_transfer_solarize_eval_float64_scalar); 00165 } 00166 00167 // ----------------------------------------------------------------------------- 00168 // scalar evaluation functions 00169 // ----------------------------------------------------------------------------- 00170 00171 long jit_functor_transfer_solarize_eval_fixed_scalar( 00172 t_jit_functor_transfer_solarize *x, long val) 00173 { 00174 return FloatToFixed(jit_functor_transfer_solarize_eval_float32_scalar(x, FixedToFloat(val))); 00175 } 00176 00177 float jit_functor_transfer_solarize_eval_float32_scalar( 00178 t_jit_functor_transfer_solarize *x, float val) 00179 { 00180 return val > x->threshold.float32 ? x->scale.float32 * (val - x->threshold.float32) : x->scale.float32 * (x->threshold.float32 - val); 00181 } 00182 00183 double jit_functor_transfer_solarize_eval_float64_scalar( 00184 t_jit_functor_transfer_solarize *x, double val) 00185 { 00186 return val > x->threshold.float64 ? x->scale.float64 * (val - x->threshold.float64) : x->scale.float64 * (x->threshold.float64 - val); 00187 } 00188 00189 // -----------------------------------------------------------------------------
Copyright © 2008, Cycling '74