From 405e980e4e1e109cc7dc2264981765b0f1f5bdd0 Mon Sep 17 00:00:00 2001 From: musil Date: Thu, 30 Jun 2011 11:59:31 +0000 Subject: use _close instead of close since VSC 7.0 svn path=/trunk/externals/iem/iemgui/; revision=15126 --- src/iem_image.c | 886 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 445 insertions(+), 441 deletions(-) (limited to 'src/iem_image.c') diff --git a/src/iem_image.c b/src/iem_image.c index ac2c652..66a2258 100644 --- a/src/iem_image.c +++ b/src/iem_image.c @@ -1,441 +1,445 @@ -/* For information on usage and redistribution, and for a DISCLAIMER OF ALL -* WARRANTIES, see the file, "LICENSE.txt," in this distribution. - -iemgui written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */ - -#include "m_pd.h" -#include "iemlib.h" -#include "g_canvas.h" -#include "g_all_guis.h" -#include -#include - -#ifdef MSW -#include -#else -#include -#endif - -/* ------------------------ setup routine ------------------------- */ - -t_widgetbehavior iem_image_widgetbehavior; -static t_class *iem_image_class; - -typedef struct _iem_image -{ - t_iemgui x_gui; - t_symbol *x_gifsym; - t_atom x_at_out[2]; - int x_have_image; -} t_iem_image; - -static t_symbol *iem_image_calc_size(t_iem_image *x) -{ - char dirbuf[MAXPDSTRING], *namebufptr; - char namebuf[MAXPDSTRING]; - unsigned char buf[222]; - unsigned int i; - char *c; - int fd; - FILE *fh; - size_t items; - - if(!x->x_gifsym || !x->x_gifsym->s_name) - { - post("iem_image-ERROR: no gifname"); - x->x_gifsym = (t_symbol *)0; - return((t_symbol *)0); - } - fd = open_via_path(canvas_getdir(glist_getcanvas(x->x_gui.x_glist))->s_name, x->x_gifsym->s_name, - "", dirbuf, &namebufptr, MAXPDSTRING, 1); - if (fd < 0) - { - post("iem_image-ERROR: cannot open %s first time", x->x_gifsym->s_name); - x->x_gifsym = (t_symbol *)0; - return((t_symbol *)0); - } - else - { - if(fd >= 0) - close(fd); - strcpy(namebuf, dirbuf); - strcat(namebuf, "/"); - strcat(namebuf, namebufptr); - fh = fopen(namebuf, "r"); - if(fh == NULL) - { - post("iem_image-ERROR: cannot open %s second time", namebuf); - x->x_gifsym = (t_symbol *)0; - return((t_symbol *)0); - } - else - { - items=fread(buf, 22, sizeof(unsigned char), fh); - if((items < 1)||(strlen((char*)buf)<7)) { - post("iem_image-ERROR: can not read header in %s, only %d items read: %s.", namebuf, strlen((char*)buf), (char*) buf); - x->x_gifsym = (t_symbol *)0; - return((t_symbol *)0); - }; - fclose(fh); - c = (char *)buf; - if((c[0] != 'G')||(c[1] != 'I')||(c[2] != 'F')) - { - post("iem_image-ERROR: %s is not a GIF-file", namebuf); - x->x_gifsym = (t_symbol *)0; - return((t_symbol *)0); - } - i = 256*(unsigned int)buf[7]; - i += (unsigned int)buf[6]; - x->x_gui.x_w = (int)i; - i = 256*(unsigned int)buf[9]; - i += (unsigned int)buf[8]; - x->x_gui.x_h = (int)i; - SETFLOAT(x->x_at_out, (t_float)x->x_gui.x_w); - SETFLOAT(x->x_at_out+1, (t_float)x->x_gui.x_h); - outlet_list(x->x_gui.x_obj.ob_outlet, &s_list, 2, x->x_at_out); - if(x->x_gui.x_fsf.x_snd_able && x->x_gui.x_snd->s_thing) - pd_list(x->x_gui.x_snd->s_thing, &s_list, 2, x->x_at_out); - return(gensym(namebuf)); - } - } -} - -static void iem_image_draw_new(t_iem_image *x, t_glist *glist) -{ - 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); - t_symbol *correct_name; - - if(correct_name = iem_image_calc_size(x)) - { - sys_vgui("image create photo %xPHOTOIMAGE -file {%s} -format gif -width %d -height %d\n", - x, correct_name->s_name, x->x_gui.x_w, x->x_gui.x_h); - sys_vgui(".x%x.c create image %d %d -image %xPHOTOIMAGE -tags %xPHOTO\n", - canvas, xpos+x->x_gui.x_w/2, ypos+x->x_gui.x_h/2, x, x); - - x->x_have_image=1; - } - - if(x->x_gui.x_fsf.x_selected) - sys_vgui(".x%x.c create rectangle %d %d %d %d -outline #%6.6x -tags %xBASE\n", - canvas, xpos, ypos, xpos + x->x_gui.x_w, ypos + x->x_gui.x_h, IEM_GUI_COLOR_SELECTED, x); -} - -static void iem_image_draw_move(t_iem_image *x, t_glist *glist) -{ - 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(x->x_have_image) - sys_vgui(".x%x.c coords %xPHOTO %d %d\n", canvas, x, xpos+x->x_gui.x_w/2, ypos+x->x_gui.x_h/2); - if(x->x_gui.x_fsf.x_selected) - sys_vgui(".x%x.c coords %xBASE %d %d %d %d\n", - canvas, x, xpos, ypos, xpos + x->x_gui.x_w, ypos + x->x_gui.x_h); - canvas_fixlinesfor(glist_getcanvas(x->x_gui.x_glist), (t_text*)x); -} - -static void iem_image_draw_erase(t_iem_image* x, t_glist* glist) -{ - t_canvas *canvas=glist_getcanvas(glist); - - if(x->x_gui.x_fsf.x_selected) - sys_vgui(".x%x.c delete %xBASE\n", canvas, x); - if(x->x_have_image) - { - sys_vgui("image delete %xPHOTOIMAGE\n", x); - sys_vgui(".x%x.c delete %xPHOTO\n", canvas, x); - x->x_have_image=0; - } -} - -static void iem_image_draw_select(t_iem_image* x, t_glist* glist) -{ - t_canvas *canvas=glist_getcanvas(glist); - - if(x->x_gui.x_fsf.x_selected) - { - int xpos=text_xpix(&x->x_gui.x_obj, glist); - int ypos=text_ypix(&x->x_gui.x_obj, glist); - - sys_vgui(".x%x.c create rectangle %d %d %d %d -outline #%6.6x -tags %xBASE\n", - canvas, xpos, ypos, xpos + x->x_gui.x_w, - ypos + x->x_gui.x_h, IEM_GUI_COLOR_SELECTED, x); - } - else - sys_vgui(".x%x.c delete %xBASE\n", canvas, x); -} - -static void iem_image_draw(t_iem_image *x, t_glist *glist, int mode) -{ - if(mode == IEM_GUI_DRAW_MODE_MOVE) - iem_image_draw_move(x, glist); - else if(mode == IEM_GUI_DRAW_MODE_NEW) - iem_image_draw_new(x, glist); - else if(mode == IEM_GUI_DRAW_MODE_SELECT) - iem_image_draw_select(x, glist); - else if(mode == IEM_GUI_DRAW_MODE_ERASE) - iem_image_draw_erase(x, glist); -} - -/* ------------------------ cnv widgetbehaviour----------------------------- */ - -static void iem_image_getrect(t_gobj *z, t_glist *glist, int *xp1, int *yp1, int *xp2, int *yp2) -{ - t_iem_image *x = (t_iem_image *)z; - - *xp1 = text_xpix(&x->x_gui.x_obj, glist); - *yp1 = text_ypix(&x->x_gui.x_obj, glist); - *xp2 = *xp1 + x->x_gui.x_w; - *yp2 = *yp1 + x->x_gui.x_h; -} - -#if defined(PD_MAJOR_VERSION) && (PD_MINOR_VERSION >= 37) -static void iem_image_save(t_gobj *z, t_binbuf *b) -{ - t_iem_image *x = (t_iem_image *)z; - t_symbol *srl[3]; - - srl[0] = x->x_gui.x_snd; - srl[1] = x->x_gui.x_rcv; - srl[2] = gensym("empty"); - if(x->x_gifsym) - binbuf_addv(b, "ssiissiiss", 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_gifsym, iem_symargstoint(&x->x_gui.x_isa), - iem_fstyletoint(&x->x_gui.x_fsf), srl[0], srl[1]); - else - binbuf_addv(b, "ssiisiiiss", 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)), - 0, iem_symargstoint(&x->x_gui.x_isa), - iem_fstyletoint(&x->x_gui.x_fsf), srl[0], srl[1]); - binbuf_addv(b, ";"); -} -#else -static void iem_image_save(t_gobj *z, t_binbuf *b) -{ - t_iem_image *x = (t_iem_image *)z; - int *ip1, *ip2; - t_symbol *srl[3]; - - srl[0] = x->x_gui.x_snd; - srl[1] = x->x_gui.x_rcv; - srl[2] = gensym("empty"); - iemgui_all_unique2dollarzero(&x->x_gui, srl); - iemgui_all_sym2dollararg(&x->x_gui, srl); - ip1 = (int *)(&x->x_gui.x_isa); - ip2 = (int *)(&x->x_gui.x_fsf); - if(x->x_gifsym) - binbuf_addv(b, "ssiissiiss", 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_gifsym, (*ip1)&IEM_INIT_ARGS_ALL, - (*ip2)&IEM_FSTYLE_FLAGS_ALL, srl[0], srl[1]); - else - binbuf_addv(b, "ssiisiiiss", 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)), - 0, (*ip1)&IEM_INIT_ARGS_ALL, - (*ip2)&IEM_FSTYLE_FLAGS_ALL, srl[0], srl[1]); - binbuf_addv(b, ";"); -} -#endif - -static void iem_image_clear(t_iem_image *x) -{ - (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_ERASE); - x->x_gifsym = (t_symbol *)0; -} - -static void iem_image_open(t_iem_image *x, t_symbol *name) -{ - if(name && name->s_name) - { - if(x->x_gifsym) - { - (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_ERASE); - x->x_gifsym = (t_symbol *)0; - } - x->x_gifsym = name; - (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_NEW); - } -} - -static void iem_image_delta(t_iem_image *x, t_symbol *s, int ac, t_atom *av) -{iemgui_delta((void *)x, &x->x_gui, s, ac, av);} - -static void iem_image_pos(t_iem_image *x, t_symbol *s, int ac, t_atom *av) -{iemgui_pos((void *)x, &x->x_gui, s, ac, av);} - -static void iem_image_send(t_iem_image *x, t_symbol *s) -{iemgui_send(x, &x->x_gui, s);} - -static void iem_image_receive(t_iem_image *x, t_symbol *s) -{iemgui_receive(x, &x->x_gui, s);} - -#if defined(PD_MAJOR_VERSION) && (PD_MINOR_VERSION >= 37) -static void *iem_image_new(t_symbol *s, int argc, t_atom *argv) -{ - t_iem_image *x = (t_iem_image *)pd_new(iem_image_class); - t_symbol *gifsym=(t_symbol *)0; - x->x_gui.x_snd = gensym("empty"); - x->x_gui.x_rcv = gensym("empty"); - x->x_gui.x_lab = gensym("empty"); - x->x_gui.x_fsf.x_font_style = 0; - if(argc >= 1) - { - if(IS_A_SYMBOL(argv,0)) - gifsym = atom_getsymbolarg(0, argc, argv); - else if(IS_A_FLOAT(argv,0)) - gifsym = (t_symbol *)0; - } - else if(argc >= 5) - { - if(IS_A_SYMBOL(argv,0)) - gifsym = atom_getsymbolarg(0, argc, argv); - else if(IS_A_FLOAT(argv,0)) - gifsym = (t_symbol *)0; - iem_inttosymargs(&x->x_gui.x_isa, atom_getintarg(1, argc, argv)); - iem_inttofstyle(&x->x_gui.x_fsf, atom_getintarg(2, argc, argv)); - iemgui_new_getnames(&x->x_gui, 3, argv); - } - - x->x_gui.x_draw = (t_iemfunptr)iem_image_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(!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_rcv_able) - pd_bind(&x->x_gui.x_obj.ob_pd, x->x_gui.x_rcv); - x->x_gui.x_w = 100; - x->x_gui.x_h = 60; - x->x_gifsym = gifsym; - x->x_have_image=0; - x->x_gui.x_fsf.x_selected = 0; - iemgui_verify_snd_ne_rcv(&x->x_gui); - outlet_new(&x->x_gui.x_obj, &s_list); - return(x); -} -#else -static void *iem_image_new(t_symbol *s, int argc, t_atom *argv) -{ - t_iem_image *x = (t_iem_image *)pd_new(iem_image_class); - t_symbol *gifsym=(t_symbol *)0; - t_int iinit=0, ifstyle=0; - t_iem_init_symargs *init=(t_iem_init_symargs *)(&iinit); - t_iem_fstyle_flags *fstyle=(t_iem_fstyle_flags *)(&ifstyle); - t_symbol *srl[3]; - char str[144]; - - x->x_gui.x_snd = gensym("empty"); - x->x_gui.x_rcv = gensym("empty"); - x->x_gui.x_lab = gensym("empty"); - srl[0] = gensym("empty"); - srl[1] = gensym("empty"); - srl[2] = gensym("empty"); - x->x_gui.x_fsf.x_font_style = 0; - if(argc >= 1) - { - if(IS_A_SYMBOL(argv,0)) - gifsym = atom_getsymbolarg(0, argc, argv); - else if(IS_A_FLOAT(argv,0)) - gifsym = (t_symbol *)0; - } - else if(argc >= 5) - { - if(IS_A_SYMBOL(argv,0)) - gifsym = atom_getsymbolarg(0, argc, argv); - else if(IS_A_FLOAT(argv,0)) - gifsym = (t_symbol *)0; - iinit = (int)atom_getintarg(1, argc, argv); - ifstyle = (int)atom_getintarg(2, argc, argv); - if(IS_A_SYMBOL(argv, 3)) - srl[0] = atom_getsymbolarg(3, argc, argv); - else if(IS_A_FLOAT(argv,3)) - { - sprintf(str, "%d", (int)atom_getintarg(3, argc, argv)); - srl[0] = gensym(str); - } - if(IS_A_SYMBOL(argv,4)) - srl[1] = atom_getsymbolarg(4, argc, argv); - else if(IS_A_FLOAT(argv,4)) - { - sprintf(str, "%d", (int)atom_getintarg(4, argc, argv)); - srl[1] = gensym(str); - } - } - - iinit &= IEM_INIT_ARGS_ALL; - ifstyle &= IEM_FSTYLE_FLAGS_ALL; - x->x_gui.x_draw = (t_iemfunptr)iem_image_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(); - fstyle->x_snd_able = 1; - fstyle->x_rcv_able = 1; - if(!strcmp(srl[0]->s_name, "empty")) - fstyle->x_snd_able = 0; - if(!strcmp(srl[1]->s_name, "empty")) - fstyle->x_rcv_able = 0; - x->x_gui.x_unique_num = 0; - x->x_gui.x_fsf = *fstyle; - x->x_gui.x_isa = *init; - iemgui_first_dollararg2sym(&x->x_gui, sr); - 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_w = 100; - x->x_gui.x_h = 60; - x->x_gifsym = gifsym; - x->x_gui.x_fsf.x_selected = 0; - iemgui_verify_snd_ne_rcv(&x->x_gui); - outlet_new(&x->x_gui.x_obj, &s_list); - return(x); -} -#endif - -static void iem_image_ff(t_iem_image *x) -{ - gfxstub_deleteforkey(x); -} - -void iem_image_setup(void) -{ - iem_image_class = class_new(gensym("iem_image"), (t_newmethod)iem_image_new, - (t_method)iem_image_ff, sizeof(t_iem_image), 0, A_GIMME, 0); - class_addmethod(iem_image_class, (t_method)iem_image_open, gensym("open"), A_SYMBOL, 0); - class_addmethod(iem_image_class, (t_method)iem_image_clear, gensym("clear"), 0); - class_addmethod(iem_image_class, (t_method)iem_image_delta, - gensym("delta"), A_GIMME, 0); - class_addmethod(iem_image_class, (t_method)iem_image_pos, - gensym("pos"), A_GIMME, 0); - class_addmethod(iem_image_class, (t_method)iem_image_send, - gensym("send"), A_DEFSYM, 0); - class_addmethod(iem_image_class, (t_method)iem_image_receive, - gensym("receive"), A_DEFSYM, 0); - - iem_image_widgetbehavior.w_getrectfn = iem_image_getrect; - iem_image_widgetbehavior.w_displacefn = iemgui_displace; - iem_image_widgetbehavior.w_selectfn = iemgui_select; - iem_image_widgetbehavior.w_activatefn = NULL; - iem_image_widgetbehavior.w_deletefn = iemgui_delete; - iem_image_widgetbehavior.w_visfn = iemgui_vis; - iem_image_widgetbehavior.w_clickfn = NULL; - -#if defined(PD_MAJOR_VERSION) && (PD_MINOR_VERSION >= 37) - class_setsavefn(iem_image_class, iem_image_save); -#else - iem_image_widgetbehavior.w_propertiesfn = NULL; - iem_image_widgetbehavior.w_savefn = iem_image_save; -#endif - - class_setwidget(iem_image_class, &iem_image_widgetbehavior); -// class_sethelpsymbol(iem_image_class, gensym("iemhelp2/help-iem_image")); - - // post("iem_image library loaded!"); -} +/* For information on usage and redistribution, and for a DISCLAIMER OF ALL +* WARRANTIES, see the file, "LICENSE.txt," in this distribution. + +iemgui written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */ + +#include "m_pd.h" +#include "iemlib.h" +#include "g_canvas.h" +#include "g_all_guis.h" +#include +#include + +#ifdef MSW +#include +#else +#include +#endif + +#if _MSC_VER >= 1300 /* since VSC 7.0 */ +#define close _close +#endif + +/* ------------------------ setup routine ------------------------- */ + +t_widgetbehavior iem_image_widgetbehavior; +static t_class *iem_image_class; + +typedef struct _iem_image +{ + t_iemgui x_gui; + t_symbol *x_gifsym; + t_atom x_at_out[2]; + int x_have_image; +} t_iem_image; + +static t_symbol *iem_image_calc_size(t_iem_image *x) +{ + char dirbuf[MAXPDSTRING], *namebufptr; + char namebuf[MAXPDSTRING]; + unsigned char buf[222]; + unsigned int i; + char *c; + int fd; + FILE *fh; + size_t items; + + if(!x->x_gifsym || !x->x_gifsym->s_name) + { + post("iem_image-ERROR: no gifname"); + x->x_gifsym = (t_symbol *)0; + return((t_symbol *)0); + } + fd = open_via_path(canvas_getdir(glist_getcanvas(x->x_gui.x_glist))->s_name, x->x_gifsym->s_name, + "", dirbuf, &namebufptr, MAXPDSTRING, 1); + if (fd < 0) + { + post("iem_image-ERROR: cannot open %s first time", x->x_gifsym->s_name); + x->x_gifsym = (t_symbol *)0; + return((t_symbol *)0); + } + else + { + if(fd >= 0) + close(fd); + strcpy(namebuf, dirbuf); + strcat(namebuf, "/"); + strcat(namebuf, namebufptr); + fh = fopen(namebuf, "r"); + if(fh == NULL) + { + post("iem_image-ERROR: cannot open %s second time", namebuf); + x->x_gifsym = (t_symbol *)0; + return((t_symbol *)0); + } + else + { + items=fread(buf, 22, sizeof(unsigned char), fh); + if((items < 1)||(strlen((char*)buf)<7)) { + post("iem_image-ERROR: can not read header in %s, only %d items read: %s.", namebuf, strlen((char*)buf), (char*) buf); + x->x_gifsym = (t_symbol *)0; + return((t_symbol *)0); + }; + fclose(fh); + c = (char *)buf; + if((c[0] != 'G')||(c[1] != 'I')||(c[2] != 'F')) + { + post("iem_image-ERROR: %s is not a GIF-file", namebuf); + x->x_gifsym = (t_symbol *)0; + return((t_symbol *)0); + } + i = 256*(unsigned int)buf[7]; + i += (unsigned int)buf[6]; + x->x_gui.x_w = (int)i; + i = 256*(unsigned int)buf[9]; + i += (unsigned int)buf[8]; + x->x_gui.x_h = (int)i; + SETFLOAT(x->x_at_out, (t_float)x->x_gui.x_w); + SETFLOAT(x->x_at_out+1, (t_float)x->x_gui.x_h); + outlet_list(x->x_gui.x_obj.ob_outlet, &s_list, 2, x->x_at_out); + if(x->x_gui.x_fsf.x_snd_able && x->x_gui.x_snd->s_thing) + pd_list(x->x_gui.x_snd->s_thing, &s_list, 2, x->x_at_out); + return(gensym(namebuf)); + } + } +} + +static void iem_image_draw_new(t_iem_image *x, t_glist *glist) +{ + 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); + t_symbol *correct_name; + + if(correct_name = iem_image_calc_size(x)) + { + sys_vgui("image create photo %xPHOTOIMAGE -file {%s} -format gif -width %d -height %d\n", + x, correct_name->s_name, x->x_gui.x_w, x->x_gui.x_h); + sys_vgui(".x%x.c create image %d %d -image %xPHOTOIMAGE -tags %xPHOTO\n", + canvas, xpos+x->x_gui.x_w/2, ypos+x->x_gui.x_h/2, x, x); + + x->x_have_image=1; + } + + if(x->x_gui.x_fsf.x_selected) + sys_vgui(".x%x.c create rectangle %d %d %d %d -outline #%6.6x -tags %xBASE\n", + canvas, xpos, ypos, xpos + x->x_gui.x_w, ypos + x->x_gui.x_h, IEM_GUI_COLOR_SELECTED, x); +} + +static void iem_image_draw_move(t_iem_image *x, t_glist *glist) +{ + 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(x->x_have_image) + sys_vgui(".x%x.c coords %xPHOTO %d %d\n", canvas, x, xpos+x->x_gui.x_w/2, ypos+x->x_gui.x_h/2); + if(x->x_gui.x_fsf.x_selected) + sys_vgui(".x%x.c coords %xBASE %d %d %d %d\n", + canvas, x, xpos, ypos, xpos + x->x_gui.x_w, ypos + x->x_gui.x_h); + canvas_fixlinesfor(glist_getcanvas(x->x_gui.x_glist), (t_text*)x); +} + +static void iem_image_draw_erase(t_iem_image* x, t_glist* glist) +{ + t_canvas *canvas=glist_getcanvas(glist); + + if(x->x_gui.x_fsf.x_selected) + sys_vgui(".x%x.c delete %xBASE\n", canvas, x); + if(x->x_have_image) + { + sys_vgui("image delete %xPHOTOIMAGE\n", x); + sys_vgui(".x%x.c delete %xPHOTO\n", canvas, x); + x->x_have_image=0; + } +} + +static void iem_image_draw_select(t_iem_image* x, t_glist* glist) +{ + t_canvas *canvas=glist_getcanvas(glist); + + if(x->x_gui.x_fsf.x_selected) + { + int xpos=text_xpix(&x->x_gui.x_obj, glist); + int ypos=text_ypix(&x->x_gui.x_obj, glist); + + sys_vgui(".x%x.c create rectangle %d %d %d %d -outline #%6.6x -tags %xBASE\n", + canvas, xpos, ypos, xpos + x->x_gui.x_w, + ypos + x->x_gui.x_h, IEM_GUI_COLOR_SELECTED, x); + } + else + sys_vgui(".x%x.c delete %xBASE\n", canvas, x); +} + +static void iem_image_draw(t_iem_image *x, t_glist *glist, int mode) +{ + if(mode == IEM_GUI_DRAW_MODE_MOVE) + iem_image_draw_move(x, glist); + else if(mode == IEM_GUI_DRAW_MODE_NEW) + iem_image_draw_new(x, glist); + else if(mode == IEM_GUI_DRAW_MODE_SELECT) + iem_image_draw_select(x, glist); + else if(mode == IEM_GUI_DRAW_MODE_ERASE) + iem_image_draw_erase(x, glist); +} + +/* ------------------------ cnv widgetbehaviour----------------------------- */ + +static void iem_image_getrect(t_gobj *z, t_glist *glist, int *xp1, int *yp1, int *xp2, int *yp2) +{ + t_iem_image *x = (t_iem_image *)z; + + *xp1 = text_xpix(&x->x_gui.x_obj, glist); + *yp1 = text_ypix(&x->x_gui.x_obj, glist); + *xp2 = *xp1 + x->x_gui.x_w; + *yp2 = *yp1 + x->x_gui.x_h; +} + +#if defined(PD_MAJOR_VERSION) && (PD_MINOR_VERSION >= 37) +static void iem_image_save(t_gobj *z, t_binbuf *b) +{ + t_iem_image *x = (t_iem_image *)z; + t_symbol *srl[3]; + + srl[0] = x->x_gui.x_snd; + srl[1] = x->x_gui.x_rcv; + srl[2] = gensym("empty"); + if(x->x_gifsym) + binbuf_addv(b, "ssiissiiss", 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_gifsym, iem_symargstoint(&x->x_gui.x_isa), + iem_fstyletoint(&x->x_gui.x_fsf), srl[0], srl[1]); + else + binbuf_addv(b, "ssiisiiiss", 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)), + 0, iem_symargstoint(&x->x_gui.x_isa), + iem_fstyletoint(&x->x_gui.x_fsf), srl[0], srl[1]); + binbuf_addv(b, ";"); +} +#else +static void iem_image_save(t_gobj *z, t_binbuf *b) +{ + t_iem_image *x = (t_iem_image *)z; + int *ip1, *ip2; + t_symbol *srl[3]; + + srl[0] = x->x_gui.x_snd; + srl[1] = x->x_gui.x_rcv; + srl[2] = gensym("empty"); + iemgui_all_unique2dollarzero(&x->x_gui, srl); + iemgui_all_sym2dollararg(&x->x_gui, srl); + ip1 = (int *)(&x->x_gui.x_isa); + ip2 = (int *)(&x->x_gui.x_fsf); + if(x->x_gifsym) + binbuf_addv(b, "ssiissiiss", 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_gifsym, (*ip1)&IEM_INIT_ARGS_ALL, + (*ip2)&IEM_FSTYLE_FLAGS_ALL, srl[0], srl[1]); + else + binbuf_addv(b, "ssiisiiiss", 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)), + 0, (*ip1)&IEM_INIT_ARGS_ALL, + (*ip2)&IEM_FSTYLE_FLAGS_ALL, srl[0], srl[1]); + binbuf_addv(b, ";"); +} +#endif + +static void iem_image_clear(t_iem_image *x) +{ + (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_ERASE); + x->x_gifsym = (t_symbol *)0; +} + +static void iem_image_open(t_iem_image *x, t_symbol *name) +{ + if(name && name->s_name) + { + if(x->x_gifsym) + { + (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_ERASE); + x->x_gifsym = (t_symbol *)0; + } + x->x_gifsym = name; + (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_NEW); + } +} + +static void iem_image_delta(t_iem_image *x, t_symbol *s, int ac, t_atom *av) +{iemgui_delta((void *)x, &x->x_gui, s, ac, av);} + +static void iem_image_pos(t_iem_image *x, t_symbol *s, int ac, t_atom *av) +{iemgui_pos((void *)x, &x->x_gui, s, ac, av);} + +static void iem_image_send(t_iem_image *x, t_symbol *s) +{iemgui_send(x, &x->x_gui, s);} + +static void iem_image_receive(t_iem_image *x, t_symbol *s) +{iemgui_receive(x, &x->x_gui, s);} + +#if defined(PD_MAJOR_VERSION) && (PD_MINOR_VERSION >= 37) +static void *iem_image_new(t_symbol *s, int argc, t_atom *argv) +{ + t_iem_image *x = (t_iem_image *)pd_new(iem_image_class); + t_symbol *gifsym=(t_symbol *)0; + x->x_gui.x_snd = gensym("empty"); + x->x_gui.x_rcv = gensym("empty"); + x->x_gui.x_lab = gensym("empty"); + x->x_gui.x_fsf.x_font_style = 0; + if(argc >= 1) + { + if(IS_A_SYMBOL(argv,0)) + gifsym = atom_getsymbolarg(0, argc, argv); + else if(IS_A_FLOAT(argv,0)) + gifsym = (t_symbol *)0; + } + else if(argc >= 5) + { + if(IS_A_SYMBOL(argv,0)) + gifsym = atom_getsymbolarg(0, argc, argv); + else if(IS_A_FLOAT(argv,0)) + gifsym = (t_symbol *)0; + iem_inttosymargs(&x->x_gui.x_isa, atom_getintarg(1, argc, argv)); + iem_inttofstyle(&x->x_gui.x_fsf, atom_getintarg(2, argc, argv)); + iemgui_new_getnames(&x->x_gui, 3, argv); + } + + x->x_gui.x_draw = (t_iemfunptr)iem_image_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(!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_rcv_able) + pd_bind(&x->x_gui.x_obj.ob_pd, x->x_gui.x_rcv); + x->x_gui.x_w = 100; + x->x_gui.x_h = 60; + x->x_gifsym = gifsym; + x->x_have_image=0; + x->x_gui.x_fsf.x_selected = 0; + iemgui_verify_snd_ne_rcv(&x->x_gui); + outlet_new(&x->x_gui.x_obj, &s_list); + return(x); +} +#else +static void *iem_image_new(t_symbol *s, int argc, t_atom *argv) +{ + t_iem_image *x = (t_iem_image *)pd_new(iem_image_class); + t_symbol *gifsym=(t_symbol *)0; + t_int iinit=0, ifstyle=0; + t_iem_init_symargs *init=(t_iem_init_symargs *)(&iinit); + t_iem_fstyle_flags *fstyle=(t_iem_fstyle_flags *)(&ifstyle); + t_symbol *srl[3]; + char str[144]; + + x->x_gui.x_snd = gensym("empty"); + x->x_gui.x_rcv = gensym("empty"); + x->x_gui.x_lab = gensym("empty"); + srl[0] = gensym("empty"); + srl[1] = gensym("empty"); + srl[2] = gensym("empty"); + x->x_gui.x_fsf.x_font_style = 0; + if(argc >= 1) + { + if(IS_A_SYMBOL(argv,0)) + gifsym = atom_getsymbolarg(0, argc, argv); + else if(IS_A_FLOAT(argv,0)) + gifsym = (t_symbol *)0; + } + else if(argc >= 5) + { + if(IS_A_SYMBOL(argv,0)) + gifsym = atom_getsymbolarg(0, argc, argv); + else if(IS_A_FLOAT(argv,0)) + gifsym = (t_symbol *)0; + iinit = (int)atom_getintarg(1, argc, argv); + ifstyle = (int)atom_getintarg(2, argc, argv); + if(IS_A_SYMBOL(argv, 3)) + srl[0] = atom_getsymbolarg(3, argc, argv); + else if(IS_A_FLOAT(argv,3)) + { + sprintf(str, "%d", (int)atom_getintarg(3, argc, argv)); + srl[0] = gensym(str); + } + if(IS_A_SYMBOL(argv,4)) + srl[1] = atom_getsymbolarg(4, argc, argv); + else if(IS_A_FLOAT(argv,4)) + { + sprintf(str, "%d", (int)atom_getintarg(4, argc, argv)); + srl[1] = gensym(str); + } + } + + iinit &= IEM_INIT_ARGS_ALL; + ifstyle &= IEM_FSTYLE_FLAGS_ALL; + x->x_gui.x_draw = (t_iemfunptr)iem_image_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(); + fstyle->x_snd_able = 1; + fstyle->x_rcv_able = 1; + if(!strcmp(srl[0]->s_name, "empty")) + fstyle->x_snd_able = 0; + if(!strcmp(srl[1]->s_name, "empty")) + fstyle->x_rcv_able = 0; + x->x_gui.x_unique_num = 0; + x->x_gui.x_fsf = *fstyle; + x->x_gui.x_isa = *init; + iemgui_first_dollararg2sym(&x->x_gui, sr); + 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_w = 100; + x->x_gui.x_h = 60; + x->x_gifsym = gifsym; + x->x_gui.x_fsf.x_selected = 0; + iemgui_verify_snd_ne_rcv(&x->x_gui); + outlet_new(&x->x_gui.x_obj, &s_list); + return(x); +} +#endif + +static void iem_image_ff(t_iem_image *x) +{ + gfxstub_deleteforkey(x); +} + +void iem_image_setup(void) +{ + iem_image_class = class_new(gensym("iem_image"), (t_newmethod)iem_image_new, + (t_method)iem_image_ff, sizeof(t_iem_image), 0, A_GIMME, 0); + class_addmethod(iem_image_class, (t_method)iem_image_open, gensym("open"), A_SYMBOL, 0); + class_addmethod(iem_image_class, (t_method)iem_image_clear, gensym("clear"), 0); + class_addmethod(iem_image_class, (t_method)iem_image_delta, + gensym("delta"), A_GIMME, 0); + class_addmethod(iem_image_class, (t_method)iem_image_pos, + gensym("pos"), A_GIMME, 0); + class_addmethod(iem_image_class, (t_method)iem_image_send, + gensym("send"), A_DEFSYM, 0); + class_addmethod(iem_image_class, (t_method)iem_image_receive, + gensym("receive"), A_DEFSYM, 0); + + iem_image_widgetbehavior.w_getrectfn = iem_image_getrect; + iem_image_widgetbehavior.w_displacefn = iemgui_displace; + iem_image_widgetbehavior.w_selectfn = iemgui_select; + iem_image_widgetbehavior.w_activatefn = NULL; + iem_image_widgetbehavior.w_deletefn = iemgui_delete; + iem_image_widgetbehavior.w_visfn = iemgui_vis; + iem_image_widgetbehavior.w_clickfn = NULL; + +#if defined(PD_MAJOR_VERSION) && (PD_MINOR_VERSION >= 37) + class_setsavefn(iem_image_class, iem_image_save); +#else + iem_image_widgetbehavior.w_propertiesfn = NULL; + iem_image_widgetbehavior.w_savefn = iem_image_save; +#endif + + class_setwidget(iem_image_class, &iem_image_widgetbehavior); +// class_sethelpsymbol(iem_image_class, gensym("iemhelp2/help-iem_image")); + + // post("iem_image library loaded!"); +} -- cgit v1.2.1