[PD-cvs] externals/iem/iemmatrix/src mtx_minmax.c,1.4,1.5
IOhannes m zmölnig
zmoelnig at users.sourceforge.net
Thu Dec 15 19:08:34 CET 2005
Update of /cvsroot/pure-data/externals/iem/iemmatrix/src
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv9006/d
Modified Files:
mtx_minmax.c
Log Message:
merged functionality for [mtx_min] and [mtx_max] into [mtx_minmax] and rebuilt
the 2 objects using the new one
Index: mtx_minmax.c
===================================================================
RCS file: /cvsroot/pure-data/externals/iem/iemmatrix/src/mtx_minmax.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** mtx_minmax.c 23 Oct 2005 19:50:45 -0000 1.4
--- mtx_minmax.c 15 Dec 2005 18:08:32 -0000 1.5
***************
*** 24,263 ****
struct _MTXminmax_
{
! t_object x_obj;
! int size;
! int outsize;
! t_symbol *minmax_mode;
! int operator_minimum; // 1 if we are [mtx_min], 0 if we are [mtx_max]
! t_outlet *list_outlet;
! t_atom *list_out;
! t_atom *list_in;
};
static void deleteMTXMinMax (MTXminmax *mtx_minmax_obj)
{
! if (mtx_minmax_obj->list_out)
! freebytes (mtx_minmax_obj->list_out, sizeof(t_atom)*(mtx_minmax_obj->size+2));
}
static void mTXSetMinMaxMode (MTXminmax *mtx_minmax_obj, t_symbol *m_sym)
{
! mtx_minmax_obj->minmax_mode = m_sym;
}
! static void *newMTXMin (t_symbol *s, int argc, t_atom *argv)
{
! MTXminmax *mtx_minmax_obj = (MTXminmax *) pd_new (mtx_minmax_class);
! mTXSetMinMaxMode (mtx_minmax_obj, gensym(":"));
! switch ((argc>1)?1:argc) {
! case 1:
! mTXSetMinMaxMode (mtx_minmax_obj, atom_getsymbol (argv));
! }
! mtx_minmax_obj->operator_minimum = 1;
! mtx_minmax_obj->list_outlet = outlet_new (&mtx_minmax_obj->x_obj, gensym("matrix"));
! return ((void *) mtx_minmax_obj);
! }
! static void *newMTXMax (t_symbol *s, int argc, t_atom *argv)
! {
! MTXminmax *mtx_minmax_obj = (MTXminmax *) pd_new (mtx_minmax_class);
! mTXSetMinMaxMode (mtx_minmax_obj, gensym(":"));
! switch ((argc>1)?1:argc) {
! case 1:
! mTXSetMinMaxMode (mtx_minmax_obj, atom_getsymbol (argv));
! }
! mtx_minmax_obj->operator_minimum = 0;
! mtx_minmax_obj->list_outlet = outlet_new (&mtx_minmax_obj->x_obj, gensym("matrix"));
! return ((void *) mtx_minmax_obj);
}
static void mTXMinMaxBang (MTXminmax *mtx_minmax_obj)
{
! if (mtx_minmax_obj->list_out)
! outlet_anything(mtx_minmax_obj->list_outlet, gensym("matrix"),
! mtx_minmax_obj->outsize+2, mtx_minmax_obj->list_out);
! }
! /*
! static void copyList (int size, t_atom *x, t_atom *y)
! {
! while(size--)
! *y++=*x++;
! }
! */
!
! static t_float minList (int n, t_atom *x)
! {
! t_float min=atom_getfloat(x);
! t_float f;
! for (;n--;x++) {
! f = atom_getfloat(x);
! min = (min < f)?min:f;
! }
! return min;
}
! static t_float minListStep (int n, const int step, t_atom *x)
{
! t_float min=atom_getfloat(x);
! t_float f;
! for (;n--;x+=step) {
! f = atom_getfloat(x);
! min = (min < f)?min:f;
! }
! return min;
}
! static t_float maxList (int n, t_atom *x)
! {
! t_float max=atom_getfloat(x);
! t_float f;
! for (;n--;x++) {
! f = atom_getfloat(x);
! max = (max > f)?max:f;
! }
! return max;
! }
! static t_float maxListStep (int n, const int step, t_atom *x)
{
! t_float max=atom_getfloat(x);
! t_float f;
! for (;n--;x+=step) {
! f = atom_getfloat(x);
! max = (max > f)?max:f;
! }
! return max;
}
! static void minListColumns (const int rows, const int columns, t_atom *x, t_atom *y)
! {
! int count;
! t_float f;
! for (count=0; count < columns; count++, x++, y++) {
! f=minListStep (rows, columns, x);
! SETFLOAT(y,f);
! }
! }
! static void minListRows (int rows, int columns, t_atom *x, t_atom *y)
! {
! int count;
! t_float f;
! for (count=0; count < rows; count++, x+=columns, y++) {
! f=minList (columns, x);
! SETFLOAT(y,f);
! }
! }
! static void maxListColumns (const int rows, const int columns, t_atom *x, t_atom *y)
{
! int count;
! t_float f;
! for (count=0; count < columns; count++, x++, y++) {
! f=maxListStep (rows, columns, x);
! SETFLOAT(y,f);
! }
}
! static void maxListRows (int rows, int columns, t_atom *x, t_atom *y)
{
! int count;
! t_float f;
! for (count=0; count < rows; count++, x+=columns, y++) {
! f=maxList (columns, x);
! SETFLOAT(y,f);
! }
}
-
-
static void mTXMinMaxMatrix (MTXminmax *mtx_minmax_obj, t_symbol *s,
! int argc, t_atom *argv)
{
! int rows = atom_getint (argv++);
! int columns = atom_getint (argv++);
! int size = rows * columns;
! int list_size = argc - 2;
! t_atom *list_in = argv;
! t_atom *list_out = mtx_minmax_obj->list_out;
! int rows_out;
! int columns_out;
!
! // size check
! if (!size) {
! post("mtx_minmax: invalid dimensions");
! return;
! }
! else if (list_size<size) {
! post("mtx_minmax: sparse matrix not yet supported: use \"mtx_check\"");
! return;
! }
! if (size != mtx_minmax_obj->size) {
! if (!list_out)
! list_out = (t_atom *) getbytes (sizeof (t_atom) * (size + 2));
! else
! list_out = (t_atom *) resizebytes (list_out,
! sizeof (t_atom) * (mtx_minmax_obj->size+2),
! sizeof (t_atom) * (size + 2));
! }
!
! mtx_minmax_obj->size = size;
! mtx_minmax_obj->list_out = list_out;
!
! // main part
! list_out += 2;
! //copyList (size, argv, list_out);
! if (mtx_minmax_obj->minmax_mode == row_sym) {
! rows_out = rows;
! columns_out = 1;
! if (mtx_minmax_obj->operator_minimum)
! minListRows (rows, columns, list_in, list_out);
! else
! maxListRows (rows, columns, list_in, list_out);
! }
! else if ((mtx_minmax_obj->minmax_mode == col_sym) ||
! (mtx_minmax_obj->minmax_mode == col_sym2)) {
! rows_out = 1;
! columns_out = columns;
! if (mtx_minmax_obj->operator_minimum)
! minListColumns (rows, columns, list_in, list_out);
! else
! maxListColumns (rows, columns, list_in, list_out);
! }
! else {
! columns_out = 1;
! rows_out = 1;
! if (mtx_minmax_obj->operator_minimum)
! minListRows (1, size, list_in, list_out);
! else
! maxListRows (1, size, list_in, list_out);
! }
! mtx_minmax_obj->outsize = columns_out * rows_out;
! list_out = mtx_minmax_obj->list_out;
! SETSYMBOL(list_out, gensym("matrix"));
! SETFLOAT(list_out, rows_out);
! SETFLOAT(&list_out[1], columns_out);
! outlet_anything(mtx_minmax_obj->list_outlet, gensym("matrix"),
! mtx_minmax_obj->outsize+2, list_out);
}
void mtx_minmax_setup (void)
{
! mtx_minmax_class = class_new
! (gensym("mtx_min"),
! (t_newmethod) newMTXMin,
! (t_method) deleteMTXMinMax,
! sizeof (MTXminmax),
! CLASS_DEFAULT, A_GIMME, 0);
! class_addbang (mtx_minmax_class, (t_method) mTXMinMaxBang);
! class_addmethod (mtx_minmax_class, (t_method) mTXMinMaxMatrix, gensym("matrix"), A_GIMME,0);
! // class_addmethod (mtx_minmax_class, (t_method) mTXSetMinMaxDimension, gensym("dimension"), A_DEFFLOAT,0);
! class_addmethod (mtx_minmax_class, (t_method) mTXSetMinMaxMode, gensym("mode"), A_DEFSYMBOL ,0);
! class_addcreator ((t_newmethod) newMTXMax, gensym("mtx_max"), A_GIMME,0);
! class_sethelpsymbol (mtx_minmax_class, gensym("iemmatrix/mtx_minmax"));
! row_sym = gensym("row");
! col_sym = gensym("col");
! col_sym2 = gensym("column");
}
--- 24,215 ----
struct _MTXminmax_
{
! t_object x_obj;
! int size;
! int outsize;
! int mode;
! int operator_minimum; // 1 if we are [mtx_min], 0 if we are [mtx_max]
! t_outlet *min_outlet;
! t_outlet *max_outlet;
! t_atom *minlist_out;
! t_atom *maxlist_out;
};
static void deleteMTXMinMax (MTXminmax *mtx_minmax_obj)
{
! if (mtx_minmax_obj->maxlist_out)
! freebytes (mtx_minmax_obj->maxlist_out, sizeof(t_atom)*(mtx_minmax_obj->size));
! if (mtx_minmax_obj->minlist_out)
! freebytes (mtx_minmax_obj->minlist_out, sizeof(t_atom)*(mtx_minmax_obj->size));
}
static void mTXSetMinMaxMode (MTXminmax *mtx_minmax_obj, t_symbol *m_sym)
{
! int mode=0;
! if(gensym("row")==m_sym)
! mode=1;
! else if((gensym("col")==m_sym) || (gensym("column")==m_sym) || (gensym(":")==m_sym))
! mode=2;
!
! mtx_minmax_obj->mode = mode;
}
! static void *newMTXMinMax (t_symbol *s)
{
! MTXminmax *mtx_minmax_obj = (MTXminmax *) pd_new (mtx_minmax_class);
! mtx_minmax_obj->mode=0;
! mtx_minmax_obj->operator_minimum = 1;
! mtx_minmax_obj->min_outlet = outlet_new (&mtx_minmax_obj->x_obj, gensym("matrix"));
! mtx_minmax_obj->max_outlet = outlet_new (&mtx_minmax_obj->x_obj, gensym("matrix"));
! if((NULL!=s)&&(&s_!=s)&&(NULL!=s->s_name))
! mTXSetMinMaxMode (mtx_minmax_obj, s);
!
! return ((void *) mtx_minmax_obj);
}
static void mTXMinMaxBang (MTXminmax *mtx_minmax_obj)
{
! if (mtx_minmax_obj->maxlist_out)
! outlet_list(mtx_minmax_obj->max_outlet, gensym("list"),
! mtx_minmax_obj->outsize, mtx_minmax_obj->maxlist_out);
! if (mtx_minmax_obj->minlist_out)
! outlet_list(mtx_minmax_obj->min_outlet, gensym("list"),
! mtx_minmax_obj->outsize, mtx_minmax_obj->minlist_out);
}
! static void minmaxList (int n, t_atom *x, t_float*min, t_float*max)
{
! t_float min_=atom_getfloat(x);
! t_float max_=min_;
! t_float f;
! for (;n--;x++) {
! f = atom_getfloat(x);
! min_ = (min_ < f)?min_:f;
! max_ = (max_ > f)?max_:f;
! }
! *max=max_;
! *min=min_;
}
! static void minmaxListStep (int n, const int step, t_atom *x, t_float*min, t_float*max)
{
! t_float min_=atom_getfloat(x);
! t_float max_=min_;
! t_float f;
! for (;n--;x+=step) {
! f = atom_getfloat(x);
! min_ = (min_ < f)?min_:f;
! max_ = (max_ > f)?max_:f;
! }
! *max=max_;
! *min=min_;
}
! static void minmaxListColumns (const int rows, const int columns, t_atom *x,
! t_atom *ap_min, t_atom *ap_max)
{
! int count;
! t_float min, max;
! for (count=0; count < columns; count++, x++, ap_min++, ap_max++) {
! minmaxListStep (rows, columns, x, &min, &max);
! SETFLOAT(ap_min,min);
! SETFLOAT(ap_max,max);
! }
}
! static void minmaxListRows (int rows, int columns, t_atom *x,
! t_atom *ap_min, t_atom*ap_max)
{
! int count;
! t_float min, max;
! for (count=0; count < rows; count++, x+=columns, ap_min++, ap_max++) {
! minmaxList (columns, x, &min, &max);
! SETFLOAT(ap_min, min);
! SETFLOAT(ap_max,max);
! }
}
static void mTXMinMaxMatrix (MTXminmax *mtx_minmax_obj, t_symbol *s,
! int argc, t_atom *argv)
{
! int rows = atom_getint (argv++);
! int columns = atom_getint (argv++);
! int size = rows * columns;
! t_atom *maxlist_out = mtx_minmax_obj->maxlist_out;
! t_atom *minlist_out = mtx_minmax_obj->minlist_out;
! int elements_out;
!
! // size check
! if (!size) {
! post("mtx_minmax: invalid dimensions");
! return;
! }
! else if ((argc-2)<size) {
! post("mtx_minmax: sparse matrix not yet supported: use \"mtx_check\"");
! return;
! }
! if (size != mtx_minmax_obj->size) {
! if (!minlist_out)
! minlist_out = (t_atom *) getbytes (sizeof (t_atom) * size);
! else
! minlist_out = (t_atom *) resizebytes (minlist_out,
! sizeof (t_atom) * (mtx_minmax_obj->size),
! sizeof (t_atom) * size);
! if (!maxlist_out)
! maxlist_out = (t_atom *) getbytes (sizeof (t_atom) * size);
! else
! maxlist_out = (t_atom *) resizebytes (maxlist_out,
! sizeof (t_atom) * (mtx_minmax_obj->size),
! sizeof (t_atom) * size);
! }
! mtx_minmax_obj->size = size;
! mtx_minmax_obj->minlist_out = minlist_out;
! mtx_minmax_obj->maxlist_out = maxlist_out;
!
! // main part
!
! switch(mtx_minmax_obj->mode){
! case 1:
! elements_out = rows;
! minmaxListRows (rows, columns, argv, minlist_out, maxlist_out);
! break;
! case 2:
! elements_out = columns;
! minmaxListColumns (rows, columns, argv, minlist_out, maxlist_out);
! break;
! default:
! elements_out = 1;
! minmaxListRows (1, size, argv, minlist_out, maxlist_out);
! }
! mtx_minmax_obj->outsize = elements_out;
! maxlist_out = mtx_minmax_obj->maxlist_out;
! minlist_out = mtx_minmax_obj->minlist_out;
!
! mTXMinMaxBang(mtx_minmax_obj);
}
void mtx_minmax_setup (void)
{
! mtx_minmax_class = class_new (
! gensym("mtx_minmax"),
! (t_newmethod) newMTXMinMax,
! (t_method) deleteMTXMinMax,
! sizeof (MTXminmax),
! CLASS_DEFAULT, A_DEFSYM, 0);
!
! class_addbang (mtx_minmax_class, (t_method) mTXMinMaxBang);
! class_addmethod (mtx_minmax_class, (t_method) mTXMinMaxMatrix, gensym("matrix"), A_GIMME,0);
! class_addmethod (mtx_minmax_class, (t_method) mTXSetMinMaxMode, gensym("mode"), A_DEFSYMBOL ,0);
!
! class_sethelpsymbol (mtx_minmax_class, gensym("iemmatrix/mtx_minmax"));
!
! row_sym = gensym("row");
! col_sym = gensym("col");
! col_sym2 = gensym("column");
}
More information about the Pd-cvs
mailing list