[librsvg/librsvg-2.44] (#334): Preserve the cairo_t's transformation matrix during rendering
- From: Federico Mena Quintero <federico src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [librsvg/librsvg-2.44] (#334): Preserve the cairo_t's transformation matrix during rendering
- Date: Tue, 9 Oct 2018 19:27:52 +0000 (UTC)
commit e79175ce43093ea3f0815e199616309543492fca
Author: Federico Mena Quintero <federico gnome org>
Date: Tue Oct 9 12:14:51 2018 -0500
(#334): Preserve the cairo_t's transformation matrix during rendering
Part of the API contract is that calls to rsvg_handle_render*() will
not modify the passed cairo_t. However, internally we were doing
cairo_save() only until after first creating the DrawingCtx,
and that operation modifies the cairo_t.
Fixes https://gitlab.gnome.org/GNOME/librsvg/issues/334
librsvg/rsvg-handle.c | 8 +-
tests/api.c | 56 +++-
tests/fixtures/api/334-element-positions.svg | 380 +++++++++++++++++++++++++++
3 files changed, 438 insertions(+), 6 deletions(-)
---
diff --git a/librsvg/rsvg-handle.c b/librsvg/rsvg-handle.c
index c469d6cc..ecdffdfb 100644
--- a/librsvg/rsvg-handle.c
+++ b/librsvg/rsvg-handle.c
@@ -1102,21 +1102,21 @@ rsvg_handle_render_cairo_sub (RsvgHandle * handle, cairo_t * cr, const char *id)
if (dimensions.width == 0 || dimensions.height == 0)
return FALSE;
+ cairo_save (cr);
+
draw = rsvg_handle_create_drawing_ctx (handle, cr, &dimensions);
if (drawsub != NULL) {
rsvg_drawing_ctx_add_node_and_ancestors_to_stack (draw, drawsub);
}
- cairo_save (cr);
-
rsvg_tree_cascade (handle->priv->tree);
res = rsvg_drawing_ctx_draw_node_from_stack (draw, handle->priv->tree);
- cairo_restore (cr);
-
rsvg_drawing_ctx_free (draw);
+ cairo_restore (cr);
+
return res;
}
diff --git a/tests/api.c b/tests/api.c
index 130259eb..9ea3ae97 100644
--- a/tests/api.c
+++ b/tests/api.c
@@ -15,8 +15,6 @@ rsvg_handle_get_base_uri
rsvg_handle_set_base_uri
rsvg_handle_set_size_callback
rsvg_handle_internal_set_testing
-rsvg_handle_render_cairo
-rsvg_handle_render_cairo_sub
rsvg_handle_set_base_gfile
rsvg_handle_get_title
rsvg_handle_get_desc
@@ -495,6 +493,17 @@ detects_cairo_context_in_error (void)
g_test_trap_assert_stderr ("*WARNING*cannot render on a cairo_t with a failure status*");
}
+static gboolean
+matrixes_are_equal (cairo_matrix_t *a, cairo_matrix_t *b)
+{
+ return (a->xx == b->xx &&
+ a->yx == b->yx &&
+ a->xy == b->xy &&
+ a->yy == b->yy &&
+ a->x0 == b->x0 &&
+ a->y0 == b->y0);
+}
+
static void
can_draw_to_non_image_surface (void)
{
@@ -520,13 +529,55 @@ can_draw_to_non_image_surface (void)
surface = cairo_recording_surface_create (CAIRO_CONTENT_COLOR_ALPHA, &rect);
cr = cairo_create (surface);
+ cairo_translate (cr, 42.0, 42.0);
+
+ cairo_matrix_t original_affine;
+ cairo_get_matrix (cr, &original_affine);
+
g_assert (rsvg_handle_render_cairo (handle, cr));
+ cairo_matrix_t new_affine;
+ cairo_get_matrix (cr, &new_affine);
+
+ g_assert (matrixes_are_equal (&original_affine, &new_affine));
+
g_object_unref (handle);
cairo_destroy (cr);
}
+/* Test that we preserve the affine transformation in the cr during a call
+ * to rsvg_handle_render_cairo_sub().
+ */
+static void
+render_cairo_sub (void)
+{
+ char *filename = get_test_filename ("334-element-positions.svg");
+ GError *error = NULL;
+
+ RsvgHandle *handle = rsvg_handle_new_from_file (filename, &error);
+ g_assert (handle != NULL);
+ g_assert (error == NULL);
+
+ cairo_surface_t *surf = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 200, 200);
+ cairo_t *cr = cairo_create (surf);
+
+ cairo_translate (cr, 42.0, 42.0);
+
+ cairo_matrix_t original_affine;
+ cairo_get_matrix (cr, &original_affine);
+
+ g_assert (rsvg_handle_render_cairo_sub (handle, cr, "#button5-leader"));
+
+ cairo_matrix_t new_affine;
+ cairo_get_matrix (cr, &new_affine);
+
+ g_assert (matrixes_are_equal (&original_affine, &new_affine));
+
+ g_object_unref (handle);
+ cairo_destroy (cr);
+}
+
int
main (int argc, char **argv)
{
@@ -555,6 +606,7 @@ main (int argc, char **argv)
g_test_add_func ("/api/dimensions_and_position", dimensions_and_position);
g_test_add_func ("/api/detects_cairo_context_in_error", detects_cairo_context_in_error);
g_test_add_func ("/api/can_draw_to_non_image_surface", can_draw_to_non_image_surface);
+ g_test_add_func ("/api/render_cairo_sub", render_cairo_sub);
return g_test_run ();
}
diff --git a/tests/fixtures/api/334-element-positions.svg b/tests/fixtures/api/334-element-positions.svg
new file mode 100644
index 00000000..4619e13c
--- /dev/null
+++ b/tests/fixtures/api/334-element-positions.svg
@@ -0,0 +1,380 @@
+<?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:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="409.2084"
+ height="411.271"
+ viewBox="0 0 409.2084 411.27099"
+ version="1.1"
+ id="svg8"
+ inkscape:version="0.92.1 r"
+ sodipodi:docname="logitech-g403.svg"
+ inkscape:export-filename="/home/jimmac/logitech-g403.png"
+ inkscape:export-xdpi="96"
+ inkscape:export-ydpi="96">
+ <defs
+ id="defs2" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1.4142135"
+ inkscape:cx="223.25242"
+ inkscape:cy="156.77583"
+ inkscape:document-units="px"
+ inkscape:current-layer="LEDs"
+ inkscape:document-rotation="0"
+ showgrid="false"
+ units="px"
+ borderlayer="true"
+ inkscape:showpageshadow="false"
+ inkscape:pagecheckerboard="false"
+ showguides="true"
+ inkscape:window-width="1366"
+ inkscape:window-height="704"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ fit-margin-top="20"
+ fit-margin-left="20"
+ fit-margin-bottom="20"
+ fit-margin-right="0">
+ <inkscape:grid
+ type="xygrid"
+ id="grid956"
+ originx="-68.791593"
+ originy="1.2767161" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata5">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="Device"
+ inkscape:label="Device"
+ transform="translate(-68.791597,-390.00576)">
+ <path
+ inkscape:connector-curvature="0"
+
style="color:#000000;overflow:visible;opacity:1;vector-effect:none;fill:#d3d3ce;fill-opacity:1;stroke:#babdb6;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
+ d="m 175.34499,424.02062 c -24.661,4.08226 -60.18056,22.01925 -69.18502,28.18484 -7.932853,5.43184
-10.801193,13.70196 -10.925233,20.94538 -0.72438,42.30084 10.273313,88.0482 7.561093,130.50252
-1.21026,18.94414 -7.437413,51.01218 -9.969593,64.24176 -1.65073,6.85296 -2.50133,13.87513 -2.53464,20.92508
2.7e-4,50.2338 40.610433,90.95628 90.705683,90.95655 45.46938,-0.0495 82.39643,-34.07041 89.82748,-79.05254
10.66083,-64.53278 10.42629,-136.39723 11.98541,-204.91567 0.28464,-12.50912 -1.94334,-23.29335
-8.32377,-31.80289 -13.26086,-21.57098 -66.73071,-40.02924 -66.73071,-40.02924 v 7.19061 h -32.4107 z"
+ id="path870"
+ sodipodi:nodetypes="cssscccssccccc" />
+ <path
+
style="color:#000000;overflow:visible;opacity:1;vector-effect:none;fill:#eeeeec;fill-opacity:1;stroke:#babdb6;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
+ d="m 208.56756,431.16702 -3,141.31424 c -0.14923,7.02936 -6.07063,12.69123 -13.61129,12.69123
-7.54065,0 -13.46205,-5.66187 -13.61128,-12.69123 l -3,-141.31424 z"
+ id="rect913"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cssscc" />
+ <path
+ sodipodi:nodetypes="cscsc"
+ inkscape:connector-curvature="0"
+ id="path950"
+ d="m 95.373251,486.43435 c 38.955159,101.12102 48.667459,140.67087 51.422819,177.84397
2.03646,27.47435 -36.96151,79.62933 -36.96151,79.62933 0,0 -24.033873,-37.15986 -19.463976,-61.45137
10.258966,-54.53208 19.996276,-75.99616 5.002667,-196.02193 z"
+
style="color:#000000;overflow:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#bfc2bb;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
/>
+ <path
+
style="color:#000000;overflow:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#babdb6;stroke-width:1;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
+ d="m 104.9358,539.80779 c 2.40195,-0.25238 2.7176,0.9048 2.96999,3.30675 l 5.69164,54.1678 c
0.25238,2.40194 -1.47813,4.53882 -3.88008,4.7912 -2.40195,0.25239 -5.44876,-8.75375 -5.55682,-11.1665 l
-2.02953,-45.3135 c -0.10806,-2.41275 0.40286,-5.53337 2.8048,-5.78575 z"
+ id="button4"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="sssssss"
+ inkscape:label="#rect921" />
+ <path
+ sodipodi:nodetypes="sssssss"
+ inkscape:connector-curvature="0"
+ id="button3"
+ d="m 109.77779,602.64876 c 2.40195,-0.25239 4.53882,1.47813 4.79121,3.88007 l 5.69164,54.1678 c
0.25238,2.40195 -1.47814,4.53883 -3.88008,4.79121 -2.40195,0.25238 -7.77772,-8.87659 -7.89239,-11.28904 l
-1.91843,-40.36308 c -0.11466,-2.41244 0.8061,-10.93458 3.20805,-11.18696 z"
+
style="color:#000000;overflow:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#babdb6;stroke-width:1;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
+ inkscape:label="#path924" />
+ <rect
+
style="color:#000000;overflow:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#babdb6;stroke-width:1;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
+ id="button2"
+ width="23.155933"
+ height="69.467796"
+ x="180.55382"
+ y="454.99139"
+ rx="11.577967"
+ ry="11.577967"
+ inkscape:label="#rect932" />
+ <path
+ sodipodi:nodetypes="cssscc"
+ inkscape:connector-curvature="0"
+ id="button5"
+ d="m 201.20722,551.97605 -0.65676,17.92859 c -0.16469,4.49569 -3.83301,8.12045 -8.59419,8.12045
-4.76117,0 -8.49995,-3.62273 -8.59417,-8.12045 l -0.65677,-17.92859 z"
+
style="color:#000000;overflow:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#babdb6;stroke-width:1;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
+ inkscape:label="#path942" />
+ <path
+
style="color:#000000;overflow:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#bfc2bb;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
+ d="m 281.45725,491.14612 c -30.15796,102.59778 -42.11413,137.63368 -50.74442,173.1322
-6.50823,26.76995 22.13723,79.62933 22.13723,79.62933 0,0 13.58979,-21.97214 16.0745,-32.60727
16.80373,-71.92371 12.53269,-220.15426 12.53269,-220.15426 z"
+ id="path946"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cscsc" />
+ <path
+
style="color:#000000;overflow:visible;opacity:1;vector-effect:none;fill:#d3d3ce;fill-opacity:1;stroke:#bfc2bb;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
+ d="m 207.75569,423.97641 -1.77476,128.93066 47.96839,25.54626 27.50793,-87.30721 c 4.86457,-36.68335
-44.6715,-55.30429 -73.70156,-67.16971 z"
+ id="button1"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc"
+ inkscape:label="#path944" />
+ <path
+ sodipodi:nodetypes="ccccsc"
+ inkscape:connector-curvature="0"
+ id="button0"
+ d="m 174.78525,423.6101 3.03798,129.76808 -49.23161,25.07515 -33.218369,-92.01898 c
-1.039426,-19.85252 -0.81982,-28.05969 15.888469,-37.87541 17.53477,-10.30125 42.4825,-20.7564
63.52353,-24.94884 z"
+
style="color:#000000;overflow:visible;opacity:1;vector-effect:none;fill:#d3d3ce;fill-opacity:1;stroke:#bfc2bb;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
+ inkscape:label="#path948" />
+ <path
+
style="color:#000000;display:inline;overflow:visible;vector-effect:none;fill:none;fill-opacity:1;stroke:#babdb6;stroke-width:10;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="led0"
+ sodipodi:type="arc"
+ sodipodi:cx="-656.78052"
+ sodipodi:cy="189.57951"
+ sodipodi:rx="19.936752"
+ sodipodi:ry="19.936752"
+ sodipodi:start="0.78539816"
+ sodipodi:end="5.4977871"
+ sodipodi:arc-type="arc"
+ d="m -642.6831,203.67693 a 19.936752,19.936752 0 0 1 -28.19483,0 19.936752,19.936752 0 0 1
0,-28.19483 19.936752,19.936752 0 0 1 28.19482,0"
+ sodipodi:open="true"
+ transform="rotate(-90)"
+ inkscape:label="#path883" />
+ <path
+
style="fill:#babdb6;fill-opacity:1;stroke:#babdb6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 192.13178,454.61765 c 0,70.18035 0,70.18035 0,70.18035"
+ id="led1"
+ inkscape:connector-curvature="0"
+ inkscape:label="#path42" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="Buttons"
+ inkscape:label="Buttons"
+ style="display:inline"
+ transform="translate(-68.791597,9.994236)">
+ <g
+ id="button1-path"
+ inkscape:label="#g131">
+ <path
+ sodipodi:nodetypes="cc"
+
style="color:#000000;overflow:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#888a85;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
+ d="M 242.94764,50.505764 H 477"
+ id="path958"
+ inkscape:connector-curvature="0" />
+ <rect
+
style="color:#000000;overflow:visible;opacity:1;vector-effect:none;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
+ id="rect968"
+ width="6.999999"
+ height="6.999999"
+ x="237"
+ y="47.005764" />
+ <rect
+ inkscape:label="#rect867"
+
style="color:#000000;text-align:start;overflow:visible;vector-effect:none;fill:#888a85;fill-opacity:1;stroke:none;stroke-linecap:round"
+ id="button1-leader"
+ width="1"
+ height="1"
+ x="477"
+ y="50.005764" />
+ </g>
+ <g
+ id="button0-path"
+ inkscape:label="#g141">
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path960"
+ d="M 477,130.50576 H 161.34398"
+
style="color:#000000;overflow:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#888a85;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
/>
+ <rect
+ y="127.00576"
+ x="157"
+ height="6.999999"
+ width="6.999999"
+ id="rect970"
+
style="color:#000000;overflow:visible;opacity:1;vector-effect:none;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
/>
+ <rect
+ inkscape:label="#rect871"
+
style="color:#000000;text-align:start;overflow:visible;vector-effect:none;fill:#888a85;fill-opacity:1;stroke:none;stroke-linecap:round"
+ id="button0-leader"
+ width="1"
+ height="1"
+ x="477"
+ y="130.00577" />
+ </g>
+ <g
+ id="button4-path"
+ inkscape:label="#g151">
+ <path
+ sodipodi:nodetypes="ccc"
+ inkscape:connector-curvature="0"
+ id="path964"
+ d="M 109.31232,181.51438 137.74787,210.44326 477,210.50576"
+
style="color:#000000;overflow:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#888a85;stroke-width:0.99999994;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
/>
+ <rect
+ inkscape:label="#rect875"
+
style="color:#000000;text-align:start;overflow:visible;vector-effect:none;fill:#888a85;fill-opacity:1;stroke:none;stroke-linecap:round"
+ id="button4-leader"
+ width="1"
+ height="1"
+ x="477"
+ y="210.00577" />
+ <rect
+ y="177"
+ x="105"
+ height="6.999999"
+ width="6.999999"
+ id="rect974"
+
style="color:#000000;overflow:visible;opacity:1;vector-effect:none;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
/>
+ </g>
+ <g
+ id="button2-path"
+ inkscape:label="#g136">
+ <rect
+ inkscape:label="#rect869"
+ y="90.00576"
+ x="477"
+ height="1"
+ width="1"
+ id="button2-leader"
+
style="color:#000000;text-align:start;overflow:visible;vector-effect:none;fill:#888a85;fill-opacity:1;stroke:none;stroke-linecap:round"
/>
+ <path
+
style="color:#000000;overflow:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#888a85;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
+ d="m 195.97852,108.49147 17.9857,-17.98571 H 477"
+ id="path908"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <rect
+
style="color:#000000;overflow:visible;opacity:1;vector-effect:none;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
+ id="rect910"
+ width="6.999999"
+ height="6.999999"
+ x="194"
+ y="104" />
+ </g>
+ <g
+ id="button3-path"
+ inkscape:label="#g156">
+ <path
+ sodipodi:nodetypes="cc"
+
style="color:#000000;overflow:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#888a85;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
+ d="M 114.17805,250.50576 H 477"
+ id="path966"
+ inkscape:connector-curvature="0" />
+ <rect
+
style="color:#000000;overflow:visible;opacity:1;vector-effect:none;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
+ id="rect976"
+ width="6.999999"
+ height="6.999999"
+ x="108"
+ y="247.00577" />
+ <rect
+ y="250.00575"
+ x="477"
+ height="1"
+ width="1"
+ id="button3-leader"
+
style="color:#000000;text-align:start;overflow:visible;vector-effect:none;fill:#888a85;fill-opacity:1;stroke:none;stroke-linecap:round"
+ inkscape:label="#rect875" />
+ </g>
+ <g
+ id="button5-path"
+ inkscape:label="#g146">
+ <path
+
style="color:#000000;overflow:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#888a85;stroke-width:0.99999994;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
+ d="M 476.55132,170.50615 H 193.34398"
+ id="path51"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <rect
+
style="color:#000000;overflow:visible;opacity:1;vector-effect:none;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
+ id="rect53"
+ width="6.999999"
+ height="6.999999"
+ x="189"
+ y="167" />
+ <rect
+ y="170"
+ x="477"
+ height="1"
+ width="1"
+ id="button5-leader"
+
style="color:#000000;text-align:start;overflow:visible;vector-effect:none;fill:#888a85;fill-opacity:1;stroke:none;stroke-linecap:round"
+ inkscape:label="#rect871" />
+ </g>
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="LEDs"
+ inkscape:label="LEDs"
+ style="display:inline"
+ transform="translate(-68.791597,9.994236)">
+ <g
+ id="led0-path"
+ inkscape:label="#g161">
+ <path
+ inkscape:connector-curvature="0"
+ id="path877"
+ d="M 477,290.50577 H 208.64438 l -18.97696,-18.97696"
+
style="color:#000000;display:inline;overflow:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#888a85;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
+ sodipodi:nodetypes="cc" />
+ <rect
+ y="271"
+ x="186"
+ height="6.999999"
+ width="6.999999"
+ id="rect879"
+
style="color:#000000;display:inline;overflow:visible;opacity:1;vector-effect:none;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
/>
+ <rect
+ inkscape:label="#rect881"
+ y="290.00577"
+ x="477"
+ height="1"
+ width="1"
+ id="led0-leader"
+
style="color:#000000;text-align:start;display:inline;overflow:visible;vector-effect:none;fill:#888a85;fill-opacity:1;stroke:none;stroke-linecap:round"
/>
+ </g>
+ <g
+ id="led1-path"
+ inkscape:label="#g126">
+ <path
+ sodipodi:nodetypes="ccc"
+
style="color:#000000;display:inline;overflow:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#888a85;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
+ d="M 476.99745,10.505764 H 247.7728 l -51.03686,51.503873"
+ id="path4525"
+ inkscape:connector-curvature="0" />
+ <rect
+
style="color:#000000;text-align:start;display:inline;overflow:visible;vector-effect:none;fill:#888a85;fill-opacity:1;stroke:none;stroke-linecap:round"
+ id="led1-leader"
+ width="1"
+ height="1"
+ x="477"
+ y="10.005764"
+ inkscape:label="#rect881" />
+ <rect
+
style="color:#000000;display:inline;overflow:visible;opacity:1;vector-effect:none;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
+ id="rect4544"
+ width="6.999999"
+ height="6.999999"
+ x="190.67345"
+ y="59.51358" />
+ </g>
+ </g>
+</svg>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]