From 0c0b07d3bff68484d554b33d7693117863404d2a Mon Sep 17 00:00:00 2001 From: Ed Kelly Date: Fri, 24 Nov 2006 13:45:33 +0000 Subject: This commit was generated by cvs2svn to compensate for changes in r6421, which included commits to RCS files with non-trunk default branches. svn path=/trunk/externals/ekext/; revision=6422 --- maskxor/maskxor.c | 118 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100755 maskxor/maskxor.c (limited to 'maskxor/maskxor.c') diff --git a/maskxor/maskxor.c b/maskxor/maskxor.c new file mode 100755 index 0000000..b75379f --- /dev/null +++ b/maskxor/maskxor.c @@ -0,0 +1,118 @@ +#include "m_pd.h" +#include +#define MAXENTRIES 512 + +static t_class *maskxor_class; + +typedef struct _mask +{ + t_atom maskxor[MAXENTRIES]; + t_atom maskl[MAXENTRIES]; + t_atom maskr[MAXENTRIES]; +} t_mask; + +typedef struct _maskxor +{ + t_object x_obj; + t_mask masking; + t_float total; + t_float f_in, yes; + t_outlet *thru, *bool, *mask; +} t_maskxor; + +void maskxor_float(t_maskxor *x, t_floatarg fin) +{ + int input = (int)fin; + if(input>=0 && inputf_in = fin; + x->yes = atom_getfloatarg(input, MAXENTRIES, x->masking.maskxor); + outlet_float(x->bool, x->yes); + if(x->yes) outlet_float(x->thru, x->f_in); + } +} + +void maskxor_bang(t_maskxor *x, t_symbol *s) +{ + outlet_list(x->mask, &s_list, x->total, x->masking.maskxor); + outlet_float(x->bool, x->yes); + if(x->yes)outlet_float(x->thru, x->f_in); +} + +void maskxor_listl(t_maskxor *x, t_symbol *s, int argc, t_atom *argv) +{ + int i; + float listr_element, listl_element, xor_element; + if(x->total < argc && argc < MAXENTRIES) x->total = argc; + for(i=0;itotal;i++) + { + listl_element = atom_getfloat(argv+i); + SETFLOAT(&x->masking.maskl[i], listl_element); + listr_element = atom_getfloatarg(i,MAXENTRIES,x->masking.maskr); + xor_element = (float)((int)listl_element ^ (int)listr_element); + SETFLOAT(&x->masking.maskxor[i], xor_element); + } + outlet_list(x->mask, &s_list, x->total, x->masking.maskxor); +} + +void maskxor_listr(t_maskxor *x, t_symbol *s, int argc, t_atom *argv) +{ + int i; + float listr_element; + if(x->total < argc && argc < MAXENTRIES) + { + x->total = argc; + } + for(i=0;itotal;i++) + { + listr_element = atom_getfloat(argv+i); + SETFLOAT(&x->masking.maskr[i], listr_element); + } +} + +void maskxor_clear(t_maskxor *x) +{ + int i; + for(i=0;i<=MAXENTRIES;i++) + { + SETFLOAT(&x->masking.maskl[i], 0); + SETFLOAT(&x->masking.maskr[i], 0); + SETFLOAT(&x->masking.maskxor[i], 0); + } + x->total=1; + x->yes = x->f_in = 0; +} + +void *maskxor_new(t_symbol *s) +{ + int i; + t_maskxor *x = (t_maskxor *)pd_new(maskxor_class); + x->total = 1; + for(i=0;imasking.maskr[i], 0); + SETFLOAT(&x->masking.maskl[i], 0); + SETFLOAT(&x->masking.maskxor[i], 0); + } + x->thru = outlet_new(&x->x_obj, &s_float); + x->bool = outlet_new(&x->x_obj, &s_float); + x->mask = outlet_new(&x->x_obj, &s_list); + return (void *)x; +} + +void maskxor_setup(void) +{ + maskxor_class = class_new(gensym("maskxor"), + (t_newmethod)maskxor_new, + 0, sizeof(t_maskxor), + CLASS_DEFAULT, A_DEFFLOAT, 0); + post("|..-.--.-..-maskxor.-...--.-..|"); + post("| exclusive-or mask-map |"); + post("|.--.- Edward Kelly 2006 ---.-|"); + class_sethelpsymbol(maskxor_class, gensym("help-maskxor")); + class_addfloat(maskxor_class, maskxor_float); + class_addmethod(maskxor_class, (t_method)maskxor_listl, gensym("listl"), A_GIMME, 0, 0); + class_addmethod(maskxor_class, (t_method)maskxor_listr, gensym("listr"), A_GIMME, 0, 0); + class_addbang(maskxor_class, (t_method)maskxor_bang); + class_addmethod(maskxor_class, (t_method)maskxor_clear, gensym("clear"), A_DEFFLOAT, 0); +} -- cgit v1.2.1