diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/accum~-help.pd | 42 | ||||
-rw-r--r-- | test/accum~.c | 239 | ||||
-rw-r--r-- | test/count.c | 145 | ||||
-rw-r--r-- | test/dial.c | 792 | ||||
-rw-r--r-- | test/frameaccum.c | 71 | ||||
-rw-r--r-- | test/from_ascii_code-help.pd | 19 | ||||
-rw-r--r-- | test/from_ascii_code.c | 111 | ||||
-rw-r--r-- | test/imagebutton.c | 415 | ||||
-rw-r--r-- | test/pak.c | 379 | ||||
-rw-r--r-- | test/test.c | 97 | ||||
-rw-r--r-- | test/to_ascii_code-help.pd | 13 | ||||
-rw-r--r-- | test/to_ascii_code.c | 97 | ||||
-rw-r--r-- | test/tokenArgs.c | 80 |
13 files changed, 1152 insertions, 1348 deletions
diff --git a/test/accum~-help.pd b/test/accum~-help.pd new file mode 100644 index 0000000..a6706d3 --- /dev/null +++ b/test/accum~-help.pd @@ -0,0 +1,42 @@ +#N canvas 1084 142 863 682 10; +#X obj 14 14 cnv 15 400 40 empty empty empty 20 12 0 14 -260097 -66577 +0; +#X msg 68 105 stop; +#X msg 40 78 bang; +#X floatatom 38 494 15 0 0 0 - - -; +#X text 152 492 samples counted; +#X floatatom 121 353 5 0 0 0 - - -; +#X floatatom 80 332 5 0 0 0 - - -; +#X obj 106 217 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 +1; +#X msg 106 242 autoreset \$1; +#X text 30 22 description: sample accumulator; +#X text 79 79 start accumulating; +#X text 131 218 reset accumulation to min if dsp is turned off and +on again; +#X obj 92 160 sig~ 1; +#X obj 38 464 cyclone/Snapshot~ 100; +#X obj 162 377 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 +1; +#X text 183 373 wrap to min/max; +#X floatatom 92 138 5 0 0 0 - - -; +#X text 107 106 stop \, and reset to min; +#X text 126 331 set a min value; +#X text 164 353 set a max value; +#X text 135 158 Accumulation amount; +#X text 173 401 arguments: min max wrap autoreset; +#X obj 435 15 loadbang; +#X msg 435 40 \; pd dsp 1; +#X obj 39 402 tof/accum~ 0 441000 1; +#X connect 1 0 24 0; +#X connect 2 0 24 0; +#X connect 5 0 24 2; +#X connect 6 0 24 1; +#X connect 7 0 8 0; +#X connect 8 0 24 0; +#X connect 12 0 24 0; +#X connect 13 0 3 0; +#X connect 14 0 24 3; +#X connect 16 0 12 0; +#X connect 22 0 23 0; +#X connect 24 0 13 0; diff --git a/test/accum~.c b/test/accum~.c new file mode 100644 index 0000000..487a54a --- /dev/null +++ b/test/accum~.c @@ -0,0 +1,239 @@ + + + +/* [accum~] by Thomas Ouellet Fredericks + * License: If you use and die, it's not my fault + * Based on [count~] (sickle/count.c) + * Copyright (c) 2002-2003 krzYszcz and others. + * For information on usage and redistribution, and for a DISCLAIMER OF ALL +*/ + +#include "m_pd.h" +#include <math.h> + +/* TODO +- Maybe add a pause? +*/ + +typedef struct _accum_tilde +{ + t_object x_obj; + t_float f; + t_float min; + t_float max; + int wrap; + //int limit; + int on; + int autoreset; + double count; +} t_accum_tilde; + +static t_class *accum_tilde_class; + +static void accum_tilde_wrap(t_accum_tilde *x, t_floatarg f) { + x->wrap = (f != 0); +} +/* +static void accum_tilde_set(t_accum_tilde *x, t_floatarg f1, t_floatarg f2) { + x->min=(f1<f2)?f1:f2; + x->max=(f1>f2)?f1:f2; + post(" min: %f \n max: %f",x->min,x->max); +} +*/ + +static void accum_tilde_min(t_accum_tilde *x, t_floatarg f) { + + x->min = f; + //accum_tilde_set(x,f,x->max); + +} + + +static void accum_tilde_max(t_accum_tilde *x, t_floatarg f) { + x->max = f; + //accum_tilde_set(x,x->min,f); + +} + +static void accum_tilde_autoreset(t_accum_tilde *x, t_floatarg f) +{ + x->autoreset = (f != 0); +} + +static void accum_tilde_bang(t_accum_tilde *x) +{ + x->count = x->min; + x->on = 1; +} + +/* +static void accum_tilde_float(t_accum_tilde *x, t_floatarg f) +{ + x->x_accum_tilde = x->x_min = (int)f; + x->x_on = 1; +} +*/ + +/* +static void accum_tilde_list(t_accum_tilde *x, t_symbol *s, int ac, t_atom *av) +{ + int i; + if (ac > 4) ac = 4; + for (i = 0; i < ac; i++) + if (av[i].a_type != A_FLOAT) break; + switch (i) + { + case 4: + count_autoreset(x, av[3].a_w.w_float); + case 3: + x->x_on = (av[2].a_w.w_float != 0); + case 2: + count_max(x, av[1].a_w.w_float); + case 1: + count_min(x, av[0].a_w.w_float); + default: + x->x_accum_tilde = x->x_min; + } +} +*/ +/* +static void accum_tilde_set(t_accum_tilde *x, t_symbol s, int ac, t_atom *av) +{ + if (av[0].a_type == A_FLOAT) count_min(x, av[0].a_w.w_float); + if (av[1].a_type == A_FLOAT) count_max(x, av[1].a_w.w_float); +} +*/ +static void accum_tilde_stop(t_accum_tilde *x) +{ + x->count = x->min; + x->on = 0; +} + +static t_int *accum_tilde_perform(t_int *w) { + // point to x + // point to number of samples + // point to inlet~ + // point to outlet~ + + t_accum_tilde *x = (t_accum_tilde *)(w[1]); + int nblock = (int)(w[2]); + t_float* in = (t_float *)(w[3]); + t_float* out = (t_float *)(w[4]); + double count = x->count; + + t_float min = (x->min < x->max)?x->min:x->max; + t_float max = (x->max > x->min)?x->max:x->min; + //post(" min: %f \n max: %f",min,max); + + + // Do not count if min == max + if ( min == max) { + count = min; + while (nblock--) *out++ = count; + } else { + if (x->on) { + if ( x->wrap ) { + // Possible wrapping + while (nblock--) { + count = count + *in; + in++; + if (count < min || count >= max) { + count = fmod((count - min),(max - min)); + if (count < 0) { + count = count + max ; + } else { + count = count + min; + } + } + *out++ = count; + } + } else { + // No wrapping + while (nblock--) { + count = count + *in; + in++; + *out++ = count; + } + } + } else { + /* WRAP EVEN IF NOT ACCUMULATING ? + if ( x->wrap && (count < min || count >= max)) { + count = fmod((count - min),(max - min)); + if (count < 0) { + count = count + max ; + } else { + count = count + min; + } + } + */ + while (nblock--) *out++ = count; + } + } + x->count = count; + + return (w + 5); +} + +static void accum_tilde_dsp(t_accum_tilde *x, t_signal **sp) { + if (x->autoreset) accum_tilde_bang(x); + // point to x + // point to number of samples + // point to inlet~ + // point to outlet~ + dsp_add(accum_tilde_perform, 4, x, sp[0]->s_n, sp[0]->s_vec,sp[1]->s_vec); +} + +static void *accum_tilde_new(t_floatarg minval, t_floatarg maxval, + t_floatarg wrapflag, t_floatarg autoflag) +{ + t_accum_tilde *x = (t_accum_tilde *)pd_new(accum_tilde_class); + + x->wrap = 0; + x->on = 0; + + accum_tilde_min(x, minval); + accum_tilde_max(x, maxval); + x->wrap = (wrapflag != 0); + accum_tilde_autoreset(x, autoflag); + x->count = x->min; + + + + //inlet_new((t_object *)x, &s_signal); + + inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("min")); + inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("max")); + inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("wrap")); + outlet_new((t_object *)x, &s_signal); + + return (x); +} + +void accum_tilde_setup(void) +{ + accum_tilde_class = class_new(gensym("accum~"), + (t_newmethod)accum_tilde_new, 0, + sizeof(t_accum_tilde), 0, + A_DEFFLOAT, A_DEFFLOAT, + A_DEFFLOAT, A_DEFFLOAT, 0); + + CLASS_MAINSIGNALIN(accum_tilde_class, t_accum_tilde, f); + class_addmethod(accum_tilde_class, (t_method)accum_tilde_dsp, gensym("dsp"), 0); + //sic_setup(count_class, count_dsp, SIC_NOMAINSIGNALIN); + class_addbang(accum_tilde_class, accum_tilde_bang); + //class_addfloat(accum_tilde_class, count_float); + //class_addlist(accum_tilde_class, count_list); + /*class_addmethod(count_class, (t_method)count_max, + gensym("ft1"), A_FLOAT, 0);*/ + + class_addmethod(accum_tilde_class, (t_method)accum_tilde_autoreset, + gensym("autoreset"), A_FLOAT, 0); + class_addmethod(accum_tilde_class, (t_method)accum_tilde_min, + gensym("min"), A_FLOAT, 0); + class_addmethod(accum_tilde_class, (t_method)accum_tilde_max, + gensym("max"), A_FLOAT, 0); + class_addmethod(accum_tilde_class, (t_method)accum_tilde_wrap, + gensym("wrap"), A_FLOAT, 0); + //class_addmethod(count_class, (t_method)count_set, gensym("set"), A_GIMME, 0); + class_addmethod(accum_tilde_class, (t_method)accum_tilde_stop, gensym("stop"), 0); +} diff --git a/test/count.c b/test/count.c new file mode 100644 index 0000000..b2ed2cd --- /dev/null +++ b/test/count.c @@ -0,0 +1,145 @@ +/* Copyright (c) 2002-2003 krzYszcz and others. + * For information on usage and redistribution, and for a DISCLAIMER OF ALL + * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */ + +#include "m_pd.h" +#include "sickle/sic.h" + +typedef struct _count +{ + t_sic x_sic; + int x_min; + int x_max; + int x_limit; + int x_on; + int x_autoreset; + int x_count; /* MAYBE use 64 bits (if 13.5 hours is not enough...) */ +} t_count; + +static t_class *count_class; + +static void count_min(t_count *x, t_floatarg f) +{ + x->x_min = (int)f; +} + +static void count_max(t_count *x, t_floatarg f) +{ + x->x_max = (int)f; + /* MAYBE use 64 bits */ + x->x_limit = (x->x_max == 0 ? 0x7fffffff + : x->x_max - 1); /* CHECKED */ +} + +static void count_autoreset(t_count *x, t_floatarg f) +{ + x->x_autoreset = (f != 0); +} + +static void count_bang(t_count *x) +{ + x->x_count = x->x_min; + x->x_on = 1; +} + +static void count_float(t_count *x, t_floatarg f) +{ + x->x_count = x->x_min = (int)f; + x->x_on = 1; +} + +static void count_list(t_count *x, t_symbol *s, int ac, t_atom *av) +{ + int i; + if (ac > 4) ac = 4; + for (i = 0; i < ac; i++) + if (av[i].a_type != A_FLOAT) break; + switch (i) + { + case 4: + count_autoreset(x, av[3].a_w.w_float); + case 3: + x->x_on = (av[2].a_w.w_float != 0); + case 2: + count_max(x, av[1].a_w.w_float); + case 1: + count_min(x, av[0].a_w.w_float); + default: + x->x_count = x->x_min; + } +} + +static void count_set(t_count *x, t_symbol s, int ac, t_atom *av) +{ + if (av[0].a_type == A_FLOAT) count_min(x, av[0].a_w.w_float); + if (av[1].a_type == A_FLOAT) count_max(x, av[1].a_w.w_float); +} + +static void count_stop(t_count *x) +{ + x->x_count = x->x_min; + x->x_on = 0; +} + +static t_int *count_perform(t_int *w) +{ + t_count *x = (t_count *)(w[1]); + int nblock = (int)(w[2]); + t_float *out = (t_float *)(w[3]); + int count = x->x_count; + int limit = x->x_limit; + if (x->x_on) + { + while (nblock--) + { + if (count > limit) count = x->x_min; + *out++ = (t_float)count++; + } + } + else + while (nblock--) *out++ = count; + x->x_count = count; + return (w + 4); +} + +static void count_dsp(t_count *x, t_signal **sp) +{ + if (x->x_autoreset) count_bang(x); + dsp_add(count_perform, 3, x, sp[0]->s_n, sp[0]->s_vec); +} + +static void *count_new(t_floatarg minval, t_floatarg maxval, + t_floatarg onflag, t_floatarg autoflag) +{ + t_count *x = (t_count *)pd_new(count_class); + count_min(x, minval); + count_max(x, maxval); + x->x_on = (onflag != 0); + count_autoreset(x, autoflag); + x->x_count = x->x_min; + inlet_new((t_object *)x, (t_pd *)x, &s_float, gensym("ft1")); + outlet_new((t_object *)x, &s_signal); + return (x); +} + +void count_tilde_setup(void) +{ + count_class = class_new(gensym("count~"), + (t_newmethod)count_new, 0, + sizeof(t_count), 0, + A_DEFFLOAT, A_DEFFLOAT, + A_DEFFLOAT, A_DEFFLOAT, 0); + sic_setup(count_class, count_dsp, SIC_NOMAINSIGNALIN); + class_addbang(count_class, count_bang); + class_addfloat(count_class, count_float); + class_addlist(count_class, count_list); + class_addmethod(count_class, (t_method)count_max, + gensym("ft1"), A_FLOAT, 0); + class_addmethod(count_class, (t_method)count_autoreset, + gensym("autoreset"), A_FLOAT, 0); + class_addmethod(count_class, (t_method)count_min, + gensym("min"), A_FLOAT, 0); + class_addmethod(count_class, (t_method)count_set, + gensym("set"), A_GIMME, 0); + class_addmethod(count_class, (t_method)count_stop, gensym("stop"), 0); +} diff --git a/test/dial.c b/test/dial.c deleted file mode 100644 index ff5045f..0000000 --- a/test/dial.c +++ /dev/null @@ -1,792 +0,0 @@ -/* Copyright (c) 1997-1999 Miller Puckette. - * For information on usage and redistribution, and for a DISCLAIMER OF ALL - * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */ - -/* g_7_guis.c written by Thomas Musil (c) IEM KUG Graz Austria 2000-2001 */ -/* thanks to Miller Puckette, Guenther Geiger and Krzystof Czaja */ - -/* 'dial' gui object by Frank Barknecht, 'externalised' by Olaf Matthes */ -/* changed for devel_0.37 by Christoph Kummerer - hardly tested */ - -/* I had to out-comment the loadbang stuff because I couldn't find the code - in Pd where it is declared */ - - -#include <stdlib.h> -#include <string.h> -#include <stdio.h> -#include <ctype.h> -#include "m_pd.h" - -#ifndef PD_MAJOR_VERSION -#include "s_stuff.h" -#else -#include "m_imp.h" -#endif - -#include "g_canvas.h" - -#include "g_all_guis.h" -#include <math.h> - -#ifdef WIN32 -#include <io.h> -#else -#include <unistd.h> -#endif - -#ifndef M_PI -#define M_PI 3.141592654 -#endif - -#define IEM_dial_DEFAULTSIZE 32 - -/* ------------ dial gui-vertical slider ----------------------- */ - -t_widgetbehavior dial_widgetbehavior; -static t_class *dial_class; -t_symbol *iemgui_key_sym=0; /* taken from g_all_guis.c */ - -typedef struct _dial /* taken from Frank's modyfied g_all_guis.h */ -{ - t_iemgui x_gui; - int x_pos; - int x_val; - int x_lin0_log1; - int x_steady; - double x_min; - double x_max; - double x_k; -} t_dial; - -/* widget helper functions */ - -static void dial_draw_update(t_dial *x, t_glist *glist) -{ - if (glist_isvisible(glist)) - { - /* compute dial:*/ - float radius = 0.5*(float)x->x_gui.x_h; - double angle = 7.0/36.0 + 34.0/36.0*2.0*M_PI*( (double)x->x_val*0.01/(double)x->x_gui.x_h ); - int start = -80; - int extent = 350 - (int)(360.0*angle/(2.0*M_PI)); - /* center point: */ - int x1 = text_xpix(&x->x_gui.x_obj, glist) + radius; - int y1 = text_ypix(&x->x_gui.x_obj, glist) + radius; - int x2 = text_xpix(&x->x_gui.x_obj, glist) + radius + radius * sin( -angle); - int y2 = text_ypix(&x->x_gui.x_obj, glist) + radius + radius * cos( angle); - - sys_vgui(".x%x.c coords %xdial %d %d %d %d\n", - glist_getcanvas(glist), x, - x1, /* x1 */ - y1, /* y1 */ - x2, /* x2 */ - y2 /* y2 */ - ); - - /* post("dial: (%d, %d) (%d, %d)", x1,y1,x2,y2); */ - - sys_vgui(".x%x.c itemconfigure %xBASE -start %d -extent %d \n", glist_getcanvas(glist), x, - start, extent); - } -} - -static void dial_draw_new(t_dial *x, t_glist *glist) -{ - int xpos=text_xpix(&x->x_gui.x_obj, glist); - int ypos=text_ypix(&x->x_gui.x_obj, glist); - /* int r = ypos + x->x_gui.x_h - (x->x_val + 50)/100; */ - t_canvas *canvas=glist_getcanvas(glist); - - /* compute dial:*/ - float radius = 0.5*(float)x->x_gui.x_h; - /* center point: */ - int x1 = xpos + radius; - int y1 = ypos + radius; - /* dial */ - double angle = 7.0/36.0 + 34.0/36.0*2.0*M_PI*((float)x->x_val*0.01/(float)(x->x_gui.x_h)); - int x2 = x1 + radius * sin(-angle); - int y2 = y1 + radius * cos(angle); - - - /* BASE2 */ - sys_vgui(".x%x.c create arc %d %d %d %d -outline #%6.6x -style arc -width 3 -start -80 -extent 340 -tags %xBASE2\n", - canvas, - xpos, ypos, /* upper left */ - xpos + x->x_gui.x_h, ypos + x->x_gui.x_h, /* lower right */ - x->x_gui.x_fcol, x); - - /* BASE */ - sys_vgui(".x%x.c create arc %d %d %d %d -fill #%6.6x -style arc -width 3 -start -80 -extent 340 -tags %xBASE\n", - canvas, - xpos, ypos, /* upper left */ - xpos + x->x_gui.x_h, ypos + x->x_gui.x_h, /* lower right */ - x->x_gui.x_bcol, x); - /* LINE */ - sys_vgui(".x%x.c create line %d %d %d %d -width 3 -fill #%6.6x -capstyle round -tags %xdial\n", - canvas, - x1, /* x1 */ - y1, /* y1 */ - x2, /* x2 */ - y2, /* y2 */ - x->x_gui.x_fcol, /* color */ - x); - - sys_vgui(".x%x.c create text %d %d -text {%s} -anchor w \ - -font {%s %d bold} -fill #%6.6x -tags %xLABEL\n", - canvas, xpos+x->x_gui.x_ldx, ypos+x->x_gui.x_ldy, - strcmp(x->x_gui.x_lab->s_name, "empty")?x->x_gui.x_lab->s_name:"", - x->x_gui.x_font, x->x_gui.x_fontsize, x->x_gui.x_lcol, x); - if(!x->x_gui.x_fsf.x_snd_able) - sys_vgui(".x%x.c create rectangle %d %d %d %d -tags %xOUT%d\n", - canvas, - xpos, ypos + x->x_gui.x_h+2, - xpos+7, ypos + x->x_gui.x_h+3, - x, 0); - if(!x->x_gui.x_fsf.x_rcv_able) - sys_vgui(".x%x.c create rectangle %d %d %d %d -tags %xIN%d\n", - canvas, - xpos, ypos-2, - xpos+7, ypos-1, - x, 0); -} - -static void dial_draw_move(t_dial *x, t_glist *glist) -{ - int xpos=text_xpix(&x->x_gui.x_obj, glist); - int ypos=text_ypix(&x->x_gui.x_obj, glist); - /* int r = ypos + x->x_gui.x_h - (x->x_val + 50)/100; */ - t_canvas *canvas=glist_getcanvas(glist); - /* compute dial:*/ - float radius = 0.5*(float)x->x_gui.x_h; - /* float angle = 7.0/36.0 + 34.0/36.0*2.0*M_PI*((float)x->x_val*0.01/(float)(x->x_gui.x_h)); */ - double angle = 7.0/36.0 + 34.0/36.0*2.0*M_PI*( (double)x->x_val*0.01/(double)x->x_gui.x_h ); - /* center point: */ - int x1 = text_xpix(&x->x_gui.x_obj, glist) + radius; - int y1 = text_ypix(&x->x_gui.x_obj, glist) + radius; - int x2 = text_xpix(&x->x_gui.x_obj, glist) + radius + radius * sin( -angle); - int y2 = text_ypix(&x->x_gui.x_obj, glist) + radius + radius * cos( angle); - - - - sys_vgui(".x%x.c coords %xdial %d %d %d %d\n", - canvas, x, - x1, /* x1 */ - y1, /* y1 */ - x2, /* x2 */ - y2 /* y2 */ - ); - /* post("dial: (%d, %d) (%d, %d)", x1,y1,x2,y2); */ - - sys_vgui(".x%x.c coords %xBASE %d %d %d %d\n", - canvas, x, - xpos, ypos, - xpos + x->x_gui.x_h, ypos + x->x_gui.x_h); - - sys_vgui(".x%x.c coords %xBASE2 %d %d %d %d\n", - canvas, x, - xpos, ypos, - xpos + x->x_gui.x_h, ypos + x->x_gui.x_h); - - sys_vgui(".x%x.c coords %xLABEL %d %d\n", - canvas, x, xpos+x->x_gui.x_ldx, ypos+x->x_gui.x_ldy); - if(!x->x_gui.x_fsf.x_snd_able) - sys_vgui(".x%x.c coords %xOUT%d %d %d %d %d\n", - canvas, x, 0, - xpos, ypos + x->x_gui.x_h+2, - xpos+7, ypos + x->x_gui.x_h+3); - if(!x->x_gui.x_fsf.x_rcv_able) - sys_vgui(".x%x.c coords %xIN%d %d %d %d %d\n", - canvas, x, 0, - xpos, ypos-2, - xpos+7, ypos-1); -} - -static void dial_draw_erase(t_dial* x,t_glist* glist) -{ - t_canvas *canvas=glist_getcanvas(glist); - - sys_vgui(".x%x.c delete %xBASE\n", canvas, x); - sys_vgui(".x%x.c delete %xBASE2\n", canvas, x); - sys_vgui(".x%x.c delete %xdial\n", canvas, x); - sys_vgui(".x%x.c delete %xLABEL\n", canvas, x); - if(!x->x_gui.x_fsf.x_snd_able) - sys_vgui(".x%x.c delete %xOUT%d\n", canvas, x, 0); - if(!x->x_gui.x_fsf.x_rcv_able) - sys_vgui(".x%x.c delete %xIN%d\n", canvas, x, 0); -} - -static void dial_draw_config(t_dial* x,t_glist* glist) -{ - t_canvas *canvas=glist_getcanvas(glist); - - sys_vgui(".x%x.c itemconfigure %xLABEL -font {%s %d bold} -fill #%6.6x -text {%s} \n", - canvas, x, x->x_gui.x_font, x->x_gui.x_fontsize, - x->x_gui.x_fsf.x_selected?IEM_GUI_COLOR_SELECTED:x->x_gui.x_lcol, - strcmp(x->x_gui.x_lab->s_name, "empty")?x->x_gui.x_lab->s_name:""); - sys_vgui(".x%x.c itemconfigure %xdial -fill #%6.6x\n", canvas, - x, x->x_gui.x_fcol); - sys_vgui(".x%x.c itemconfigure %xBASE2 -outline #%6.6x\n", canvas, - x, x->x_gui.x_fcol); - sys_vgui(".x%x.c itemconfigure %xBASE -fill #%6.6x\n", canvas, - x, x->x_gui.x_bcol); -} - -static void dial_draw_io(t_dial* x,t_glist* glist, int old_snd_rcv_flags) -{ - int xpos=text_xpix(&x->x_gui.x_obj, glist); - int ypos=text_ypix(&x->x_gui.x_obj, glist); - t_canvas *canvas=glist_getcanvas(glist); - - if((old_snd_rcv_flags & IEM_GUI_OLD_SND_FLAG) && !x->x_gui.x_fsf.x_snd_able) - sys_vgui(".x%x.c create rectangle %d %d %d %d -tags %xOUT%d\n", - canvas, - xpos, ypos + x->x_gui.x_h+2, - xpos+7, ypos + x->x_gui.x_h+3, - x, 0); - if(!(old_snd_rcv_flags & IEM_GUI_OLD_SND_FLAG) && x->x_gui.x_fsf.x_snd_able) - sys_vgui(".x%x.c delete %xOUT%d\n", canvas, x, 0); - if((old_snd_rcv_flags & IEM_GUI_OLD_RCV_FLAG) && !x->x_gui.x_fsf.x_rcv_able) - sys_vgui(".x%x.c create rectangle %d %d %d %d -tags %xIN%d\n", - canvas, - xpos, ypos-2, - xpos+7, ypos-1, - x, 0); - if(!(old_snd_rcv_flags & IEM_GUI_OLD_RCV_FLAG) && x->x_gui.x_fsf.x_rcv_able) - sys_vgui(".x%x.c delete %xIN%d\n", canvas, x, 0); -} - -static void dial_draw_select(t_dial *x, t_glist *glist) -{ - t_canvas *canvas=glist_getcanvas(glist); - - if(x->x_gui.x_fsf.x_selected) - { - pd_bind(&x->x_gui.x_obj.ob_pd, iemgui_key_sym); - sys_vgui(".x%x.c itemconfigure %xBASE2 -outline #%6.6x\n", canvas, x, IEM_GUI_COLOR_SELECTED); - sys_vgui(".x%x.c itemconfigure %xBASE -fill #%6.6x\n", canvas, x, IEM_GUI_COLOR_SELECTED); - sys_vgui(".x%x.c itemconfigure %xLABEL -fill #%6.6x\n", canvas, x, IEM_GUI_COLOR_SELECTED); - } - else - { - pd_unbind(&x->x_gui.x_obj.ob_pd, iemgui_key_sym); - sys_vgui(".x%x.c itemconfigure %xBASE -fill #%6.6x\n", canvas, x, IEM_GUI_COLOR_NORMAL); - sys_vgui(".x%x.c itemconfigure %xBASE2 -outline #%6.6x\n", canvas, x, x->x_gui.x_fcol); - sys_vgui(".x%x.c itemconfigure %xLABEL -fill #%6.6x\n", canvas, x, x->x_gui.x_lcol); - } -} - -void dial_draw(t_dial *x, t_glist *glist, int mode) -{ - if(mode == IEM_GUI_DRAW_MODE_UPDATE) - dial_draw_update(x, glist); - else if(mode == IEM_GUI_DRAW_MODE_MOVE) - dial_draw_move(x, glist); - else if(mode == IEM_GUI_DRAW_MODE_NEW) - dial_draw_new(x, glist); - else if(mode == IEM_GUI_DRAW_MODE_SELECT) - dial_draw_select(x, glist); - else if(mode == IEM_GUI_DRAW_MODE_ERASE) - dial_draw_erase(x, glist); - else if(mode == IEM_GUI_DRAW_MODE_CONFIG) - dial_draw_config(x, glist); - else if(mode >= IEM_GUI_DRAW_MODE_IO) - dial_draw_io(x, glist, mode - IEM_GUI_DRAW_MODE_IO); -} - -/* ------------------------ dial widgetbehaviour----------------------------- */ - - -static void dial_getrect(t_gobj *z, t_glist *glist, - int *xp1, int *yp1, int *xp2, int *yp2) -{ - t_dial* x = (t_dial*)z; - - *xp1 = text_xpix(&x->x_gui.x_obj, glist); - *yp1 = text_ypix(&x->x_gui.x_obj, glist) - 2; - *xp2 = *xp1 + x->x_gui.x_h; - *yp2 = *yp1 + x->x_gui.x_h + 5; -} - -static void dial_save(t_gobj *z, t_binbuf *b) -{ - t_dial *x = (t_dial *)z; - int bflcol[3], *ip1, *ip2; - t_symbol *srl[3]; - - iemgui_save(&x->x_gui, srl, bflcol); - ip1 = (int *)(&x->x_gui.x_isa); - ip2 = (int *)(&x->x_gui.x_fsf); - binbuf_addv(b, "ssiisiiffiisssiiiiiiiii", gensym("#X"),gensym("obj"), - (t_int)x->x_gui.x_obj.te_xpix, (t_int)x->x_gui.x_obj.te_ypix, - atom_getsymbol(binbuf_getvec(x->x_gui.x_obj.te_binbuf)), - x->x_gui.x_h, x->x_gui.x_h, - (float)x->x_min, (float)x->x_max, - x->x_lin0_log1, (*ip1)&IEM_INIT_ARGS_ALL, - srl[0], srl[1], srl[2], - x->x_gui.x_ldx, x->x_gui.x_ldy, - (*ip2)&IEM_FSTYLE_FLAGS_ALL, x->x_gui.x_fontsize, - bflcol[0], bflcol[1], bflcol[2], - x->x_val, x->x_steady); - binbuf_addv(b, ";"); -} - -void dial_check_height(t_dial *x, int h) -{ - if(h < IEM_SL_MINSIZE) - h = IEM_SL_MINSIZE; - x->x_gui.x_h = h; - if(x->x_val > (x->x_gui.x_h*100 - 100)) - { - x->x_pos = x->x_gui.x_h*100 - 100; - x->x_val = x->x_pos; - } - if(x->x_lin0_log1) - x->x_k = log(x->x_max/x->x_min)/(double)(x->x_gui.x_h - 1); - else - x->x_k = (x->x_max - x->x_min)/(double)(x->x_gui.x_h - 1); -} - -void dial_check_minmax(t_dial *x, double min, double max) -{ - if(x->x_lin0_log1) - { - if((min == 0.0)&&(max == 0.0)) - max = 1.0; - if(max > 0.0) - { - if(min <= 0.0) - min = 0.01*max; - } - else - { - if(min > 0.0) - max = 0.01*min; - } - } - x->x_min = min; - x->x_max = max; - if(x->x_min > x->x_max) /* bugfix */ - x->x_gui.x_isa.x_reverse = 1; - else - x->x_gui.x_isa.x_reverse = 0; - if(x->x_lin0_log1) - x->x_k = log(x->x_max/x->x_min)/(double)(x->x_gui.x_h - 1); - else - x->x_k = (x->x_max - x->x_min)/(double)(x->x_gui.x_h - 1); -} - -static void dial_properties(t_gobj *z, t_glist *owner) -{ - t_dial *x = (t_dial *)z; - char buf[800]; - t_symbol *srl[3]; - - iemgui_properties(&x->x_gui, srl); - - sprintf(buf, "pdtk_iemgui_dialog %%s dial \ - --------dimensions(pix)(pix):-------- %d %d NONE: %d %d height: \ - -----------output-range:----------- %g left: %g right: %g \ - %d lin log %d %d empty %d \ - %s %s \ - %s %d %d \ - %d %d \ - %d %d %d\n", - x->x_gui.x_w, IEM_SL_MINSIZE, x->x_gui.x_h, IEM_GUI_MINSIZE, - x->x_min, x->x_max, 0.0,/*no_schedule*/ - x->x_lin0_log1, x->x_gui.x_isa.x_loadinit, x->x_steady, -1,/*no multi, but iem-characteristic*/ - srl[0]->s_name, srl[1]->s_name, - srl[2]->s_name, x->x_gui.x_ldx, x->x_gui.x_ldy, - x->x_gui.x_fsf.x_font_style, x->x_gui.x_fontsize, - 0xffffff & x->x_gui.x_bcol, 0xffffff & x->x_gui.x_fcol, 0xffffff & x->x_gui.x_lcol); - gfxstub_new(&x->x_gui.x_obj.ob_pd, x, buf); -} - -static void dial_bang(t_dial *x) -{ - double out; - - if(x->x_lin0_log1) - out = x->x_min*exp(x->x_k*(double)(x->x_val)*0.01); - else - out = (double)(x->x_val)*0.01*x->x_k + x->x_min; - if((out < 1.0e-10)&&(out > -1.0e-10)) - out = 0.0; - //post("dial_bang -- x_k: %f", x->x_k); - - outlet_float(x->x_gui.x_obj.ob_outlet, out); - if(x->x_gui.x_fsf.x_snd_able && x->x_gui.x_snd->s_thing) - pd_float(x->x_gui.x_snd->s_thing, out); -} - -static void dial_dialog(t_dial *x, t_symbol *s, int argc, t_atom *argv) -{ - t_symbol *srl[3]; - int w = (int)atom_getintarg(0, argc, argv); - int h = (int)atom_getintarg(1, argc, argv); - double min = (double)atom_getfloatarg(2, argc, argv); - double max = (double)atom_getfloatarg(3, argc, argv); - int lilo = (int)atom_getintarg(4, argc, argv); - int steady = (int)atom_getintarg(17, argc, argv); - int sr_flags; - - if(lilo != 0) lilo = 1; - x->x_lin0_log1 = lilo; - if(steady) - x->x_steady = 1; - else - x->x_steady = 0; - sr_flags = iemgui_dialog(&x->x_gui, srl, argc, argv); - x->x_gui.x_h = iemgui_clip_size(w); - dial_check_height(x, h); - dial_check_minmax(x, min, max); - (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_CONFIG); - (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_IO + sr_flags); - (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_MOVE); - canvas_fixlinesfor(glist_getcanvas(x->x_gui.x_glist), (t_text*)x); -} - -static void dial_motion(t_dial *x, t_floatarg dx, t_floatarg dy) -{ - int old = x->x_val; - - if(x->x_gui.x_fsf.x_finemoved) - x->x_pos -= (int)dy; - else - x->x_pos -= 100*(int)dy; - x->x_val = x->x_pos; - if(x->x_val > (100*x->x_gui.x_h - 100)) - { - x->x_val = 100*x->x_gui.x_h - 100; - x->x_pos += 50; - x->x_pos -= x->x_pos%100; - } - if(x->x_val < 0) - { - x->x_val = 0; - x->x_pos -= 50; - x->x_pos -= x->x_pos%100; - } - if(old != x->x_val) - { - (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE); - dial_bang(x); - } -} - -static void dial_click(t_dial *x, t_floatarg xpos, t_floatarg ypos, - t_floatarg shift, t_floatarg ctrl, t_floatarg alt) -{ - if(!x->x_steady) - x->x_val = (int)(100.0 * (x->x_gui.x_h + text_ypix(&x->x_gui.x_obj, x->x_gui.x_glist) - ypos)); - if(x->x_val > (100*x->x_gui.x_h - 100)) - x->x_val = 100*x->x_gui.x_h - 100; - if(x->x_val < 0) - x->x_val = 0; - x->x_pos = x->x_val; - (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE); - dial_bang(x); - glist_grab(x->x_gui.x_glist, &x->x_gui.x_obj.te_g, (t_glistmotionfn)dial_motion, - 0, xpos, ypos); -} - -static int dial_newclick(t_gobj *z, struct _glist *glist, - int xpix, int ypix, int shift, int alt, int dbl, int doit) -{ - t_dial* x = (t_dial *)z; - - if(doit) - { - dial_click( x, (t_floatarg)xpix, (t_floatarg)ypix, (t_floatarg)shift, - 0, (t_floatarg)alt); - if(shift) - x->x_gui.x_fsf.x_finemoved = 1; - else - x->x_gui.x_fsf.x_finemoved = 0; - } - return (1); -} - -static void dial_set(t_dial *x, t_floatarg f) -{ - double g; - - if(x->x_gui.x_isa.x_reverse) /* bugfix */ - { - if(f > x->x_min) - f = x->x_min; - if(f < x->x_max) - f = x->x_max; - } - else - { - if(f > x->x_max) - f = x->x_max; - if(f < x->x_min) - f = x->x_min; - } - if(x->x_lin0_log1) - g = log(f/x->x_min)/x->x_k; - else - g = (f - x->x_min) / x->x_k; - //post("dial_set f: %f", f ); - //post("dial_set g: %f", g ); - x->x_val = (int)(100.0*g + 0.49999); - // x->x_val = (int)(100.0*g); - x->x_pos = x->x_val; - //post("dial_set x_val: %f", x->x_val ); - (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE); -} - -static void dial_float(t_dial *x, t_floatarg f) -{ - /* post("dial_set infloat f: %f", f ); */ - dial_set(x, f); - if(x->x_gui.x_fsf.x_put_in2out) - dial_bang(x); -} - -static void dial_size(t_dial *x, t_symbol *s, int ac, t_atom *av) -{ - x->x_gui.x_h = iemgui_clip_size((int)atom_getintarg(0, ac, av)); - if(ac > 1) - dial_check_height(x, (int)atom_getintarg(1, ac, av)); - iemgui_size((void *)x, &x->x_gui); -} - -static void dial_delta(t_dial *x, t_symbol *s, int ac, t_atom *av) -{iemgui_delta((void *)x, &x->x_gui, s, ac, av);} - -static void dial_pos(t_dial *x, t_symbol *s, int ac, t_atom *av) -{iemgui_pos((void *)x, &x->x_gui, s, ac, av);} - -static void dial_range(t_dial *x, t_symbol *s, int ac, t_atom *av) -{ - dial_check_minmax(x, (double)atom_getfloatarg(0, ac, av), - (double)atom_getfloatarg(1, ac, av)); -} - -static void dial_color(t_dial *x, t_symbol *s, int ac, t_atom *av) -{iemgui_color((void *)x, &x->x_gui, s, ac, av);} - -static void dial_send(t_dial *x, t_symbol *s) -{iemgui_send(x, &x->x_gui, s);} - -static void dial_receive(t_dial *x, t_symbol *s) -{iemgui_receive(x, &x->x_gui, s);} - -static void dial_label(t_dial *x, t_symbol *s) -{iemgui_label((void *)x, &x->x_gui, s);} - -static void dial_label_pos(t_dial *x, t_symbol *s, int ac, t_atom *av) -{iemgui_label_pos((void *)x, &x->x_gui, s, ac, av);} - -static void dial_label_font(t_dial *x, t_symbol *s, int ac, t_atom *av) -{iemgui_label_font((void *)x, &x->x_gui, s, ac, av);} - -static void dial_log(t_dial *x) -{ - x->x_lin0_log1 = 1; - dial_check_minmax(x, x->x_min, x->x_max); -} - -static void dial_lin(t_dial *x) -{ - x->x_lin0_log1 = 0; - x->x_k = (x->x_max - x->x_min)/(double)(x->x_gui.x_h - 1); -} - -static void dial_init(t_dial *x, t_floatarg f) -{ - x->x_gui.x_isa.x_loadinit = (f==0.0)?0:1; -} - -static void dial_steady(t_dial *x, t_floatarg f) -{ - x->x_steady = (f==0.0)?0:1; -} - -static void dial_loadbang(t_dial *x) -{ - /* WARNING: this is a kludge to get this object building on - Windows. Currently, the linker fails on the symbol - "sys_noloadbang". <hans@at.or.at> - */ -#ifdef _WIN32 - if(x->x_gui.x_isa.x_loadinit) -#else - if(!sys_noloadbang && x->x_gui.x_isa.x_loadinit) -#endif - { - (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE); - dial_bang(x); - } -} - -/* -static void dial_list(t_dial *x, t_symbol *s, int ac, t_atom *av) -{ - int l=iemgui_list((void *)x, &x->x_gui, s, ac, av); - - if(l < 0) - { - if(IS_A_FLOAT(av,0)) - dial_float(x, atom_getfloatarg(0, ac, av)); - } - else if(l > 0) - { - (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_MOVE); - canvas_fixlinesfor(glist_getcanvas(x->x_gui.x_glist), (t_text*)x); - } -} -*/ - -static void *dial_new(t_symbol *s, int argc, t_atom *argv) -{ - t_dial *x = (t_dial *)pd_new(dial_class); - int bflcol[]={-262144, -1, -1}; - t_symbol *srl[3]; - int w=IEM_dial_DEFAULTSIZE, h=IEM_dial_DEFAULTSIZE; - int lilo=0, ldx=0, ldy=-8; - int fs=8, v=0, steady=1; - double min=0.0, max=(double)(IEM_SL_DEFAULTSIZE-1); - char str[144]; - - //srl[0] = gensym("empty"); - //srl[1] = gensym("empty"); - //srl[2] = gensym("empty"); - - iem_inttosymargs(&x->x_gui.x_isa, 0); - iem_inttofstyle(&x->x_gui.x_fsf, 0); - - - if(((argc == 17)||(argc == 18))&&IS_A_FLOAT(argv,0)&&IS_A_FLOAT(argv,1) - &&IS_A_FLOAT(argv,2)&&IS_A_FLOAT(argv,3) - &&IS_A_FLOAT(argv,4)&&IS_A_FLOAT(argv,5) - &&(IS_A_SYMBOL(argv,6)||IS_A_FLOAT(argv,6)) - &&(IS_A_SYMBOL(argv,7)||IS_A_FLOAT(argv,7)) - &&(IS_A_SYMBOL(argv,8)||IS_A_FLOAT(argv,8)) - &&IS_A_FLOAT(argv,9)&&IS_A_FLOAT(argv,10) - &&IS_A_FLOAT(argv,11)&&IS_A_FLOAT(argv,12)&&IS_A_FLOAT(argv,13) - &&IS_A_FLOAT(argv,14)&&IS_A_FLOAT(argv,15)&&IS_A_FLOAT(argv,16)) - { - w = (int)atom_getintarg(0, argc, argv); - h = (int)atom_getintarg(1, argc, argv); - min = (double)atom_getfloatarg(2, argc, argv); - max = (double)atom_getfloatarg(3, argc, argv); - lilo = (int)atom_getintarg(4, argc, argv); - iem_inttosymargs(&x->x_gui.x_isa, atom_getintarg(5, argc, argv)); - iemgui_new_getnames(&x->x_gui, 6, argv); - ldx = (int)atom_getintarg(9, argc, argv); - ldy = (int)atom_getintarg(10, argc, argv); - iem_inttofstyle(&x->x_gui.x_fsf, atom_getintarg(11, argc, argv)); - fs = (int)atom_getintarg(12, argc, argv); - bflcol[0] = (int)atom_getintarg(13, argc, argv); - bflcol[1] = (int)atom_getintarg(14, argc, argv); - bflcol[2] = (int)atom_getintarg(15, argc, argv); - v = (int)atom_getintarg(16, argc, argv); - } - else iemgui_new_getnames(&x->x_gui, 6, 0); - if((argc == 18)&&IS_A_FLOAT(argv,17)) - steady = (int)atom_getintarg(17, argc, argv); - - x->x_gui.x_draw = (t_iemfunptr)dial_draw; - - x->x_gui.x_fsf.x_snd_able = 1; - x->x_gui.x_fsf.x_rcv_able = 1; - - x->x_gui.x_glist = (t_glist *)canvas_getcurrent(); - if(x->x_gui.x_isa.x_loadinit) - x->x_val = v; - else - x->x_val = 0; - x->x_pos = x->x_val; - if(lilo != 0) lilo = 1; - x->x_lin0_log1 = lilo; - if(steady != 0) steady = 1; - x->x_steady = steady; - if (!strcmp(x->x_gui.x_snd->s_name, "empty")) - x->x_gui.x_fsf.x_snd_able = 0; - if (!strcmp(x->x_gui.x_rcv->s_name, "empty")) - x->x_gui.x_fsf.x_rcv_able = 0; - if(x->x_gui.x_fsf.x_font_style == 1) strcpy(x->x_gui.x_font, "helvetica"); - else if(x->x_gui.x_fsf.x_font_style == 2) strcpy(x->x_gui.x_font, "times"); - else { x->x_gui.x_fsf.x_font_style = 0; - strcpy(x->x_gui.x_font, "courier"); } - if(x->x_gui.x_fsf.x_rcv_able) - pd_bind(&x->x_gui.x_obj.ob_pd, x->x_gui.x_rcv); - x->x_gui.x_ldx = ldx; - x->x_gui.x_ldy = ldy; - if(fs < 4) - fs = 4; - x->x_gui.x_fontsize = fs; - x->x_gui.x_h = iemgui_clip_size(h); - dial_check_height(x, w); - dial_check_minmax(x, min, max); - iemgui_all_colfromload(&x->x_gui, bflcol); - //x->x_thick = 0; - iemgui_verify_snd_ne_rcv(&x->x_gui); - outlet_new(&x->x_gui.x_obj, &s_float); - return (x); -} - - - -static void dial_free(t_dial *x) -{ - if(x->x_gui.x_fsf.x_selected) - pd_unbind(&x->x_gui.x_obj.ob_pd, iemgui_key_sym); - if(x->x_gui.x_fsf.x_rcv_able) - pd_unbind(&x->x_gui.x_obj.ob_pd, x->x_gui.x_rcv); - gfxstub_deleteforkey(x); -} - -void dial_setup(void) -{ - dial_class = class_new(gensym("dial"), (t_newmethod)dial_new, - (t_method)dial_free, sizeof(t_dial), 0, A_GIMME, 0); - class_addcreator((t_newmethod)dial_new, gensym("dial"), A_GIMME, 0); - class_addbang(dial_class,dial_bang); - class_addfloat(dial_class,dial_float); - - /* class_addlist(dial_class, dial_list); */ - class_addmethod(dial_class, (t_method)dial_click, gensym("click"), - A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, 0); - class_addmethod(dial_class, (t_method)dial_motion, gensym("motion"), - A_FLOAT, A_FLOAT, 0); - class_addmethod(dial_class, (t_method)dial_dialog, gensym("dialog"), - A_GIMME, 0); - class_addmethod(dial_class, (t_method)dial_loadbang, gensym("loadbang"), 0); - class_addmethod(dial_class, (t_method)dial_set, gensym("set"), A_FLOAT, 0); - class_addmethod(dial_class, (t_method)dial_size, gensym("size"), A_GIMME, 0); - class_addmethod(dial_class, (t_method)dial_delta, gensym("delta"), A_GIMME, 0); - class_addmethod(dial_class, (t_method)dial_pos, gensym("pos"), A_GIMME, 0); - class_addmethod(dial_class, (t_method)dial_range, gensym("range"), A_GIMME, 0); - class_addmethod(dial_class, (t_method)dial_color, gensym("color"), A_GIMME, 0); - class_addmethod(dial_class, (t_method)dial_send, gensym("send"), A_DEFSYM, 0); - class_addmethod(dial_class, (t_method)dial_receive, gensym("receive"), A_DEFSYM, 0); - class_addmethod(dial_class, (t_method)dial_label, gensym("label"), A_DEFSYM, 0); - class_addmethod(dial_class, (t_method)dial_label_pos, gensym("label_pos"), A_GIMME, 0); - class_addmethod(dial_class, (t_method)dial_label_font, gensym("label_font"), A_GIMME, 0); - class_addmethod(dial_class, (t_method)dial_log, gensym("log"), 0); - class_addmethod(dial_class, (t_method)dial_lin, gensym("lin"), 0); - class_addmethod(dial_class, (t_method)dial_init, gensym("init"), A_FLOAT, 0); - class_addmethod(dial_class, (t_method)dial_steady, gensym("steady"), A_FLOAT, 0); - if(!iemgui_key_sym) iemgui_key_sym = gensym("#keyname"); - dial_widgetbehavior.w_getrectfn = dial_getrect; - dial_widgetbehavior.w_displacefn = iemgui_displace; - dial_widgetbehavior.w_selectfn = iemgui_select; - dial_widgetbehavior.w_activatefn = NULL; - dial_widgetbehavior.w_deletefn = iemgui_delete; - dial_widgetbehavior.w_visfn = iemgui_vis; - dial_widgetbehavior.w_clickfn = dial_newclick; -#if PD_MINOR_VERSION < 37 /* TODO: remove old behaviour in exactly 2 months from now */ - dial_widgetbehavior.w_propertiesfn = dial_properties;; - dial_widgetbehavior.w_savefn = dial_save; -#else - class_setpropertiesfn(dial_class, &dial_properties); - class_setsavefn(dial_class, &dial_save); -#endif - class_setwidget(dial_class, &dial_widgetbehavior); - //class_sethelpsymbol(dial_class, gensym("dial")); -} diff --git a/test/frameaccum.c b/test/frameaccum.c new file mode 100644 index 0000000..6038ae5 --- /dev/null +++ b/test/frameaccum.c @@ -0,0 +1,71 @@ +/* Copyright (c) 2002-2003 krzYszcz and others. + * For information on usage and redistribution, and for a DISCLAIMER OF ALL + * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */ + +#include <string.h> +#include "m_pd.h" +#include "common/grow.h" +#include "sickle/sic.h" + +#define FRAMEACCUM_INISIZE 512 + +typedef struct _frameaccum +{ + t_sic x_sic; + int x_size; + t_float *x_frame; + t_float x_frameini[FRAMEACCUM_INISIZE]; +} t_frameaccum; + +static t_class *frameaccum_class; + +static t_int *frameaccum_perform(t_int *w) +{ + int nblock = (int)(w[1]); + t_float *frame = (t_float *)(w[2]); + t_float *in = (t_float *)(w[3]); + t_float *out = (t_float *)(w[4]); + while (nblock--) *out++ = (*frame++ += *in++); + return (w + 5); +} + +static void frameaccum_dsp(t_frameaccum *x, t_signal **sp) +{ + int nblock = sp[0]->s_n; + if (nblock > x->x_size) + x->x_frame = grow_nodata(&nblock, &x->x_size, x->x_frame, + FRAMEACCUM_INISIZE, x->x_frameini, + sizeof(*x->x_frame)); + memset(x->x_frame, 0, nblock * sizeof(*x->x_frame)); /* CHECKED */ + dsp_add(frameaccum_perform, 4, nblock, x->x_frame, + sp[0]->s_vec, sp[1]->s_vec); +} + +static void frameaccum_free(t_frameaccum *x) +{ + if (x->x_frame != x->x_frameini) + freebytes(x->x_frame, x->x_size * sizeof(*x->x_frame)); +} + +static void *frameaccum_new(t_symbol *s, int ac, t_atom *av) +{ + t_frameaccum *x = (t_frameaccum *)pd_new(frameaccum_class); + int size; + x->x_size = FRAMEACCUM_INISIZE; + x->x_frame = x->x_frameini; + if ((size = sys_getblksize()) > FRAMEACCUM_INISIZE) + x->x_frame = grow_nodata(&size, &x->x_size, x->x_frame, + FRAMEACCUM_INISIZE, x->x_frameini, + sizeof(*x->x_frame)); + outlet_new((t_object *)x, &s_signal); + return (x); +} + +void frameaccum_tilde_setup(void) +{ + frameaccum_class = class_new(gensym("frameaccum~"), + (t_newmethod)frameaccum_new, + (t_method)frameaccum_free, + sizeof(t_frameaccum), 0, 0); + sic_setup(frameaccum_class, frameaccum_dsp, SIC_FLOATTOSIGNAL); +} diff --git a/test/from_ascii_code-help.pd b/test/from_ascii_code-help.pd new file mode 100644 index 0000000..0b4ee06 --- /dev/null +++ b/test/from_ascii_code-help.pd @@ -0,0 +1,19 @@ +#N canvas 1285 315 450 300 10; +#X obj 107 212 print; +#X msg 93 43 65; +#X msg 139 47 43; +#X obj 190 61 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1 +-1; +#X msg 52 49 32; +#X obj 107 165 tof/from_ascii_code 13; +#X msg 240 60 49 50 51 32 50 13; +#X msg 280 95 54; +#X msg 282 126 13; +#X connect 1 0 5 0; +#X connect 2 0 5 0; +#X connect 3 0 5 0; +#X connect 4 0 5 0; +#X connect 5 0 0 0; +#X connect 6 0 5 0; +#X connect 7 0 5 0; +#X connect 8 0 5 0; diff --git a/test/from_ascii_code.c b/test/from_ascii_code.c new file mode 100644 index 0000000..31f5086 --- /dev/null +++ b/test/from_ascii_code.c @@ -0,0 +1,111 @@ +#include "m_pd.h" + +//static char* from_ascii_code_text; +// Common binbuf to all objects +static t_binbuf* from_ascii_code_binbuf; + +typedef struct _from_ascii_code +{ + + t_object x_ob; + int eof_is_set; + int eof; + t_outlet* outlet_left; + //t_outlet* outlet_right; + char* text; + int text_size; + int size; +} t_from_ascii_code; + +static t_class *from_ascii_code_class; + +// Force output even if eof has not been received +static void from_ascii_code_bang(t_from_ascii_code *x) { + + if ( x->size ) { + binbuf_clear(from_ascii_code_binbuf); + binbuf_text(from_ascii_code_binbuf, x->text, x->size); + t_atom *argv = binbuf_getvec(from_ascii_code_binbuf); + int argc = binbuf_getnatom(from_ascii_code_binbuf); + if ( argc) { + if ( (argv->a_type == A_SYMBOL) ) { + outlet_anything(x->outlet_left,atom_getsymbol(argv),argc-1,argv+1); + } else { + outlet_anything(x->outlet_left,&s_list,argc,argv); + } + } + x->size = 0; + } +} + + +static void from_ascii_code_float(t_from_ascii_code *x, t_float f) { + + if ( x->eof_is_set && f == x->eof ) { + from_ascii_code_bang(x); + } else if ( f > 31 && f < 127 ) { + x->text[x->size] = (char) f; + x->size = x->size + 1; + if ( x->size >= x->text_size ) { + + x->text = resizebytes(x->text, x->text_size * sizeof(*(x->text)), + (x->text_size + 100) * sizeof(*(x->text))); + x->text_size = x->text_size + 100; + } + } +} + +static void from_ascii_code_list(t_from_ascii_code *x, t_symbol *s, int argc, t_atom *argv) { + int i; + for ( i=0; i < argc; i++ ) { + if ( ((argv+i)->a_type == A_FLOAT) ) { + from_ascii_code_float(x,atom_getfloat(argv+i)); + } + } +} + +static void from_ascii_code_free(t_from_ascii_code *x) { + + freebytes(x->text,x->text_size*sizeof(*(x->text))); +} + +static void *from_ascii_code_new(t_symbol *s, int ac, t_atom *av) +{ + t_from_ascii_code *x = (t_from_ascii_code *)pd_new(from_ascii_code_class); + + // set eof if eof is set + if ( ac && ((av)->a_type == A_FLOAT)) { + x->eof = (int) atom_getfloat(av); + x->eof_is_set = 1; + } else { + x->eof_is_set = 0; + } + + // create string + x->text_size = 100; + x->text = getbytes(x->text_size*sizeof(*x->text)); + + x->size = 0; + + x->outlet_left = outlet_new(&x->x_ob, &s_list); + //x->outlet_right = outlet_new(&x->x_ob, &s_float); + + return (x); +} + +void from_ascii_code_setup(void) +{ + // create binbuf (no need to ever free) + from_ascii_code_binbuf = binbuf_new(); + + + + from_ascii_code_class = class_new(gensym("from_ascii_code"), + (t_newmethod)from_ascii_code_new, (t_method)from_ascii_code_free, + sizeof(t_from_ascii_code), 0, A_GIMME, 0); + + class_addbang(from_ascii_code_class, from_ascii_code_bang); + class_addfloat(from_ascii_code_class, from_ascii_code_float); + class_addlist(from_ascii_code_class, from_ascii_code_list); + + } diff --git a/test/imagebutton.c b/test/imagebutton.c new file mode 100644 index 0000000..577924a --- /dev/null +++ b/test/imagebutton.c @@ -0,0 +1,415 @@ +#include <m_pd.h> +#include "g_canvas.h" +#include <unistd.h> +#include <string.h> +#include <stdio.h> + +/* Append " x " to the following line to show debugging messages */ +#define DEBUG(x) x + +// TODO: NEED TO FREE UNUSED IMAGES! + + + +/* ------------------------ imagebutton ----------------------------- */ + +static t_class *imagebutton_class; +t_widgetbehavior imagebutton_widgetbehavior; + + +typedef struct _imagebutton +{ + t_object x_obj; + t_glist * glist; + int width; + int height; + t_symbol* image_a; + t_symbol* image_b; + t_symbol* receive; + t_clock* clock_flash; + t_clock* clock_brk; + int flashing; + t_outlet* outlet; +} t_imagebutton; + + +static void imagebutton_bang(t_imagebutton *x) +{ + + t_glist* glist = glist_getcanvas(x->glist); + if(x->flashing) { + sys_vgui(".x%x.c itemconfigure %ximage -image %x_imagebutton \n", glist, x,x->image_a); + clock_delay(x->clock_brk, 50); + //x->flashed = 1; + } else { + sys_vgui(".x%x.c itemconfigure %ximage -image %x_imagebutton \n", glist, x,x->image_b); + x->flashing = 1; + + } + clock_delay(x->clock_flash, 250); + + outlet_bang(x->outlet); +} + +static void imagebutton_flash_timeout(t_imagebutton *x) +{ + t_glist* glist = glist_getcanvas(x->glist); + x->flashing = 0; + sys_vgui(".x%x.c itemconfigure %ximage -image %x_imagebutton \n", glist, x,x->image_a); + +} + +static void imagebutton_brk_timeout(t_imagebutton *x) +{ + t_glist* glist = glist_getcanvas(x->glist); + x->flashing = 1; + sys_vgui(".x%x.c itemconfigure %ximage -image %x_imagebutton \n", glist, x,x->image_b); + +} + + +/* widget helper functions */ + +static const char* imagebutton_get_filename(t_imagebutton *x,char *file) { + static char fname[MAXPDSTRING]; + char *bufptr; + int fd; + + fd=open_via_path(canvas_getdir(glist_getcanvas(x->glist))->s_name, + file, "",fname, &bufptr, MAXPDSTRING, 1); + if(fd>0){ + fname[strlen(fname)]='/'; + DEBUG(post("image file: %s",fname);) + close(fd); + return fname; + } else { + return 0; + } +} + +static int imagebutton_click(t_imagebutton *x, struct _glist *glist, + int xpos, int ypos, int shift, int alt, int dbl, int doit) { + DEBUG(post("x:%i y:%i dbl:%i doit:%i",xpos,ypos,dbl,doit);) + //if ( doit) { + //sys_vgui(".x%x.c itemconfigure %ximage -state \"%s\"\n", x->glist, x, doit?"disabled":"normal"); + if ( doit) imagebutton_bang(x) ; + //} + return (1); + } + + + + +static void imagebutton_drawme(t_imagebutton *x, t_glist *glist, int firsttime) { + if (firsttime) { + + sys_vgui(".x%x.c create image %d %d -anchor nw -image %x_imagebutton -disabledimage %x_imagebutton -tags %ximage\n", + glist_getcanvas(glist), + text_xpix(&x->x_obj, glist), text_ypix(&x->x_obj, glist),x->image_a,x->image_b,x); + + + sys_vgui("pd [concat %s _imagesize [image width %x_imagebutton] [image height %x_imagebutton] \\;]\n",x->receive->s_name,x->image_a,x->image_a); + + + } else { + sys_vgui(".x%x.c coords %ximage %d %d\n", + glist_getcanvas(glist), x, + text_xpix(&x->x_obj, glist), text_ypix(&x->x_obj, glist)); + } + +} + + +void imagebutton_erase(t_imagebutton* x,t_glist* glist) +{ + int n; + sys_vgui(".x%x.c delete %ximage\n", + glist_getcanvas(glist), x); + +} + + + +/* ------------------------ image widgetbehaviour----------------------------- */ + + +static void imagebutton_getrect(t_gobj *z, t_glist *glist, + int *xp1, int *yp1, int *xp2, int *yp2) +{ + int width, height; + t_imagebutton* x = (t_imagebutton*)z; + + + width = x->width; + height = x->height; + *xp1 = text_xpix(&x->x_obj, glist); + *yp1 = text_ypix(&x->x_obj, glist); + *xp2 = text_xpix(&x->x_obj, glist) + width; + *yp2 = text_ypix(&x->x_obj, glist) + height; +} + +static void imagebutton_displace(t_gobj *z, t_glist *glist, + int dx, int dy) +{ + t_imagebutton *x = (t_imagebutton *)z; + x->x_obj.te_xpix += dx; + x->x_obj.te_ypix += dy; + sys_vgui(".x%x.c coords %xSEL %d %d %d %d\n", + glist_getcanvas(glist), x, + text_xpix(&x->x_obj, glist), text_ypix(&x->x_obj, glist), + text_xpix(&x->x_obj, glist) + x->width, text_ypix(&x->x_obj, glist) + x->height); + + imagebutton_drawme(x, glist, 0); + canvas_fixlinesfor(glist_getcanvas(glist),(t_text*) x); +} + +static void imagebutton_select(t_gobj *z, t_glist *glist, int state) +{ + t_imagebutton *x = (t_imagebutton *)z; + if (state) { + sys_vgui(".x%x.c create rectangle \ +%d %d %d %d -tags %xSEL -outline blue\n", + glist_getcanvas(glist), + text_xpix(&x->x_obj, glist), text_ypix(&x->x_obj, glist), + text_xpix(&x->x_obj, glist) + x->width, text_ypix(&x->x_obj, glist) + x->height, + x); + } + else { + sys_vgui(".x%x.c delete %xSEL\n", + glist_getcanvas(glist), x); + } + + + +} + + +static void imagebutton_activate(t_gobj *z, t_glist *glist, int state) +{ +/* t_text *x = (t_text *)z; + t_rtext *y = glist_findrtext(glist, x); + if (z->g_pd != gatom_class) rtext_activate(y, state);*/ +} + +static void imagebutton_delete(t_gobj *z, t_glist *glist) +{ + t_text *x = (t_text *)z; + //canvas_deletelinesfor(glist_getcanvas(glist), x); + canvas_deletelinesfor(glist, x); +} + + +static void imagebutton_vis(t_gobj *z, t_glist *glist, int vis) +{ + t_imagebutton* s = (t_imagebutton*)z; + if (vis) + imagebutton_drawme(s, glist, 1); + else + imagebutton_erase(s,glist); +} + +/* can we use the normal text save function ?? */ +/* +static void imagebutton_save(t_gobj *z, t_binbuf *b) +{ + t_imagebutton *x = (t_imagebutton *)z; + binbuf_addv(b, "ssiissi", gensym("#X"),gensym("obj"), + x->x_obj.te_xpix, x->x_obj.te_ypix, + atom_getsymbol(binbuf_getvec(x->x_obj.te_binbuf)), + x->x_image,x->x_type); + binbuf_addv(b, ";"); +} +*/ + + +static void imagebutton_size(t_imagebutton* x,t_floatarg w,t_floatarg h) { + x->width = w; + x->height = h; +} + +static void imagebutton_color(t_imagebutton* x,t_symbol* col) +{ +/* outlet_bang(x->x_obj.ob_outlet); only bang if there was a bang .. + so color black does the same as bang, but doesn't forward the bang +*/ +} + +/* +static void imagebutton_open(t_gobj *z,t_symbol* file) +{ + t_imagebutton* x = (t_imagebutton*)z; + const char *fname; + int oldtype=x->x_type; + + + fname=imagebutton_get_filename(x,file->s_name); + if(fname){ + x->x_image=file; + x->x_type=0; + if(glist_isvisible(x->glist)) { + if(!x->x_localimage) { + sys_vgui("image create photo img%x\n",x); + x->x_localimage=1; + } + sys_vgui("img%x blank\n",x); + sys_vgui("img%x configure -file %s\n",x,fname); + if(oldtype) sys_vgui(".x%x.c itemconfigure %xS -image img%x\n", + glist_getcanvas(x->glist),x,x); + } + } +} + */ + +static void imagebutton_imagesize_callback(t_imagebutton *x, t_float w, t_float h) { + DEBUG(post("received w %f h %f",w,h);) + x->width = w; + x->height = h; + canvas_fixlinesfor(glist_getcanvas(x->glist),(t_text*) x); +} + + +static void imagebutton_free(t_imagebutton *x) { + + // check first if variable has been unset and image is unused + // then delete image and unset variable + DEBUG(sys_vgui("pd [concat DEBUG b in use [image inuse %x_imagebutton] \\;]\n",x->image_b);) + DEBUG(sys_vgui("pd [concat DEBUG a in use [image inuse %x_imagebutton] \\;]\n",x->image_a);) + + sys_vgui("if { [info exists %x_imagebutton] == 1 && [image inuse %x_imagebutton] == 0} { image delete %x_imagebutton \n unset %x_imagebutton\n} \n",x->image_b,x->image_b,x->image_b,x->image_b); + sys_vgui("if { [info exists %x_imagebutton] == 1 && [image inuse %x_imagebutton] == 0} { image delete %x_imagebutton \n unset %x_imagebutton\n} \n",x->image_a,x->image_a,x->image_a,x->image_a); + + DEBUG(sys_vgui("pd [concat DEBUG b exists [info exists %x_imagebutton] \\;]\n",x->image_b);) + DEBUG(sys_vgui("pd [concat DEBUG a exists [info exists %x_imagebutton] \\;]\n",x->image_a);) + + if (x->receive) { + pd_unbind(&x->x_obj.ob_pd,x->receive); + } + clock_free(x->clock_flash); + clock_free(x->clock_brk); + +} + + +static void *imagebutton_new(t_symbol *s, int argc, t_atom *argv) +{ + t_imagebutton *x = (t_imagebutton *)pd_new(imagebutton_class); + + x->glist = (t_glist*) canvas_getcurrent(); + + // Set up a callback to get the size + x->width = 10; + x->height = 10; + + x->flashing = 0; + + x->image_a = NULL; + x->image_b = NULL; + + t_symbol* image_a = NULL; + t_symbol* image_b = NULL; + + const char *fname; + + // CREATE IMAGES + // images are only created if they have not been created yet + // we use the symbol pointer to distinguish between image files + + + if ( argc && (argv)->a_type == A_SYMBOL ) { + image_a= atom_getsymbol(argv); + fname = imagebutton_get_filename(x,image_a->s_name); // Get image file path + if (fname) { + x->image_a = gensym(fname); + //sys_vgui("set %x_a \"%s\" \n",x,fname); + // Create the image only if the class has not already loaded the same image (with the same symbolic path name) + sys_vgui("if { [info exists %x_imagebutton] == 0} { image create photo %x_imagebutton -file \"%s\"\n set %x_imagebutton 1\n} \n",x->image_a,x->image_a,fname,x->image_a); + //sys_vgui("pd [concat test %x_imagebutton \\;]\n",x->image_a); + } + } + + + + if ( argc > 1 && (argv+1)->a_type == A_SYMBOL ) { + image_b= atom_getsymbol(argv+1); + fname = imagebutton_get_filename(x,image_b->s_name); // Get image file path + if (fname) { + x->image_b = gensym(fname); + //sys_vgui("set %x_b \"%s\" \n",x,fname); + sys_vgui("if { [info exists %x_imagebutton] == 0} { image create photo %x_imagebutton -file \"%s\"\n set %x_imagebutton 1\n} \n",x->image_b,x->image_b,fname,x->image_b); + //sys_vgui("pd [concat test %x_imagebutton \\;]\n",x->image_b); + } + } + + if (image_a == NULL || image_b == NULL) { + pd_error(x,"[imagebutton] requires two gif images"); + return NULL; + } + char buf[MAXPDSTRING]; + sprintf(buf, "#%lx", (long)x); + x->receive = gensym(buf); + pd_bind(&x->x_obj.ob_pd, x->receive ); + + x->clock_flash = clock_new(x, (t_method)imagebutton_flash_timeout); + x->clock_brk = clock_new(x, (t_method)imagebutton_brk_timeout); + + + x->outlet = outlet_new(&x->x_obj, &s_float); + + + return (x); + +} + +void imagebutton_setup(void) +{ + imagebutton_class = class_new(gensym("imagebutton"), (t_newmethod)imagebutton_new, (t_method)imagebutton_free, + sizeof(t_imagebutton),0, A_GIMME,0); + + class_addmethod(imagebutton_class, (t_method)imagebutton_imagesize_callback,\ + gensym("_imagesize"), A_DEFFLOAT, A_DEFFLOAT, 0); + + +/* + class_addmethod(imagebutton_class, (t_method)imagebutton_size, gensym("size"), + A_FLOAT, A_FLOAT, 0); + + class_addmethod(imagebutton_class, (t_method)imagebutton_color, gensym("color"), + A_SYMBOL, 0); +*/ + /* + class_addmethod(imagebutton_class, (t_method)imagebutton_open, gensym("open"), + A_SYMBOL, 0); + */ + /* + class_addmethod(imagebutton_class, (t_method)imagebutton_set, gensym("set"), + A_SYMBOL, 0); + */ + /* + class_addmethod(imagebutton_class, (t_method)imagebutton_load, gensym("load"), + A_SYMBOL, A_SYMBOL, 0); +*/ + + imagebutton_widgetbehavior.w_getrectfn = imagebutton_getrect; + imagebutton_widgetbehavior.w_displacefn = imagebutton_displace; + imagebutton_widgetbehavior.w_selectfn = imagebutton_select; + imagebutton_widgetbehavior.w_activatefn = imagebutton_activate; + imagebutton_widgetbehavior.w_deletefn = imagebutton_delete; + imagebutton_widgetbehavior.w_visfn = imagebutton_vis; + + imagebutton_widgetbehavior.w_clickfn = (t_clickfn)imagebutton_click; + + +#if PD_MINOR_VERSION < 37 + imagebutton_widgetbehavior.w_propertiesfn = NULL; + //imagebutton_widgetbehavior.w_savefn = imagebutton_save; +#endif + + + class_setwidget(imagebutton_class,&imagebutton_widgetbehavior); +#if PD_MINOR_VERSION >= 37 + // class_setsavefn(imagebutton_class,&imagebutton_save); +#endif + +} + + diff --git a/test/pak.c b/test/pak.c deleted file mode 100644 index ad1cf73..0000000 --- a/test/pak.c +++ /dev/null @@ -1,379 +0,0 @@ -static t_class *pak_class; -static t_class *pak_inlet_class; - -typedef struct _pak -{ - t_object x_obj; - t_int x_n; // number of args - t_atom *x_vec; // input values - t_int x_nptr; // number of pointers - t_gpointer *x_gpointer; // the pointers - t_atom *x_outvec; // space for output values - int count; - struct _pak_inlet **proxy; - t_inlet **in; -} t_pak; - - - -typedef struct _pak_inlet -{ - t_pd p_pd; - t_pack *master; - int id; - t_symbol* type; -} t_pak_inlet; - - -static void *pak_new(t_symbol *s, int argc, t_atom *argv) -{ - t_pak *x = (t_pak *)pd_new(pak_class); - t_atom defarg[2], *vap, *vec, *vp; - t_gpointer *gp; - int nptr = 0; - int i; - if (!argc) - { - argv = defarg; - argc = 2; - SETFLOAT(&defarg[0], 0); - SETFLOAT(&defarg[1], 0); - } - - x->x_n = argc; - vec = x->x_vec = (t_atom *)getbytes(argc * sizeof(*x->x_vec)); - x->x_outvec = (t_atom *)getbytes(argc * sizeof(*x->x_outvec)); - - for (i = argc, ap = argv; i--; ap++) - if (ap->a_type == A_SYMBOL && *ap->a_w.w_symbol->s_name == 'p') - nptr++; - - gp = x->x_gpointer = (t_gpointer *)t_getbytes(nptr * sizeof (*gp)); - x->x_nptr = nptr; - - - // Create inlet proxys - x->count = argc - 1; - if (x->count < 0) x->count = 0; - x->in = (t_inlet **)getbytes(x->count * sizeof(t_inlet *)); - x->proxy = (t_pak_inlet**)getbytes(x->count * sizeof(t_pak_inlet*)); - // - - /* - - for (n = 0; n < x->count; n++) { - x->proxy[n]=(t_pak_inlet*)pd_new(pak_inlet_class); - x->proxy[n]->master = x; - x->proxy[n]->id=n; - x->in[n] = inlet_new ((t_object*)x, (t_pd*)x->proxy[n], 0,0); - } - - */ - - int n; - for (i = 0, vp = x->x_vec, ap = argv; i < argc; i++, ap++, vp++) - { - n = i-1; - if (ap->a_type == A_FLOAT) - { - *vp = *ap; - if (i) { - //floatinlet_new(&x->x_obj, &vp->a_w.w_float); - x->proxy[n]=(t_pak_inlet*)pd_new(pak_inlet_class); - x->proxy[n]->master = x; - x->proxy[n]->id=n; - x->proxy[n]->typr = &s_float; - x->in[n] = inlet_new ((t_object*)x, (t_pd*)x->proxy[n], 0,0); - } - } - else if (ap->a_type == A_SYMBOL) - { - char c = *ap->a_w.w_symbol->s_name; - if (c == 's') - { - SETSYMBOL(vp, &s_symbol); - if (i) symbolinlet_new(&x->x_obj, &vp->a_w.w_symbol); - } - else if (c == 'p') - { - vp->a_type = A_POINTER; - vp->a_w.w_gpointer = gp; - gpointer_init(gp); - if (i) pointerinlet_new(&x->x_obj, gp); - gp++; - } - else - { - if (c != 'f') pd_error(x, "pak: %s: bad type", - ap->a_w.w_symbol->s_name); - SETFLOAT(vp, 0); - if (i) floatinlet_new(&x->x_obj, &vp->a_w.w_float); - } - } - } - - - - - - - - outlet_new(&x->x_obj, &s_list); - return (x); -} - -static void pak_bang(t_pak *x) -{ - int i, reentered = 0, size = x->x_n * sizeof (t_atom); - t_gpointer *gp; - t_atom *outvec; - for (i = x->x_nptr, gp = x->x_gpointer; i--; gp++) - if (!gpointer_check(gp, 1)) - { - pd_error(x, "pak: stale pointer"); - return; - } - // reentrancy protection. The first time through use the pre-allocated - // x_outvec; if we're reentered we have to allocate new memory. - if (!x->x_outvec) - { - // LATER figure out how to deal with reentrancy and pointers... - if (x->x_nptr) - post("pak_bang: warning: reentry with pointers unprotected"); - outvec = t_getbytes(size); - reentered = 1; - } - else - { - outvec = x->x_outvec; - x->x_outvec = 0; - } - memcpy(outvec, x->x_vec, size); - outlet_list(x->x_obj.ob_outlet, &s_list, x->x_n, outvec); - if (reentered) - t_freebytes(outvec, size); - else x->x_outvec = outvec; -} - -static void pak_pointer(t_pak *x, t_gpointer *gp) -{ - if (x->x_vec->a_type == A_POINTER) - { - gpointer_unset(x->x_gpointer); - *x->x_gpointer = *gp; - if (gp->gp_stub) gp->gp_stub->gs_refcount++; - pak_bang(x); - } - else pd_error(x, "pak_pointer: wrong type"); -} - -static void pak_float(t_pak *x, t_float f) -{ - if (x->x_vec->a_type == A_FLOAT) - { - x->x_vec->a_w.w_float = f; - pak_bang(x); - } - else pd_error(x, "pak_float: wrong type"); -} - -static void pak_symbol(t_pak *x, t_symbol *s) -{ - if (x->x_vec->a_type == A_SYMBOL) - { - x->x_vec->a_w.w_symbol = s; - pak_bang(x); - } - else pd_error(x, "pak_symbol: wrong type"); -} - -static void pak_list(t_pak *x, t_symbol *s, int ac, t_atom *av) -{ - obj_list(&x->x_obj, 0, ac, av); -} - -static void pak_anything(t_pak *x, t_symbol *s, int ac, t_atom *av) -{ - t_atom *av2 = (t_atom *)getbytes((ac + 1) * sizeof(t_atom)); - int i; - for (i = 0; i < ac; i++) - av2[i + 1] = av[i]; - SETSYMBOL(av2, s); - obj_list(&x->x_obj, 0, ac+1, av2); - freebytes(av2, (ac + 1) * sizeof(t_atom)); -} - - -static void pak_inlet(t_pak *y, t_symbol *s, int argc, t_atom *argv) -{ - t_mux*x=y->p_master; - if(y->id==x->i_selected) - outlet_anything(x->x_obj.ob_outlet, s, argc, argv); -} - - -static void pak_free(t_pak *x) -{ - t_gpointer *gp; - int i; - for (gp = x->x_gpointer, i = x->x_nptr; i--; gp++) - gpointer_unset(gp); - freebytes(x->x_vec, x->x_n * sizeof(*x->x_vec)); - freebytes(x->x_outvec, x->x_n * sizeof(*x->x_outvec)); - freebytes(x->x_gpointer, x->x_nptr * sizeof(*x->x_gpointer)); - - // Free proxys - const int count = x->count; - - if(x->in && x->proxy){ - int n=0; - for(n=0; n<count; n++){ - if(x->in[n]){ - inlet_free(x->in[n]); - } - x->in[n]=0; - if(x->proxy[n]){ - t_pak_inlet *y=x->proxy[n]; - y->master=0; - y->id=0; - pd_free(&y->p_pd); - } - x->proxy[n]=0; - } - freebytes(x->in, x->count * sizeof(t_inlet *)); - freebytes(x->proxy, x->count * sizeof(t_pak_inlet*)); - } - - -} - -static void pak_setup(void) -{ - pak_class = class_new(gensym("pak"), (t_newmethod)pak_new, - (t_method)pak_free, sizeof(t_pak), 0, A_GIMME, 0); - class_addbang(pak_class, pak_bang); - class_addpointer(pak_class, pak_pointer); - class_addfloat(pak_class, pak_float); - class_addsymbol(pak_class, pak_symbol); - class_addlist(pak_class, pak_list); - class_addanything(pak_class, pak_anything); - - // Setup proxies - - pak_inlet_class = class_new(0, 0, 0, sizeof(t_pak_inlet),CLASS_PD | CLASS_NOINLET, 0); - class_addanything(pak_inlet_class, pak_inlet); - -} - - - -//////////////// MULTIPLEX ////////////// - - -/* - - - -static t_class *mux_class; -static t_class *muxproxy_class; - -typedef struct _mux -{ - t_object x_obj; - struct _muxproxy **x_proxy; - - int i_count; - int i_selected; - t_inlet **in; -} t_mux; - - -typedef struct _muxproxy -{ - t_pd p_pd; - t_mux *p_master; - int id; -} t_muxproxy; - -static void mux_select(t_mux *x, t_float f) -{ - x->i_selected=f; -} - -static void mux_anything(t_muxproxy *y, t_symbol *s, int argc, t_atom *argv) -{ - t_mux*x=y->p_master; - if(y->id==x->i_selected) - outlet_anything(x->x_obj.ob_outlet, s, argc, argv); -} - -static void *mux_new(t_symbol *s, int argc, t_atom *argv) -{ - int n = (argc < 2)?2:argc; - t_mux *x = (t_mux *)pd_new(mux_class); - - x->i_selected=0; - x->i_count = n; - x->in = (t_inlet **)getbytes(x->i_count * sizeof(t_inlet *)); - x->x_proxy = (t_muxproxy**)getbytes(x->i_count * sizeof(t_muxproxy*)); - - for (n = 0; n<x->i_count; n++) { - x->x_proxy[n]=(t_muxproxy*)pd_new(muxproxy_class); - x->x_proxy[n]->p_master = x; - x->x_proxy[n]->id=n; - x->in[n] = inlet_new ((t_object*)x, (t_pd*)x->x_proxy[n], 0,0); - } - - inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("")); - - outlet_new(&x->x_obj, 0); - return (x); -} - -static void mux_free(t_mux*x){ - const int count = x->i_count; - - if(x->in && x->x_proxy){ - int n=0; - for(n=0; n<count; n++){ - if(x->in[n]){ - inlet_free(x->in[n]); - } - x->in[n]=0; - if(x->x_proxy[n]){ - t_muxproxy *y=x->x_proxy[n]; - y->p_master=0; - y->id=0; - pd_free(&y->p_pd); - } - x->x_proxy[n]=0; - } - freebytes(x->in, x->i_count * sizeof(t_inlet *)); - freebytes(x->x_proxy, x->i_count * sizeof(t_muxproxy*)); - } - - // pd_free(&y->p_pd); -} - -void multiplex_setup(void) -{ - mux_class = class_new(gensym("multiplex"), (t_newmethod)mux_new, - (t_method)mux_free, sizeof(t_mux), CLASS_NOINLET, A_GIMME, 0); - class_addcreator((t_newmethod)mux_new, gensym("mux"), A_GIMME, 0); - - class_addmethod (mux_class, (t_method)mux_select, gensym(""), A_DEFFLOAT, 0); - - muxproxy_class = class_new(0, 0, 0, - sizeof(t_muxproxy), - CLASS_PD | CLASS_NOINLET, 0); - class_addanything(muxproxy_class, mux_anything); - - - zexy_register("multiplex"); -} - -void mux_setup(void) -{ - multiplex_setup(); -} -*/ diff --git a/test/test.c b/test/test.c deleted file mode 100644 index 9c31307..0000000 --- a/test/test.c +++ /dev/null @@ -1,97 +0,0 @@ - - -//#include "tof.h" -//#include "param.h" -#include "m_pd.h" -#include "g_canvas.h" - -static t_class *test_class; - - -typedef struct _test -{ - t_object x_obj; - t_outlet* outlet; - t_symbol* name; - t_canvas* canvas; - //t_symbol* target; - //t_class* empty_s; - //t_symbol* root; - -} t_test; - - - -// Dump out -static void test_bang(t_test *x) { - t_atom a; - if (x->canvas) { - - SETFLOAT(&a,1); - pd_typedmess((t_pd*)x->canvas,gensym("vis"),1,&a); - } - -} - - - -static void test_free(t_test *x) -{ - if (x->canvas) { - //post("Deleting it"); - pd_free((t_pd *)x->canvas); - } - x->canvas = NULL; -} - - -static void *test_new(t_symbol *s, int ac, t_atom *av) { - t_test *x = (t_test *)pd_new(test_class); - - // create a new canvas - x->name = gensym("xiu"); - - t_atom a; - SETSYMBOL(&a, x->name); - pd_typedmess(&pd_objectmaker,gensym("pd"),1,&a); - - x->canvas = (t_canvas*) pd_newest(); - - // From this point on, we are hoping the "pd" object has been created - - // Change name to match pd's canvas naming scheme - x->name = gensym("pd-xiu"); - - - - // Hide the window (stupid way of doing this) - if (x->canvas) { - SETFLOAT(&a,0); - pd_typedmess((t_pd*)x->canvas,gensym("vis"),1,&a); - } - - // Try to change its name - //canvas_setargs(int argc, t_atom *argv); - - x->outlet = outlet_new(&x->x_obj, &s_list); - - return (x); -} - -void test_setup(void) { - test_class = class_new(gensym("test"), - (t_newmethod)test_new, (t_method)test_free, - sizeof(t_test), 0, A_GIMME, 0); - - class_addbang(test_class, test_bang); - //class_addsymbol(test_class, test_symbol); - - //class_addmethod(test_class, (t_method) test_values, gensym("values"), A_DEFSYMBOL,0); - - //class_addmethod(test_class, (t_method) test_guis, gensym("guis"), A_DEFSYMBOL,0); - //class_addmethod(test_class, (t_method) test_updateguis, gensym("updateguis"), A_DEFSYMBOL,0); - - - //class_addmethod(test_class, (t_method) test_update_guis, gensym("update"), A_DEFSYMBOL,0); - -} diff --git a/test/to_ascii_code-help.pd b/test/to_ascii_code-help.pd new file mode 100644 index 0000000..276bd99 --- /dev/null +++ b/test/to_ascii_code-help.pd @@ -0,0 +1,13 @@ +#N canvas 1371 321 506 219 10; +#X msg 108 32 test; +#X msg 262 34 1234; +#X obj 95 74 tof/to_ascii_code 13; +#X msg 173 36 list abcdef; +#X obj 95 115 print codes; +#X obj 214 115 print length; +#X text 234 73 Optionnal argument: append ascii code; +#X connect 0 0 2 0; +#X connect 1 0 2 0; +#X connect 2 0 4 0; +#X connect 2 1 5 0; +#X connect 3 0 2 0; diff --git a/test/to_ascii_code.c b/test/to_ascii_code.c new file mode 100644 index 0000000..8aa3155 --- /dev/null +++ b/test/to_ascii_code.c @@ -0,0 +1,97 @@ +#include "m_pd.h" + +// Common string to all objects +static char* to_ascii_code_text; +// Common binbuf to all objects +static t_binbuf* to_ascii_code_binbuf; + +typedef struct _to_ascii_code +{ + + t_object x_ob; + int eof_is_set; + int eof; + t_outlet* outlet_left; + //t_outlet* outlet_right; +} t_to_ascii_code; + +static t_class *to_ascii_code_class; + +static void to_ascii_code_bang(t_to_ascii_code *x) { + // Do nothing +} + + +static void to_ascii_code_anything(t_to_ascii_code *x, t_symbol *s, int ac, t_atom *av) { + + binbuf_clear(to_ascii_code_binbuf); + // Add selector if it is not standard + if ( s != &s_list && s != &s_float && s != &s_symbol && s != &s_) { + t_atom a; + SETSYMBOL(&a, s); + binbuf_add(to_ascii_code_binbuf,1,&a); + } + // Add all the atoms to the binbuf + binbuf_add(to_ascii_code_binbuf, ac, av); + + + + // Get the contents as a text + int size=0; + binbuf_gettext(to_ascii_code_binbuf, &to_ascii_code_text, &size); //void binbuf_gettext(t_binbuf *x, char **bufp, int *lengthp); + + // Convert to a list of floats + + t_atom *list_floats = getbytes((size+1)*sizeof(*list_floats)); // Add some space for the eof character + int i; + for ( i=0; i < size; i++ ) { + SETFLOAT(list_floats+i,(t_float)to_ascii_code_text[i]); + } + if ( x->eof_is_set ) { // Append eof if set + SETFLOAT(list_floats+size, x->eof); + //outlet_float(x->outlet_right,size+1); + outlet_list(x->outlet_left,&s_list,size+1,list_floats); + } else { + //outlet_float(x->outlet_right,size); + outlet_list(x->outlet_left,&s_list,size,list_floats); + } + freebytes(list_floats, (size+1)*sizeof(*list_floats)); + +} + + +static void *to_ascii_code_new(t_symbol *s, int ac, t_atom *av) +{ + t_to_ascii_code *x = (t_to_ascii_code *)pd_new(to_ascii_code_class); + + // set eof if eof is set + if ( ac && ((av)->a_type == A_FLOAT)) { + x->eof = (int) atom_getfloat(av); + x->eof_is_set = 1; + } else { + x->eof_is_set = 0; + } + + x->outlet_left = outlet_new(&x->x_ob, &s_list); + //x->outlet_right = outlet_new(&x->x_ob, &s_float); + + return (x); +} + +void to_ascii_code_setup(void) +{ + // create binbuf (no need to ever free) + to_ascii_code_binbuf = binbuf_new(); + + // create text (no need to ever free) + to_ascii_code_text = getbytes(MAXPDSTRING*sizeof(*to_ascii_code_text)); + + to_ascii_code_class = class_new(gensym("to_ascii_code"), + (t_newmethod)to_ascii_code_new, 0, + sizeof(t_to_ascii_code), 0, A_GIMME, 0); + + class_addbang(to_ascii_code_class, to_ascii_code_bang); + class_addanything(to_ascii_code_class, to_ascii_code_anything); + + + } diff --git a/test/tokenArgs.c b/test/tokenArgs.c deleted file mode 100644 index 80d8c16..0000000 --- a/test/tokenArgs.c +++ /dev/null @@ -1,80 +0,0 @@ - - -#include "../src/tof.h" - - -static t_class *tokenArgs_class; - - -typedef struct _tokenArgs -{ - t_object x_obj; - t_outlet* outlet; - t_canvas* canvas; - char token; - int size; - int ac; - t_atom* av; -} t_tokenArgs; - - - -// Dump out -static void tokenArgs_bang(t_tokenArgs *x) { - - int ac_a; - t_atom* av_a; - t_symbol* selector_a; - int iter = 0 ; - while ( tof_next_tagged_argument(x->token, x->ac, x->av, &ac_a, &av_a,&iter)) { - tof_set_selector(&selector_a,&ac_a,&av_a); - outlet_anything(x->outlet, selector_a, ac_a, av_a); - } - -} - - -static void tokenArgs_free(t_tokenArgs *x) -{ - freebytes(x->av,x->ac*sizeof(*(x->av))); -} - - -static void *tokenArgs_new(t_symbol *s) { - t_tokenArgs *x = (t_tokenArgs *)pd_new(tokenArgs_class); - - - x->token = s->s_name[0]; - - //x->canvas = tof_get_canvas(); - // I guess the canvas is currently set :) - int ac; - t_atom* av; - canvas_getargs(&ac, &av); - - x->ac = ac; - x->av = getbytes(x->ac * sizeof(*(x->av))); - tof_copy_atoms(av,x->av,x->ac); - - x->outlet = outlet_new(&x->x_obj, &s_list); - - return (x); -} - -void tokenArgs_setup(void) { - tokenArgs_class = class_new(gensym("tokenArgs"), - (t_newmethod)tokenArgs_new, (t_method)tokenArgs_free, - sizeof(t_tokenArgs), 0, A_DEFSYMBOL, 0); - - class_addbang(tokenArgs_class, tokenArgs_bang); - //class_addsymbol(tokenArgs_class, tokenArgs_symbol); - - //class_addmethod(tokenArgs_class, (t_method) tokenArgs_values, gensym("values"), A_DEFSYMBOL,0); - - //class_addmethod(tokenArgs_class, (t_method) tokenArgs_guis, gensym("guis"), A_DEFSYMBOL,0); - //class_addmethod(tokenArgs_class, (t_method) tokenArgs_updateguis, gensym("updateguis"), A_DEFSYMBOL,0); - - - //class_addmethod(tokenArgs_class, (t_method) tokenArgs_update_guis, gensym("update"), A_DEFSYMBOL,0); - -} |