changeset 27:f3d91579bb28

Checkpoint
author David Bryant <daveb@acres.com.au>
date Wed, 29 Jul 2009 14:11:35 +0930
parents 06c30d250c0a
children 1754cb773d41
files build.sh dia/grid_layer.d dia/icanvas.d dia/standard_tools.d doodle.d fig/fig.d fig/fig_layer.d fig/layer.d fig/selection_layer.d gtk/canvas.d gtk/tool_bar.d gtk/zoom_controls.d icons/select.png icons/select.svg
diffstat 14 files changed, 396 insertions(+), 97 deletions(-) [+]
line wrap: on
line diff
--- a/build.sh	Thu Jul 16 00:12:02 2009 +0930
+++ b/build.sh	Wed Jul 29 14:11:35 2009 +0930
@@ -6,8 +6,8 @@
         doodle.d \
         cairo/routines.d \
         dia/grid_layer.d dia/icanvas.d dia/page_layer.d dia/standard_tools.d dia/tool.d dia/tool_layer.d \
-        fig/layer.d \
-        gtk/canvas.d gtk/conversions.d \
+        fig/fig_layer.d fig/selection_layer.d \
+        gtk/canvas.d gtk/conversions.d gtk/tool_bar.d \
         tk/events.d tk/geometry.d tk/misc.d tk/types.d \
         -I"${DMD_BASE}/include/d" \
         -L-lgtkd -L-ldl
--- a/dia/grid_layer.d	Thu Jul 16 00:12:02 2009 +0930
+++ b/dia/grid_layer.d	Wed Jul 29 14:11:35 2009 +0930
@@ -25,7 +25,7 @@
     override void draw(in Viewport viewport,
                        in Rectangle pixel_damage, scope Context pixel_cr,
                        in Rectangle model_damage, scope Context model_cr) const {
-        double zoom = viewport.zoom;
+        //double zoom = viewport.zoom;
 
         //double start_x = modf(damage.min_corner.x, zoom);
     }
--- a/dia/icanvas.d	Thu Jul 16 00:12:02 2009 +0930
+++ b/dia/icanvas.d	Wed Jul 29 14:11:35 2009 +0930
@@ -6,12 +6,21 @@
     import cairo.Context;
 }
 
+private {
+    import std.typecons;
+}
+
+mixin(defineEnum!("Cursor",
+                  "DEFAULT", "HAND", "CROSSHAIR"));
+
 interface Viewport {
     void zoom_relative(in Point pixel_datum, in double factor);
     void pan_relative(in Vector pixel_displacement);
+    void set_cursor(in Cursor cursor);
     void damage_model(in Rectangle area);      // FIXME could be an inout parameter of the event handling, or a special scope Damage object that supports growth only
     void damage_pixel(in Rectangle area);      // FIXME as above
 
+    /*
     // FIXME not sure about these:
     double zoom() const;
     Point model_to_pixel(in Point model) const;
@@ -22,6 +31,7 @@
     Rectangle pixel_to_model(in Rectangle model) const;
     double model_to_pixel(in double model) const;
     double pixel_to_model(in double pixel) const;
+    */
 }
 
 interface EventHandler {
--- a/dia/standard_tools.d	Thu Jul 16 00:12:02 2009 +0930
+++ b/dia/standard_tools.d	Wed Jul 29 14:11:35 2009 +0930
@@ -94,6 +94,7 @@
         if (event.button_name == ButtonName.LEFT) {
             mActive = true;
             mAnchorPoint = mCurrentPoint = event.pixel_point;
+            viewport.set_cursor(Cursor.HAND);
             return true;
         }
         else {
@@ -105,6 +106,7 @@
         if (event.button_name == ButtonName.LEFT && mActive) {
             mActive = false;
             viewport.damage_pixel(Rectangle(mAnchorPoint, mCurrentPoint).feathered(LINE_WIDTH / 2.0));
+            viewport.set_cursor(Cursor.DEFAULT);
             return true;
         }
         else {
--- a/doodle.d	Thu Jul 16 00:12:02 2009 +0930
+++ b/doodle.d	Wed Jul 29 14:11:35 2009 +0930
@@ -1,13 +1,16 @@
 module doodle;
 
 private {
-    import gtk.canvas;
     import dia.tool_layer;
     import dia.standard_tools;
     import dia.page_layer;
 
+    import gtk.canvas;
+    import gtk.toolbar;
+
     import gtk.Main;
     import gtk.MainWindow;
+    import gtk.VBox;
 
     import std.stdio;
 }
@@ -15,6 +18,9 @@
 void main(string[] args) {
     Main.init(args);
     auto window = new MainWindow("Doodle");
+    auto vbox = new VBox(false, 0);
+    auto tool_bar = new ToolBar;
+    vbox.packStart(tool_bar, false, false, 0);
     Tool[] tools;
     tools ~= new PanTool;
     tools ~= new ZoomTool;
@@ -24,7 +30,8 @@
     layers ~= new PageLayer("Page");
     layers ~= tool_layer;
     auto canvas = new Canvas(layers, tool_layer, 120.0);
-    window.add(canvas);
+    vbox.packStart(canvas, true, true, 0);
+    window.add(vbox);
     window.setDefaultSize(380, 380);
     window.showAll();
     Main.run();
--- a/fig/fig.d	Thu Jul 16 00:12:02 2009 +0930
+++ b/fig/fig.d	Wed Jul 29 14:11:35 2009 +0930
@@ -1,5 +1,27 @@
 module fig.fig;
 
 abstract class Fig {
-    abstract void draw();
+    Rectangle bounds() const;
+    void draw(in Rectangle damage, scope Context cr) const;
+
+    private {
+    }
+}
+
+abstract class FigElement : Fig {
+}
+
+class Connector {
 }
+
+class FigNode : FigElement {
+}
+
+class FigEdge : FigElement {
+    private {
+        FigElement
+    }
+}
+
+abstract class FigLeaf : Fig {
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fig/fig_layer.d	Wed Jul 29 14:11:35 2009 +0930
@@ -0,0 +1,24 @@
+module fig.fig_layer;
+
+public {
+    import dia.icanvas;
+}
+
+class FigLayer : Layer {
+    this(in string name) {
+        super(name);
+    }
+
+    override Rectangle bounds() const {
+        return Rectangle.DEFAULT;
+    }
+
+    override void draw(in Viewport viewport,
+                       in Rectangle pixel_damage, scope Context pixel_cr,
+                       in Rectangle model_damage, scope Context model_cr) const {
+    }
+
+    private {
+        //Fig[] mFigs;
+    }
+}
--- a/fig/layer.d	Thu Jul 16 00:12:02 2009 +0930
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,23 +0,0 @@
-module fig.layer;
-
-public {
-    import dia.icanvas;
-}
-
-class Layer : dia.icanvas.Layer {
-    this(in string name) {
-        super(name);
-    }
-
-    override Rectangle bounds() const {
-        return Rectangle.DEFAULT;
-    }
-
-    void draw(in Viewport viewport,
-              in Rectangle pixel_damage, scope Context pixel_cr,
-              in Rectangle model_damage, scope Context model_cr) const {
-    }
-
-    private {
-    }
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fig/selection_layer.d	Wed Jul 29 14:11:35 2009 +0930
@@ -0,0 +1,22 @@
+module fig.selection_layer;
+
+/*
+public {
+    import dia.icanvas;
+}
+
+class SelectionLayer : Layer {
+    this(in string name) {
+        super(name);
+    }
+
+    private {
+        // Selector[] mSelectors;
+    }
+}
+
+abstract class Selector {
+    private {
+    }
+}
+*/
--- a/gtk/canvas.d	Thu Jul 16 00:12:02 2009 +0930
+++ b/gtk/canvas.d	Wed Jul 29 14:11:35 2009 +0930
@@ -68,17 +68,17 @@
         mVRuler.setMetric(MetricType.PIXELS);
 
         mDrawingArea = new DrawingArea;
-        mDrawingArea.addOnRealize(&onRealize);
-        mDrawingArea.addOnConfigure(&onConfigure);
-        mDrawingArea.addOnExpose(&onExpose);
-        mDrawingArea.addOnButtonPress(&onButtonPress);
-        mDrawingArea.addOnButtonRelease(&onButtonRelease);
-        mDrawingArea.addOnKeyPress(&onKeyEvent);
-        mDrawingArea.addOnKeyRelease(&onKeyEvent);
-        mDrawingArea.addOnMotionNotify(&onMotionNotify);
-        mDrawingArea.addOnScroll(&onScroll);
-        mDrawingArea.addOnEnterNotify(&onEnterNotify);
-        mDrawingArea.addOnLeaveNotify(&onLeaveNotify);
+        mDrawingArea.addOnRealize(&on_realize);
+        mDrawingArea.addOnConfigure(&on_configure);
+        mDrawingArea.addOnExpose(&on_expose);
+        mDrawingArea.addOnButtonPress(&on_button_press);
+        mDrawingArea.addOnButtonRelease(&on_button_release);
+        mDrawingArea.addOnKeyPress(&on_key_event);
+        mDrawingArea.addOnKeyRelease(&on_key_event);
+        mDrawingArea.addOnMotionNotify(&on_motion_notify);
+        mDrawingArea.addOnScroll(&on_scroll);
+        mDrawingArea.addOnEnterNotify(&on_enter_notify);
+        mDrawingArea.addOnLeaveNotify(&on_leave_notify);
         mDrawingArea.setEvents(EventMask.EXPOSURE_MASK |
                                EventMask.POINTER_MOTION_MASK |
                                EventMask.POINTER_MOTION_HINT_MASK |
@@ -145,6 +145,24 @@
         queueDraw;
     }
 
+    override void set_cursor(in Cursor cursor) {
+        CursorType cursor_type;
+
+        switch (cursor) {
+        case Cursor.DEFAULT:
+            cursor_type = CursorType.ARROW;
+            break;
+        case Cursor.HAND:
+            cursor_type = CursorType.HAND1;
+            break;
+        case Cursor.CROSSHAIR:
+            cursor_type = CursorType.CROSSHAIR;
+            break;
+        }
+
+        mDrawingArea.setCursor(new gdk.Cursor.Cursor(cursor_type));
+    }
+
     override void damage_model(in Rectangle area) {
         mDamage = mDamage | model_to_pixel(area);
     }
@@ -153,50 +171,9 @@
         mDamage = mDamage | area;
     }
 
-    override double zoom() const {
-        return mZoom;
-    }
-
-    override Point model_to_pixel(in Point model) const {
-        return Point.DEFAULT + mViewSize / 2.0 + mZoom * (model - mViewCentre);
-    }
-
-    override Point pixel_to_model(in Point pixel) const {
-        return mViewCentre + (pixel - mViewSize / 2.0 - Point.DEFAULT) / mZoom;
-    }
-
-    override Vector model_to_pixel(in Vector model) const {
-        return mZoom * model;
-    }
-
-    override Vector pixel_to_model(in Vector pixel) const {
-        return pixel / mZoom;
-    }
-
-    override double model_to_pixel(in double model) const {
-        return mZoom * model;
-    }
-
-    override double pixel_to_model(in double pixel) const {
-        return pixel / mZoom;
-    }
-
-    override Rectangle model_to_pixel(in Rectangle model) const {
-        return Rectangle(model_to_pixel(model.position), model_to_pixel(model.size));
-    }
-
-    override Rectangle pixel_to_model(in Rectangle model) const {
-        return Rectangle(pixel_to_model(model.position), pixel_to_model(model.size));
-    }
-
     private {
 
-        void onRealize(Widget widget) {
-            assert(widget is mDrawingArea);
-            //writefln("Got realize\n");
-        }
-
-        bool onConfigure(GdkEventConfigure * event, Widget widget) {
+        bool on_configure(GdkEventConfigure * event, Widget widget) {
             assert(widget is mDrawingArea);
 
             if (!mHadConfigure) {
@@ -230,7 +207,7 @@
             return true;
         }
 
-        bool onExpose(GdkEventExpose * event, Widget widget) {
+        bool on_expose(GdkEventExpose * event, Widget widget) {
             assert(widget is mDrawingArea);
 
             Drawable dr = mDrawingArea.getWindow;
@@ -294,7 +271,7 @@
             return true;
         }
 
-        bool onButtonPress(GdkEventButton * event, Widget widget) {
+        bool on_button_press(GdkEventButton * event, Widget widget) {
             assert(widget is mDrawingArea);
             //writefln("Got button event\n");
 
@@ -314,7 +291,7 @@
             return true;
         }
 
-        bool onButtonRelease(GdkEventButton * event, Widget widget) {
+        bool on_button_release(GdkEventButton * event, Widget widget) {
             assert(widget is mDrawingArea);
             //writefln("Got button event\n");
 
@@ -334,7 +311,7 @@
             return true;
         }
 
-        bool onKeyEvent(GdkEventKey * event, Widget widget) {
+        bool on_key_event(GdkEventKey * event, Widget widget) {
             assert(widget is mDrawingArea);
             //writefln("Got key event\n");
 
@@ -346,7 +323,7 @@
             return true;
         }
 
-        bool onMotionNotify(GdkEventMotion * event, Widget widget) {
+        bool on_motion_notify(GdkEventMotion * event, Widget widget) {
             assert(widget is mDrawingArea);
             //writefln("Got motion notify\n");
             gtk_widget_event(mHRuler.getWidgetStruct(), cast(GdkEvent *)event);
@@ -366,7 +343,7 @@
             return true;
         }
 
-        bool onScroll(GdkEventScroll * event, Widget widget) {
+        bool on_scroll(GdkEventScroll * event, Widget widget) {
             assert(widget is mDrawingArea);
             //writefln("Got scroll\n");
 
@@ -412,15 +389,17 @@
         }
         */
 
-        bool onEnterNotify(GdkEventCrossing * event, Widget widget) {
+        bool on_enter_notify(GdkEventCrossing * event, Widget widget) {
             assert(widget is mDrawingArea);
-            writefln("Enter %d %d %d", cast(int)event.mode, event.focus, event.state);
+            //writefln("Enter %d %d %d", cast(int)event.mode, event.focus, event.state);
+            // TODO
             return true;
         }
 
-        bool onLeaveNotify(GdkEventCrossing * event, Widget widget) {
+        bool on_leave_notify(GdkEventCrossing * event, Widget widget) {
             assert(widget is mDrawingArea);
-            writefln("Leave %d %d %d", cast(int)event.mode, event.focus, event.state);
+            //writefln("Leave %d %d %d", cast(int)event.mode, event.focus, event.state);
+            // TODO
             return true;
         }
 
@@ -505,11 +484,7 @@
                 //writefln("Damage: %s", mDamage);
                 int x, y, w, h;
                 mDamage.get_quantised(x, y, w, h);
-                //writefln("Quantised damage: %d %d %d %d", x, y, w, h);
-                y = cast(int)mViewSize.y - (y + h);         // Flip vertical axis
-                //writefln("Flipped Quantised damage: %d %d %d %d", x, y, w, h);
-                mDrawingArea.queueDrawArea(x, y, w, h);
-                //mDrawingArea.queueDraw();
+                mDrawingArea.queueDrawArea(x, cast(int)mViewSize.y - (y + h), w, h);
                 mDamage = Rectangle.DEFAULT;
             }
             else {
@@ -519,6 +494,35 @@
 
         double clamp_zoom(in double zoom) { return clamp(zoom, 0.2, 10.0); }
 
+        Point model_to_pixel(in Point model) const {
+            return Point.DEFAULT + mViewSize / 2.0 + mZoom * (model - mViewCentre);
+        }
+
+        Point pixel_to_model(in Point pixel) const {
+            return mViewCentre + (pixel - mViewSize / 2.0 - Point.DEFAULT) / mZoom;
+        }
+
+        Vector model_to_pixel(in Vector model) const {
+            return mZoom * model;
+        }
+
+        Vector pixel_to_model(in Vector pixel) const {
+            return pixel / mZoom;
+        }
+
+        Rectangle model_to_pixel(in Rectangle model) const {
+            return Rectangle(model_to_pixel(model.position), model_to_pixel(model.size));
+        }
+
+        Rectangle pixel_to_model(in Rectangle model) const {
+            return Rectangle(pixel_to_model(model.position), pixel_to_model(model.size));
+        }
+
+        void on_realize(Widget widget) {
+            assert(widget is mDrawingArea);
+            //writefln("Got realize\n");
+        }
+
         bool mHadConfigure;
         Rectangle mDamage;          // pixels
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gtk/tool_bar.d	Wed Jul 29 14:11:35 2009 +0930
@@ -0,0 +1,63 @@
+module gtk.toolbar;
+
+public {
+    import gtk.Toolbar;
+}
+
+private {
+    import gtk.ToolButton;
+    import gtk.SeparatorToolItem;
+    import gtk.RadioToolButton;
+    import gtk.Image;
+
+    import glib.ListSG;
+
+    import std.stdio;
+}
+
+class ToolBar : Toolbar {
+    this() {
+        // INVALID, MENU, SMALL_TOOLBAR, LARGE_TOOLBAR,
+        // BUTTON, DND, DIALOG
+        setIconSize(GtkIconSize.LARGE_TOOLBAR);
+	// ICONS, TEXT, BOTH, BOTH_HORIZ
+        setStyle(GtkToolbarStyle.ICONS);
+	// HORIZONTAL, VERTICAL
+        setOrientation(GtkOrientation.HORIZONTAL);
+        setTooltips(true);
+
+        Image image;
+        ListSG group;
+
+        image = new Image("icons/select.svg");
+        button1 = new RadioToolButton(group);
+        button1.setLabelWidget(image);
+        insert(button1);
+
+        image = new Image("icons/select.png");
+        button2 = new RadioToolButton(group);
+        button2.setGroup(button1.getGroup);
+        button2.setLabelWidget(image);
+        button2.addOnClicked(&on_clicked);
+        insert(button2);
+
+        insert(new SeparatorToolItem);
+
+        image = new Image("icons/select.png");
+        button3 = new RadioToolButton(group);
+        button3.setGroup(button1.getGroup);
+        button3.setLabelWidget(image);
+        insert(button3);
+    }
+
+    private {
+
+        void on_clicked(ToolButton tool_button) {
+            writefln("Clicked!");
+        }
+
+        RadioToolButton button1;
+        RadioToolButton button2;
+        RadioToolButton button3;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gtk/zoom_controls.d	Wed Jul 29 14:11:35 2009 +0930
@@ -0,0 +1,20 @@
+module gtk.zoom_controls;
+
+public {
+    import gtk.HBox;
+}
+
+private {
+}
+
+// Useful actions
+// Zoom to fit contents, Zoom 1:1, zoom in/out (coarse/fine)
+// Manually specified zoom?
+
+class ZoomControls : HBox {
+    this() {
+    }
+
+    private {
+    }
+}
Binary file icons/select.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/icons/select.svg	Wed Jul 29 14:11:35 2009 +0930
@@ -0,0 +1,148 @@
+<?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="32px"
+   height="32px"
+   id="svg2383"
+   sodipodi:version="0.32"
+   inkscape:version="0.46"
+   sodipodi:docname="select.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   inkscape:export-filename="/home/daveb/select.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs2385">
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3262">
+      <stop
+         style="stop-color:#6bfff4;stop-opacity:1;"
+         offset="0"
+         id="stop3264" />
+      <stop
+         style="stop-color:#6bfff4;stop-opacity:0;"
+         offset="1"
+         id="stop3266" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3254">
+      <stop
+         style="stop-color:#6bfff4;stop-opacity:1;"
+         offset="0"
+         id="stop3256" />
+      <stop
+         style="stop-color:#6bfff4;stop-opacity:0;"
+         offset="1"
+         id="stop3258" />
+    </linearGradient>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 16 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="32 : 16 : 1"
+       inkscape:persp3d-origin="16 : 10.666667 : 1"
+       id="perspective2391" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3262"
+       id="linearGradient3268"
+       x1="1.1039745"
+       y1="15.925417"
+       x2="30.955889"
+       y2="15.925417"
+       gradientUnits="userSpaceOnUse" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="7.9180417"
+     inkscape:cx="12.16509"
+     inkscape:cy="15.571721"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="637"
+     inkscape:window-height="724"
+     inkscape:window-x="36"
+     inkscape:window-y="6" />
+  <metadata
+     id="metadata2388">
+    <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
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer">
+    <path
+       style="fill:url(#linearGradient3268);fill-rule:evenodd;stroke:#000000;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;fill-opacity:1"
+       d="M 2.0539745,26.552502 L 16.34884,11.891449 L 4.8466724,8.9175157 L 30.005889,1.7262016 L 22.047836,26.072714 L 19.594399,14.653503 L 5.7154073,30.124632 L 2.0539745,26.552502 z"
+       id="path2395"
+       sodipodi:nodetypes="cccccccc" />
+    <path
+       sodipodi:nodetypes="cccccccc"
+       id="path3274"
+       d="M 2.0539745,26.552502 L 16.34884,11.891449 L 4.8466724,8.9175157 L 30.005889,1.7262016 L 22.047836,26.072714 L 19.594399,14.653503 L 5.7154073,30.124632 L 2.0539745,26.552502 z"
+       style="fill:url(#linearGradient3268);fill-rule:evenodd;stroke:#000000;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;fill-opacity:1" />
+    <path
+       style="fill:url(#linearGradient3268);fill-rule:evenodd;stroke:#000000;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;fill-opacity:1"
+       d="M 2.0539745,26.552502 L 16.34884,11.891449 L 4.8466724,8.9175157 L 30.005889,1.7262016 L 22.047836,26.072714 L 19.594399,14.653503 L 5.7154073,30.124632 L 2.0539745,26.552502 z"
+       id="path3276"
+       sodipodi:nodetypes="cccccccc" />
+    <path
+       sodipodi:nodetypes="cccccccc"
+       id="path3278"
+       d="M 2.0539745,26.552502 L 16.34884,11.891449 L 4.8466724,8.9175157 L 30.005889,1.7262016 L 22.047836,26.072714 L 19.594399,14.653503 L 5.7154073,30.124632 L 2.0539745,26.552502 z"
+       style="fill:url(#linearGradient3268);fill-rule:evenodd;stroke:#000000;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;fill-opacity:1" />
+    <path
+       style="fill:url(#linearGradient3268);fill-rule:evenodd;stroke:#000000;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;fill-opacity:1"
+       d="M 2.0539745,26.552502 L 16.34884,11.891449 L 4.8466724,8.9175157 L 30.005889,1.7262016 L 22.047836,26.072714 L 19.594399,14.653503 L 5.7154073,30.124632 L 2.0539745,26.552502 z"
+       id="path3280"
+       sodipodi:nodetypes="cccccccc" />
+    <path
+       sodipodi:nodetypes="cccccccc"
+       id="path3282"
+       d="M 2.0539745,26.552502 L 16.34884,11.891449 L 4.8466724,8.9175157 L 30.005889,1.7262016 L 22.047836,26.072714 L 19.594399,14.653503 L 5.7154073,30.124632 L 2.0539745,26.552502 z"
+       style="fill:url(#linearGradient3268);fill-rule:evenodd;stroke:#000000;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;fill-opacity:1" />
+    <path
+       style="fill:url(#linearGradient3268);fill-rule:evenodd;stroke:#000000;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;fill-opacity:1"
+       d="M 2.0539745,26.552502 L 16.34884,11.891449 L 4.8466724,8.9175157 L 30.005889,1.7262016 L 22.047836,26.072714 L 19.594399,14.653503 L 5.7154073,30.124632 L 2.0539745,26.552502 z"
+       id="path3284"
+       sodipodi:nodetypes="cccccccc" />
+    <path
+       sodipodi:nodetypes="cccccccc"
+       id="path3286"
+       d="M 2.0539745,26.552502 L 16.34884,11.891449 L 4.8466724,8.9175157 L 30.005889,1.7262016 L 22.047836,26.072714 L 19.594399,14.653503 L 5.7154073,30.124632 L 2.0539745,26.552502 z"
+       style="fill:url(#linearGradient3268);fill-rule:evenodd;stroke:#000000;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;fill-opacity:1" />
+    <path
+       style="fill:url(#linearGradient3268);fill-rule:evenodd;stroke:#000000;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;fill-opacity:1"
+       d="M 2.0539745,26.552502 L 16.34884,11.891449 L 4.8466724,8.9175157 L 30.005889,1.7262016 L 22.047836,26.072714 L 19.594399,14.653503 L 5.7154073,30.124632 L 2.0539745,26.552502 z"
+       id="path3288"
+       sodipodi:nodetypes="cccccccc" />
+    <path
+       sodipodi:nodetypes="cccccccc"
+       id="path3290"
+       d="M 2.0539745,26.552502 L 16.34884,11.891449 L 4.8466724,8.9175157 L 30.005889,1.7262016 L 22.047836,26.072714 L 19.594399,14.653503 L 5.7154073,30.124632 L 2.0539745,26.552502 z"
+       style="fill:url(#linearGradient3268);fill-rule:evenodd;stroke:#000000;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;fill-opacity:1" />
+  </g>
+</svg>