diff --git a/externals/tof/src/imagebang.c b/externals/tof/src/imagebang.c index 12847602e3221a5279f79752ca319d1c55ee3b24..31fb1fc34c7e990ad9f015ed41620680b0e56ddf 100644 --- a/externals/tof/src/imagebang.c +++ b/externals/tof/src/imagebang.c @@ -31,97 +31,156 @@ typedef struct _imagebang t_symbol* send; t_clock* clock_flash; t_clock* clock_brk; - int flashing; - t_outlet* outlet; + int flashing; + t_outlet* outlet; } t_imagebang; static void imagebang_bang(t_imagebang *x) { - - t_glist* glist = glist_getcanvas(x->glist); - if(x->flashing) { - sys_vgui(".x%x.c itemconfigure %ximage -image %x_imagebang \n", glist, x,x->image_a); + t_glist* glist = glist_getcanvas(x->glist); + char image_key[MAXPDSTRING]; + if (x->flashing) + { + sys_vgui(".x%x.c itemconfigure %ximage -image %x_imagebang \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_imagebang \n", glist, x,x->image_b); + // key_a: + sprintf(image_key, "%lx_a", (long unsigned int)x); + gui_vmess("gui_image_configure", "xxss", + glist_getcanvas(x->glist), + x, + image_key, + "nw"); + } + else + { + sys_vgui(".x%x.c itemconfigure %ximage -image %x_imagebang \n", + glist, x,x->image_b); + // key_b: + sprintf(image_key, "%lx_b", (long unsigned int)x); + gui_vmess("gui_image_configure", "xxss", + glist_getcanvas(x->glist), + x, + image_key, + "nw"); x->flashing = 1; - } clock_delay(x->clock_flash, 250); - outlet_bang(x->outlet); - if(x->send && x->send->s_thing ) pd_bang(x->send->s_thing); - + if (x->send && x->send->s_thing) pd_bang(x->send->s_thing); } static void imagebang_flash_timeout(t_imagebang *x) { - t_glist* glist = glist_getcanvas(x->glist); + t_glist* glist = glist_getcanvas(x->glist); + char key_a[MAXPDSTRING]; x->flashing = 0; - sys_vgui(".x%x.c itemconfigure %ximage -image %x_imagebang \n", glist, x,x->image_a); + sprintf(key_a, "%lx_a", (long unsigned int)x); + gui_vmess("gui_image_configure", "xxss", + glist_getcanvas(x->glist), + x, + key_a, + "nw"); + x->flashing = 1; + //sys_vgui(".x%x.c itemconfigure %ximage -image %x_imagebang \n", + // glist, x,x->image_a); } static void imagebang_brk_timeout(t_imagebang *x) { - t_glist* glist = glist_getcanvas(x->glist); + t_glist* glist = glist_getcanvas(x->glist); + char key_b[MAXPDSTRING]; x->flashing = 1; - sys_vgui(".x%x.c itemconfigure %ximage -image %x_imagebang \n", glist, x,x->image_b); - + //sys_vgui(".x%x.c itemconfigure %ximage -image %x_imagebang \n", + // glist, x,x->image_b); + sprintf(key_b, "%lx_b", (long unsigned int)x); + gui_vmess("gui_image_configure", "xxss", + glist_getcanvas(x->glist), + x, + key_b, + "nw"); } /* widget helper functions */ static const char* imagebang_get_filename(t_imagebang *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 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 imagebang_click(t_imagebang *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) imagebang_bang(x); - return (1); + //DEBUG(post("x:%i y:%i dbl:%i doit:%i",xpos,ypos,dbl,doit);) + if (doit) imagebang_bang(x); + return (1); } -static void imagebang_drawme(t_imagebang *x, t_glist *glist, int firsttime) { - if (firsttime) { - DEBUG(post("Rendering: \n %x_imagebang:%s \n %x_imagebang:%s",x->image_a,x->image_a->s_name,x->image_b,x->image_b->s_name);) - - sys_vgui(".x%x.c create image %d %d -anchor nw -image %x_imagebang -disabledimage %x_imagebang -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_imagebang] [image height %x_imagebang] \\;]\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)); - } +static void imagebang_drawme(t_imagebang *x, t_glist *glist, int firsttime) +{ + if (firsttime) + { + char key_a[MAXPDSTRING]; + char key_b[MAXPDSTRING]; + //DEBUG(post("Rendering: \n %x_imagebang:%s \n %x_imagebang:%s",x->image_a,x->image_a->s_name,x->image_b,x->image_b->s_name);) + + //sys_vgui(".x%x.c create image %d %d -anchor nw -image %x_imagebang -disabledimage %x_imagebang -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_imagebang] [image height %x_imagebang] \\;]\n",x->receive->s_name,x->image_a,x->image_a); + + gui_vmess("gui_gobj_new", "xxsiii", + glist_getcanvas(glist), + x, + "obj", + text_xpix(&x->x_obj, glist), + text_ypix(&x->x_obj, glist), + glist_istoplevel(glist)); + sprintf(key_a, "%lx_a", (long unsigned int)x); + gui_vmess("gui_gobj_draw_image", "xxss", + glist_getcanvas(glist), + x, + key_a, + "nw"); + gui_vmess("gui_image_size_callback", "xss", + glist_getcanvas(glist), key_a, x->receive->s_name); + } + 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)); + gui_vmess("gui_image_coords", "xxii", + glist_getcanvas(glist), + x, + text_xpix(&x->x_obj, glist), + text_ypix(&x->x_obj, glist)); + } } void imagebang_erase(t_imagebang* x,t_glist* glist) { - int n; - sys_vgui(".x%x.c delete %ximage\n", - glist_getcanvas(glist), x); - + int n; + sys_vgui(".x%x.c delete %ximage\n", + glist_getcanvas(glist), x); + gui_vmess("gui_gobj_erase", "xx", glist_getcanvas(glist), x); } @@ -140,7 +199,7 @@ static void imagebang_getrect(t_gobj *z, t_glist *glist, *yp1 = text_ypix(&x->x_obj, glist); *xp2 = text_xpix(&x->x_obj, glist) + width; *yp2 = text_ypix(&x->x_obj, glist) + height; - //fprintf(stderr,"%d %d %d %d\n", *xp1, *yp1, *xp2, *yp2); + //fprintf(stderr,"%d %d %d %d\n", *xp1, *yp1, *xp2, *yp2); } static void imagebang_displace(t_gobj *z, t_glist *glist, @@ -149,31 +208,49 @@ static void imagebang_displace(t_gobj *z, t_glist *glist, t_imagebang *x = (t_imagebang *)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); + //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); imagebang_drawme(x, glist, 0); canvas_fixlinesfor(glist,(t_text*) x); } +static void imagebang_displace_wtag(t_gobj *z, t_glist *glist, + int dx, int dy) +{ + //fprintf(stderr,"image displace_wtag\n"); + t_imagebang *x = (t_imagebang *)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->x_width, text_ypix(&x->x_obj, glist) + x->x_height); + + imagebang_drawme(x, glist, 0);*/ + canvas_fixlinesfor(glist,(t_text*) x); +} + static void imagebang_select(t_gobj *z, t_glist *glist, int state) { - t_imagebang *x = (t_imagebang *)z; - if (state) { - sys_vgui(".x%x.c create rectangle \ - %d %d %d %d -tags %xSEL -outline $select_color\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); - } + t_imagebang *x = (t_imagebang *)z; + if (state) { + sys_vgui(".x%x.c create rectangle \ + %d %d %d %d -tags %xSEL -outline $select_color\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); + gui_vmess("gui_gobj_select", "xx", glist_getcanvas(glist), x); + } + else { + sys_vgui(".x%x.c delete %xSEL\n", + glist_getcanvas(glist), x); + gui_vmess("gui_gobj_deselect", "xx", glist_getcanvas(glist), x); + } } static void imagebang_activate(t_gobj *z, t_glist *glist, int state) @@ -193,10 +270,10 @@ static void imagebang_delete(t_gobj *z, t_glist *glist) static void imagebang_vis(t_gobj *z, t_glist *glist, int vis) { t_imagebang* s = (t_imagebang*)z; - if (vis) - imagebang_drawme(s, glist, 1); - else - imagebang_erase(s,glist); + if (vis) + imagebang_drawme(s, glist, 1); + else + imagebang_erase(s,glist); } static void imagebang_size(t_imagebang* x,t_floatarg w,t_floatarg h) { @@ -205,15 +282,17 @@ static void imagebang_size(t_imagebang* x,t_floatarg w,t_floatarg h) { } static void imagebang_imagesize_callback(t_imagebang *x, t_float w, t_float h) { - DEBUG(post("received w %f h %f",w,h);) - x->width = w; - x->height = h; - canvas_fixlinesfor(x->glist,(t_text*) x); + DEBUG(post("received w %f h %f",w,h);) + post("received w %f h %f",w,h); + x->width = w; + x->height = h; + canvas_fixlinesfor(x->glist,(t_text*) x); } - + static void imagebang_free(t_imagebang *x) { - - // check first if variable has been unset and image is unused + char key_a[MAXPDSTRING]; + char key_b[MAXPDSTRING]; + // 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_imagebang] \\;]\n",x->image_b);) DEBUG(sys_vgui("pd [concat DEBUG a in use [image inuse %x_imagebang] \\;]\n",x->image_a);) @@ -224,118 +303,175 @@ static void imagebang_free(t_imagebang *x) { DEBUG(sys_vgui("pd [concat DEBUG b exists [info exists %x_imagebang] \\;]\n",x->image_b);) DEBUG(sys_vgui("pd [concat DEBUG a exists [info exists %x_imagebang] \\;]\n",x->image_a);) + sprintf(key_a, "%lx_a", (long unsigned int)x); + sprintf(key_b, "%lx_b", (long unsigned int)x); + gui_vmess("gui_drawimage_free", "s", key_a); + gui_vmess("gui_drawimage_free", "s", key_b); if (x->receive) { - pd_unbind(&x->x_obj.ob_pd,x->receive); - } - clock_free(x->clock_flash); - clock_free(x->clock_brk); + pd_unbind(&x->x_obj.ob_pd,x->receive); + } + clock_free(x->clock_flash); + clock_free(x->clock_brk); } - + static void *imagebang_new(t_symbol *s, int argc, t_atom *argv) { t_imagebang *x = (t_imagebang *)pd_new(imagebang_class); - + char key_a[MAXPDSTRING]; + char key_b[MAXPDSTRING]; + t_atom sane_defaults[2]; + if (!argc) + { + post("imagebang: warning: no arguments provided: setting defaults to " + "[imagebang dummy dummy]"); + SETSYMBOL(sane_defaults, gensym("dummy")); + SETSYMBOL(sane_defaults+1, gensym("dummy")); + argc = 2; + argv = sane_defaults; + } 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 = imagebang_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_imagebang] == 0 } { image create photo %x_imagebang -file \"%s\"\n set %x_imagebang 1\n} \n",x->image_a,x->image_a,fname,x->image_a); - //sys_vgui("pd [concat test %x_imagebang \\;]\n",x->image_a); - } else { - post("Oops... [imagebang] could not find \"%s\"",image_a->s_name); - } - } - - if ( argc > 1 && (argv+1)->a_type == A_SYMBOL ) { - image_b= atom_getsymbol(argv+1); - fname = imagebang_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_imagebang] == 0} { image create photo %x_imagebang -file \"%s\"\n set %x_imagebang 1\n} \n",x->image_b,x->image_b,fname,x->image_b); - //sys_vgui("pd [concat test %x_imagebang \\;]\n",x->image_b); - } else { - post("Oops... [imagebang] could not find \"%s\"",image_b->s_name); - } - } - - // Stop if no images - if (x->image_a == NULL || x->image_b == NULL) { - post("Could not create [imagebang]... either no gif images defined or found!"); - return NULL; - } - - x->send = NULL; - if ( argc > 2 && (argv+2)->a_type == A_SYMBOL ) { - x->send = atom_getsymbol(argv+2); - } - - if ( argc > 3 && (argv+3)->a_type == A_SYMBOL ) { - x->receive = atom_getsymbol(argv+3); - } else { - // Create default receiver if none set - char buf[MAXPDSTRING]; - sprintf(buf, "#%lx", (long)x); - x->receive = gensym(buf); - } - + + 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); + sprintf(key_a, "%lx_a", (long unsigned int)x); + + // Get image file path + fname = imagebang_get_filename(x,image_a->s_name); + 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_imagebang] == 0 } " + // "{ image create photo %x_imagebang " + // "-file \"%s\"\n set %x_imagebang 1\n} \n", + // x->image_a,x->image_a,fname,x->image_a); + //sys_vgui("pd [concat test %x_imagebang \\;]\n",x->image_a); + gui_vmess("gui_load_image", "xss", + canvas_getcurrent(), + key_a, + fname); + } + else + { + x->image_a = &s_; + pd_error(x, "could not find image \"%s\": using default image", + image_a->s_name); + gui_vmess("gui_load_default_image", "xs", + canvas_getcurrent(), + key_a); + } + } + if ( argc > 1 && (argv+1)->a_type == A_SYMBOL ) + { + image_b= atom_getsymbol(argv+1); + sprintf(key_b, "%lx_b", (long unsigned int)x); + + // Get image file path + fname = imagebang_get_filename(x,image_b->s_name); + if (fname) + { + x->image_b = gensym(fname); + //sys_vgui("set %x_b \"%s\" \n",x,fname); + //sys_vgui("if { [info exists %x_imagebang] == 0} " + // "{ image create photo %x_imagebang " + // "-file \"%s\"\n set %x_imagebang 1\n} \n", + // x->image_b,x->image_b,fname,x->image_b); + //sys_vgui("pd [concat test %x_imagebang \\;]\n",x->image_b); + gui_vmess("gui_load_image", "xss", + canvas_getcurrent(), + key_b, + fname); + } + else + { + x->image_b = &s_; + pd_error(x, "could not find image \"%s\": using default image", + image_b->s_name); + gui_vmess("gui_load_default_image", "xs", + canvas_getcurrent(), + key_b); + } + } + + // Stop if no images + //if ( x->image_a == NULL || x->image_b == NULL) + //{ + // post("Could not create [imagebang]... " + // "either no gif images defined or found!"); + // return NULL; + //} + + x->send = NULL; + if ( argc > 2 && (argv+2)->a_type == A_SYMBOL ) + { + x->send = atom_getsymbol(argv+2); + } + + if ( argc > 3 && (argv+3)->a_type == A_SYMBOL ) + { + x->receive = atom_getsymbol(argv+3); + } + else + { + // Create default receiver if none set + 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)imagebang_flash_timeout); - x->clock_brk = clock_new(x, (t_method)imagebang_brk_timeout); - x->outlet = outlet_new(&x->x_obj, &s_float); - return (x); - + + x->clock_flash = clock_new(x, (t_method)imagebang_flash_timeout); + x->clock_brk = clock_new(x, (t_method)imagebang_brk_timeout); + x->outlet = outlet_new(&x->x_obj, &s_float); + return (x); } void imagebang_setup(void) { imagebang_class = class_new(gensym("imagebang"), - (t_newmethod)imagebang_new, (t_method)imagebang_free, - sizeof(t_imagebang),0, A_GIMME,0); + (t_newmethod)imagebang_new, (t_method)imagebang_free, + sizeof(t_imagebang),0, A_GIMME,0); - class_addmethod(imagebang_class, (t_method)imagebang_imagesize_callback,\ - gensym("_imagesize"), A_DEFFLOAT, A_DEFFLOAT, 0); + class_addmethod(imagebang_class, (t_method)imagebang_imagesize_callback, + gensym("_imagesize"), A_DEFFLOAT, A_DEFFLOAT, 0); class_addbang(imagebang_class,(t_method)imagebang_bang); - imagebang_widgetbehavior.w_getrectfn = imagebang_getrect; - imagebang_widgetbehavior.w_displacefn = imagebang_displace; - imagebang_widgetbehavior.w_selectfn = imagebang_select; - imagebang_widgetbehavior.w_activatefn = imagebang_activate; - imagebang_widgetbehavior.w_deletefn = imagebang_delete; - imagebang_widgetbehavior.w_visfn = imagebang_vis; + imagebang_widgetbehavior.w_getrectfn = imagebang_getrect; + imagebang_widgetbehavior.w_displacefn = imagebang_displace; + imagebang_widgetbehavior.w_selectfn = imagebang_select; + imagebang_widgetbehavior.w_activatefn = imagebang_activate; + imagebang_widgetbehavior.w_deletefn = imagebang_delete; + imagebang_widgetbehavior.w_visfn = imagebang_vis; + imagebang_widgetbehavior.w_displacefnwtag = imagebang_displace_wtag; imagebang_widgetbehavior.w_clickfn = (t_clickfn)imagebang_click; #if PD_MINOR_VERSION < 37 - imagebang_widgetbehavior.w_propertiesfn = NULL; + imagebang_widgetbehavior.w_propertiesfn = NULL; //imagebang_widgetbehavior.w_savefn = imagebang_save; #endif diff --git a/pd/nw/pdgui.js b/pd/nw/pdgui.js index aa9c5161b6fb40069bd3decf021dfb02da9b1ce8..ca8f870bc8c93b473f0302f3de832fad7a558937 100644 --- a/pd/nw/pdgui.js +++ b/pd/nw/pdgui.js @@ -3459,6 +3459,7 @@ function gui_drawnumber_vis(cid, parent_tag, tag, x, y, scale_x, scale_y, // to cache image data for image-handling classes: // ggee/image // moonlib/image (for backwards compatibility only: its API is inherently leaky) +// tof/imagebang // draw sprite // draw image var pd_cache = (function() { @@ -3658,8 +3659,10 @@ function gui_load_image(cid, key, filepath) { }); } -// Draw an image in an object-- used for ggee/image and -// moonlib/image. For the meaning of tk_anchor see img_size_setter. +// Draw an image in an object-- used for ggee/image, moonlib/image and +// tof/imagebang. For the meaning of tk_anchor see img_size_setter. This +// interface assumes there is only one image per gobject. If you try to +// set more you'll get duplicate ids. function gui_gobj_draw_image(cid, tag, image_key, tk_anchor) { var g = get_gobj(cid, tag), i = create_item(cid, "image", {