Max 5 API Reference
00001 /* 00002 Copyright 2001-2002 - Cycling '74 00003 Joshua Kit Clayton jkc@cycling74.com 00004 */ 00005 00006 #include "jit.common.h" 00007 00008 typedef struct _jit_notify_vecdata 00009 { 00010 double min; 00011 double max; 00012 long lmin; 00013 long lmax; 00014 long cmin; 00015 long cmax; 00016 } t_jit_notify_vecdata; 00017 00018 typedef struct _jit_notify 00019 { 00020 t_object ob; 00021 double min; 00022 double max; 00023 } t_jit_notify; 00024 00025 void *_jit_notify_class; 00026 00027 t_jit_err jit_notify_init(void); 00028 t_jit_notify *jit_notify_new(void); 00029 void jit_notify_free(t_jit_notify *x); 00030 t_jit_err jit_notify_getvecdata(t_jit_notify *x, t_jit_notify_vecdata *vd); 00031 t_jit_err jit_notify_matrix_calc(t_jit_notify *x, void *inputs, void *outputs); 00032 00033 void jit_notify_calculate_ndim(long dim, long *dimsize, long planecount, t_jit_notify_vecdata *vecdata, t_jit_matrix_info *in_minfo, char *bip, 00034 t_jit_matrix_info *out_minfo, char *bop); 00035 void jit_notify_vector_char (long n, t_jit_notify_vecdata *vecdata, t_jit_op_info *in, t_jit_op_info *out); 00036 void jit_notify_vector_long (long n, t_jit_notify_vecdata *vecdata, t_jit_op_info *in, t_jit_op_info *out); 00037 void jit_notify_vector_float32 (long n, t_jit_notify_vecdata *vecdata, t_jit_op_info *in, t_jit_op_info *out); 00038 void jit_notify_vector_float64 (long n, t_jit_notify_vecdata *vecdata, t_jit_op_info *in, t_jit_op_info *out); 00039 00040 t_jit_err jit_notify_init(void) 00041 { 00042 long attrflags=0; 00043 t_jit_object *attr,*mop; 00044 00045 _jit_notify_class = jit_class_new("jit_notify",(method)jit_notify_new,(method)jit_notify_free, 00046 sizeof(t_jit_notify),A_CANT,0L); //A_CANT = untyped 00047 00048 //add mop 00049 mop = jit_object_new(_jit_sym_jit_mop,1,1); //#inputs,#outputs 00050 jit_class_addadornment(_jit_notify_class,mop); 00051 //add methods 00052 jit_class_addmethod(_jit_notify_class, (method)jit_notify_matrix_calc, "matrix_calc", A_CANT, 0L); 00053 //add attributes 00054 attrflags = JIT_ATTR_GET_DEFER_LOW | JIT_ATTR_SET_USURP_LOW; 00055 attr = jit_object_new(_jit_sym_jit_attr_offset,"min",_jit_sym_float64,attrflags, 00056 (method)0L,(method)0L,calcoffset(t_jit_notify,min)); 00057 jit_class_addattr(_jit_notify_class,attr); 00058 attr = jit_object_new(_jit_sym_jit_attr_offset,"max",_jit_sym_float64,attrflags, 00059 (method)0L,(method)0L,calcoffset(t_jit_notify,max)); 00060 jit_class_addattr(_jit_notify_class,attr); 00061 00062 //NOTIFY EXAMPLE: WE NEED A "REGISTER" METHOD SO THAT CLIENTS CAN ATTACH TO US 00063 jit_class_addmethod(_jit_notify_class, (method)jit_object_register, "register", A_CANT, 0L); // can register 00064 00065 jit_class_register(_jit_notify_class); 00066 00067 return JIT_ERR_NONE; 00068 } 00069 00070 t_jit_err jit_notify_getvecdata(t_jit_notify *x, t_jit_notify_vecdata *vd) 00071 { 00072 if (x&&vd) { 00073 vd->min = x->min; 00074 vd->max = x->max; 00075 vd->lmin = x->min; 00076 vd->lmax = x->max; 00077 vd->cmin = x->min*255.; 00078 vd->cmax = x->max*255.; 00079 CLIP(vd->cmin,0,255); 00080 CLIP(vd->cmax,0,255); 00081 return JIT_ERR_NONE; 00082 } else { 00083 return JIT_ERR_INVALID_PTR; 00084 } 00085 } 00086 00087 t_jit_err jit_notify_matrix_calc(t_jit_notify *x, void *inputs, void *outputs) 00088 { 00089 t_jit_err err=JIT_ERR_NONE; 00090 long in_savelock,in2_savelock,out_savelock; 00091 t_jit_matrix_info in_minfo,out_minfo; 00092 char *in_bp,*out_bp; 00093 long i,dimcount,planecount,dim[JIT_MATRIX_MAX_DIMCOUNT]; 00094 t_jit_notify_vecdata vecdata; 00095 void *in_matrix,*out_matrix; 00096 00097 in_matrix = jit_object_method(inputs,_jit_sym_getindex,0); 00098 out_matrix = jit_object_method(outputs,_jit_sym_getindex,0); 00099 00100 if (x&&in_matrix&&out_matrix) { 00101 in_savelock = (long) jit_object_method(in_matrix,_jit_sym_lock,1); 00102 out_savelock = (long) jit_object_method(out_matrix,_jit_sym_lock,1); 00103 00104 jit_object_method(in_matrix,_jit_sym_getinfo,&in_minfo); 00105 jit_object_method(out_matrix,_jit_sym_getinfo,&out_minfo); 00106 00107 jit_object_method(in_matrix,_jit_sym_getdata,&in_bp); 00108 jit_object_method(out_matrix,_jit_sym_getdata,&out_bp); 00109 00110 if (!in_bp) { err=JIT_ERR_INVALID_INPUT; goto out;} 00111 if (!out_bp) { err=JIT_ERR_INVALID_OUTPUT; goto out;} 00112 00113 //compatible types? 00114 if (in_minfo.type!=out_minfo.type) { 00115 err=JIT_ERR_MISMATCH_TYPE; 00116 goto out; 00117 } 00118 00119 //get dimensions/planecount 00120 dimcount = out_minfo.dimcount; 00121 planecount = out_minfo.planecount; 00122 00123 for (i=0;i<dimcount;i++) { 00124 //if dimsize is 1, treat as infinite domain across that dimension. 00125 //otherwise truncate if less than the output dimsize 00126 dim[i] = out_minfo.dim[i]; 00127 if ((in_minfo.dim[i]<dim[i])&&in_minfo.dim[i]>1) { 00128 dim[i] = in_minfo.dim[i]; 00129 } 00130 } 00131 00132 jit_notify_getvecdata(x,&vecdata); 00133 jit_notify_calculate_ndim(dimcount, dim, planecount, &vecdata, &in_minfo, in_bp, &out_minfo, out_bp); 00134 //NOTIFY EXAMPLE: HERE WE'RE SENDING SOME BOGUS INFO TO ALL OUR CLIENTS 00135 { 00136 t_atom foo[3]; 00137 00138 jit_atom_setlong(&foo[0],1); 00139 jit_atom_setlong(&foo[1],2); 00140 jit_atom_setlong(&foo[2],3); 00141 jit_object_notify(x,gensym("splat"), foo); //the last pointer argument could be anything. 00142 } 00143 } else { 00144 return JIT_ERR_INVALID_PTR; 00145 } 00146 00147 out: 00148 jit_object_method(out_matrix,gensym("lock"),out_savelock); 00149 jit_object_method(in_matrix,gensym("lock"),in_savelock); 00150 return err; 00151 } 00152 00153 00154 void jit_notify_calculate_ndim(long dimcount, long *dim, long planecount, t_jit_notify_vecdata *vecdata, t_jit_matrix_info *in_minfo, char *bip, 00155 t_jit_matrix_info *out_minfo, char *bop) 00156 { 00157 long i,j,n; 00158 char *ip,*op; 00159 t_jit_op_info in_opinfo,out_opinfo; 00160 00161 if (dimcount<1) return; //safety 00162 00163 switch(dimcount) { 00164 case 1: 00165 dim[1]=1; 00166 case 2: 00167 //if planecount the same, flatten planes - treat as single plane data for speed 00168 n = dim[0]; 00169 if ((in_minfo->dim[0]>1)&&(out_minfo->dim[0]>1)&& 00170 (in_minfo->planecount==out_minfo->planecount)) { 00171 in_opinfo.stride = 1; 00172 out_opinfo.stride = 1; 00173 n *= planecount; 00174 planecount = 1; 00175 } else { 00176 in_opinfo.stride = in_minfo->dim[0]>1?in_minfo->planecount:0; 00177 out_opinfo.stride = out_minfo->dim[0]>1?out_minfo->planecount:0; 00178 } 00179 if (in_minfo->type==_jit_sym_char) { 00180 for (i=0;i<dim[1];i++){ 00181 for (j=0;j<planecount;j++) { 00182 in_opinfo.p = bip + i*in_minfo->dimstride[1] + j%in_minfo->planecount; 00183 out_opinfo.p = bop + i*out_minfo->dimstride[1] + j%out_minfo->planecount; 00184 jit_notify_vector_char(n,vecdata,&in_opinfo,&out_opinfo); 00185 } 00186 } 00187 } else if (in_minfo->type==_jit_sym_long) { 00188 for (i=0;i<dim[1];i++){ 00189 for (j=0;j<planecount;j++) { 00190 in_opinfo.p = bip + i*in_minfo->dimstride[1] + (j%in_minfo->planecount)*4; 00191 out_opinfo.p = bop + i*out_minfo->dimstride[1] + (j%out_minfo->planecount)*4; 00192 jit_notify_vector_long(n,vecdata,&in_opinfo,&out_opinfo); 00193 } 00194 } 00195 } else if (in_minfo->type==_jit_sym_float32) { 00196 for (i=0;i<dim[1];i++){ 00197 for (j=0;j<planecount;j++) { 00198 in_opinfo.p = bip + i*in_minfo->dimstride[1] + (j%in_minfo->planecount)*4; 00199 out_opinfo.p = bop + i*out_minfo->dimstride[1] + (j%out_minfo->planecount)*4; 00200 jit_notify_vector_float32(n,vecdata,&in_opinfo,&out_opinfo); 00201 } 00202 } 00203 } else if (in_minfo->type==_jit_sym_float64) { 00204 for (i=0;i<dim[1];i++){ 00205 for (j=0;j<planecount;j++) { 00206 in_opinfo.p = bip + i*in_minfo->dimstride[1] + (j%in_minfo->planecount)*8; 00207 out_opinfo.p = bop + i*out_minfo->dimstride[1] + (j%out_minfo->planecount)*8; 00208 jit_notify_vector_float64(n,vecdata,&in_opinfo,&out_opinfo); 00209 } 00210 } 00211 } 00212 break; 00213 default: 00214 for (i=0;i<dim[dimcount-1];i++) { 00215 ip = bip + i*in_minfo->dimstride[dimcount-1]; 00216 op = bop + i*out_minfo->dimstride[dimcount-1]; 00217 jit_notify_calculate_ndim(dimcount-1,dim,planecount,vecdata,in_minfo,ip,out_minfo,op); 00218 } 00219 } 00220 } 00221 00222 void jit_notify_vector_char(long n, t_jit_notify_vecdata *vecdata, t_jit_op_info *in, t_jit_op_info *out) 00223 { 00224 long min=vecdata->cmin; 00225 long max=vecdata->cmax; 00226 uchar *ip,*op; 00227 long is,os; 00228 long tmp; 00229 00230 ip = ((uchar *)in->p); 00231 op = ((uchar *)out->p); 00232 is = in->stride; 00233 os = out->stride; 00234 00235 if ((is==1)&&(os==1)) { 00236 ++n;--op;--ip; 00237 while (--n) { 00238 tmp = *++ip; 00239 *++op = tmp>max?max:tmp<min?min:tmp; 00240 } 00241 } else { 00242 while (n--) { 00243 tmp = *ip; 00244 *op = tmp>max?max:tmp<min?min:tmp; 00245 ip+=is;op+=os; 00246 } 00247 } 00248 } 00249 00250 void jit_notify_vector_long(long n, t_jit_notify_vecdata *vecdata, t_jit_op_info *in, t_jit_op_info *out) 00251 { 00252 long min=vecdata->lmin; 00253 long max=vecdata->lmax; 00254 long *ip,*op; 00255 long is,os; 00256 long tmp; 00257 00258 ip = ((long *)in->p); 00259 op = ((long *)out->p); 00260 is = in->stride; 00261 os = out->stride; 00262 00263 if ((is==1)&&(os==1)) { 00264 ++n;--op;--ip; 00265 while (--n) { 00266 tmp = *++ip; 00267 *++op = tmp>max?max:tmp<min?min:tmp; 00268 } 00269 } else { 00270 while (n--) { 00271 tmp = *ip; 00272 *op = tmp>max?max:tmp<min?min:tmp; 00273 ip+=is;op+=os; 00274 } 00275 } 00276 } 00277 00278 void jit_notify_vector_float32(long n, t_jit_notify_vecdata *vecdata, t_jit_op_info *in, t_jit_op_info *out) 00279 { 00280 float min=vecdata->min; 00281 float max=vecdata->max; 00282 float *ip,*op; 00283 long is,os; 00284 float tmp; 00285 00286 ip = ((float *)in->p); 00287 op = ((float *)out->p); 00288 is = in->stride; 00289 os = out->stride; 00290 00291 if ((is==1)&&(os==1)) { 00292 ++n;--op;--ip; 00293 while (--n) { 00294 tmp = *++ip; 00295 *++op = tmp>max?max:tmp<min?min:tmp; 00296 } 00297 } else { 00298 while (n--) { 00299 tmp = *ip; 00300 *op = tmp>max?max:tmp<min?min:tmp; 00301 ip+=is;op+=os; 00302 } 00303 } 00304 } 00305 00306 void jit_notify_vector_float64(long n, t_jit_notify_vecdata *vecdata, t_jit_op_info *in, t_jit_op_info *out) 00307 { 00308 double min=vecdata->min; 00309 double max=vecdata->max; 00310 double *ip,*op; 00311 long is,os; 00312 double tmp; 00313 00314 ip = ((double *)in->p); 00315 op = ((double *)out->p); 00316 is = in->stride; 00317 os = out->stride; 00318 00319 if ((is==1)&&(os==1)) { 00320 ++n;--op;--ip; 00321 while (--n) { 00322 tmp = *++ip; 00323 *++op = tmp>max?max:tmp<min?min:tmp; 00324 } 00325 } else { 00326 while (n--) { 00327 tmp = *ip; 00328 *op = tmp>max?max:tmp<min?min:tmp; 00329 ip+=is;op+=os; 00330 } 00331 } 00332 } 00333 00334 t_jit_notify *jit_notify_new(void) 00335 { 00336 t_jit_notify *x; 00337 00338 if (x=(t_jit_notify *)jit_object_alloc(_jit_notify_class)) { 00339 x->min = 0.; 00340 x->max = 1.; 00341 } else { 00342 x = NULL; 00343 } 00344 return x; 00345 } 00346 00347 void jit_notify_free(t_jit_notify *x) 00348 { 00349 //nada 00350 }
Copyright © 2008, Cycling '74