[gnome-games/gsoc-seed-games] [same-gnome-clutter] Import same-gnome from the Seed repository



commit d7ca55b520c24eee3f7ddd60f1fc47eaacacb447
Author: Tim Horton <hortont svn gnome org>
Date:   Tue Jun 23 03:38:47 2009 -0400

    [same-gnome-clutter] Import same-gnome from the Seed repository

 configure.in                                       |    2 +
 same-gnome-clutter/Makefile.am                     |   35 ++
 same-gnome-clutter/bkg.svg                         |   95 ++++++
 same-gnome-clutter/blue.svg                        |   97 ++++++
 same-gnome-clutter/board.js                        |  338 ++++++++++++++++++++
 same-gnome-clutter/green.svg                       |   97 ++++++
 same-gnome-clutter/light.js                        |  122 +++++++
 same-gnome-clutter/main.js                         |   48 +++
 same-gnome-clutter/red.svg                         |   97 ++++++
 .../same-gnome-clutter.desktop.in.in               |   13 +
 same-gnome-clutter/same-gnome-clutter.in           |    5 +
 same-gnome-clutter/same-seed.ui                    |   72 +++++
 same-gnome-clutter/same.c                          |  296 +++++++++++++++++
 same-gnome-clutter/score.js                        |   79 +++++
 same-gnome-clutter/yellow.svg                      |   97 ++++++
 15 files changed, 1493 insertions(+), 0 deletions(-)
---
diff --git a/configure.in b/configure.in
index 3652aa9..c8b21f8 100644
--- a/configure.in
+++ b/configure.in
@@ -1087,6 +1087,8 @@ iagno/iagno.desktop.in
 gnect/data/gnect.desktop.in
 gnomine/gnomine.desktop.in
 same-gnome-clutter/Makefile
+same-gnome-clutter/same-gnome-clutter
+same-gnome-clutter/same-gnome-clutter.desktop.in
 lightsoff/Makefile
 lightsoff/lightsoff
 lightsoff/lightsoff.desktop.in
diff --git a/same-gnome-clutter/Makefile.am b/same-gnome-clutter/Makefile.am
index e69de29..26631db 100644
--- a/same-gnome-clutter/Makefile.am
+++ b/same-gnome-clutter/Makefile.am
@@ -0,0 +1,35 @@
+samedir=$(pkgdatadir)/same-gnome-clutter
+
+same_DATA = \
+    bkg.svg \
+    blue.svg \
+    board.js \
+    green.svg \
+    light.js \
+    main.js \
+    red.svg \
+    same-seed.ui \
+    score.js \
+    yellow.svg
+
+bin_SCRIPTS = same-gnome-clutter
+
+desktop_in_files = same-gnome-clutter.desktop.in.in
+desktopdir = $(datadir)/applications
+desktop_DATA = $(desktop_in_files:.desktop.in.in=.desktop)
+ INTLTOOL_DESKTOP_RULE@
+        
+CLEANFILES = $(desktop_DATA)
+
+EXTRA_DIST = \
+    bkg.svg \
+    blue.svg \
+    board.js \
+    green.svg \
+    light.js \
+    main.js \
+    red.svg \
+    same-seed.ui \
+    score.js \
+    yellow.svg
+
diff --git a/same-gnome-clutter/bkg.svg b/same-gnome-clutter/bkg.svg
new file mode 100644
index 0000000..6741c6f
--- /dev/null
+++ b/same-gnome-clutter/bkg.svg
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/";
+   xmlns:cc="http://creativecommons.org/ns#";
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#";
+   xmlns:svg="http://www.w3.org/2000/svg";
+   xmlns="http://www.w3.org/2000/svg";
+   xmlns:xlink="http://www.w3.org/1999/xlink";
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd";
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape";
+   width="639.42859"
+   height="479.57144"
+   id="svg2"
+   sodipodi:version="0.32"
+   inkscape:version="0.46"
+   version="1.0"
+   sodipodi:docname="bkg.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs4">
+    <linearGradient
+       id="linearGradient3155">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3157" />
+      <stop
+         style="stop-color:#5c5c5c;stop-opacity:1;"
+         offset="1"
+         id="stop3159" />
+    </linearGradient>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective10" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3155"
+       id="linearGradient3161"
+       x1="652.57147"
+       y1="248.36218"
+       x2="652.57147"
+       y2="727.93359"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(28.571424,17.142857)" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     gridtolerance="10000"
+     guidetolerance="10"
+     objecttolerance="10"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.35"
+     inkscape:cx="-127.85714"
+     inkscape:cy="520"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1440"
+     inkscape:window-height="842"
+     inkscape:window-x="0"
+     inkscape:window-y="0" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage"; />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-41.714302,-265.50504)">
+    <rect
+       style="opacity:1;fill:url(#linearGradient3161);fill-opacity:1;stroke:none;stroke-width:319.71429443;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect2383"
+       width="639.42859"
+       height="479.57144"
+       x="41.714302"
+       y="265.50504" />
+  </g>
+</svg>
diff --git a/same-gnome-clutter/blue.svg b/same-gnome-clutter/blue.svg
new file mode 100644
index 0000000..570eaa4
--- /dev/null
+++ b/same-gnome-clutter/blue.svg
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/";
+   xmlns:cc="http://creativecommons.org/ns#";
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#";
+   xmlns:svg="http://www.w3.org/2000/svg";
+   xmlns="http://www.w3.org/2000/svg";
+   xmlns:xlink="http://www.w3.org/1999/xlink";
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd";
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape";
+   width="50"
+   height="50"
+   id="svg2"
+   sodipodi:version="0.32"
+   inkscape:version="0.46"
+   sodipodi:docname="blue.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   version="1.0">
+  <defs
+     id="defs4">
+    <linearGradient
+       id="linearGradient3179">
+      <stop
+         style="stop-color:#35669b;stop-opacity:0.96078432;"
+         offset="0"
+         id="stop3181" />
+      <stop
+         style="stop-color:#5e92c8;stop-opacity:0.96078432;"
+         offset="1"
+         id="stop3183" />
+    </linearGradient>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective10" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3179"
+       id="linearGradient3193"
+       x1="164.71428"
+       y1="344.79077"
+       x2="315.28571"
+       y2="344.79077"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.3187856,0,0,0.3187856,113.20576,133.30501)" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     gridtolerance="10000"
+     guidetolerance="10"
+     objecttolerance="10"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="4.0711576"
+     inkscape:cx="44.4591"
+     inkscape:cy="80.411519"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1440"
+     inkscape:window-height="842"
+     inkscape:window-x="0"
+     inkscape:window-y="0" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage"; />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-164.71428,-194.21933)">
+    <rect
+       style="opacity:1;fill:url(#linearGradient3193);fill-opacity:1;stroke:#729fcf;stroke-width:0.63757122;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect3157"
+       width="47.362427"
+       height="47.362431"
+       x="166.03307"
+       y="195.53812"
+       rx="3.187856"
+       ry="3.187856" />
+  </g>
+</svg>
diff --git a/same-gnome-clutter/board.js b/same-gnome-clutter/board.js
new file mode 100644
index 0000000..d5d351a
--- /dev/null
+++ b/same-gnome-clutter/board.js
@@ -0,0 +1,338 @@
+Board = new GType({
+	parent: Clutter.Group.type,
+	name: "Board",
+	init: function()
+	{
+		// Private
+		var lights = [], all_lights = [];
+		var cl, oldcl = [], oldpicked;
+		var animating = false;
+		var final_score;
+		
+		function done_animating()
+		{
+			animating = false;
+			
+			/*var x = {}, y = {};
+			window.window.get_pointer(x, y, null);
+			
+			var picked = stage.get_actor_at_pos(x.value, y.value);
+			
+			print(picked);
+			
+			if(picked)
+				picked = picked.get_parent();
+			
+			if(picked && picked.get_light_x)
+			{
+				if(picked == oldpicked)
+					return false;
+			
+				oldpicked = picked;
+				
+				light_lights_from(picked);
+			}*/
+			
+			return false;
+		}
+		
+		function _connected_lights(li)
+		{
+			if(!li || li.visited || li.get_closed())
+				return [ ];
+			
+			var x = li.get_light_x();
+			var y = li.get_light_y();
+			
+			li.visited = true;
+			
+			var con = [li];
+			
+			while(GLib.main_context_pending())
+				GLib.main_context_iteration();
+			
+			var a = [], b = [], c = [], d = [];
+			
+			if(lights[x][y+1] && (li.get_state() == lights[x][y+1].get_state()))
+				a = _connected_lights(lights[x][y+1]);
+			
+			if(lights[x][y-1] && (li.get_state() == lights[x][y-1].get_state()))
+				b = _connected_lights(lights[x][y-1]);
+			
+			if(lights[x+1] && lights[x+1][y] && 
+			   (li.get_state() == lights[x+1][y].get_state()))
+				c = _connected_lights(lights[x+1][y]);
+			
+			if(lights[x-1] && lights[x-1][y] &&
+			   (li.get_state() == lights[x-1][y].get_state()))
+				d = _connected_lights(lights[x-1][y]);
+			
+			return con.concat(a,b,c,d);
+		}
+		
+		function connected_lights(li)
+		{
+			for(var i in all_lights)
+				all_lights[i].visited = false;
+			
+			if(!li.get_light_x) // We're picking something other than a light!
+				return [ li ];
+			
+			return _connected_lights(li);
+		}
+		
+		function any_connected_lights(li)
+		{
+			if(!li || li.get_closed())
+				return false;
+			
+			var x = li.get_light_x();
+			var y = li.get_light_y();
+			
+			if(lights[x][y+1] && (li.get_state() == lights[x][y+1].get_state()))
+				return !lights[x][y+1].get_closed();
+
+			if(lights[x][y-1] && (li.get_state() == lights[x][y-1].get_state()))
+				return !lights[x][y-1].get_closed();
+			
+			if(lights[x+1] && lights[x+1][y] &&
+			   (li.get_state() == lights[x+1][y].get_state()))
+				return !lights[x+1][y].get_closed();
+			
+			if(lights[x-1] && lights[x-1][y] &&
+			   (li.get_state() == lights[x-1][y].get_state()))
+				return !lights[x-1][y].get_closed();
+			
+			return false;
+		}
+		
+		function calculate_score(n_lights)
+		{
+			if (n_lights < 3)
+				return 0;
+
+			return (n_lights - 2) * (n_lights - 2);
+		}
+		
+		function light_lights_from(li)
+		{
+			var i;
+			
+			cl = connected_lights(li);
+			
+			for(i in oldcl)
+				if(!oldcl[i].get_closed())
+					oldcl[i].opacity = 180;
+			
+			if(cl.length < 2)
+				return false;
+			
+			for(i in cl)
+				cl[i].opacity = 255;
+			
+			oldcl = cl;
+		}
+		
+		function update_score(tiles)
+		{
+			var points_awarded = calculate_score(tiles);
+			
+			if(fly_score)
+			{
+				var score_text = new Score();
+				score_text.animate_score(points_awarded);
+			}
+			
+			score += points_awarded;
+			
+			print(score);
+			
+			if(board.has_completed())
+			{
+				if(board.has_won())
+					score += 1000;
+				
+				final_score = new Score();
+				final_score.animate_final_score(score);
+				
+				print("Done with: " + score + " points!");
+			}
+		}
+		
+		function enter_tile(actor, event)
+		{
+			var picked = stage.get_actor_at_pos(Clutter.PickMode.ALL,
+			                                    event.motion.x,
+			                                    event.motion.y).get_parent();
+			
+			if(picked === oldpicked)
+				return false;
+			
+			oldpicked = picked;
+			
+			light_lights_from(picked);
+			
+			return false;
+		}
+		
+		// Public
+		this.has_completed = function ()
+		{
+			for(var i in all_lights)
+			{
+				li = all_lights[i];
+				
+				if(!li.get_closed() && any_connected_lights(li))
+					return false;
+			}
+			
+			return true;
+		};
+		
+		this.has_won = function ()
+		{
+			for(var i in all_lights)
+			{
+				li = all_lights[i];
+				
+				if(!li.get_closed())
+					return false;
+			}
+			
+			return true;
+		};
+		
+		this.get_lights = function ()
+		{
+			return lights;
+		};
+		
+		this.remove_region = function (actor, event)
+		{
+			if(animating)
+				return false;
+				
+			if(!cl)
+				light_lights_from(actor.get_parent());
+			
+			if(cl.length < 2)
+				return false;
+			
+			var close_timeline = new Clutter.Timeline({duration: 500});
+			
+			for(var i in cl)
+				cl[i].close_tile(close_timeline);
+			
+			close_timeline.start();
+			
+			var real_x = 0, timeline = 0;
+			
+			animating = true;
+			
+			var anim_timeline = new Clutter.Timeline({duration: 500});
+			
+			for(var x in lights)
+			{
+				var y, li;
+				var good_lights = [];
+				var bad_lights = [];
+				
+				for(y in lights[x])
+				{
+					li = lights[x][y];
+					
+					if(!li.get_closed())
+						good_lights.push(li);
+					else
+						bad_lights.push(li);
+				}
+				
+				lights[real_x] = good_lights.concat(bad_lights);
+				
+				var empty_col = true;
+				
+				for(y in lights[real_x])
+				{
+					li = lights[real_x][y];
+					
+					li.set_light_x(real_x);
+					li.set_light_y(parseInt(y,10));
+					
+					var new_x = real_x * tile_size + offset;
+					var new_y = (tiles_h - y - 1) * tile_size + offset;
+					
+					if(!li.get_closed() && ((new_x != li.x) ||
+										    (new_y != li.y)))
+					{
+						li.animate_to(new_x, new_y, anim_timeline);
+					}
+					
+					if(!li.get_closed())
+						empty_col = false;
+					
+					GLib.main_context_iteration();
+				}
+				
+				GLib.main_context_iteration();
+				
+				if(!empty_col)
+					real_x++;
+			}
+
+			if(anim_timeline)
+            {
+				anim_timeline.signal.completed.connect(done_animating);
+				anim_timeline.start();
+			}
+			else
+				animating = false;
+			
+			for(; real_x < tiles_w; real_x++)
+				lights[real_x] = null;
+			
+			update_score(cl.length);
+			
+			cl = oldpicked = null;
+			
+			return false;
+		};
+		
+		this.new_game = function ()
+		{
+			var children = board.get_children();
+			
+			for(var i in children)
+				board.remove_actor(children[i]);
+			
+			if(final_score)
+				final_score.hide_score();
+			
+			all_lights = [];
+			
+			for(var x = 0; x < tiles_w; x++)
+			{
+				lights[x] = [];
+				for(var y = 0; y < tiles_h; y++)
+				{
+					var li = new Light();
+				
+					li.set_light_x(x);
+					li.set_light_y(y);
+				
+					li.set_position(x * tile_size + offset,
+									(tiles_h - y - 1) * tile_size + offset);
+					board.add_actor(li);
+					li.on.signal.button_release_event.connect(board.remove_region);
+				
+					lights[x][y] = li;
+					all_lights.push(lights[x][y]);
+				}
+			}
+		};
+		
+		// Implementation
+		this.signal.motion_event.connect(enter_tile);
+		this.reactive = true;
+	}
+});
+	
diff --git a/same-gnome-clutter/green.svg b/same-gnome-clutter/green.svg
new file mode 100644
index 0000000..6950094
--- /dev/null
+++ b/same-gnome-clutter/green.svg
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/";
+   xmlns:cc="http://creativecommons.org/ns#";
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#";
+   xmlns:svg="http://www.w3.org/2000/svg";
+   xmlns="http://www.w3.org/2000/svg";
+   xmlns:xlink="http://www.w3.org/1999/xlink";
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd";
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape";
+   width="50"
+   height="50"
+   id="svg2"
+   sodipodi:version="0.32"
+   inkscape:version="0.46"
+   sodipodi:docname="green.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   version="1.0">
+  <defs
+     id="defs4">
+    <linearGradient
+       id="linearGradient3179">
+      <stop
+         style="stop-color:#549515;stop-opacity:0.96078432;"
+         offset="0"
+         id="stop3181" />
+      <stop
+         style="stop-color:#8ae234;stop-opacity:1;"
+         offset="1"
+         id="stop3183" />
+    </linearGradient>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective10" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3179"
+       id="linearGradient3193"
+       x1="164.71428"
+       y1="344.79077"
+       x2="315.28571"
+       y2="344.79077"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.3187856,0,0,0.3187856,113.20576,133.30501)" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     gridtolerance="10000"
+     guidetolerance="10"
+     objecttolerance="10"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="4.310224"
+     inkscape:cx="46.168896"
+     inkscape:cy="75.285713"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1440"
+     inkscape:window-height="842"
+     inkscape:window-x="0"
+     inkscape:window-y="0" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage"; />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-164.71428,-194.21933)">
+    <rect
+       style="opacity:1;fill:url(#linearGradient3193);fill-opacity:1;stroke:#8ae234;stroke-width:0.63757122;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect3157"
+       width="47.362427"
+       height="47.362431"
+       x="166.03307"
+       y="195.53812"
+       rx="3.187856"
+       ry="3.187856" />
+  </g>
+</svg>
diff --git a/same-gnome-clutter/light.js b/same-gnome-clutter/light.js
new file mode 100644
index 0000000..c047164
--- /dev/null
+++ b/same-gnome-clutter/light.js
@@ -0,0 +1,122 @@
+var tile_svg_size = 50;
+
+function load_svg(file)
+{
+    var tx = new Clutter.Texture({filename: file});
+    tx.filter_quality = Clutter.TextureQuality.HIGH;
+    return tx;
+}
+
+var colors = ["blue.svg", "green.svg", "red.svg", "yellow.svg"];
+var loaded_colors = {};
+
+Light = new GType({
+    parent: Clutter.Group.type,
+    name: "Light",
+    init: function()
+    {
+	// Private
+	var closed = false;
+	var light_x, light_y;
+	var state = Math.floor(Math.random() * max_colors);
+		
+	// Public
+	this.visited = false;
+	
+	if(loaded_colors[state])
+		this.on = new Clutter.Clone({source: loaded_colors[state],
+		                             reactive: true});
+	else
+		this.on = loaded_colors[state] = load_svg(colors[state]);
+	
+	
+	this.get_state = function ()
+	{
+	    return state;
+	};
+	
+	this.animate_out = function (timeline)
+	{
+	    this.on.anim = this.on.animate_with_timeline(Clutter.AnimationMode.LINEAR, timeline,
+							 {
+							     height: tile_size * 2,
+							     width: tile_size * 2,
+							     x: -tile_size/2,
+							     y: -tile_size/2
+							 });
+	    
+	    this.anim = this.animate_with_timeline(Clutter.AnimationMode.LINEAR, timeline,
+						   {
+						       opacity: 0
+						   });
+	    
+	    timeline.signal.completed.connect(this.hide_light, this);
+	    
+	    GLib.main_context_iteration();
+	};
+	
+	this.animate_to = function (new_x, new_y, timeline)
+	{
+	    this.anim = this.animate_with_timeline(Clutter.AnimationMode.EASE_OUT_BOUNCE, timeline,
+						   {
+						       x: new_x,
+						       y: new_y
+						   });
+	    
+	    GLib.main_context_iteration();
+	};
+	
+	this.get_closed = function ()
+	{
+	    return closed;
+	};
+	
+	this.close_tile = function (timeline)
+	{
+	    closed = true;
+	    this.animate_out(timeline);
+	};
+	
+	this.hide_light = function (timeline, light)
+	{
+	    light.hide();
+	    
+	    delete on;
+	    
+	    if(light.anim)
+		delete light.anim;
+	    
+	    return false;
+	};
+	
+	this.set_light_x = function (new_x)
+	{
+	    light_x = new_x;
+	};
+	
+	this.set_light_y = function (new_y)
+	{
+	    light_y = new_y;
+	};
+	
+	this.get_light_x = function ()
+	{
+	    return light_x;
+	};
+	
+	this.get_light_y = function ()
+	{
+	    return light_y;
+	};
+	
+	// Implementation
+	this.on.set_size(tile_size, tile_size);
+	
+	this.opacity = 180;
+	
+	this.set_anchor_point(tile_size / 2, tile_size / 2);
+	
+	this.add_actor(this.on);
+    }
+});
+
diff --git a/same-gnome-clutter/main.js b/same-gnome-clutter/main.js
new file mode 100755
index 0000000..2905fdc
--- /dev/null
+++ b/same-gnome-clutter/main.js
@@ -0,0 +1,48 @@
+#!/usr/bin/env seed
+
+// Configuration
+
+var tiles_w = 15;
+var tiles_h = 10;
+var tile_size = 50;
+var offset = tile_size/2;
+
+var max_colors = 3;
+var fly_score = true;
+
+imports.gi.versions.Clutter = "0.9";
+
+Gtk = imports.gi.Gtk;
+Clutter = imports.gi.Clutter;
+GdkPixbuf = imports.gi.GdkPixbuf;
+GConf = imports.gi.GConf;
+GLib = imports.gi.GLib;
+Pango = imports.gi.Pango;
+GObject = imports.gi.GObject;
+
+Gtk.init(Seed.argv);
+Clutter.init(Seed.argv);
+GConf.init(Seed.argv);
+
+Seed.include("light.js");
+Seed.include("board.js");
+Seed.include("score.js");
+
+var score = 0;
+var timelines = [];
+
+var stage = new Clutter.Stage();
+
+stage.signal.hide.connect(Clutter.main_quit);
+
+stage.color = {alpha: 0};
+stage.set_size((tiles_w * tile_size),(tiles_h * tile_size));
+
+var board = new Board();
+stage.add_actor(board);
+stage.show_all();
+
+board.new_game();
+
+Clutter.main();
+
diff --git a/same-gnome-clutter/red.svg b/same-gnome-clutter/red.svg
new file mode 100644
index 0000000..e864f62
--- /dev/null
+++ b/same-gnome-clutter/red.svg
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/";
+   xmlns:cc="http://creativecommons.org/ns#";
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#";
+   xmlns:svg="http://www.w3.org/2000/svg";
+   xmlns="http://www.w3.org/2000/svg";
+   xmlns:xlink="http://www.w3.org/1999/xlink";
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd";
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape";
+   width="50"
+   height="50"
+   id="svg2"
+   sodipodi:version="0.32"
+   inkscape:version="0.46"
+   sodipodi:docname="red.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   version="1.0">
+  <defs
+     id="defs4">
+    <linearGradient
+       id="linearGradient3179">
+      <stop
+         style="stop-color:#ee8f04;stop-opacity:0.96078432;"
+         offset="0"
+         id="stop3181" />
+      <stop
+         style="stop-color:#fcae3f;stop-opacity:0.96078432;"
+         offset="1"
+         id="stop3183" />
+    </linearGradient>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective10" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3179"
+       id="linearGradient3193"
+       x1="164.71428"
+       y1="344.79077"
+       x2="315.28571"
+       y2="344.79077"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.3187856,0,0,0.3187856,113.20576,133.30501)" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     gridtolerance="10000"
+     guidetolerance="10"
+     objecttolerance="10"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="12.26"
+     inkscape:cx="14.763458"
+     inkscape:cy="25"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1440"
+     inkscape:window-height="842"
+     inkscape:window-x="0"
+     inkscape:window-y="0" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage"; />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-164.71428,-194.21933)">
+    <rect
+       style="opacity:1;fill:url(#linearGradient3193);fill-opacity:1;stroke:#fcaf3e;stroke-width:0.63757122;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect3157"
+       width="47.362427"
+       height="47.362431"
+       x="166.03307"
+       y="195.53812"
+       rx="3.187856"
+       ry="3.187856" />
+  </g>
+</svg>
diff --git a/same-gnome-clutter/same-gnome-clutter.desktop.in.in b/same-gnome-clutter/same-gnome-clutter.desktop.in.in
new file mode 100644
index 0000000..9da9ab9
--- /dev/null
+++ b/same-gnome-clutter/same-gnome-clutter.desktop.in.in
@@ -0,0 +1,13 @@
+[Desktop Entry]
+_Name=Same GNOME (Clutter)
+_Comment=Clear the screen by removing groups of colored balls
+Icon=gnome-samegnome
+Exec=same-gnome-clutter
+Terminal=false
+Type=Application
+Categories=GNOME;GTK;Game;PuzzleGame;
+X-GNOME-Bugzilla-Bugzilla=GNOME
+X-GNOME-Bugzilla-Product=gnome-games
+X-GNOME-Bugzilla-Component=BugBuddyBugs
+X-GNOME-Bugzilla-Version= VERSION@
+StartupNotify=false
diff --git a/same-gnome-clutter/same-gnome-clutter.in b/same-gnome-clutter/same-gnome-clutter.in
new file mode 100644
index 0000000..b0d22da
--- /dev/null
+++ b/same-gnome-clutter/same-gnome-clutter.in
@@ -0,0 +1,5 @@
+#!/usr/bin/env sh
+
+export LD_LIBRARY_PATH= prefix@/share/gnome-games-common:$LD_LIBRARY_PATH
+/usr/bin/env seed @prefix@/share/gnome-games/same-gnome-clutter/main.js
+
diff --git a/same-gnome-clutter/same-seed.ui b/same-gnome-clutter/same-seed.ui
new file mode 100644
index 0000000..95616fd
--- /dev/null
+++ b/same-gnome-clutter/same-seed.ui
@@ -0,0 +1,72 @@
+<interface>
+	<object class="GtkWindow" id="main_window">
+		<property name="title">Same Gnome</property>
+		<child>
+			<object class="GtkVBox" id="vbox">
+				<child>
+					<object class="GtkMenuBar" id="menu">
+						<child>
+							<object class="GtkMenuItem" id="game_menu_item">
+								<property name="label">Game</property>
+								<child type="submenu">
+									<object class="GtkMenu" id="game_menu">
+										<child>
+											<object class="GtkImageMenuItem" id="new_game_item">
+												<property name="label">games-new-game</property>
+												<property name="use_underline">True</property>
+												<property name="use_stock">True</property>
+											</object>
+										</child>
+										<child>
+											<object class="GtkImageMenuItem" id="scores_item">
+												<property name="label">games-stock-scores</property>
+												<property name="use_underline">True</property>
+												<property name="use_stock">True</property>
+											</object>
+										</child>
+										<child>
+											<object class="GtkSeparatorMenuItem" id="separator1" />
+										</child>
+										<child>
+											<object class="GtkImageMenuItem" id="undo_move_item">
+												<property name="label">games-undo-move</property>
+												<property name="use_underline">True</property>
+												<property name="use_stock">True</property>
+											</object>
+										</child>
+										<child>
+											<object class="GtkImageMenuItem" id="redo_move_item">
+												<property name="label">games-redo-move</property>
+												<property name="use_underline">True</property>
+												<property name="use_stock">True</property>
+											</object>
+										</child>
+										<child>
+											<object class="GtkSeparatorMenuItem" id="separator2" />
+										</child>
+										<child>
+											<object class="GtkImageMenuItem" id="quit_item">
+												<signal name="activate" handler="close_game" />
+												<property name="label">gtk-quit</property>
+												<property name="use_underline">True</property>
+												<property name="use_stock">True</property>
+											</object>
+										</child>
+									</object>
+								</child>
+							</object>
+						</child>
+					</object>
+				</child>
+				<child>
+					<object class="GtkClutterEmbed" id="clutter" />
+				</child>
+				<child>
+					<object class="GtkStatusbar" id="statusbar">
+					</object>
+				</child>
+			</object>
+		</child>
+	</object>
+</interface>
+
diff --git a/same-gnome-clutter/same.c b/same-gnome-clutter/same.c
new file mode 100644
index 0000000..911f89e
--- /dev/null
+++ b/same-gnome-clutter/same.c
@@ -0,0 +1,296 @@
+// gcc `pkg-config --cflags --libs clutter-0.9 glib-2.0` same.c -o same
+
+#include <glib.h>
+#include <clutter/clutter.h>
+#include <stdlib.h>
+
+#define WIDTH 15
+#define HEIGHT 10
+
+ClutterColor colors[5] = {{ 0xff, 0x00, 0x00, 0xff },
+                          { 0x00, 0xff, 0x00, 0xff },
+                          { 0x00, 0x00, 0xff, 0xff },
+                          { 0xff, 0xff, 0x00, 0xff },
+                          { 0x00, 0xff, 0xff, 0xff }};
+
+typedef struct
+{
+	ClutterActor * actor;
+	gboolean visited, closed;
+	int color;
+	int x, y;
+} light;
+
+light * grid[WIDTH][HEIGHT];
+gboolean animating_lights = FALSE;
+GQueue * click_queue;
+
+gboolean light_on_matches(int x, int y, int color)
+{
+	return (grid[x][y] && (grid[x][y]->color == color));
+}
+
+GList * _connected_lights(int x, int y)
+{
+	GList * cl = NULL;
+	
+	light * l = grid[x][y];
+	
+	if(!l || l->visited || l->closed)
+		return cl;
+	
+	l->visited = TRUE;
+	
+	cl = g_list_append(cl, grid[x][y]);
+	
+	if(y < HEIGHT && light_on_matches(x, y + 1, l->color))
+		cl = g_list_concat(cl, _connected_lights(x, y + 1));
+	
+	if(y > 0 && light_on_matches(x, y - 1, l->color))
+		cl = g_list_concat(cl, _connected_lights(x, y - 1));
+	
+	if(x < WIDTH && light_on_matches(x + 1, y, l->color))
+		cl = g_list_concat(cl, _connected_lights(x + 1, y));
+	
+	if(x > 0 && light_on_matches(x - 1, y, l->color))
+		cl = g_list_concat(cl, _connected_lights(x - 1, y));
+	
+	return cl;
+}
+
+GList * connected_lights(light * l)
+{
+	int vx, vy;
+	
+	for(vx = 0; vx < WIDTH; vx++)
+		for(vy = 0; vy < HEIGHT; vy++)
+			if(grid[vx][vy])
+				grid[vx][vy]->visited = FALSE;
+
+	return _connected_lights(l->x, l->y);
+}
+
+void update_light_position(light * l, int new_x, int new_y)
+{
+	l->x = new_x;
+	l->y = new_y;
+	
+	double pos_x = (50 * l->x);
+	double pos_y = ((HEIGHT - 1) * 50) - (l->y * 50);
+	
+	clutter_actor_animate(l->actor, CLUTTER_EASE_OUT_BOUNCE, 500,
+	                      "x", pos_x,
+	                      "y", pos_y,
+	                      NULL);
+}
+
+gboolean animation_finished(ClutterTimeline * timeline,
+                            gpointer user_data)
+{
+	animating_lights = FALSE;
+	light * l = NULL;
+	
+	if(!g_queue_is_empty(click_queue))
+	{
+		l = (light *)g_queue_pop_head(click_queue);
+		light_clicked(NULL, NULL, (gpointer)l);
+	}
+	
+	return FALSE;
+}
+
+gboolean light_clicked(ClutterActor * actor,
+                       ClutterEvent * event,
+                       gpointer user_data)
+{
+	light * l = (light *)user_data;
+	GList * cl = connected_lights(l);
+
+	if(g_list_length(cl) < 2)
+		return FALSE;
+	
+	if(animating_lights)
+	{
+		g_queue_push_tail(click_queue, l);
+		return FALSE;
+	}
+	
+	animating_lights = TRUE;
+
+	GList * li;
+	ClutterTimeline * out_timeline = clutter_timeline_new(500);
+	
+	for(li = cl; li != NULL; li = g_list_next(li))
+	{
+		light * inner_l = li->data;
+		
+		clutter_actor_animate_with_timeline(inner_l->actor,
+		                                    CLUTTER_EASE_OUT_EXPO,
+		                                    out_timeline,
+		                                    "opacity",
+		                                    0, NULL);
+		inner_l->closed = TRUE;
+	}
+	
+	clutter_timeline_start(out_timeline);
+	
+	g_signal_connect(out_timeline, "completed",
+	                 G_CALLBACK(animation_finished), NULL);
+	
+	int vx, vy;
+	int new_x = 0;
+	
+	for(vx = 0; vx < WIDTH; vx++)
+	{
+		GList * new_col = NULL;
+		
+		for(vy = 0; vy < HEIGHT; vy++)
+		{
+			if(grid[vx][vy] && !grid[vx][vy]->closed)
+				new_col = g_list_append(new_col, grid[vx][vy]);
+		}
+		
+		GList * new_col_iter;
+		gboolean empty_column = TRUE;
+		int new_y = 0;
+		
+		for(new_col_iter = new_col;
+		    new_col_iter != NULL;
+		    new_col_iter = g_list_next(new_col_iter))
+		{
+			light * l = (light *)new_col_iter->data;
+			
+			if(!l->closed)
+				empty_column = FALSE;
+			
+			update_light_position(l, new_x, new_y);
+			
+			grid[new_x][new_y] = l;
+			new_y++;
+		}
+		
+		for(; new_y < HEIGHT; new_y++)
+		{
+			grid[new_x][new_y] = NULL;
+		}
+		
+		if(!empty_column)
+			new_x++;
+	}
+	
+	for(; new_x < WIDTH; new_x++)
+	{
+		for(vy = 0; vy < HEIGHT; vy++)
+		{
+			grid[new_x][vy] = NULL;
+		}
+	}
+	
+	return FALSE;
+}
+
+gboolean light_entered(ClutterActor * actor,
+                       ClutterEvent * event,
+                       gpointer user_data)
+{
+	light * l = (light *)user_data;
+	GList * cl = connected_lights(l);
+	
+	if(g_list_length(cl) < 2)
+		return FALSE;
+
+	GList * li;
+	
+	for(li = cl; li != NULL; li = g_list_next(li))
+	{
+		light * inner_l = li->data;
+		clutter_actor_set_opacity(inner_l->actor, 255);
+	}
+	
+	return FALSE;
+}
+
+gboolean light_left(ClutterActor * actor,
+                    ClutterEvent * event,
+                    gpointer user_data)
+{
+	light * l = (light *)user_data;
+	GList * cl = connected_lights(l);
+	
+	if(g_list_length(cl) < 2)
+		return FALSE;
+
+	GList * li;
+	
+	for(li = cl; li != NULL; li = g_list_next(li))
+	{
+		light * inner_l = li->data;
+		clutter_actor_set_opacity(inner_l->actor, 180);
+	}
+	
+	return FALSE;
+}
+
+ClutterActor * create_light(light * l)
+{
+	ClutterActor * actor;
+	
+	actor = clutter_rectangle_new();
+	clutter_rectangle_set_color(CLUTTER_RECTANGLE(actor), &colors[l->color]);
+	clutter_actor_set_size(actor, 50, 50);
+	clutter_actor_set_position(actor, 50 * l->x, ((HEIGHT - 1) * 50) - (50 * l->y));
+	clutter_actor_set_opacity(actor, 180);
+	clutter_actor_set_reactive(actor, TRUE);
+	
+	g_signal_connect(actor, "button-release-event",
+	                 G_CALLBACK(light_clicked), l);
+	g_signal_connect(actor, "enter-event",
+	                 G_CALLBACK(light_entered), l);
+	g_signal_connect(actor, "leave-event",
+	                 G_CALLBACK(light_left), l);
+
+	return actor;
+}
+
+void create_game(ClutterActor * stage)
+{
+	int x, y;
+	
+	for(x = 0; x < WIDTH; x++)
+	{
+		for(y = 0; y < HEIGHT; y++)
+		{
+			light * l = calloc(1, sizeof(light));
+			grid[x][y] = l;
+
+			l->x = x;
+			l->y = y;
+			l->color = rand() % 3;
+			l->closed = FALSE;
+			
+			l->actor = create_light(l);
+			
+			clutter_container_add_actor(CLUTTER_CONTAINER(stage), l->actor);
+		}
+	}
+}
+
+int main()
+{
+	ClutterActor * stage;
+	ClutterColor stage_color = { 0x00, 0x00, 0x00, 0xff };
+	
+	click_queue = g_queue_new();
+
+	clutter_init(NULL, NULL);
+	
+	stage = clutter_stage_get_default();
+	clutter_stage_set_color(CLUTTER_STAGE(stage), &stage_color);
+	clutter_actor_set_size(stage, WIDTH * 50, HEIGHT * 50);
+	
+	create_game(stage);
+	
+	clutter_actor_show_all(stage);
+	
+	clutter_main();
+}
diff --git a/same-gnome-clutter/score.js b/same-gnome-clutter/score.js
new file mode 100644
index 0000000..39dcb4f
--- /dev/null
+++ b/same-gnome-clutter/score.js
@@ -0,0 +1,79 @@
+Score = new GType({
+	parent: Clutter.Group.type,
+	name: "Score",
+	init: function()
+	{
+		// Private
+		var label;
+		
+		// Public
+		this.hide_score = function (timeline, score)
+		{
+			if(!score)
+				score = this;
+			
+			score.hide();
+			stage.remove_actor(score);
+		};
+		
+		this.animate_score = function (points)
+		{
+			if(points <= 0)
+				return;
+			
+			label.set_font_name("Bitstrem Vera Sans Bold 40");
+			label.set_text("+" + points);
+			this.set_anchor_point(this.width/2, this.height/2);
+			
+			stage.add_actor(this);
+			this.show();
+			
+			this.anim = this.animate(Clutter.AnimationMode.EASE_OUT_SINE,400,
+			{
+			    depth:  500,
+			    opacity: 0,
+			});
+			this.anim.timeline.start();
+			
+			this.anim.timeline.signal.completed.connect(this.hide_score, this);
+		};
+		
+		this.animate_final_score = function (points)
+		{
+			label.set_font_name("Bitstrem Vera Sans 50");
+			label.set_markup("<b>Game Over!</b>\n" + points + " points");
+			label.set_line_alignment(Pango.Alignment.CENTER);
+			
+			this.set_anchor_point(this.width/2, this.height/2);
+			
+			stage.add_actor(this);
+			this.show();
+			
+			//this.opacity = 0;
+			//this.y = -this.height;
+			this.scale_x = this.scale_y = 0;
+			
+			this.anim = this.animate(Clutter.AnimationMode.EASE_OUT_ELASTIC,2000,
+			{
+			    scale_x: 1,
+			    scale_y: 1,
+				//y: [GObject.TYPE_INT, stage.width / 2],
+			    opacity: 255,
+			});
+			this.anim.timeline.start();
+			
+			//this.anim.timeline.signal.completed.connect(this.hide_score, this);
+		};
+		
+		// Implementation
+		label = new Clutter.Text();
+		label.set_color({red:255, green:255, blue:255, alpha:255});
+		
+		this.add_actor(label);
+		label.show();
+		
+		this.x = stage.width / 2;
+		this.y = stage.height / 2;
+	}
+});
+
diff --git a/same-gnome-clutter/yellow.svg b/same-gnome-clutter/yellow.svg
new file mode 100644
index 0000000..90ec365
--- /dev/null
+++ b/same-gnome-clutter/yellow.svg
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/";
+   xmlns:cc="http://creativecommons.org/ns#";
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#";
+   xmlns:svg="http://www.w3.org/2000/svg";
+   xmlns="http://www.w3.org/2000/svg";
+   xmlns:xlink="http://www.w3.org/1999/xlink";
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd";
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape";
+   width="50"
+   height="50"
+   id="svg2"
+   sodipodi:version="0.32"
+   inkscape:version="0.46"
+   sodipodi:docname="yellow.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   version="1.0">
+  <defs
+     id="defs4">
+    <linearGradient
+       id="linearGradient3179">
+      <stop
+         style="stop-color:#dec604;stop-opacity:0.96078432;"
+         offset="0"
+         id="stop3181" />
+      <stop
+         style="stop-color:#fce94f;stop-opacity:1;"
+         offset="1"
+         id="stop3183" />
+    </linearGradient>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective10" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3179"
+       id="linearGradient3193"
+       x1="164.71428"
+       y1="344.79077"
+       x2="315.28571"
+       y2="344.79077"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.3187856,0,0,0.3187856,113.20576,133.30501)" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     gridtolerance="10000"
+     guidetolerance="10"
+     objecttolerance="10"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.5325"
+     inkscape:cx="-12.236982"
+     inkscape:cy="-5.5115365"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1440"
+     inkscape:window-height="842"
+     inkscape:window-x="0"
+     inkscape:window-y="0" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage"; />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-164.71428,-194.21933)">
+    <rect
+       style="opacity:1;fill:url(#linearGradient3193);fill-opacity:1;stroke:#fce94f;stroke-width:0.63757122;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect3157"
+       width="47.362427"
+       height="47.362431"
+       x="166.03307"
+       y="195.53812"
+       rx="3.187856"
+       ry="3.187856" />
+  </g>
+</svg>



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]