[gnome-games] [same-gnome-clutter] Import same-gnome from the Seed repository
- From: Tim Horton <hortont src gnome org>
- To: svn-commits-list gnome org
- Subject: [gnome-games] [same-gnome-clutter] Import same-gnome from the Seed repository
- Date: Thu, 16 Jul 2009 22:29:15 +0000 (UTC)
commit 822646553c2b44b9a5503eecad51dd31fadaed2f
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 c0915e8..63a7cf0 100644
--- a/configure.in
+++ b/configure.in
@@ -1250,6 +1250,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]