Max 5 API Reference
00001 /* 00002 Copyright 2001-2005 - Cycling '74 00003 Joshua Kit Clayton jkc@cycling74.com 00004 */ 00005 00006 #include "jit.common.h" 00007 #include "jit.fixmath.h" 00008 00009 typedef struct _jit_la_trace 00010 { 00011 t_object ob; 00012 long resultcount; 00013 double result[2]; 00014 } t_jit_la_trace; 00015 00016 void *_jit_la_trace_class; 00017 00018 t_jit_la_trace *jit_la_trace_new(void); 00019 void jit_la_trace_free(t_jit_la_trace *x); 00020 t_jit_err jit_la_trace_matrix_calc(t_jit_la_trace *x, void *inputs, void *outputs); 00021 00022 void jit_la_trace_calculate_2d_real(t_jit_la_trace *x, double *val, t_jit_matrix_info *in_minfo, char *bip); 00023 void jit_la_trace_calculate_2d_complex(t_jit_la_trace *x, double *val, t_jit_matrix_info *in_minfo, char *bip); 00024 00025 t_jit_err jit_la_trace_init(void) 00026 { 00027 long attrflags=0; 00028 t_jit_object *attr,*mop; 00029 00030 _jit_la_trace_class = jit_class_new("jit_la_trace",(method)jit_la_trace_new,(method)jit_la_trace_free, 00031 sizeof(t_jit_la_trace),0L); 00032 00033 //add mop 00034 mop = jit_object_new(_jit_sym_jit_mop,1,0); 00035 jit_class_addadornment(_jit_la_trace_class,mop); 00036 //add methods 00037 jit_class_addmethod(_jit_la_trace_class, (method)jit_la_trace_matrix_calc, "matrix_calc", A_CANT, 0L); 00038 //add attributes 00039 attrflags = JIT_ATTR_SET_OPAQUE_USER | JIT_ATTR_GET_OPAQUE_USER; 00040 attr = jit_object_new(_jit_sym_jit_attr_offset_array,"result",_jit_sym_float64,2,attrflags, 00041 (method)0L,(method)0L,calcoffset(t_jit_la_trace,resultcount),calcoffset(t_jit_la_trace,result)); 00042 jit_class_addattr(_jit_la_trace_class,attr); 00043 jit_class_register(_jit_la_trace_class); 00044 00045 return JIT_ERR_NONE; 00046 } 00047 00048 t_jit_err jit_la_trace_matrix_calc(t_jit_la_trace *x, void *inputs, void *outputs) 00049 { 00050 t_jit_err err=JIT_ERR_NONE; 00051 long in_savelock; 00052 t_jit_matrix_info in_minfo; 00053 char *in_bp; 00054 double *trace=x->result; 00055 void *in_matrix; 00056 00057 in_matrix = jit_object_method(inputs,_jit_sym_getindex,0); 00058 00059 if (x&&in_matrix&&trace) { 00060 trace[0] = 0; 00061 trace[1] = 0; 00062 in_savelock = (long) jit_object_method(in_matrix,_jit_sym_lock,1); 00063 jit_object_method(in_matrix,_jit_sym_getinfo,&in_minfo); 00064 jit_object_method(in_matrix,_jit_sym_getdata,&in_bp); 00065 if (!in_bp) { err=JIT_ERR_INVALID_INPUT; goto out; } 00066 //compatible types? 00067 if ((in_minfo.type!=_jit_sym_float32)&&(in_minfo.type!=_jit_sym_float64)) 00068 { err=JIT_ERR_MISMATCH_TYPE; goto out; } 00069 //compatible planecounts? 00070 //planecount 1=real. planecount 2=complex 00071 if (((in_minfo.planecount!=1)&&(in_minfo.planecount!=2))) 00072 { err=JIT_ERR_MISMATCH_PLANE; goto out; } 00073 x->resultcount = in_minfo.planecount; 00074 //square? 00075 if (in_minfo.dim[0]!=in_minfo.dim[1]) 00076 { err=JIT_ERR_MISMATCH_DIM; goto out; } 00077 //only 2d 00078 if (in_minfo.planecount==1) 00079 jit_la_trace_calculate_2d_real(x, trace, &in_minfo, in_bp); 00080 else 00081 jit_la_trace_calculate_2d_complex(x, trace, &in_minfo, in_bp); 00082 } else { 00083 return JIT_ERR_INVALID_PTR; 00084 } 00085 00086 out: 00087 jit_object_method(in_matrix,_jit_sym_lock,in_savelock); 00088 return err; 00089 } 00090 00091 //diagonal sum 00092 void jit_la_trace_calculate_2d_real(t_jit_la_trace *x, double *val, t_jit_matrix_info *in_minfo, char *bip) 00093 { 00094 long i,rows; 00095 char *p; 00096 00097 *val=0.; 00098 00099 if (in_minfo->type==_jit_sym_float32) { 00100 rows = in_minfo->dim[1]; 00101 for (i=0;i<rows;i++) { 00102 p = bip + i*in_minfo->dimstride[1] + i*in_minfo->dimstride[0]; 00103 *val += (double)(*((float *)(p))); 00104 } 00105 } else if (in_minfo->type==_jit_sym_float64) { 00106 rows = in_minfo->dim[1]; 00107 for (i=0;i<rows;i++) { 00108 p = bip + i*in_minfo->dimstride[1] + i*in_minfo->dimstride[0]; 00109 *val += (*((double *)(p))); 00110 } 00111 } 00112 } 00113 00114 #define COMPLEX_IS_ZERO(a,b) (((a)==0)&&((b)==0)) 00115 #define COMPLEX_IS_ZERO_THRESH(a,b,thresh) ((ABS(a)<(thresh))&&(ABS(b)<(thresh))) 00116 #define COMPLEX_RECIP_REAL(a,b) ((a)/(((a)*(a))+((b)*(b)))) 00117 #define COMPLEX_RECIP_IMAG(a,b) (-(b)/(((a)*(a))+((b)*(b)))) 00118 #define COMPLEX_MULT_REAL(a,b,c,d) (((a)*(c))-((b)*(d))) 00119 #define COMPLEX_MULT_IMAG(a,b,c,d) (((a)*(d))+((b)*(c))) 00120 00121 void jit_la_trace_calculate_2d_complex(t_jit_la_trace *x, double *val, t_jit_matrix_info *in_minfo, char *bip) 00122 { 00123 long i,rows; 00124 char *p; 00125 double tmp[2]; 00126 00127 val[0]=0.; 00128 val[1]=0.; 00129 00130 if (in_minfo->type==_jit_sym_float32) { 00131 rows = in_minfo->dim[1]; 00132 for (i=0;i<rows;i++) { 00133 p = bip + i*in_minfo->dimstride[1] + i*in_minfo->dimstride[0]; 00134 val[0] += (double)(((float *)p)[0]); 00135 val[1] += (double)(((float *)p)[1]); 00136 } 00137 } else if (in_minfo->type==_jit_sym_float64) { 00138 rows = in_minfo->dim[1]; 00139 for (i=0;i<rows;i++) { 00140 p = bip + i*in_minfo->dimstride[1] + i*in_minfo->dimstride[0]; 00141 val[0] += ((double *)p)[0]; 00142 val[1] += ((double *)p)[1]; 00143 } 00144 } 00145 } 00146 00147 00148 t_jit_la_trace *jit_la_trace_new(void) 00149 { 00150 t_jit_la_trace *x; 00151 00152 if (x=(t_jit_la_trace *)jit_object_alloc(_jit_la_trace_class)) { 00153 } else { 00154 x = NULL; 00155 } 00156 return x; 00157 } 00158 00159 void jit_la_trace_free(t_jit_la_trace *x) 00160 { 00161 }
Copyright © 2008, Cycling '74