From f0e14f2d5630c47d7ec5f6cf736f50962ded57c6 Mon Sep 17 00:00:00 2001 From: Ivica Ico Bukvic <ico@vt.edu> Date: Wed, 9 Oct 2013 21:12:10 -0400 Subject: [PATCH] improved ggee/image to have a default empty image and ensured that its layer ordering is preserved after loading a new image. Finally, made a check for valid images--if invalid format, the image reverts to default empty image included in the ggee. --- externals/Makefile | 1 + externals/ggee/gui/empty_image.png | Bin 0 -> 821 bytes externals/ggee/gui/empty_image.xcf | Bin 0 -> 2380 bytes externals/ggee/gui/image-help.pd | 11 ++- externals/ggee/gui/image.c | 103 ++++++++++++++--------------- 5 files changed, 56 insertions(+), 59 deletions(-) create mode 100644 externals/ggee/gui/empty_image.png create mode 100644 externals/ggee/gui/empty_image.xcf diff --git a/externals/Makefile b/externals/Makefile index 363cd61ef..383273ad7 100644 --- a/externals/Makefile +++ b/externals/Makefile @@ -682,6 +682,7 @@ ggee: ggee_install: make -C $(externals_src)/ggee DESTDIR="$(DESTDIR)" objectsdir="$(objectsdir)" install cp $(externals_src)/ggee/gui/logo100.gif $(DESTDIR)/$(objectsdir)/ggee + cp $(externals_src)/ggee/gui/empty_image.png $(DESTDIR)/$(objectsdir)/ggee ggee_clean: make -C $(externals_src)/ggee clean diff --git a/externals/ggee/gui/empty_image.png b/externals/ggee/gui/empty_image.png new file mode 100644 index 0000000000000000000000000000000000000000..c3d40f1a600c53af028ee00d1fb650063e28d584 GIT binary patch literal 821 zcmV-51Iqk~P)<h;3K|Lk000e1NJLTq000>P000>X1^@s6#OZ}&00001b5ch_0Itp) z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i*z^ z00$d_T>`%V000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}0007zNkl<Z zNXNaFFHf975XOHqdtl0UKw%*0R&Xd%f+=kUUjd7y3UKrblpxRqf#_NOG@%Izb*Kv# zjkr`GpNidg-`)2PN(J5Ivb*!n?#w(h^X%E~?yh*{(F54n*myMqCnqO3|6#O71X5fy z_$kX;oq8zA(%eqf0WZzD$3-JFi@ymjwE~N?8DMeiRv+jAxI2a+z+F*W@q`ctNJ+z^ zo}nnqI*r_rlEVpx9zY0z2|z?A1$TFMoL`)Cdwa{n!voXP)6CA!vig3N<>lpQqzE}X z(T(J}vHfMc+CM%%G8_&W4u_0>k68b({`V60;Fuyp2+S-O0l@tHJZo!fEG{lG^Ja## zi!%<s9RM)+KH$^G&$J+>JW4sC5iawXEu~yZ$iZ*~eBIwiW>~_oztqo0MxznIJvx|j zW9>y{B%#d0vqQjOFv$D4xj8)e3*bsQvFwYoNfloJPESucK0XFuYHEtj&CM7|qhp1? zqO7i@B*hw6gb5Qa1B>N)eSOX0;bAtgv$Mm({6hY229ny|@+y)*Tii|8r-%e*QGRrE zlp)yK+T!iocew#0Lnxw>lCDW`jiX=7@9*#PdSzvW5d7sV+%;ke&@NS7UjC@E)YMa# z)Vh+K6B731w0r9K7`jO;_51nY&#S9g)(BH{GBQ!RL&~1yNR%X&nAEH#SesDU9zxM? z$t@MlNT<5o!@s`~Pf^i0dZm%fp^08Pb&qj#^DBedWG<F(`!pbs6=y5%$`6pY9$7;% ziBdWqD`Dc~+re9DMJvG#5>Hu4^i}WFPk_drRZj+datSxhX5|4RRZmT8rGYl_hD=!Y z-kx}VOB{*|>qWgStIk^Km}U=PZ*T8a|E>H1!0ifKNn>vG00000NkvXXu0mjf!GLar literal 0 HcmV?d00001 diff --git a/externals/ggee/gui/empty_image.xcf b/externals/ggee/gui/empty_image.xcf new file mode 100644 index 0000000000000000000000000000000000000000..4b86d60f1d916394217a89dbad5b2a55da876056 GIT binary patch literal 2380 zcmcJPOK%%h6vusM#?GTJ+K`IwhOW|up(#aVgDRCp)ddKN6=H*HkDUR>F7`xC*q|%E z0Ba;Z1bhQP>{+0UUkXm#;QG<X@uQAsCin6`^B^e=OYWWXxM%L28UM~d$(b9E^{sSP z&zgB7hH)b_%CEv0gIj{l-~TQaBg1$driJl(nA5&x?0<lGDTl`<)5VPqqhMhjqnp=0 zC>bfs$mmZ@Yh8cv@WYSk&TIZwb0d{AlDU$Zp&E9x*h<;j&Kr8Um^U-G7FV*lbTMBn z=_`InmU53$`t7%F`{SHsHN15TM<1PYG`g?<cS1+E%8yfNvyjtQqj#aWeO@uFB{vJE zrJIHHx>2U{#cZ~0SpR$=oqn|xR9-$x9KykV0_|JT3ULue*omrg4=$#V!$`oWF%mW( z=Co@e%n|(4w1>t8Sd?EplV3WMUqMdKBBS@r!J;#f5NHoI|9!-uqn5E{CG)9mqlA** z(KlD9rr*4G6BM$=0@6=Xg|dFXn9oF|WZC@M&{x-@?gbnDYJlglxn<;u?7CU7s4?3< z=M)yHyqPM8>wKz^+k~X_n?@nIS*FK7N|lXd#w;0W%Pbc3yj4Q+-<m?BR@d&nvwHW{ zgyitWX4x{c+j`!}TJ*@`R&t}5G4RK;Wspdz@WjkO-e>hf)pf(nty}t?JEy;l%D!5n z-$bCoq5cpiQL6!5{qg0R`ZKM+i8bDiY$bNQ_WiDN^y_B;o{(dp|K-y+=GUccp=0in zl*bgmmGZZk8gssqa{3-x>U<>R@k3PHKcxJec6d_G$1cYdnF#G&dezx~4HxdG(qHCE z#mz#7ZvCISqvz8&Pj`{-aa;S{-*x(#Dr!$(u4!Xh-{9A6<{PtTJ2vKyy<oE)hAOkY zie0f6?Qz9Mv^lTVsx_tdoC2<B);Mpd4N-5z8*aVPs5e-{sW<AJ?=J5$?lkwBxU{C& zYqF-Z*WAO!_88Y%qx}}m(6N1`#rWcZczUpKfVa1uXKk8uZSkzFwHcpuJDqM|-FVmQ zbUR(v#dG@8UccAx_uyHN^+m7G`d*Lo!{tN9)d4$7z_fvLG#GF`QbyXaJsQ#+j^GhE zpNz*7%<)8<%*GQ+Cu{;PQ^u8<aAxt@3uiWS0%J4Ah3myVIMrjW2E+FXaUv4JJ3*Ke zjK`%AQk63yg~X*wJWk%=r@%d84bEUKc5KCVefSE%dv>K_$8Axu=WHhc&#J5@sx?+) zRfQ6@<^Vsy#~ZA!HIzCcU)U9Y?keQs1Rk6*<4xCZfYO{`$$7w>wPr!G&-UZMevz=x z0sFP~Uj&_VkS5kNg9{n!I9<*GTP5a1969SB`}{-T*9VNBfU7zh6XbyMaKuLLa0Jl6 zI%X3=q~U^<H|BhLbt;ah48YZyOPs+xhz#60_dHi|;V5WCUh%+~n9q|_L0l!`EWnN| z@d|N;K+oGA>0CwN9Q;8UB@()7_ba6FS~W0V<h3dh_Xzc6(zrqz52dX(p<}`tNZi*o z<W7uPi|w<P2$EqW@_o(^o*pa#vqGZwU4k-|<n8kgsB0weZb#`bKJ~RttXZG+v{TsX zp?H3H#h17^8mI#}g<KpBc;V}t<UM3VmjW7ai~y~VCzsFzEtEGv`?MiyhfJGIu?BCK i5c@J813E2T&QAo36z&UM0d|FmUy##4=$y-C$oy}@qX;<w literal 0 HcmV?d00001 diff --git a/externals/ggee/gui/image-help.pd b/externals/ggee/gui/image-help.pd index cfc53152d..daa8666df 100644 --- a/externals/ggee/gui/image-help.pd +++ b/externals/ggee/gui/image-help.pd @@ -1,6 +1,5 @@ #N canvas 0 26 462 618 10; -#X obj 74 489 ggee/image @pd_extra/ggee/logo100.gif -; +#X obj 74 489 ggee/image @pd_extra/ggee/logo100.gif 0; #X text 26 12 Incorporate images. This is instantiated with; #X text 26 25 [image logo100.gif]; #X msg 40 395 open \$1; @@ -18,19 +17,19 @@ Wilkes for Pd version 0.42.; image; #X text 12 65 INLET_0 open gopspill; #X restore 405 590 pd META; -#X obj 162 490 ggee/image @pd_extra/ggee/logo100.gif; +#X obj 162 490 ggee/image @pd_extra/ggee/logo100.gif 1; #X obj 155 348 loadbang; #X msg 155 371 1; #X msg 155 395 gopspill \$1; -#X floatatom 184 371 5 0 0 0 - - -; -#X obj 252 448 ggee/image ; +#X floatatom 184 371 5 0 0 0 - - -, f 5; +#X obj 257 448 ggee/image @pd_extra/ggee/empty_image.png 0; #X msg 245 395 open \$1; #X obj 245 351 bng 15 250 50 0 empty empty empty 0 -6 0 10 -4034 -1 -1; #X obj 245 372 openpanel; #X text 26 48 [image] works with .gif \, .ppm \, .pgm and .png image formats only.; -#X text 263 425 this is how an empty imagelooks like when createdwithout +#X text 274 425 this is how an empty imagelooks like when createdwithout any parameters; #X text 27 83 Pd-L2Ork version of [image] also has a special feature that allows its reported rectangle to be smaller \, so it can be used diff --git a/externals/ggee/gui/image.c b/externals/ggee/gui/image.c index d0ae1ba27..ba0d7b2c8 100644 --- a/externals/ggee/gui/image.c +++ b/externals/ggee/gui/image.c @@ -22,73 +22,58 @@ typedef struct _image int x_img_width; int x_img_height; int x_gop_spill; - t_symbol* x_fname; - t_symbol* receive; + t_symbol* x_fname; + t_symbol* x_receive; + int x_selected; //t_symbol* send; } t_image; /* widget helper functions */ +static void image_select(t_gobj *z, t_glist *glist, int state); void image_doopen(t_image* x) { - t_glist *glist = glist_getcanvas(x->x_glist); - if (strlen(x->x_fname->s_name) != 0) { - char fname[FILENAME_MAX]; - canvas_makefilename(glist_getcanvas(x->x_glist), x->x_fname->s_name, - fname, FILENAME_MAX); - //fprintf(stderr,"post @ cooked name <%s>\n", fname); - sys_vgui(".x%x.c create rectangle \ - %d %d %d %d -tags %xMT -outline black -fill gray\n", - glist, - text_xpix(&x->x_obj, x->x_glist) - x->x_width/2, - text_ypix(&x->x_obj, x->x_glist) - x->x_height/2, - text_xpix(&x->x_obj, x->x_glist) + x->x_width/2, - text_ypix(&x->x_obj, x->x_glist) + x->x_height/2, x); - sys_vgui("catch {image delete $img%x}\n", x); - sys_vgui("set img%x [image create photo -file {%s}]\n", x, fname); - sys_vgui(".x%x.c itemconfigure %xS -image $img%x\n", - glist, x, x); - sys_vgui("pd [concat %s _imagesize [image width $img%x] [image height $img%x] \\;]\n",x->receive->s_name, x, x); - } - else { - sys_vgui(".x%x.c create rectangle \ - %d %d %d %d -tags %xMT -outline black -fill gray\n", - glist, - text_xpix(&x->x_obj, x->x_glist) - x->x_width/2, - text_ypix(&x->x_obj, x->x_glist) - x->x_height/2, - text_xpix(&x->x_obj, x->x_glist) + x->x_width/2, - text_ypix(&x->x_obj, x->x_glist) + x->x_height/2, x); + char fname[FILENAME_MAX]; + FILE *file; + if (strlen(x->x_fname->s_name) == 0) { + x->x_fname = gensym("@pd_extra/ggee/empty_image.png"); } + t_glist *glist = glist_getcanvas(x->x_glist); + canvas_makefilename(glist_getcanvas(x->x_glist), x->x_fname->s_name, fname, FILENAME_MAX); + // try to open the file + if (file = fopen(fname, "r")) + { + fclose(file); + } else { + x->x_fname = gensym("@pd_extra/ggee/empty_image.png"); + canvas_makefilename(glist_getcanvas(x->x_glist), x->x_fname->s_name, fname, FILENAME_MAX); + } + sys_vgui(".x%x.c itemconfigure %xS -image\n", glist, x); + sys_vgui("catch {image delete $img%x}\n", x); + sys_vgui("set img%x [image create photo -file {%s}]\n", x, fname); + sys_vgui("if { [catch {image width $img%x} fid] } { pd [concat %s _imagesize 0 0 \\;] }\n", x, x->x_receive->s_name); + sys_vgui(".x%x.c itemconfigure %xS -image $img%x\n", glist, x, x); + sys_vgui("pd [concat %s _imagesize [image width $img%x] [image height $img%x] \\;]\n",x->x_receive->s_name, x, x); } -void image_drawme(t_image *x, t_glist *glist, int redraw) +void image_drawme(t_image *x, t_glist *glist, int firstime) { - if (redraw) { - //first create blank image widget (in case we have no image to begin with) - //sys_vgui(".x%x.c itemconfigure %xS -image null\n", glist_getcanvas(glist)); - sys_vgui("catch {.x%x.c delete %xMT}\n",glist_getcanvas(glist), x); - sys_vgui("catch {.x%lx.c delete %xS}\n", glist_getcanvas(glist),x); + if (firstime) { + sys_vgui("catch {.x%lx.c delete %xS}\n", glist_getcanvas(glist), x); sys_vgui(".x%x.c create image %d %d -tags %xS\n", glist_getcanvas(glist),text_xpix(&x->x_obj, glist), - text_ypix(&x->x_obj, glist),x); + text_ypix(&x->x_obj, glist), x); image_doopen(x); - } + } else { - if (x->x_img_width + x->x_img_height == 0) { - sys_vgui(".x%x.c coords %xMT %d %d\n", - glist_getcanvas(glist), x, - text_xpix(&x->x_obj, glist), text_ypix(&x->x_obj, glist)); - } sys_vgui(".x%x.c coords %xS %d %d\n", glist_getcanvas(glist), x, text_xpix(&x->x_obj, glist), text_ypix(&x->x_obj, glist)); } - } void image_erase(t_image* x,t_glist* glist) { - sys_vgui("catch {.x%x.c delete %xMT}\n",glist_getcanvas(glist), x); sys_vgui("catch {.x%x.c delete %xS}\n",glist_getcanvas(glist), x); sys_vgui("catch {image delete $img%x}\n", x); sys_vgui("catch {.x%x.c delete %xSEL}\n",glist_getcanvas(glist), x); @@ -99,7 +84,6 @@ static t_symbol *get_filename(t_int argc, t_atom *argv) { t_symbol *fname; fname = atom_getsymbolarg(0, argc, argv); - //fprintf(stderr,"fname=<%s>\n", fname->s_name); if(argc > 1) { int i; @@ -115,7 +99,6 @@ static t_symbol *get_filename(t_int argc, t_atom *argv) } } fname = gensym(buf); - //fprintf(stderr,"argc>1 fname=<%s>\n", fname->s_name); } return fname; } @@ -163,13 +146,13 @@ static void image_displace(t_gobj *z, t_glist *glist, text_ypix(&x->x_obj, glist) - x->x_height/2, text_xpix(&x->x_obj, glist) + x->x_width/2, text_ypix(&x->x_obj, glist) + x->x_height/2); - if (x->x_img_width + x->x_img_height == 0) + /*if (x->x_img_width + x->x_img_height == 0) sys_vgui(".x%x.c coords %xMT %d %d %d %d\n", glist_getcanvas(glist), x, text_xpix(&x->x_obj, glist) - x->x_width/2, text_ypix(&x->x_obj, glist) - x->x_height/2, text_xpix(&x->x_obj, glist) + x->x_width/2, - text_ypix(&x->x_obj, glist) + x->x_height/2); + text_ypix(&x->x_obj, glist) + x->x_height/2);*/ } image_drawme(x, glist, 0); @@ -196,6 +179,7 @@ static void image_select(t_gobj *z, t_glist *glist, int state) { //fprintf(stderr,"image_select %d\n", state); t_image *x = (t_image *)z; + x->x_selected = state; if (state) { if (glist_istoplevel(glist)) { if (!x->x_gop_spill && (x->x_img_width + x->x_img_height) >= 2) @@ -311,11 +295,23 @@ static void image_imagesize_callback(t_image *x, t_float w, t_float h) { //fprintf(stderr,"received w %f h %f should %d spill %d\n", w, h, gobj_shouldvis((t_gobj *)x, glist_getcanvas(x->x_glist)), x->x_gop_spill); x->x_img_width = w; x->x_img_height = h; + if (x->x_img_width + x->x_img_height == 0) { + //invalid image + if (strcmp("@pd_extra/ggee/empty_image.png", x->x_fname->s_name) != 0) { + x->x_fname = gensym("@pd_extra/ggee/empty_image.png"); + image_doopen(x); + return; + } + } if (!gobj_shouldvis((t_gobj *)x, x->x_glist) && !x->x_gop_spill) { //fprintf(stderr,"erasing\n"); image_erase(x, glist_getcanvas(x->x_glist)); } else { - sys_vgui("catch {.x%x.c delete %xMT}\n", glist_getcanvas(x->x_glist), x); + //sys_vgui("catch {.x%x.c delete %xMT}\n", glist_getcanvas(x->x_glist), x); + if (x->x_selected) { + image_select((t_gobj *)x, glist_getcanvas(x->x_glist), 0); + image_select((t_gobj *)x, glist_getcanvas(x->x_glist), 1); + } canvas_fixlinesfor(x->x_glist,(t_text*) x); } } @@ -335,8 +331,8 @@ static void image_setwidget(void) static void image_free(t_image *x) { sys_vgui("image delete img%x\n", x); - if (x->receive) { - pd_unbind(&x->x_obj.ob_pd,x->receive); + if (x->x_receive) { + pd_unbind(&x->x_obj.ob_pd,x->x_receive); } //sys_vgui(".x%x.c delete %xSEL\n", x); //sys_vgui(".x%x.c delete %xS\n", x); @@ -353,6 +349,7 @@ static void *image_new(t_symbol *s, t_int argc, t_atom *argv) x->x_img_width = 0; x->x_img_height = 0; x->x_gop_spill = 0; + x->x_selected = 0; x->x_fname = get_filename(argc, argv); if (strlen(x->x_fname->s_name) > 0) { @@ -372,8 +369,8 @@ static void *image_new(t_symbol *s, t_int argc, t_atom *argv) // Create default receiver char buf[MAXPDSTRING]; sprintf(buf, "#%lx", (long)x); - x->receive = gensym(buf); - pd_bind(&x->x_obj.ob_pd, x->receive); + x->x_receive = gensym(buf); + pd_bind(&x->x_obj.ob_pd, x->x_receive); //outlet_new(&x->x_obj, &s_bang); return (x); -- GitLab