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