Code

Merge GSoC2009 Connectors into trunk
authorArcadie M. Cracan <acracan@gmail.com>
Wed, 2 Dec 2009 20:26:44 +0000 (22:26 +0200)
committerArcadie M. Cracan <acracan@gmail.com>
Wed, 2 Dec 2009 20:26:44 +0000 (22:26 +0200)
51 files changed:
po/inkscape.pot [deleted file]
share/icons/icons.svg
src/CMakeLists.txt
src/Makefile_insert
src/attributes.cpp
src/attributes.h
src/conn-avoid-ref.cpp
src/conn-avoid-ref.h
src/connector-context.cpp
src/connector-context.h
src/document.cpp
src/document.h
src/graphlayout/graphlayout.cpp
src/libavoid/CMakeLists.txt
src/libavoid/Makefile_insert
src/libavoid/connector.cpp
src/libavoid/connector.h
src/libavoid/debug.h
src/libavoid/geometry.cpp
src/libavoid/geometry.h
src/libavoid/geomtypes.h
src/libavoid/graph.cpp
src/libavoid/graph.h
src/libavoid/libavoid.h
src/libavoid/makepath.cpp
src/libavoid/makepath.h
src/libavoid/polyutil.cpp [deleted file]
src/libavoid/polyutil.h [deleted file]
src/libavoid/region.cpp [deleted file]
src/libavoid/region.h [deleted file]
src/libavoid/router.cpp
src/libavoid/router.h
src/libavoid/shape.cpp
src/libavoid/shape.h
src/libavoid/static.cpp [deleted file]
src/libavoid/static.h [deleted file]
src/libavoid/timer.cpp
src/libavoid/timer.h
src/libavoid/vertices.cpp
src/libavoid/vertices.h
src/libavoid/visibility.cpp
src/libavoid/visibility.h
src/sp-conn-end-pair.cpp
src/sp-conn-end-pair.h
src/sp-conn-end.cpp
src/sp-conn-end.h
src/sp-item.cpp
src/svg/stringstream.cpp
src/svg/stringstream.h
src/ui/icon-names.h
src/widgets/toolbox.cpp

diff --git a/po/inkscape.pot b/po/inkscape.pot
deleted file mode 100644 (file)
index d48c15b..0000000
+++ /dev/null
@@ -1,22382 +0,0 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
-#
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
-"Report-Msgid-Bugs-To: inkscape-devel@lists.sourceforge.net\n"
-"POT-Creation-Date: 2009-11-30 21:00+0100\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
-
-#: ../inkscape.desktop.in.h:1
-msgid "Create and edit Scalable Vector Graphics images"
-msgstr ""
-
-#: ../inkscape.desktop.in.h:2
-msgid "Inkscape"
-msgstr ""
-
-#: ../inkscape.desktop.in.h:3
-msgid "Inkscape Vector Graphics Editor"
-msgstr ""
-
-#: ../inkscape.desktop.in.h:4
-msgid "Vector Graphics Editor"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:2
-msgid "Matte jelly"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:2 ../share/filters/filters.svg.h:10
-#: ../share/filters/filters.svg.h:107 ../share/filters/filters.svg.h:109
-#: ../share/filters/filters.svg.h:115 ../share/filters/filters.svg.h:116
-#: ../share/filters/filters.svg.h:118 ../share/filters/filters.svg.h:122
-#: ../share/filters/filters.svg.h:167 ../share/filters/filters.svg.h:206
-msgid "ABCs"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:2
-msgid "Bulging, matte jelly covering"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:3
-msgid "Smart jelly"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:3 ../share/filters/filters.svg.h:4
-#: ../share/filters/filters.svg.h:9 ../share/filters/filters.svg.h:14
-#: ../share/filters/filters.svg.h:15 ../share/filters/filters.svg.h:39
-#: ../share/filters/filters.svg.h:48 ../share/filters/filters.svg.h:49
-#: ../share/filters/filters.svg.h:50 ../share/filters/filters.svg.h:51
-#: ../share/filters/filters.svg.h:54 ../share/filters/filters.svg.h:56
-#: ../share/filters/filters.svg.h:69 ../share/filters/filters.svg.h:71
-#: ../share/filters/filters.svg.h:89 ../share/filters/filters.svg.h:101
-#: ../share/filters/filters.svg.h:102 ../share/filters/filters.svg.h:207
-#: ../share/filters/filters.svg.h:208 ../share/filters/filters.svg.h:209
-#: ../share/filters/filters.svg.h:210 ../share/filters/filters.svg.h:211
-msgid "Bevels"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:3
-msgid "Same as Matte jelly but with more controls"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:4
-msgid "Metal casting"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:4
-msgid "Smooth drop-like bevel with metallic finish"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:5
-msgid "Motion blur, horizontal"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:5 ../share/filters/filters.svg.h:6
-#: ../share/filters/filters.svg.h:7 ../share/filters/filters.svg.h:57
-#: ../share/filters/filters.svg.h:94 ../share/filters/filters.svg.h:108
-#: ../share/filters/filters.svg.h:111 ../share/filters/filters.svg.h:159
-msgid "Blurs"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:5
-msgid ""
-"Blur as if the object flies horizontally; adjust Standard Deviation to vary "
-"force"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:6
-msgid "Motion blur, vertical"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:6
-msgid ""
-"Blur as if the object flies vertically; adjust Standard Deviation to vary "
-"force"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:7
-msgid "Apparition"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:7
-msgid "Edges are partly feathered out"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:8
-msgid "Cutout"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:8 ../share/filters/filters.svg.h:40
-#: ../share/filters/filters.svg.h:85 ../share/filters/filters.svg.h:95
-#: ../share/filters/filters.svg.h:119 ../share/filters/filters.svg.h:169
-#: ../share/filters/filters.svg.h:170 ../share/filters/filters.svg.h:171
-#: ../share/filters/filters.svg.h:176 ../share/filters/filters.svg.h:214
-#: ../src/extension/internal/filter/drop-shadow.h:45
-#: ../src/extension/internal/filter/drop-shadow.h:100
-msgid "Shadows and Glows"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:8
-msgid "Drop shadow under the cut-out of the shape"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:9
-msgid "Jigsaw piece"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:9
-msgid "Low, sharp bevel"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:10
-msgid "Roughen"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:10
-msgid "Small-scale roughening to edges and content"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:11
-msgid "Rubber stamp"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:11 ../share/filters/filters.svg.h:17
-#: ../share/filters/filters.svg.h:18 ../share/filters/filters.svg.h:19
-#: ../share/filters/filters.svg.h:21 ../share/filters/filters.svg.h:22
-#: ../share/filters/filters.svg.h:36 ../share/filters/filters.svg.h:37
-#: ../share/filters/filters.svg.h:38 ../share/filters/filters.svg.h:90
-#: ../share/filters/filters.svg.h:113 ../share/filters/filters.svg.h:114
-#: ../share/filters/filters.svg.h:117 ../share/filters/filters.svg.h:150
-#: ../share/filters/filters.svg.h:154 ../share/filters/filters.svg.h:183
-#: ../share/filters/filters.svg.h:217
-msgid "Overlays"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:11
-msgid "Random whiteouts inside"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:12
-msgid "Ink bleed"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:12 ../share/filters/filters.svg.h:13
-#: ../share/filters/filters.svg.h:41 ../share/filters/filters.svg.h:166
-msgid "Protrusions"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:12
-msgid "Inky splotches underneath the object"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:13
-msgid "Fire"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:13
-msgid "Edges of object are on fire"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:14
-msgid "Bloom"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:14
-msgid "Soft, cushion-like bevel with matte highlights"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:15
-msgid "Ridged border"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:15
-msgid "Ridged border with inner bevel"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:16
-msgid "Ripple"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:16 ../share/filters/filters.svg.h:43
-#: ../share/filters/filters.svg.h:106 ../share/filters/filters.svg.h:110
-#: ../share/filters/filters.svg.h:112 ../share/filters/filters.svg.h:128
-#: ../share/filters/filters.svg.h:173 ../share/filters/filters.svg.h:194
-msgid "Distort"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:16
-msgid "Horizontal rippling of edges"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:17
-msgid "Speckle"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:17
-msgid "Fill object with sparse translucent specks"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:18
-msgid "Oil slick"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:18
-msgid "Rainbow-colored semitransparent oily splotches"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:19
-msgid "Frost"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:19
-msgid "Flake-like white splotches"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:20
-msgid "Leopard fur"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:20 ../share/filters/filters.svg.h:58
-#: ../share/filters/filters.svg.h:59 ../share/filters/filters.svg.h:60
-#: ../share/filters/filters.svg.h:62 ../share/filters/filters.svg.h:67
-#: ../share/filters/filters.svg.h:78 ../share/filters/filters.svg.h:79
-#: ../share/filters/filters.svg.h:80 ../share/filters/filters.svg.h:82
-#: ../share/filters/filters.svg.h:136 ../share/filters/filters.svg.h:151
-#: ../share/filters/filters.svg.h:152 ../share/filters/filters.svg.h:153
-msgid "Materials"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:20
-msgid "Leopard spots (loses object's own color)"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:21
-msgid "Zebra"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:21
-msgid "Irregular vertical dark stripes (loses object's own color)"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:22
-msgid "Clouds"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:22
-msgid "Airy, fluffy, sparse white clouds"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:23
-#: ../src/extension/internal/bitmap/sharpen.cpp:37
-msgid "Sharpen"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:23 ../share/filters/filters.svg.h:24
-#: ../share/filters/filters.svg.h:25 ../share/filters/filters.svg.h:26
-#: ../share/filters/filters.svg.h:27 ../share/filters/filters.svg.h:28
-#: ../share/filters/filters.svg.h:29 ../share/filters/filters.svg.h:30
-#: ../share/filters/filters.svg.h:34 ../share/filters/filters.svg.h:100
-#: ../share/filters/filters.svg.h:160 ../share/filters/filters.svg.h:162
-#: ../share/filters/filters.svg.h:175 ../share/filters/filters.svg.h:190
-msgid "Image effects"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:23
-msgid "Sharpen edges and boundaries within the object, force=0.15"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:24
-msgid "Sharpen more"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:24
-msgid "Sharpen edges and boundaries within the object, force=0.3"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:25
-msgid "Oil painting"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:25
-msgid "Simulate oil painting style"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:26
-msgid "Edge detect"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:26
-msgid "Detect color edges in object"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:27
-msgid "Horizontal edge detect"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:27
-msgid "Detect horizontal color edges in object"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:28
-msgid "Vertical edge detect"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:28
-msgid "Detect vertical color edges in object"
-msgstr ""
-
-#. Pencil
-#: ../share/filters/filters.svg.h:29
-#: ../src/ui/dialog/inkscape-preferences.cpp:486 ../src/verbs.cpp:2516
-msgid "Pencil"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:29
-msgid "Detect color edges and retrace them in grayscale"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:30
-msgid "Blueprint"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:30
-msgid "Detect color edges and retrace them in blue"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:31
-#: ../share/extensions/color_desaturate.inx.h:2
-msgid "Desaturate"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:31 ../share/filters/filters.svg.h:32
-#: ../share/filters/filters.svg.h:33 ../share/filters/filters.svg.h:72
-#: ../share/filters/filters.svg.h:91 ../share/filters/filters.svg.h:98
-#: ../share/filters/filters.svg.h:99 ../share/filters/filters.svg.h:157
-#: ../share/filters/filters.svg.h:174 ../share/filters/filters.svg.h:196
-#: ../share/filters/filters.svg.h:205 ../share/filters/filters.svg.h:215
-#: ../share/filters/filters.svg.h:218 ../share/filters/filters.svg.h:219
-#: ../src/dialogs/clonetiler.cpp:2607 ../src/dialogs/clonetiler.cpp:2754
-#: ../src/extension/internal/bitmap/colorize.cpp:51
-#: ../share/extensions/color_brighter.inx.h:2
-#: ../share/extensions/color_custom.inx.h:2
-#: ../share/extensions/color_darker.inx.h:1
-#: ../share/extensions/color_desaturate.inx.h:1
-#: ../share/extensions/color_grayscale.inx.h:1
-#: ../share/extensions/color_lesshue.inx.h:1
-#: ../share/extensions/color_lesslight.inx.h:1
-#: ../share/extensions/color_lesssaturation.inx.h:1
-#: ../share/extensions/color_morehue.inx.h:1
-#: ../share/extensions/color_morelight.inx.h:1
-#: ../share/extensions/color_moresaturation.inx.h:1
-#: ../share/extensions/color_negative.inx.h:1
-#: ../share/extensions/color_randomize.inx.h:1
-#: ../share/extensions/color_removeblue.inx.h:1
-#: ../share/extensions/color_removegreen.inx.h:1
-#: ../share/extensions/color_removered.inx.h:1
-#: ../share/extensions/color_replace.inx.h:2
-#: ../share/extensions/color_rgbbarrel.inx.h:1
-#: ../share/extensions/interp_att_g.inx.h:2
-msgid "Color"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:31
-msgid "Render in shades of gray by reducing saturation to zero"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:32 ../src/ui/widget/selected-style.cpp:228
-msgid "Invert"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:32
-msgid "Invert colors"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:33
-msgid "Sepia"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:33
-msgid "Render in warm sepia tones"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:34
-msgid "Age"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:34
-msgid "Imitate aged photograph"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:35
-msgid "Organic"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:35 ../share/filters/filters.svg.h:42
-#: ../share/filters/filters.svg.h:45 ../share/filters/filters.svg.h:61
-#: ../share/filters/filters.svg.h:63 ../share/filters/filters.svg.h:64
-#: ../share/filters/filters.svg.h:81 ../share/filters/filters.svg.h:83
-#: ../share/filters/filters.svg.h:84 ../share/filters/filters.svg.h:125
-#: ../share/filters/filters.svg.h:126 ../share/filters/filters.svg.h:127
-#: ../share/filters/filters.svg.h:130 ../share/filters/filters.svg.h:131
-#: ../share/filters/filters.svg.h:132 ../share/filters/filters.svg.h:133
-#: ../share/filters/filters.svg.h:134 ../share/filters/filters.svg.h:135
-#: ../share/filters/filters.svg.h:155 ../share/filters/filters.svg.h:172
-#: ../share/filters/filters.svg.h:181 ../share/filters/filters.svg.h:187
-#: ../share/filters/filters.svg.h:200
-msgid "Textures"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:35
-msgid "Bulging, knotty, slick 3D surface"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:36
-msgid "Barbed wire"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:36
-msgid "Gray bevelled wires with drop shadows"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:37
-msgid "Swiss cheese"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:37
-msgid "Random inner-bevel holes"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:38
-msgid "Blue cheese"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:38
-msgid "Marble-like bluish speckles"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:39
-msgid "Button"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:39
-msgid "Soft bevel, slightly depressed middle"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:40
-msgid "Inset"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:40
-msgid "Shadowy outer bevel"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:41
-msgid "Dripping"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:41
-msgid "Random paint streaks downwards"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:42
-msgid "Jam spread"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:42
-msgid "Glossy clumpy jam spread"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:43
-msgid "Pixel smear"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:43
-msgid "Van Gogh painting effect for bitmaps"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:44
-msgid "HSL Bumps"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:44 ../share/filters/filters.svg.h:46
-#: ../share/filters/filters.svg.h:97 ../share/filters/filters.svg.h:120
-#: ../share/filters/filters.svg.h:121 ../share/filters/filters.svg.h:123
-#: ../share/filters/filters.svg.h:124 ../share/filters/filters.svg.h:161
-#: ../share/filters/filters.svg.h:163 ../share/filters/filters.svg.h:180
-#: ../share/filters/filters.svg.h:182 ../share/filters/filters.svg.h:184
-#: ../share/filters/filters.svg.h:185 ../share/filters/filters.svg.h:192
-#: ../share/filters/filters.svg.h:201 ../share/filters/filters.svg.h:202
-#: ../share/filters/filters.svg.h:203 ../share/filters/filters.svg.h:212
-#: ../share/filters/filters.svg.h:213 ../share/filters/filters.svg.h:216
-msgid "Bumps"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:44
-msgid "Highly flexible bump combining diffuse and specular lightings"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:45
-msgid "Cracked glass"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:45
-msgid "Under a cracked glass"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:46
-msgid "Bubbly Bumps"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:46
-msgid "Flexible bubbles effect with some displacement"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:47
-msgid "Glowing bubble"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:47 ../share/filters/filters.svg.h:52
-#: ../share/filters/filters.svg.h:53 ../share/filters/filters.svg.h:65
-#: ../share/filters/filters.svg.h:66 ../share/filters/filters.svg.h:68
-#: ../share/filters/filters.svg.h:70
-msgid "Ridges"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:47
-msgid "Bubble effect with refraction and glow"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:48
-msgid "Neon"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:48
-msgid "Neon light effect"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:49
-msgid "Molten metal"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:49
-msgid "Melting parts of object together, with a glossy bevel and a glow"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:50
-msgid "Pressed steel"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:50
-msgid "Pressed metal with a rolled edge"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:51
-msgid "Matte bevel"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:51
-msgid "Soft, pastel-colored, blurry bevel"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:52
-msgid "Thin Membrane"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:52
-msgid "Thin like a soap membrane"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:53
-msgid "Matte ridge"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:53
-msgid "Soft pastel ridge"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:54
-msgid "Glowing metal"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:54
-msgid "Glowing metal texture"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:55
-msgid "Leaves"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:55 ../share/filters/filters.svg.h:77
-#: ../share/filters/filters.svg.h:86 ../share/extensions/pathscatter.inx.h:10
-msgid "Scatter"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:55
-msgid "Leaves on the ground in Fall, or living foliage"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:56
-msgid "Translucent"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:56
-msgid "Illuminated translucent plastic or glass effect"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:57
-msgid "Cross-smooth"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:57
-msgid "Blur inner borders and intersections"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:58
-msgid "Iridescent beeswax"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:58
-msgid "Waxy texture which keeps its iridescence through color fill change"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:59
-msgid "Eroded metal"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:59
-msgid "Eroded metal texture with ridges, grooves, holes and bumps"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:60
-msgid "Cracked Lava"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:60
-msgid "A volcanic texture, a little like leather"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:61
-msgid "Bark"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:61
-msgid "Bark texture, vertical; use with deep colors"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:62
-msgid "Lizard skin"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:62
-msgid "Stylized reptile skin texture"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:63
-msgid "Stone wall"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:63
-msgid "Stone wall texture to use with not too saturated colors"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:64
-msgid "Silk carpet"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:64
-msgid "Silk carpet texture, horizontal stripes"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:65
-msgid "Refractive gel A"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:65
-msgid "Gel effect with light refraction"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:66
-msgid "Refractive gel B"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:66
-msgid "Gel effect with strong refraction"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:67
-msgid "Metallized paint"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:67
-msgid ""
-"Metallized effect with a soft lighting, slightly translucent at the edges"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:68
-msgid "Dragee"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:68
-msgid "Gel Ridge with a pearlescent look"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:69
-msgid "Raised border"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:69
-msgid "Strongly raised border around a flat surface"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:70
-msgid "Metallized ridge"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:70
-msgid "Gel Ridge metallized at its top"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:71
-msgid "Fat oil"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:71
-msgid "Fat oil with some adjustable turbulence"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:72
-#: ../src/extension/internal/bitmap/colorize.cpp:49
-msgid "Colorize"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:72
-msgid "Blend image or object with a flood color and set lightness and contrast"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:73
-msgid "Parallel hollow"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:73 ../share/filters/filters.svg.h:74
-#: ../share/filters/filters.svg.h:75 ../share/filters/filters.svg.h:76
-#: ../share/filters/filters.svg.h:87 ../share/filters/filters.svg.h:88
-#: ../share/filters/filters.svg.h:92 ../share/filters/filters.svg.h:93
-#: ../share/filters/filters.svg.h:96 ../share/filters/filters.svg.h:105
-#: ../share/filters/filters.svg.h:129 ../share/filters/filters.svg.h:168
-#: ../src/filter-enums.cpp:31
-msgid "Morphology"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:73
-msgid "A blurry hollow going parallel to the edge on the inside"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:74
-msgid "Hole"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:74
-msgid "Opens a smooth hole inside the shape"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:75
-msgid "Black hole"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:75
-msgid "Creates a black light inside and outside"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:76
-msgid "Smooth outline"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:76
-msgid "Outlining the lines and smoothing their crossings"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:77
-msgid "Cubes"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:77
-msgid "Scattered cubes; adjust the Morphology primitive to vary size"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:78
-msgid "Peel off"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:78
-msgid "Peeling painting on a wall"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:79
-msgid "Gold splatter"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:79
-msgid "Splattered cast metal, with golden highlights"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:80
-msgid "Gold paste"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:80
-msgid "Fat pasted cast metal, with golden highlights"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:81
-msgid "Crumpled plastic"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:81
-msgid "Crumpled matte plastic, with melted edge"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:82
-msgid "Enamel jewelry"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:82
-msgid "Slightly cracked enameled texture"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:83
-msgid "Rough paper"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:83
-msgid "Aquarelle paper effect which can be used for pictures as for objects"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:84
-msgid "Rough and glossy"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:84
-msgid ""
-"Crumpled glossy paper effect which can be used for pictures as for objects"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:85
-msgid "In and Out"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:85
-msgid "Inner colorized shadow, outer black shadow"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:86
-msgid "Air spray"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:86
-msgid "Convert to small scattered particles with some thickness"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:87
-msgid "Warm inside"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:87
-msgid "Blurred colorized contour, filled inside"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:88
-msgid "Cool outside"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:88
-msgid "Blurred colorized contour, empty inside"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:89
-msgid "Electronic microscopy"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:89
-msgid ""
-"Bevel, crude light, discoloration and glow like in electronic microscopy"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:90
-msgid "Tartan"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:90
-msgid "Checkered tartan pattern"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:91
-msgid "Invert hue"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:91
-msgid "Invert hue, or rotate it"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:92
-msgid "Inner outline"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:92
-msgid "Draws an outline around"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:93
-msgid "Outline, double"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:93
-msgid "Draws a smooth line inside colorized with the color it overlays"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:94
-msgid "Fancy blur"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:94
-msgid "Smooth colorized contour which allows desaturation and hue rotation"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:95
-msgid "Glow"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:95
-msgid "Glow of object's own color at the edges"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:96
-msgid "Outline"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:96
-msgid "Adds a glowing blur and removes the shape"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:97
-msgid "Color emboss"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:97
-msgid "Classic or colorized emboss effect: grayscale, color and 3D relief"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:98
-#: ../src/extension/internal/bitmap/solarize.cpp:36
-msgid "Solarize"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:98
-msgid "Classical photographic solarization effect"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:99
-msgid "Moonarize"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:99
-msgid ""
-"An effect between solarize and invert which often preserves sky and water "
-"lights"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:100
-msgid "Soft focus lens"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:100
-msgid "Glowing image content without blurring it"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:101
-msgid "Stained glass"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:101
-msgid "Illuminated stained glass effect"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:102
-msgid "Dark glass"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:102
-msgid "Illuminated glass effect with light coming from beneath"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:103
-msgid "HSL Bumps alpha"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:103 ../share/filters/filters.svg.h:104
-#: ../share/filters/filters.svg.h:164 ../share/filters/filters.svg.h:165
-#: ../share/filters/filters.svg.h:177 ../share/filters/filters.svg.h:178
-#: ../share/filters/filters.svg.h:179 ../share/filters/filters.svg.h:186
-#: ../share/filters/filters.svg.h:188 ../share/filters/filters.svg.h:189
-#: ../share/filters/filters.svg.h:191 ../share/filters/filters.svg.h:193
-#: ../share/filters/filters.svg.h:204
-msgid "Image effects, transparent"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:103
-msgid "Same as HSL Bumps but with transparent highlights"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:104
-msgid "Bubbly Bumps alpha"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:104
-msgid "Same as Bubbly Bumps but with transparent highlights"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:105
-msgid "Smooth edges"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:105
-msgid ""
-"Smooth the outside of shapes and pictures without altering their contents"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:106 ../share/filters/filters.svg.h:128
-msgid "Torn edges"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:106 ../share/filters/filters.svg.h:128
-msgid ""
-"Displace the outside of shapes and pictures without altering their content"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:107
-msgid "Feather"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:107
-msgid "Blurred mask on the edge without altering the contents"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:108
-msgid "Blur content"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:108
-msgid "Blur the contents of objects, preserving the outline"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:109
-msgid "Specular light"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:109 ../share/filters/filters.svg.h:211
-msgid "Basic specular bevel to use for building textures"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:110
-msgid "Roughen inside"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:110
-msgid "Roughen all inside shapes"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:111
-msgid "Evanescent"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:111
-msgid ""
-"Blur the contents of objects, preserving the outline and adding progressive "
-"transparency at edges"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:112
-msgid "Chalk and sponge"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:112
-msgid "Low turbulence gives sponge look and high turbulence chalk"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:113
-msgid "People"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:113
-msgid "Colorized blotches, like a crowd of people"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:114
-msgid "Scotland"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:114
-msgid "Colorized mountain tops out of the fog"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:115
-msgid "Noise transparency"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:115
-msgid "Basic noise transparency texture"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:116
-msgid "Noise fill"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:116
-msgid "Basic noise fill texture; adjust color in Flood"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:117
-msgid "Garden of Delights"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:117
-msgid ""
-"Phantasmagorical turbulent wisps, like Hieronymus Bosch's Garden of Delights"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:118
-msgid "Diffuse light"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:118
-msgid "Basic diffuse bevel to use for building textures"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:119
-msgid "Cutout Glow"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:119
-msgid "In and out glow with a possible offset and colorizable flood"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:120
-msgid "HSL Bumps, matte"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:120
-msgid ""
-"Same as HSL bumps but with a diffuse reflection instead of a specular one"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:121
-msgid "Dark Emboss"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:121
-msgid "Emboss effect : 3D relief where white is replaced by black"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:122
-msgid "Simple blur"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:122
-msgid "Simple Gaussian blur, same as the blur slider in Fill and Stroke dialog"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:123
-msgid "Bubbly Bumps, matte"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:123
-msgid "Same as Bubbly Bumps but with a diffuse light instead of a specular one"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:124
-#: ../src/extension/internal/bitmap/emboss.cpp:37
-msgid "Emboss"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:124
-msgid ""
-"Emboss effect : Colors of the original images are preserved or modified by "
-"Blend"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:125
-msgid "Blotting paper"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:125
-msgid "Inkblot on blotting paper"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:126
-msgid "Wax print"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:126
-msgid "Wax print on tissue texture"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:127
-msgid "Inkblot"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:127
-msgid "Inkblot on tissue or rough paper"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:129
-msgid "Color outline, in"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:129
-msgid "A colorizable inner outline with adjustable width and blur"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:130
-msgid "Liquid"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:130
-msgid "Colorizable filling with liquid transparency"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:131
-msgid "Watercolor"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:131
-msgid "Cloudy watercolor effect"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:132
-msgid "Felt"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:132
-msgid ""
-"Felt like texture with color turbulence and slightly darker at the edges"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:133
-msgid "Ink paint"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:133
-msgid "Ink paint on paper with some turbulent color shift"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:134
-msgid "Tinted rainbow"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:134
-msgid "Smooth rainbow colors melted along the edges and colorizable"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:135
-msgid "Melted rainbow"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:135
-msgid "Smooth rainbow colors slightly melted along the edges"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:136
-msgid "Flex metal"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:136
-msgid "Bright, polished uneven metal casting, colorizable"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:137
-msgid "Comics draft"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:137 ../share/filters/filters.svg.h:138
-#: ../share/filters/filters.svg.h:139 ../share/filters/filters.svg.h:140
-#: ../share/filters/filters.svg.h:141 ../share/filters/filters.svg.h:142
-#: ../share/filters/filters.svg.h:143 ../share/filters/filters.svg.h:144
-#: ../share/filters/filters.svg.h:145 ../share/filters/filters.svg.h:146
-#: ../share/filters/filters.svg.h:147 ../share/filters/filters.svg.h:148
-#: ../share/filters/filters.svg.h:149 ../share/filters/filters.svg.h:156
-msgid "Non realistic 3D shaders"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:137
-msgid "Draft painted cartoon shading with a glassy look"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:138
-msgid "Comics fading"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:138
-msgid "Cartoon paint style with some fading at the edges"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:139
-msgid "Smooth shader"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:139
-msgid "Smooth shading with a graphite pencil grey"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:140
-msgid "Emboss shader"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:140
-msgid "Combination of smooth shading and embossing"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:141
-msgid "Smooth shader dark"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:141
-msgid "Dark version of non realistic smooth shading"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:142
-msgid "Comics"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:142
-msgid "Imitation of black and white cartoon shading"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:143
-msgid "Satin"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:143
-msgid "Silky close to mother of pearl shading"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:144
-msgid "Frosted glass"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:144
-msgid "Non realistic frosted glass imitation"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:145
-msgid "Smooth shader contour"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:145
-msgid "Contouring version of smooth shader"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:146
-msgid "Aluminium"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:146
-msgid "Brushed aluminium shader"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:147
-msgid "Comics fluid"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:147
-msgid "Fluid brushed cartoon drawing"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:148
-msgid "Chrome"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:148
-msgid "Non realistic chrome shader with strong speculars"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:149
-msgid "Chrome dark"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:149
-msgid "Dark version of chrome shading with a ground reflection simulation"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:150
-msgid "Wavy tartan"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:150
-msgid "Tartan pattern with a wavy displacement and bevel around the edges"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:151
-msgid "3D marble"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:151
-msgid "3D warped marble texture"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:152
-msgid "3D wood"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:152
-msgid "3D warped, fibered wood texture"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:153
-msgid "3D mother of pearl"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:153
-msgid "3D warped, iridescent pearly shell texture"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:154
-msgid "Tiger fur"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:154
-msgid "Tiger fur pattern with folds and bevel around the edges"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:155
-msgid "Shaken liquid"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:155
-msgid "Colorizable filling with flow inside like transparency"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:156
-msgid "Comics cream"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:156
-msgid "Comics shader with creamy waves transparency"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:157
-msgid "Black Light"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:157
-msgid "Light areas turn to black"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:158
-msgid "Light eraser"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:158 ../share/filters/filters.svg.h:195
-#: ../share/filters/filters.svg.h:197 ../share/filters/filters.svg.h:198
-#: ../share/filters/filters.svg.h:199
-msgid "Transparency utilities"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:158
-msgid "Make the lightest parts of the object progressively transparent"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:159
-msgid "Noisy blur"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:159
-msgid "Small-scale roughening and blurring to edges and content"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:160
-msgid "Film grain"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:160
-msgid "Adds a small scale graininess"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:161
-msgid "HSL Bumps, transparent"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:161
-msgid "Highly flexible specular bump with transparency"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:162
-#: ../src/ui/dialog/align-and-distribute.cpp:920
-#: ../src/widgets/desktop-widget.cpp:1576
-msgid "Drawing"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:162
-msgid ""
-"Give lead pencil or chromolithography or engraving or other effects to "
-"images and material filled objects"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:163
-msgid "Velvet Bumps"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:163
-msgid "Gives Smooth Bumps velvet like"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:164
-msgid "Alpha draw"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:164
-msgid "Gives a transparent drawing effect to bitmaps and materials"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:165
-msgid "Alpha draw, color"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:165
-msgid "Gives a transparent color fill effect to bitmaps and materials"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:166
-msgid "Chewing gum"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:166
-msgid ""
-"Creates colorizable blotches which smoothly flow over the edges of the lines "
-"at their crossings"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:167
-msgid "Black outline"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:167
-msgid "Draws a black outline around"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:168
-msgid "Color outline"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:168
-msgid "Draws a colored outline around"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:169
-msgid "Inner Shadow"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:169
-msgid "Adds a colorizable drop shadow inside"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:170
-msgid "Dark and Glow"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:170
-msgid "Darkens the edge with an inner blur and adds a flexible glow"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:171
-msgid "Darken edges"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:171
-msgid "Darken the edges with an inner blur"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:172
-msgid "Warped rainbow"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:172
-msgid "Smooth rainbow colors warped along the edges and colorizable"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:173
-msgid "Rough and dilate"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:173
-msgid "Create a turbulent contour around"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:174
-msgid "Quadritone fantasy"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:174
-msgid "Replace hue by two colors"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:175
-msgid "Old postcard"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:175
-msgid "Slightly posterize and draw edges like on old printed postcards"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:176
-msgid "Fuzzy Glow"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:176
-msgid "Overlays a semi-transparent shifted copy to a blurred one"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:177
-msgid "Dots transparency"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:177
-msgid "Gives a pointillist HSL sensitive transparency"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:178
-msgid "Canvas transparency"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:178
-msgid "Gives a canvas like HSL sensitive transparency."
-msgstr ""
-
-#: ../share/filters/filters.svg.h:179
-msgid "Smear transparency"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:179
-msgid ""
-"Paint objects with a transparent turbulence which turns around color edges"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:180
-msgid "Thick paint"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:180
-msgid "Thick painting effect with turbulence"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:181
-msgid "Burst"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:181
-msgid "Burst balloon texture crumpled and with holes"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:182
-msgid "Embossed leather"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:182
-msgid ""
-"Combine a HSL edges detection bump with a leathery or woody and colorizable "
-"texture"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:183
-msgid "Carnaval"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:183
-msgid "White splotches evocating carnaval masks"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:184
-msgid "Plastify"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:184
-msgid ""
-"HSL edges detection bump with a wavy reflective surface effect and variable "
-"crumple"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:185
-msgid "Plaster"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:185
-msgid ""
-"Combine a HSL edges detection bump with a matte and crumpled surface effect"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:186
-msgid "Rough transparency"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:186
-msgid "Adds a turbulent transparency which displaces pixels at the same time"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:187
-msgid "Gouache"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:187
-msgid "Partly opaque water color effect with bleed"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:188
-msgid "Alpha engraving"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:188
-msgid "Gives a transparent engraving effect with rough line and filling"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:189
-msgid "Alpha draw, liquid"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:189
-msgid "Gives a transparent fluid drawing effect with rough line and filling"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:190
-msgid "Liquid drawing"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:190
-msgid "Gives a fluid and wavy expressionist drawing effect to images"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:191
-msgid "Marbled ink"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:191
-msgid "Marbled transparency effect which conforms to image detected edges"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:192
-msgid "Thick acrylic"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:192
-msgid "Thick acrylic paint texture with high texture depth"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:193
-msgid "Alpha engraving B"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:193
-msgid ""
-"Gives a controllable roughness engraving effect to bitmaps and materials"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:194
-msgid "Lapping"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:194
-msgid "Something like a water noise"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:195
-msgid "Monochrome transparency"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:195
-msgid "Convert to a colorizable transparent positive or negative"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:196
-msgid "Duotone"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:196
-msgid "Change colors to a duotone palette"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:197
-msgid "Light eraser, negative"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:197
-msgid "Like Light eraser but converts to negative"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:198
-msgid "Alpha repaint"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:198
-msgid "Repaint anything monochrome"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:199
-msgid "Saturation map"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:199
-msgid ""
-"Creates an approximative semi-transparent and colorizable image of the "
-"saturation levels"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:200
-msgid "Riddled"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:200
-msgid "Riddle the surface and add bump to images"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:201
-msgid "Wrinkled varnish"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:201
-msgid "Thick glossy and translucent paint texture with high depth"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:202
-msgid "Canvas Bumps"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:202
-msgid "Canvas texture with an HSL sensitive height map"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:203
-msgid "Canvas Bumps, matte"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:203
-msgid "Same as Canvas Bumps but with a diffuse light instead of a specular one"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:204
-msgid "Canvas Bumps alpha"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:204
-msgid "Same as Canvas Bumps but with transparent highlights"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:205
-msgid "Lightness-Contrast"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:205
-msgid "Increase or decrease lightness and contrast"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:206
-msgid "Clean edges"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:206
-msgid ""
-"Removes or decreases glows and jaggeries around objects edges after applying "
-"some filters"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:207
-msgid "Bright metal"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:207
-msgid "Bright metallic effect for any color"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:208
-msgid "Deep colors plastic"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:208
-msgid "Transparent plastic with deep colors"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:209
-msgid "Melted jelly, matte"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:209
-msgid "Matte bevel with blurred edges"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:210
-msgid "Melted jelly"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:210
-msgid "Glossy bevel with blurred edges"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:211
-msgid "Combined lighting"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:212
-msgid "Tinfoil"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:212
-msgid "Metallic foil effect combining two lighting types and variable crumple"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:213
-msgid "Copper and chocolate"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:213
-msgid ""
-"Specular bump which can be easily converted from metallic to molded plastic "
-"effects"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:214
-msgid "Inner Glow"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:214
-msgid "Adds a colorizable glow inside"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:215
-msgid "Soft colors"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:215
-msgid "Adds a colorizable edges glow inside objects and pictures"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:216
-msgid "Relief print"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:216
-msgid "Bumps effect with a bevel, color flood and complex lighting"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:217
-msgid "Growing cells"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:217
-msgid "Random rounded living cells like fill"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:218
-msgid "Fluorescence"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:218
-msgid "Oversaturate colors which can be fluorescent in real world"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:219
-msgid "Tritone"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:219
-msgid "Create a tritone palette with hue selectable by flood"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:2
-msgid "Stripes 1:1"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:3
-msgid "Stripes 1:1 white"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:4
-msgid "Stripes 1:1.5"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:5
-msgid "Stripes 1:1.5 white"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:6
-msgid "Stripes 1:2"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:7
-msgid "Stripes 1:2 white"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:8
-msgid "Stripes 1:3"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:9
-msgid "Stripes 1:3 white"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:10
-msgid "Stripes 1:4"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:11
-msgid "Stripes 1:4 white"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:12
-msgid "Stripes 1:5"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:13
-msgid "Stripes 1:5 white"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:14
-msgid "Stripes 1:8"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:15
-msgid "Stripes 1:8 white"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:16
-msgid "Stripes 1:10"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:17
-msgid "Stripes 1:10 white"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:18
-msgid "Stripes 1:16"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:19
-msgid "Stripes 1:16 white"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:20
-msgid "Stripes 1:32"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:21
-msgid "Stripes 1:32 white"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:22
-msgid "Stripes 1:64"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:23
-msgid "Stripes 2:1"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:24
-msgid "Stripes 2:1 white"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:25
-msgid "Stripes 4:1"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:26
-msgid "Stripes 4:1 white"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:27
-msgid "Checkerboard"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:28
-msgid "Checkerboard white"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:29
-msgid "Packed circles"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:30
-msgid "Polka dots, small"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:31
-msgid "Polka dots, small white"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:32
-msgid "Polka dots, medium"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:33
-msgid "Polka dots, medium white"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:34
-msgid "Polka dots, large"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:35
-msgid "Polka dots, large white"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:36
-msgid "Wavy"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:37
-msgid "Wavy white"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:38
-msgid "Camouflage"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:39
-msgid "Ermine"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:40
-msgid "Sand (bitmap)"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:41
-msgid "Cloth (bitmap)"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:42
-msgid "Old paint (bitmap)"
-msgstr ""
-
-#: ../src/arc-context.cpp:319
-msgid ""
-"<b>Ctrl</b>: make circle or integer-ratio ellipse, snap arc/segment angle"
-msgstr ""
-
-#: ../src/arc-context.cpp:320 ../src/rect-context.cpp:362
-msgid "<b>Shift</b>: draw around the starting point"
-msgstr ""
-
-#: ../src/arc-context.cpp:471
-#, c-format
-msgid ""
-"<b>Ellipse</b>: %s &#215; %s (constrained to ratio %d:%d); with <b>Shift</b> "
-"to draw around the starting point"
-msgstr ""
-
-#: ../src/arc-context.cpp:473
-#, c-format
-msgid ""
-"<b>Ellipse</b>: %s &#215; %s; with <b>Ctrl</b> to make square or integer-"
-"ratio ellipse; with <b>Shift</b> to draw around the starting point"
-msgstr ""
-
-#: ../src/arc-context.cpp:499
-msgid "Create ellipse"
-msgstr ""
-
-#: ../src/box3d-context.cpp:429 ../src/box3d-context.cpp:436
-#: ../src/box3d-context.cpp:443 ../src/box3d-context.cpp:450
-#: ../src/box3d-context.cpp:457 ../src/box3d-context.cpp:464
-msgid "Change perspective (angle of PLs)"
-msgstr ""
-
-#. status text
-#: ../src/box3d-context.cpp:622
-msgid "<b>3D Box</b>; with <b>Shift</b> to extrude along the Z axis"
-msgstr ""
-
-#: ../src/box3d-context.cpp:650
-msgid "Create 3D box"
-msgstr ""
-
-#: ../src/box3d.cpp:315
-msgid "<b>3D Box</b>"
-msgstr ""
-
-#: ../src/connector-context.cpp:526
-msgid "Creating new connector"
-msgstr ""
-
-#: ../src/connector-context.cpp:775
-msgid "Connector endpoint drag cancelled."
-msgstr ""
-
-#: ../src/connector-context.cpp:824
-msgid "Reroute connector"
-msgstr ""
-
-#. Flush pending updates
-#: ../src/connector-context.cpp:988
-msgid "Create connector"
-msgstr ""
-
-#: ../src/connector-context.cpp:1012
-msgid "Finishing connector"
-msgstr ""
-
-#: ../src/connector-context.cpp:1154
-msgid "<b>Connection point</b>: click or drag to create a new connector"
-msgstr ""
-
-#: ../src/connector-context.cpp:1227
-msgid "<b>Connector endpoint</b>: drag to reroute or connect to new shapes"
-msgstr ""
-
-#: ../src/connector-context.cpp:1339
-msgid "Select <b>at least one non-connector object</b>."
-msgstr ""
-
-#: ../src/connector-context.cpp:1344 ../src/widgets/toolbox.cpp:6997
-msgid "Make connectors avoid selected objects"
-msgstr ""
-
-#: ../src/connector-context.cpp:1345 ../src/widgets/toolbox.cpp:7007
-msgid "Make connectors ignore selected objects"
-msgstr ""
-
-#: ../src/context-fns.cpp:36 ../src/context-fns.cpp:65
-msgid "<b>Current layer is hidden</b>. Unhide it to be able to draw on it."
-msgstr ""
-
-#: ../src/context-fns.cpp:42 ../src/context-fns.cpp:71
-msgid "<b>Current layer is locked</b>. Unlock it to be able to draw on it."
-msgstr ""
-
-#: ../src/desktop.cpp:830
-msgid "No previous zoom."
-msgstr ""
-
-#: ../src/desktop.cpp:855
-msgid "No next zoom."
-msgstr ""
-
-#: ../src/desktop-events.cpp:187
-msgid "Create guide"
-msgstr ""
-
-#: ../src/desktop-events.cpp:391
-msgid "Move guide"
-msgstr ""
-
-#: ../src/desktop-events.cpp:398 ../src/desktop-events.cpp:445
-#: ../src/ui/dialog/guides.cpp:125
-msgid "Delete guide"
-msgstr ""
-
-#: ../src/desktop-events.cpp:425
-#, c-format
-msgid "<b>Guideline</b>: %s"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:155
-msgid "<small>Nothing selected.</small>"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:161
-msgid "<small>More than one object selected.</small>"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:168
-#, c-format
-msgid "<small>Object has <b>%d</b> tiled clones.</small>"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:173
-msgid "<small>Object has no tiled clones.</small>"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:976
-msgid "Select <b>one object</b> whose tiled clones to unclump."
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:998
-msgid "Unclump tiled clones"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1028
-msgid "Select <b>one object</b> whose tiled clones to remove."
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1051
-msgid "Delete tiled clones"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1097 ../src/selection-chemistry.cpp:1883
-msgid "Select an <b>object</b> to clone."
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1103
-msgid ""
-"If you want to clone several objects, <b>group</b> them and <b>clone the "
-"group</b>."
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1112
-msgid "<small>Creating tiled clones...</small>"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1515
-msgid "Create tiled clones"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1706
-msgid "<small>Per row:</small>"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1719
-msgid "<small>Per column:</small>"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1727
-msgid "<small>Randomize:</small>"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1888
-msgid "_Symmetry"
-msgstr ""
-
-#. TRANSLATORS: For the following 17 symmetry groups, see
-#. * http://www.bib.ulb.ac.be/coursmath/doc/17.htm (visual examples);
-#. * http://www.clarku.edu/~djoyce/wallpaper/seventeen.html (English vocabulary); or
-#. * http://membres.lycos.fr/villemingerard/Geometri/Sym1D.htm (French vocabulary).
-#.
-#: ../src/dialogs/clonetiler.cpp:1896
-msgid "Select one of the 17 symmetry groups for the tiling"
-msgstr ""
-
-#. TRANSLATORS: "translation" means "shift" / "displacement" here.
-#: ../src/dialogs/clonetiler.cpp:1907
-msgid "<b>P1</b>: simple translation"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1908
-msgid "<b>P2</b>: 180&#176; rotation"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1909
-msgid "<b>PM</b>: reflection"
-msgstr ""
-
-#. TRANSLATORS: "glide reflection" is a reflection and a translation combined.
-#. For more info, see http://mathforum.org/sum95/suzanne/symsusan.html
-#: ../src/dialogs/clonetiler.cpp:1912
-msgid "<b>PG</b>: glide reflection"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1913
-msgid "<b>CM</b>: reflection + glide reflection"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1914
-msgid "<b>PMM</b>: reflection + reflection"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1915
-msgid "<b>PMG</b>: reflection + 180&#176; rotation"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1916
-msgid "<b>PGG</b>: glide reflection + 180&#176; rotation"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1917
-msgid "<b>CMM</b>: reflection + reflection + 180&#176; rotation"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1918
-msgid "<b>P4</b>: 90&#176; rotation"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1919
-msgid "<b>P4M</b>: 90&#176; rotation + 45&#176; reflection"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1920
-msgid "<b>P4G</b>: 90&#176; rotation + 90&#176; reflection"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1921
-msgid "<b>P3</b>: 120&#176; rotation"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1922
-msgid "<b>P31M</b>: reflection + 120&#176; rotation, dense"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1923
-msgid "<b>P3M1</b>: reflection + 120&#176; rotation, sparse"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1924
-msgid "<b>P6</b>: 60&#176; rotation"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1925
-msgid "<b>P6M</b>: reflection + 60&#176; rotation"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1953
-msgid "S_hift"
-msgstr ""
-
-#. TRANSLATORS: "shift" means: the tiles will be shifted (offset) horizontally by this amount
-#: ../src/dialogs/clonetiler.cpp:1963
-#, no-c-format
-msgid "<b>Shift X:</b>"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1971
-#, no-c-format
-msgid "Horizontal shift per row (in % of tile width)"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1979
-#, no-c-format
-msgid "Horizontal shift per column (in % of tile width)"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1986
-msgid "Randomize the horizontal shift by this percentage"
-msgstr ""
-
-#. TRANSLATORS: "shift" means: the tiles will be shifted (offset) vertically by this amount
-#: ../src/dialogs/clonetiler.cpp:1996
-#, no-c-format
-msgid "<b>Shift Y:</b>"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2004
-#, no-c-format
-msgid "Vertical shift per row (in % of tile height)"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2012
-#, no-c-format
-msgid "Vertical shift per column (in % of tile height)"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2019
-msgid "Randomize the vertical shift by this percentage"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2027 ../src/dialogs/clonetiler.cpp:2175
-msgid "<b>Exponent:</b>"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2034
-msgid "Whether rows are spaced evenly (1), converge (<1) or diverge (>1)"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2041
-msgid "Whether columns are spaced evenly (1), converge (<1) or diverge (>1)"
-msgstr ""
-
-#. TRANSLATORS: "Alternate" is a verb here
-#: ../src/dialogs/clonetiler.cpp:2049 ../src/dialogs/clonetiler.cpp:2219
-#: ../src/dialogs/clonetiler.cpp:2296 ../src/dialogs/clonetiler.cpp:2372
-#: ../src/dialogs/clonetiler.cpp:2421 ../src/dialogs/clonetiler.cpp:2552
-msgid "<small>Alternate:</small>"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2055
-msgid "Alternate the sign of shifts for each row"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2060
-msgid "Alternate the sign of shifts for each column"
-msgstr ""
-
-#. TRANSLATORS: "Cumulate" is a verb here
-#: ../src/dialogs/clonetiler.cpp:2067 ../src/dialogs/clonetiler.cpp:2237
-#: ../src/dialogs/clonetiler.cpp:2314
-msgid "<small>Cumulate:</small>"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2073
-msgid "Cumulate the shifts for each row"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2078
-msgid "Cumulate the shifts for each column"
-msgstr ""
-
-#. TRANSLATORS: "Cumulate" is a verb here
-#: ../src/dialogs/clonetiler.cpp:2085
-msgid "<small>Exclude tile:</small>"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2091
-msgid "Exclude tile height in shift"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2096
-msgid "Exclude tile width in shift"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2105
-msgid "Sc_ale"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2113
-msgid "<b>Scale X:</b>"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2121
-#, no-c-format
-msgid "Horizontal scale per row (in % of tile width)"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2129
-#, no-c-format
-msgid "Horizontal scale per column (in % of tile width)"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2136
-msgid "Randomize the horizontal scale by this percentage"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2144
-msgid "<b>Scale Y:</b>"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2152
-#, no-c-format
-msgid "Vertical scale per row (in % of tile height)"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2160
-#, no-c-format
-msgid "Vertical scale per column (in % of tile height)"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2167
-msgid "Randomize the vertical scale by this percentage"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2182
-msgid "Whether row scaling is uniform (1), converge (<1) or diverge (>1)"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2189
-msgid "Whether column scaling is uniform (1), converge (<1) or diverge (>1)"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2197
-msgid "<b>Base:</b>"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2204 ../src/dialogs/clonetiler.cpp:2211
-msgid ""
-"Base for a logarithmic spiral: not used (0), converge (<1), or diverge (>1)"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2225
-msgid "Alternate the sign of scales for each row"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2230
-msgid "Alternate the sign of scales for each column"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2243
-msgid "Cumulate the scales for each row"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2248
-msgid "Cumulate the scales for each column"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2257
-msgid "_Rotation"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2265
-msgid "<b>Angle:</b>"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2273
-#, no-c-format
-msgid "Rotate tiles by this angle for each row"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2281
-#, no-c-format
-msgid "Rotate tiles by this angle for each column"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2288
-msgid "Randomize the rotation angle by this percentage"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2302
-msgid "Alternate the rotation direction for each row"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2307
-msgid "Alternate the rotation direction for each column"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2320
-msgid "Cumulate the rotation for each row"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2325
-msgid "Cumulate the rotation for each column"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2334
-msgid "_Blur & opacity"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2343
-msgid "<b>Blur:</b>"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2350
-msgid "Blur tiles by this percentage for each row"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2357
-msgid "Blur tiles by this percentage for each column"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2364
-msgid "Randomize the tile blur by this percentage"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2378
-msgid "Alternate the sign of blur change for each row"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2383
-msgid "Alternate the sign of blur change for each column"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2392
-msgid "<b>Fade out:</b>"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2399
-msgid "Decrease tile opacity by this percentage for each row"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2406
-msgid "Decrease tile opacity by this percentage for each column"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2413
-msgid "Randomize the tile opacity by this percentage"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2427
-msgid "Alternate the sign of opacity change for each row"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2432
-msgid "Alternate the sign of opacity change for each column"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2440
-msgid "Co_lor"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2445
-msgid "Initial color: "
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2449
-msgid "Initial color of tiled clones"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2449
-msgid ""
-"Initial color for clones (works only if the original has unset fill or "
-"stroke)"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2464
-msgid "<b>H:</b>"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2471
-msgid "Change the tile hue by this percentage for each row"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2478
-msgid "Change the tile hue by this percentage for each column"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2485
-msgid "Randomize the tile hue by this percentage"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2494
-msgid "<b>S:</b>"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2501
-msgid "Change the color saturation by this percentage for each row"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2508
-msgid "Change the color saturation by this percentage for each column"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2515
-msgid "Randomize the color saturation by this percentage"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2523
-msgid "<b>L:</b>"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2530
-msgid "Change the color lightness by this percentage for each row"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2537
-msgid "Change the color lightness by this percentage for each column"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2544
-msgid "Randomize the color lightness by this percentage"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2558
-msgid "Alternate the sign of color changes for each row"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2563
-msgid "Alternate the sign of color changes for each column"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2571
-msgid "_Trace"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2578
-msgid "Trace the drawing under the tiles"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2582
-msgid ""
-"For each clone, pick a value from the drawing in that clone's location and "
-"apply it to the clone"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2596
-msgid "1. Pick from the drawing:"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2608
-msgid "Pick the visible color and opacity"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2615 ../src/dialogs/clonetiler.cpp:2764
-#: ../src/extension/internal/bitmap/opacity.cpp:37
-#: ../src/extension/internal/bitmap/opacity.cpp:39
-#: ../src/widgets/toolbox.cpp:4326 ../share/extensions/interp_att_g.inx.h:12
-msgid "Opacity"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2616
-msgid "Pick the total accumulated opacity"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2623
-msgid "R"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2624
-msgid "Pick the Red component of the color"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2631
-msgid "G"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2632
-msgid "Pick the Green component of the color"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2639
-msgid "B"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2640
-msgid "Pick the Blue component of the color"
-msgstr ""
-
-#. TRANSLATORS: only translate "string" in "context|string".
-#. For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS
-#: ../src/dialogs/clonetiler.cpp:2649
-msgid "clonetiler|H"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2650
-msgid "Pick the hue of the color"
-msgstr ""
-
-#. TRANSLATORS: only translate "string" in "context|string".
-#. For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS
-#: ../src/dialogs/clonetiler.cpp:2659
-msgid "clonetiler|S"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2660
-msgid "Pick the saturation of the color"
-msgstr ""
-
-#. TRANSLATORS: only translate "string" in "context|string".
-#. For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS
-#: ../src/dialogs/clonetiler.cpp:2669
-msgid "clonetiler|L"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2670
-msgid "Pick the lightness of the color"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2680
-msgid "2. Tweak the picked value:"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2690
-msgid "Gamma-correct:"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2695
-msgid "Shift the mid-range of the picked value upwards (>0) or downwards (<0)"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2702
-msgid "Randomize:"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2707
-msgid "Randomize the picked value by this percentage"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2714
-msgid "Invert:"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2718
-msgid "Invert the picked value"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2724
-msgid "3. Apply the value to the clones':"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2734
-msgid "Presence"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2737
-msgid ""
-"Each clone is created with the probability determined by the picked value in "
-"that point"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2744
-msgid "Size"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2747
-msgid "Each clone's size is determined by the picked value in that point"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2757
-msgid ""
-"Each clone is painted by the picked color (the original must have unset fill "
-"or stroke)"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2767
-msgid "Each clone's opacity is determined by the picked value in that point"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2794
-msgid "How many rows in the tiling"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2814
-msgid "How many columns in the tiling"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2844
-msgid "Width of the rectangle to be filled"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2869
-msgid "Height of the rectangle to be filled"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2884
-msgid "Rows, columns: "
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2885
-msgid "Create the specified number of rows and columns"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2894
-msgid "Width, height: "
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2895
-msgid "Fill the specified width and height with the tiling"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2911
-msgid "Use saved size and position of the tile"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2914
-msgid ""
-"Pretend that the size and position of the tile are the same as the last time "
-"you tiled it (if any), instead of using the current size"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2938
-msgid " <b>_Create</b> "
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2940
-msgid "Create and tile the clones of the selection"
-msgstr ""
-
-#. TRANSLATORS: if a group of objects are "clumped" together, then they
-#. are unevenly spread in the given amount of space - as shown in the
-#. diagrams on the left in the following screenshot:
-#. http://www.inkscape.org/screenshots/gallery/inkscape-0.42-CVS-tiles-unclump.png
-#. So unclumping is the process of spreading a number of objects out more evenly.
-#: ../src/dialogs/clonetiler.cpp:2955
-msgid " _Unclump "
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2956
-msgid "Spread out clones to reduce clumping; can be applied repeatedly"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2962
-msgid " Re_move "
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2963
-msgid "Remove existing tiled clones of the selected object (siblings only)"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2979
-msgid " R_eset "
-msgstr ""
-
-#. TRANSLATORS: "change" is a noun here
-#: ../src/dialogs/clonetiler.cpp:2981
-msgid ""
-"Reset all shifts, scales, rotates, opacity and color changes in the dialog "
-"to zero"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:146 ../src/verbs.cpp:2623
-msgid "_Page"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:146 ../src/verbs.cpp:2627
-msgid "_Drawing"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:146 ../src/verbs.cpp:2629
-msgid "_Selection"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:146
-msgid "_Custom"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:271
-msgid "<big><b>Export area</b></big>"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:285
-msgid "Units:"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:313
-msgid "_x0:"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:318
-msgid "x_1:"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:323
-msgid "Wid_th:"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:329
-msgid "_y0:"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:334
-msgid "y_1:"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:339
-msgid "Hei_ght:"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:471
-msgid "<big><b>Bitmap size</b></big>"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:484 ../src/ui/widget/page-sizer.cpp:230
-msgid "_Width:"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:484 ../src/dialogs/export.cpp:498
-msgid "pixels at"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:492
-msgid "dp_i"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:498 ../src/ui/widget/page-sizer.cpp:231
-msgid "_Height:"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:509 ../src/ui/dialog/inkscape-preferences.cpp:768
-#: ../src/ui/dialog/inkscape-preferences.cpp:1180
-msgid "dpi"
-msgstr ""
-
-#. true = has mnemonic
-#: ../src/dialogs/export.cpp:520
-msgid "<big><b>_Filename</b></big>"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:590
-msgid "_Browse..."
-msgstr ""
-
-#: ../src/dialogs/export.cpp:619
-msgid "Batch export all selected objects"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:623
-msgid ""
-"Export each selected object into its own PNG file, using export hints if any "
-"(caution, overwrites without asking!)"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:631
-msgid "Hide all except selected"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:635
-msgid "In the exported image, hide all objects except those that are selected"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:652
-msgid "_Export"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:656
-msgid "Export the bitmap file with these settings"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:682
-#, c-format
-msgid "Batch export %d selected object"
-msgid_plural "Batch export %d selected objects"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../src/dialogs/export.cpp:1013
-msgid "Export in progress"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:1101
-#, c-format
-msgid "Exporting %d files"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:1145 ../src/dialogs/export.cpp:1222
-#, c-format
-msgid "Could not export to filename %s.\n"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:1175
-msgid "You have to enter a filename"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:1180
-msgid "The chosen area to be exported is invalid"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:1195
-#, c-format
-msgid "Directory %s does not exist or is not a directory.\n"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:1207
-#, c-format
-msgid "Exporting %s (%lu x %lu)"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:1331 ../src/dialogs/export.cpp:1366
-msgid "Select a filename for exporting"
-msgstr ""
-
-#. TRANSLATORS: "%s" is replaced with "exact" or "partial" when this string is displayed
-#: ../src/dialogs/find.cpp:362 ../src/ui/dialog/find.cpp:437
-#, c-format
-msgid "<b>%d</b> object found (out of <b>%d</b>), %s match."
-msgid_plural "<b>%d</b> objects found (out of <b>%d</b>), %s match."
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../src/dialogs/find.cpp:365 ../src/ui/dialog/find.cpp:440
-msgid "exact"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:365 ../src/ui/dialog/find.cpp:440
-msgid "partial"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:372 ../src/ui/dialog/find.cpp:447
-msgid "No objects found"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:530
-msgid "T_ype: "
-msgstr ""
-
-#: ../src/dialogs/find.cpp:537 ../src/ui/dialog/find.cpp:69
-msgid "Search in all object types"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:537 ../src/ui/dialog/find.cpp:69
-msgid "All types"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:548 ../src/ui/dialog/find.cpp:70
-msgid "Search all shapes"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:548 ../src/ui/dialog/find.cpp:70
-msgid "All shapes"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:565 ../src/ui/dialog/find.cpp:71
-msgid "Search rectangles"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:565 ../src/ui/dialog/find.cpp:71
-msgid "Rectangles"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:570 ../src/ui/dialog/find.cpp:72
-msgid "Search ellipses, arcs, circles"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:570 ../src/ui/dialog/find.cpp:72
-msgid "Ellipses"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:575 ../src/ui/dialog/find.cpp:73
-msgid "Search stars and polygons"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:575 ../src/ui/dialog/find.cpp:73
-msgid "Stars"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:580 ../src/ui/dialog/find.cpp:74
-msgid "Search spirals"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:580 ../src/ui/dialog/find.cpp:74
-msgid "Spirals"
-msgstr ""
-
-#. TRANSLATORS: polyline is a set of connected straight line segments
-#. http://www.w3.org/TR/SVG11/shapes.html#PolylineElement
-#: ../src/dialogs/find.cpp:593 ../src/ui/dialog/find.cpp:75
-msgid "Search paths, lines, polylines"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:593 ../src/ui/dialog/find.cpp:75
-#: ../src/widgets/toolbox.cpp:2091
-msgid "Paths"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:598 ../src/ui/dialog/find.cpp:76
-msgid "Search text objects"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:598 ../src/ui/dialog/find.cpp:76
-msgid "Texts"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:603 ../src/ui/dialog/find.cpp:77
-msgid "Search groups"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:603 ../src/ui/dialog/find.cpp:77
-msgid "Groups"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:608 ../src/ui/dialog/find.cpp:82
-msgid "Search clones"
-msgstr ""
-
-#. TRANSLATORS: only translate "string" in "context|string".
-#. For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS
-#. "Clones" is a noun indicating type of object to find
-#: ../src/dialogs/find.cpp:612 ../src/ui/dialog/find.cpp:82
-msgid "find|Clones"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:617 ../src/ui/dialog/find.cpp:83
-msgid "Search images"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:617 ../src/ui/dialog/find.cpp:83
-#: ../share/extensions/embedimage.inx.h:3
-#: ../share/extensions/extractimage.inx.h:2
-msgid "Images"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:622 ../src/ui/dialog/find.cpp:84
-msgid "Search offset objects"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:622 ../src/ui/dialog/find.cpp:84
-msgid "Offsets"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:687 ../src/ui/dialog/find.cpp:60
-msgid "_Text: "
-msgstr ""
-
-#: ../src/dialogs/find.cpp:687 ../src/ui/dialog/find.cpp:60
-msgid "Find objects by their text content (exact or partial match)"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:688 ../src/ui/dialog/find.cpp:61
-msgid "_ID: "
-msgstr ""
-
-#: ../src/dialogs/find.cpp:688 ../src/ui/dialog/find.cpp:61
-msgid "Find objects by the value of the id attribute (exact or partial match)"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:689 ../src/ui/dialog/find.cpp:62
-msgid "_Style: "
-msgstr ""
-
-#: ../src/dialogs/find.cpp:689 ../src/ui/dialog/find.cpp:62
-msgid ""
-"Find objects by the value of the style attribute (exact or partial match)"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:690 ../src/ui/dialog/find.cpp:63
-msgid "_Attribute: "
-msgstr ""
-
-#: ../src/dialogs/find.cpp:690 ../src/ui/dialog/find.cpp:63
-msgid "Find objects by the name of an attribute (exact or partial match)"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:704 ../src/ui/dialog/find.cpp:64
-msgid "Search in s_election"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:708 ../src/ui/dialog/find.cpp:64
-msgid "Limit search to the current selection"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:713 ../src/ui/dialog/find.cpp:65
-msgid "Search in current _layer"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:717 ../src/ui/dialog/find.cpp:65
-msgid "Limit search to the current layer"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:722 ../src/ui/dialog/find.cpp:66
-msgid "Include _hidden"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:726 ../src/ui/dialog/find.cpp:66
-msgid "Include hidden objects in search"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:731 ../src/ui/dialog/find.cpp:67
-msgid "Include l_ocked"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:735 ../src/ui/dialog/find.cpp:67
-msgid "Include locked objects in search"
-msgstr ""
-
-#. TRANSLATORS: "Clear" is a verb here
-#: ../src/dialogs/find.cpp:746 ../src/ui/dialog/debug.cpp:75
-#: ../src/ui/dialog/find.cpp:86 ../src/ui/dialog/messages.cpp:53
-#: ../src/ui/dialog/scriptdialog.cpp:209
-msgid "_Clear"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:746 ../src/ui/dialog/find.cpp:86
-msgid "Clear values"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:747 ../src/ui/dialog/find.cpp:87
-msgid "_Find"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:747 ../src/ui/dialog/find.cpp:87
-msgid "Select objects matching all of the fields you filled in"
-msgstr ""
-
-#. Create the label for the object id
-#: ../src/dialogs/item-properties.cpp:120
-#: ../src/dialogs/item-properties.cpp:334
-#: ../src/dialogs/item-properties.cpp:443
-#: ../src/dialogs/item-properties.cpp:450
-msgid "_Id"
-msgstr ""
-
-#: ../src/dialogs/item-properties.cpp:129
-msgid ""
-"The id= attribute (only letters, digits, and the characters .-_: allowed)"
-msgstr ""
-
-#. Button for setting the object's id, label, title and description.
-#: ../src/dialogs/item-properties.cpp:143 ../src/verbs.cpp:2486
-#: ../src/verbs.cpp:2492
-msgid "_Set"
-msgstr ""
-
-#. Create the label for the object label
-#: ../src/dialogs/item-properties.cpp:152
-msgid "_Label"
-msgstr ""
-
-#: ../src/dialogs/item-properties.cpp:161
-msgid "A freeform label for the object"
-msgstr ""
-
-#. Create the label for the object title
-#: ../src/dialogs/item-properties.cpp:173
-msgid "_Title"
-msgstr ""
-
-#. Create the frame for the object description
-#: ../src/dialogs/item-properties.cpp:191
-msgid "_Description"
-msgstr ""
-
-#. Hide
-#: ../src/dialogs/item-properties.cpp:222
-msgid "_Hide"
-msgstr ""
-
-#: ../src/dialogs/item-properties.cpp:223
-msgid "Check to make the object invisible"
-msgstr ""
-
-#. Lock
-#. TRANSLATORS: "Lock" is a verb here
-#: ../src/dialogs/item-properties.cpp:232
-msgid "L_ock"
-msgstr ""
-
-#: ../src/dialogs/item-properties.cpp:233
-msgid "Check to make the object insensitive (not selectable by mouse)"
-msgstr ""
-
-#. Create the frame for interactivity options
-#: ../src/dialogs/item-properties.cpp:243
-msgid "_Interactivity"
-msgstr ""
-
-#: ../src/dialogs/item-properties.cpp:317
-#: ../src/dialogs/item-properties.cpp:324
-msgid "Ref"
-msgstr ""
-
-#: ../src/dialogs/item-properties.cpp:402
-msgid "Lock object"
-msgstr ""
-
-#: ../src/dialogs/item-properties.cpp:402
-msgid "Unlock object"
-msgstr ""
-
-#: ../src/dialogs/item-properties.cpp:421
-msgid "Hide object"
-msgstr ""
-
-#: ../src/dialogs/item-properties.cpp:421
-msgid "Unhide object"
-msgstr ""
-
-#: ../src/dialogs/item-properties.cpp:445
-msgid "Id invalid! "
-msgstr ""
-
-#: ../src/dialogs/item-properties.cpp:447
-msgid "Id exists! "
-msgstr ""
-
-#: ../src/dialogs/item-properties.cpp:454
-msgid "Set object ID"
-msgstr ""
-
-#: ../src/dialogs/item-properties.cpp:469
-msgid "Set object label"
-msgstr ""
-
-#: ../src/dialogs/item-properties.cpp:477
-msgid "Set object title"
-msgstr ""
-
-#: ../src/dialogs/item-properties.cpp:487
-msgid "Set object description"
-msgstr ""
-
-#: ../src/dialogs/object-attributes.cpp:32
-msgid "Href:"
-msgstr ""
-
-#. default x:
-#. default y:
-#: ../src/dialogs/object-attributes.cpp:33
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2191
-msgid "Target:"
-msgstr ""
-
-#. _settings->add_checkbutton(false, SP_ATTR_STITCHTILES, _("Stitch Tiles"), "stitch", "noStitch");
-#: ../src/dialogs/object-attributes.cpp:34
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2168
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2246
-msgid "Type:"
-msgstr ""
-
-#. TRANSLATORS: for info, see http://www.w3.org/TR/2000/CR-SVG-20000802/linking.html#AElementXLinkRoleAttribute
-#. Identifies the type of the related resource with an absolute URI
-#: ../src/dialogs/object-attributes.cpp:37
-msgid "Role:"
-msgstr ""
-
-#. TRANSLATORS: for info, see http://www.w3.org/TR/2000/CR-SVG-20000802/linking.html#AElementXLinkArcRoleAttribute
-#. For situations where the nature/role alone isn't enough, this offers an additional URI defining the purpose of the link.
-#: ../src/dialogs/object-attributes.cpp:40
-msgid "Arcrole:"
-msgstr ""
-
-#. TRANSLATORS: for info, see http://www.w3.org/TR/2000/CR-SVG-20000802/linking.html#AElementXLinkTitleAttribute
-#: ../src/dialogs/object-attributes.cpp:42
-msgid "Title:"
-msgstr ""
-
-#: ../src/dialogs/object-attributes.cpp:43
-#: ../share/extensions/polyhedron_3d.inx.h:36
-msgid "Show:"
-msgstr ""
-
-#. TRANSLATORS: for info, see http://www.w3.org/TR/2000/CR-SVG-20000802/linking.html#AElementXLinkActuateAttribute
-#: ../src/dialogs/object-attributes.cpp:45
-msgid "Actuate:"
-msgstr ""
-
-#: ../src/dialogs/object-attributes.cpp:50
-msgid "URL:"
-msgstr ""
-
-#: ../src/dialogs/object-attributes.cpp:51
-#: ../src/dialogs/object-attributes.cpp:59 ../src/ui/dialog/guides.cpp:43
-#: ../src/ui/view/edit-widget.cpp:1074 ../src/widgets/desktop-widget.cpp:504
-#: ../src/widgets/toolbox.cpp:1472
-msgid "X:"
-msgstr ""
-
-#: ../src/dialogs/object-attributes.cpp:52
-#: ../src/dialogs/object-attributes.cpp:60 ../src/ui/dialog/guides.cpp:44
-#: ../src/ui/view/edit-widget.cpp:1075 ../src/widgets/desktop-widget.cpp:507
-#: ../src/widgets/toolbox.cpp:1490
-msgid "Y:"
-msgstr ""
-
-#: ../src/dialogs/object-attributes.cpp:53
-#: ../src/dialogs/object-attributes.cpp:61 ../src/widgets/toolbox.cpp:4124
-#: ../src/widgets/toolbox.cpp:4715 ../src/widgets/toolbox.cpp:5734
-msgid "Width:"
-msgstr ""
-
-#: ../src/dialogs/object-attributes.cpp:54
-#: ../src/dialogs/object-attributes.cpp:62
-msgid "Height:"
-msgstr ""
-
-#: ../src/dialogs/object-attributes.cpp:106
-#, c-format
-msgid "%s Properties"
-msgstr ""
-
-#: ../src/dialogs/spellcheck.cpp:444
-#, c-format
-msgid "<b>Finished</b>, <b>%d</b> words added to dictionary"
-msgstr ""
-
-#: ../src/dialogs/spellcheck.cpp:446
-#, c-format
-msgid "<b>Finished</b>, nothing suspicious found"
-msgstr ""
-
-#: ../src/dialogs/spellcheck.cpp:559
-#, c-format
-msgid "Not in dictionary (%s): <b>%s</b>"
-msgstr ""
-
-#: ../src/dialogs/spellcheck.cpp:711
-msgid "<i>Checking...</i>"
-msgstr ""
-
-#: ../src/dialogs/spellcheck.cpp:781
-msgid "Fix spelling"
-msgstr ""
-
-#: ../src/dialogs/spellcheck.cpp:955
-msgid "Suggestions:"
-msgstr ""
-
-#: ../src/dialogs/spellcheck.cpp:967
-msgid "_Accept"
-msgstr ""
-
-#: ../src/dialogs/spellcheck.cpp:967
-msgid "Accept the chosen suggestion"
-msgstr ""
-
-#: ../src/dialogs/spellcheck.cpp:969
-msgid "_Ignore once"
-msgstr ""
-
-#: ../src/dialogs/spellcheck.cpp:969
-msgid "Ignore this word only once"
-msgstr ""
-
-#: ../src/dialogs/spellcheck.cpp:971
-msgid "_Ignore"
-msgstr ""
-
-#: ../src/dialogs/spellcheck.cpp:971
-msgid "Ignore this word in this session"
-msgstr ""
-
-#: ../src/dialogs/spellcheck.cpp:978
-msgid "A_dd to dictionary:"
-msgstr ""
-
-#: ../src/dialogs/spellcheck.cpp:978
-msgid "Add this word to the chosen dictionary"
-msgstr ""
-
-#: ../src/dialogs/spellcheck.cpp:1002
-msgid "_Stop"
-msgstr ""
-
-#: ../src/dialogs/spellcheck.cpp:1002
-msgid "Stop the check"
-msgstr ""
-
-#: ../src/dialogs/spellcheck.cpp:1004
-msgid "_Start"
-msgstr ""
-
-#: ../src/dialogs/spellcheck.cpp:1004
-msgid "Start the check"
-msgstr ""
-
-#: ../src/dialogs/text-edit.cpp:198
-msgid "Font"
-msgstr ""
-
-#: ../src/dialogs/text-edit.cpp:221 ../share/extensions/svgcalendar.inx.h:12
-msgid "Layout"
-msgstr ""
-
-#: ../src/dialogs/text-edit.cpp:235
-msgid "Align lines left"
-msgstr ""
-
-#. TRANSLATORS: `Center' here is a verb.
-#: ../src/dialogs/text-edit.cpp:250
-msgid "Center lines"
-msgstr ""
-
-#: ../src/dialogs/text-edit.cpp:264
-msgid "Align lines right"
-msgstr ""
-
-#: ../src/dialogs/text-edit.cpp:278
-msgid "Justify lines"
-msgstr ""
-
-#: ../src/dialogs/text-edit.cpp:300 ../src/widgets/toolbox.cpp:6804
-msgid "Horizontal text"
-msgstr ""
-
-#: ../src/dialogs/text-edit.cpp:314 ../src/widgets/toolbox.cpp:6816
-msgid "Vertical text"
-msgstr ""
-
-#: ../src/dialogs/text-edit.cpp:329
-msgid "Line spacing:"
-msgstr ""
-
-#. Text
-#: ../src/dialogs/text-edit.cpp:375 ../src/selection-describer.cpp:69
-#: ../src/ui/dialog/inkscape-preferences.cpp:522 ../src/verbs.cpp:2522
-#: ../share/extensions/lorem_ipsum.inx.h:5
-#: ../share/extensions/render_alphabetsoup.inx.h:5
-#: ../share/extensions/text_braille.inx.h:2
-#: ../share/extensions/text_flipcase.inx.h:1
-#: ../share/extensions/text_lowercase.inx.h:1
-#: ../share/extensions/text_randomcase.inx.h:1
-#: ../share/extensions/text_replace.inx.h:4
-#: ../share/extensions/text_sentencecase.inx.h:2
-#: ../share/extensions/text_titlecase.inx.h:1
-#: ../share/extensions/text_uppercase.inx.h:1
-msgid "Text"
-msgstr ""
-
-#: ../src/dialogs/text-edit.cpp:422
-msgid "Set as default"
-msgstr ""
-
-#: ../src/dialogs/text-edit.cpp:665 ../src/text-context.cpp:1493
-msgid "Set text style"
-msgstr ""
-
-#: ../src/dialogs/xml-tree.cpp:152
-msgid "<b>Click</b> to select nodes, <b>drag</b> to rearrange."
-msgstr ""
-
-#: ../src/dialogs/xml-tree.cpp:163
-msgid "<b>Click</b> attribute to edit."
-msgstr ""
-
-#: ../src/dialogs/xml-tree.cpp:167
-#, c-format
-msgid ""
-"Attribute <b>%s</b> selected. Press <b>Ctrl+Enter</b> when done editing to "
-"commit changes."
-msgstr ""
-
-#: ../src/dialogs/xml-tree.cpp:263
-msgid "Drag to reorder nodes"
-msgstr ""
-
-#: ../src/dialogs/xml-tree.cpp:283
-msgid "New element node"
-msgstr ""
-
-#: ../src/dialogs/xml-tree.cpp:305
-msgid "New text node"
-msgstr ""
-
-#: ../src/dialogs/xml-tree.cpp:326 ../src/dialogs/xml-tree.cpp:1409
-#: ../src/nodepath.cpp:2249
-msgid "Duplicate node"
-msgstr ""
-
-#: ../src/dialogs/xml-tree.cpp:347
-msgid "nodeAsInXMLdialogTooltip|Delete node"
-msgstr ""
-
-#: ../src/dialogs/xml-tree.cpp:363 ../src/dialogs/xml-tree.cpp:1571
-msgid "Unindent node"
-msgstr ""
-
-#: ../src/dialogs/xml-tree.cpp:378 ../src/dialogs/xml-tree.cpp:1550
-msgid "Indent node"
-msgstr ""
-
-#: ../src/dialogs/xml-tree.cpp:390 ../src/dialogs/xml-tree.cpp:1503
-msgid "Raise node"
-msgstr ""
-
-#: ../src/dialogs/xml-tree.cpp:402 ../src/dialogs/xml-tree.cpp:1520
-msgid "Lower node"
-msgstr ""
-
-#: ../src/dialogs/xml-tree.cpp:447 ../src/dialogs/xml-tree.cpp:1444
-msgid "Delete attribute"
-msgstr ""
-
-#. TRANSLATORS: "Attribute" is a noun here
-#: ../src/dialogs/xml-tree.cpp:492
-msgid "Attribute name"
-msgstr ""
-
-#. TRANSLATORS: "Set" is a verb here
-#: ../src/dialogs/xml-tree.cpp:512 ../src/widgets/sp-attribute-widget.cpp:158
-#: ../src/widgets/sp-attribute-widget.cpp:765
-msgid "Set attribute"
-msgstr ""
-
-#. TRANSLATORS: "Set" is a verb here
-#: ../src/dialogs/xml-tree.cpp:514
-msgid "Set"
-msgstr ""
-
-#. TRANSLATORS: "Attribute" is a noun here
-#: ../src/dialogs/xml-tree.cpp:537
-msgid "Attribute value"
-msgstr ""
-
-#: ../src/dialogs/xml-tree.cpp:874
-msgid "Drag XML subtree"
-msgstr ""
-
-#: ../src/dialogs/xml-tree.cpp:1311
-msgid "New element node..."
-msgstr ""
-
-#: ../src/dialogs/xml-tree.cpp:1333
-msgid "Cancel"
-msgstr ""
-
-#: ../src/dialogs/xml-tree.cpp:1341
-msgid "Create"
-msgstr ""
-
-#: ../src/dialogs/xml-tree.cpp:1375
-msgid "Create new element node"
-msgstr ""
-
-#: ../src/dialogs/xml-tree.cpp:1391
-msgid "Create new text node"
-msgstr ""
-
-#: ../src/dialogs/xml-tree.cpp:1426
-msgid "nodeAsInXMLinHistoryDialog|Delete node"
-msgstr ""
-
-#: ../src/dialogs/xml-tree.cpp:1473
-msgid "Change attribute"
-msgstr ""
-
-#: ../src/display/canvas-axonomgrid.cpp:396 ../src/display/canvas-grid.cpp:670
-msgid "Grid _units:"
-msgstr ""
-
-#: ../src/display/canvas-axonomgrid.cpp:398 ../src/display/canvas-grid.cpp:672
-msgid "_Origin X:"
-msgstr ""
-
-#: ../src/display/canvas-axonomgrid.cpp:398 ../src/display/canvas-grid.cpp:672
-#: ../src/ui/dialog/inkscape-preferences.cpp:978
-#: ../src/ui/dialog/inkscape-preferences.cpp:999
-msgid "X coordinate of grid origin"
-msgstr ""
-
-#: ../src/display/canvas-axonomgrid.cpp:400 ../src/display/canvas-grid.cpp:674
-msgid "O_rigin Y:"
-msgstr ""
-
-#: ../src/display/canvas-axonomgrid.cpp:400 ../src/display/canvas-grid.cpp:674
-#: ../src/ui/dialog/inkscape-preferences.cpp:979
-#: ../src/ui/dialog/inkscape-preferences.cpp:1000
-msgid "Y coordinate of grid origin"
-msgstr ""
-
-#: ../src/display/canvas-axonomgrid.cpp:402 ../src/display/canvas-grid.cpp:678
-msgid "Spacing _Y:"
-msgstr ""
-
-#: ../src/display/canvas-axonomgrid.cpp:402
-#: ../src/ui/dialog/inkscape-preferences.cpp:1002
-msgid "Base length of z-axis"
-msgstr ""
-
-#: ../src/display/canvas-axonomgrid.cpp:404
-#: ../src/ui/dialog/inkscape-preferences.cpp:1005
-#: ../src/widgets/toolbox.cpp:3422
-msgid "Angle X:"
-msgstr ""
-
-#: ../src/display/canvas-axonomgrid.cpp:404
-#: ../src/ui/dialog/inkscape-preferences.cpp:1005
-msgid "Angle of x-axis"
-msgstr ""
-
-#: ../src/display/canvas-axonomgrid.cpp:406
-#: ../src/ui/dialog/inkscape-preferences.cpp:1006
-#: ../src/widgets/toolbox.cpp:3501
-msgid "Angle Z:"
-msgstr ""
-
-#: ../src/display/canvas-axonomgrid.cpp:406
-#: ../src/ui/dialog/inkscape-preferences.cpp:1006
-msgid "Angle of z-axis"
-msgstr ""
-
-#: ../src/display/canvas-axonomgrid.cpp:410 ../src/display/canvas-grid.cpp:682
-msgid "Grid line _color:"
-msgstr ""
-
-#: ../src/display/canvas-axonomgrid.cpp:410 ../src/display/canvas-grid.cpp:682
-msgid "Grid line color"
-msgstr ""
-
-#: ../src/display/canvas-axonomgrid.cpp:410 ../src/display/canvas-grid.cpp:682
-msgid "Color of grid lines"
-msgstr ""
-
-#: ../src/display/canvas-axonomgrid.cpp:415 ../src/display/canvas-grid.cpp:687
-msgid "Ma_jor grid line color:"
-msgstr ""
-
-#: ../src/display/canvas-axonomgrid.cpp:415 ../src/display/canvas-grid.cpp:687
-msgid "Major grid line color"
-msgstr ""
-
-#: ../src/display/canvas-axonomgrid.cpp:416 ../src/display/canvas-grid.cpp:688
-msgid "Color of the major (highlighted) grid lines"
-msgstr ""
-
-#: ../src/display/canvas-axonomgrid.cpp:420 ../src/display/canvas-grid.cpp:692
-msgid "_Major grid line every:"
-msgstr ""
-
-#: ../src/display/canvas-axonomgrid.cpp:420 ../src/display/canvas-grid.cpp:692
-msgid "lines"
-msgstr ""
-
-#: ../src/display/canvas-grid.cpp:39
-msgid "Rectangular grid"
-msgstr ""
-
-#: ../src/display/canvas-grid.cpp:40
-msgid "Axonometric grid"
-msgstr ""
-
-#: ../src/display/canvas-grid.cpp:258
-msgid "Create new grid"
-msgstr ""
-
-#: ../src/display/canvas-grid.cpp:324
-msgid "_Enabled"
-msgstr ""
-
-#: ../src/display/canvas-grid.cpp:325
-msgid ""
-"Determines whether to snap to this grid or not. Can be 'on' for invisible "
-"grids."
-msgstr ""
-
-#: ../src/display/canvas-grid.cpp:329
-msgid "Snap to visible _grid lines only"
-msgstr ""
-
-#: ../src/display/canvas-grid.cpp:330
-msgid ""
-"When zoomed out, not all grid lines will be displayed. Only the visible ones "
-"will be snapped to"
-msgstr ""
-
-#: ../src/display/canvas-grid.cpp:334
-msgid "_Visible"
-msgstr ""
-
-#: ../src/display/canvas-grid.cpp:335
-msgid ""
-"Determines whether the grid is displayed or not. Objects are still snapped "
-"to invisible grids."
-msgstr ""
-
-#: ../src/display/canvas-grid.cpp:676
-msgid "Spacing _X:"
-msgstr ""
-
-#: ../src/display/canvas-grid.cpp:676
-#: ../src/ui/dialog/inkscape-preferences.cpp:982
-msgid "Distance between vertical grid lines"
-msgstr ""
-
-#: ../src/display/canvas-grid.cpp:678
-#: ../src/ui/dialog/inkscape-preferences.cpp:983
-msgid "Distance between horizontal grid lines"
-msgstr ""
-
-#: ../src/display/canvas-grid.cpp:711
-msgid "_Show dots instead of lines"
-msgstr ""
-
-#: ../src/display/canvas-grid.cpp:712
-msgid "If set, displays dots at gridpoints instead of gridlines"
-msgstr ""
-
-#. TRANSLATORS: undefined target for snapping
-#: ../src/display/snap-indicator.cpp:60 ../src/display/snap-indicator.cpp:63
-#: ../src/display/snap-indicator.cpp:148 ../src/display/snap-indicator.cpp:151
-msgid "UNDEFINED"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:66
-msgid "grid line"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:69
-msgid "grid intersection"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:72
-msgid "guide"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:75
-msgid "guide intersection"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:78
-msgid "guide origin"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:81
-msgid "grid-guide intersection"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:84
-msgid "cusp node"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:87
-msgid "smooth node"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:90
-msgid "path"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:93
-msgid "path intersection"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:96
-msgid "bounding box corner"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:99
-msgid "bounding box side"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:102
-msgid "bounding box"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:105
-msgid "page border"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:108
-msgid "line midpoint"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:111
-msgid "object midpoint"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:114
-msgid "object rotation center"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:117
-msgid "handle"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:120
-msgid "bounding box side midpoint"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:123
-msgid "bounding box midpoint"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:126
-msgid "page corner"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:129
-msgid "convex hull corner"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:132
-msgid "quadrant point"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:135
-msgid "center"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:138
-msgid "corner"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:141
-msgid "text baseline"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:154
-msgid "Bounding box corner"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:157
-msgid "Bounding box midpoint"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:160
-msgid "Bounding box side midpoint"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:163
-msgid "Smooth node"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:166
-msgid "Cusp node"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:169
-msgid "Line midpoint"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:172
-msgid "Object midpoint"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:175
-msgid "Object rotation center"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:178
-msgid "Handle"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:181
-msgid "Path intersection"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:184
-msgid "Guide"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:187
-msgid "Guide origin"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:190
-msgid "Convex hull corner"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:193
-msgid "Quadrant point"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:196 ../src/widgets/toolbox.cpp:6734
-msgid "Center"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:199
-msgid "Corner"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:202
-msgid "Text baseline"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:241
-msgid " to "
-msgstr ""
-
-#: ../src/document.cpp:445
-#, c-format
-msgid "New document %d"
-msgstr ""
-
-#: ../src/document.cpp:477
-#, c-format
-msgid "Memory document %d"
-msgstr ""
-
-#: ../src/document.cpp:632
-#, c-format
-msgid "Unnamed document %d"
-msgstr ""
-
-#. We hit green anchor, closing Green-Blue-Red
-#: ../src/draw-context.cpp:581
-msgid "Path is closed."
-msgstr ""
-
-#. We hit bot start and end of single curve, closing paths
-#: ../src/draw-context.cpp:596
-msgid "Closing path."
-msgstr ""
-
-#: ../src/draw-context.cpp:706
-msgid "Draw path"
-msgstr ""
-
-#: ../src/draw-context.cpp:867
-msgid "Creating single dot"
-msgstr ""
-
-#: ../src/draw-context.cpp:868
-msgid "Create single dot"
-msgstr ""
-
-#. alpha of color under cursor, to show in the statusbar
-#. locale-sensitive printf is OK, since this goes to the UI, not into SVG
-#: ../src/dropper-context.cpp:302
-#, c-format
-msgid " alpha %.3g"
-msgstr ""
-
-#. where the color is picked, to show in the statusbar
-#: ../src/dropper-context.cpp:304
-#, c-format
-msgid ", averaged with radius %d"
-msgstr ""
-
-#: ../src/dropper-context.cpp:304
-#, c-format
-msgid " under cursor"
-msgstr ""
-
-#. message, to show in the statusbar
-#: ../src/dropper-context.cpp:306
-msgid "<b>Release mouse</b> to set color."
-msgstr ""
-
-#: ../src/dropper-context.cpp:306 ../src/tools-switch.cpp:208
-msgid ""
-"<b>Click</b> to set fill, <b>Shift+click</b> to set stroke; <b>drag</b> to "
-"average color in area; with <b>Alt</b> to pick inverse color; <b>Ctrl+C</b> "
-"to copy the color under mouse to clipboard"
-msgstr ""
-
-#: ../src/dropper-context.cpp:344
-msgid "Set picked color"
-msgstr ""
-
-#: ../src/dyna-draw-context.cpp:615
-msgid ""
-"<b>Guide path selected</b>; start drawing along the guide with <b>Ctrl</b>"
-msgstr ""
-
-#: ../src/dyna-draw-context.cpp:617
-msgid "<b>Select a guide path</b> to track with <b>Ctrl</b>"
-msgstr ""
-
-#: ../src/dyna-draw-context.cpp:752
-msgid "Tracking: <b>connection to guide path lost!</b>"
-msgstr ""
-
-#: ../src/dyna-draw-context.cpp:752
-msgid "<b>Tracking</b> a guide path"
-msgstr ""
-
-#: ../src/dyna-draw-context.cpp:755
-msgid "<b>Drawing</b> a calligraphic stroke"
-msgstr ""
-
-#: ../src/dyna-draw-context.cpp:1044
-msgid "Draw calligraphic stroke"
-msgstr ""
-
-#: ../src/eraser-context.cpp:527
-msgid "<b>Drawing</b> an eraser stroke"
-msgstr ""
-
-#: ../src/eraser-context.cpp:830
-msgid "Draw eraser stroke"
-msgstr ""
-
-#: ../src/event-context.cpp:618
-msgid "<b>Space+mouse drag</b> to pan canvas"
-msgstr ""
-
-#: ../src/event-log.cpp:37
-msgid "[Unchanged]"
-msgstr ""
-
-#. Edit
-#: ../src/event-log.cpp:264 ../src/event-log.cpp:267 ../src/verbs.cpp:2276
-msgid "_Undo"
-msgstr ""
-
-#: ../src/event-log.cpp:274 ../src/event-log.cpp:278 ../src/verbs.cpp:2278
-msgid "_Redo"
-msgstr ""
-
-#: ../src/extension/dependency.cpp:246
-msgid "Dependency:"
-msgstr ""
-
-#: ../src/extension/dependency.cpp:247
-msgid "  type: "
-msgstr ""
-
-#: ../src/extension/dependency.cpp:248
-msgid "  location: "
-msgstr ""
-
-#: ../src/extension/dependency.cpp:249
-msgid "  string: "
-msgstr ""
-
-#: ../src/extension/dependency.cpp:252
-msgid "  description: "
-msgstr ""
-
-#: ../src/extension/effect.cpp:39
-msgid " (No preferences)"
-msgstr ""
-
-#. This is some filler text, needs to change before relase
-#: ../src/extension/error-file.cpp:53
-msgid ""
-"<span weight=\"bold\" size=\"larger\">One or more extensions failed to load</"
-"span>\n"
-"\n"
-"The failed extensions have been skipped.  Inkscape will continue to run "
-"normally but those extensions will be unavailable.  For details to "
-"troubleshoot this problem, please refer to the error log located at: "
-msgstr ""
-
-#: ../src/extension/error-file.cpp:63
-msgid "Show dialog on startup"
-msgstr ""
-
-#: ../src/extension/execution-env.cpp:134
-#, c-format
-msgid "'%s' working, please wait..."
-msgstr ""
-
-#. static int i = 0;
-#. std::cout << "Checking module[" << i++ << "]: " << name << std::endl;
-#: ../src/extension/extension.cpp:252
-msgid ""
-"  This is caused by an improper .inx file for this extension.  An improper ."
-"inx file could have been caused by a faulty installation of Inkscape."
-msgstr ""
-
-#: ../src/extension/extension.cpp:255
-msgid "an ID was not defined for it."
-msgstr ""
-
-#: ../src/extension/extension.cpp:259
-msgid "there was no name defined for it."
-msgstr ""
-
-#: ../src/extension/extension.cpp:263
-msgid "the XML description of it got lost."
-msgstr ""
-
-#: ../src/extension/extension.cpp:267
-msgid "no implementation was defined for the extension."
-msgstr ""
-
-#. std::cout << "Failed: " << *(_deps[i]) << std::endl;
-#: ../src/extension/extension.cpp:274
-msgid "a dependency was not met."
-msgstr ""
-
-#: ../src/extension/extension.cpp:294
-msgid "Extension \""
-msgstr ""
-
-#: ../src/extension/extension.cpp:294
-msgid "\" failed to load because "
-msgstr ""
-
-#: ../src/extension/extension.cpp:625
-#, c-format
-msgid "Could not create extension error log file '%s'"
-msgstr ""
-
-#: ../src/extension/extension.cpp:723
-msgid "Name:"
-msgstr ""
-
-#: ../src/extension/extension.cpp:724
-msgid "ID:"
-msgstr ""
-
-#: ../src/extension/extension.cpp:725
-msgid "State:"
-msgstr ""
-
-#: ../src/extension/extension.cpp:725
-msgid "Loaded"
-msgstr ""
-
-#: ../src/extension/extension.cpp:725
-msgid "Unloaded"
-msgstr ""
-
-#: ../src/extension/extension.cpp:725
-msgid "Deactivated"
-msgstr ""
-
-#: ../src/extension/extension.cpp:756
-msgid ""
-"Currently there is no help available for this Extension.  Please look on the "
-"Inkscape website or ask on the mailing lists if you have questions regarding "
-"this extension."
-msgstr ""
-
-#: ../src/extension/implementation/script.cpp:1060
-msgid ""
-"Inkscape has received additional data from the script executed.  The script "
-"did not return an error, but this may indicate the results will not be as "
-"expected."
-msgstr ""
-
-#: ../src/extension/init.cpp:274
-msgid "Null external module directory name.  Modules will not be loaded."
-msgstr ""
-
-#: ../src/extension/init.cpp:288
-#: ../src/extension/internal/filter/filter-file.cpp:56
-#, c-format
-msgid ""
-"Modules directory (%s) is unavailable.  External modules in that directory "
-"will not be loaded."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/adaptiveThreshold.cpp:38
-msgid "Adaptive Threshold"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/adaptiveThreshold.cpp:40
-#: ../src/extension/internal/bitmap/raise.cpp:41
-#: ../src/extension/internal/bitmap/sample.cpp:40
-#: ../src/extension/internal/bluredge.cpp:136 ../src/libgdl/gdl-dock.c:190
-#: ../src/libgdl/gdl-dock-placeholder.c:169
-#: ../src/live_effects/lpe-bendpath.cpp:56
-#: ../src/live_effects/lpe-patternalongpath.cpp:64
-#: ../src/widgets/toolbox.cpp:3095 ../src/widgets/toolbox.cpp:4124
-#: ../share/extensions/foldablebox.inx.h:9
-#: ../share/extensions/interp_att_g.inx.h:26
-msgid "Width"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/adaptiveThreshold.cpp:41
-#: ../src/extension/internal/bitmap/raise.cpp:42
-#: ../src/extension/internal/bitmap/sample.cpp:41 ../src/libgdl/gdl-dock.c:198
-#: ../src/libgdl/gdl-dock-placeholder.c:177 ../src/widgets/toolbox.cpp:3112
-#: ../share/extensions/foldablebox.inx.h:4
-#: ../share/extensions/interp_att_g.inx.h:6
-msgid "Height"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/adaptiveThreshold.cpp:42
-#: ../src/filter-enums.cpp:32 ../src/live_effects/effect.cpp:99
-#: ../src/live_effects/lpe-ruler.cpp:50
-msgid "Offset"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/adaptiveThreshold.cpp:46
-#: ../src/extension/internal/bitmap/addNoise.cpp:57
-#: ../src/extension/internal/bitmap/blur.cpp:44
-#: ../src/extension/internal/bitmap/channel.cpp:63
-#: ../src/extension/internal/bitmap/charcoal.cpp:44
-#: ../src/extension/internal/bitmap/colorize.cpp:55
-#: ../src/extension/internal/bitmap/contrast.cpp:45
-#: ../src/extension/internal/bitmap/cycleColormap.cpp:42
-#: ../src/extension/internal/bitmap/despeckle.cpp:40
-#: ../src/extension/internal/bitmap/edge.cpp:42
-#: ../src/extension/internal/bitmap/emboss.cpp:44
-#: ../src/extension/internal/bitmap/enhance.cpp:39
-#: ../src/extension/internal/bitmap/equalize.cpp:39
-#: ../src/extension/internal/bitmap/gaussianBlur.cpp:44
-#: ../src/extension/internal/bitmap/implode.cpp:42
-#: ../src/extension/internal/bitmap/levelChannel.cpp:70
-#: ../src/extension/internal/bitmap/level.cpp:48
-#: ../src/extension/internal/bitmap/medianFilter.cpp:42
-#: ../src/extension/internal/bitmap/modulate.cpp:47
-#: ../src/extension/internal/bitmap/negate.cpp:40
-#: ../src/extension/internal/bitmap/normalize.cpp:40
-#: ../src/extension/internal/bitmap/oilPaint.cpp:42
-#: ../src/extension/internal/bitmap/opacity.cpp:43
-#: ../src/extension/internal/bitmap/raise.cpp:47
-#: ../src/extension/internal/bitmap/reduceNoise.cpp:45
-#: ../src/extension/internal/bitmap/sample.cpp:45
-#: ../src/extension/internal/bitmap/shade.cpp:47
-#: ../src/extension/internal/bitmap/sharpen.cpp:44
-#: ../src/extension/internal/bitmap/solarize.cpp:42
-#: ../src/extension/internal/bitmap/spread.cpp:42
-#: ../src/extension/internal/bitmap/swirl.cpp:42
-#: ../src/extension/internal/bitmap/threshold.cpp:43
-#: ../src/extension/internal/bitmap/unsharpmask.cpp:49
-#: ../src/extension/internal/bitmap/wave.cpp:44
-msgid "Raster"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/adaptiveThreshold.cpp:48
-msgid "Apply adaptive thresholding to selected bitmap(s)."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/addNoise.cpp:44
-msgid "Add Noise"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/addNoise.cpp:46 ../src/rdf.cpp:238
-msgid "Type"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/addNoise.cpp:47
-msgid "Uniform Noise"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/addNoise.cpp:48
-msgid "Gaussian Noise"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/addNoise.cpp:49
-msgid "Multiplicative Gaussian Noise"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/addNoise.cpp:50
-msgid "Impulse Noise"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/addNoise.cpp:51
-msgid "Laplacian Noise"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/addNoise.cpp:52
-msgid "Poisson Noise"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/addNoise.cpp:59
-msgid "Add random noise to selected bitmap(s)."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/blur.cpp:37
-msgid "Blur"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/blur.cpp:39
-#: ../src/extension/internal/bitmap/charcoal.cpp:39
-#: ../src/extension/internal/bitmap/edge.cpp:38
-#: ../src/extension/internal/bitmap/emboss.cpp:39
-#: ../src/extension/internal/bitmap/medianFilter.cpp:38
-#: ../src/extension/internal/bitmap/oilPaint.cpp:38
-#: ../src/extension/internal/bitmap/sharpen.cpp:39
-#: ../src/extension/internal/bitmap/unsharpmask.cpp:42
-msgid "Radius"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/blur.cpp:40
-#: ../src/extension/internal/bitmap/charcoal.cpp:40
-#: ../src/extension/internal/bitmap/emboss.cpp:40
-#: ../src/extension/internal/bitmap/gaussianBlur.cpp:40
-#: ../src/extension/internal/bitmap/sharpen.cpp:40
-#: ../src/extension/internal/bitmap/unsharpmask.cpp:43
-msgid "Sigma"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/blur.cpp:46
-msgid "Blur selected bitmap(s)"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/channel.cpp:47
-#: ../src/extension/internal/bitmap/levelChannel.cpp:53
-msgid "Channel"
-msgstr ""
-
-#. TODO: find an unused layer number, forming name from _("Layer ") + "%d"
-#: ../src/extension/internal/bitmap/channel.cpp:49
-#: ../src/ui/dialog/layer-properties.cpp:178
-#: ../src/ui/dialog/layer-properties.cpp:200
-msgid "Layer"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/channel.cpp:50
-#: ../src/extension/internal/bitmap/levelChannel.cpp:54
-msgid "Red Channel"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/channel.cpp:51
-#: ../src/extension/internal/bitmap/levelChannel.cpp:55
-msgid "Green Channel"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/channel.cpp:52
-#: ../src/extension/internal/bitmap/levelChannel.cpp:56
-msgid "Blue Channel"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/channel.cpp:53
-#: ../src/extension/internal/bitmap/levelChannel.cpp:57
-msgid "Cyan Channel"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/channel.cpp:54
-#: ../src/extension/internal/bitmap/levelChannel.cpp:58
-msgid "Magenta Channel"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/channel.cpp:55
-#: ../src/extension/internal/bitmap/levelChannel.cpp:59
-msgid "Yellow Channel"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/channel.cpp:56
-#: ../src/extension/internal/bitmap/levelChannel.cpp:60
-msgid "Black Channel"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/channel.cpp:57
-#: ../src/extension/internal/bitmap/levelChannel.cpp:61
-msgid "Opacity Channel"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/channel.cpp:58
-#: ../src/extension/internal/bitmap/levelChannel.cpp:62
-msgid "Matte Channel"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/channel.cpp:65
-msgid "Extract specific channel from image."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/charcoal.cpp:37
-msgid "Charcoal"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/charcoal.cpp:46
-msgid "Apply charcoal stylization to selected bitmap(s)."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/colorize.cpp:57
-msgid "Colorize selected bitmap(s) with specified color, using given opacity."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/contrast.cpp:39
-msgid "Contrast"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/contrast.cpp:41
-msgid "Adjust"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/contrast.cpp:47
-msgid "Increase or decrease contrast in bitmap(s)"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/cycleColormap.cpp:36
-msgid "Cycle Colormap"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/cycleColormap.cpp:38
-#: ../src/extension/internal/bitmap/spread.cpp:38
-#: ../src/extension/internal/bitmap/unsharpmask.cpp:44
-msgid "Amount"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/cycleColormap.cpp:44
-msgid "Cycle colormap(s) of selected bitmap(s)."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/despeckle.cpp:35
-msgid "Despeckle"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/despeckle.cpp:42
-msgid "Reduce speckle noise of selected bitmap(s)."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/edge.cpp:36
-msgid "Edge"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/edge.cpp:44
-msgid "Highlight edges of selected bitmap(s)."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/emboss.cpp:46
-msgid "Emboss selected bitmap(s) -- highlight edges with 3D effect."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/enhance.cpp:34
-msgid "Enhance"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/enhance.cpp:41
-msgid "Enhance selected bitmap(s) -- minimize noise."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/equalize.cpp:34
-msgid "Equalize"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/equalize.cpp:41
-msgid "Equalize selected bitmap(s) -- histogram equalization."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/gaussianBlur.cpp:37
-#: ../src/filter-enums.cpp:28
-msgid "Gaussian Blur"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/gaussianBlur.cpp:39
-#: ../src/extension/internal/bitmap/implode.cpp:38
-#: ../src/extension/internal/bitmap/solarize.cpp:38
-msgid "Factor"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/gaussianBlur.cpp:46
-msgid "Gaussian blur selected bitmap(s)."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/implode.cpp:36
-msgid "Implode"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/implode.cpp:44
-msgid "Implode selected bitmap(s)."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/levelChannel.cpp:51
-msgid "Level (with Channel)"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/levelChannel.cpp:64
-#: ../src/extension/internal/bitmap/level.cpp:42
-msgid "Black Point"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/levelChannel.cpp:65
-#: ../src/extension/internal/bitmap/level.cpp:43
-msgid "White Point"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/levelChannel.cpp:66
-#: ../src/extension/internal/bitmap/level.cpp:44
-msgid "Gamma Correction"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/levelChannel.cpp:72
-msgid ""
-"Level the specified channel of selected bitmap(s) by scaling values falling "
-"between the given ranges to the full color range."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/level.cpp:40
-msgid "Level"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/level.cpp:50
-msgid ""
-"Level selected bitmap(s) by scaling values falling between the given ranges "
-"to the full color range."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/medianFilter.cpp:36
-msgid "Median"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/medianFilter.cpp:44
-msgid ""
-"Replace each pixel component with the median color in a circular "
-"neighborhood."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/modulate.cpp:39
-msgid "HSB Adjust"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/modulate.cpp:41
-#: ../src/flood-context.cpp:250 ../src/widgets/sp-color-icc-selector.cpp:236
-#: ../src/widgets/sp-color-icc-selector.cpp:237
-#: ../src/widgets/sp-color-scales.cpp:426
-#: ../src/widgets/sp-color-scales.cpp:427 ../src/widgets/toolbox.cpp:4281
-#: ../share/extensions/color_randomize.inx.h:2
-msgid "Hue"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/modulate.cpp:42
-#: ../src/flood-context.cpp:251 ../src/ui/dialog/inkscape-preferences.cpp:830
-#: ../src/widgets/sp-color-icc-selector.cpp:236
-#: ../src/widgets/sp-color-icc-selector.cpp:237
-#: ../src/widgets/sp-color-scales.cpp:429
-#: ../src/widgets/sp-color-scales.cpp:430 ../src/widgets/toolbox.cpp:4296
-#: ../share/extensions/color_randomize.inx.h:5
-msgid "Saturation"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/modulate.cpp:43
-msgid "Brightness"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/modulate.cpp:49
-msgid ""
-"Adjust the amount of hue, saturation, and brightness in selected bitmap(s)"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/negate.cpp:35
-msgid "Negate"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/negate.cpp:42
-msgid "Negate (take inverse) selected bitmap(s)."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/normalize.cpp:35
-msgid "Normalize"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/normalize.cpp:42
-msgid ""
-"Normalize selected bitmap(s), expanding color range to the full possible "
-"range of color."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/oilPaint.cpp:36
-msgid "Oil Paint"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/oilPaint.cpp:44
-msgid "Stylize selected bitmap(s) so that they appear to be painted with oils."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/opacity.cpp:45
-msgid "Modify opacity channel(s) of selected bitmap(s)."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/raise.cpp:39
-msgid "Raise"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/raise.cpp:43
-msgid "Raised"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/raise.cpp:49
-msgid ""
-"Alter lightness the edges of selected bitmap(s) to create a raised "
-"appearance."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/reduceNoise.cpp:39
-msgid "Reduce Noise"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/reduceNoise.cpp:41
-#: ../share/extensions/lindenmayer.inx.h:26
-msgid "Order"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/reduceNoise.cpp:47
-msgid ""
-"Reduce noise in selected bitmap(s) using a noise peak elimination filter."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/sample.cpp:38
-msgid "Resample"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/sample.cpp:47
-msgid ""
-"Alter the resolution of selected image by resizing it to the given pixel size"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/shade.cpp:39
-msgid "Shade"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/shade.cpp:41
-#: ../src/ui/dialog/filter-effects-dialog.cpp:955
-msgid "Azimuth"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/shade.cpp:42
-#: ../src/ui/dialog/filter-effects-dialog.cpp:956
-msgid "Elevation"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/shade.cpp:43
-msgid "Colored Shading"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/shade.cpp:49
-msgid "Shade selected bitmap(s) simulating distant light source."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/sharpen.cpp:46
-msgid "Sharpen selected bitmap(s)."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/solarize.cpp:44
-msgid "Solarize selected bitmap(s), like overexposing photographic film."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/spread.cpp:36
-msgid "Dither"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/spread.cpp:44
-msgid ""
-"Randomly scatter pixels in selected bitmap(s), within the given radius of "
-"the original position"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/swirl.cpp:36
-msgid "Swirl"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/swirl.cpp:38
-#: ../share/extensions/grid_polar.inx.h:7
-msgid "Degrees"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/swirl.cpp:44
-msgid "Swirl selected bitmap(s) around center point."
-msgstr ""
-
-#. TRANSLATORS: see http://docs.gimp.org/en/gimp-tool-threshold.html
-#: ../src/extension/internal/bitmap/threshold.cpp:37
-#: ../src/extension/internal/bitmap/threshold.cpp:39
-#: ../src/extension/internal/bitmap/unsharpmask.cpp:45
-msgid "Threshold"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/threshold.cpp:45
-msgid "Threshold selected bitmap(s)."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/unsharpmask.cpp:40
-msgid "Unsharp Mask"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/unsharpmask.cpp:51
-msgid "Sharpen selected bitmap(s) using unsharp mask algorithms."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/wave.cpp:37
-msgid "Wave"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/wave.cpp:39
-msgid "Amplitude"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/wave.cpp:40
-msgid "Wavelength"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/wave.cpp:46
-msgid "Alter selected bitmap(s) along sine wave."
-msgstr ""
-
-#: ../src/extension/internal/bluredge.cpp:134
-msgid "Inset/Outset Halo"
-msgstr ""
-
-#: ../src/extension/internal/bluredge.cpp:136
-msgid "Width in px of the halo"
-msgstr ""
-
-#: ../src/extension/internal/bluredge.cpp:137
-msgid "Number of steps"
-msgstr ""
-
-#: ../src/extension/internal/bluredge.cpp:137
-msgid "Number of inset/outset copies of the object to make"
-msgstr ""
-
-#: ../src/extension/internal/bluredge.cpp:141
-#: ../share/extensions/extrude.inx.h:2 ../share/extensions/interp.inx.h:3
-#: ../share/extensions/motion.inx.h:2
-#: ../share/extensions/pathalongpath.inx.h:4
-#: ../share/extensions/pathscatter.inx.h:5
-msgid "Generate from Path"
-msgstr ""
-
-#: ../src/extension/internal/cairo-ps-out.cpp:274
-#: ../share/extensions/ps_input.inx.h:1
-msgid "PostScript"
-msgstr ""
-
-#: ../src/extension/internal/cairo-ps-out.cpp:276
-#: ../src/extension/internal/cairo-ps-out.cpp:313
-msgid "Restrict to PS level"
-msgstr ""
-
-#: ../src/extension/internal/cairo-ps-out.cpp:277
-#: ../src/extension/internal/cairo-ps-out.cpp:314
-msgid "PostScript level 3"
-msgstr ""
-
-#: ../src/extension/internal/cairo-ps-out.cpp:279
-#: ../src/extension/internal/cairo-ps-out.cpp:316
-msgid "PostScript level 2"
-msgstr ""
-
-#: ../src/extension/internal/cairo-ps-out.cpp:282
-#: ../src/extension/internal/cairo-ps-out.cpp:319
-#: ../src/extension/internal/cairo-renderer-pdf-out.cpp:219
-#: ../src/extension/internal/emf-win32-inout.cpp:2430
-msgid "Convert texts to paths"
-msgstr ""
-
-#: ../src/extension/internal/cairo-ps-out.cpp:283
-#: ../src/extension/internal/cairo-ps-out.cpp:320
-#: ../src/extension/internal/cairo-renderer-pdf-out.cpp:220
-msgid "Rasterize filter effects"
-msgstr ""
-
-#: ../src/extension/internal/cairo-ps-out.cpp:284
-#: ../src/extension/internal/cairo-ps-out.cpp:321
-#: ../src/extension/internal/cairo-renderer-pdf-out.cpp:221
-msgid "Resolution for rasterization (dpi)"
-msgstr ""
-
-#: ../src/extension/internal/cairo-ps-out.cpp:285
-#: ../src/extension/internal/cairo-ps-out.cpp:322
-#: ../src/extension/internal/cairo-renderer-pdf-out.cpp:222
-msgid "Export area is drawing"
-msgstr ""
-
-#: ../src/extension/internal/cairo-ps-out.cpp:286
-#: ../src/extension/internal/cairo-ps-out.cpp:323
-#: ../src/extension/internal/cairo-renderer-pdf-out.cpp:223
-msgid "Export area is page"
-msgstr ""
-
-#: ../src/extension/internal/cairo-ps-out.cpp:287
-#: ../src/extension/internal/cairo-ps-out.cpp:324
-#: ../src/extension/internal/cairo-renderer-pdf-out.cpp:224
-msgid "Limit export to the object with ID"
-msgstr ""
-
-#: ../src/extension/internal/cairo-ps-out.cpp:291
-#: ../share/extensions/ps_input.inx.h:2
-msgid "PostScript (*.ps)"
-msgstr ""
-
-#: ../src/extension/internal/cairo-ps-out.cpp:292
-msgid "PostScript File"
-msgstr ""
-
-#: ../src/extension/internal/cairo-ps-out.cpp:311
-#: ../share/extensions/eps_input.inx.h:2
-msgid "Encapsulated PostScript"
-msgstr ""
-
-#: ../src/extension/internal/cairo-ps-out.cpp:328
-#: ../share/extensions/eps_input.inx.h:3
-msgid "Encapsulated PostScript (*.eps)"
-msgstr ""
-
-#: ../src/extension/internal/cairo-ps-out.cpp:329
-msgid "Encapsulated PostScript File"
-msgstr ""
-
-#: ../src/extension/internal/cairo-renderer-pdf-out.cpp:216
-msgid "Restrict to PDF version"
-msgstr ""
-
-#: ../src/extension/internal/cairo-renderer-pdf-out.cpp:217
-msgid "PDF 1.4"
-msgstr ""
-
-#: ../src/extension/internal/emf-win32-inout.cpp:2400
-msgid "EMF Input"
-msgstr ""
-
-#: ../src/extension/internal/emf-win32-inout.cpp:2405
-msgid "Enhanced Metafiles (*.emf)"
-msgstr ""
-
-#: ../src/extension/internal/emf-win32-inout.cpp:2406
-msgid "Enhanced Metafiles"
-msgstr ""
-
-#: ../src/extension/internal/emf-win32-inout.cpp:2414
-msgid "WMF Input"
-msgstr ""
-
-#: ../src/extension/internal/emf-win32-inout.cpp:2419
-msgid "Windows Metafiles (*.wmf)"
-msgstr ""
-
-#: ../src/extension/internal/emf-win32-inout.cpp:2420
-msgid "Windows Metafiles"
-msgstr ""
-
-#: ../src/extension/internal/emf-win32-inout.cpp:2428
-msgid "EMF Output"
-msgstr ""
-
-#: ../src/extension/internal/emf-win32-inout.cpp:2434
-msgid "Enhanced Metafile (*.emf)"
-msgstr ""
-
-#: ../src/extension/internal/emf-win32-inout.cpp:2435
-msgid "Enhanced Metafile"
-msgstr ""
-
-#: ../src/extension/internal/filter/drop-shadow.h:35
-msgid "Drop Shadow"
-msgstr ""
-
-#: ../src/extension/internal/filter/drop-shadow.h:37
-#: ../src/extension/internal/filter/drop-shadow.h:92
-msgid "Blur radius, px"
-msgstr ""
-
-#: ../src/extension/internal/filter/drop-shadow.h:38
-#: ../src/extension/internal/filter/drop-shadow.h:93
-#: ../src/ui/widget/object-composite-settings.cpp:62
-#: ../src/ui/widget/selected-style.cpp:1033
-#: ../src/ui/widget/selected-style.cpp:1034
-msgid "Opacity, %"
-msgstr ""
-
-#: ../src/extension/internal/filter/drop-shadow.h:39
-#: ../src/extension/internal/filter/drop-shadow.h:94
-msgid "Horizontal offset, px"
-msgstr ""
-
-#: ../src/extension/internal/filter/drop-shadow.h:40
-#: ../src/extension/internal/filter/drop-shadow.h:95
-msgid "Vertical offset, px"
-msgstr ""
-
-#: ../src/extension/internal/filter/drop-shadow.h:44
-#: ../src/extension/internal/filter/drop-shadow.h:99
-#: ../src/extension/internal/filter/filter.cpp:214
-#: ../src/extension/internal/filter/filter-file.cpp:148
-#: ../src/extension/internal/filter/snow.h:38
-#: ../src/ui/dialog/inkscape-preferences.cpp:733
-msgid "Filters"
-msgstr ""
-
-#: ../src/extension/internal/filter/drop-shadow.h:48
-msgid "Black, blurred drop shadow"
-msgstr ""
-
-#: ../src/extension/internal/filter/drop-shadow.h:90
-msgid "Drop Glow"
-msgstr ""
-
-#: ../src/extension/internal/filter/drop-shadow.h:103
-msgid "White, blurred drop glow"
-msgstr ""
-
-#: ../src/extension/internal/filter/filter-file.cpp:32
-msgid "Bundled"
-msgstr ""
-
-#: ../src/extension/internal/filter/filter-file.cpp:33
-msgid "Personal"
-msgstr ""
-
-#: ../src/extension/internal/filter/filter-file.cpp:44
-msgid "Null external module directory name.  Filters will not be loaded."
-msgstr ""
-
-#: ../src/extension/internal/filter/snow.h:32
-msgid "Snow crest"
-msgstr ""
-
-#: ../src/extension/internal/filter/snow.h:34
-msgid "Drift Size"
-msgstr ""
-
-#: ../src/extension/internal/filter/snow.h:42
-msgid "Snow has fallen on object"
-msgstr ""
-
-#: ../src/extension/internal/gdkpixbuf-input.cpp:127
-#, c-format
-msgid "%s GDK pixbuf Input"
-msgstr ""
-
-#: ../src/extension/internal/gimpgrad.cpp:274
-msgid "GIMP Gradients"
-msgstr ""
-
-#: ../src/extension/internal/gimpgrad.cpp:279
-msgid "GIMP Gradient (*.ggr)"
-msgstr ""
-
-#: ../src/extension/internal/gimpgrad.cpp:280
-msgid "Gradients used in GIMP"
-msgstr ""
-
-#: ../src/extension/internal/grid.cpp:192 ../src/ui/widget/panel.cpp:112
-msgid "Grid"
-msgstr ""
-
-#: ../src/extension/internal/grid.cpp:194
-msgid "Line Width"
-msgstr ""
-
-#: ../src/extension/internal/grid.cpp:195
-msgid "Horizontal Spacing"
-msgstr ""
-
-#: ../src/extension/internal/grid.cpp:196
-msgid "Vertical Spacing"
-msgstr ""
-
-#: ../src/extension/internal/grid.cpp:197
-msgid "Horizontal Offset"
-msgstr ""
-
-#: ../src/extension/internal/grid.cpp:198
-msgid "Vertical Offset"
-msgstr ""
-
-#: ../src/extension/internal/grid.cpp:202
-#: ../share/extensions/draw_from_triangle.inx.h:30
-#: ../share/extensions/eqtexsvg.inx.h:3
-#: ../share/extensions/foldablebox.inx.h:6
-#: ../share/extensions/funcplot.inx.h:13 ../share/extensions/gears.inx.h:5
-#: ../share/extensions/grid_cartesian.inx.h:15
-#: ../share/extensions/grid_polar.inx.h:18
-#: ../share/extensions/guides_creator.inx.h:17
-#: ../share/extensions/lindenmayer.inx.h:31
-#: ../share/extensions/param_curves.inx.h:9
-#: ../share/extensions/perfectboundcover.inx.h:17
-#: ../share/extensions/polyhedron_3d.inx.h:31
-#: ../share/extensions/printing-marks.inx.h:14
-#: ../share/extensions/render_alphabetsoup.inx.h:3
-#: ../share/extensions/render_barcode.inx.h:5
-#: ../share/extensions/rtree.inx.h:4 ../share/extensions/spirograph.inx.h:6
-#: ../share/extensions/svgcalendar.inx.h:22
-#: ../share/extensions/triangle.inx.h:10
-msgid "Render"
-msgstr ""
-
-#: ../src/extension/internal/grid.cpp:204
-msgid "Draw a path which is a grid"
-msgstr ""
-
-#: ../src/extension/internal/javafx-out.cpp:965
-msgid "JavaFX Output"
-msgstr ""
-
-#: ../src/extension/internal/javafx-out.cpp:970
-msgid "JavaFX (*.fx)"
-msgstr ""
-
-#: ../src/extension/internal/javafx-out.cpp:971
-msgid "JavaFX Raytracer File"
-msgstr ""
-
-#: ../src/extension/internal/latex-pstricks.cpp:337
-msgid "LaTeX Print"
-msgstr ""
-
-#: ../src/extension/internal/latex-pstricks-out.cpp:105
-msgid "LaTeX Output"
-msgstr ""
-
-#: ../src/extension/internal/latex-pstricks-out.cpp:110
-msgid "LaTeX With PSTricks macros (*.tex)"
-msgstr ""
-
-#: ../src/extension/internal/latex-pstricks-out.cpp:111
-msgid "LaTeX PSTricks File"
-msgstr ""
-
-#: ../src/extension/internal/odf.cpp:2417
-msgid "OpenDocument Drawing Output"
-msgstr ""
-
-#: ../src/extension/internal/odf.cpp:2422
-msgid "OpenDocument drawing (*.odg)"
-msgstr ""
-
-#: ../src/extension/internal/odf.cpp:2423
-msgid "OpenDocument drawing file"
-msgstr ""
-
-#. TRANSLATORS: The following are document crop settings for PDF import
-#. more info: http://www.acrobatusers.com/tech_corners/javascript_corner/tips/2006/page_bounds/
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:56
-msgid "media box"
-msgstr ""
-
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:57
-msgid "crop box"
-msgstr ""
-
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:58
-msgid "trim box"
-msgstr ""
-
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:59
-msgid "bleed box"
-msgstr ""
-
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:60
-msgid "art box"
-msgstr ""
-
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:72
-msgid "Select page:"
-msgstr ""
-
-#. Display total number of pages
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:86
-#, c-format
-msgid "out of %i"
-msgstr ""
-
-#. Crop settings
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:92
-msgid "Clip to:"
-msgstr ""
-
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:104
-msgid "Page settings"
-msgstr ""
-
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:106
-msgid "Precision of approximating gradient meshes:"
-msgstr ""
-
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:107
-msgid ""
-"<b>Note</b>: setting the precision too high may result in a large SVG file "
-"and slow performance."
-msgstr ""
-
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:112
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:393
-msgid "rough"
-msgstr ""
-
-#. Text options
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:116
-msgid "Text handling:"
-msgstr ""
-
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:118
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:119
-msgid "Import text as text"
-msgstr ""
-
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:120
-msgid "Replace PDF fonts by closest-named installed fonts"
-msgstr ""
-
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:123
-msgid "Embed images"
-msgstr ""
-
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:126
-msgid "Import settings"
-msgstr ""
-
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:248
-msgid "PDF Import Settings"
-msgstr ""
-
-#. TRANSLATORS: only translate "string" in "context|string".
-#. For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:396
-msgid "pdfinput|medium"
-msgstr ""
-
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:397
-msgid "fine"
-msgstr ""
-
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:398
-msgid "very fine"
-msgstr ""
-
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:753
-msgid "PDF Input"
-msgstr ""
-
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:758
-msgid "Adobe PDF (*.pdf)"
-msgstr ""
-
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:759
-msgid "Adobe Portable Document Format"
-msgstr ""
-
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:766
-msgid "AI Input"
-msgstr ""
-
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:771
-msgid "Adobe Illustrator 9.0 and above (*.ai)"
-msgstr ""
-
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:772
-msgid "Open files saved in Adobe Illustrator 9.0 and newer versions"
-msgstr ""
-
-#: ../src/extension/internal/pov-out.cpp:700
-msgid "PovRay Output"
-msgstr ""
-
-#: ../src/extension/internal/pov-out.cpp:705
-msgid "PovRay (*.pov) (paths and shapes only)"
-msgstr ""
-
-#: ../src/extension/internal/pov-out.cpp:706
-msgid "PovRay Raytracer File"
-msgstr ""
-
-#: ../src/extension/internal/svg.cpp:55
-msgid "SVG Input"
-msgstr ""
-
-#: ../src/extension/internal/svg.cpp:60
-msgid "Scalable Vector Graphic (*.svg)"
-msgstr ""
-
-#: ../src/extension/internal/svg.cpp:61
-msgid "Inkscape native file format and W3C standard"
-msgstr ""
-
-#: ../src/extension/internal/svg.cpp:69
-msgid "SVG Output Inkscape"
-msgstr ""
-
-#: ../src/extension/internal/svg.cpp:74
-msgid "Inkscape SVG (*.svg)"
-msgstr ""
-
-#: ../src/extension/internal/svg.cpp:75
-msgid "SVG format with Inkscape extensions"
-msgstr ""
-
-#: ../src/extension/internal/svg.cpp:83
-msgid "SVG Output"
-msgstr ""
-
-#: ../src/extension/internal/svg.cpp:88
-msgid "Plain SVG (*.svg)"
-msgstr ""
-
-#: ../src/extension/internal/svg.cpp:89
-msgid "Scalable Vector Graphics format as defined by the W3C"
-msgstr ""
-
-#: ../src/extension/internal/svgz.cpp:47
-msgid "SVGZ Input"
-msgstr ""
-
-#: ../src/extension/internal/svgz.cpp:53 ../src/extension/internal/svgz.cpp:67
-msgid "Compressed Inkscape SVG (*.svgz)"
-msgstr ""
-
-#: ../src/extension/internal/svgz.cpp:54
-msgid "SVG file format compressed with GZip"
-msgstr ""
-
-#: ../src/extension/internal/svgz.cpp:62 ../src/extension/internal/svgz.cpp:76
-msgid "SVGZ Output"
-msgstr ""
-
-#: ../src/extension/internal/svgz.cpp:68
-msgid "Inkscape's native file format compressed with GZip"
-msgstr ""
-
-#: ../src/extension/internal/svgz.cpp:81
-msgid "Compressed plain SVG (*.svgz)"
-msgstr ""
-
-#: ../src/extension/internal/svgz.cpp:82
-msgid "Scalable Vector Graphics format compressed with GZip"
-msgstr ""
-
-#: ../src/extension/internal/win32.cpp:485
-msgid "Windows 32-bit Print"
-msgstr ""
-
-#: ../src/extension/internal/wpg-input.cpp:102
-msgid "WPG Input"
-msgstr ""
-
-#: ../src/extension/internal/wpg-input.cpp:107
-msgid "WordPerfect Graphics (*.wpg)"
-msgstr ""
-
-#: ../src/extension/internal/wpg-input.cpp:108
-msgid "Vector graphics format used by Corel WordPerfect"
-msgstr ""
-
-#: ../src/extension/prefdialog.cpp:236
-msgid "Live preview"
-msgstr ""
-
-#: ../src/extension/prefdialog.cpp:236
-msgid "Is the effect previewed live on canvas?"
-msgstr ""
-
-#. We can't call sp_ui_error_dialog because we may be
-#. running from the console, in which case calling sp_ui
-#. routines will cause a segfault.  See bug 1000350 - bryce
-#. sp_ui_error_dialog(_("Format autodetect failed. The file is being opened as SVG."));
-#: ../src/extension/system.cpp:107
-msgid "Format autodetect failed. The file is being opened as SVG."
-msgstr ""
-
-#: ../src/file.cpp:147
-msgid "default.svg"
-msgstr ""
-
-#: ../src/file.cpp:265 ../src/file.cpp:1071
-#, c-format
-msgid "Failed to load the requested file %s"
-msgstr ""
-
-#: ../src/file.cpp:290
-msgid "Document not saved yet.  Cannot revert."
-msgstr ""
-
-#: ../src/file.cpp:296
-#, c-format
-msgid "Changes will be lost!  Are you sure you want to reload document %s?"
-msgstr ""
-
-#: ../src/file.cpp:325
-msgid "Document reverted."
-msgstr ""
-
-#: ../src/file.cpp:327
-msgid "Document not reverted."
-msgstr ""
-
-#: ../src/file.cpp:477
-msgid "Select file to open"
-msgstr ""
-
-#: ../src/file.cpp:564
-msgid "Vacuum &lt;defs&gt;"
-msgstr ""
-
-#: ../src/file.cpp:569
-#, c-format
-msgid "Removed <b>%i</b> unused definition in &lt;defs&gt;."
-msgid_plural "Removed <b>%i</b> unused definitions in &lt;defs&gt;."
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../src/file.cpp:574
-msgid "No unused definitions in &lt;defs&gt;."
-msgstr ""
-
-#: ../src/file.cpp:605
-#, c-format
-msgid ""
-"No Inkscape extension found to save document (%s).  This may have been "
-"caused by an unknown filename extension."
-msgstr ""
-
-#: ../src/file.cpp:606 ../src/file.cpp:614 ../src/file.cpp:622
-#: ../src/file.cpp:628 ../src/file.cpp:633
-msgid "Document not saved."
-msgstr ""
-
-#: ../src/file.cpp:613
-#, c-format
-msgid ""
-"File %s is write protected. Please remove write protection and try again."
-msgstr ""
-
-#: ../src/file.cpp:621
-#, c-format
-msgid "File %s could not be saved."
-msgstr ""
-
-#: ../src/file.cpp:638
-msgid "Document saved."
-msgstr ""
-
-#. We are saving for the first time; create a unique default filename
-#: ../src/file.cpp:770 ../src/file.cpp:1208
-#, c-format
-msgid "drawing%s"
-msgstr ""
-
-#: ../src/file.cpp:776
-#, c-format
-msgid "drawing-%d%s"
-msgstr ""
-
-#: ../src/file.cpp:780
-#, c-format
-msgid "%s"
-msgstr ""
-
-#: ../src/file.cpp:795
-msgid "Select file to save a copy to"
-msgstr ""
-
-#: ../src/file.cpp:797
-msgid "Select file to save to"
-msgstr ""
-
-#: ../src/file.cpp:892
-msgid "No changes need to be saved."
-msgstr ""
-
-#: ../src/file.cpp:909
-msgid "Saving document..."
-msgstr ""
-
-#: ../src/file.cpp:1068
-msgid "Import"
-msgstr ""
-
-#: ../src/file.cpp:1118
-msgid "Select file to import"
-msgstr ""
-
-#: ../src/file.cpp:1230
-msgid "Select file to export to"
-msgstr ""
-
-#: ../src/file.cpp:1473 ../src/verbs.cpp:2265
-msgid "Import From Open Clip Art Library"
-msgstr ""
-
-#: ../src/filter-enums.cpp:20
-msgid "Blend"
-msgstr ""
-
-#: ../src/filter-enums.cpp:21
-msgid "Color Matrix"
-msgstr ""
-
-#: ../src/filter-enums.cpp:22
-msgid "Component Transfer"
-msgstr ""
-
-#: ../src/filter-enums.cpp:23
-msgid "Composite"
-msgstr ""
-
-#: ../src/filter-enums.cpp:24
-msgid "Convolve Matrix"
-msgstr ""
-
-#: ../src/filter-enums.cpp:25
-msgid "Diffuse Lighting"
-msgstr ""
-
-#: ../src/filter-enums.cpp:26
-msgid "Displacement Map"
-msgstr ""
-
-#: ../src/filter-enums.cpp:27
-msgid "Flood"
-msgstr ""
-
-#: ../src/filter-enums.cpp:29 ../src/selection-describer.cpp:55
-msgid "Image"
-msgstr ""
-
-#: ../src/filter-enums.cpp:30
-msgid "Merge"
-msgstr ""
-
-#: ../src/filter-enums.cpp:33
-msgid "Specular Lighting"
-msgstr ""
-
-#: ../src/filter-enums.cpp:34
-msgid "Tile"
-msgstr ""
-
-#: ../src/filter-enums.cpp:35 ../src/filter-enums.cpp:119
-msgid "Turbulence"
-msgstr ""
-
-#: ../src/filter-enums.cpp:40
-msgid "Source Graphic"
-msgstr ""
-
-#: ../src/filter-enums.cpp:41
-msgid "Source Alpha"
-msgstr ""
-
-#: ../src/filter-enums.cpp:42
-msgid "Background Image"
-msgstr ""
-
-#: ../src/filter-enums.cpp:43
-msgid "Background Alpha"
-msgstr ""
-
-#: ../src/filter-enums.cpp:44
-msgid "Fill Paint"
-msgstr ""
-
-#: ../src/filter-enums.cpp:45
-msgid "Stroke Paint"
-msgstr ""
-
-#. TRANSLATORS: only translate "string" in "context|string".
-#. For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS
-#: ../src/filter-enums.cpp:53
-msgid "filterBlendMode|Normal"
-msgstr ""
-
-#: ../src/filter-enums.cpp:54
-msgid "Multiply"
-msgstr ""
-
-#: ../src/filter-enums.cpp:55
-msgid "Screen"
-msgstr ""
-
-#: ../src/filter-enums.cpp:56
-msgid "Darken"
-msgstr ""
-
-#: ../src/filter-enums.cpp:57
-msgid "Lighten"
-msgstr ""
-
-#: ../src/filter-enums.cpp:63
-msgid "Matrix"
-msgstr ""
-
-#: ../src/filter-enums.cpp:64
-msgid "Saturate"
-msgstr ""
-
-#: ../src/filter-enums.cpp:65
-msgid "Hue Rotate"
-msgstr ""
-
-#: ../src/filter-enums.cpp:66
-msgid "Luminance to Alpha"
-msgstr ""
-
-#. File
-#: ../src/filter-enums.cpp:72 ../src/verbs.cpp:2242
-msgid "Default"
-msgstr ""
-
-#: ../src/filter-enums.cpp:73
-msgid "Over"
-msgstr ""
-
-#: ../src/filter-enums.cpp:74
-msgid "In"
-msgstr ""
-
-#: ../src/filter-enums.cpp:75
-msgid "Out"
-msgstr ""
-
-#: ../src/filter-enums.cpp:76
-msgid "Atop"
-msgstr ""
-
-#: ../src/filter-enums.cpp:77
-msgid "XOR"
-msgstr ""
-
-#: ../src/filter-enums.cpp:78
-msgid "Arithmetic"
-msgstr ""
-
-#: ../src/filter-enums.cpp:84
-msgid "Identity"
-msgstr ""
-
-#: ../src/filter-enums.cpp:85
-msgid "Table"
-msgstr ""
-
-#: ../src/filter-enums.cpp:86
-msgid "Discrete"
-msgstr ""
-
-#: ../src/filter-enums.cpp:87
-msgid "Linear"
-msgstr ""
-
-#: ../src/filter-enums.cpp:88
-msgid "Gamma"
-msgstr ""
-
-#: ../src/filter-enums.cpp:94 ../src/selection-chemistry.cpp:316
-#: ../src/widgets/gradient-selector.cpp:139
-msgid "Duplicate"
-msgstr ""
-
-#: ../src/filter-enums.cpp:95
-msgid "Wrap"
-msgstr ""
-
-#: ../src/filter-enums.cpp:96 ../src/flood-context.cpp:264
-#: ../src/live_effects/lpe-ruler.cpp:34
-#: ../src/ui/dialog/document-properties.cpp:327
-#: ../src/ui/dialog/filter-effects-dialog.cpp:468
-#: ../src/ui/dialog/inkscape-preferences.cpp:259
-#: ../src/ui/dialog/inkscape-preferences.cpp:422
-#: ../src/ui/dialog/inkscape-preferences.cpp:554
-#: ../src/ui/dialog/inkscape-preferences.cpp:1151
-#: ../src/ui/dialog/inkscape-preferences.cpp:1216 ../src/verbs.cpp:2239
-#: ../src/widgets/stroke-style.cpp:765 ../src/widgets/toolbox.cpp:3887
-#: ../share/extensions/grid_polar.inx.h:16
-#: ../share/extensions/guides_creator.inx.h:15
-#: ../share/extensions/scour.inx.h:7
-msgid "None"
-msgstr ""
-
-#: ../src/filter-enums.cpp:102 ../src/flood-context.cpp:247
-#: ../src/widgets/sp-color-icc-selector.cpp:234
-#: ../src/widgets/sp-color-scales.cpp:400
-#: ../src/widgets/sp-color-scales.cpp:401
-msgid "Red"
-msgstr ""
-
-#: ../src/filter-enums.cpp:103 ../src/flood-context.cpp:248
-#: ../src/widgets/sp-color-icc-selector.cpp:234
-#: ../src/widgets/sp-color-scales.cpp:403
-#: ../src/widgets/sp-color-scales.cpp:404
-msgid "Green"
-msgstr ""
-
-#: ../src/filter-enums.cpp:104 ../src/flood-context.cpp:249
-#: ../src/widgets/sp-color-icc-selector.cpp:234
-#: ../src/widgets/sp-color-scales.cpp:406
-#: ../src/widgets/sp-color-scales.cpp:407
-msgid "Blue"
-msgstr ""
-
-#: ../src/filter-enums.cpp:105 ../src/flood-context.cpp:253
-msgid "Alpha"
-msgstr ""
-
-#: ../src/filter-enums.cpp:111
-msgid "Erode"
-msgstr ""
-
-#: ../src/filter-enums.cpp:112
-msgid "Dilate"
-msgstr ""
-
-#: ../src/filter-enums.cpp:118
-msgid "Fractal Noise"
-msgstr ""
-
-#: ../src/filter-enums.cpp:125
-msgid "Distant Light"
-msgstr ""
-
-#: ../src/filter-enums.cpp:126
-msgid "Point Light"
-msgstr ""
-
-#: ../src/filter-enums.cpp:127
-msgid "Spot Light"
-msgstr ""
-
-#: ../src/flood-context.cpp:246
-msgid "Visible Colors"
-msgstr ""
-
-#: ../src/flood-context.cpp:252 ../src/widgets/sp-color-icc-selector.cpp:237
-#: ../src/widgets/sp-color-scales.cpp:432
-#: ../src/widgets/sp-color-scales.cpp:433 ../src/widgets/toolbox.cpp:4311
-#: ../share/extensions/color_randomize.inx.h:3
-msgid "Lightness"
-msgstr ""
-
-#: ../src/flood-context.cpp:265 ../src/ui/dialog/inkscape-preferences.cpp:1072
-msgid "Small"
-msgstr ""
-
-#: ../src/flood-context.cpp:266
-msgid "Medium"
-msgstr ""
-
-#: ../src/flood-context.cpp:267 ../src/ui/dialog/inkscape-preferences.cpp:1072
-msgid "Large"
-msgstr ""
-
-#: ../src/flood-context.cpp:469
-msgid "<b>Too much inset</b>, the result is empty."
-msgstr ""
-
-#: ../src/flood-context.cpp:509
-#, c-format
-msgid ""
-"Area filled, path with <b>%d</b> node created and unioned with selection."
-msgid_plural ""
-"Area filled, path with <b>%d</b> nodes created and unioned with selection."
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../src/flood-context.cpp:513
-#, c-format
-msgid "Area filled, path with <b>%d</b> node created."
-msgid_plural "Area filled, path with <b>%d</b> nodes created."
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../src/flood-context.cpp:785 ../src/flood-context.cpp:1099
-msgid "<b>Area is not bounded</b>, cannot fill."
-msgstr ""
-
-#: ../src/flood-context.cpp:1104
-msgid ""
-"<b>Only the visible part of the bounded area was filled.</b> If you want to "
-"fill all of the area, undo, zoom out, and fill again."
-msgstr ""
-
-#: ../src/flood-context.cpp:1122 ../src/flood-context.cpp:1282
-msgid "Fill bounded area"
-msgstr ""
-
-#: ../src/flood-context.cpp:1142
-msgid "Set style on object"
-msgstr ""
-
-#: ../src/flood-context.cpp:1201
-msgid "<b>Draw over</b> areas to add to fill, hold <b>Alt</b> for touch fill"
-msgstr ""
-
-#: ../src/gradient-context.cpp:132 ../src/gradient-drag.cpp:75
-msgid "Linear gradient <b>start</b>"
-msgstr ""
-
-#. POINT_LG_BEGIN
-#: ../src/gradient-context.cpp:133 ../src/gradient-drag.cpp:76
-msgid "Linear gradient <b>end</b>"
-msgstr ""
-
-#: ../src/gradient-context.cpp:134 ../src/gradient-drag.cpp:77
-msgid "Linear gradient <b>mid stop</b>"
-msgstr ""
-
-#: ../src/gradient-context.cpp:135 ../src/gradient-drag.cpp:78
-msgid "Radial gradient <b>center</b>"
-msgstr ""
-
-#: ../src/gradient-context.cpp:136 ../src/gradient-context.cpp:137
-#: ../src/gradient-drag.cpp:79 ../src/gradient-drag.cpp:80
-msgid "Radial gradient <b>radius</b>"
-msgstr ""
-
-#: ../src/gradient-context.cpp:138 ../src/gradient-drag.cpp:81
-msgid "Radial gradient <b>focus</b>"
-msgstr ""
-
-#. POINT_RG_FOCUS
-#: ../src/gradient-context.cpp:139 ../src/gradient-context.cpp:140
-#: ../src/gradient-drag.cpp:82 ../src/gradient-drag.cpp:83
-msgid "Radial gradient <b>mid stop</b>"
-msgstr ""
-
-#. TRANSLATORS: %s will be substituted with the point name (see previous messages); This is part of a compound message
-#: ../src/gradient-context.cpp:165
-#, c-format
-msgid "%s selected"
-msgstr ""
-
-#. TRANSLATORS: Mind the space in front. This is part of a compound message
-#: ../src/gradient-context.cpp:167 ../src/gradient-context.cpp:176
-#, c-format
-msgid " out of %d gradient handle"
-msgid_plural " out of %d gradient handles"
-msgstr[0] ""
-msgstr[1] ""
-
-#. TRANSLATORS: Mind the space in front. (Refers to gradient handles selected). This is part of a compound message
-#: ../src/gradient-context.cpp:168 ../src/gradient-context.cpp:177
-#: ../src/gradient-context.cpp:184
-#, c-format
-msgid " on %d selected object"
-msgid_plural " on %d selected objects"
-msgstr[0] ""
-msgstr[1] ""
-
-#. TRANSLATORS: This is a part of a compound message (out of two more indicating: grandint handle count & object count)
-#: ../src/gradient-context.cpp:174
-#, c-format
-msgid ""
-"One handle merging %d stop (drag with <b>Shift</b> to separate) selected"
-msgid_plural ""
-"One handle merging %d stops (drag with <b>Shift</b> to separate) selected"
-msgstr[0] ""
-msgstr[1] ""
-
-#. TRANSLATORS: The plural refers to number of selected gradient handles. This is part of a compound message (part two indicates selected object count)
-#: ../src/gradient-context.cpp:182
-#, c-format
-msgid "<b>%d</b> gradient handle selected out of %d"
-msgid_plural "<b>%d</b> gradient handles selected out of %d"
-msgstr[0] ""
-msgstr[1] ""
-
-#. TRANSLATORS: The plural refers to number of selected objects
-#: ../src/gradient-context.cpp:189
-#, c-format
-msgid "<b>No</b> gradient handles selected out of %d on %d selected object"
-msgid_plural ""
-"<b>No</b> gradient handles selected out of %d on %d selected objects"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../src/gradient-context.cpp:389 ../src/gradient-context.cpp:482
-#: ../src/widgets/gradient-vector.cpp:744
-msgid "Add gradient stop"
-msgstr ""
-
-#: ../src/gradient-context.cpp:457
-msgid "Simplify gradient"
-msgstr ""
-
-#: ../src/gradient-context.cpp:534
-msgid "Create default gradient"
-msgstr ""
-
-#: ../src/gradient-context.cpp:588
-msgid "<b>Draw around</b> handles to select them"
-msgstr ""
-
-#: ../src/gradient-context.cpp:686
-msgid "<b>Ctrl</b>: snap gradient angle"
-msgstr ""
-
-#: ../src/gradient-context.cpp:687
-msgid "<b>Shift</b>: draw gradient around the starting point"
-msgstr ""
-
-#: ../src/gradient-context.cpp:807
-msgid "Invert gradient"
-msgstr ""
-
-#: ../src/gradient-context.cpp:924
-#, c-format
-msgid "<b>Gradient</b> for %d object; with <b>Ctrl</b> to snap angle"
-msgid_plural "<b>Gradient</b> for %d objects; with <b>Ctrl</b> to snap angle"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../src/gradient-context.cpp:928
-msgid "Select <b>objects</b> on which to create gradient."
-msgstr ""
-
-#: ../src/gradient-drag.cpp:591
-msgid "Merge gradient handles"
-msgstr ""
-
-#: ../src/gradient-drag.cpp:912
-msgid "Move gradient handle"
-msgstr ""
-
-#: ../src/gradient-drag.cpp:965 ../src/widgets/gradient-vector.cpp:776
-msgid "Delete gradient stop"
-msgstr ""
-
-#: ../src/gradient-drag.cpp:1129
-#, c-format
-msgid ""
-"%s %d for: %s%s; drag with <b>Ctrl</b> to snap offset; click with <b>Ctrl"
-"+Alt</b> to delete stop"
-msgstr ""
-
-#: ../src/gradient-drag.cpp:1133 ../src/gradient-drag.cpp:1140
-msgid " (stroke)"
-msgstr ""
-
-#: ../src/gradient-drag.cpp:1137
-#, c-format
-msgid ""
-"%s for: %s%s; drag with <b>Ctrl</b> to snap angle, with <b>Ctrl+Alt</b> to "
-"preserve angle, with <b>Ctrl+Shift</b> to scale around center"
-msgstr ""
-
-#: ../src/gradient-drag.cpp:1145
-#, c-format
-msgid ""
-"Radial gradient <b>center</b> and <b>focus</b>; drag with <b>Shift</b> to "
-"separate focus"
-msgstr ""
-
-#: ../src/gradient-drag.cpp:1148
-#, c-format
-msgid ""
-"Gradient point shared by <b>%d</b> gradient; drag with <b>Shift</b> to "
-"separate"
-msgid_plural ""
-"Gradient point shared by <b>%d</b> gradients; drag with <b>Shift</b> to "
-"separate"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../src/gradient-drag.cpp:1823
-msgid "Move gradient handle(s)"
-msgstr ""
-
-#: ../src/gradient-drag.cpp:1859
-msgid "Move gradient mid stop(s)"
-msgstr ""
-
-#: ../src/gradient-drag.cpp:2147
-msgid "Delete gradient stop(s)"
-msgstr ""
-
-#: ../src/helper/units.cpp:37 ../src/live_effects/lpe-ruler.cpp:43
-#: ../share/extensions/foldablebox.inx.h:8
-#: ../share/extensions/interp_att_g.inx.h:24
-#: ../share/extensions/printing-marks.inx.h:19
-msgid "Unit"
-msgstr ""
-
-#. Add the units menu.
-#: ../src/helper/units.cpp:37 ../src/widgets/select-toolbar.cpp:504
-#: ../src/widgets/toolbox.cpp:1504 ../src/widgets/toolbox.cpp:3156
-#: ../src/widgets/toolbox.cpp:5660 ../src/widgets/toolbox.cpp:7203
-msgid "Units"
-msgstr ""
-
-#: ../src/helper/units.cpp:38
-msgid "Point"
-msgstr ""
-
-#: ../src/helper/units.cpp:38 ../src/ui/widget/selected-style.cpp:293
-msgid "pt"
-msgstr ""
-
-#: ../src/helper/units.cpp:38 ../share/extensions/perfectboundcover.inx.h:15
-msgid "Points"
-msgstr ""
-
-#: ../src/helper/units.cpp:38
-msgid "Pt"
-msgstr ""
-
-#: ../src/helper/units.cpp:39
-msgid "Pica"
-msgstr ""
-
-#: ../src/helper/units.cpp:39
-msgid "pc"
-msgstr ""
-
-#: ../src/helper/units.cpp:39
-msgid "Picas"
-msgstr ""
-
-#: ../src/helper/units.cpp:39
-msgid "Pc"
-msgstr ""
-
-#: ../src/helper/units.cpp:40
-msgid "Pixel"
-msgstr ""
-
-#: ../src/helper/units.cpp:40 ../src/ui/dialog/inkscape-preferences.cpp:246
-#: ../src/ui/dialog/inkscape-preferences.cpp:250
-#: ../src/ui/dialog/inkscape-preferences.cpp:253
-#: ../src/ui/widget/selected-style.cpp:289
-msgid "px"
-msgstr ""
-
-#: ../src/helper/units.cpp:40
-msgid "Pixels"
-msgstr ""
-
-#: ../src/helper/units.cpp:40
-msgid "Px"
-msgstr ""
-
-#. You can add new elements from this point forward
-#: ../src/helper/units.cpp:42 ../share/extensions/straightseg.inx.h:3
-msgid "Percent"
-msgstr ""
-
-#: ../src/helper/units.cpp:42 ../src/ui/dialog/inkscape-preferences.cpp:266
-msgid "%"
-msgstr ""
-
-#: ../src/helper/units.cpp:42
-msgid "Percents"
-msgstr ""
-
-#: ../src/helper/units.cpp:43
-msgid "Millimeter"
-msgstr ""
-
-#: ../src/helper/units.cpp:43 ../src/ui/widget/selected-style.cpp:297
-msgid "mm"
-msgstr ""
-
-#: ../src/helper/units.cpp:43
-msgid "Millimeters"
-msgstr ""
-
-#: ../src/helper/units.cpp:44
-msgid "Centimeter"
-msgstr ""
-
-#: ../src/helper/units.cpp:44
-msgid "cm"
-msgstr ""
-
-#: ../src/helper/units.cpp:44
-msgid "Centimeters"
-msgstr ""
-
-#: ../src/helper/units.cpp:45
-msgid "Meter"
-msgstr ""
-
-#: ../src/helper/units.cpp:45
-msgid "m"
-msgstr ""
-
-#: ../src/helper/units.cpp:45
-msgid "Meters"
-msgstr ""
-
-#. no svg_unit
-#: ../src/helper/units.cpp:46
-msgid "Inch"
-msgstr ""
-
-#: ../src/helper/units.cpp:46
-msgid "in"
-msgstr ""
-
-#: ../src/helper/units.cpp:46
-msgid "Inches"
-msgstr ""
-
-#: ../src/helper/units.cpp:47
-msgid "Foot"
-msgstr ""
-
-#: ../src/helper/units.cpp:47
-msgid "ft"
-msgstr ""
-
-#: ../src/helper/units.cpp:47
-msgid "Feet"
-msgstr ""
-
-#. Volatiles do not have default, so there are none here
-#. TRANSLATORS: for info, see http://www.w3.org/TR/REC-CSS2/syndata.html#length-units
-#: ../src/helper/units.cpp:50
-msgid "Em square"
-msgstr ""
-
-#: ../src/helper/units.cpp:50
-msgid "em"
-msgstr ""
-
-#: ../src/helper/units.cpp:50
-msgid "Em squares"
-msgstr ""
-
-#. TRANSLATORS: for info, see http://www.w3.org/TR/REC-CSS2/syndata.html#length-units
-#: ../src/helper/units.cpp:52
-msgid "Ex square"
-msgstr ""
-
-#: ../src/helper/units.cpp:52
-msgid "ex"
-msgstr ""
-
-#: ../src/helper/units.cpp:52
-msgid "Ex squares"
-msgstr ""
-
-#: ../src/inkscape.cpp:328
-msgid "Autosaving documents..."
-msgstr ""
-
-#: ../src/inkscape.cpp:399
-msgid "Autosave failed! Could not find inkscape extension to save document."
-msgstr ""
-
-#: ../src/inkscape.cpp:402 ../src/inkscape.cpp:409
-#, c-format
-msgid "Autosave failed! File %s could not be saved."
-msgstr ""
-
-#: ../src/inkscape.cpp:424
-msgid "Autosave complete."
-msgstr ""
-
-#: ../src/inkscape.cpp:661
-msgid "Untitled document"
-msgstr ""
-
-#. Show nice dialog box
-#: ../src/inkscape.cpp:691
-msgid "Inkscape encountered an internal error and will close now.\n"
-msgstr ""
-
-#: ../src/inkscape.cpp:692
-msgid ""
-"Automatic backups of unsaved documents were done to the following "
-"locations:\n"
-msgstr ""
-
-#: ../src/inkscape.cpp:693
-msgid "Automatic backup of the following documents failed:\n"
-msgstr ""
-
-#. sp_ui_menu_append_check_item_from_verb(m, view, _("_Menu"), _("Show or hide the menu bar"), "menu",
-#. checkitem_toggled, checkitem_update, 0);
-#: ../src/interface.cpp:868
-msgid "Commands Bar"
-msgstr ""
-
-#: ../src/interface.cpp:868
-msgid "Show or hide the Commands bar (under the menu)"
-msgstr ""
-
-#: ../src/interface.cpp:870
-msgid "Snap Controls Bar"
-msgstr ""
-
-#: ../src/interface.cpp:870
-msgid "Show or hide the snapping controls"
-msgstr ""
-
-#: ../src/interface.cpp:872
-msgid "Tool Controls Bar"
-msgstr ""
-
-#: ../src/interface.cpp:872
-msgid "Show or hide the Tool Controls bar"
-msgstr ""
-
-#: ../src/interface.cpp:874
-msgid "_Toolbox"
-msgstr ""
-
-#: ../src/interface.cpp:874
-msgid "Show or hide the main toolbox (on the left)"
-msgstr ""
-
-#: ../src/interface.cpp:880
-msgid "_Palette"
-msgstr ""
-
-#: ../src/interface.cpp:880
-msgid "Show or hide the color palette"
-msgstr ""
-
-#: ../src/interface.cpp:882
-msgid "_Statusbar"
-msgstr ""
-
-#: ../src/interface.cpp:882
-msgid "Show or hide the statusbar (at the bottom of the window)"
-msgstr ""
-
-#: ../src/interface.cpp:956
-#, c-format
-msgid "Verb \"%s\" Unknown"
-msgstr ""
-
-#: ../src/interface.cpp:995
-msgid "Open _Recent"
-msgstr ""
-
-#. TRANSLATORS: #%s is the id of the group e.g. <g id="#g7">, not a number.
-#: ../src/interface.cpp:1096
-#, c-format
-msgid "Enter group #%s"
-msgstr ""
-
-#: ../src/interface.cpp:1107
-msgid "Go to parent"
-msgstr ""
-
-#: ../src/interface.cpp:1198 ../src/interface.cpp:1284
-#: ../src/interface.cpp:1387 ../src/ui/widget/selected-style.cpp:468
-msgid "Drop color"
-msgstr ""
-
-#: ../src/interface.cpp:1237 ../src/interface.cpp:1347
-msgid "Drop color on gradient"
-msgstr ""
-
-#: ../src/interface.cpp:1400
-msgid "Could not parse SVG data"
-msgstr ""
-
-#: ../src/interface.cpp:1439
-msgid "Drop SVG"
-msgstr ""
-
-#: ../src/interface.cpp:1495
-msgid "Drop bitmap image"
-msgstr ""
-
-#: ../src/interface.cpp:1587
-#, c-format
-msgid ""
-"<span weight=\"bold\" size=\"larger\">A file named \"%s\" already exists. Do "
-"you want to replace it?</span>\n"
-"\n"
-"The file already exists in \"%s\". Replacing it will overwrite its contents."
-msgstr ""
-
-#: ../src/interface.cpp:1594 ../share/extensions/web-set-att.inx.h:5
-#: ../share/extensions/web-transmit-att.inx.h:5
-msgid "Replace"
-msgstr ""
-
-#: ../src/io/sys.cpp:446 ../src/io/sys.cpp:454
-#, c-format
-msgid "Failed to read from child pipe (%s)"
-msgstr ""
-
-#: ../src/io/sys.cpp:478
-#, c-format
-msgid "Failed to change to directory '%s' (%s)"
-msgstr ""
-
-#: ../src/io/sys.cpp:484 ../src/io/sys.cpp:710
-#, c-format
-msgid "Failed to execute child process (%s)"
-msgstr ""
-
-#: ../src/io/sys.cpp:657
-#, c-format
-msgid "Invalid program name: %s"
-msgstr ""
-
-#: ../src/io/sys.cpp:667 ../src/io/sys.cpp:956
-#, c-format
-msgid "Invalid string in argument vector at %d: %s"
-msgstr ""
-
-#: ../src/io/sys.cpp:678 ../src/io/sys.cpp:971
-#, c-format
-msgid "Invalid string in environment: %s"
-msgstr ""
-
-#: ../src/io/sys.cpp:739
-#, c-format
-msgid "Failed to create pipe for communicating with child process (%s)"
-msgstr ""
-
-#: ../src/io/sys.cpp:952
-#, c-format
-msgid "Invalid working directory: %s"
-msgstr ""
-
-#: ../src/io/sys.cpp:1020
-#, c-format
-msgid "Failed to execute helper program (%s)"
-msgstr ""
-
-#: ../src/knot.cpp:431
-msgid "Node or handle drag canceled."
-msgstr ""
-
-#: ../src/knotholder.cpp:135
-msgid "Change handle"
-msgstr ""
-
-#: ../src/knotholder.cpp:214
-msgid "Move handle"
-msgstr ""
-
-#. TRANSLATORS: This refers to the pattern that's inside the object
-#: ../src/knotholder.cpp:235
-msgid "<b>Move</b> the pattern fill inside the object"
-msgstr ""
-
-#: ../src/knotholder.cpp:238
-msgid "<b>Scale</b> the pattern fill; uniformly if with <b>Ctrl</b>"
-msgstr ""
-
-#: ../src/knotholder.cpp:241
-msgid "<b>Rotate</b> the pattern fill; with <b>Ctrl</b> to snap angle"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-bar.c:108
-msgid "Master"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-bar.c:109
-msgid "GdlDockMaster object which the dockbar widget is attached to"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-bar.c:116
-msgid "Dockbar style"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-bar.c:117
-msgid "Dockbar style to show items on it"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock.c:175 ../src/ui/dialog/inkscape-preferences.cpp:549
-#: ../src/ui/dialog/inkscape-preferences.cpp:570
-msgid "Floating"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock.c:176
-msgid "Whether the dock is floating in its own window"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock.c:183 ../src/libgdl/gdl-dock-master.c:144
-msgid "Default title"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock.c:184
-msgid "Default title for the newly created floating docks"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock.c:191
-msgid "Width for the dock when it's of floating type"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock.c:199
-msgid "Height for the dock when it's of floating type"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock.c:206
-msgid "Float X"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock.c:207
-msgid "X coordinate for a floating dock"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock.c:214
-msgid "Float Y"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock.c:215
-msgid "Y coordinate for a floating dock"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock.c:499
-#, c-format
-msgid "Dock #%d"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-item.c:287
-msgid "Orientation"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-item.c:288
-msgid "Orientation of the docking item"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-item.c:303
-msgid "Resizable"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-item.c:304
-msgid "If set, the dock item can be resized when docked in a panel"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-item.c:311
-msgid "Item behavior"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-item.c:312
-msgid ""
-"General behavior for the dock item (i.e. whether it can float, if it's "
-"locked, etc.)"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-item.c:320 ../src/libgdl/gdl-dock-master.c:151
-msgid "Locked"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-item.c:321
-msgid ""
-"If set, the dock item cannot be dragged around and it doesn't show a grip"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-item.c:329
-msgid "Preferred width"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-item.c:330
-msgid "Preferred width for the dock item"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-item.c:336
-msgid "Preferred height"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-item.c:337
-msgid "Preferred height for the dock item"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-item.c:616
-#, c-format
-msgid ""
-"You can't add a dock object (%p of type %s) inside a %s. Use a GdlDock or "
-"some other compound dock object."
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-item.c:623
-#, c-format
-msgid ""
-"Attempting to add a widget with type %s to a %s, but it can only contain one "
-"widget at a time; it already contains a widget of type %s"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-item.c:1345 ../src/libgdl/gdl-dock-item.c:1390
-#, c-format
-msgid "Unsupported docking strategy %s in dock object of type %s"
-msgstr ""
-
-#. UnLock menuitem
-#: ../src/libgdl/gdl-dock-item.c:1479
-msgid "UnLock"
-msgstr ""
-
-#. Hide menuitem.
-#: ../src/libgdl/gdl-dock-item.c:1486
-msgid "Hide"
-msgstr ""
-
-#. Lock menuitem
-#: ../src/libgdl/gdl-dock-item.c:1491
-msgid "Lock"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-item.c:1717
-#, c-format
-msgid "Attempt to bind an unbound item %p"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-item-grip.c:395
-msgid "Iconify"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-item-grip.c:395
-msgid "Iconify this dock"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-item-grip.c:397
-msgid "Close"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-item-grip.c:397
-msgid "Close this dock"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-item-grip.c:706
-#: ../src/libgdl/gdl-dock-tablabel.c:128
-msgid "Controlling dock item"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-item-grip.c:707
-msgid "Dockitem which 'owns' this grip"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-master.c:145
-msgid "Default title for newly created floating docks"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-master.c:152
-msgid ""
-"If is set to 1, all the dock items bound to the master are locked; if it's "
-"0, all are unlocked; -1 indicates inconsistency among the items"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-master.c:160 ../src/libgdl/gdl-switcher.c:706
-msgid "Switcher Style"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-master.c:161 ../src/libgdl/gdl-switcher.c:707
-msgid "Switcher buttons style"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-master.c:168
-msgid "Expand direction"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-master.c:169
-msgid ""
-"Allow the master's dock items to expand their container dock objects in the "
-"given direction"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-master.c:796
-#, c-format
-msgid ""
-"master %p: unable to add object %p[%s] to the hash.  There already is an "
-"item with that name (%p)."
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-master.c:969
-#, c-format
-msgid ""
-"The new dock controller %p is automatic.  Only manual dock objects should be "
-"named controller."
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-notebook.c:134
-#: ../src/ui/dialog/align-and-distribute.cpp:919
-#: ../src/ui/dialog/document-properties.cpp:118
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1410
-#: ../src/widgets/desktop-widget.cpp:1572
-msgid "Page"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-notebook.c:135
-msgid "The index of the current page"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-object.c:120 ../src/ui/widget/page-sizer.cpp:237
-msgid "Name"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-object.c:121
-msgid "Unique name for identifying the dock object"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-object.c:128
-msgid "Long name"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-object.c:129
-msgid "Human readable name for the dock object"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-object.c:135
-msgid "Stock Icon"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-object.c:136
-msgid "Stock icon for the dock object"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-object.c:142
-msgid "Pixbuf Icon"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-object.c:143
-msgid "Pixbuf icon for the dock object"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-object.c:148
-msgid "Dock master"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-object.c:149
-msgid "Dock master this dock object is bound to"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-object.c:434
-#, c-format
-msgid ""
-"Call to gdl_dock_object_dock in a dock object %p (object type is %s) which "
-"hasn't implemented this method"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-object.c:563
-#, c-format
-msgid ""
-"Dock operation requested in a non-bound object %p. The application might "
-"crash"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-object.c:570
-#, c-format
-msgid "Cannot dock %p to %p because they belong to different masters"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-object.c:612
-#, c-format
-msgid ""
-"Attempt to bind to %p an already bound dock object %p (current master: %p)"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-paned.c:132
-msgid "Position"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-paned.c:133
-msgid "Position of the divider in pixels"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-placeholder.c:143
-msgid "Sticky"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-placeholder.c:144
-msgid ""
-"Whether the placeholder will stick to its host or move up the hierarchy when "
-"the host is redocked"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-placeholder.c:151
-msgid "Host"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-placeholder.c:152
-msgid "The dock object this placeholder is attached to"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-placeholder.c:159
-msgid "Next placement"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-placeholder.c:160
-msgid ""
-"The position an item will be docked to our host if a request is made to dock "
-"to us"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-placeholder.c:170
-msgid "Width for the widget when it's attached to the placeholder"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-placeholder.c:178
-msgid "Height for the widget when it's attached to the placeholder"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-placeholder.c:184
-msgid "Floating Toplevel"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-placeholder.c:185
-msgid "Whether the placeholder is standing in for a floating toplevel dock"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-placeholder.c:191
-msgid "X-Coordinate"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-placeholder.c:192
-msgid "X coordinate for dock when floating"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-placeholder.c:198
-msgid "Y-Coordinate"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-placeholder.c:199
-msgid "Y coordinate for dock when floating"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-placeholder.c:494
-msgid "Attempt to dock a dock object to an unbound placeholder"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-placeholder.c:618
-#, c-format
-msgid "Got a detach signal from an object (%p) who is not our host %p"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-placeholder.c:643
-#, c-format
-msgid ""
-"Something weird happened while getting the child placement for %p from "
-"parent %p"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-tablabel.c:129
-msgid "Dockitem which 'owns' this tablabel"
-msgstr ""
-
-#: ../src/libnrtype/FontFactory.cpp:806
-msgid "Ignoring font without family that will crash Pango"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:88
-msgid "doEffect stack test"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:89
-msgid "Angle bisector"
-msgstr ""
-
-#. TRANSLATORS: boolean operations
-#: ../src/live_effects/effect.cpp:91
-msgid "Boolops"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:92
-msgid "Circle (by center and radius)"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:93
-msgid "Circle by 3 points"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:94
-msgid "Dynamic stroke"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:95 ../share/extensions/extrude.inx.h:1
-msgid "Extrude"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:96
-msgid "Lattice Deformation"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:97
-msgid "Line Segment"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:98
-msgid "Mirror symmetry"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:100
-msgid "Parallel"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:101
-msgid "Path length"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:102
-msgid "Perpendicular bisector"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:103
-msgid "Perspective path"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:104
-msgid "Rotate copies"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:105
-msgid "Recursive skeleton"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:106
-msgid "Tangent to curve"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:107
-msgid "Text label"
-msgstr ""
-
-#. 0.46
-#: ../src/live_effects/effect.cpp:110
-msgid "Bend"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:111
-msgid "Gears"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:112
-msgid "Pattern Along Path"
-msgstr ""
-
-#. for historic reasons, this effect is called skeletal(strokes) in Inkscape:SVG
-#: ../src/live_effects/effect.cpp:113
-msgid "Stitch Sub-Paths"
-msgstr ""
-
-#. 0.47
-#: ../src/live_effects/effect.cpp:115
-msgid "VonKoch"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:116
-msgid "Knot"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:117
-msgid "Construct grid"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:118
-msgid "Spiro spline"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:119
-msgid "Envelope Deformation"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:120
-msgid "Interpolate Sub-Paths"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:121
-msgid "Hatches (rough)"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:122
-msgid "Sketch"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:123
-msgid "Ruler"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:279
-msgid "Is visible?"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:279
-msgid ""
-"If unchecked, the effect remains applied to the object but is temporarily "
-"disabled on canvas"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:300
-msgid "No effect"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:347
-#, c-format
-msgid "Please specify a parameter path for the LPE '%s' with %d mouse clicks"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:645
-#, c-format
-msgid "Editing parameter <b>%s</b>."
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:650
-msgid "None of the applied path effect's parameters can be edited on-canvas."
-msgstr ""
-
-#: ../src/live_effects/lpe-bendpath.cpp:55
-msgid "Bend path"
-msgstr ""
-
-#: ../src/live_effects/lpe-bendpath.cpp:55
-msgid "Path along which to bend the original path"
-msgstr ""
-
-#: ../src/live_effects/lpe-bendpath.cpp:56
-msgid "Width of the path"
-msgstr ""
-
-#: ../src/live_effects/lpe-bendpath.cpp:57
-#: ../src/live_effects/lpe-patternalongpath.cpp:65
-msgid "Width in units of length"
-msgstr ""
-
-#: ../src/live_effects/lpe-bendpath.cpp:57
-msgid "Scale the width of the path in units of its length"
-msgstr ""
-
-#: ../src/live_effects/lpe-bendpath.cpp:58
-msgid "Original path is vertical"
-msgstr ""
-
-#: ../src/live_effects/lpe-bendpath.cpp:58
-msgid "Rotates the original 90 degrees, before bending it along the bend path"
-msgstr ""
-
-#: ../src/live_effects/lpe-constructgrid.cpp:28
-msgid "Size X"
-msgstr ""
-
-#: ../src/live_effects/lpe-constructgrid.cpp:28
-msgid "The size of the grid in X direction."
-msgstr ""
-
-#: ../src/live_effects/lpe-constructgrid.cpp:29
-msgid "Size Y"
-msgstr ""
-
-#: ../src/live_effects/lpe-constructgrid.cpp:29
-msgid "The size of the grid in Y direction."
-msgstr ""
-
-#: ../src/live_effects/lpe-curvestitch.cpp:42
-msgid "Stitch path"
-msgstr ""
-
-#: ../src/live_effects/lpe-curvestitch.cpp:42
-msgid "The path that will be used as stitch."
-msgstr ""
-
-#: ../src/live_effects/lpe-curvestitch.cpp:43
-msgid "Number of paths"
-msgstr ""
-
-#: ../src/live_effects/lpe-curvestitch.cpp:43
-msgid "The number of paths that will be generated."
-msgstr ""
-
-#: ../src/live_effects/lpe-curvestitch.cpp:44
-msgid "Start edge variance"
-msgstr ""
-
-#: ../src/live_effects/lpe-curvestitch.cpp:44
-msgid ""
-"The amount of random jitter to move the start points of the stitches inside "
-"& outside the guide path"
-msgstr ""
-
-#: ../src/live_effects/lpe-curvestitch.cpp:45
-msgid "Start spacing variance"
-msgstr ""
-
-#: ../src/live_effects/lpe-curvestitch.cpp:45
-msgid ""
-"The amount of random shifting to move the start points of the stitches back "
-"& forth along the guide path"
-msgstr ""
-
-#: ../src/live_effects/lpe-curvestitch.cpp:46
-msgid "End edge variance"
-msgstr ""
-
-#: ../src/live_effects/lpe-curvestitch.cpp:46
-msgid ""
-"The amount of randomness that moves the end points of the stitches inside & "
-"outside the guide path"
-msgstr ""
-
-#: ../src/live_effects/lpe-curvestitch.cpp:47
-msgid "End spacing variance"
-msgstr ""
-
-#: ../src/live_effects/lpe-curvestitch.cpp:47
-msgid ""
-"The amount of random shifting to move the end points of the stitches back & "
-"forth along the guide path"
-msgstr ""
-
-#: ../src/live_effects/lpe-curvestitch.cpp:48
-msgid "Scale width"
-msgstr ""
-
-#: ../src/live_effects/lpe-curvestitch.cpp:48
-msgid "Scale the width of the stitch path"
-msgstr ""
-
-#: ../src/live_effects/lpe-curvestitch.cpp:49
-msgid "Scale width relative to length"
-msgstr ""
-
-#: ../src/live_effects/lpe-curvestitch.cpp:49
-msgid "Scale the width of the stitch path relative to its length"
-msgstr ""
-
-#: ../src/live_effects/lpe-envelope.cpp:33
-msgid "Top bend path"
-msgstr ""
-
-#: ../src/live_effects/lpe-envelope.cpp:33
-msgid "Top path along which to bend the original path"
-msgstr ""
-
-#: ../src/live_effects/lpe-envelope.cpp:34
-msgid "Right bend path"
-msgstr ""
-
-#: ../src/live_effects/lpe-envelope.cpp:34
-msgid "Right path along which to bend the original path"
-msgstr ""
-
-#: ../src/live_effects/lpe-envelope.cpp:35
-msgid "Bottom bend path"
-msgstr ""
-
-#: ../src/live_effects/lpe-envelope.cpp:35
-msgid "Bottom path along which to bend the original path"
-msgstr ""
-
-#: ../src/live_effects/lpe-envelope.cpp:36
-msgid "Left bend path"
-msgstr ""
-
-#: ../src/live_effects/lpe-envelope.cpp:36
-msgid "Left path along which to bend the original path"
-msgstr ""
-
-#: ../src/live_effects/lpe-envelope.cpp:37
-msgid "Enable left & right paths"
-msgstr ""
-
-#: ../src/live_effects/lpe-envelope.cpp:37
-msgid "Enable the left and right deformation paths"
-msgstr ""
-
-#: ../src/live_effects/lpe-envelope.cpp:38
-msgid "Enable top & bottom paths"
-msgstr ""
-
-#: ../src/live_effects/lpe-envelope.cpp:38
-msgid "Enable the top and bottom deformation paths"
-msgstr ""
-
-#: ../src/live_effects/lpe-gears.cpp:212
-msgid "Teeth"
-msgstr ""
-
-#: ../src/live_effects/lpe-gears.cpp:212
-msgid "The number of teeth"
-msgstr ""
-
-#: ../src/live_effects/lpe-gears.cpp:213
-msgid "Phi"
-msgstr ""
-
-#: ../src/live_effects/lpe-gears.cpp:213
-msgid ""
-"Tooth pressure angle (typically 20-25 deg).  The ratio of teeth not in "
-"contact."
-msgstr ""
-
-#: ../src/live_effects/lpe-interpolate.cpp:30
-msgid "Trajectory"
-msgstr ""
-
-#: ../src/live_effects/lpe-interpolate.cpp:30
-msgid "Path along which intermediate steps are created."
-msgstr ""
-
-#: ../src/live_effects/lpe-interpolate.cpp:31
-#: ../src/ui/dialog/inkscape-preferences.cpp:242
-msgid "Steps"
-msgstr ""
-
-#: ../src/live_effects/lpe-interpolate.cpp:31
-msgid "Determines the number of steps from start to end path."
-msgstr ""
-
-#: ../src/live_effects/lpe-interpolate.cpp:32
-msgid "Equidistant spacing"
-msgstr ""
-
-#: ../src/live_effects/lpe-interpolate.cpp:32
-msgid ""
-"If true, the spacing between intermediates is constant along the length of "
-"the path. If false, the distance depends on the location of the nodes of the "
-"trajectory path."
-msgstr ""
-
-#. initialise your parameters here:
-#: ../src/live_effects/lpe-knot.cpp:329
-msgid "Fixed width"
-msgstr ""
-
-#: ../src/live_effects/lpe-knot.cpp:329
-msgid "Size of hidden region of lower string"
-msgstr ""
-
-#: ../src/live_effects/lpe-knot.cpp:330
-msgid "In units of stroke width"
-msgstr ""
-
-#: ../src/live_effects/lpe-knot.cpp:330
-msgid "Consider 'Interruption width' as a ratio of stroke width"
-msgstr ""
-
-#: ../src/live_effects/lpe-knot.cpp:331 ../src/widgets/stroke-style.cpp:1093
-#: ../share/extensions/edge3d.inx.h:9
-msgid "Stroke width"
-msgstr ""
-
-#: ../src/live_effects/lpe-knot.cpp:331
-msgid "Add the stroke width to the interruption size"
-msgstr ""
-
-#: ../src/live_effects/lpe-knot.cpp:332
-msgid "Crossing path stroke width"
-msgstr ""
-
-#: ../src/live_effects/lpe-knot.cpp:332
-msgid "Add crossed stroke width to the interruption size"
-msgstr ""
-
-#: ../src/live_effects/lpe-knot.cpp:333
-msgid "Switcher size"
-msgstr ""
-
-#: ../src/live_effects/lpe-knot.cpp:333
-msgid "Orientation indicator/switcher size"
-msgstr ""
-
-#: ../src/live_effects/lpe-knot.cpp:334
-msgid "Crossing Signs"
-msgstr ""
-
-#: ../src/live_effects/lpe-knot.cpp:334
-msgid "Crossings signs"
-msgstr ""
-
-#: ../src/live_effects/lpe-knot.cpp:345
-msgid "Drag to select a crossing, click to flip it"
-msgstr ""
-
-#. / @todo Is this the right verb?
-#: ../src/live_effects/lpe-knot.cpp:638
-msgid "Change knot crossing"
-msgstr ""
-
-#: ../src/live_effects/lpe-patternalongpath.cpp:52
-#: ../share/extensions/pathalongpath.inx.h:11
-msgid "Single"
-msgstr ""
-
-#: ../src/live_effects/lpe-patternalongpath.cpp:53
-#: ../share/extensions/pathalongpath.inx.h:12
-msgid "Single, stretched"
-msgstr ""
-
-#: ../src/live_effects/lpe-patternalongpath.cpp:54
-#: ../share/extensions/pathalongpath.inx.h:8
-msgid "Repeated"
-msgstr ""
-
-#: ../src/live_effects/lpe-patternalongpath.cpp:55
-#: ../share/extensions/pathalongpath.inx.h:9
-msgid "Repeated, stretched"
-msgstr ""
-
-#: ../src/live_effects/lpe-patternalongpath.cpp:61
-msgid "Pattern source"
-msgstr ""
-
-#: ../src/live_effects/lpe-patternalongpath.cpp:61
-msgid "Path to put along the skeleton path"
-msgstr ""
-
-#: ../src/live_effects/lpe-patternalongpath.cpp:62
-msgid "Pattern copies"
-msgstr ""
-
-#: ../src/live_effects/lpe-patternalongpath.cpp:62
-msgid "How many pattern copies to place along the skeleton path"
-msgstr ""
-
-#: ../src/live_effects/lpe-patternalongpath.cpp:64
-msgid "Width of the pattern"
-msgstr ""
-
-#: ../src/live_effects/lpe-patternalongpath.cpp:66
-msgid "Scale the width of the pattern in units of its length"
-msgstr ""
-
-#: ../src/live_effects/lpe-patternalongpath.cpp:68
-msgid "Spacing"
-msgstr ""
-
-#: ../src/live_effects/lpe-patternalongpath.cpp:70
-#, no-c-format
-msgid ""
-"Space between copies of the pattern. Negative values allowed, but are "
-"limited to -90% of pattern width."
-msgstr ""
-
-#: ../src/live_effects/lpe-patternalongpath.cpp:72
-#: ../share/extensions/pathalongpath.inx.h:5
-#: ../share/extensions/pathscatter.inx.h:7
-msgid "Normal offset"
-msgstr ""
-
-#: ../src/live_effects/lpe-patternalongpath.cpp:73
-#: ../share/extensions/pathalongpath.inx.h:15
-#: ../share/extensions/pathscatter.inx.h:13
-msgid "Tangential offset"
-msgstr ""
-
-#: ../src/live_effects/lpe-patternalongpath.cpp:74
-msgid "Offsets in unit of pattern size"
-msgstr ""
-
-#: ../src/live_effects/lpe-patternalongpath.cpp:75
-msgid ""
-"Spacing, tangential and normal offset are expressed as a ratio of width/"
-"height"
-msgstr ""
-
-#: ../src/live_effects/lpe-patternalongpath.cpp:77
-#: ../share/extensions/pathalongpath.inx.h:7
-#: ../share/extensions/pathscatter.inx.h:9
-msgid "Pattern is vertical"
-msgstr ""
-
-#: ../src/live_effects/lpe-patternalongpath.cpp:77
-msgid "Rotate pattern 90 deg before applying"
-msgstr ""
-
-#: ../src/live_effects/lpe-patternalongpath.cpp:79
-msgid "Fuse nearby ends"
-msgstr ""
-
-#: ../src/live_effects/lpe-patternalongpath.cpp:79
-msgid "Fuse ends closer than this number. 0 means don't fuse."
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:226
-msgid "Frequency randomness"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:226
-msgid "Variation of distance between hatches, in %."
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:227
-msgid "Growth"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:227
-msgid "Growth of distance between hatches."
-msgstr ""
-
-#. FIXME: top/bottom names are inverted in the UI/svg and in the code!!
-#: ../src/live_effects/lpe-rough-hatches.cpp:229
-msgid "Half-turns smoothness: 1st side, in"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:229
-msgid ""
-"Set smoothness/sharpness of path when reaching a 'bottom' half-turn. "
-"0=sharp, 1=default"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:230
-msgid "1st side, out"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:230
-msgid ""
-"Set smoothness/sharpness of path when leaving a 'bottom' half-turn. 0=sharp, "
-"1=default"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:231
-msgid "2nd side, in"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:231
-msgid ""
-"Set smoothness/sharpness of path when reaching a 'top' half-turn. 0=sharp, "
-"1=default"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:232
-msgid "2nd side, out"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:232
-msgid ""
-"Set smoothness/sharpness of path when leaving a 'top' half-turn. 0=sharp, "
-"1=default"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:233
-msgid "Magnitude jitter: 1st side"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:233
-msgid "Randomly moves 'bottom' half-turns to produce magnitude variations."
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:234
-#: ../src/live_effects/lpe-rough-hatches.cpp:236
-#: ../src/live_effects/lpe-rough-hatches.cpp:238
-msgid "2nd side"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:234
-msgid "Randomly moves 'top' half-turns to produce magnitude variations."
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:235
-msgid "Parallelism jitter: 1st side"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:235
-msgid ""
-"Add direction randomness by moving 'bottom' half-turns tangentially to the "
-"boundary."
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:236
-msgid ""
-"Add direction randomness by randomly moving 'top' half-turns tangentially to "
-"the boundary."
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:237
-msgid "Variance: 1st side"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:237
-msgid "Randomness of 'bottom' half-turns smoothness"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:238
-msgid "Randomness of 'top' half-turns smoothness"
-msgstr ""
-
-#.
-#: ../src/live_effects/lpe-rough-hatches.cpp:240
-msgid "Generate thick/thin path"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:240
-msgid "Simulate a stroke of varying width"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:241
-msgid "Bend hatches"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:241
-msgid "Add a global bend to the hatches (slower)"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:242
-msgid "Thickness: at 1st side"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:242
-msgid "Width at 'bottom' half-turns"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:243
-msgid "at 2nd side"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:243
-msgid "Width at 'top' half-turns"
-msgstr ""
-
-#.
-#: ../src/live_effects/lpe-rough-hatches.cpp:245
-msgid "from 2nd to 1st side"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:245
-msgid "Width from 'top' to 'bottom'"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:246
-msgid "from 1st to 2nd side"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:246
-msgid "Width from 'bottom' to 'top'"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:248
-msgid "Hatches width and dir"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:248
-msgid "Defines hatches frequency and direction"
-msgstr ""
-
-#.
-#. bender(_("Global bending"), _("Relative position to a reference point defines global bending direction and amount"), "bender", &wr, this, NULL, Geom::Point(-5,0)),
-#: ../src/live_effects/lpe-rough-hatches.cpp:251
-msgid "Global bending"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:251
-msgid ""
-"Relative position to a reference point defines global bending direction and "
-"amount"
-msgstr ""
-
-#: ../src/live_effects/lpe-ruler.cpp:27 ../share/extensions/restack.inx.h:7
-msgid "Left"
-msgstr ""
-
-#: ../src/live_effects/lpe-ruler.cpp:28 ../share/extensions/restack.inx.h:14
-msgid "Right"
-msgstr ""
-
-#: ../src/live_effects/lpe-ruler.cpp:29 ../src/live_effects/lpe-ruler.cpp:37
-msgid "Both"
-msgstr ""
-
-#: ../src/live_effects/lpe-ruler.cpp:35 ../src/widgets/toolbox.cpp:5168
-msgid "Start"
-msgstr ""
-
-#: ../src/live_effects/lpe-ruler.cpp:36 ../src/widgets/toolbox.cpp:5181
-msgid "End"
-msgstr ""
-
-#: ../src/live_effects/lpe-ruler.cpp:44
-msgid "Mark distance"
-msgstr ""
-
-#: ../src/live_effects/lpe-ruler.cpp:44
-msgid "Distance between successive ruler marks"
-msgstr ""
-
-#: ../src/live_effects/lpe-ruler.cpp:45
-msgid "Major length"
-msgstr ""
-
-#: ../src/live_effects/lpe-ruler.cpp:45
-msgid "Length of major ruler marks"
-msgstr ""
-
-#: ../src/live_effects/lpe-ruler.cpp:46
-msgid "Minor length"
-msgstr ""
-
-#: ../src/live_effects/lpe-ruler.cpp:46
-msgid "Length of minor ruler marks"
-msgstr ""
-
-#: ../src/live_effects/lpe-ruler.cpp:47
-msgid "Major steps"
-msgstr ""
-
-#: ../src/live_effects/lpe-ruler.cpp:47
-msgid "Draw a major mark every ... steps"
-msgstr ""
-
-#: ../src/live_effects/lpe-ruler.cpp:48
-msgid "Shift marks by"
-msgstr ""
-
-#: ../src/live_effects/lpe-ruler.cpp:48
-msgid "Shift marks by this many steps"
-msgstr ""
-
-#: ../src/live_effects/lpe-ruler.cpp:49
-msgid "Mark direction"
-msgstr ""
-
-#: ../src/live_effects/lpe-ruler.cpp:49
-msgid "Direction of marks (when viewing along the path from start to end)"
-msgstr ""
-
-#: ../src/live_effects/lpe-ruler.cpp:50
-msgid "Offset of first mark"
-msgstr ""
-
-#: ../src/live_effects/lpe-ruler.cpp:51
-msgid "Border marks"
-msgstr ""
-
-#: ../src/live_effects/lpe-ruler.cpp:51
-msgid "Choose whether to draw marks at the beginning and end of the path"
-msgstr ""
-
-#. initialise your parameters here:
-#. testpointA(_("Test Point A"), _("Test A"), "ptA", &wr, this, Geom::Point(100,100)),
-#: ../src/live_effects/lpe-sketch.cpp:35
-msgid "Strokes"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:35
-msgid "Draw that many approximating strokes"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:36
-msgid "Max stroke length"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:37
-msgid "Maximum length of approximating strokes"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:38
-msgid "Stroke length variation"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:39
-msgid "Random variation of stroke length (relative to maximum length)"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:40
-msgid "Max. overlap"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:41
-msgid "How much successive strokes should overlap (relative to maximum length)"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:42
-msgid "Overlap variation"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:43
-msgid "Random variation of overlap (relative to maximum overlap)"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:44
-msgid "Max. end tolerance"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:45
-msgid ""
-"Maximum distance between ends of original and approximating paths (relative "
-"to maximum length)"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:46
-msgid "Average offset"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:47
-msgid "Average distance each stroke is away from the original path"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:48
-msgid "Max. tremble"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:49
-msgid "Maximum tremble magnitude"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:50
-msgid "Tremble frequency"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:51
-msgid "Average number of tremble periods in a stroke"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:53
-msgid "Construction lines"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:54
-msgid "How many construction lines (tangents) to draw"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:55 ../src/selection-chemistry.cpp:1516
-#: ../src/seltrans.cpp:531 ../src/ui/dialog/transformation.cpp:738
-#: ../share/extensions/interp_att_g.inx.h:16
-#: ../share/extensions/render_alphabetsoup.inx.h:4
-msgid "Scale"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:56
-msgid ""
-"Scale factor relating curvature and length of construction lines (try "
-"5*offset)"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:57
-msgid "Max. length"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:57
-msgid "Maximum length of construction lines"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:58
-msgid "Length variation"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:58
-msgid "Random variation of the length of construction lines"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:59
-msgid "Placement randomness"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:59
-msgid "0: evenly distributed construction lines, 1: purely random placement"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:61
-msgid "k_min"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:61
-msgid "min curvature"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:62
-msgid "k_max"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:62
-msgid "max curvature"
-msgstr ""
-
-#: ../src/live_effects/lpe-vonkoch.cpp:47
-msgid "Nb of generations"
-msgstr ""
-
-#: ../src/live_effects/lpe-vonkoch.cpp:47
-msgid "Depth of the recursion --- keep low!!"
-msgstr ""
-
-#: ../src/live_effects/lpe-vonkoch.cpp:48
-msgid "Generating path"
-msgstr ""
-
-#: ../src/live_effects/lpe-vonkoch.cpp:48
-msgid "Path whose segments define the iterated transforms"
-msgstr ""
-
-#: ../src/live_effects/lpe-vonkoch.cpp:49
-msgid "Use uniform transforms only"
-msgstr ""
-
-#: ../src/live_effects/lpe-vonkoch.cpp:49
-msgid ""
-"2 consecutive segments are used to reverse/preserve orientation only "
-"(otherwise, they define a general transform)."
-msgstr ""
-
-#: ../src/live_effects/lpe-vonkoch.cpp:50
-msgid "Draw all generations"
-msgstr ""
-
-#: ../src/live_effects/lpe-vonkoch.cpp:50
-msgid "If unchecked, draw only the last generation"
-msgstr ""
-
-#. ,draw_boxes(_("Display boxes"), _("Display boxes instead of paths only"), "draw_boxes", &wr, this, true)
-#: ../src/live_effects/lpe-vonkoch.cpp:52
-msgid "Reference segment"
-msgstr ""
-
-#: ../src/live_effects/lpe-vonkoch.cpp:52
-msgid "The reference segment. Defaults to the horizontal midline of the bbox."
-msgstr ""
-
-#. refA(_("Ref Start"), _("Left side middle of the reference box"), "refA", &wr, this),
-#. refB(_("Ref End"), _("Right side middle of the reference box"), "refB", &wr, this),
-#. FIXME: a path is used here instead of 2 points to work around path/point param incompatibility bug.
-#: ../src/live_effects/lpe-vonkoch.cpp:56
-msgid "Max complexity"
-msgstr ""
-
-#: ../src/live_effects/lpe-vonkoch.cpp:56
-msgid "Disable effect if the output is too complex"
-msgstr ""
-
-#: ../src/live_effects/parameter/bool.cpp:69
-msgid "Change bool parameter"
-msgstr ""
-
-#: ../src/live_effects/parameter/enum.h:50
-msgid "Change enumeration parameter"
-msgstr ""
-
-#: ../src/live_effects/parameter/parameter.cpp:139
-msgid "Change scalar parameter"
-msgstr ""
-
-#: ../src/live_effects/parameter/path.cpp:158
-msgid "Edit on-canvas"
-msgstr ""
-
-#: ../src/live_effects/parameter/path.cpp:168
-msgid "Copy path"
-msgstr ""
-
-#: ../src/live_effects/parameter/path.cpp:178
-msgid "Paste path"
-msgstr ""
-
-#: ../src/live_effects/parameter/path.cpp:188
-msgid "Link to path"
-msgstr ""
-
-#: ../src/live_effects/parameter/path.cpp:409
-msgid "Paste path parameter"
-msgstr ""
-
-#: ../src/live_effects/parameter/path.cpp:441
-msgid "Link path parameter to path"
-msgstr ""
-
-#: ../src/live_effects/parameter/point.cpp:91
-msgid "Change point parameter"
-msgstr ""
-
-#: ../src/live_effects/parameter/random.cpp:137
-msgid "Change random parameter"
-msgstr ""
-
-#: ../src/live_effects/parameter/text.cpp:101
-msgid "Change text parameter"
-msgstr ""
-
-#: ../src/live_effects/parameter/unit.cpp:77
-msgid "Change unit parameter"
-msgstr ""
-
-#: ../src/main-cmdlineact.cpp:49
-#, c-format
-msgid "Unable to find verb ID '%s' specified on the command line.\n"
-msgstr ""
-
-#: ../src/main-cmdlineact.cpp:61
-#, c-format
-msgid "Unable to find node ID: '%s'\n"
-msgstr ""
-
-#: ../src/main.cpp:265
-msgid "Print the Inkscape version number"
-msgstr ""
-
-#: ../src/main.cpp:270
-msgid "Do not use X server (only process files from console)"
-msgstr ""
-
-#: ../src/main.cpp:275
-msgid "Try to use X server (even if $DISPLAY is not set)"
-msgstr ""
-
-#: ../src/main.cpp:280
-msgid "Open specified document(s) (option string may be excluded)"
-msgstr ""
-
-#: ../src/main.cpp:281 ../src/main.cpp:286 ../src/main.cpp:291
-#: ../src/main.cpp:358 ../src/main.cpp:363 ../src/main.cpp:368
-#: ../src/main.cpp:373 ../src/main.cpp:379
-msgid "FILENAME"
-msgstr ""
-
-#: ../src/main.cpp:285
-msgid "Print document(s) to specified output file (use '| program' for pipe)"
-msgstr ""
-
-#: ../src/main.cpp:290
-msgid "Export document to a PNG file"
-msgstr ""
-
-#: ../src/main.cpp:295
-msgid ""
-"Resolution for exporting to bitmap and for rasterization of filters in PS/"
-"EPS/PDF (default 90)"
-msgstr ""
-
-#: ../src/main.cpp:296 ../src/ui/widget/rendering-options.cpp:43
-msgid "DPI"
-msgstr ""
-
-#: ../src/main.cpp:300
-msgid ""
-"Exported area in SVG user units (default is the page; 0,0 is lower-left "
-"corner)"
-msgstr ""
-
-#: ../src/main.cpp:301
-msgid "x0:y0:x1:y1"
-msgstr ""
-
-#: ../src/main.cpp:305
-msgid "Exported area is the entire drawing (not page)"
-msgstr ""
-
-#: ../src/main.cpp:310
-msgid "Exported area is the entire page"
-msgstr ""
-
-#: ../src/main.cpp:315
-msgid ""
-"Snap the bitmap export area outwards to the nearest integer values (in SVG "
-"user units)"
-msgstr ""
-
-#: ../src/main.cpp:320
-msgid "The width of exported bitmap in pixels (overrides export-dpi)"
-msgstr ""
-
-#: ../src/main.cpp:321
-msgid "WIDTH"
-msgstr ""
-
-#: ../src/main.cpp:325
-msgid "The height of exported bitmap in pixels (overrides export-dpi)"
-msgstr ""
-
-#: ../src/main.cpp:326
-msgid "HEIGHT"
-msgstr ""
-
-#: ../src/main.cpp:330
-msgid "The ID of the object to export"
-msgstr ""
-
-#: ../src/main.cpp:331 ../src/main.cpp:424
-msgid "ID"
-msgstr ""
-
-#. TRANSLATORS: this means: "Only export the object whose id is given in --export-id".
-#. See "man inkscape" for details.
-#: ../src/main.cpp:337
-msgid ""
-"Export just the object with export-id, hide all others (only with export-id)"
-msgstr ""
-
-#: ../src/main.cpp:342
-msgid "Use stored filename and DPI hints when exporting (only with export-id)"
-msgstr ""
-
-#: ../src/main.cpp:347
-msgid "Background color of exported bitmap (any SVG-supported color string)"
-msgstr ""
-
-#: ../src/main.cpp:348
-msgid "COLOR"
-msgstr ""
-
-#: ../src/main.cpp:352
-msgid "Background opacity of exported bitmap (either 0.0 to 1.0, or 1 to 255)"
-msgstr ""
-
-#: ../src/main.cpp:353
-msgid "VALUE"
-msgstr ""
-
-#: ../src/main.cpp:357
-msgid "Export document to plain SVG file (no sodipodi or inkscape namespaces)"
-msgstr ""
-
-#: ../src/main.cpp:362
-msgid "Export document to a PS file"
-msgstr ""
-
-#: ../src/main.cpp:367
-msgid "Export document to an EPS file"
-msgstr ""
-
-#: ../src/main.cpp:372
-msgid "Export document to a PDF file"
-msgstr ""
-
-#: ../src/main.cpp:378
-msgid "Export document to an Enhanced Metafile (EMF) File"
-msgstr ""
-
-#: ../src/main.cpp:384
-msgid "Convert text object to paths on export (PS, EPS, PDF)"
-msgstr ""
-
-#: ../src/main.cpp:389
-msgid ""
-"Render filtered objects without filters, instead of rasterizing (PS, EPS, "
-"PDF)"
-msgstr ""
-
-#. TRANSLATORS: "--query-id" is an Inkscape command line option; see "inkscape --help"
-#: ../src/main.cpp:395
-msgid ""
-"Query the X coordinate of the drawing or, if specified, of the object with --"
-"query-id"
-msgstr ""
-
-#. TRANSLATORS: "--query-id" is an Inkscape command line option; see "inkscape --help"
-#: ../src/main.cpp:401
-msgid ""
-"Query the Y coordinate of the drawing or, if specified, of the object with --"
-"query-id"
-msgstr ""
-
-#. TRANSLATORS: "--query-id" is an Inkscape command line option; see "inkscape --help"
-#: ../src/main.cpp:407
-msgid ""
-"Query the width of the drawing or, if specified, of the object with --query-"
-"id"
-msgstr ""
-
-#. TRANSLATORS: "--query-id" is an Inkscape command line option; see "inkscape --help"
-#: ../src/main.cpp:413
-msgid ""
-"Query the height of the drawing or, if specified, of the object with --query-"
-"id"
-msgstr ""
-
-#: ../src/main.cpp:418
-msgid "List id,x,y,w,h for all objects"
-msgstr ""
-
-#: ../src/main.cpp:423
-msgid "The ID of the object whose dimensions are queried"
-msgstr ""
-
-#. TRANSLATORS: this option makes Inkscape print the name (path) of the extension directory
-#: ../src/main.cpp:429
-msgid "Print out the extension directory and exit"
-msgstr ""
-
-#: ../src/main.cpp:434
-msgid "Remove unused definitions from the defs section(s) of the document"
-msgstr ""
-
-#: ../src/main.cpp:439
-msgid "List the IDs of all the verbs in Inkscape"
-msgstr ""
-
-#: ../src/main.cpp:444
-msgid "Verb to call when Inkscape opens."
-msgstr ""
-
-#: ../src/main.cpp:445
-msgid "VERB-ID"
-msgstr ""
-
-#: ../src/main.cpp:449
-msgid "Object ID to select when Inkscape opens."
-msgstr ""
-
-#: ../src/main.cpp:450
-msgid "OBJECT-ID"
-msgstr ""
-
-#: ../src/main.cpp:454
-msgid "Start Inkscape in interactive shell mode."
-msgstr ""
-
-#: ../src/main.cpp:762 ../src/main.cpp:1088
-msgid ""
-"[OPTIONS...] [FILE...]\n"
-"\n"
-"Available options:"
-msgstr ""
-
-#. ## Add a menu for clear()
-#: ../src/menus-skeleton.h:16 ../src/ui/dialog/debug.cpp:74
-#: ../src/ui/dialog/messages.cpp:52 ../src/ui/dialog/scriptdialog.cpp:208
-msgid "_File"
-msgstr ""
-
-#: ../src/menus-skeleton.h:17
-msgid "_New"
-msgstr ""
-
-#. TODO look at some dynamic option for changing the menu tree:
-#. "       <verb verb-id=\"DialogInput2\" />\n"
-#: ../src/menus-skeleton.h:49 ../src/verbs.cpp:2488 ../src/verbs.cpp:2494
-msgid "_Edit"
-msgstr ""
-
-#: ../src/menus-skeleton.h:59 ../src/verbs.cpp:2288
-msgid "Paste Si_ze"
-msgstr ""
-
-#: ../src/menus-skeleton.h:71
-msgid "Clo_ne"
-msgstr ""
-
-#: ../src/menus-skeleton.h:91
-msgid "_View"
-msgstr ""
-
-#: ../src/menus-skeleton.h:92
-msgid "_Zoom"
-msgstr ""
-
-#: ../src/menus-skeleton.h:108
-msgid "_Display mode"
-msgstr ""
-
-#: ../src/menus-skeleton.h:120
-msgid "Show/Hide"
-msgstr ""
-
-#. "       <verb verb-id=\"DialogScript\" />\n"
-#. Not quite ready to be in the menus.
-#. "       <verb verb-id=\"FocusToggle\" />\n"
-#: ../src/menus-skeleton.h:139
-msgid "_Layer"
-msgstr ""
-
-#: ../src/menus-skeleton.h:159
-msgid "_Object"
-msgstr ""
-
-#: ../src/menus-skeleton.h:166
-msgid "Cli_p"
-msgstr ""
-
-#: ../src/menus-skeleton.h:170
-msgid "Mas_k"
-msgstr ""
-
-#: ../src/menus-skeleton.h:174
-msgid "Patter_n"
-msgstr ""
-
-#: ../src/menus-skeleton.h:198
-msgid "_Path"
-msgstr ""
-
-#: ../src/menus-skeleton.h:225
-msgid "_Text"
-msgstr ""
-
-#: ../src/menus-skeleton.h:244
-msgid "Filter_s"
-msgstr ""
-
-#: ../src/menus-skeleton.h:250
-msgid "Exte_nsions"
-msgstr ""
-
-#: ../src/menus-skeleton.h:257
-msgid "Whiteboa_rd"
-msgstr ""
-
-#: ../src/menus-skeleton.h:261
-msgid "_Help"
-msgstr ""
-
-#: ../src/menus-skeleton.h:265
-msgid "Tutorials"
-msgstr ""
-
-#: ../src/node-context.cpp:228
-msgid ""
-"<b>Ctrl</b>: toggle node type, snap handle angle, move hor/vert; <b>Ctrl"
-"+Alt</b>: move along handles"
-msgstr ""
-
-#: ../src/node-context.cpp:229
-msgid ""
-"<b>Shift</b>: toggle node selection, disable snapping, rotate both handles"
-msgstr ""
-
-#: ../src/node-context.cpp:230
-msgid "<b>Alt</b>: lock handle length; <b>Ctrl+Alt</b>: move along handles"
-msgstr ""
-
-#: ../src/nodepath.cpp:755 ../src/seltrans.cpp:624
-msgid "Stamp"
-msgstr ""
-
-#: ../src/nodepath.cpp:1671 ../src/nodepath.cpp:1697
-msgid "Move nodes vertically"
-msgstr ""
-
-#: ../src/nodepath.cpp:1673 ../src/nodepath.cpp:1699
-msgid "Move nodes horizontally"
-msgstr ""
-
-#: ../src/nodepath.cpp:1675 ../src/nodepath.cpp:1701 ../src/nodepath.cpp:1716
-#: ../src/nodepath.cpp:3625
-msgid "Move nodes"
-msgstr ""
-
-#: ../src/nodepath.cpp:1754
-msgid ""
-"<b>Node handle</b>: drag to shape the curve; with <b>Ctrl</b> to snap angle; "
-"with <b>Alt</b> to lock length; with <b>Shift</b> to rotate both handles"
-msgstr ""
-
-#: ../src/nodepath.cpp:1924
-msgid "Align nodes"
-msgstr ""
-
-#: ../src/nodepath.cpp:1986
-msgid "Distribute nodes"
-msgstr ""
-
-#: ../src/nodepath.cpp:2024
-msgid "Add nodes"
-msgstr ""
-
-#: ../src/nodepath.cpp:2026 ../src/nodepath.cpp:2128
-msgid "Add node"
-msgstr ""
-
-#: ../src/nodepath.cpp:2220
-msgid "Break path"
-msgstr ""
-
-#: ../src/nodepath.cpp:2276
-msgid "Close subpath"
-msgstr ""
-
-#: ../src/nodepath.cpp:2337
-msgid "Join nodes"
-msgstr ""
-
-#: ../src/nodepath.cpp:2364
-msgid "Close subpath by segment"
-msgstr ""
-
-#: ../src/nodepath.cpp:2418
-msgid "Join nodes by segment"
-msgstr ""
-
-#: ../src/nodepath.cpp:2431 ../src/nodepath.cpp:2446
-msgid "To join, you must have <b>two endnodes</b> selected."
-msgstr ""
-
-#: ../src/nodepath.cpp:2603 ../src/nodepath.cpp:2639 ../src/nodepath.cpp:2643
-msgid "Delete nodes"
-msgstr ""
-
-#: ../src/nodepath.cpp:2605
-msgid "Delete nodes preserving shape"
-msgstr ""
-
-#: ../src/nodepath.cpp:2662 ../src/nodepath.cpp:2676
-msgid ""
-"Select <b>two non-endpoint nodes</b> on a path between which to delete "
-"segments."
-msgstr ""
-
-#: ../src/nodepath.cpp:2772
-msgid "Cannot find path between nodes."
-msgstr ""
-
-#: ../src/nodepath.cpp:2804 ../src/widgets/toolbox.cpp:1343
-msgid "Delete segment"
-msgstr ""
-
-#: ../src/nodepath.cpp:2825
-msgid "Change segment type"
-msgstr ""
-
-#: ../src/nodepath.cpp:2842 ../src/nodepath.cpp:3579
-msgid "Change node type"
-msgstr ""
-
-#: ../src/nodepath.cpp:3529 ../src/widgets/toolbox.cpp:1300
-msgid "Delete node"
-msgstr ""
-
-#: ../src/nodepath.cpp:3871
-msgid "Retract handle"
-msgstr ""
-
-#: ../src/nodepath.cpp:3926
-msgid "Move node handle"
-msgstr ""
-
-#: ../src/nodepath.cpp:4111
-#, c-format
-msgid ""
-"<b>Node handle</b>: angle %0.2f&#176;, length %s; with <b>Ctrl</b> to snap "
-"angle; with <b>Alt</b> to lock length; with <b>Shift</b> to rotate both "
-"handles"
-msgstr ""
-
-#: ../src/nodepath.cpp:4305
-msgid "Rotate nodes"
-msgstr ""
-
-#: ../src/nodepath.cpp:4420
-msgid "Cannot scale nodes when all are at the same location."
-msgstr ""
-
-#: ../src/nodepath.cpp:4446
-msgid "Scale nodes"
-msgstr ""
-
-#: ../src/nodepath.cpp:4490
-msgid "Flip nodes"
-msgstr ""
-
-#: ../src/nodepath.cpp:4659
-msgid ""
-"<b>Node</b>: drag to edit the path; with <b>Ctrl</b> to snap to horizontal/"
-"vertical; with <b>Ctrl+Alt</b> to snap to handles' directions"
-msgstr ""
-
-#. TRANSLATORS: "end" is an adjective here (NOT a verb)
-#: ../src/nodepath.cpp:4892
-msgid "end node"
-msgstr ""
-
-#. TRANSLATORS: "cusp" means "sharp" (cusp node); see also the Advanced Tutorial
-#: ../src/nodepath.cpp:4897
-msgid "cusp"
-msgstr ""
-
-#. TRANSLATORS: "smooth" is an adjective here
-#: ../src/nodepath.cpp:4900
-msgid "smooth"
-msgstr ""
-
-#: ../src/nodepath.cpp:4902
-msgid "auto"
-msgstr ""
-
-#: ../src/nodepath.cpp:4904
-msgid "symmetric"
-msgstr ""
-
-#. TRANSLATORS: "end" is an adjective here (NOT a verb)
-#: ../src/nodepath.cpp:4910
-msgid "end node, handle retracted (drag with <b>Shift</b> to extend)"
-msgstr ""
-
-#: ../src/nodepath.cpp:4912
-msgid "one handle retracted (drag with <b>Shift</b> to extend)"
-msgstr ""
-
-#: ../src/nodepath.cpp:4915
-msgid "both handles retracted (drag with <b>Shift</b> to extend)"
-msgstr ""
-
-#: ../src/nodepath.cpp:4927
-msgid ""
-"<b>Drag</b> nodes or node handles; <b>Alt+drag</b> nodes to sculpt; "
-"<b>arrow</b> keys to move nodes, <b>&lt; &gt;</b> to scale, <b>[ ]</b> to "
-"rotate"
-msgstr ""
-
-#: ../src/nodepath.cpp:4928
-msgid "<b>Drag</b> the node or its handles; <b>arrow</b> keys to move the node"
-msgstr ""
-
-#: ../src/nodepath.cpp:4954 ../src/nodepath.cpp:4966
-msgid "Select a single object to edit its nodes or handles."
-msgstr ""
-
-#: ../src/nodepath.cpp:4958
-#, c-format
-msgid ""
-"<b>0</b> out of <b>%i</b> node selected. <b>Click</b>, <b>Shift+click</b>, "
-"or <b>drag around</b> nodes to select."
-msgid_plural ""
-"<b>0</b> out of <b>%i</b> nodes selected. <b>Click</b>, <b>Shift+click</b>, "
-"or <b>drag around</b> nodes to select."
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../src/nodepath.cpp:4964
-msgid "Drag the handles of the object to modify it."
-msgstr ""
-
-#: ../src/nodepath.cpp:4972
-#, c-format
-msgid "<b>%i</b> of <b>%i</b> node selected; %s. %s."
-msgid_plural "<b>%i</b> of <b>%i</b> nodes selected; %s. %s."
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../src/nodepath.cpp:4979
-#, c-format
-msgid ""
-"<b>%i</b> of <b>%i</b> node selected in <b>%i</b> of <b>%i</b> subpaths. %s."
-msgid_plural ""
-"<b>%i</b> of <b>%i</b> nodes selected in <b>%i</b> of <b>%i</b> subpaths. %s."
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../src/nodepath.cpp:4985
-#, c-format
-msgid "<b>%i</b> of <b>%i</b> node selected. %s."
-msgid_plural "<b>%i</b> of <b>%i</b> nodes selected. %s."
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../src/object-edit.cpp:439
-msgid ""
-"Adjust the <b>horizontal rounding</b> radius; with <b>Ctrl</b> to make the "
-"vertical radius the same"
-msgstr ""
-
-#: ../src/object-edit.cpp:443
-msgid ""
-"Adjust the <b>vertical rounding</b> radius; with <b>Ctrl</b> to make the "
-"horizontal radius the same"
-msgstr ""
-
-#: ../src/object-edit.cpp:447 ../src/object-edit.cpp:451
-msgid ""
-"Adjust the <b>width and height</b> of the rectangle; with <b>Ctrl</b> to "
-"lock ratio or stretch in one dimension only"
-msgstr ""
-
-#: ../src/object-edit.cpp:685 ../src/object-edit.cpp:688
-#: ../src/object-edit.cpp:691 ../src/object-edit.cpp:694
-msgid ""
-"Resize box in X/Y direction; with <b>Shift</b> along the Z axis; with "
-"<b>Ctrl</b> to constrain to the directions of edges or diagonals"
-msgstr ""
-
-#: ../src/object-edit.cpp:697 ../src/object-edit.cpp:700
-#: ../src/object-edit.cpp:703 ../src/object-edit.cpp:706
-msgid ""
-"Resize box along the Z axis; with <b>Shift</b> in X/Y direction; with "
-"<b>Ctrl</b> to constrain to the directions of edges or diagonals"
-msgstr ""
-
-#: ../src/object-edit.cpp:709
-msgid "Move the box in perspective"
-msgstr ""
-
-#: ../src/object-edit.cpp:927
-msgid "Adjust ellipse <b>width</b>, with <b>Ctrl</b> to make circle"
-msgstr ""
-
-#: ../src/object-edit.cpp:930
-msgid "Adjust ellipse <b>height</b>, with <b>Ctrl</b> to make circle"
-msgstr ""
-
-#: ../src/object-edit.cpp:933
-msgid ""
-"Position the <b>start point</b> of the arc or segment; with <b>Ctrl</b> to "
-"snap angle; drag <b>inside</b> the ellipse for arc, <b>outside</b> for "
-"segment"
-msgstr ""
-
-#: ../src/object-edit.cpp:937
-msgid ""
-"Position the <b>end point</b> of the arc or segment; with <b>Ctrl</b> to "
-"snap angle; drag <b>inside</b> the ellipse for arc, <b>outside</b> for "
-"segment"
-msgstr ""
-
-#: ../src/object-edit.cpp:1076
-msgid ""
-"Adjust the <b>tip radius</b> of the star or polygon; with <b>Shift</b> to "
-"round; with <b>Alt</b> to randomize"
-msgstr ""
-
-#: ../src/object-edit.cpp:1083
-msgid ""
-"Adjust the <b>base radius</b> of the star; with <b>Ctrl</b> to keep star "
-"rays radial (no skew); with <b>Shift</b> to round; with <b>Alt</b> to "
-"randomize"
-msgstr ""
-
-#: ../src/object-edit.cpp:1272
-msgid ""
-"Roll/unroll the spiral from <b>inside</b>; with <b>Ctrl</b> to snap angle; "
-"with <b>Alt</b> to converge/diverge"
-msgstr ""
-
-#: ../src/object-edit.cpp:1275
-msgid ""
-"Roll/unroll the spiral from <b>outside</b>; with <b>Ctrl</b> to snap angle; "
-"with <b>Shift</b> to scale/rotate"
-msgstr ""
-
-#: ../src/object-edit.cpp:1319
-msgid "Adjust the <b>offset distance</b>"
-msgstr ""
-
-#: ../src/object-edit.cpp:1355
-msgid "Drag to resize the <b>flowed text frame</b>"
-msgstr ""
-
-#: ../src/path-chemistry.cpp:49
-msgid "Select <b>object(s)</b> to combine."
-msgstr ""
-
-#: ../src/path-chemistry.cpp:53
-msgid "Combining paths..."
-msgstr ""
-
-#: ../src/path-chemistry.cpp:161
-msgid "Combine"
-msgstr ""
-
-#: ../src/path-chemistry.cpp:168
-msgid "<b>No path(s)</b> to combine in the selection."
-msgstr ""
-
-#: ../src/path-chemistry.cpp:180
-msgid "Select <b>path(s)</b> to break apart."
-msgstr ""
-
-#: ../src/path-chemistry.cpp:184
-msgid "Breaking apart paths..."
-msgstr ""
-
-#: ../src/path-chemistry.cpp:271
-msgid "Break apart"
-msgstr ""
-
-#: ../src/path-chemistry.cpp:273
-msgid "<b>No path(s)</b> to break apart in the selection."
-msgstr ""
-
-#: ../src/path-chemistry.cpp:285
-msgid "Select <b>object(s)</b> to convert to path."
-msgstr ""
-
-#: ../src/path-chemistry.cpp:291
-msgid "Converting objects to paths..."
-msgstr ""
-
-#: ../src/path-chemistry.cpp:313
-msgid "Object to path"
-msgstr ""
-
-#: ../src/path-chemistry.cpp:315
-msgid "<b>No objects</b> to convert to path in the selection."
-msgstr ""
-
-#: ../src/path-chemistry.cpp:551
-msgid "Select <b>path(s)</b> to reverse."
-msgstr ""
-
-#: ../src/path-chemistry.cpp:560
-msgid "Reversing paths..."
-msgstr ""
-
-#: ../src/path-chemistry.cpp:594
-msgid "Reverse path"
-msgstr ""
-
-#: ../src/path-chemistry.cpp:596
-msgid "<b>No paths</b> to reverse in the selection."
-msgstr ""
-
-#: ../src/pencil-context.cpp:269 ../src/pen-context.cpp:493
-msgid "Continuing selected path"
-msgstr ""
-
-#: ../src/pencil-context.cpp:277 ../src/pen-context.cpp:503
-msgid "Creating new path"
-msgstr ""
-
-#: ../src/pencil-context.cpp:280 ../src/pen-context.cpp:505
-msgid "Appending to selected path"
-msgstr ""
-
-#: ../src/pencil-context.cpp:381
-msgid "<b>Release</b> here to close and finish the path."
-msgstr ""
-
-#: ../src/pencil-context.cpp:387
-msgid "Drawing a freehand path"
-msgstr ""
-
-#: ../src/pencil-context.cpp:392
-msgid "<b>Drag</b> to continue the path from this point."
-msgstr ""
-
-#. Write curves to object
-#: ../src/pencil-context.cpp:466
-msgid "Finishing freehand"
-msgstr ""
-
-#: ../src/pencil-context.cpp:522 ../src/pen-context.cpp:253
-msgid "Drawing cancelled"
-msgstr ""
-
-#: ../src/pencil-context.cpp:572
-msgid ""
-"<b>Sketch mode</b>: holding <b>Alt</b> interpolates between sketched paths. "
-"Release <b>Alt</b> to finalize."
-msgstr ""
-
-#: ../src/pencil-context.cpp:600
-msgid "Finishing freehand sketch"
-msgstr ""
-
-#: ../src/pen-context.cpp:662
-msgid "<b>Click</b> or <b>click and drag</b> to close and finish the path."
-msgstr ""
-
-#: ../src/pen-context.cpp:672
-msgid ""
-"<b>Click</b> or <b>click and drag</b> to continue the path from this point."
-msgstr ""
-
-#: ../src/pen-context.cpp:1266
-#, c-format
-msgid ""
-"<b>Curve segment</b>: angle %3.2f&#176;, distance %s; with <b>Ctrl</b> to "
-"snap angle, <b>Enter</b> to finish the path"
-msgstr ""
-
-#: ../src/pen-context.cpp:1267
-#, c-format
-msgid ""
-"<b>Line segment</b>: angle %3.2f&#176;, distance %s; with <b>Ctrl</b> to "
-"snap angle, <b>Enter</b> to finish the path"
-msgstr ""
-
-#: ../src/pen-context.cpp:1285
-#, c-format
-msgid ""
-"<b>Curve handle</b>: angle %3.2f&#176;, length %s; with <b>Ctrl</b> to snap "
-"angle"
-msgstr ""
-
-#: ../src/pen-context.cpp:1307
-#, c-format
-msgid ""
-"<b>Curve handle, symmetric</b>: angle %3.2f&#176;, length %s; with <b>Ctrl</"
-"b> to snap angle, with <b>Shift</b> to move this handle only"
-msgstr ""
-
-#: ../src/pen-context.cpp:1308
-#, c-format
-msgid ""
-"<b>Curve handle</b>: angle %3.2f&#176;, length %s; with <b>Ctrl</b> to snap "
-"angle, with <b>Shift</b> to move this handle only"
-msgstr ""
-
-#: ../src/pen-context.cpp:1355
-msgid "Drawing finished"
-msgstr ""
-
-#: ../src/persp3d.cpp:335
-msgid "Toggle vanishing point"
-msgstr ""
-
-#: ../src/persp3d.cpp:346
-msgid "Toggle multiple vanishing points"
-msgstr ""
-
-#: ../src/preferences.cpp:129
-msgid ""
-"Inkscape will run with default settings, and new settings will not be saved. "
-msgstr ""
-
-#. the creation failed
-#. _reportError(Glib::ustring::compose(_("Cannot create profile directory %1."),
-#. Glib::filename_to_utf8(_prefs_dir)), not_saved);
-#: ../src/preferences.cpp:144
-#, c-format
-msgid "Cannot create profile directory %s."
-msgstr ""
-
-#. The profile dir is not actually a directory
-#. _reportError(Glib::ustring::compose(_("%1 is not a valid directory."),
-#. Glib::filename_to_utf8(_prefs_dir)), not_saved);
-#: ../src/preferences.cpp:162
-#, c-format
-msgid "%s is not a valid directory."
-msgstr ""
-
-#. The write failed.
-#. _reportError(Glib::ustring::compose(_("Failed to create the preferences file %1."),
-#. Glib::filename_to_utf8(_prefs_filename)), not_saved);
-#: ../src/preferences.cpp:173
-#, c-format
-msgid "Failed to create the preferences file %s."
-msgstr ""
-
-#: ../src/preferences.cpp:209
-#, c-format
-msgid "The preferences file %s is not a regular file."
-msgstr ""
-
-#: ../src/preferences.cpp:219
-#, c-format
-msgid "The preferences file %s could not be read."
-msgstr ""
-
-#: ../src/preferences.cpp:230
-#, c-format
-msgid "The preferences file %s is not a valid XML document."
-msgstr ""
-
-#: ../src/preferences.cpp:239
-#, c-format
-msgid "The file %s is not a valid Inkscape preferences file."
-msgstr ""
-
-#: ../src/preferences-skeleton.h:98
-msgid "Dip pen"
-msgstr ""
-
-#: ../src/preferences-skeleton.h:99
-msgid "Marker"
-msgstr ""
-
-#: ../src/preferences-skeleton.h:100
-msgid "Brush"
-msgstr ""
-
-#: ../src/preferences-skeleton.h:101
-msgid "Wiggly"
-msgstr ""
-
-#: ../src/preferences-skeleton.h:102
-msgid "Splotchy"
-msgstr ""
-
-#: ../src/preferences-skeleton.h:103
-msgid "Tracing"
-msgstr ""
-
-#: ../src/rdf.cpp:172
-msgid "CC Attribution"
-msgstr ""
-
-#: ../src/rdf.cpp:177
-msgid "CC Attribution-ShareAlike"
-msgstr ""
-
-#: ../src/rdf.cpp:182
-msgid "CC Attribution-NoDerivs"
-msgstr ""
-
-#: ../src/rdf.cpp:187
-msgid "CC Attribution-NonCommercial"
-msgstr ""
-
-#: ../src/rdf.cpp:192
-msgid "CC Attribution-NonCommercial-ShareAlike"
-msgstr ""
-
-#: ../src/rdf.cpp:197
-msgid "CC Attribution-NonCommercial-NoDerivs"
-msgstr ""
-
-#: ../src/rdf.cpp:202
-msgid "Public Domain"
-msgstr ""
-
-#: ../src/rdf.cpp:207
-msgid "FreeArt"
-msgstr ""
-
-#: ../src/rdf.cpp:212
-msgid "Open Font License"
-msgstr ""
-
-#: ../src/rdf.cpp:229
-msgid "Title"
-msgstr ""
-
-#: ../src/rdf.cpp:230
-msgid "Name by which this document is formally known."
-msgstr ""
-
-#: ../src/rdf.cpp:232
-msgid "Date"
-msgstr ""
-
-#: ../src/rdf.cpp:233
-msgid "Date associated with the creation of this document (YYYY-MM-DD)."
-msgstr ""
-
-#: ../src/rdf.cpp:235
-msgid "Format"
-msgstr ""
-
-#: ../src/rdf.cpp:236
-msgid "The physical or digital manifestation of this document (MIME type)."
-msgstr ""
-
-#: ../src/rdf.cpp:239
-msgid "Type of document (DCMI Type)."
-msgstr ""
-
-#: ../src/rdf.cpp:242
-msgid "Creator"
-msgstr ""
-
-#: ../src/rdf.cpp:243
-msgid ""
-"Name of entity primarily responsible for making the content of this document."
-msgstr ""
-
-#: ../src/rdf.cpp:245
-msgid "Rights"
-msgstr ""
-
-#: ../src/rdf.cpp:246
-msgid ""
-"Name of entity with rights to the Intellectual Property of this document."
-msgstr ""
-
-#: ../src/rdf.cpp:248
-msgid "Publisher"
-msgstr ""
-
-#: ../src/rdf.cpp:249
-msgid "Name of entity responsible for making this document available."
-msgstr ""
-
-#: ../src/rdf.cpp:252
-msgid "Identifier"
-msgstr ""
-
-#: ../src/rdf.cpp:253
-msgid "Unique URI to reference this document."
-msgstr ""
-
-#: ../src/rdf.cpp:255 ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1438
-msgid "Source"
-msgstr ""
-
-#: ../src/rdf.cpp:256
-msgid "Unique URI to reference the source of this document."
-msgstr ""
-
-#: ../src/rdf.cpp:258
-msgid "Relation"
-msgstr ""
-
-#: ../src/rdf.cpp:259
-msgid "Unique URI to a related document."
-msgstr ""
-
-#: ../src/rdf.cpp:261
-msgid "Language"
-msgstr ""
-
-#: ../src/rdf.cpp:262
-msgid ""
-"Two-letter language tag with optional subtags for the language of this "
-"document.  (e.g. 'en-GB')"
-msgstr ""
-
-#: ../src/rdf.cpp:264
-msgid "Keywords"
-msgstr ""
-
-#: ../src/rdf.cpp:265
-msgid ""
-"The topic of this document as comma-separated key words, phrases, or "
-"classifications."
-msgstr ""
-
-#. TRANSLATORS: "Coverage": the spatial or temporal characteristics of the content.
-#. For info, see Appendix D of http://www.w3.org/TR/1998/WD-rdf-schema-19980409/
-#: ../src/rdf.cpp:269
-msgid "Coverage"
-msgstr ""
-
-#: ../src/rdf.cpp:270
-msgid "Extent or scope of this document."
-msgstr ""
-
-#: ../src/rdf.cpp:273 ../src/ui/widget/page-sizer.cpp:239
-msgid "Description"
-msgstr ""
-
-#: ../src/rdf.cpp:274
-msgid "A short account of the content of this document."
-msgstr ""
-
-#. FIXME: need to handle 1 agent per line of input
-#: ../src/rdf.cpp:278
-msgid "Contributors"
-msgstr ""
-
-#: ../src/rdf.cpp:279
-msgid ""
-"Names of entities responsible for making contributions to the content of "
-"this document."
-msgstr ""
-
-#. TRANSLATORS: URL to a page that defines the license for the document
-#: ../src/rdf.cpp:283
-msgid "URI"
-msgstr ""
-
-#. TRANSLATORS: this is where you put a URL to a page that defines the license
-#: ../src/rdf.cpp:285
-msgid "URI to this document's license's namespace definition."
-msgstr ""
-
-#. TRANSLATORS: fragment of XML representing the license of the document
-#: ../src/rdf.cpp:289
-msgid "Fragment"
-msgstr ""
-
-#: ../src/rdf.cpp:290
-msgid "XML fragment for the RDF 'License' section."
-msgstr ""
-
-#: ../src/rect-context.cpp:361
-msgid ""
-"<b>Ctrl</b>: make square or integer-ratio rect, lock a rounded corner "
-"circular"
-msgstr ""
-
-#: ../src/rect-context.cpp:508
-#, c-format
-msgid ""
-"<b>Rectangle</b>: %s &#215; %s (constrained to ratio %d:%d); with <b>Shift</"
-"b> to draw around the starting point"
-msgstr ""
-
-#: ../src/rect-context.cpp:511
-#, c-format
-msgid ""
-"<b>Rectangle</b>: %s &#215; %s (constrained to golden ratio 1.618 : 1); with "
-"<b>Shift</b> to draw around the starting point"
-msgstr ""
-
-#: ../src/rect-context.cpp:513
-#, c-format
-msgid ""
-"<b>Rectangle</b>: %s &#215; %s (constrained to golden ratio 1 : 1.618); with "
-"<b>Shift</b> to draw around the starting point"
-msgstr ""
-
-#: ../src/rect-context.cpp:517
-#, c-format
-msgid ""
-"<b>Rectangle</b>: %s &#215; %s; with <b>Ctrl</b> to make square or integer-"
-"ratio rectangle; with <b>Shift</b> to draw around the starting point"
-msgstr ""
-
-#: ../src/rect-context.cpp:542
-msgid "Create rectangle"
-msgstr ""
-
-#: ../src/select-context.cpp:233
-msgid "Move canceled."
-msgstr ""
-
-#: ../src/select-context.cpp:241
-msgid "Selection canceled."
-msgstr ""
-
-#: ../src/select-context.cpp:555
-msgid ""
-"<b>Draw over</b> objects to select them; release <b>Alt</b> to switch to "
-"rubberband selection"
-msgstr ""
-
-#: ../src/select-context.cpp:557
-msgid ""
-"<b>Drag around</b> objects to select them; press <b>Alt</b> to switch to "
-"touch selection"
-msgstr ""
-
-#: ../src/select-context.cpp:721
-msgid "<b>Ctrl</b>: click to select in groups; drag to move hor/vert"
-msgstr ""
-
-#: ../src/select-context.cpp:722
-msgid "<b>Shift</b>: click to toggle select; drag for rubberband selection"
-msgstr ""
-
-#: ../src/select-context.cpp:723
-msgid ""
-"<b>Alt</b>: click to select under; drag to move selected or select by touch"
-msgstr ""
-
-#: ../src/select-context.cpp:898
-msgid "Selected object is not a group. Cannot enter."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:195
-msgid "Delete text"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:203
-msgid "<b>Nothing</b> was deleted."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:221 ../src/text-context.cpp:995
-#: ../src/ui/dialog/swatches.cpp:471 ../src/widgets/toolbox.cpp:1304
-#: ../src/widgets/toolbox.cpp:5752
-msgid "Delete"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:249
-msgid "Select <b>object(s)</b> to duplicate."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:341
-msgid "Delete all"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:464
-msgid "Select <b>some objects</b> to group."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:537 ../src/selection-describer.cpp:53
-msgid "Group"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:551
-msgid "Select a <b>group</b> to ungroup."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:592
-msgid "<b>No groups</b> to ungroup in the selection."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:598 ../src/sp-item-group.cpp:516
-msgid "Ungroup"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:688
-msgid "Select <b>object(s)</b> to raise."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:694 ../src/selection-chemistry.cpp:756
-#: ../src/selection-chemistry.cpp:790 ../src/selection-chemistry.cpp:854
-msgid ""
-"You cannot raise/lower objects from <b>different groups</b> or <b>layers</b>."
-msgstr ""
-
-#. TRANSLATORS: only translate "string" in "context|string".
-#. For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS
-#. "Raise" means "to raise an object" in the undo history
-#: ../src/selection-chemistry.cpp:736
-msgid "undo_action|Raise"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:748
-msgid "Select <b>object(s)</b> to raise to top."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:771
-msgid "Raise to top"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:784
-msgid "Select <b>object(s)</b> to lower."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:834
-msgid "Lower"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:846
-msgid "Select <b>object(s)</b> to lower to bottom."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:881
-msgid "Lower to bottom"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:888
-msgid "Nothing to undo."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:895
-msgid "Nothing to redo."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:955
-msgid "Paste"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:962
-msgid "Paste style"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:971
-msgid "Paste live path effect"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:991
-msgid "Select <b>object(s)</b> to remove live path effects from."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1003
-msgid "Remove live path effect"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1014
-msgid "Select <b>object(s)</b> to remove filters from."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1024
-#: ../src/ui/dialog/filter-effects-dialog.cpp:1336
-msgid "Remove filter"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1033
-msgid "Paste size"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1041
-msgid "Paste size separately"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1050
-msgid "Select <b>object(s)</b> to move to the layer above."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1076
-msgid "Raise to next layer"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1083
-msgid "No more layers above."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1095
-msgid "Select <b>object(s)</b> to move to the layer below."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1121
-msgid "Lower to previous layer"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1128
-msgid "No more layers below."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1315
-msgid "Remove transform"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1418
-msgid "Rotate 90&#176; CCW"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1418
-msgid "Rotate 90&#176; CW"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1439 ../src/seltrans.cpp:534
-#: ../src/ui/dialog/transformation.cpp:760
-msgid "Rotate"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1486
-msgid "Rotate by pixels"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1541
-msgid "Scale by whole factor"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1556
-msgid "Move vertically"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1559
-msgid "Move horizontally"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1562 ../src/selection-chemistry.cpp:1588
-#: ../src/seltrans.cpp:528 ../src/ui/dialog/transformation.cpp:681
-msgid "Move"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1582
-msgid "Move vertically by pixels"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1585
-msgid "Move horizontally by pixels"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1713
-msgid "The selection has no applied path effect."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1760
-msgid "The selection has no applied clip path."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1762
-msgid "The selection has no applied mask."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1919
-msgid "action|Clone"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1935
-msgid "Select <b>clones</b> to relink."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1942
-msgid "Copy an <b>object</b> to clipboard to relink clones to."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1966
-msgid "<b>No clones to relink</b> in the selection."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1969
-msgid "Relink clone"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1983
-msgid "Select <b>clones</b> to unlink."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:2032
-msgid "<b>No clones to unlink</b> in the selection."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:2036
-msgid "Unlink clone"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:2049
-msgid ""
-"Select a <b>clone</b> to go to its original. Select a <b>linked offset</b> "
-"to go to its source. Select a <b>text on path</b> to go to the path. Select "
-"a <b>flowed text</b> to go to its frame."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:2072
-msgid ""
-"<b>Cannot find</b> the object to select (orphaned clone, offset, textpath, "
-"flowed text?)"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:2078
-msgid ""
-"The object you're trying to select is <b>not visible</b> (it is in &lt;"
-"defs&gt;)"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:2124
-msgid "Select <b>object(s)</b> to convert to marker."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:2192
-msgid "Objects to marker"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:2220
-msgid "Select <b>object(s)</b> to convert to guides."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:2232
-msgid "Objects to guides"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:2248
-msgid "Select <b>object(s)</b> to convert to pattern."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:2336
-msgid "Objects to pattern"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:2352
-msgid "Select an <b>object with pattern fill</b> to extract objects from."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:2405
-msgid "<b>No pattern fills</b> in the selection."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:2408
-msgid "Pattern to objects"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:2493
-msgid "Select <b>object(s)</b> to make a bitmap copy."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:2497
-msgid "Rendering bitmap..."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:2676
-msgid "Create bitmap"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:2708
-msgid "Select <b>object(s)</b> to create clippath or mask from."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:2711
-msgid "Select mask object and <b>object(s)</b> to apply clippath or mask to."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:2818
-msgid "Set clipping path"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:2820
-msgid "Set mask"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:2833
-msgid "Select <b>object(s)</b> to remove clippath or mask from."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:2906
-msgid "Release clipping path"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:2908
-msgid "Release mask"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:2924
-msgid "Select <b>object(s)</b> to fit canvas to."
-msgstr ""
-
-#. Fit Page
-#: ../src/selection-chemistry.cpp:2944 ../src/verbs.cpp:2723
-msgid "Fit Page to Selection"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:2969 ../src/verbs.cpp:2725
-msgid "Fit Page to Drawing"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:2985 ../src/verbs.cpp:2727
-msgid "Fit Page to Selection or Drawing"
-msgstr ""
-
-#. TRANSLATORS: only translate "string" in "context|string".
-#. For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS
-#. "Link" means internet link (anchor)
-#: ../src/selection-describer.cpp:45
-msgid "web|Link"
-msgstr ""
-
-#: ../src/selection-describer.cpp:47
-msgid "Circle"
-msgstr ""
-
-#. ellipse
-#: ../src/selection-describer.cpp:49 ../src/selection-describer.cpp:76
-#: ../src/ui/dialog/inkscape-preferences.cpp:474 ../src/verbs.cpp:2510
-#: ../src/widgets/toolbox.cpp:3890
-msgid "Ellipse"
-msgstr ""
-
-#: ../src/selection-describer.cpp:51
-msgid "Flowed text"
-msgstr ""
-
-#: ../src/selection-describer.cpp:57
-msgid "Line"
-msgstr ""
-
-#: ../src/selection-describer.cpp:59
-msgid "Path"
-msgstr ""
-
-#: ../src/selection-describer.cpp:61 ../src/widgets/toolbox.cpp:2726
-msgid "Polygon"
-msgstr ""
-
-#: ../src/selection-describer.cpp:63
-msgid "Polyline"
-msgstr ""
-
-#. Rectangle
-#: ../src/selection-describer.cpp:65
-#: ../src/ui/dialog/inkscape-preferences.cpp:464 ../src/verbs.cpp:2506
-msgid "Rectangle"
-msgstr ""
-
-#. 3D box
-#: ../src/selection-describer.cpp:67
-#: ../src/ui/dialog/inkscape-preferences.cpp:469 ../src/verbs.cpp:2508
-msgid "3D Box"
-msgstr ""
-
-#. TRANSLATORS: only translate "string" in "context|string".
-#. For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS
-#. "Clone" is a noun, type of object
-#: ../src/selection-describer.cpp:74
-msgid "object|Clone"
-msgstr ""
-
-#: ../src/selection-describer.cpp:78
-msgid "Offset path"
-msgstr ""
-
-#. spiral
-#: ../src/selection-describer.cpp:80
-#: ../src/ui/dialog/inkscape-preferences.cpp:482 ../src/verbs.cpp:2514
-msgid "Spiral"
-msgstr ""
-
-#. star
-#: ../src/selection-describer.cpp:82
-#: ../src/ui/dialog/inkscape-preferences.cpp:478 ../src/verbs.cpp:2512
-#: ../src/widgets/toolbox.cpp:2733
-msgid "Star"
-msgstr ""
-
-#: ../src/selection-describer.cpp:128
-msgid "Click selection to toggle scale/rotation handles"
-msgstr ""
-
-#. no items
-#: ../src/selection-describer.cpp:130
-msgid ""
-"No objects selected. Click, Shift+click, or drag around objects to select."
-msgstr ""
-
-#: ../src/selection-describer.cpp:139
-msgid "root"
-msgstr ""
-
-#: ../src/selection-describer.cpp:151
-#, c-format
-msgid "layer <b>%s</b>"
-msgstr ""
-
-#: ../src/selection-describer.cpp:153
-#, c-format
-msgid "layer <b><i>%s</i></b>"
-msgstr ""
-
-#: ../src/selection-describer.cpp:162
-#, c-format
-msgid "<i>%s</i>"
-msgstr ""
-
-#: ../src/selection-describer.cpp:171
-#, c-format
-msgid " in %s"
-msgstr ""
-
-#: ../src/selection-describer.cpp:173
-#, c-format
-msgid " in group %s (%s)"
-msgstr ""
-
-#: ../src/selection-describer.cpp:175
-#, c-format
-msgid " in <b>%i</b> parents (%s)"
-msgid_plural " in <b>%i</b> parents (%s)"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../src/selection-describer.cpp:178
-#, c-format
-msgid " in <b>%i</b> layers"
-msgid_plural " in <b>%i</b> layers"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../src/selection-describer.cpp:188
-msgid "Use <b>Shift+D</b> to look up original"
-msgstr ""
-
-#: ../src/selection-describer.cpp:192
-msgid "Use <b>Shift+D</b> to look up path"
-msgstr ""
-
-#: ../src/selection-describer.cpp:196
-msgid "Use <b>Shift+D</b> to look up frame"
-msgstr ""
-
-#. this is only used with 2 or more objects
-#: ../src/selection-describer.cpp:211 ../src/tweak-context.cpp:202
-#, c-format
-msgid "<b>%i</b> object selected"
-msgid_plural "<b>%i</b> objects selected"
-msgstr[0] ""
-msgstr[1] ""
-
-#. this is only used with 2 or more objects
-#: ../src/selection-describer.cpp:216
-#, c-format
-msgid "<b>%i</b> object of type <b>%s</b>"
-msgid_plural "<b>%i</b> objects of type <b>%s</b>"
-msgstr[0] ""
-msgstr[1] ""
-
-#. this is only used with 2 or more objects
-#: ../src/selection-describer.cpp:221
-#, c-format
-msgid "<b>%i</b> object of types <b>%s</b>, <b>%s</b>"
-msgid_plural "<b>%i</b> objects of types <b>%s</b>, <b>%s</b>"
-msgstr[0] ""
-msgstr[1] ""
-
-#. this is only used with 2 or more objects
-#: ../src/selection-describer.cpp:226
-#, c-format
-msgid "<b>%i</b> object of types <b>%s</b>, <b>%s</b>, <b>%s</b>"
-msgid_plural "<b>%i</b> objects of types <b>%s</b>, <b>%s</b>, <b>%s</b>"
-msgstr[0] ""
-msgstr[1] ""
-
-#. this is only used with 2 or more objects
-#: ../src/selection-describer.cpp:231
-#, c-format
-msgid "<b>%i</b> object of <b>%i</b> types"
-msgid_plural "<b>%i</b> objects of <b>%i</b> types"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../src/selection-describer.cpp:236
-#, c-format
-msgid "%s%s. %s."
-msgstr ""
-
-#: ../src/seltrans.cpp:537 ../src/ui/dialog/transformation.cpp:819
-msgid "Skew"
-msgstr ""
-
-#: ../src/seltrans.cpp:549
-msgid "Set center"
-msgstr ""
-
-#: ../src/seltrans.cpp:646
-msgid ""
-"<b>Center</b> of rotation and skewing: drag to reposition; scaling with "
-"Shift also uses this center"
-msgstr ""
-
-#: ../src/seltrans.cpp:673
-msgid ""
-"<b>Squeeze or stretch</b> selection; with <b>Ctrl</b> to scale uniformly; "
-"with <b>Shift</b> to scale around rotation center"
-msgstr ""
-
-#: ../src/seltrans.cpp:674
-msgid ""
-"<b>Scale</b> selection; with <b>Ctrl</b> to scale uniformly; with <b>Shift</"
-"b> to scale around rotation center"
-msgstr ""
-
-#: ../src/seltrans.cpp:678
-msgid ""
-"<b>Skew</b> selection; with <b>Ctrl</b> to snap angle; with <b>Shift</b> to "
-"skew around the opposite side"
-msgstr ""
-
-#: ../src/seltrans.cpp:679
-msgid ""
-"<b>Rotate</b> selection; with <b>Ctrl</b> to snap angle; with <b>Shift</b> "
-"to rotate around the opposite corner"
-msgstr ""
-
-#: ../src/seltrans.cpp:813
-msgid "Reset center"
-msgstr ""
-
-#: ../src/seltrans.cpp:1058 ../src/seltrans.cpp:1157
-#, c-format
-msgid "<b>Scale</b>: %0.2f%% x %0.2f%%; with <b>Ctrl</b> to lock ratio"
-msgstr ""
-
-#. TRANSLATORS: don't modify the first ";"
-#. (it will NOT be displayed as ";" - only the second one will be)
-#: ../src/seltrans.cpp:1269
-#, c-format
-msgid "<b>Skew</b>: %0.2f&#176;; with <b>Ctrl</b> to snap angle"
-msgstr ""
-
-#. TRANSLATORS: don't modify the first ";"
-#. (it will NOT be displayed as ";" - only the second one will be)
-#: ../src/seltrans.cpp:1329
-#, c-format
-msgid "<b>Rotate</b>: %0.2f&#176;; with <b>Ctrl</b> to snap angle"
-msgstr ""
-
-#: ../src/seltrans.cpp:1371
-#, c-format
-msgid "Move <b>center</b> to %s, %s"
-msgstr ""
-
-#: ../src/seltrans.cpp:1541
-#, c-format
-msgid ""
-"<b>Move</b> by %s, %s; with <b>Ctrl</b> to restrict to horizontal/vertical; "
-"with <b>Shift</b> to disable snapping"
-msgstr ""
-
-#: ../src/shape-editor.cpp:472
-msgid "Drag curve"
-msgstr ""
-
-#: ../src/sp-anchor.cpp:178
-#, c-format
-msgid "<b>Link</b> to %s"
-msgstr ""
-
-#: ../src/sp-anchor.cpp:182
-msgid "<b>Link</b> without URI"
-msgstr ""
-
-#: ../src/sp-ellipse.cpp:502 ../src/sp-ellipse.cpp:879
-msgid "<b>Ellipse</b>"
-msgstr ""
-
-#: ../src/sp-ellipse.cpp:643
-msgid "<b>Circle</b>"
-msgstr ""
-
-#: ../src/sp-ellipse.cpp:874
-msgid "<b>Segment</b>"
-msgstr ""
-
-#: ../src/sp-ellipse.cpp:876
-msgid "<b>Arc</b>"
-msgstr ""
-
-#. TRANSLATORS: "Flow region" is an area where text is allowed to flow
-#: ../src/sp-flowregion.cpp:270
-#, c-format
-msgid "Flow region"
-msgstr ""
-
-#. TRANSLATORS: A region "cut out of" a flow region; text is not allowed to flow inside the
-#. * flow excluded region.  flowRegionExclude in SVG 1.2: see
-#. * http://www.w3.org/TR/2004/WD-SVG12-20041027/flow.html#flowRegion-elem and
-#. * http://www.w3.org/TR/2004/WD-SVG12-20041027/flow.html#flowRegionExclude-elem.
-#: ../src/sp-flowregion.cpp:487
-#, c-format
-msgid "Flow excluded region"
-msgstr ""
-
-#: ../src/sp-flowtext.cpp:376
-#, c-format
-msgid "<b>Flowed text</b> (%d character)"
-msgid_plural "<b>Flowed text</b> (%d characters)"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../src/sp-flowtext.cpp:378
-#, c-format
-msgid "<b>Linked flowed text</b> (%d character)"
-msgid_plural "<b>Linked flowed text</b> (%d characters)"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../src/sp-guide.cpp:287
-msgid "Guides Around Page"
-msgstr ""
-
-#: ../src/sp-guide.cpp:421
-msgid ""
-"<b>Shift+drag</b> to rotate, <b>Ctrl+drag</b> to move origin, <b>Del</b> to "
-"delete"
-msgstr ""
-
-#: ../src/sp-guide.cpp:426
-#, c-format
-msgid "vertical, at %s"
-msgstr ""
-
-#: ../src/sp-guide.cpp:429
-#, c-format
-msgid "horizontal, at %s"
-msgstr ""
-
-#: ../src/sp-guide.cpp:434
-#, c-format
-msgid "at %d degrees, through (%s,%s)"
-msgstr ""
-
-#: ../src/sp-image.cpp:1128
-msgid "embedded"
-msgstr ""
-
-#: ../src/sp-image.cpp:1136
-#, c-format
-msgid "<b>Image with bad reference</b>: %s"
-msgstr ""
-
-#: ../src/sp-image.cpp:1137
-#, c-format
-msgid "<b>Image</b> %d &#215; %d: %s"
-msgstr ""
-
-#: ../src/spiral-context.cpp:319
-msgid "<b>Ctrl</b>: snap angle"
-msgstr ""
-
-#: ../src/spiral-context.cpp:321
-msgid "<b>Alt</b>: lock spiral radius"
-msgstr ""
-
-#: ../src/spiral-context.cpp:453
-#, c-format
-msgid ""
-"<b>Spiral</b>: radius %s, angle %5g&#176;; with <b>Ctrl</b> to snap angle"
-msgstr ""
-
-#: ../src/spiral-context.cpp:479
-msgid "Create spiral"
-msgstr ""
-
-#: ../src/sp-item.cpp:1035
-msgid "Object"
-msgstr ""
-
-#: ../src/sp-item.cpp:1052
-#, c-format
-msgid "%s; <i>clipped</i>"
-msgstr ""
-
-#: ../src/sp-item.cpp:1057
-#, c-format
-msgid "%s; <i>masked</i>"
-msgstr ""
-
-#: ../src/sp-item.cpp:1065
-#, c-format
-msgid "%s; <i>filtered (%s)</i>"
-msgstr ""
-
-#: ../src/sp-item.cpp:1067
-#, c-format
-msgid "%s; <i>filtered</i>"
-msgstr ""
-
-#: ../src/sp-item-group.cpp:761
-#, c-format
-msgid "<b>Group</b> of <b>%d</b> object"
-msgid_plural "<b>Group</b> of <b>%d</b> objects"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../src/sp-line.cpp:194
-msgid "<b>Line</b>"
-msgstr ""
-
-#: ../src/splivarot.cpp:66 ../src/splivarot.cpp:72
-msgid "Union"
-msgstr ""
-
-#: ../src/splivarot.cpp:78
-msgid "Intersection"
-msgstr ""
-
-#: ../src/splivarot.cpp:84 ../src/splivarot.cpp:90
-msgid "Difference"
-msgstr ""
-
-#: ../src/splivarot.cpp:96
-msgid "Exclusion"
-msgstr ""
-
-#: ../src/splivarot.cpp:101
-msgid "Division"
-msgstr ""
-
-#: ../src/splivarot.cpp:106
-msgid "Cut path"
-msgstr ""
-
-#: ../src/splivarot.cpp:121
-msgid "Select <b>at least 2 paths</b> to perform a boolean operation."
-msgstr ""
-
-#: ../src/splivarot.cpp:125
-msgid "Select <b>at least 1 path</b> to perform a boolean union."
-msgstr ""
-
-#: ../src/splivarot.cpp:131
-msgid ""
-"Select <b>exactly 2 paths</b> to perform difference, division, or path cut."
-msgstr ""
-
-#: ../src/splivarot.cpp:147 ../src/splivarot.cpp:162
-msgid ""
-"Unable to determine the <b>z-order</b> of the objects selected for "
-"difference, XOR, division, or path cut."
-msgstr ""
-
-#: ../src/splivarot.cpp:192
-msgid ""
-"One of the objects is <b>not a path</b>, cannot perform boolean operation."
-msgstr ""
-
-#: ../src/splivarot.cpp:633
-msgid "Select <b>stroked path(s)</b> to convert stroke to path."
-msgstr ""
-
-#: ../src/splivarot.cpp:976
-msgid "Convert stroke to path"
-msgstr ""
-
-#. TRANSLATORS: "to outline" means "to convert stroke to path"
-#: ../src/splivarot.cpp:979
-msgid "<b>No stroked paths</b> in the selection."
-msgstr ""
-
-#: ../src/splivarot.cpp:1062
-msgid "Selected object is <b>not a path</b>, cannot inset/outset."
-msgstr ""
-
-#: ../src/splivarot.cpp:1181 ../src/splivarot.cpp:1250
-msgid "Create linked offset"
-msgstr ""
-
-#: ../src/splivarot.cpp:1182 ../src/splivarot.cpp:1251
-msgid "Create dynamic offset"
-msgstr ""
-
-#: ../src/splivarot.cpp:1276
-msgid "Select <b>path(s)</b> to inset/outset."
-msgstr ""
-
-#: ../src/splivarot.cpp:1494
-msgid "Outset path"
-msgstr ""
-
-#: ../src/splivarot.cpp:1494
-msgid "Inset path"
-msgstr ""
-
-#: ../src/splivarot.cpp:1496
-msgid "<b>No paths</b> to inset/outset in the selection."
-msgstr ""
-
-#: ../src/splivarot.cpp:1674
-msgid "Simplifying paths (separately):"
-msgstr ""
-
-#: ../src/splivarot.cpp:1676
-msgid "Simplifying paths:"
-msgstr ""
-
-#: ../src/splivarot.cpp:1713
-#, c-format
-msgid "%s <b>%d</b> of <b>%d</b> paths simplified..."
-msgstr ""
-
-#: ../src/splivarot.cpp:1725
-#, c-format
-msgid "<b>%d</b> paths simplified."
-msgstr ""
-
-#: ../src/splivarot.cpp:1739
-msgid "Select <b>path(s)</b> to simplify."
-msgstr ""
-
-#: ../src/splivarot.cpp:1753
-msgid "Simplify"
-msgstr ""
-
-#: ../src/splivarot.cpp:1755
-msgid "<b>No paths</b> to simplify in the selection."
-msgstr ""
-
-#: ../src/sp-lpe-item.cpp:363
-msgid "An exception occurred during execution of the Path Effect."
-msgstr ""
-
-#. TRANSLATORS COMMENT: %s is either "outset" or "inset" depending on sign
-#: ../src/sp-offset.cpp:426
-#, c-format
-msgid "<b>Linked offset</b>, %s by %f pt"
-msgstr ""
-
-#: ../src/sp-offset.cpp:427 ../src/sp-offset.cpp:431
-msgid "outset"
-msgstr ""
-
-#: ../src/sp-offset.cpp:427 ../src/sp-offset.cpp:431
-msgid "inset"
-msgstr ""
-
-#. TRANSLATORS COMMENT: %s is either "outset" or "inset" depending on sign
-#: ../src/sp-offset.cpp:430
-#, c-format
-msgid "<b>Dynamic offset</b>, %s by %f pt"
-msgstr ""
-
-#: ../src/sp-path.cpp:156
-#, c-format
-msgid "<b>Path</b> (%i node, path effect: %s)"
-msgid_plural "<b>Path</b> (%i nodes, path effect: %s)"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../src/sp-path.cpp:159
-#, c-format
-msgid "<b>Path</b> (%i node)"
-msgid_plural "<b>Path</b> (%i nodes)"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../src/sp-polygon.cpp:226
-msgid "<b>Polygon</b>"
-msgstr ""
-
-#: ../src/sp-polyline.cpp:177
-msgid "<b>Polyline</b>"
-msgstr ""
-
-#: ../src/sp-rect.cpp:223
-msgid "<b>Rectangle</b>"
-msgstr ""
-
-#. TRANSLATORS: since turn count isn't an integer, please adjust the
-#. string as needed to deal with an localized plural forms.
-#: ../src/sp-spiral.cpp:325
-#, c-format
-msgid "<b>Spiral</b> with %3f turns"
-msgstr ""
-
-#: ../src/sp-star.cpp:309
-#, c-format
-msgid "<b>Star</b> with %d vertex"
-msgid_plural "<b>Star</b> with %d vertices"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../src/sp-star.cpp:313
-#, c-format
-msgid "<b>Polygon</b> with %d vertex"
-msgid_plural "<b>Polygon</b> with %d vertices"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../src/sp-switch.cpp:100
-#, c-format
-msgid "<b>Conditional group</b> of <b>%d</b> object"
-msgid_plural "<b>Conditional group</b> of <b>%d</b> objects"
-msgstr[0] ""
-msgstr[1] ""
-
-#. TRANSLATORS: For description of font with no name.
-#: ../src/sp-text.cpp:419
-msgid "&lt;no name found&gt;"
-msgstr ""
-
-#: ../src/sp-text.cpp:425
-#, c-format
-msgid "<b>Text on path</b> (%s, %s)"
-msgstr ""
-
-#: ../src/sp-text.cpp:426
-#, c-format
-msgid "<b>Text</b> (%s, %s)"
-msgstr ""
-
-#: ../src/sp-tref.cpp:368
-#, c-format
-msgid "<b>Cloned character data</b>%s%s"
-msgstr ""
-
-#: ../src/sp-tref.cpp:369
-msgid " from "
-msgstr ""
-
-#: ../src/sp-tref.cpp:374
-msgid "<b>Orphaned cloned character data</b>"
-msgstr ""
-
-#: ../src/sp-tspan.cpp:284
-msgid "<b>Text span</b>"
-msgstr ""
-
-#. TRANSLATORS: Used for statusbar description for long <use> chains:
-#. * "Clone of: Clone of: ... in Layer 1".
-#: ../src/sp-use.cpp:327
-msgid "..."
-msgstr ""
-
-#: ../src/sp-use.cpp:335
-#, c-format
-msgid "<b>Clone</b> of: %s"
-msgstr ""
-
-#: ../src/sp-use.cpp:339
-msgid "<b>Orphaned clone</b>"
-msgstr ""
-
-#: ../src/star-context.cpp:333
-msgid "<b>Ctrl</b>: snap angle; keep rays radial"
-msgstr ""
-
-#: ../src/star-context.cpp:464
-#, c-format
-msgid ""
-"<b>Polygon</b>: radius %s, angle %5g&#176;; with <b>Ctrl</b> to snap angle"
-msgstr ""
-
-#: ../src/star-context.cpp:465
-#, c-format
-msgid "<b>Star</b>: radius %s, angle %5g&#176;; with <b>Ctrl</b> to snap angle"
-msgstr ""
-
-#: ../src/star-context.cpp:494
-msgid "Create star"
-msgstr ""
-
-#: ../src/text-chemistry.cpp:104
-msgid "Select <b>a text and a path</b> to put text on path."
-msgstr ""
-
-#: ../src/text-chemistry.cpp:109
-msgid ""
-"This text object is <b>already put on a path</b>. Remove it from the path "
-"first. Use <b>Shift+D</b> to look up its path."
-msgstr ""
-
-#. rect is the only SPShape which is not <path> yet, and thus SVG forbids us from putting text on it
-#: ../src/text-chemistry.cpp:115
-msgid ""
-"You cannot put text on a rectangle in this version. Convert rectangle to "
-"path first."
-msgstr ""
-
-#: ../src/text-chemistry.cpp:125
-msgid "The flowed text(s) must be <b>visible</b> in order to be put on a path."
-msgstr ""
-
-#: ../src/text-chemistry.cpp:192 ../src/verbs.cpp:2364
-msgid "Put text on path"
-msgstr ""
-
-#: ../src/text-chemistry.cpp:204
-msgid "Select <b>a text on path</b> to remove it from path."
-msgstr ""
-
-#: ../src/text-chemistry.cpp:226
-msgid "<b>No texts-on-paths</b> in the selection."
-msgstr ""
-
-#: ../src/text-chemistry.cpp:229 ../src/verbs.cpp:2366
-msgid "Remove text from path"
-msgstr ""
-
-#: ../src/text-chemistry.cpp:269 ../src/text-chemistry.cpp:290
-msgid "Select <b>text(s)</b> to remove kerns from."
-msgstr ""
-
-#: ../src/text-chemistry.cpp:293
-msgid "Remove manual kerns"
-msgstr ""
-
-#: ../src/text-chemistry.cpp:313
-msgid ""
-"Select <b>a text</b> and one or more <b>paths or shapes</b> to flow text "
-"into frame."
-msgstr ""
-
-#: ../src/text-chemistry.cpp:381
-msgid "Flow text into shape"
-msgstr ""
-
-#: ../src/text-chemistry.cpp:403
-msgid "Select <b>a flowed text</b> to unflow it."
-msgstr ""
-
-#: ../src/text-chemistry.cpp:477
-msgid "Unflow flowed text"
-msgstr ""
-
-#: ../src/text-chemistry.cpp:489
-msgid "Select <b>flowed text(s)</b> to convert."
-msgstr ""
-
-#: ../src/text-chemistry.cpp:507
-msgid "The flowed text(s) must be <b>visible</b> in order to be converted."
-msgstr ""
-
-#: ../src/text-chemistry.cpp:535
-msgid "Convert flowed text to text"
-msgstr ""
-
-#: ../src/text-chemistry.cpp:540
-msgid "<b>No flowed text(s)</b> to convert in the selection."
-msgstr ""
-
-#: ../src/text-context.cpp:441
-msgid "<b>Click</b> to edit the text, <b>drag</b> to select part of the text."
-msgstr ""
-
-#: ../src/text-context.cpp:443
-msgid ""
-"<b>Click</b> to edit the flowed text, <b>drag</b> to select part of the text."
-msgstr ""
-
-#: ../src/text-context.cpp:498
-msgid "Create text"
-msgstr ""
-
-#: ../src/text-context.cpp:522
-msgid "Non-printable character"
-msgstr ""
-
-#: ../src/text-context.cpp:537
-msgid "Insert Unicode character"
-msgstr ""
-
-#: ../src/text-context.cpp:572
-#, c-format
-msgid "Unicode (<b>Enter</b> to finish): %s: %s"
-msgstr ""
-
-#: ../src/text-context.cpp:574 ../src/text-context.cpp:849
-msgid "Unicode (<b>Enter</b> to finish): "
-msgstr ""
-
-#: ../src/text-context.cpp:649
-#, c-format
-msgid "<b>Flowed text frame</b>: %s &#215; %s"
-msgstr ""
-
-#: ../src/text-context.cpp:681
-msgid "Type text; <b>Enter</b> to start new line."
-msgstr ""
-
-#: ../src/text-context.cpp:694
-msgid "Flowed text is created."
-msgstr ""
-
-#: ../src/text-context.cpp:696
-msgid "Create flowed text"
-msgstr ""
-
-#: ../src/text-context.cpp:698
-msgid ""
-"The frame is <b>too small</b> for the current font size. Flowed text not "
-"created."
-msgstr ""
-
-#: ../src/text-context.cpp:834
-msgid "No-break space"
-msgstr ""
-
-#: ../src/text-context.cpp:836
-msgid "Insert no-break space"
-msgstr ""
-
-#: ../src/text-context.cpp:873
-msgid "Make bold"
-msgstr ""
-
-#: ../src/text-context.cpp:891
-msgid "Make italic"
-msgstr ""
-
-#: ../src/text-context.cpp:930
-msgid "New line"
-msgstr ""
-
-#: ../src/text-context.cpp:964
-msgid "Backspace"
-msgstr ""
-
-#: ../src/text-context.cpp:1012
-msgid "Kern to the left"
-msgstr ""
-
-#: ../src/text-context.cpp:1037
-msgid "Kern to the right"
-msgstr ""
-
-#: ../src/text-context.cpp:1062
-msgid "Kern up"
-msgstr ""
-
-#: ../src/text-context.cpp:1088
-msgid "Kern down"
-msgstr ""
-
-#: ../src/text-context.cpp:1165
-msgid "Rotate counterclockwise"
-msgstr ""
-
-#: ../src/text-context.cpp:1186
-msgid "Rotate clockwise"
-msgstr ""
-
-#: ../src/text-context.cpp:1203
-msgid "Contract line spacing"
-msgstr ""
-
-#: ../src/text-context.cpp:1211
-msgid "Contract letter spacing"
-msgstr ""
-
-#: ../src/text-context.cpp:1230
-msgid "Expand line spacing"
-msgstr ""
-
-#: ../src/text-context.cpp:1238
-msgid "Expand letter spacing"
-msgstr ""
-
-#: ../src/text-context.cpp:1368
-msgid "Paste text"
-msgstr ""
-
-#: ../src/text-context.cpp:1602
-#, c-format
-msgid ""
-"Type or edit flowed text (%d characters); <b>Enter</b> to start new "
-"paragraph."
-msgstr ""
-
-#: ../src/text-context.cpp:1604
-#, c-format
-msgid "Type or edit text (%d characters); <b>Enter</b> to start new line."
-msgstr ""
-
-#: ../src/text-context.cpp:1612 ../src/tools-switch.cpp:190
-msgid ""
-"<b>Click</b> to select or create text, <b>drag</b> to create flowed text; "
-"then type."
-msgstr ""
-
-#: ../src/text-context.cpp:1722
-msgid "Type text"
-msgstr ""
-
-#: ../src/text-editing.cpp:40
-msgid "You cannot edit <b>cloned character data</b>."
-msgstr ""
-
-#: ../src/tools-switch.cpp:130
-msgid ""
-"To edit a path, <b>click</b>, <b>Shift+click</b>, or <b>drag around</b> "
-"nodes to select them, then <b>drag</b> nodes and handles. <b>Click</b> on an "
-"object to select."
-msgstr ""
-
-#: ../src/tools-switch.cpp:136
-msgid "To tweak a path by pushing, select it and drag over it."
-msgstr ""
-
-#: ../src/tools-switch.cpp:142
-msgid ""
-"<b>Drag</b> to create a rectangle. <b>Drag controls</b> to round corners and "
-"resize. <b>Click</b> to select."
-msgstr ""
-
-#: ../src/tools-switch.cpp:148
-msgid ""
-"<b>Drag</b> to create a 3D box. <b>Drag controls</b> to resize in "
-"perspective. <b>Click</b> to select (with <b>Ctrl+Alt</b> for single faces)."
-msgstr ""
-
-#: ../src/tools-switch.cpp:154
-msgid ""
-"<b>Drag</b> to create an ellipse. <b>Drag controls</b> to make an arc or "
-"segment. <b>Click</b> to select."
-msgstr ""
-
-#: ../src/tools-switch.cpp:160
-msgid ""
-"<b>Drag</b> to create a star. <b>Drag controls</b> to edit the star shape. "
-"<b>Click</b> to select."
-msgstr ""
-
-#: ../src/tools-switch.cpp:166
-msgid ""
-"<b>Drag</b> to create a spiral. <b>Drag controls</b> to edit the spiral "
-"shape. <b>Click</b> to select."
-msgstr ""
-
-#: ../src/tools-switch.cpp:172
-msgid ""
-"<b>Drag</b> to create a freehand line. <b>Shift</b> appends to selected "
-"path, <b>Alt</b> activates sketch mode."
-msgstr ""
-
-#: ../src/tools-switch.cpp:178
-msgid ""
-"<b>Click</b> or <b>click and drag</b> to start a path; with <b>Shift</b> to "
-"append to selected path. <b>Ctrl+click</b> to create single dots (straight "
-"line modes only)."
-msgstr ""
-
-#: ../src/tools-switch.cpp:184
-msgid ""
-"<b>Drag</b> to draw a calligraphic stroke; with <b>Ctrl</b> to track a guide "
-"path. <b>Arrow keys</b> adjust width (left/right) and angle (up/down)."
-msgstr ""
-
-#: ../src/tools-switch.cpp:196
-msgid ""
-"<b>Drag</b> or <b>double click</b> to create a gradient on selected objects, "
-"<b>drag handles</b> to adjust gradients."
-msgstr ""
-
-#: ../src/tools-switch.cpp:202
-msgid ""
-"<b>Click</b> or <b>drag around an area</b> to zoom in, <b>Shift+click</b> to "
-"zoom out."
-msgstr ""
-
-#: ../src/tools-switch.cpp:214
-msgid "<b>Click and drag</b> between shapes to create a connector."
-msgstr ""
-
-#: ../src/tools-switch.cpp:220
-msgid ""
-"<b>Click</b> to paint a bounded area, <b>Shift+click</b> to union the new "
-"fill with the current selection, <b>Ctrl+click</b> to change the clicked "
-"object's fill and stroke to the current setting."
-msgstr ""
-
-#: ../src/tools-switch.cpp:226
-msgid "<b>Drag</b> to erase."
-msgstr ""
-
-#: ../src/tools-switch.cpp:232
-msgid "Choose a subtool from the toolbar"
-msgstr ""
-
-#: ../src/trace/potrace/inkscape-potrace.cpp:524
-#: ../src/trace/potrace/inkscape-potrace.cpp:598
-#, c-format
-msgid "Trace: %d.  %ld nodes"
-msgstr ""
-
-#: ../src/trace/trace.cpp:71 ../src/trace/trace.cpp:136
-#: ../src/trace/trace.cpp:144 ../src/trace/trace.cpp:243
-msgid "Select an <b>image</b> to trace"
-msgstr ""
-
-#: ../src/trace/trace.cpp:106
-msgid "Select only one <b>image</b> to trace"
-msgstr ""
-
-#: ../src/trace/trace.cpp:124
-msgid "Select one image and one or more shapes above it"
-msgstr ""
-
-#: ../src/trace/trace.cpp:234
-msgid "Trace: No active desktop"
-msgstr ""
-
-#: ../src/trace/trace.cpp:334
-msgid "Invalid SIOX result"
-msgstr ""
-
-#: ../src/trace/trace.cpp:439
-msgid "Trace: No active document"
-msgstr ""
-
-#: ../src/trace/trace.cpp:462
-msgid "Trace: Image has no bitmap data"
-msgstr ""
-
-#: ../src/trace/trace.cpp:469
-msgid "Trace: Starting trace..."
-msgstr ""
-
-#. ## inform the document, so we can undo
-#: ../src/trace/trace.cpp:571
-msgid "Trace bitmap"
-msgstr ""
-
-#: ../src/trace/trace.cpp:575
-#, c-format
-msgid "Trace: Done. %ld nodes created"
-msgstr ""
-
-#: ../src/tweak-context.cpp:204
-#, c-format
-msgid "<b>Nothing</b> selected"
-msgstr ""
-
-#: ../src/tweak-context.cpp:210
-#, c-format
-msgid "%s. Drag to <b>move</b>."
-msgstr ""
-
-#: ../src/tweak-context.cpp:214
-#, c-format
-msgid "%s. Drag or click to <b>move in</b>; with Shift to <b>move out</b>."
-msgstr ""
-
-#: ../src/tweak-context.cpp:218
-#, c-format
-msgid "%s. Drag or click to <b>move randomly</b>."
-msgstr ""
-
-#: ../src/tweak-context.cpp:222
-#, c-format
-msgid "%s. Drag or click to <b>scale down</b>; with Shift to <b>scale up</b>."
-msgstr ""
-
-#: ../src/tweak-context.cpp:226
-#, c-format
-msgid ""
-"%s. Drag or click to <b>rotate clockwise</b>; with Shift, "
-"<b>counterclockwise</b>."
-msgstr ""
-
-#: ../src/tweak-context.cpp:230
-#, c-format
-msgid "%s. Drag or click to <b>duplicate</b>; with Shift, <b>delete</b>."
-msgstr ""
-
-#: ../src/tweak-context.cpp:234
-#, c-format
-msgid "%s. Drag to <b>push paths</b>."
-msgstr ""
-
-#: ../src/tweak-context.cpp:238
-#, c-format
-msgid "%s. Drag or click to <b>inset paths</b>; with Shift to <b>outset</b>."
-msgstr ""
-
-#: ../src/tweak-context.cpp:246
-#, c-format
-msgid "%s. Drag or click to <b>attract paths</b>; with Shift to <b>repel</b>."
-msgstr ""
-
-#: ../src/tweak-context.cpp:254
-#, c-format
-msgid "%s. Drag or click to <b>roughen paths</b>."
-msgstr ""
-
-#: ../src/tweak-context.cpp:258
-#, c-format
-msgid "%s. Drag or click to <b>paint objects</b> with color."
-msgstr ""
-
-#: ../src/tweak-context.cpp:262
-#, c-format
-msgid "%s. Drag or click to <b>randomize colors</b>."
-msgstr ""
-
-#: ../src/tweak-context.cpp:266
-#, c-format
-msgid ""
-"%s. Drag or click to <b>increase blur</b>; with Shift to <b>decrease</b>."
-msgstr ""
-
-#: ../src/tweak-context.cpp:1223
-msgid "<b>Nothing selected!</b> Select objects to tweak."
-msgstr ""
-
-#: ../src/tweak-context.cpp:1259
-msgid "Move tweak"
-msgstr ""
-
-#: ../src/tweak-context.cpp:1263
-msgid "Move in/out tweak"
-msgstr ""
-
-#: ../src/tweak-context.cpp:1267
-msgid "Move jitter tweak"
-msgstr ""
-
-#: ../src/tweak-context.cpp:1271
-msgid "Scale tweak"
-msgstr ""
-
-#: ../src/tweak-context.cpp:1275
-msgid "Rotate tweak"
-msgstr ""
-
-#: ../src/tweak-context.cpp:1279
-msgid "Duplicate/delete tweak"
-msgstr ""
-
-#: ../src/tweak-context.cpp:1283
-msgid "Push path tweak"
-msgstr ""
-
-#: ../src/tweak-context.cpp:1287
-msgid "Shrink/grow path tweak"
-msgstr ""
-
-#: ../src/tweak-context.cpp:1291
-msgid "Attract/repel path tweak"
-msgstr ""
-
-#: ../src/tweak-context.cpp:1295
-msgid "Roughen path tweak"
-msgstr ""
-
-#: ../src/tweak-context.cpp:1299
-msgid "Color paint tweak"
-msgstr ""
-
-#: ../src/tweak-context.cpp:1303
-msgid "Color jitter tweak"
-msgstr ""
-
-#: ../src/tweak-context.cpp:1307
-msgid "Blur tweak"
-msgstr ""
-
-#. check whether something is selected
-#: ../src/ui/clipboard.cpp:257
-msgid "Nothing was copied."
-msgstr ""
-
-#: ../src/ui/clipboard.cpp:318 ../src/ui/clipboard.cpp:520
-#: ../src/ui/clipboard.cpp:544
-msgid "Nothing on the clipboard."
-msgstr ""
-
-#: ../src/ui/clipboard.cpp:374
-msgid "Select <b>object(s)</b> to paste style to."
-msgstr ""
-
-#: ../src/ui/clipboard.cpp:385 ../src/ui/clipboard.cpp:403
-msgid "No style on the clipboard."
-msgstr ""
-
-#: ../src/ui/clipboard.cpp:425
-msgid "Select <b>object(s)</b> to paste size to."
-msgstr ""
-
-#: ../src/ui/clipboard.cpp:432
-msgid "No size on the clipboard."
-msgstr ""
-
-#: ../src/ui/clipboard.cpp:483
-msgid "Select <b>object(s)</b> to paste live path effect to."
-msgstr ""
-
-#. no_effect:
-#: ../src/ui/clipboard.cpp:507
-msgid "No effect on the clipboard."
-msgstr ""
-
-#: ../src/ui/clipboard.cpp:527 ../src/ui/clipboard.cpp:554
-msgid "Clipboard does not contain a path."
-msgstr ""
-
-#. Item dialog
-#: ../src/ui/context-menu.cpp:105
-msgid "Object _Properties"
-msgstr ""
-
-#. Select item
-#: ../src/ui/context-menu.cpp:115
-msgid "_Select This"
-msgstr ""
-
-#. Create link
-#: ../src/ui/context-menu.cpp:125
-msgid "_Create Link"
-msgstr ""
-
-#. Set mask
-#: ../src/ui/context-menu.cpp:132
-msgid "Set Mask"
-msgstr ""
-
-#. Release mask
-#: ../src/ui/context-menu.cpp:143
-msgid "Release Mask"
-msgstr ""
-
-#. Set Clip
-#: ../src/ui/context-menu.cpp:154
-msgid "Set Clip"
-msgstr ""
-
-#. Release Clip
-#: ../src/ui/context-menu.cpp:165
-msgid "Release Clip"
-msgstr ""
-
-#: ../src/ui/context-menu.cpp:288
-msgid "Create link"
-msgstr ""
-
-#. "Ungroup"
-#: ../src/ui/context-menu.cpp:306 ../src/verbs.cpp:2360
-msgid "_Ungroup"
-msgstr ""
-
-#. Link dialog
-#: ../src/ui/context-menu.cpp:346
-msgid "Link _Properties"
-msgstr ""
-
-#. Select item
-#: ../src/ui/context-menu.cpp:352
-msgid "_Follow Link"
-msgstr ""
-
-#. Reset transformations
-#: ../src/ui/context-menu.cpp:357
-msgid "_Remove Link"
-msgstr ""
-
-#. Link dialog
-#: ../src/ui/context-menu.cpp:405
-msgid "Image _Properties"
-msgstr ""
-
-#: ../src/ui/context-menu.cpp:411
-msgid "Edit Externally..."
-msgstr ""
-
-#. Item dialog
-#: ../src/ui/context-menu.cpp:504
-msgid "_Fill and Stroke"
-msgstr ""
-
-#. *
-#. * Constructor
-#.
-#: ../src/ui/dialog/aboutbox.cpp:77
-msgid "About Inkscape"
-msgstr ""
-
-#: ../src/ui/dialog/aboutbox.cpp:88
-msgid "_Splash"
-msgstr ""
-
-#: ../src/ui/dialog/aboutbox.cpp:92
-msgid "_Authors"
-msgstr ""
-
-#: ../src/ui/dialog/aboutbox.cpp:94
-msgid "_Translators"
-msgstr ""
-
-#: ../src/ui/dialog/aboutbox.cpp:96
-msgid "_License"
-msgstr ""
-
-#. TRANSLATORS: This is the filename of the `About Inkscape' picture in
-#. the `screens' directory.  Thus the translation of "about.svg" should be
-#. the filename of its translated version, e.g. about.zh.svg for Chinese.
-#.
-#. N.B. about.svg changes once per release.  (We should probably rename
-#. the original to about-0.40.svg etc. as soon as we have a translation.
-#. If we do so, then add an item to release-checklist saying that the
-#. string here should be changed.)
-#. FIXME? INKSCAPE_SCREENSDIR and "about.svg" are in UTF-8, not the
-#. native filename encoding... and the filename passed to sp_document_new
-#. should be in UTF-*8..
-#: ../src/ui/dialog/aboutbox.cpp:149
-msgid "about.svg"
-msgstr ""
-
-#. TRANSLATORS: Put here your name (and other national contributors')
-#. one per line in the form of: name surname (email). Use \n for newline.
-#: ../src/ui/dialog/aboutbox.cpp:371
-msgid "translator-credits"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:238
-#: ../src/ui/dialog/align-and-distribute.cpp:787
-msgid "Align"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:397
-#: ../src/ui/dialog/align-and-distribute.cpp:788
-msgid "Distribute"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:466
-msgid "Minimum horizontal gap (in px units) between bounding boxes"
-msgstr ""
-
-#. TRANSLATORS: only translate "string" in "context|string".
-#. For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS
-#. "H:" stands for horizontal gap
-#: ../src/ui/dialog/align-and-distribute.cpp:470
-msgid "gap|H:"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:478
-msgid "Minimum vertical gap (in px units) between bounding boxes"
-msgstr ""
-
-#. TRANSLATORS: Vertical gap
-#: ../src/ui/dialog/align-and-distribute.cpp:480
-msgid "V:"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:509
-#: ../src/ui/dialog/align-and-distribute.cpp:789
-#: ../src/widgets/toolbox.cpp:7068
-msgid "Remove overlaps"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:540
-#: ../src/widgets/toolbox.cpp:6931
-msgid "Arrange connector network"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:571
-msgid "Unclump"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:642
-msgid "Randomize positions"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:739
-msgid "Distribute text baselines"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:759
-msgid "Align text baselines"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:790
-msgid "Connector network layout"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:791
-#: ../src/widgets/toolbox.cpp:2083
-msgid "Nodes"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:797
-msgid "Relative to: "
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:798
-msgid "Treat selection as group: "
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:804
-msgid "Align right edges of objects to the left edge of the anchor"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:807
-msgid "Align left edges"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:810
-msgid "Center on vertical axis"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:813
-msgid "Align right sides"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:816
-msgid "Align left edges of objects to the right edge of the anchor"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:819
-msgid "Align bottom edges of objects to the top edge of the anchor"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:822
-msgid "Align top edges"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:825
-msgid "Center on horizontal axis"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:828
-msgid "Align bottom edges"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:831
-msgid "Align top edges of objects to the bottom edge of the anchor"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:836
-msgid "Align baseline anchors of texts horizontally"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:839
-msgid "Align baselines of texts"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:844
-msgid "Make horizontal gaps between objects equal"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:848
-msgid "Distribute left edges equidistantly"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:851
-msgid "Distribute centers equidistantly horizontally"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:854
-msgid "Distribute right edges equidistantly"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:858
-msgid "Make vertical gaps between objects equal"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:862
-msgid "Distribute top edges equidistantly"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:865
-msgid "Distribute centers equidistantly vertically"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:868
-msgid "Distribute bottom edges equidistantly"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:873
-msgid "Distribute baseline anchors of texts horizontally"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:876
-msgid "Distribute baselines of texts vertically"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:881
-msgid "Randomize centers in both dimensions"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:884
-msgid "Unclump objects: try to equalize edge-to-edge distances"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:889
-msgid ""
-"Move objects as little as possible so that their bounding boxes do not "
-"overlap"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:893
-#: ../src/widgets/toolbox.cpp:7031
-msgid "Nicely arrange selected connector network"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:901
-msgid "Align selected nodes to a common horizontal line"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:904
-msgid "Align selected nodes to a common vertical line"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:907
-msgid "Distribute selected nodes horizontally"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:910
-msgid "Distribute selected nodes vertically"
-msgstr ""
-
-#. Rest of the widgetry
-#: ../src/ui/dialog/align-and-distribute.cpp:915
-msgid "Last selected"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:916
-msgid "First selected"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:917
-msgid "Biggest object"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:918
-msgid "Smallest object"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:921
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1414
-#: ../src/ui/dialog/icon-preview.cpp:178
-#: ../src/widgets/desktop-widget.cpp:1580
-msgid "Selection"
-msgstr ""
-
-#: ../src/ui/dialog/calligraphic-profile-rename.cpp:38
-msgid "Profile name:"
-msgstr ""
-
-#. When changing the interval or enabling/disabling the autosave function,
-#. * update our running configuration
-#. *
-#. * FIXME!
-#. * the inkscape_autosave_init should be called AFTER the values have been changed
-#. * (which cannot be guaranteed from here) - use a PrefObserver somewhere
-#.
-#.
-#. _autosave_autosave_enable.signal_toggled().connect( sigc::ptr_fun(inkscape_autosave_init), TRUE );
-#. _autosave_autosave_interval.signal_changed().connect( sigc::ptr_fun(inkscape_autosave_init), TRUE );
-#.
-#. -----------
-#: ../src/ui/dialog/calligraphic-profile-rename.cpp:52
-#: ../src/ui/dialog/inkscape-preferences.cpp:1145
-msgid "Save"
-msgstr ""
-
-#: ../src/ui/dialog/debug.cpp:68
-msgid "Messages"
-msgstr ""
-
-#: ../src/ui/dialog/debug.cpp:77 ../src/ui/dialog/messages.cpp:55
-msgid "Capture log messages"
-msgstr ""
-
-#: ../src/ui/dialog/debug.cpp:79 ../src/ui/dialog/messages.cpp:57
-msgid "Release log messages"
-msgstr ""
-
-#: ../src/ui/dialog/document-metadata.cpp:73
-msgid "Metadata"
-msgstr ""
-
-#: ../src/ui/dialog/document-metadata.cpp:74
-msgid "License"
-msgstr ""
-
-#: ../src/ui/dialog/document-metadata.cpp:154
-msgid "<b>Dublin Core Entities</b>"
-msgstr ""
-
-#: ../src/ui/dialog/document-metadata.cpp:176
-msgid "<b>License</b>"
-msgstr ""
-
-#. ---------------------------------------------------------------
-#: ../src/ui/dialog/document-properties.cpp:90
-msgid "Show page _border"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:90
-msgid "If set, rectangular page border is shown"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:91
-msgid "Border on _top of drawing"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:91
-msgid "If set, border is always on top of the drawing"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:92
-msgid "_Show border shadow"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:92
-msgid "If set, page border shows a shadow on its right and lower side"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:93
-msgid "Back_ground:"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:93
-msgid "Background color"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:93
-msgid ""
-"Color and transparency of the page background (also used for bitmap export)"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:94
-msgid "Border _color:"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:94
-msgid "Page border color"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:94
-msgid "Color of the page border"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:95
-msgid "Default _units:"
-msgstr ""
-
-#. ---------------------------------------------------------------
-#. General snap options
-#: ../src/ui/dialog/document-properties.cpp:99
-msgid "Show _guides"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:99
-msgid "Show or hide guides"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:100
-msgid "_Snap guides while dragging"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:100
-msgid ""
-"While dragging a guide, snap to object nodes or bounding box corners ('Snap "
-"to nodes' or 'snap to bounding box corners' must be enabled; only a small "
-"part of the guide near the cursor will snap)"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:102
-msgid "Guide co_lor:"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:102
-msgid "Guideline color"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:102
-msgid "Color of guidelines"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:103
-msgid "_Highlight color:"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:103
-msgid "Highlighted guideline color"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:103
-msgid "Color of a guideline when it is under mouse"
-msgstr ""
-
-#. TRANSLATORS: only translate "string" in "context|string".
-#. For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS
-#. "New" refers to grid
-#: ../src/ui/dialog/document-properties.cpp:109
-msgid "Grid|_New"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:109
-msgid "Create new grid."
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:110
-msgid "_Remove"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:110
-msgid "Remove selected grid."
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:119
-#: ../src/widgets/toolbox.cpp:2172
-msgid "Guides"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:120
-#: ../src/ui/dialog/inkscape-preferences.cpp:1014
-#: ../src/widgets/toolbox.cpp:2163
-msgid "Grids"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:121 ../src/verbs.cpp:2587
-#: ../src/widgets/toolbox.cpp:2028
-msgid "Snap"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:122
-msgid "Color Management"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:123
-msgid "Scripting"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:221
-msgid "<b>General</b>"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:223
-msgid "<b>Border</b>"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:225
-msgid "<b>Format</b>"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:253
-msgid "<b>Guides</b>"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:272
-msgid "Snap _distance"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:272
-msgid "Snap only when _closer than:"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:272
-#: ../src/ui/dialog/document-properties.cpp:278
-#: ../src/ui/dialog/document-properties.cpp:284
-msgid "Always snap"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:273
-msgid "Snapping distance, in screen pixels, for snapping to objects"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:273
-msgid "Always snap to objects, regardless of their distance"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:274
-msgid ""
-"If set, objects only snap to another object when it's within the range "
-"specified below"
-msgstr ""
-
-#. Options for snapping to grids
-#: ../src/ui/dialog/document-properties.cpp:278
-msgid "Snap d_istance"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:278
-msgid "Snap only when c_loser than:"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:279
-msgid "Snapping distance, in screen pixels, for snapping to grid"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:279
-msgid "Always snap to grids, regardless of the distance"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:280
-msgid ""
-"If set, objects only snap to a grid line when it's within the range "
-"specified below"
-msgstr ""
-
-#. Options for snapping to guides
-#: ../src/ui/dialog/document-properties.cpp:284
-msgid "Snap dist_ance"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:284
-msgid "Snap only when close_r than:"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:285
-msgid "Snapping distance, in screen pixels, for snapping to guides"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:285
-msgid "Always snap to guides, regardless of the distance"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:286
-msgid ""
-"If set, objects only snap to a guide when it's within the range specified "
-"below"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:290
-msgid "<b>Snap to objects</b>"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:292
-msgid "<b>Snap to grids</b>"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:294
-msgid "<b>Snap to guides</b>"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:323
-msgid "(invalid UTF-8 string)"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:349
-#, c-format
-msgid "Color profiles directory (%s) is unavailable."
-msgstr ""
-
-#. TODO check if this next line was sometimes needed. It being there caused an assertion.
-#. Inkscape::GC::release(defsRepr);
-#. inform the document, so we can undo
-#. Color Management
-#: ../src/ui/dialog/document-properties.cpp:451 ../src/verbs.cpp:2739
-msgid "Link Color Profile"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:524
-msgid "Remove linked color profile"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:538
-msgid "<b>Linked Color Profiles:</b>"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:540
-msgid "<b>Available Color Profiles:</b>"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:542
-msgid "Link Profile"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:573
-msgid "Profile Name"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:604
-msgid "<b>External script files:</b>"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:606
-#: ../src/ui/dialog/swatches.cpp:463
-msgid "Add"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:629
-msgid "Filename"
-msgstr ""
-
-#. inform the document, so we can undo
-#: ../src/ui/dialog/document-properties.cpp:669
-msgid "Add external script..."
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:693
-msgid "Remove external script"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:774
-msgid "<b>Creation</b>"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:775
-msgid "<b>Defined grids</b>"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:985
-msgid "Remove grid"
-msgstr ""
-
-#: ../src/ui/dialog/extension-editor.cpp:80
-msgid "Information"
-msgstr ""
-
-#: ../src/ui/dialog/extension-editor.cpp:81
-#: ../share/extensions/draw_from_triangle.inx.h:20
-#: ../share/extensions/dxf_input.inx.h:9
-#: ../share/extensions/dxf_outlines.inx.h:8
-#: ../share/extensions/lindenmayer.inx.h:23
-#: ../share/extensions/measure.inx.h:2 ../share/extensions/scour.inx.h:4
-msgid "Help"
-msgstr ""
-
-#: ../src/ui/dialog/extension-editor.cpp:82
-msgid "Parameters"
-msgstr ""
-
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:383
-msgid "No preview"
-msgstr ""
-
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:489
-msgid "too large for preview"
-msgstr ""
-
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:577
-msgid "Enable preview"
-msgstr ""
-
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:711
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:712
-#: ../src/ui/dialog/filedialogimpl-win32.cpp:197
-msgid "All Inkscape Files"
-msgstr ""
-
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:716
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:717
-#: ../src/ui/dialog/filedialogimpl-win32.cpp:196
-msgid "All Files"
-msgstr ""
-
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:722
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:723
-#: ../src/ui/dialog/filedialogimpl-win32.cpp:198
-msgid "All Images"
-msgstr ""
-
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:727
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:728
-#: ../src/ui/dialog/filedialogimpl-win32.cpp:199
-msgid "All Vectors"
-msgstr ""
-
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:732
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:733
-#: ../src/ui/dialog/filedialogimpl-win32.cpp:200
-msgid "All Bitmaps"
-msgstr ""
-
-#. ###### File options
-#. ###### Do we want the .xxx extension automatically added?
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:927
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1475
-msgid "Append filename extension automatically"
-msgstr ""
-
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1085
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1339
-msgid "Guess from extension"
-msgstr ""
-
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1360
-msgid "Left edge of source"
-msgstr ""
-
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1361
-msgid "Top edge of source"
-msgstr ""
-
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1362
-msgid "Right edge of source"
-msgstr ""
-
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1363
-msgid "Bottom edge of source"
-msgstr ""
-
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1364
-msgid "Source width"
-msgstr ""
-
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1365
-msgid "Source height"
-msgstr ""
-
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1366
-msgid "Destination width"
-msgstr ""
-
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1367
-msgid "Destination height"
-msgstr ""
-
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1368
-msgid "Resolution (dots per inch)"
-msgstr ""
-
-#. #########################################
-#. ## EXTRA WIDGET -- SOURCE SIDE
-#. #########################################
-#. ##### Export options buttons/spinners, etc
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1406
-msgid "Document"
-msgstr ""
-
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1418
-#: ../share/extensions/color_custom.inx.h:3
-msgid "Custom"
-msgstr ""
-
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1458
-msgid "Cairo"
-msgstr ""
-
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1461
-msgid "Antialias"
-msgstr ""
-
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1464
-msgid "Background"
-msgstr ""
-
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1487
-msgid "Destination"
-msgstr ""
-
-#: ../src/ui/dialog/filedialogimpl-win32.cpp:476
-msgid "Show Preview"
-msgstr ""
-
-#: ../src/ui/dialog/filedialogimpl-win32.cpp:611
-msgid "No file selected"
-msgstr ""
-
-#: ../src/ui/dialog/fill-and-stroke.cpp:48
-#: ../share/extensions/interp_att_g.inx.h:4
-msgid "Fill"
-msgstr ""
-
-#: ../src/ui/dialog/fill-and-stroke.cpp:49
-msgid "Stroke _paint"
-msgstr ""
-
-#: ../src/ui/dialog/fill-and-stroke.cpp:50
-msgid "Stroke st_yle"
-msgstr ""
-
-#. TRANSLATORS: this dialog is accessible via menu Filters - Filter editor
-#: ../src/ui/dialog/filter-effects-dialog.cpp:465
-msgid ""
-"This matrix determines a linear transform on color space. Each line affects "
-"one of the color components. Each column determines how much of each color "
-"component from the input is passed to the output. The last column does not "
-"depend on input colors, so can be used to adjust a constant component value."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:575
-msgid "Image File"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:578
-msgid "Selected SVG Element"
-msgstr ""
-
-#. TODO: any image, not just svg
-#: ../src/ui/dialog/filter-effects-dialog.cpp:648
-msgid "Select an image to be used as feImage input"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:740
-msgid "This SVG filter effect does not require any parameters."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:746
-msgid "This SVG filter effect is not yet implemented in Inkscape."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:938
-msgid "Light Source:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:955
-msgid "Direction angle for the light source on the XY plane, in degrees"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:956
-msgid "Direction angle for the light source on the YZ plane, in degrees"
-msgstr ""
-
-#. default x:
-#. default y:
-#. default z:
-#: ../src/ui/dialog/filter-effects-dialog.cpp:959
-#: ../src/ui/dialog/filter-effects-dialog.cpp:962
-msgid "Location"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:959
-#: ../src/ui/dialog/filter-effects-dialog.cpp:962
-#: ../src/ui/dialog/filter-effects-dialog.cpp:965
-msgid "X coordinate"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:959
-#: ../src/ui/dialog/filter-effects-dialog.cpp:962
-#: ../src/ui/dialog/filter-effects-dialog.cpp:965
-msgid "Y coordinate"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:959
-#: ../src/ui/dialog/filter-effects-dialog.cpp:962
-#: ../src/ui/dialog/filter-effects-dialog.cpp:965
-msgid "Z coordinate"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:965
-msgid "Points At"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:966
-msgid "Specular Exponent"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:966
-msgid "Exponent value controlling the focus for the light source"
-msgstr ""
-
-#. TODO: here I have used 100 degrees as default value. But spec says that if not specified, no limiting cone is applied. So, there should be a way for the user to set a "no limiting cone" option.
-#: ../src/ui/dialog/filter-effects-dialog.cpp:968
-msgid "Cone Angle"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:968
-msgid ""
-"This is the angle between the spot light axis (i.e. the axis between the "
-"light source and the point to which it is pointing at) and the spot light "
-"cone. No light is projected outside this cone."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:1029
-msgid "New light source"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:1070
-msgid "_Duplicate"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:1096
-msgid "_Filter"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:1110
-msgid "R_ename"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:1213
-msgid "Rename filter"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:1249
-msgid "Apply filter"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:1318
-msgid "filter"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:1325
-msgid "Add filter"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:1351
-msgid "Duplicate filter"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:1418
-msgid "_Effect"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:1426
-msgid "Connections"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:1542
-msgid "Remove filter primitive"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:1914
-msgid "Remove merge node"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2030
-msgid "Reorder filter primitive"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2064
-msgid "Add Effect:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2065
-msgid "No effect selected"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2066
-msgid "No filter selected"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2104
-msgid "Effect parameters"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2105
-msgid "Filter General Settings"
-msgstr ""
-
-#. default x:
-#. default y:
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2161
-msgid "Coordinates:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2161
-msgid "X coordinate of the left corners of filter effects region"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2161
-msgid "Y coordinate of the upper corners of filter effects region"
-msgstr ""
-
-#. default width:
-#. default height:
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2162
-msgid "Dimensions:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2162
-msgid "Width of filter effects region"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2162
-msgid "Height of filter effects region"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2165
-#: ../src/widgets/toolbox.cpp:3859 ../src/widgets/toolbox.cpp:4250
-#: ../share/extensions/extrude.inx.h:4
-msgid "Mode:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2168
-msgid ""
-"Indicates the type of matrix operation. The keyword 'matrix' indicates that "
-"a full 5x4 matrix of values will be provided. The other keywords represent "
-"convenience shortcuts to allow commonly used color operations to be "
-"performed without specifying a complete matrix."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2169
-msgid "Value(s):"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2183
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2223
-msgid "Operator:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2184
-msgid "K1:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2184
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2185
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2186
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2187
-msgid ""
-"If the arithmetic operation is chosen, each result pixel is computed using "
-"the formula k1*i1*i2 + k2*i1 + k3*i2 + k4 where i1 and i2 are the pixel "
-"values of the first and second inputs respectively."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2185
-msgid "K2:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2186
-msgid "K3:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2187
-msgid "K4:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2190
-#: ../src/ui/dialog/tracedialog.cpp:581
-msgid "Size:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2190
-msgid "width of the convolve matrix"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2190
-msgid "height of the convolve matrix"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2191
-msgid ""
-"X coordinate of the target point in the convolve matrix. The convolution is "
-"applied to pixels around this point."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2191
-msgid ""
-"Y coordinate of the target point in the convolve matrix. The convolution is "
-"applied to pixels around this point."
-msgstr ""
-
-#. TRANSLATORS: for info on "Kernel", see http://en.wikipedia.org/wiki/Kernel_(matrix)
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2193
-msgid "Kernel:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2193
-msgid ""
-"This matrix describes the convolve operation that is applied to the input "
-"image in order to calculate the pixel colors at the output. Different "
-"arrangements of values in this matrix result in various possible visual "
-"effects. An identity matrix would lead to a motion blur effect (parallel to "
-"the matrix diagonal) while a matrix filled with a constant non-zero value "
-"would lead to a common blur effect."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2195
-msgid "Divisor:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2195
-msgid ""
-"After applying the kernelMatrix to the input image to yield a number, that "
-"number is divided by divisor to yield the final destination color value. A "
-"divisor that is the sum of all the matrix values tends to have an evening "
-"effect on the overall color intensity of the result."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2196
-msgid "Bias:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2196
-msgid ""
-"This value is added to each component. This is useful to define a constant "
-"value as the zero response of the filter."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2197
-msgid "Edge Mode:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2197
-msgid ""
-"Determines how to extend the input image as necessary with color values so "
-"that the matrix operations can be applied when the kernel is positioned at "
-"or near the edge of the input image."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2198
-msgid "Preserve Alpha"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2198
-msgid "If set, the alpha channel won't be altered by this filter primitive."
-msgstr ""
-
-#. default: white
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2201
-msgid "Diffuse Color:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2201
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2234
-msgid "Defines the color of the light source"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2202
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2235
-msgid "Surface Scale:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2202
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2235
-msgid ""
-"This value amplifies the heights of the bump map defined by the input alpha "
-"channel"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2203
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2236
-msgid "Constant:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2203
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2236
-msgid "This constant affects the Phong lighting model."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2204
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2238
-msgid "Kernel Unit Length:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2208
-msgid "Scale:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2208
-msgid "This defines the intensity of the displacement effect."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2209
-msgid "X displacement:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2209
-msgid "Color component that controls the displacement in the X direction"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2210
-msgid "Y displacement:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2210
-msgid "Color component that controls the displacement in the Y direction"
-msgstr ""
-
-#. default: black
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2213
-msgid "Flood Color:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2213
-msgid "The whole filter region will be filled with this color."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2214
-#: ../src/widgets/toolbox.cpp:5299
-msgid "Opacity:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2217
-msgid "Standard Deviation:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2217
-msgid "The standard deviation for the blur operation."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2223
-msgid ""
-"Erode: performs \"thinning\" of input image.\n"
-"Dilate: performs \"fattenning\" of input image."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2224
-msgid "Radius:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2227
-msgid "Source of Image:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2230
-msgid "Delta X:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2230
-msgid "This is how far the input image gets shifted to the right"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2231
-msgid "Delta Y:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2231
-msgid "This is how far the input image gets shifted downwards"
-msgstr ""
-
-#. default: white
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2234
-msgid "Specular Color:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2237
-msgid "Exponent:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2237
-msgid "Exponent for specular term, larger is more \"shiny\"."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2246
-msgid ""
-"Indicates whether the filter primitive should perform a noise or turbulence "
-"function."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2247
-msgid "Base Frequency:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2248
-msgid "Octaves:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2249
-msgid "Seed:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2249
-msgid "The starting number for the pseudo random number generator."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2261
-msgid "Add filter primitive"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2278
-msgid ""
-"The <b>feBlend</b> filter primitive provides 4 image blending modes: screen, "
-"multiply, darken and lighten."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2282
-msgid ""
-"The <b>feColorMatrix</b> filter primitive applies a matrix transformation to "
-"color of each rendered pixel. This allows for effects like turning object to "
-"grayscale, modifying color saturation and changing color hue."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2286
-msgid ""
-"The <b>feComponentTransfer</b> filter primitive manipulates the input's "
-"color components (red, green, blue, and alpha) according to particular "
-"transfer functions, allowing operations like brightness and contrast "
-"adjustment, color balance, and thresholding."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2290
-msgid ""
-"The <b>feComposite</b> filter primitive composites two images using one of "
-"the Porter-Duff blending modes or the arithmetic mode described in SVG "
-"standard. Porter-Duff blending modes are essentially logical operations "
-"between the corresponding pixel values of the images."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2294
-msgid ""
-"The <b>feConvolveMatrix</b> lets you specify a Convolution to be applied on "
-"the image. Common effects created using convolution matrices are blur, "
-"sharpening, embossing and edge detection. Note that while gaussian blur can "
-"be created using this filter primitive, the special gaussian blur primitive "
-"is faster and resolution-independent."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2298
-msgid ""
-"The <b>feDiffuseLighting</b> and feSpecularLighting filter primitives create "
-"\"embossed\" shadings.  The input's alpha channel is used to provide depth "
-"information: higher opacity areas are raised toward the viewer and lower "
-"opacity areas recede away from the viewer."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2302
-msgid ""
-"The <b>feDisplacementMap</b> filter primitive displaces the pixels in the "
-"first input using the second input as a displacement map, that shows from "
-"how far the pixel should come from. Classical examples are whirl and pinch "
-"effects."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2306
-msgid ""
-"The <b>feFlood</b> filter primitive fills the region with a given color and "
-"opacity.  It is usually used as an input to other filters to apply color to "
-"a graphic."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2310
-msgid ""
-"The <b>feGaussianBlur</b> filter primitive uniformly blurs its input.  It is "
-"commonly used together with feOffset to create a drop shadow effect."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2314
-msgid ""
-"The <b>feImage</b> filter primitive fills the region with an external image "
-"or another part of the document."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2318
-msgid ""
-"The <b>feMerge</b> filter primitive composites several temporary images "
-"inside the filter primitive to a single image. It uses normal alpha "
-"compositing for this. This is equivalent to using several feBlend primitives "
-"in 'normal' mode or several feComposite primitives in 'over' mode."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2322
-msgid ""
-"The <b>feMorphology</b> filter primitive provides erode and dilate effects. "
-"For single-color objects erode makes the object thinner and dilate makes it "
-"thicker."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2326
-msgid ""
-"The <b>feOffset</b> filter primitive offsets the image by an user-defined "
-"amount. For example, this is useful for drop shadows, where the shadow is in "
-"a slightly different position than the actual object."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2330
-msgid ""
-"The feDiffuseLighting and <b>feSpecularLighting</b> filter primitives create "
-"\"embossed\" shadings.  The input's alpha channel is used to provide depth "
-"information: higher opacity areas are raised toward the viewer and lower "
-"opacity areas recede away from the viewer."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2334
-msgid ""
-"The <b>feTile</b> filter primitive tiles a region with its input graphic"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2338
-msgid ""
-"The <b>feTurbulence</b> filter primitive renders Perlin noise. This kind of "
-"noise is useful in simulating several nature phenomena like clouds, fire and "
-"smoke and in generating complex textures like marble or granite."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2357
-msgid "Duplicate filter primitive"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2410
-msgid "Set filter primitive attribute"
-msgstr ""
-
-#: ../src/ui/dialog/guides.cpp:42
-msgid "Unit:"
-msgstr ""
-
-#: ../src/ui/dialog/guides.cpp:45
-msgid "Angle (degrees):"
-msgstr ""
-
-#: ../src/ui/dialog/guides.cpp:46
-msgid "Rela_tive change"
-msgstr ""
-
-#: ../src/ui/dialog/guides.cpp:46
-msgid "Move and/or rotate the guide relative to current settings"
-msgstr ""
-
-#: ../src/ui/dialog/guides.cpp:112
-msgid "Set guide properties"
-msgstr ""
-
-#: ../src/ui/dialog/guides.cpp:151
-msgid "Guideline"
-msgstr ""
-
-#: ../src/ui/dialog/guides.cpp:239
-#, c-format
-msgid "Guideline ID: %s"
-msgstr ""
-
-#: ../src/ui/dialog/guides.cpp:245
-#, c-format
-msgid "Current: %s"
-msgstr ""
-
-#: ../src/ui/dialog/icon-preview.cpp:130
-#, c-format
-msgid "%d x %d"
-msgstr ""
-
-#: ../src/ui/dialog/icon-preview.cpp:180
-msgid "Selection only or whole document"
-msgstr ""
-
-#: ../src/ui/dialog/icon-preview.cpp:188
-msgid "Refresh the icons"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:169
-msgid "Mouse"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:171
-msgid "Grab sensitivity:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:171
-#: ../src/ui/dialog/inkscape-preferences.cpp:174
-#: ../src/ui/dialog/inkscape-preferences.cpp:190
-#: ../src/ui/dialog/inkscape-preferences.cpp:194
-#: ../src/ui/dialog/inkscape-preferences.cpp:204
-msgid "pixels"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:172
-msgid ""
-"How close on the screen you need to be to an object to be able to grab it "
-"with mouse (in screen pixels)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:174
-msgid "Click/drag threshold:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:175
-msgid ""
-"Maximum mouse drag (in screen pixels) which is considered a click, not a drag"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:177
-msgid "Use pressure-sensitive tablet (requires restart)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:179
-msgid ""
-"Use the capabilities of a tablet or other pressure-sensitive device. Disable "
-"this only if you have problems with the tablet (you can still use it as a "
-"mouse)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:181
-msgid "Switch tool based on tablet device (requires restart)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:183
-msgid ""
-"Change tool as different devices are used on the tablet (pen, eraser, mouse)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:188
-msgid "Scrolling"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:190
-msgid "Mouse wheel scrolls by:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:191
-msgid ""
-"One mouse wheel notch scrolls by this distance in screen pixels "
-"(horizontally with Shift)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:192
-msgid "Ctrl+arrows"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:194
-msgid "Scroll by:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:195
-msgid "Pressing Ctrl+arrow key scrolls by this distance (in screen pixels)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:197
-msgid "Acceleration:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:198
-msgid ""
-"Pressing and holding Ctrl+arrow will gradually speed up scrolling (0 for no "
-"acceleration)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:199
-msgid "Autoscrolling"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:201
-msgid "Speed:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:202
-msgid ""
-"How fast the canvas autoscrolls when you drag beyond canvas edge (0 to turn "
-"autoscroll off)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:204
-#: ../src/ui/dialog/tracedialog.cpp:420 ../src/ui/dialog/tracedialog.cpp:453
-#: ../src/ui/dialog/tracedialog.cpp:596 ../src/widgets/toolbox.cpp:7185
-msgid "Threshold:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:205
-msgid ""
-"How far (in screen pixels) you need to be from the canvas edge to trigger "
-"autoscroll; positive is outside the canvas, negative is within the canvas"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:206
-msgid "Left mouse button pans when Space is pressed"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:208
-msgid ""
-"When on, pressing and holding Space and dragging with left mouse button pans "
-"canvas (as in Adobe Illustrator). When off, Space temporarily switches to "
-"Selector tool (default)."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:209
-msgid "Mouse wheel zooms by default"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:211
-msgid ""
-"When on, mouse wheel zooms without Ctrl and scrolls canvas with Ctrl; when "
-"off, it zooms with Ctrl and scrolls without Ctrl."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:217
-msgid "Enable snap indicator"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:219
-msgid "After snapping, a symbol is drawn at the point that has snapped"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:222
-msgid "Delay (in ms):"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:223
-msgid ""
-"Postpone snapping as long as the mouse is moving, and then wait an "
-"additional fraction of a second. This additional delay is specified here. "
-"When set to zero or to a very small number, snapping will be immediate."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:225
-msgid "Only snap the node closest to the pointer"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:227
-msgid ""
-"Only try to snap the node that is initially closest to the mouse pointer"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:230
-msgid "Weight factor:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:231
-msgid ""
-"When multiple snap solutions are found, then Inkscape can either prefer the "
-"closest transformation (when set to 0), or prefer the node that was "
-"initially the closest to the pointer (when set to 1)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:233
-msgid "Snap the mouse pointer when dragging a constrained knot"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:235
-msgid ""
-"When dragging a knot along a constraint line, then snap the position of the "
-"mouse pointer instead of snapping the projection of the knot onto the "
-"constraint line"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:237
-msgid "Snapping"
-msgstr ""
-
-#. nudgedistance is limited to 1000 in select-context.cpp: use the same limit here
-#: ../src/ui/dialog/inkscape-preferences.cpp:246
-msgid "Arrow keys move by:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:247
-msgid ""
-"Pressing an arrow key moves selected object(s) or node(s) by this distance "
-"(in px units)"
-msgstr ""
-
-#. defaultscale is limited to 1000 in select-context.cpp: use the same limit here
-#: ../src/ui/dialog/inkscape-preferences.cpp:250
-msgid "> and < scale by:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:251
-msgid ""
-"Pressing > or < scales selection up or down by this increment (in px units)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:253
-msgid "Inset/Outset by:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:254
-msgid ""
-"Inset and Outset commands displace the path by this distance (in px units)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:255
-msgid "Compass-like display of angles"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:257
-msgid ""
-"When on, angles are displayed with 0 at north, 0 to 360 range, positive "
-"clockwise; otherwise with 0 at east, -180 to 180 range, positive "
-"counterclockwise"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:263
-msgid "Rotation snaps every:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:263
-msgid "degrees"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:264
-msgid ""
-"Rotating with Ctrl pressed snaps every that much degrees; also, pressing "
-"[ or ] rotates by this amount"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:266
-msgid "Zoom in/out by:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:267
-msgid ""
-"Zoom tool click, +/- keys, and middle click zoom in and out by this "
-"multiplier"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:273
-msgid "Show selection cue"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:274
-msgid ""
-"Whether selected objects display a selection cue (the same as in selector)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:280
-msgid "Enable gradient editing"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:281
-msgid "Whether selected objects display gradient editing controls"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:286
-msgid "Conversion to guides uses edges instead of bounding box"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:287
-msgid ""
-"Converting an object to guides places these along the object's true edges "
-"(imitating the object's shape), not along the bounding box."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:294
-msgid "Ctrl+click dot size:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:294
-msgid "times current stroke width"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:295
-msgid "Size of dots created with Ctrl+click (relative to current stroke width)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:310
-msgid "<b>No objects selected</b> to take the style from."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:319
-msgid ""
-"<b>More than one object selected.</b>  Cannot take style from multiple "
-"objects."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:352
-msgid "Create new objects with:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:354
-msgid "Last used style"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:356
-msgid "Apply the style you last set on an object"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:361
-msgid "This tool's own style:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:365
-msgid ""
-"Each tool may store its own style to apply to the newly created objects. Use "
-"the button below to set it."
-msgstr ""
-
-#. style swatch
-#: ../src/ui/dialog/inkscape-preferences.cpp:369
-msgid "Take from selection"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:374
-msgid "This tool's style of new objects"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:381
-msgid "Remember the style of the (first) selected object as this tool's style"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:386
-msgid "Tools"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:389
-msgid "Bounding box to use:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:390
-msgid "Visual bounding box"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:392
-msgid "This bounding box includes stroke width, markers, filter margins, etc."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:393
-msgid "Geometric bounding box"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:395
-msgid "This bounding box includes only the bare path"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:397
-msgid "Conversion to guides:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:398
-msgid "Keep objects after conversion to guides"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:400
-msgid ""
-"When converting an object to guides, don't delete the object after the "
-"conversion."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:401
-msgid "Treat groups as a single object"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:403
-msgid ""
-"Treat groups as a single object during conversion to guides rather than "
-"converting each child separately."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:405
-msgid "Average all sketches"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:406
-msgid "Width is in absolute units"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:407
-msgid "Select new path"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:408
-msgid "Don't attach connectors to text objects"
-msgstr ""
-
-#. Selector
-#: ../src/ui/dialog/inkscape-preferences.cpp:411
-msgid "Selector"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:414
-msgid "When transforming, show:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:415
-msgid "Objects"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:417
-msgid "Show the actual objects when moving or transforming"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:418
-msgid "Box outline"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:420
-msgid "Show only a box outline of the objects when moving or transforming"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:421
-msgid "Per-object selection cue:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:424
-msgid "No per-object selection indication"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:425
-msgid "Mark"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:427
-msgid "Each selected object has a diamond mark in the top left corner"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:428
-msgid "Box"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:430
-msgid "Each selected object displays its bounding box"
-msgstr ""
-
-#. Node
-#: ../src/ui/dialog/inkscape-preferences.cpp:433
-msgid "Node"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:436
-msgid "Path outline:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:437
-#: ../src/ui/dialog/inkscape-preferences.cpp:438
-msgid "Path outline color"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:438
-msgid "Selects the color used for showing the path outline."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:439
-msgid "Path outline flash on mouse-over"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:440
-msgid "When hovering over a path, briefly flash its outline."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:441
-msgid "Suppress path outline flash when one path selected"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:442
-msgid "If a path is selected, do not continue flashing path outlines."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:444
-msgid "Flash time"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:444
-msgid ""
-"Specifies how long the path outline will be visible after a mouse-over (in "
-"milliseconds). Specify 0 to have the outline shown until mouse leaves the "
-"path."
-msgstr ""
-
-#. Tweak
-#: ../src/ui/dialog/inkscape-preferences.cpp:447 ../src/verbs.cpp:2504
-msgid "Tweak"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:448
-msgid "Paint objects with:"
-msgstr ""
-
-#. Zoom
-#: ../src/ui/dialog/inkscape-preferences.cpp:453
-#: ../src/ui/view/edit-widget.cpp:1062 ../src/verbs.cpp:2526
-#: ../src/widgets/desktop-widget.cpp:483
-msgid "Zoom"
-msgstr ""
-
-#. Shapes
-#: ../src/ui/dialog/inkscape-preferences.cpp:458
-msgid "Shapes"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:490
-msgid "Sketch mode"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:492
-msgid ""
-"If on, the sketch result will be the normal average of all sketches made, "
-"instead of averaging the old result with the new sketch."
-msgstr ""
-
-#. Pen
-#: ../src/ui/dialog/inkscape-preferences.cpp:495 ../src/verbs.cpp:2518
-msgid "Pen"
-msgstr ""
-
-#. Calligraphy
-#: ../src/ui/dialog/inkscape-preferences.cpp:501 ../src/verbs.cpp:2520
-msgid "Calligraphy"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:505
-msgid ""
-"If on, pen width is in absolute units (px) independent of zoom; otherwise "
-"pen width depends on zoom so that it looks the same at any zoom"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:507
-msgid ""
-"If on, each newly created object will be selected (deselecting previous "
-"selection)"
-msgstr ""
-
-#. Paint Bucket
-#: ../src/ui/dialog/inkscape-preferences.cpp:509 ../src/verbs.cpp:2532
-msgid "Paint Bucket"
-msgstr ""
-
-#. Eraser
-#: ../src/ui/dialog/inkscape-preferences.cpp:514 ../src/verbs.cpp:2536
-msgid "Eraser"
-msgstr ""
-
-#. LPETool
-#: ../src/ui/dialog/inkscape-preferences.cpp:518 ../src/verbs.cpp:2538
-msgid "LPE Tool"
-msgstr ""
-
-#. Gradient
-#: ../src/ui/dialog/inkscape-preferences.cpp:528 ../src/verbs.cpp:2524
-msgid "Gradient"
-msgstr ""
-
-#. Connector
-#: ../src/ui/dialog/inkscape-preferences.cpp:532 ../src/verbs.cpp:2530
-msgid "Connector"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:535
-msgid "If on, connector attachment points will not be shown for text objects"
-msgstr ""
-
-#. Dropper
-#: ../src/ui/dialog/inkscape-preferences.cpp:537 ../src/verbs.cpp:2528
-msgid "Dropper"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:544
-msgid "Save and restore window geometry for each document"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:545
-msgid "Remember and use last window's geometry"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:546
-msgid "Don't save window geometry"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:548
-#: ../src/ui/dialog/inkscape-preferences.cpp:568
-msgid "Dockable"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:551
-msgid "Dialogs are hidden in taskbar"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:552
-msgid "Zoom when window is resized"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:553
-msgid "Show close button on dialogs"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:555
-msgid "Normal"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:556
-msgid "Aggressive"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:558
-msgid "Saving window geometry (size and position):"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:560
-msgid "Let the window manager determine placement of all windows"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:562
-msgid ""
-"Remember and use the last window's geometry (saves geometry to user "
-"preferences)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:564
-msgid ""
-"Save and restore window geometry for each document (saves geometry in the "
-"document)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:566
-msgid "Dialog behavior (requires restart):"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:573
-msgid "Dialogs on top:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:576
-msgid "Dialogs are treated as regular windows"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:578
-msgid "Dialogs stay on top of document windows"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:580
-msgid "Same as Normal but may work better with some window managers"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:584
-msgid "Dialog Transparency:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:586
-msgid "Opacity when focused:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:588
-msgid "Opacity when unfocused:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:590
-msgid "Time of opacity change animation:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:593
-msgid "Miscellaneous:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:596
-msgid "Whether dialog windows are to be hidden in the window manager taskbar"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:599
-msgid ""
-"Zoom drawing when document window is resized, to keep the same area visible "
-"(this is the default which can be changed in any window using the button "
-"above the right scrollbar)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:601
-msgid "Whether dialog windows have a close button (requires restart)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:602
-msgid "Windows"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:607
-msgid "Move in parallel"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:609
-msgid "Stay unmoved"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:611
-msgid "Move according to transform"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:613
-msgid "Are unlinked"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:615
-msgid "Are deleted"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:618
-msgid "When the original moves, its clones and linked offsets:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:620
-msgid "Clones are translated by the same vector as their original."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:622
-msgid "Clones preserve their positions when their original is moved."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:624
-msgid ""
-"Each clone moves according to the value of its transform= attribute. For "
-"example, a rotated clone will move in a different direction than its "
-"original."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:625
-msgid "When the original is deleted, its clones:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:627
-msgid "Orphaned clones are converted to regular objects."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:629
-msgid "Orphaned clones are deleted along with their original."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:631
-msgid "When duplicating original+clones:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:633
-msgid "Relink duplicated clones"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:635
-msgid ""
-"When duplicating a selection containing both a clone and its original "
-"(possibly in groups), relink the duplicated clone to the duplicated original "
-"instead of the old original"
-msgstr ""
-
-#. TRANSLATORS: Heading for the Inkscape Preferences "Clones" Page
-#: ../src/ui/dialog/inkscape-preferences.cpp:638
-msgid "Clones"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:643
-msgid "When applying, use the topmost selected object as clippath/mask"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:645
-msgid ""
-"Uncheck this to use the bottom selected object as the clipping path or mask"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:646
-msgid "Remove clippath/mask object after applying"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:648
-msgid ""
-"After applying, remove the object used as the clipping path or mask from the "
-"drawing"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:649
-msgid "Clippaths and masks"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:654
-#: ../src/widgets/select-toolbar.cpp:544
-msgid "Scale stroke width"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:655
-msgid "Scale rounded corners in rectangles"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:656
-msgid "Transform gradients"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:657
-msgid "Transform patterns"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:658
-msgid "Optimized"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:659
-msgid "Preserved"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:662
-#: ../src/widgets/select-toolbar.cpp:545
-msgid "When scaling objects, scale the stroke width by the same proportion"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:664
-#: ../src/widgets/select-toolbar.cpp:556
-msgid "When scaling rectangles, scale the radii of rounded corners"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:666
-#: ../src/widgets/select-toolbar.cpp:567
-msgid "Move gradients (in fill or stroke) along with the objects"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:668
-#: ../src/widgets/select-toolbar.cpp:578
-msgid "Move patterns (in fill or stroke) along with the objects"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:669
-msgid "Store transformation:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:671
-msgid ""
-"If possible, apply transformation to objects without adding a transform= "
-"attribute"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:673
-msgid "Always store transformation as a transform= attribute on objects"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:675
-msgid "Transforms"
-msgstr ""
-
-#. blur quality
-#. filter quality
-#: ../src/ui/dialog/inkscape-preferences.cpp:681
-#: ../src/ui/dialog/inkscape-preferences.cpp:705
-msgid "Best quality (slowest)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:683
-#: ../src/ui/dialog/inkscape-preferences.cpp:707
-msgid "Better quality (slower)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:685
-#: ../src/ui/dialog/inkscape-preferences.cpp:709
-msgid "Average quality"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:687
-#: ../src/ui/dialog/inkscape-preferences.cpp:711
-msgid "Lower quality (faster)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:689
-#: ../src/ui/dialog/inkscape-preferences.cpp:713
-msgid "Lowest quality (fastest)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:692
-msgid "Gaussian blur quality for display:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:694
-#: ../src/ui/dialog/inkscape-preferences.cpp:718
-msgid ""
-"Best quality, but display may be very slow at high zooms (bitmap export "
-"always uses best quality)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:696
-#: ../src/ui/dialog/inkscape-preferences.cpp:720
-msgid "Better quality, but slower display"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:698
-#: ../src/ui/dialog/inkscape-preferences.cpp:722
-msgid "Average quality, acceptable display speed"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:700
-#: ../src/ui/dialog/inkscape-preferences.cpp:724
-msgid "Lower quality (some artifacts), but display is faster"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:702
-#: ../src/ui/dialog/inkscape-preferences.cpp:726
-msgid "Lowest quality (considerable artifacts), but display is fastest"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:716
-msgid "Filter effects quality for display:"
-msgstr ""
-
-#. show infobox
-#: ../src/ui/dialog/inkscape-preferences.cpp:729
-msgid "Show filter primitives infobox"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:731
-msgid ""
-"Show icons and descriptions for the filter primitives available at the "
-"filter effects dialog."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:739
-msgid "Select in all layers"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:740
-msgid "Select only within current layer"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:741
-msgid "Select in current layer and sublayers"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:742
-msgid "Ignore hidden objects and layers"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:743
-msgid "Ignore locked objects and layers"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:744
-msgid "Deselect upon layer change"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:746
-msgid "Ctrl+A, Tab, Shift+Tab:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:748
-msgid "Make keyboard selection commands work on objects in all layers"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:750
-msgid "Make keyboard selection commands work on objects in current layer only"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:752
-msgid ""
-"Make keyboard selection commands work on objects in current layer and all "
-"its sublayers"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:754
-msgid ""
-"Uncheck this to be able to select objects that are hidden (either by "
-"themselves or by being in a hidden layer)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:756
-msgid ""
-"Uncheck this to be able to select objects that are locked (either by "
-"themselves or by being in a locked layer)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:759
-msgid ""
-"Uncheck this to be able to keep the current objects selected when the "
-"current layer changes"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:761
-msgid "Selecting"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:768
-msgid "Default export resolution:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:769
-msgid "Default bitmap resolution (in dots per inch) in the Export dialog"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:771
-msgid "Open Clip Art Library Server Name:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:772
-msgid ""
-"The server name of the Open Clip Art Library webdav server. It's used by the "
-"Import and Export to OCAL function."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:774
-msgid "Open Clip Art Library Username:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:775
-msgid "The username used to log into Open Clip Art Library."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:777
-msgid "Open Clip Art Library Password:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:778
-msgid "The password used to log into Open Clip Art Library."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:780
-msgid "Import/Export"
-msgstr ""
-
-#. TRANSLATORS: see http://www.newsandtech.com/issues/2004/03-04/pt/03-04_rendering.htm
-#: ../src/ui/dialog/inkscape-preferences.cpp:830
-msgid "Perceptual"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:830
-msgid "Relative Colorimetric"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:830
-msgid "Absolute Colorimetric"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:834
-msgid "(Note: Color management has been disabled in this build)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:838
-msgid "Display adjustment"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:848
-#, c-format
-msgid ""
-"The ICC profile to use to calibrate display output.\n"
-"Searched directories:%s"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:849
-msgid "Display profile:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:854
-msgid "Retrieve profile from display"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:857
-msgid "Retrieve profiles from those attached to displays via XICC."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:859
-msgid "Retrieve profiles from those attached to displays."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:864
-msgid "Display rendering intent:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:865
-#: ../src/ui/dialog/inkscape-preferences.cpp:888
-msgid "The rendering intent to use to calibrate display output."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:867
-msgid "Proofing"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:869
-msgid "Simulate output on screen"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:871
-msgid "Simulates output of target device."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:873
-msgid "Mark out of gamut colors"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:875
-msgid "Highlights colors that are out of gamut for the target device."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:880
-msgid "Out of gamut warning color:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:881
-msgid "Selects the color used for out of gamut warning."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:883
-msgid "Device profile:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:884
-msgid "The ICC profile to use to simulate device output."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:887
-msgid "Device rendering intent:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:890
-msgid "Black point compensation"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:892
-msgid "Enables black point compensation."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:894
-msgid "Preserve black"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:899
-msgid "(LittleCMS 1.15 or later required)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:901
-msgid "Preserve K channel in CMYK -> CMYK transforms"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:914
-#: ../src/widgets/sp-color-icc-selector.cpp:306
-#: ../src/widgets/sp-color-icc-selector.cpp:579
-msgid "<none>"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:959
-msgid "Color management"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:964
-msgid "Major grid line emphasizing"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:966
-msgid "Don't emphasize gridlines when zoomed out"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:967
-msgid ""
-"If set and zoomed out, the gridlines will be shown in normal color instead "
-"of major grid line color."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:969
-msgid "Default grid settings"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:975
-#: ../src/ui/dialog/inkscape-preferences.cpp:996
-msgid "Grid units:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:978
-#: ../src/ui/dialog/inkscape-preferences.cpp:999
-msgid "Origin X:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:979
-#: ../src/ui/dialog/inkscape-preferences.cpp:1000
-msgid "Origin Y:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:982
-msgid "Spacing X:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:983
-#: ../src/ui/dialog/inkscape-preferences.cpp:1002
-msgid "Spacing Y:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:985
-#: ../src/ui/dialog/inkscape-preferences.cpp:986
-#: ../src/ui/dialog/inkscape-preferences.cpp:1007
-#: ../src/ui/dialog/inkscape-preferences.cpp:1008
-msgid "Grid line color:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:986
-#: ../src/ui/dialog/inkscape-preferences.cpp:1008
-msgid "Color used for normal grid lines"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:987
-#: ../src/ui/dialog/inkscape-preferences.cpp:988
-#: ../src/ui/dialog/inkscape-preferences.cpp:1009
-#: ../src/ui/dialog/inkscape-preferences.cpp:1010
-msgid "Major grid line color:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:988
-#: ../src/ui/dialog/inkscape-preferences.cpp:1010
-msgid "Color used for major (highlighted) grid lines"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:990
-#: ../src/ui/dialog/inkscape-preferences.cpp:1012
-msgid "Major grid line every:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:991
-msgid "Show dots instead of lines"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:992
-msgid "If set, display dots at gridpoints instead of gridlines"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1019
-msgid "Use named colors"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1020
-msgid ""
-"If set, write the CSS name of the color when available (e.g. 'red' or "
-"'magenta') instead of the numeric value"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1022
-msgid "XML formatting"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1024
-msgid "Inline attributes"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1025
-msgid "Put attributes on the same line as the element tag"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1028
-msgid "Indent, spaces:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1028
-msgid ""
-"The number of spaces to use for indenting nested elements; set to 0 for no "
-"indentation"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1030
-msgid "Path data"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1032
-msgid "Allow relative coordinates"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1033
-msgid "If set, relative coordinates may be used in path data"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1035
-msgid "Force repeat commands"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1036
-msgid ""
-"Force repeating of the same path command (for example, 'L 1,2 L 3,4' instead "
-"of 'L 1,2 3,4')"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1038
-msgid "Numbers"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1041
-msgid "Numeric precision:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1041
-msgid "How many digits to write after the decimal dot"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1044
-msgid "Minimum exponent:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1044
-msgid ""
-"The smallest number written to SVG is 10 to the power of this exponent; "
-"anything smaller is written as zero."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1046
-msgid "SVG output"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1051
-msgid "System default"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1051
-msgid "Albanian (sq)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1051
-msgid "Amharic (am)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1051
-msgid "Arabic (ar)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1051
-msgid "Armenian (hy)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1051
-msgid "Azerbaijani (az)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1051
-msgid "Basque (eu)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1051
-msgid "Belarusian (be)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1052
-msgid "Bulgarian (bg)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1052
-msgid "Bengali (bn)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1052
-msgid "Breton (br)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1052
-msgid "Catalan (ca)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1052
-msgid "Valencian Catalan (ca@valencia)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1052
-msgid "Chinese/China (zh_CN)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1053
-msgid "Chinese/Taiwan (zh_TW)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1053
-msgid "Croatian (hr)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1053
-msgid "Czech (cs)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1054
-msgid "Danish (da)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1054
-msgid "Dutch (nl)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1054
-msgid "Dzongkha (dz)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1054
-msgid "German (de)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1054
-msgid "Greek (el)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1054
-msgid "English (en)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1054
-msgid "English/Australia (en_AU)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1055
-msgid "English/Canada (en_CA)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1055
-msgid "English/Great Britain (en_GB)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1055
-msgid "Pig Latin (en_US@piglatin)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1056
-msgid "Esperanto (eo)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1056
-msgid "Estonian (et)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1056
-msgid "Finnish (fi)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1057
-msgid "French (fr)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1057
-msgid "Irish (ga)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1057
-msgid "Galician (gl)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1057
-msgid "Hebrew (he)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1057
-msgid "Hungarian (hu)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1058
-msgid "Indonesian (id)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1058
-msgid "Italian (it)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1058
-msgid "Japanese (ja)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1058
-msgid "Khmer (km)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1058
-msgid "Kinyarwanda (rw)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1058
-msgid "Korean (ko)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1058
-msgid "Lithuanian (lt)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1058
-msgid "Macedonian (mk)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1059
-msgid "Mongolian (mn)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1059
-msgid "Nepali (ne)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1059
-msgid "Norwegian BokmÃ¥l (nb)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1059
-msgid "Norwegian Nynorsk (nn)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1059
-msgid "Panjabi (pa)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1060
-msgid "Polish (pl)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1060
-msgid "Portuguese (pt)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1060
-msgid "Portuguese/Brazil (pt_BR)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1060
-msgid "Romanian (ro)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1060
-msgid "Russian (ru)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1061
-msgid "Serbian (sr)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1061
-msgid "Serbian in Latin script (sr@latin)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1061
-msgid "Slovak (sk)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1061
-msgid "Slovenian (sl)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1061
-msgid "Spanish (es)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1061
-msgid "Spanish/Mexico (es_MX)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1062
-msgid "Swedish (sv)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1062
-msgid "Thai (th)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1062
-msgid "Turkish (tr)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1062
-msgid "Ukrainian (uk)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1062
-msgid "Vietnamese (vi)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1069
-msgid "Language (requires restart):"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1070
-msgid "Set the language for menus and number formats"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1072
-msgid "Smaller"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1076
-msgid "Toolbox icon size"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1077
-msgid "Set the size for the tool icons (requires restart)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1080
-msgid "Control bar icon size"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1081
-msgid ""
-"Set the size for the icons in tools' control bars to use (requires restart)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1084
-msgid "Secondary toolbar icon size"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1085
-msgid ""
-"Set the size for the icons in secondary toolbars to use (requires restart)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1088
-msgid "Work-around color sliders not drawing."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1090
-msgid ""
-"When on, will attempt to work around bugs in certain GTK themes drawing "
-"color sliders."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1096
-msgid "Clear list"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1101
-msgid "Maximum documents in Open Recent:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1102
-msgid ""
-"Set the maximum length of the Open Recent list in the File menu, or clear "
-"the list"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1105
-msgid "Zoom correction factor (in %):"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1106
-msgid ""
-"Adjust the slider until the length of the ruler on your screen matches its "
-"real length. This information is used when zooming to 1:1, 1:2, etc., to "
-"display objects in their true sizes"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1108
-msgid "Interface"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1114
-msgid "Use current directory for \"Save As ...\""
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1116
-msgid ""
-"When this option is on, the \"Save as...\" dialog will always open in the "
-"directory where the currently open document is. When it's off, it will open "
-"in the directory where you last saved a file using that dialog."
-msgstr ""
-
-#. Autosave options
-#: ../src/ui/dialog/inkscape-preferences.cpp:1120
-msgid "Enable autosave (requires restart)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1121
-msgid ""
-"Automatically save the current document(s) at a given interval, thus "
-"minimizing loss in case of a crash"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1123
-msgid "Interval (in minutes):"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1123
-msgid "Interval (in minutes) at which document will be autosaved"
-msgstr ""
-
-#. TRANSLATORS: only translate "string" in "context|string".
-#. For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS
-#: ../src/ui/dialog/inkscape-preferences.cpp:1127
-msgid "filesystem|Path:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1127
-msgid "The directory where autosaves will be written"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1129
-msgid "Maximum number of autosaves:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1129
-msgid ""
-"Maximum number of autosaved files; use this to limit the storage space used"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1151
-msgid "2x2"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1151
-msgid "4x4"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1151
-msgid "8x8"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1151
-msgid "16x16"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1155
-msgid "Oversample bitmaps:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1158
-msgid "Automatically reload bitmaps"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1160
-msgid "Automatically reload linked images when file is changed on disk"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1174
-msgid "Bitmap editor:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1180
-msgid "Resolution for Create Bitmap Copy:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1181
-msgid "Resolution used by the Create Bitmap Copy command"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1183
-msgid "Bitmaps"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1235
-msgid "Language:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1236
-msgid "Set the main spell check language"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1239
-msgid "Second language:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1240
-msgid ""
-"Set the second spell check language; checking will only stop on words "
-"unknown in ALL chosen languages"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1243
-msgid "Third language:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1244
-msgid ""
-"Set the third spell check language; checking will only stop on words unknown "
-"in ALL chosen languages"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1246
-msgid "Ignore words with digits"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1248
-msgid "Ignore words containing digits, such as \"R2D2\""
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1250
-msgid "Ignore words in ALL CAPITALS"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1252
-msgid "Ignore words in all capitals, such as \"IUPAC\""
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1254
-msgid "Spellcheck"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1273
-msgid "Add label comments to printing output"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1275
-msgid ""
-"When on, a comment will be added to the raw print output, marking the "
-"rendered output for an object with its label"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1277
-msgid "Prevent sharing of gradient definitions"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1279
-msgid ""
-"When on, shared gradient definitions are automatically forked on change; "
-"uncheck to allow sharing of gradient definitions so that editing one object "
-"may affect other objects using the same gradient"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1282
-msgid "Simplification threshold:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1283
-msgid ""
-"How strong is the Node tool's Simplify command by default. If you invoke "
-"this command several times in quick succession, it will act more and more "
-"aggressively; invoking it again after a pause restores the default threshold."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1286
-msgid "Latency skew:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1286
-msgid "(requires restart)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1287
-msgid ""
-"Factor by which the event clock is skewed from the actual time (0.9766 on "
-"some systems)."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1289
-msgid "Pre-render named icons"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1291
-msgid ""
-"When on, named icons will be rendered before displaying the ui. This is for "
-"working around bugs in GTK+ named icon notification"
-msgstr ""
-
-#. TRANSLATORS: following strings are paths in Inkscape preferences - Misc - System info
-#: ../src/ui/dialog/inkscape-preferences.cpp:1297
-msgid "User config: "
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1301
-msgid "User data: "
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1305
-msgid "User cache: "
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1309
-msgid "System config: "
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1312
-msgid "System data: "
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1315
-msgid "PIXMAP: "
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1319
-msgid "DATA: "
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1323
-msgid "UI: "
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1332
-msgid "Icon theme: "
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1347
-msgid "System info"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1347
-msgid "General system information"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1349
-msgid "Misc"
-msgstr ""
-
-#: ../src/ui/dialog/layer-properties.cpp:41
-msgid "Layer name:"
-msgstr ""
-
-#: ../src/ui/dialog/layer-properties.cpp:109
-msgid "Add layer"
-msgstr ""
-
-#: ../src/ui/dialog/layer-properties.cpp:147
-msgid "Above current"
-msgstr ""
-
-#: ../src/ui/dialog/layer-properties.cpp:151
-msgid "Below current"
-msgstr ""
-
-#: ../src/ui/dialog/layer-properties.cpp:154
-msgid "As sublayer of current"
-msgstr ""
-
-#: ../src/ui/dialog/layer-properties.cpp:158
-msgid "Position:"
-msgstr ""
-
-#: ../src/ui/dialog/layer-properties.cpp:176
-msgid "Rename Layer"
-msgstr ""
-
-#: ../src/ui/dialog/layer-properties.cpp:179
-msgid "_Rename"
-msgstr ""
-
-#: ../src/ui/dialog/layer-properties.cpp:192
-msgid "Rename layer"
-msgstr ""
-
-#. TRANSLATORS: This means "The layer has been renamed"
-#: ../src/ui/dialog/layer-properties.cpp:194
-msgid "Renamed layer"
-msgstr ""
-
-#: ../src/ui/dialog/layer-properties.cpp:198
-msgid "Add Layer"
-msgstr ""
-
-#: ../src/ui/dialog/layer-properties.cpp:201
-msgid "_Add"
-msgstr ""
-
-#: ../src/ui/dialog/layer-properties.cpp:225
-msgid "New layer created."
-msgstr ""
-
-#: ../src/ui/dialog/layers.cpp:495 ../src/ui/widget/layer-selector.cpp:595
-msgid "Unhide layer"
-msgstr ""
-
-#: ../src/ui/dialog/layers.cpp:495 ../src/ui/widget/layer-selector.cpp:595
-msgid "Hide layer"
-msgstr ""
-
-#: ../src/ui/dialog/layers.cpp:506 ../src/ui/widget/layer-selector.cpp:587
-msgid "Lock layer"
-msgstr ""
-
-#: ../src/ui/dialog/layers.cpp:506 ../src/ui/widget/layer-selector.cpp:587
-msgid "Unlock layer"
-msgstr ""
-
-#: ../src/ui/dialog/layers.cpp:656
-msgid "New"
-msgstr ""
-
-#. TRANSLATORS: only translate "string" in "context|string".
-#. For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS
-#: ../src/ui/dialog/layers.cpp:663
-msgid "layers|Top"
-msgstr ""
-
-#: ../src/ui/dialog/layers.cpp:669
-msgid "Up"
-msgstr ""
-
-#: ../src/ui/dialog/layers.cpp:675
-msgid "Dn"
-msgstr ""
-
-#: ../src/ui/dialog/layers.cpp:681
-msgid "Bot"
-msgstr ""
-
-#: ../src/ui/dialog/layers.cpp:691
-msgid "X"
-msgstr ""
-
-#. TRANSLATORS: this dialog is accessible via menu Path - Path Effect Editor...
-#: ../src/ui/dialog/livepatheffect-editor.cpp:78
-msgid "Apply new effect"
-msgstr ""
-
-#: ../src/ui/dialog/livepatheffect-editor.cpp:79
-msgid "Current effect"
-msgstr ""
-
-#: ../src/ui/dialog/livepatheffect-editor.cpp:80
-msgid "Effect list"
-msgstr ""
-
-#: ../src/ui/dialog/livepatheffect-editor.cpp:269
-msgid "Unknown effect is applied"
-msgstr ""
-
-#: ../src/ui/dialog/livepatheffect-editor.cpp:272
-msgid "No effect applied"
-msgstr ""
-
-#: ../src/ui/dialog/livepatheffect-editor.cpp:276
-msgid "Item is not a path or shape"
-msgstr ""
-
-#: ../src/ui/dialog/livepatheffect-editor.cpp:280
-msgid "Only one item can be selected"
-msgstr ""
-
-#: ../src/ui/dialog/livepatheffect-editor.cpp:284
-msgid "Empty selection"
-msgstr ""
-
-#: ../src/ui/dialog/livepatheffect-editor.cpp:308
-msgid "Unknown effect"
-msgstr ""
-
-#: ../src/ui/dialog/livepatheffect-editor.cpp:374
-msgid "Create and apply path effect"
-msgstr ""
-
-#: ../src/ui/dialog/livepatheffect-editor.cpp:391
-msgid "Remove path effect"
-msgstr ""
-
-#: ../src/ui/dialog/livepatheffect-editor.cpp:407
-msgid "Move path effect up"
-msgstr ""
-
-#: ../src/ui/dialog/livepatheffect-editor.cpp:423
-msgid "Move path effect down"
-msgstr ""
-
-#: ../src/ui/dialog/livepatheffect-editor.cpp:462
-msgid "Activate path effect"
-msgstr ""
-
-#: ../src/ui/dialog/livepatheffect-editor.cpp:462
-msgid "Deactivate path effect"
-msgstr ""
-
-#: ../src/ui/dialog/memory.cpp:94
-msgid "Heap"
-msgstr ""
-
-#: ../src/ui/dialog/memory.cpp:95
-msgid "In Use"
-msgstr ""
-
-#. TRANSLATORS: "Slack" refers to memory which is in the heap but currently unused.
-#. More typical usage is to call this memory "free" rather than "slack".
-#: ../src/ui/dialog/memory.cpp:98
-msgid "Slack"
-msgstr ""
-
-#: ../src/ui/dialog/memory.cpp:99
-msgid "Total"
-msgstr ""
-
-#: ../src/ui/dialog/memory.cpp:139 ../src/ui/dialog/memory.cpp:145
-#: ../src/ui/dialog/memory.cpp:152 ../src/ui/dialog/memory.cpp:184
-msgid "Unknown"
-msgstr ""
-
-#: ../src/ui/dialog/memory.cpp:165
-msgid "Combined"
-msgstr ""
-
-#: ../src/ui/dialog/memory.cpp:207
-msgid "Recalculate"
-msgstr ""
-
-#: ../src/ui/dialog/messages.cpp:73
-msgid "Ready."
-msgstr ""
-
-#: ../src/ui/dialog/messages.cpp:74
-msgid ""
-"Enable log display by setting dialogs.debug 'redirect' attribute to 1 in "
-"preferences.xml"
-msgstr ""
-
-#: ../src/ui/dialog/ocaldialogs.cpp:422
-msgid "Error while reading the Open Clip Art RSS feed"
-msgstr ""
-
-#: ../src/ui/dialog/ocaldialogs.cpp:461
-msgid ""
-"Failed to receive the Open Clip Art Library RSS feed. Verify if the server "
-"name is correct in Configuration->Import/Export (e.g.: openclipart.org)"
-msgstr ""
-
-#: ../src/ui/dialog/ocaldialogs.cpp:475
-msgid "Server supplied malformed Clip Art feed"
-msgstr ""
-
-#: ../src/ui/dialog/ocaldialogs.cpp:566
-msgid "Search for:"
-msgstr ""
-
-#: ../src/ui/dialog/ocaldialogs.cpp:567
-msgid "No files matched your search"
-msgstr ""
-
-#: ../src/ui/dialog/ocaldialogs.cpp:578
-msgid "Search"
-msgstr ""
-
-#: ../src/ui/dialog/ocaldialogs.cpp:595
-msgid "Files found"
-msgstr ""
-
-#: ../src/ui/dialog/print.cpp:93
-msgid "Could not open temporary PNG for bitmap printing"
-msgstr ""
-
-#: ../src/ui/dialog/print.cpp:136
-msgid "Could not set up Document"
-msgstr ""
-
-#: ../src/ui/dialog/print.cpp:140
-msgid "Failed to set CairoRenderContext"
-msgstr ""
-
-#. set up dialog title, based on document name
-#: ../src/ui/dialog/print.cpp:180
-msgid "SVG Document"
-msgstr ""
-
-#: ../src/ui/dialog/print.cpp:181
-msgid "Print"
-msgstr ""
-
-#. build custom preferences tab
-#: ../src/ui/dialog/print.cpp:215
-msgid "Rendering"
-msgstr ""
-
-#: ../src/ui/dialog/scriptdialog.cpp:211
-msgid "_Execute Javascript"
-msgstr ""
-
-#: ../src/ui/dialog/scriptdialog.cpp:213
-msgid "_Execute Python"
-msgstr ""
-
-#: ../src/ui/dialog/scriptdialog.cpp:215
-msgid "_Execute Ruby"
-msgstr ""
-
-#: ../src/ui/dialog/scriptdialog.cpp:224
-msgid "Script"
-msgstr ""
-
-#: ../src/ui/dialog/scriptdialog.cpp:234
-msgid "Output"
-msgstr ""
-
-#: ../src/ui/dialog/scriptdialog.cpp:244
-msgid "Errors"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:121
-msgid "Set SVG Font attribute"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:174
-msgid "Adjust kerning value"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:364
-msgid "Family Name:"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:374
-msgid "Set width:"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:433
-msgid "glyph"
-msgstr ""
-
-#. SPGlyph* glyph =
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:465
-msgid "Add glyph"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:481
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:525
-msgid "Select a <b>path</b> to define the curves of a glyph"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:489
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:533
-msgid "The selected object does not have a <b>path</b> description."
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:504
-msgid "No glyph selected in the SVGFonts dialog."
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:509
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:551
-msgid "Set glyph curves"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:570
-msgid "Reset missing-glyph"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:585
-msgid "Edit glyph name"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:598
-msgid "Set glyph unicode"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:608
-msgid "Remove font"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:623
-msgid "Remove glyph"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:638
-msgid "Remove kerning pair"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:648
-msgid "Missing Glyph:"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:652
-msgid "From selection..."
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:654
-#: ../src/ui/widget/preferences-widget.cpp:590
-msgid "Reset"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:665
-msgid "Glyph name"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:666
-msgid "Matching string"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:669
-msgid "Add Glyph"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:676
-msgid "Get curves from selection..."
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:726
-msgid "Add kerning pair"
-msgstr ""
-
-#. Kerning Setup:
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:734
-msgid "Kerning Setup:"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:736
-msgid "1st Glyph:"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:738
-msgid "2nd Glyph:"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:741
-msgid "Add pair"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:753
-msgid "First Unicode range"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:754
-msgid "Second Unicode range"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:761
-msgid "Kerning value:"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:819
-msgid "Set font family"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:828
-msgid "font"
-msgstr ""
-
-#. select_font(font);
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:842
-msgid "Add font"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:862
-msgid "_Font"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:870
-msgid "_Global Settings"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:871
-msgid "_Glyphs"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:872
-msgid "_Kerning"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:879
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:880
-msgid "Sample Text"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:884
-msgid "Preview Text:"
-msgstr ""
-
-#: ../src/ui/dialog/swatches.cpp:331
-#, c-format
-msgid ""
-"Color: <b>%s</b>; <b>Click</b> to set fill, <b>Shift+click</b> to set stroke"
-msgstr ""
-
-#. TRANSLATORS: An item in context menu on a colour in the swatches
-#: ../src/ui/dialog/swatches.cpp:442
-msgid "Set fill"
-msgstr ""
-
-#. TRANSLATORS: An item in context menu on a colour in the swatches
-#: ../src/ui/dialog/swatches.cpp:450
-msgid "Set stroke"
-msgstr ""
-
-#: ../src/ui/dialog/swatches.cpp:476 ../src/widgets/gradient-selector.cpp:144
-#: ../src/widgets/gradient-toolbar.cpp:466
-msgid "Edit..."
-msgstr ""
-
-#: ../src/ui/dialog/swatches.cpp:488
-msgid "Convert"
-msgstr ""
-
-#: ../src/ui/dialog/swatches.cpp:651
-msgid "Change color definition"
-msgstr ""
-
-#: ../src/ui/dialog/swatches.cpp:852
-msgid "Remove stroke color"
-msgstr ""
-
-#: ../src/ui/dialog/swatches.cpp:852
-msgid "Remove fill color"
-msgstr ""
-
-#: ../src/ui/dialog/swatches.cpp:857
-msgid "Set stroke color to none"
-msgstr ""
-
-#: ../src/ui/dialog/swatches.cpp:857
-msgid "Set fill color to none"
-msgstr ""
-
-#: ../src/ui/dialog/swatches.cpp:874
-msgid "Set stroke color from swatch"
-msgstr ""
-
-#: ../src/ui/dialog/swatches.cpp:874
-msgid "Set fill color from swatch"
-msgstr ""
-
-#: ../src/ui/dialog/swatches.cpp:1198
-#, c-format
-msgid "Palettes directory (%s) is unavailable."
-msgstr ""
-
-#: ../src/ui/dialog/tile.cpp:346
-msgid "Arrange in a grid"
-msgstr ""
-
-#: ../src/ui/dialog/tile.cpp:652
-msgid "Rows:"
-msgstr ""
-
-#: ../src/ui/dialog/tile.cpp:660
-msgid "Number of rows"
-msgstr ""
-
-#: ../src/ui/dialog/tile.cpp:664
-msgid "Equal height"
-msgstr ""
-
-#: ../src/ui/dialog/tile.cpp:674
-msgid "If not set, each row has the height of the tallest object in it"
-msgstr ""
-
-#. #### Radio buttons to control vertical alignment ####
-#. #### Radio buttons to control horizontal alignment ####
-#: ../src/ui/dialog/tile.cpp:680 ../src/ui/dialog/tile.cpp:750
-msgid "Align:"
-msgstr ""
-
-#. #### Number of columns ####
-#: ../src/ui/dialog/tile.cpp:722
-msgid "Columns:"
-msgstr ""
-
-#: ../src/ui/dialog/tile.cpp:730
-msgid "Number of columns"
-msgstr ""
-
-#: ../src/ui/dialog/tile.cpp:734
-msgid "Equal width"
-msgstr ""
-
-#: ../src/ui/dialog/tile.cpp:743
-msgid "If not set, each column has the width of the widest object in it"
-msgstr ""
-
-#. #### Radio buttons to control spacing manually or to fit selection bbox ####
-#: ../src/ui/dialog/tile.cpp:789
-msgid "Fit into selection box"
-msgstr ""
-
-#: ../src/ui/dialog/tile.cpp:795
-msgid "Set spacing:"
-msgstr ""
-
-#: ../src/ui/dialog/tile.cpp:815
-msgid "Vertical spacing between rows (px units)"
-msgstr ""
-
-#: ../src/ui/dialog/tile.cpp:840
-msgid "Horizontal spacing between columns (px units)"
-msgstr ""
-
-#. ## The OK button
-#: ../src/ui/dialog/tile.cpp:863
-msgid "tileClonesDialog|Arrange"
-msgstr ""
-
-#: ../src/ui/dialog/tile.cpp:864
-msgid "Arrange selected objects"
-msgstr ""
-
-#. #### begin left panel
-#. ### begin notebook
-#. ## begin mode page
-#. # begin single scan
-#. brightness
-#: ../src/ui/dialog/tracedialog.cpp:406
-msgid "Brightness cutoff"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:410
-msgid "Trace by a given brightness level"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:418
-msgid "Brightness cutoff for black/white"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:425
-msgid "Single scan: creates a path"
-msgstr ""
-
-#. canny edge detection
-#. TRANSLATORS: "Canny" is the name of the inventor of this edge detection method
-#: ../src/ui/dialog/tracedialog.cpp:430
-msgid "Edge detection"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:434
-msgid "Trace with optimal edge detection by J. Canny's algorithm"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:451
-msgid "Brightness cutoff for adjacent pixels (determines edge thickness)"
-msgstr ""
-
-#. quantization
-#. TRANSLATORS: Color Quantization: the process of reducing the number
-#. of colors in an image by selecting an optimized set of representative
-#. colors and then re-applying this reduced set to the original image.
-#: ../src/ui/dialog/tracedialog.cpp:463
-msgid "Color quantization"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:467
-msgid "Trace along the boundaries of reduced colors"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:475
-msgid "The number of reduced colors"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:477
-msgid "Colors:"
-msgstr ""
-
-#. swap black and white
-#: ../src/ui/dialog/tracedialog.cpp:483
-msgid "Invert image"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:488
-msgid "Invert black and white regions"
-msgstr ""
-
-#. # end single scan
-#. # begin multiple scan
-#: ../src/ui/dialog/tracedialog.cpp:497
-msgid "Brightness steps"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:501
-msgid "Trace the given number of brightness levels"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:508
-msgid "Scans:"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:511
-msgid "The desired number of scans"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:515
-#: ../share/extensions/svgcalendar.inx.h:6
-msgid "Colors"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:519
-msgid "Trace the given number of reduced colors"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:523
-msgid "Grays"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:527
-msgid "Same as Colors, but the result is converted to grayscale"
-msgstr ""
-
-#. TRANSLATORS: "Smooth" is a verb here
-#: ../src/ui/dialog/tracedialog.cpp:532
-msgid "Smooth"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:536
-msgid "Apply Gaussian blur to the bitmap before tracing"
-msgstr ""
-
-#. TRANSLATORS: "Stack" is a verb here
-#: ../src/ui/dialog/tracedialog.cpp:539
-msgid "Stack scans"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:542
-msgid ""
-"Stack scans on top of one another (no gaps) instead of tiling (usually with "
-"gaps)"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:545
-msgid "Remove background"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:550
-msgid "Remove bottom (background) layer when done"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:554
-msgid "Multiple scans: creates a group of paths"
-msgstr ""
-
-#. # end multiple scan
-#. ## end mode page
-#: ../src/ui/dialog/tracedialog.cpp:563 ../src/widgets/toolbox.cpp:4249
-#: ../share/extensions/triangle.inx.h:9
-msgid "Mode"
-msgstr ""
-
-#. ## begin option page
-#. # potrace parameters
-#: ../src/ui/dialog/tracedialog.cpp:569
-msgid "Suppress speckles"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:571
-msgid "Ignore small spots (speckles) in the bitmap"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:579
-msgid "Speckles of up to this many pixels will be suppressed"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:584
-msgid "Smooth corners"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:586
-msgid "Smooth out sharp corners of the trace"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:595
-msgid "Increase this to smooth corners more"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:599
-msgid "Optimize paths"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:602
-msgid "Try to optimize paths by joining adjacent Bezier curve segments"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:610
-msgid ""
-"Increase this to reduce the number of nodes in the trace by more aggressive "
-"optimization"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:611
-msgid "Tolerance:"
-msgstr ""
-
-#. ## end option page
-#: ../src/ui/dialog/tracedialog.cpp:617 ../src/ui/dialog/tracedialog.cpp:623
-#: ../share/extensions/dxf_input.inx.h:11
-#: ../share/extensions/dxf_outlines.inx.h:9 ../share/extensions/scour.inx.h:10
-msgid "Options"
-msgstr ""
-
-#. ### credits
-#: ../src/ui/dialog/tracedialog.cpp:627
-msgid ""
-"Inkscape bitmap tracing\n"
-"is based on Potrace,\n"
-"created by Peter Selinger\n"
-"\n"
-"http://potrace.sourceforge.net"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:630
-msgid "Credits"
-msgstr ""
-
-#. #### begin right panel
-#. ## SIOX
-#: ../src/ui/dialog/tracedialog.cpp:644
-msgid "SIOX foreground selection"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:647
-msgid "Cover the area you want to select as the foreground"
-msgstr ""
-
-#. ## preview
-#: ../src/ui/dialog/tracedialog.cpp:652
-msgid "Update"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:658
-msgid ""
-"Preview the intermediate bitmap with the current settings, without actual "
-"tracing"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:662
-msgid "Preview"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:679
-msgid "Abort a trace in progress"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:683
-msgid "Execute the trace"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:82
-#: ../src/ui/dialog/transformation.cpp:92
-msgid "_Horizontal"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:82
-msgid "Horizontal displacement (relative) or position (absolute)"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:84
-#: ../src/ui/dialog/transformation.cpp:94
-msgid "_Vertical"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:84
-msgid "Vertical displacement (relative) or position (absolute)"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:86
-msgid "_Width"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:86
-msgid "Horizontal size (absolute or percentage of current)"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:88
-msgid "_Height"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:88
-msgid "Vertical size (absolute or percentage of current)"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:90
-msgid "A_ngle"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:90
-msgid "Rotation angle (positive = counterclockwise)"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:92
-msgid ""
-"Horizontal skew angle (positive = counterclockwise), or absolute "
-"displacement, or percentage displacement"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:94
-msgid ""
-"Vertical skew angle (positive = counterclockwise), or absolute displacement, "
-"or percentage displacement"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:97
-msgid "Transformation matrix element A"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:98
-msgid "Transformation matrix element B"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:99
-msgid "Transformation matrix element C"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:100
-msgid "Transformation matrix element D"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:101
-msgid "Transformation matrix element E"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:102
-msgid "Transformation matrix element F"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:104
-msgid "Rela_tive move"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:104
-msgid ""
-"Add the specified relative displacement to the current position; otherwise, "
-"edit the current absolute position directly"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:105
-msgid "Scale proportionally"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:105
-msgid "Preserve the width/height ratio of the scaled objects"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:106
-msgid "Apply to each _object separately"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:106
-msgid ""
-"Apply the scale/rotate/skew to each selected object separately; otherwise, "
-"transform the selection as a whole"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:107
-msgid "Edit c_urrent matrix"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:107
-msgid ""
-"Edit the current transform= matrix; otherwise, post-multiply transform= by "
-"this matrix"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:117
-msgid "_Move"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:120
-msgid "_Scale"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:123
-msgid "_Rotate"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:126
-msgid "Ske_w"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:129
-msgid "Matri_x"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:153
-msgid "Reset the values on the current tab to defaults"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:160
-msgid "Apply transformation to selection"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:846
-msgid "Edit transformation matrix"
-msgstr ""
-
-#: ../src/ui/view/edit-widget.cpp:330 ../src/ui/view/edit-widget.cpp:335
-#: ../src/ui/view/edit-widget.cpp:343 ../src/ui/view/edit-widget.cpp:348
-#: ../src/ui/view/edit-widget.cpp:353 ../src/ui/view/edit-widget.cpp:368
-#: ../src/ui/view/edit-widget.cpp:381 ../src/ui/view/edit-widget.cpp:386
-#: ../src/ui/view/edit-widget.cpp:400 ../src/ui/view/edit-widget.cpp:404
-#: ../src/ui/view/edit-widget.cpp:412 ../src/ui/view/edit-widget.cpp:416
-#: ../src/ui/view/edit-widget.cpp:420 ../src/ui/view/edit-widget.cpp:756
-#: ../src/ui/view/edit-widget.cpp:761 ../src/ui/view/edit-widget.cpp:867
-#: ../src/ui/view/edit-widget.cpp:871 ../src/ui/view/edit-widget.cpp:992
-msgid "PLACEHOLDER, do not translate"
-msgstr ""
-
-#: ../src/ui/view/edit-widget.cpp:1051 ../src/widgets/desktop-widget.cpp:379
-msgid "Zoom drawing if window size changes"
-msgstr ""
-
-#: ../src/ui/view/edit-widget.cpp:1072 ../src/widgets/desktop-widget.cpp:503
-msgid "Cursor coordinates"
-msgstr ""
-
-#: ../src/ui/view/edit-widget.cpp:1082 ../src/widgets/desktop-widget.cpp:518
-msgid "Z:"
-msgstr ""
-
-#: ../src/ui/view/edit-widget.cpp:1089
-msgid ""
-"<b>Welcome to Inkscape!</b> Use shape or drawing tools to create objects; "
-"use selector (arrow) to move or transform them."
-msgstr ""
-
-#: ../src/ui/view/edit-widget.cpp:1200 ../src/widgets/desktop-widget.cpp:838
-#, c-format
-msgid ""
-"<span weight=\"bold\" size=\"larger\">Save changes to document \"%s\" before "
-"closing?</span>\n"
-"\n"
-"If you close without saving, your changes will be discarded."
-msgstr ""
-
-#: ../src/ui/view/edit-widget.cpp:1211 ../src/ui/view/edit-widget.cpp:1259
-#: ../src/widgets/desktop-widget.cpp:845 ../src/widgets/desktop-widget.cpp:902
-msgid "Close _without saving"
-msgstr ""
-
-#: ../src/ui/view/edit-widget.cpp:1247 ../src/widgets/desktop-widget.cpp:894
-#, c-format
-msgid ""
-"<span weight=\"bold\" size=\"larger\">The file \"%s\" was saved with a "
-"format (%s) that may cause data loss!</span>\n"
-"\n"
-"Do you want to save this file as an Inkscape SVG?"
-msgstr ""
-
-#: ../src/ui/view/edit-widget.cpp:1262 ../src/widgets/desktop-widget.cpp:905
-msgid "_Save as SVG"
-msgstr ""
-
-#: ../src/ui/widget/filter-effect-chooser.cpp:25
-msgid "_Blend mode:"
-msgstr ""
-
-#: ../src/ui/widget/filter-effect-chooser.cpp:26
-msgid "B_lur:"
-msgstr ""
-
-#: ../src/ui/widget/layer-selector.cpp:114
-msgid "Toggle current layer visibility"
-msgstr ""
-
-#: ../src/ui/widget/layer-selector.cpp:135
-msgid "Lock or unlock current layer"
-msgstr ""
-
-#: ../src/ui/widget/layer-selector.cpp:138
-msgid "Current layer"
-msgstr ""
-
-#: ../src/ui/widget/layer-selector.cpp:566
-msgid "(root)"
-msgstr ""
-
-#: ../src/ui/widget/licensor.cpp:35
-msgid "Proprietary"
-msgstr ""
-
-#: ../src/ui/widget/licensor.cpp:38
-msgid "MetadataLicence|Other"
-msgstr ""
-
-#: ../src/ui/widget/object-composite-settings.cpp:172
-msgid "Change blur"
-msgstr ""
-
-#: ../src/ui/widget/object-composite-settings.cpp:212
-#: ../src/ui/widget/selected-style.cpp:857
-#: ../src/ui/widget/selected-style.cpp:1151
-msgid "Change opacity"
-msgstr ""
-
-#: ../src/ui/widget/page-sizer.cpp:229
-msgid "U_nits:"
-msgstr ""
-
-#: ../src/ui/widget/page-sizer.cpp:230
-msgid "Width of paper"
-msgstr ""
-
-#: ../src/ui/widget/page-sizer.cpp:231
-msgid "Height of paper"
-msgstr ""
-
-#: ../src/ui/widget/page-sizer.cpp:277
-msgid "P_age size:"
-msgstr ""
-
-#: ../src/ui/widget/page-sizer.cpp:285
-msgid "Page orientation:"
-msgstr ""
-
-#: ../src/ui/widget/page-sizer.cpp:288
-msgid "_Landscape"
-msgstr ""
-
-#: ../src/ui/widget/page-sizer.cpp:293
-msgid "_Portrait"
-msgstr ""
-
-#. ## Set up custom size frame
-#: ../src/ui/widget/page-sizer.cpp:300
-msgid "Custom size"
-msgstr ""
-
-#: ../src/ui/widget/page-sizer.cpp:313
-msgid "_Fit page to selection"
-msgstr ""
-
-#: ../src/ui/widget/page-sizer.cpp:314
-msgid ""
-"Resize the page to fit the current selection, or the entire drawing if there "
-"is no selection"
-msgstr ""
-
-#: ../src/ui/widget/page-sizer.cpp:377
-msgid "Set page size"
-msgstr ""
-
-#: ../src/ui/widget/panel.cpp:111
-msgid "List"
-msgstr ""
-
-#. TRANSLATORS: only translate "string" in "context|string".
-#. For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS
-#: ../src/ui/widget/panel.cpp:136
-msgid "swatches|Size"
-msgstr ""
-
-#: ../src/ui/widget/panel.cpp:140
-msgid "tiny"
-msgstr ""
-
-#: ../src/ui/widget/panel.cpp:141
-msgid "small"
-msgstr ""
-
-#. TRANSLATORS: only translate "string" in "context|string".
-#. For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS
-#. "medium" indicates size of colour swatches
-#: ../src/ui/widget/panel.cpp:145
-msgid "swatchesHeight|medium"
-msgstr ""
-
-#: ../src/ui/widget/panel.cpp:146
-msgid "large"
-msgstr ""
-
-#: ../src/ui/widget/panel.cpp:147
-msgid "huge"
-msgstr ""
-
-#. TRANSLATORS: only translate "string" in "context|string".
-#. For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS
-#: ../src/ui/widget/panel.cpp:171
-msgid "swatches|Width"
-msgstr ""
-
-#: ../src/ui/widget/panel.cpp:175
-msgid "narrower"
-msgstr ""
-
-#: ../src/ui/widget/panel.cpp:176
-msgid "narrow"
-msgstr ""
-
-#. TRANSLATORS: only translate "string" in "context|string".
-#. For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS
-#. "medium" indicates width of colour swatches
-#: ../src/ui/widget/panel.cpp:180
-msgid "swatchesWidth|medium"
-msgstr ""
-
-#: ../src/ui/widget/panel.cpp:181
-msgid "wide"
-msgstr ""
-
-#: ../src/ui/widget/panel.cpp:182
-msgid "wider"
-msgstr ""
-
-#. TRANSLATORS: only translate "string" in "context|string".
-#. For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS
-#. "Wrap" indicates how colour swatches are displayed
-#: ../src/ui/widget/panel.cpp:215
-msgid "swatches|Wrap"
-msgstr ""
-
-#: ../src/ui/widget/random.cpp:123
-msgid ""
-"Reseed the random number generator; this creates a different sequence of "
-"random numbers."
-msgstr ""
-
-#: ../src/ui/widget/rendering-options.cpp:39
-msgid "Backend"
-msgstr ""
-
-#: ../src/ui/widget/rendering-options.cpp:40
-msgid "Vector"
-msgstr ""
-
-#: ../src/ui/widget/rendering-options.cpp:41
-msgid "Bitmap"
-msgstr ""
-
-#: ../src/ui/widget/rendering-options.cpp:42
-msgid "Bitmap options"
-msgstr ""
-
-#: ../src/ui/widget/rendering-options.cpp:44
-msgid "Preferred resolution of rendering, in dots per inch."
-msgstr ""
-
-#: ../src/ui/widget/rendering-options.cpp:52
-msgid ""
-"Render using Cairo vector operations.  The resulting image is usually "
-"smaller in file size and can be arbitrarily scaled, but some filter effects "
-"will not be correctly rendered."
-msgstr ""
-
-#: ../src/ui/widget/rendering-options.cpp:57
-msgid ""
-"Render everything as bitmap.  The resulting image is usually larger in file "
-"size and cannot be arbitrarily scaled without quality loss, but all objects "
-"will be rendered exactly as displayed."
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:112
-#: ../src/ui/widget/style-swatch.cpp:117
-msgid "Fill:"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:113
-#: ../src/ui/widget/style-swatch.cpp:118
-msgid "Stroke:"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:114
-msgid "O:"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:156
-msgid "N/A"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:159
-#: ../src/ui/widget/selected-style.cpp:1026
-#: ../src/ui/widget/selected-style.cpp:1027
-msgid "Nothing selected"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:161
-#: ../src/ui/widget/style-swatch.cpp:296
-msgid "<i>None</i>"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:164
-#: ../src/ui/widget/style-swatch.cpp:298
-msgid "No fill"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:164
-#: ../src/ui/widget/style-swatch.cpp:298
-msgid "No stroke"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:166
-#: ../src/ui/widget/style-swatch.cpp:277 ../src/widgets/paint-selector.cpp:189
-msgid "Pattern"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:169
-#: ../src/ui/widget/style-swatch.cpp:279 ../src/widgets/paint-selector.cpp:997
-msgid "Pattern fill"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:169
-#: ../src/ui/widget/style-swatch.cpp:279
-msgid "Pattern stroke"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:171
-msgid "<b>L</b>"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:174
-#: ../src/ui/widget/style-swatch.cpp:271
-msgid "Linear gradient fill"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:174
-#: ../src/ui/widget/style-swatch.cpp:271
-msgid "Linear gradient stroke"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:181
-msgid "<b>R</b>"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:184
-#: ../src/ui/widget/style-swatch.cpp:275
-msgid "Radial gradient fill"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:184
-#: ../src/ui/widget/style-swatch.cpp:275
-msgid "Radial gradient stroke"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:191
-msgid "Different"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:194
-msgid "Different fills"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:194
-msgid "Different strokes"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:196
-#: ../src/ui/widget/style-swatch.cpp:301
-msgid "<b>Unset</b>"
-msgstr ""
-
-#. TRANSLATORS COMMENT: unset is a verb here
-#: ../src/ui/widget/selected-style.cpp:199
-#: ../src/ui/widget/selected-style.cpp:257
-#: ../src/ui/widget/selected-style.cpp:499
-#: ../src/ui/widget/style-swatch.cpp:303 ../src/widgets/fill-style.cpp:528
-msgid "Unset fill"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:199
-#: ../src/ui/widget/selected-style.cpp:257
-#: ../src/ui/widget/selected-style.cpp:515
-#: ../src/ui/widget/style-swatch.cpp:303 ../src/widgets/stroke-style.cpp:462
-msgid "Unset stroke"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:202
-msgid "Flat color fill"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:202
-msgid "Flat color stroke"
-msgstr ""
-
-#. TRANSLATOR COMMENT: A means "Averaged"
-#: ../src/ui/widget/selected-style.cpp:205
-msgid "<b>a</b>"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:208
-msgid "Fill is averaged over selected objects"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:208
-msgid "Stroke is averaged over selected objects"
-msgstr ""
-
-#. TRANSLATOR COMMENT: M means "Multiple"
-#: ../src/ui/widget/selected-style.cpp:211
-msgid "<b>m</b>"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:214
-msgid "Multiple selected objects have the same fill"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:214
-msgid "Multiple selected objects have the same stroke"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:216
-msgid "Edit fill..."
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:216
-msgid "Edit stroke..."
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:220
-msgid "Last set color"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:224
-msgid "Last selected color"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:232
-msgid "White"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:236
-#: ../src/widgets/sp-color-icc-selector.cpp:238
-#: ../src/widgets/sp-color-scales.cpp:463
-#: ../src/widgets/sp-color-scales.cpp:464
-msgid "Black"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:240
-msgid "Copy color"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:244
-msgid "Paste color"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:248
-#: ../src/ui/widget/selected-style.cpp:782
-msgid "Swap fill and stroke"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:252
-#: ../src/ui/widget/selected-style.cpp:524
-#: ../src/ui/widget/selected-style.cpp:533
-msgid "Make fill opaque"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:252
-msgid "Make stroke opaque"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:261
-#: ../src/ui/widget/selected-style.cpp:481 ../src/widgets/fill-style.cpp:385
-msgid "Remove fill"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:261
-#: ../src/ui/widget/selected-style.cpp:490 ../src/widgets/stroke-style.cpp:336
-msgid "Remove stroke"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:314
-msgid "Remove"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:545
-msgid "Apply last set color to fill"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:557
-msgid "Apply last set color to stroke"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:568
-msgid "Apply last selected color to fill"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:579
-msgid "Apply last selected color to stroke"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:599
-msgid "Invert fill"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:619
-msgid "Invert stroke"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:631
-msgid "White fill"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:643
-msgid "White stroke"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:655
-msgid "Black fill"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:667
-msgid "Black stroke"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:710
-msgid "Paste fill"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:728
-msgid "Paste stroke"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:892
-msgid "Change stroke width"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:987
-msgid ", drag to adjust"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:1068
-#, c-format
-msgid "Stroke width: %.5g%s%s"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:1072
-msgid " (averaged)"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:1100
-msgid "0 (transparent)"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:1124
-msgid "100% (opaque)"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:1278
-msgid "Adjust saturation"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:1280
-#, c-format
-msgid ""
-"Adjusting <b>saturation</b>: was %.3g, now <b>%.3g</b> (diff %.3g); with "
-"<b>Ctrl</b> to adjust lightness, without modifiers to adjust hue"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:1284
-msgid "Adjust lightness"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:1286
-#, c-format
-msgid ""
-"Adjusting <b>lightness</b>: was %.3g, now <b>%.3g</b> (diff %.3g); with "
-"<b>Shift</b> to adjust saturation, without modifiers to adjust hue"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:1290
-msgid "Adjust hue"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:1292
-#, c-format
-msgid ""
-"Adjusting <b>hue</b>: was %.3g, now <b>%.3g</b> (diff %.3g); with <b>Shift</"
-"b> to adjust saturation, with <b>Ctrl</b> to adjust lightness"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:1401
-#: ../src/ui/widget/selected-style.cpp:1415
-msgid "Adjust stroke width"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:1402
-#, c-format
-msgid "Adjusting <b>stroke width</b>: was %.3g, now <b>%.3g</b> (diff %.3g)"
-msgstr ""
-
-#. TRANSLATORS: only translate "string" in "context|string".
-#. For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS
-#. "Link" means to _link_ two sliders together
-#: ../src/ui/widget/spin-slider.cpp:120
-msgid "sliders|Link"
-msgstr ""
-
-#: ../src/ui/widget/style-swatch.cpp:269
-msgid "L Gradient"
-msgstr ""
-
-#: ../src/ui/widget/style-swatch.cpp:273
-msgid "R Gradient"
-msgstr ""
-
-#: ../src/ui/widget/style-swatch.cpp:289
-#, c-format
-msgid "Fill: %06x/%.3g"
-msgstr ""
-
-#: ../src/ui/widget/style-swatch.cpp:291
-#, c-format
-msgid "Stroke: %06x/%.3g"
-msgstr ""
-
-#: ../src/ui/widget/style-swatch.cpp:323
-#, c-format
-msgid "Stroke width: %.5g%s"
-msgstr ""
-
-#: ../src/ui/widget/style-swatch.cpp:339
-#, c-format
-msgid "O:%.3g"
-msgstr ""
-
-#: ../src/ui/widget/style-swatch.cpp:341
-#, c-format
-msgid "O:.%d"
-msgstr ""
-
-#: ../src/ui/widget/style-swatch.cpp:346
-#, c-format
-msgid "Opacity: %.3g"
-msgstr ""
-
-#: ../src/vanishing-point.cpp:123
-msgid "Split vanishing points"
-msgstr ""
-
-#: ../src/vanishing-point.cpp:168
-msgid "Merge vanishing points"
-msgstr ""
-
-#: ../src/vanishing-point.cpp:224
-msgid "3D box: Move vanishing point"
-msgstr ""
-
-#: ../src/vanishing-point.cpp:305
-#, c-format
-msgid "<b>Finite</b> vanishing point shared by <b>%d</b> box"
-msgid_plural ""
-"<b>Finite</b> vanishing point shared by <b>%d</b> boxes; drag with <b>Shift</"
-"b> to separate selected box(es)"
-msgstr[0] ""
-msgstr[1] ""
-
-#. This won't make sense any more when infinite VPs are not shown on the canvas,
-#. but currently we update the status message anyway
-#: ../src/vanishing-point.cpp:312
-#, c-format
-msgid "<b>Infinite</b> vanishing point shared by <b>%d</b> box"
-msgid_plural ""
-"<b>Infinite</b> vanishing point shared by <b>%d</b> boxes; drag with "
-"<b>Shift</b> to separate selected box(es)"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../src/vanishing-point.cpp:320
-#, c-format
-msgid ""
-"shared by <b>%d</b> box; drag with <b>Shift</b> to separate selected box(es)"
-msgid_plural ""
-"shared by <b>%d</b> boxes; drag with <b>Shift</b> to separate selected box"
-"(es)"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../src/verbs.cpp:1140
-msgid "Switch to next layer"
-msgstr ""
-
-#: ../src/verbs.cpp:1141
-msgid "Switched to next layer."
-msgstr ""
-
-#: ../src/verbs.cpp:1143
-msgid "Cannot go past last layer."
-msgstr ""
-
-#: ../src/verbs.cpp:1152
-msgid "Switch to previous layer"
-msgstr ""
-
-#: ../src/verbs.cpp:1153
-msgid "Switched to previous layer."
-msgstr ""
-
-#: ../src/verbs.cpp:1155
-msgid "Cannot go before first layer."
-msgstr ""
-
-#: ../src/verbs.cpp:1172 ../src/verbs.cpp:1268 ../src/verbs.cpp:1300
-#: ../src/verbs.cpp:1306
-msgid "No current layer."
-msgstr ""
-
-#: ../src/verbs.cpp:1201 ../src/verbs.cpp:1205
-#, c-format
-msgid "Raised layer <b>%s</b>."
-msgstr ""
-
-#: ../src/verbs.cpp:1202
-msgid "Layer to top"
-msgstr ""
-
-#: ../src/verbs.cpp:1206
-msgid "Raise layer"
-msgstr ""
-
-#: ../src/verbs.cpp:1209 ../src/verbs.cpp:1213
-#, c-format
-msgid "Lowered layer <b>%s</b>."
-msgstr ""
-
-#: ../src/verbs.cpp:1210
-msgid "Layer to bottom"
-msgstr ""
-
-#: ../src/verbs.cpp:1214
-msgid "Lower layer"
-msgstr ""
-
-#: ../src/verbs.cpp:1223
-msgid "Cannot move layer any further."
-msgstr ""
-
-#: ../src/verbs.cpp:1237 ../src/verbs.cpp:1255
-#, c-format
-msgid "%s copy"
-msgstr ""
-
-#: ../src/verbs.cpp:1263
-msgid "Duplicate layer"
-msgstr ""
-
-#. TRANSLATORS: this means "The layer has been duplicated."
-#: ../src/verbs.cpp:1266
-msgid "Duplicated layer."
-msgstr ""
-
-#: ../src/verbs.cpp:1295
-msgid "Delete layer"
-msgstr ""
-
-#. TRANSLATORS: this means "The layer has been deleted."
-#: ../src/verbs.cpp:1298
-msgid "Deleted layer."
-msgstr ""
-
-#: ../src/verbs.cpp:1309
-msgid "Toggle layer solo"
-msgstr ""
-
-#: ../src/verbs.cpp:1389
-msgid "Flip horizontally"
-msgstr ""
-
-#: ../src/verbs.cpp:1404
-msgid "Flip vertically"
-msgstr ""
-
-#. TRANSLATORS: If you have translated the tutorial-basic.svg file to your language,
-#. then translate this string as "tutorial-basic.LANG.svg" (where LANG is your language
-#. code); otherwise leave as "tutorial-basic.svg".
-#: ../src/verbs.cpp:1912
-msgid "tutorial-basic.svg"
-msgstr ""
-
-#. TRANSLATORS: See "tutorial-basic.svg" comment.
-#: ../src/verbs.cpp:1916
-msgid "tutorial-shapes.svg"
-msgstr ""
-
-#. TRANSLATORS: See "tutorial-basic.svg" comment.
-#: ../src/verbs.cpp:1920
-msgid "tutorial-advanced.svg"
-msgstr ""
-
-#. TRANSLATORS: See "tutorial-basic.svg" comment.
-#: ../src/verbs.cpp:1924
-msgid "tutorial-tracing.svg"
-msgstr ""
-
-#. TRANSLATORS: See "tutorial-basic.svg" comment.
-#: ../src/verbs.cpp:1928
-msgid "tutorial-calligraphy.svg"
-msgstr ""
-
-#. TRANSLATORS: See "tutorial-basic.svg" comment.
-#: ../src/verbs.cpp:1932
-msgid "tutorial-elements.svg"
-msgstr ""
-
-#. TRANSLATORS: See "tutorial-basic.svg" comment.
-#: ../src/verbs.cpp:1936
-msgid "tutorial-tips.svg"
-msgstr ""
-
-#: ../src/verbs.cpp:2212 ../src/verbs.cpp:2731
-msgid "Unlock all objects in the current layer"
-msgstr ""
-
-#: ../src/verbs.cpp:2216 ../src/verbs.cpp:2733
-msgid "Unlock all objects in all layers"
-msgstr ""
-
-#: ../src/verbs.cpp:2220 ../src/verbs.cpp:2735
-msgid "Unhide all objects in the current layer"
-msgstr ""
-
-#: ../src/verbs.cpp:2224 ../src/verbs.cpp:2737
-msgid "Unhide all objects in all layers"
-msgstr ""
-
-#: ../src/verbs.cpp:2239
-msgid "Does nothing"
-msgstr ""
-
-#: ../src/verbs.cpp:2242
-msgid "Create new document from the default template"
-msgstr ""
-
-#: ../src/verbs.cpp:2244
-msgid "_Open..."
-msgstr ""
-
-#: ../src/verbs.cpp:2245
-msgid "Open an existing document"
-msgstr ""
-
-#: ../src/verbs.cpp:2246
-msgid "Re_vert"
-msgstr ""
-
-#: ../src/verbs.cpp:2247
-msgid "Revert to the last saved version of document (changes will be lost)"
-msgstr ""
-
-#: ../src/verbs.cpp:2248
-msgid "_Save"
-msgstr ""
-
-#: ../src/verbs.cpp:2248
-msgid "Save document"
-msgstr ""
-
-#: ../src/verbs.cpp:2250
-msgid "Save _As..."
-msgstr ""
-
-#: ../src/verbs.cpp:2251
-msgid "Save document under a new name"
-msgstr ""
-
-#: ../src/verbs.cpp:2252
-msgid "Save a Cop_y..."
-msgstr ""
-
-#: ../src/verbs.cpp:2253
-msgid "Save a copy of the document under a new name"
-msgstr ""
-
-#: ../src/verbs.cpp:2254
-msgid "_Print..."
-msgstr ""
-
-#: ../src/verbs.cpp:2254
-msgid "Print document"
-msgstr ""
-
-#. TRANSLATORS: "Vacuum Defs" means "Clean up defs" (so as to remove unused definitions)
-#: ../src/verbs.cpp:2257
-msgid "Vac_uum Defs"
-msgstr ""
-
-#: ../src/verbs.cpp:2257
-msgid ""
-"Remove unused definitions (such as gradients or clipping paths) from the &lt;"
-"defs&gt; of the document"
-msgstr ""
-
-#: ../src/verbs.cpp:2259
-msgid "Print Previe_w"
-msgstr ""
-
-#: ../src/verbs.cpp:2260
-msgid "Preview document printout"
-msgstr ""
-
-#: ../src/verbs.cpp:2261
-msgid "_Import..."
-msgstr ""
-
-#: ../src/verbs.cpp:2262
-msgid "Import a bitmap or SVG image into this document"
-msgstr ""
-
-#: ../src/verbs.cpp:2263
-msgid "_Export Bitmap..."
-msgstr ""
-
-#: ../src/verbs.cpp:2264
-msgid "Export this document or a selection as a bitmap image"
-msgstr ""
-
-#: ../src/verbs.cpp:2265
-msgid "Import a document from Open Clip Art Library"
-msgstr ""
-
-#. new FileVerb(SP_VERB_FILE_EXPORT_TO_OCAL, "FileExportToOCAL", N_("Export To Open Clip Art Library"), N_("Export this document to Open Clip Art Library"), INKSCAPE_ICON_DOCUMENT_EXPORT_OCAL),
-#: ../src/verbs.cpp:2267
-msgid "N_ext Window"
-msgstr ""
-
-#: ../src/verbs.cpp:2268
-msgid "Switch to the next document window"
-msgstr ""
-
-#: ../src/verbs.cpp:2269
-msgid "P_revious Window"
-msgstr ""
-
-#: ../src/verbs.cpp:2270
-msgid "Switch to the previous document window"
-msgstr ""
-
-#: ../src/verbs.cpp:2271
-msgid "_Close"
-msgstr ""
-
-#: ../src/verbs.cpp:2272
-msgid "Close this document window"
-msgstr ""
-
-#: ../src/verbs.cpp:2273
-msgid "_Quit"
-msgstr ""
-
-#: ../src/verbs.cpp:2273
-msgid "Quit Inkscape"
-msgstr ""
-
-#: ../src/verbs.cpp:2276
-msgid "Undo last action"
-msgstr ""
-
-#: ../src/verbs.cpp:2279
-msgid "Do again the last undone action"
-msgstr ""
-
-#: ../src/verbs.cpp:2280
-msgid "Cu_t"
-msgstr ""
-
-#: ../src/verbs.cpp:2281
-msgid "Cut selection to clipboard"
-msgstr ""
-
-#: ../src/verbs.cpp:2282
-msgid "_Copy"
-msgstr ""
-
-#: ../src/verbs.cpp:2283
-msgid "Copy selection to clipboard"
-msgstr ""
-
-#: ../src/verbs.cpp:2284
-msgid "_Paste"
-msgstr ""
-
-#: ../src/verbs.cpp:2285
-msgid "Paste objects from clipboard to mouse point, or paste text"
-msgstr ""
-
-#: ../src/verbs.cpp:2286
-msgid "Paste _Style"
-msgstr ""
-
-#: ../src/verbs.cpp:2287
-msgid "Apply the style of the copied object to selection"
-msgstr ""
-
-#: ../src/verbs.cpp:2289
-msgid "Scale selection to match the size of the copied object"
-msgstr ""
-
-#: ../src/verbs.cpp:2290
-msgid "Paste _Width"
-msgstr ""
-
-#: ../src/verbs.cpp:2291
-msgid "Scale selection horizontally to match the width of the copied object"
-msgstr ""
-
-#: ../src/verbs.cpp:2292
-msgid "Paste _Height"
-msgstr ""
-
-#: ../src/verbs.cpp:2293
-msgid "Scale selection vertically to match the height of the copied object"
-msgstr ""
-
-#: ../src/verbs.cpp:2294
-msgid "Paste Size Separately"
-msgstr ""
-
-#: ../src/verbs.cpp:2295
-msgid "Scale each selected object to match the size of the copied object"
-msgstr ""
-
-#: ../src/verbs.cpp:2296
-msgid "Paste Width Separately"
-msgstr ""
-
-#: ../src/verbs.cpp:2297
-msgid ""
-"Scale each selected object horizontally to match the width of the copied "
-"object"
-msgstr ""
-
-#: ../src/verbs.cpp:2298
-msgid "Paste Height Separately"
-msgstr ""
-
-#: ../src/verbs.cpp:2299
-msgid ""
-"Scale each selected object vertically to match the height of the copied "
-"object"
-msgstr ""
-
-#: ../src/verbs.cpp:2300
-msgid "Paste _In Place"
-msgstr ""
-
-#: ../src/verbs.cpp:2301
-msgid "Paste objects from clipboard to the original location"
-msgstr ""
-
-#: ../src/verbs.cpp:2302
-msgid "Paste Path _Effect"
-msgstr ""
-
-#: ../src/verbs.cpp:2303
-msgid "Apply the path effect of the copied object to selection"
-msgstr ""
-
-#: ../src/verbs.cpp:2304
-msgid "Remove Path _Effect"
-msgstr ""
-
-#: ../src/verbs.cpp:2305
-msgid "Remove any path effects from selected objects"
-msgstr ""
-
-#: ../src/verbs.cpp:2306
-msgid "Remove Filters"
-msgstr ""
-
-#: ../src/verbs.cpp:2307
-msgid "Remove any filters from selected objects"
-msgstr ""
-
-#: ../src/verbs.cpp:2308
-msgid "_Delete"
-msgstr ""
-
-#: ../src/verbs.cpp:2309
-msgid "Delete selection"
-msgstr ""
-
-#: ../src/verbs.cpp:2310
-msgid "Duplic_ate"
-msgstr ""
-
-#: ../src/verbs.cpp:2311
-msgid "Duplicate selected objects"
-msgstr ""
-
-#: ../src/verbs.cpp:2312
-msgid "Create Clo_ne"
-msgstr ""
-
-#: ../src/verbs.cpp:2313
-msgid "Create a clone (a copy linked to the original) of selected object"
-msgstr ""
-
-#: ../src/verbs.cpp:2314
-msgid "Unlin_k Clone"
-msgstr ""
-
-#: ../src/verbs.cpp:2315
-msgid ""
-"Cut the selected clones' links to the originals, turning them into "
-"standalone objects"
-msgstr ""
-
-#: ../src/verbs.cpp:2316
-msgid "Relink to Copied"
-msgstr ""
-
-#: ../src/verbs.cpp:2317
-msgid "Relink the selected clones to the object currently on the clipboard"
-msgstr ""
-
-#: ../src/verbs.cpp:2318
-msgid "Select _Original"
-msgstr ""
-
-#: ../src/verbs.cpp:2319
-msgid "Select the object to which the selected clone is linked"
-msgstr ""
-
-#: ../src/verbs.cpp:2320
-msgid "Objects to _Marker"
-msgstr ""
-
-#: ../src/verbs.cpp:2321
-msgid "Convert selection to a line marker"
-msgstr ""
-
-#: ../src/verbs.cpp:2322
-msgid "Objects to Gu_ides"
-msgstr ""
-
-#: ../src/verbs.cpp:2323
-msgid ""
-"Convert selected objects to a collection of guidelines aligned with their "
-"edges"
-msgstr ""
-
-#: ../src/verbs.cpp:2324
-msgid "Objects to Patter_n"
-msgstr ""
-
-#: ../src/verbs.cpp:2325
-msgid "Convert selection to a rectangle with tiled pattern fill"
-msgstr ""
-
-#: ../src/verbs.cpp:2326
-msgid "Pattern to _Objects"
-msgstr ""
-
-#: ../src/verbs.cpp:2327
-msgid "Extract objects from a tiled pattern fill"
-msgstr ""
-
-#: ../src/verbs.cpp:2328
-msgid "Clea_r All"
-msgstr ""
-
-#: ../src/verbs.cpp:2329
-msgid "Delete all objects from document"
-msgstr ""
-
-#: ../src/verbs.cpp:2330
-msgid "Select Al_l"
-msgstr ""
-
-#: ../src/verbs.cpp:2331
-msgid "Select all objects or all nodes"
-msgstr ""
-
-#: ../src/verbs.cpp:2332
-msgid "Select All in All La_yers"
-msgstr ""
-
-#: ../src/verbs.cpp:2333
-msgid "Select all objects in all visible and unlocked layers"
-msgstr ""
-
-#: ../src/verbs.cpp:2334
-msgid "In_vert Selection"
-msgstr ""
-
-#: ../src/verbs.cpp:2335
-msgid "Invert selection (unselect what is selected and select everything else)"
-msgstr ""
-
-#: ../src/verbs.cpp:2336
-msgid "Invert in All Layers"
-msgstr ""
-
-#: ../src/verbs.cpp:2337
-msgid "Invert selection in all visible and unlocked layers"
-msgstr ""
-
-#: ../src/verbs.cpp:2338
-msgid "Select Next"
-msgstr ""
-
-#: ../src/verbs.cpp:2339
-msgid "Select next object or node"
-msgstr ""
-
-#: ../src/verbs.cpp:2340
-msgid "Select Previous"
-msgstr ""
-
-#: ../src/verbs.cpp:2341
-msgid "Select previous object or node"
-msgstr ""
-
-#: ../src/verbs.cpp:2342
-msgid "D_eselect"
-msgstr ""
-
-#: ../src/verbs.cpp:2343
-msgid "Deselect any selected objects or nodes"
-msgstr ""
-
-#: ../src/verbs.cpp:2344
-msgid "_Guides Around Page"
-msgstr ""
-
-#: ../src/verbs.cpp:2345
-msgid "Create four guides aligned with the page borders"
-msgstr ""
-
-#: ../src/verbs.cpp:2346
-msgid "Next Path Effect Parameter"
-msgstr ""
-
-#: ../src/verbs.cpp:2347
-msgid "Show next Path Effect parameter for editing"
-msgstr ""
-
-#. Selection
-#: ../src/verbs.cpp:2350
-msgid "Raise to _Top"
-msgstr ""
-
-#: ../src/verbs.cpp:2351
-msgid "Raise selection to top"
-msgstr ""
-
-#: ../src/verbs.cpp:2352
-msgid "Lower to _Bottom"
-msgstr ""
-
-#: ../src/verbs.cpp:2353
-msgid "Lower selection to bottom"
-msgstr ""
-
-#: ../src/verbs.cpp:2354
-msgid "_Raise"
-msgstr ""
-
-#: ../src/verbs.cpp:2355
-msgid "Raise selection one step"
-msgstr ""
-
-#: ../src/verbs.cpp:2356
-msgid "_Lower"
-msgstr ""
-
-#: ../src/verbs.cpp:2357
-msgid "Lower selection one step"
-msgstr ""
-
-#: ../src/verbs.cpp:2358
-msgid "_Group"
-msgstr ""
-
-#: ../src/verbs.cpp:2359
-msgid "Group selected objects"
-msgstr ""
-
-#: ../src/verbs.cpp:2361
-msgid "Ungroup selected groups"
-msgstr ""
-
-#: ../src/verbs.cpp:2363
-msgid "_Put on Path"
-msgstr ""
-
-#: ../src/verbs.cpp:2365
-msgid "_Remove from Path"
-msgstr ""
-
-#: ../src/verbs.cpp:2367
-msgid "Remove Manual _Kerns"
-msgstr ""
-
-#. TRANSLATORS: "glyph": An image used in the visual representation of characters;
-#. roughly speaking, how a character looks. A font is a set of glyphs.
-#: ../src/verbs.cpp:2370
-msgid "Remove all manual kerns and glyph rotations from a text object"
-msgstr ""
-
-#: ../src/verbs.cpp:2372
-msgid "_Union"
-msgstr ""
-
-#: ../src/verbs.cpp:2373
-msgid "Create union of selected paths"
-msgstr ""
-
-#: ../src/verbs.cpp:2374
-msgid "_Intersection"
-msgstr ""
-
-#: ../src/verbs.cpp:2375
-msgid "Create intersection of selected paths"
-msgstr ""
-
-#: ../src/verbs.cpp:2376
-msgid "_Difference"
-msgstr ""
-
-#: ../src/verbs.cpp:2377
-msgid "Create difference of selected paths (bottom minus top)"
-msgstr ""
-
-#: ../src/verbs.cpp:2378
-msgid "E_xclusion"
-msgstr ""
-
-#: ../src/verbs.cpp:2379
-msgid ""
-"Create exclusive OR of selected paths (those parts that belong to only one "
-"path)"
-msgstr ""
-
-#: ../src/verbs.cpp:2380
-msgid "Di_vision"
-msgstr ""
-
-#: ../src/verbs.cpp:2381
-msgid "Cut the bottom path into pieces"
-msgstr ""
-
-#. TRANSLATORS: "to cut a path" is not the same as "to break a path apart" - see the
-#. Advanced tutorial for more info
-#: ../src/verbs.cpp:2384
-msgid "Cut _Path"
-msgstr ""
-
-#: ../src/verbs.cpp:2385
-msgid "Cut the bottom path's stroke into pieces, removing fill"
-msgstr ""
-
-#. TRANSLATORS: "outset": expand a shape by offsetting the object's path,
-#. i.e. by displacing it perpendicular to the path in each point.
-#. See also the Advanced Tutorial for explanation.
-#: ../src/verbs.cpp:2389
-msgid "Outs_et"
-msgstr ""
-
-#: ../src/verbs.cpp:2390
-msgid "Outset selected paths"
-msgstr ""
-
-#: ../src/verbs.cpp:2392
-msgid "O_utset Path by 1 px"
-msgstr ""
-
-#: ../src/verbs.cpp:2393
-msgid "Outset selected paths by 1 px"
-msgstr ""
-
-#: ../src/verbs.cpp:2395
-msgid "O_utset Path by 10 px"
-msgstr ""
-
-#: ../src/verbs.cpp:2396
-msgid "Outset selected paths by 10 px"
-msgstr ""
-
-#. TRANSLATORS: "inset": contract a shape by offsetting the object's path,
-#. i.e. by displacing it perpendicular to the path in each point.
-#. See also the Advanced Tutorial for explanation.
-#: ../src/verbs.cpp:2400
-msgid "I_nset"
-msgstr ""
-
-#: ../src/verbs.cpp:2401
-msgid "Inset selected paths"
-msgstr ""
-
-#: ../src/verbs.cpp:2403
-msgid "I_nset Path by 1 px"
-msgstr ""
-
-#: ../src/verbs.cpp:2404
-msgid "Inset selected paths by 1 px"
-msgstr ""
-
-#: ../src/verbs.cpp:2406
-msgid "I_nset Path by 10 px"
-msgstr ""
-
-#: ../src/verbs.cpp:2407
-msgid "Inset selected paths by 10 px"
-msgstr ""
-
-#: ../src/verbs.cpp:2409
-msgid "D_ynamic Offset"
-msgstr ""
-
-#: ../src/verbs.cpp:2409
-msgid "Create a dynamic offset object"
-msgstr ""
-
-#: ../src/verbs.cpp:2411
-msgid "_Linked Offset"
-msgstr ""
-
-#: ../src/verbs.cpp:2412
-msgid "Create a dynamic offset object linked to the original path"
-msgstr ""
-
-#: ../src/verbs.cpp:2414
-msgid "_Stroke to Path"
-msgstr ""
-
-#: ../src/verbs.cpp:2415
-msgid "Convert selected object's stroke to paths"
-msgstr ""
-
-#: ../src/verbs.cpp:2416
-msgid "Si_mplify"
-msgstr ""
-
-#: ../src/verbs.cpp:2417
-msgid "Simplify selected paths (remove extra nodes)"
-msgstr ""
-
-#: ../src/verbs.cpp:2418
-msgid "_Reverse"
-msgstr ""
-
-#: ../src/verbs.cpp:2419
-msgid "Reverse the direction of selected paths (useful for flipping markers)"
-msgstr ""
-
-#. TRANSLATORS: "to trace" means "to convert a bitmap to vector graphics" (to vectorize)
-#: ../src/verbs.cpp:2421
-msgid "_Trace Bitmap..."
-msgstr ""
-
-#: ../src/verbs.cpp:2422
-msgid "Create one or more paths from a bitmap by tracing it"
-msgstr ""
-
-#: ../src/verbs.cpp:2423
-msgid "_Make a Bitmap Copy"
-msgstr ""
-
-#: ../src/verbs.cpp:2424
-msgid "Export selection to a bitmap and insert it into document"
-msgstr ""
-
-#: ../src/verbs.cpp:2425
-msgid "_Combine"
-msgstr ""
-
-#: ../src/verbs.cpp:2426
-msgid "Combine several paths into one"
-msgstr ""
-
-#. TRANSLATORS: "to cut a path" is not the same as "to break a path apart" - see the
-#. Advanced tutorial for more info
-#: ../src/verbs.cpp:2429
-msgid "Break _Apart"
-msgstr ""
-
-#: ../src/verbs.cpp:2430
-msgid "Break selected paths into subpaths"
-msgstr ""
-
-#: ../src/verbs.cpp:2431
-msgid "Rows and Columns..."
-msgstr ""
-
-#: ../src/verbs.cpp:2432
-msgid "Arrange selected objects in a table"
-msgstr ""
-
-#. Layer
-#: ../src/verbs.cpp:2434
-msgid "_Add Layer..."
-msgstr ""
-
-#: ../src/verbs.cpp:2435
-msgid "Create a new layer"
-msgstr ""
-
-#: ../src/verbs.cpp:2436
-msgid "Re_name Layer..."
-msgstr ""
-
-#: ../src/verbs.cpp:2437
-msgid "Rename the current layer"
-msgstr ""
-
-#: ../src/verbs.cpp:2438
-msgid "Switch to Layer Abov_e"
-msgstr ""
-
-#: ../src/verbs.cpp:2439
-msgid "Switch to the layer above the current"
-msgstr ""
-
-#: ../src/verbs.cpp:2440
-msgid "Switch to Layer Belo_w"
-msgstr ""
-
-#: ../src/verbs.cpp:2441
-msgid "Switch to the layer below the current"
-msgstr ""
-
-#: ../src/verbs.cpp:2442
-msgid "Move Selection to Layer Abo_ve"
-msgstr ""
-
-#: ../src/verbs.cpp:2443
-msgid "Move selection to the layer above the current"
-msgstr ""
-
-#: ../src/verbs.cpp:2444
-msgid "Move Selection to Layer Bel_ow"
-msgstr ""
-
-#: ../src/verbs.cpp:2445
-msgid "Move selection to the layer below the current"
-msgstr ""
-
-#: ../src/verbs.cpp:2446
-msgid "Layer to _Top"
-msgstr ""
-
-#: ../src/verbs.cpp:2447
-msgid "Raise the current layer to the top"
-msgstr ""
-
-#: ../src/verbs.cpp:2448
-msgid "Layer to _Bottom"
-msgstr ""
-
-#: ../src/verbs.cpp:2449
-msgid "Lower the current layer to the bottom"
-msgstr ""
-
-#: ../src/verbs.cpp:2450
-msgid "_Raise Layer"
-msgstr ""
-
-#: ../src/verbs.cpp:2451
-msgid "Raise the current layer"
-msgstr ""
-
-#: ../src/verbs.cpp:2452
-msgid "_Lower Layer"
-msgstr ""
-
-#: ../src/verbs.cpp:2453
-msgid "Lower the current layer"
-msgstr ""
-
-#: ../src/verbs.cpp:2454
-msgid "Duplicate Current Layer"
-msgstr ""
-
-#: ../src/verbs.cpp:2455
-msgid "Duplicate an existing layer"
-msgstr ""
-
-#: ../src/verbs.cpp:2456
-msgid "_Delete Current Layer"
-msgstr ""
-
-#: ../src/verbs.cpp:2457
-msgid "Delete the current layer"
-msgstr ""
-
-#: ../src/verbs.cpp:2458
-msgid "_Show/hide other layers"
-msgstr ""
-
-#: ../src/verbs.cpp:2459
-msgid "Solo the current layer"
-msgstr ""
-
-#. Object
-#: ../src/verbs.cpp:2462
-msgid "Rotate _90&#176; CW"
-msgstr ""
-
-#. This is shared between tooltips and statusbar, so they
-#. must use UTF-8, not HTML entities for special characters.
-#: ../src/verbs.cpp:2465
-msgid "Rotate selection 90° clockwise"
-msgstr ""
-
-#: ../src/verbs.cpp:2466
-msgid "Rotate 9_0&#176; CCW"
-msgstr ""
-
-#. This is shared between tooltips and statusbar, so they
-#. must use UTF-8, not HTML entities for special characters.
-#: ../src/verbs.cpp:2469
-msgid "Rotate selection 90° counter-clockwise"
-msgstr ""
-
-#: ../src/verbs.cpp:2470
-msgid "Remove _Transformations"
-msgstr ""
-
-#: ../src/verbs.cpp:2471
-msgid "Remove transformations from object"
-msgstr ""
-
-#: ../src/verbs.cpp:2472
-msgid "_Object to Path"
-msgstr ""
-
-#: ../src/verbs.cpp:2473
-msgid "Convert selected object to path"
-msgstr ""
-
-#: ../src/verbs.cpp:2474
-msgid "_Flow into Frame"
-msgstr ""
-
-#: ../src/verbs.cpp:2475
-msgid ""
-"Put text into a frame (path or shape), creating a flowed text linked to the "
-"frame object"
-msgstr ""
-
-#: ../src/verbs.cpp:2476
-msgid "_Unflow"
-msgstr ""
-
-#: ../src/verbs.cpp:2477
-msgid "Remove text from frame (creates a single-line text object)"
-msgstr ""
-
-#: ../src/verbs.cpp:2478
-msgid "_Convert to Text"
-msgstr ""
-
-#: ../src/verbs.cpp:2479
-msgid "Convert flowed text to regular text object (preserves appearance)"
-msgstr ""
-
-#: ../src/verbs.cpp:2481
-msgid "Flip _Horizontal"
-msgstr ""
-
-#: ../src/verbs.cpp:2481
-msgid "Flip selected objects horizontally"
-msgstr ""
-
-#: ../src/verbs.cpp:2484
-msgid "Flip _Vertical"
-msgstr ""
-
-#: ../src/verbs.cpp:2484
-msgid "Flip selected objects vertically"
-msgstr ""
-
-#: ../src/verbs.cpp:2487
-msgid "Apply mask to selection (using the topmost object as mask)"
-msgstr ""
-
-#: ../src/verbs.cpp:2489
-msgid "Edit mask"
-msgstr ""
-
-#: ../src/verbs.cpp:2490 ../src/verbs.cpp:2496
-msgid "_Release"
-msgstr ""
-
-#: ../src/verbs.cpp:2491
-msgid "Remove mask from selection"
-msgstr ""
-
-#: ../src/verbs.cpp:2493
-msgid ""
-"Apply clipping path to selection (using the topmost object as clipping path)"
-msgstr ""
-
-#: ../src/verbs.cpp:2495 ../src/widgets/toolbox.cpp:1446
-msgid "Edit clipping path"
-msgstr ""
-
-#: ../src/verbs.cpp:2497
-msgid "Remove clipping path from selection"
-msgstr ""
-
-#. Tools
-#: ../src/verbs.cpp:2500
-msgid "Select"
-msgstr ""
-
-#: ../src/verbs.cpp:2501
-msgid "Select and transform objects"
-msgstr ""
-
-#: ../src/verbs.cpp:2502
-msgid "Node Edit"
-msgstr ""
-
-#: ../src/verbs.cpp:2503
-msgid "Edit paths by nodes"
-msgstr ""
-
-#: ../src/verbs.cpp:2505
-msgid "Tweak objects by sculpting or painting"
-msgstr ""
-
-#: ../src/verbs.cpp:2507
-msgid "Create rectangles and squares"
-msgstr ""
-
-#: ../src/verbs.cpp:2509
-msgid "Create 3D boxes"
-msgstr ""
-
-#: ../src/verbs.cpp:2511
-msgid "Create circles, ellipses, and arcs"
-msgstr ""
-
-#: ../src/verbs.cpp:2513
-msgid "Create stars and polygons"
-msgstr ""
-
-#: ../src/verbs.cpp:2515
-msgid "Create spirals"
-msgstr ""
-
-#: ../src/verbs.cpp:2517
-msgid "Draw freehand lines"
-msgstr ""
-
-#: ../src/verbs.cpp:2519
-msgid "Draw Bezier curves and straight lines"
-msgstr ""
-
-#: ../src/verbs.cpp:2521
-msgid "Draw calligraphic or brush strokes"
-msgstr ""
-
-#: ../src/verbs.cpp:2523
-msgid "Create and edit text objects"
-msgstr ""
-
-#: ../src/verbs.cpp:2525
-msgid "Create and edit gradients"
-msgstr ""
-
-#: ../src/verbs.cpp:2527
-msgid "Zoom in or out"
-msgstr ""
-
-#: ../src/verbs.cpp:2529
-msgid "Pick colors from image"
-msgstr ""
-
-#: ../src/verbs.cpp:2531
-msgid "Create diagram connectors"
-msgstr ""
-
-#: ../src/verbs.cpp:2533
-msgid "Fill bounded areas"
-msgstr ""
-
-#: ../src/verbs.cpp:2534
-msgid "LPE Edit"
-msgstr ""
-
-#: ../src/verbs.cpp:2535
-msgid "Edit Path Effect parameters"
-msgstr ""
-
-#: ../src/verbs.cpp:2537
-msgid "Erase existing paths"
-msgstr ""
-
-#: ../src/verbs.cpp:2539
-msgid "Do geometric constructions"
-msgstr ""
-
-#. Tool prefs
-#: ../src/verbs.cpp:2541
-msgid "Selector Preferences"
-msgstr ""
-
-#: ../src/verbs.cpp:2542
-msgid "Open Preferences for the Selector tool"
-msgstr ""
-
-#: ../src/verbs.cpp:2543
-msgid "Node Tool Preferences"
-msgstr ""
-
-#: ../src/verbs.cpp:2544
-msgid "Open Preferences for the Node tool"
-msgstr ""
-
-#: ../src/verbs.cpp:2545
-msgid "Tweak Tool Preferences"
-msgstr ""
-
-#: ../src/verbs.cpp:2546
-msgid "Open Preferences for the Tweak tool"
-msgstr ""
-
-#: ../src/verbs.cpp:2547
-msgid "Rectangle Preferences"
-msgstr ""
-
-#: ../src/verbs.cpp:2548
-msgid "Open Preferences for the Rectangle tool"
-msgstr ""
-
-#: ../src/verbs.cpp:2549
-msgid "3D Box Preferences"
-msgstr ""
-
-#: ../src/verbs.cpp:2550
-msgid "Open Preferences for the 3D Box tool"
-msgstr ""
-
-#: ../src/verbs.cpp:2551
-msgid "Ellipse Preferences"
-msgstr ""
-
-#: ../src/verbs.cpp:2552
-msgid "Open Preferences for the Ellipse tool"
-msgstr ""
-
-#: ../src/verbs.cpp:2553
-msgid "Star Preferences"
-msgstr ""
-
-#: ../src/verbs.cpp:2554
-msgid "Open Preferences for the Star tool"
-msgstr ""
-
-#: ../src/verbs.cpp:2555
-msgid "Spiral Preferences"
-msgstr ""
-
-#: ../src/verbs.cpp:2556
-msgid "Open Preferences for the Spiral tool"
-msgstr ""
-
-#: ../src/verbs.cpp:2557
-msgid "Pencil Preferences"
-msgstr ""
-
-#: ../src/verbs.cpp:2558
-msgid "Open Preferences for the Pencil tool"
-msgstr ""
-
-#: ../src/verbs.cpp:2559
-msgid "Pen Preferences"
-msgstr ""
-
-#: ../src/verbs.cpp:2560
-msgid "Open Preferences for the Pen tool"
-msgstr ""
-
-#: ../src/verbs.cpp:2561
-msgid "Calligraphic Preferences"
-msgstr ""
-
-#: ../src/verbs.cpp:2562
-msgid "Open Preferences for the Calligraphy tool"
-msgstr ""
-
-#: ../src/verbs.cpp:2563
-msgid "Text Preferences"
-msgstr ""
-
-#: ../src/verbs.cpp:2564
-msgid "Open Preferences for the Text tool"
-msgstr ""
-
-#: ../src/verbs.cpp:2565
-msgid "Gradient Preferences"
-msgstr ""
-
-#: ../src/verbs.cpp:2566
-msgid "Open Preferences for the Gradient tool"
-msgstr ""
-
-#: ../src/verbs.cpp:2567
-msgid "Zoom Preferences"
-msgstr ""
-
-#: ../src/verbs.cpp:2568
-msgid "Open Preferences for the Zoom tool"
-msgstr ""
-
-#: ../src/verbs.cpp:2569
-msgid "Dropper Preferences"
-msgstr ""
-
-#: ../src/verbs.cpp:2570
-msgid "Open Preferences for the Dropper tool"
-msgstr ""
-
-#: ../src/verbs.cpp:2571
-msgid "Connector Preferences"
-msgstr ""
-
-#: ../src/verbs.cpp:2572
-msgid "Open Preferences for the Connector tool"
-msgstr ""
-
-#: ../src/verbs.cpp:2573
-msgid "Paint Bucket Preferences"
-msgstr ""
-
-#: ../src/verbs.cpp:2574
-msgid "Open Preferences for the Paint Bucket tool"
-msgstr ""
-
-#: ../src/verbs.cpp:2575
-msgid "Eraser Preferences"
-msgstr ""
-
-#: ../src/verbs.cpp:2576
-msgid "Open Preferences for the Eraser tool"
-msgstr ""
-
-#: ../src/verbs.cpp:2577
-msgid "LPE Tool Preferences"
-msgstr ""
-
-#: ../src/verbs.cpp:2578
-msgid "Open Preferences for the LPETool tool"
-msgstr ""
-
-#. Zoom/View
-#: ../src/verbs.cpp:2581
-msgid "Zoom In"
-msgstr ""
-
-#: ../src/verbs.cpp:2581
-msgid "Zoom in"
-msgstr ""
-
-#: ../src/verbs.cpp:2582
-msgid "Zoom Out"
-msgstr ""
-
-#: ../src/verbs.cpp:2582
-msgid "Zoom out"
-msgstr ""
-
-#: ../src/verbs.cpp:2583
-msgid "_Rulers"
-msgstr ""
-
-#: ../src/verbs.cpp:2583
-msgid "Show or hide the canvas rulers"
-msgstr ""
-
-#: ../src/verbs.cpp:2584
-msgid "Scroll_bars"
-msgstr ""
-
-#: ../src/verbs.cpp:2584
-msgid "Show or hide the canvas scrollbars"
-msgstr ""
-
-#: ../src/verbs.cpp:2585
-msgid "_Grid"
-msgstr ""
-
-#: ../src/verbs.cpp:2585
-msgid "Show or hide the grid"
-msgstr ""
-
-#: ../src/verbs.cpp:2586
-msgid "G_uides"
-msgstr ""
-
-#: ../src/verbs.cpp:2586
-msgid "Show or hide guides (drag from a ruler to create a guide)"
-msgstr ""
-
-#: ../src/verbs.cpp:2587
-msgid "Toggle snapping on or off"
-msgstr ""
-
-#: ../src/verbs.cpp:2588
-msgid "Nex_t Zoom"
-msgstr ""
-
-#: ../src/verbs.cpp:2588
-msgid "Next zoom (from the history of zooms)"
-msgstr ""
-
-#: ../src/verbs.cpp:2590
-msgid "Pre_vious Zoom"
-msgstr ""
-
-#: ../src/verbs.cpp:2590
-msgid "Previous zoom (from the history of zooms)"
-msgstr ""
-
-#: ../src/verbs.cpp:2592
-msgid "Zoom 1:_1"
-msgstr ""
-
-#: ../src/verbs.cpp:2592
-msgid "Zoom to 1:1"
-msgstr ""
-
-#: ../src/verbs.cpp:2594
-msgid "Zoom 1:_2"
-msgstr ""
-
-#: ../src/verbs.cpp:2594
-msgid "Zoom to 1:2"
-msgstr ""
-
-#: ../src/verbs.cpp:2596
-msgid "_Zoom 2:1"
-msgstr ""
-
-#: ../src/verbs.cpp:2596
-msgid "Zoom to 2:1"
-msgstr ""
-
-#: ../src/verbs.cpp:2599
-msgid "_Fullscreen"
-msgstr ""
-
-#: ../src/verbs.cpp:2599
-msgid "Stretch this document window to full screen"
-msgstr ""
-
-#: ../src/verbs.cpp:2602
-msgid "Toggle _Focus Mode"
-msgstr ""
-
-#: ../src/verbs.cpp:2602
-msgid "Remove excess toolbars to focus on drawing"
-msgstr ""
-
-#: ../src/verbs.cpp:2604
-msgid "Duplic_ate Window"
-msgstr ""
-
-#: ../src/verbs.cpp:2604
-msgid "Open a new window with the same document"
-msgstr ""
-
-#: ../src/verbs.cpp:2606
-msgid "_New View Preview"
-msgstr ""
-
-#: ../src/verbs.cpp:2607
-msgid "New View Preview"
-msgstr ""
-
-#. "view_new_preview"
-#: ../src/verbs.cpp:2609
-msgid "_Normal"
-msgstr ""
-
-#: ../src/verbs.cpp:2610
-msgid "Switch to normal display mode"
-msgstr ""
-
-#: ../src/verbs.cpp:2611
-msgid "No _Filters"
-msgstr ""
-
-#: ../src/verbs.cpp:2612
-msgid "Switch to normal display without filters"
-msgstr ""
-
-#: ../src/verbs.cpp:2613
-msgid "_Outline"
-msgstr ""
-
-#: ../src/verbs.cpp:2614
-msgid "Switch to outline (wireframe) display mode"
-msgstr ""
-
-#: ../src/verbs.cpp:2615
-msgid "_Toggle"
-msgstr ""
-
-#: ../src/verbs.cpp:2616
-msgid "Toggle between normal and outline display modes"
-msgstr ""
-
-#: ../src/verbs.cpp:2618
-msgid "Color-managed view"
-msgstr ""
-
-#: ../src/verbs.cpp:2619
-msgid "Toggle color-managed display for this document window"
-msgstr ""
-
-#: ../src/verbs.cpp:2621
-msgid "Ico_n Preview..."
-msgstr ""
-
-#: ../src/verbs.cpp:2622
-msgid "Open a window to preview objects at different icon resolutions"
-msgstr ""
-
-#: ../src/verbs.cpp:2624
-msgid "Zoom to fit page in window"
-msgstr ""
-
-#: ../src/verbs.cpp:2625
-msgid "Page _Width"
-msgstr ""
-
-#: ../src/verbs.cpp:2626
-msgid "Zoom to fit page width in window"
-msgstr ""
-
-#: ../src/verbs.cpp:2628
-msgid "Zoom to fit drawing in window"
-msgstr ""
-
-#: ../src/verbs.cpp:2630
-msgid "Zoom to fit selection in window"
-msgstr ""
-
-#. Dialogs
-#: ../src/verbs.cpp:2633
-msgid "In_kscape Preferences..."
-msgstr ""
-
-#: ../src/verbs.cpp:2634
-msgid "Edit global Inkscape preferences"
-msgstr ""
-
-#: ../src/verbs.cpp:2635
-msgid "_Document Properties..."
-msgstr ""
-
-#: ../src/verbs.cpp:2636
-msgid "Edit properties of this document (to be saved with the document)"
-msgstr ""
-
-#: ../src/verbs.cpp:2637
-msgid "Document _Metadata..."
-msgstr ""
-
-#: ../src/verbs.cpp:2638
-msgid "Edit document metadata (to be saved with the document)"
-msgstr ""
-
-#: ../src/verbs.cpp:2639
-msgid "_Fill and Stroke..."
-msgstr ""
-
-#: ../src/verbs.cpp:2640
-msgid ""
-"Edit objects' colors, gradients, stroke width, arrowheads, dash patterns..."
-msgstr ""
-
-#. TRANSLATORS: "Swatches" means: color samples
-#: ../src/verbs.cpp:2642
-msgid "S_watches..."
-msgstr ""
-
-#: ../src/verbs.cpp:2643
-msgid "Select colors from a swatches palette"
-msgstr ""
-
-#: ../src/verbs.cpp:2644
-msgid "Transfor_m..."
-msgstr ""
-
-#: ../src/verbs.cpp:2645
-msgid "Precisely control objects' transformations"
-msgstr ""
-
-#: ../src/verbs.cpp:2646
-msgid "_Align and Distribute..."
-msgstr ""
-
-#: ../src/verbs.cpp:2647
-msgid "Align and distribute objects"
-msgstr ""
-
-#: ../src/verbs.cpp:2648
-msgid "Undo _History..."
-msgstr ""
-
-#: ../src/verbs.cpp:2649
-msgid "Undo History"
-msgstr ""
-
-#: ../src/verbs.cpp:2650
-msgid "_Text and Font..."
-msgstr ""
-
-#: ../src/verbs.cpp:2651
-msgid "View and select font family, font size and other text properties"
-msgstr ""
-
-#: ../src/verbs.cpp:2652
-msgid "_XML Editor..."
-msgstr ""
-
-#: ../src/verbs.cpp:2653
-msgid "View and edit the XML tree of the document"
-msgstr ""
-
-#: ../src/verbs.cpp:2654
-msgid "_Find..."
-msgstr ""
-
-#: ../src/verbs.cpp:2655
-msgid "Find objects in document"
-msgstr ""
-
-#: ../src/verbs.cpp:2656
-msgid "Find and _Replace Text..."
-msgstr ""
-
-#: ../src/verbs.cpp:2657
-msgid "Find and replace text in document"
-msgstr ""
-
-#: ../src/verbs.cpp:2658
-msgid "Check Spellin_g..."
-msgstr ""
-
-#: ../src/verbs.cpp:2659
-msgid "Check spelling of text in document"
-msgstr ""
-
-#: ../src/verbs.cpp:2660
-msgid "_Messages..."
-msgstr ""
-
-#: ../src/verbs.cpp:2661
-msgid "View debug messages"
-msgstr ""
-
-#: ../src/verbs.cpp:2662
-msgid "S_cripts..."
-msgstr ""
-
-#: ../src/verbs.cpp:2663
-msgid "Run scripts"
-msgstr ""
-
-#: ../src/verbs.cpp:2664
-msgid "Show/Hide D_ialogs"
-msgstr ""
-
-#: ../src/verbs.cpp:2665
-msgid "Show or hide all open dialogs"
-msgstr ""
-
-#: ../src/verbs.cpp:2666
-msgid "Create Tiled Clones..."
-msgstr ""
-
-#: ../src/verbs.cpp:2667
-msgid ""
-"Create multiple clones of selected object, arranging them into a pattern or "
-"scattering"
-msgstr ""
-
-#: ../src/verbs.cpp:2668
-msgid "_Object Properties..."
-msgstr ""
-
-#: ../src/verbs.cpp:2669
-msgid "Edit the ID, locked and visible status, and other object properties"
-msgstr ""
-
-#. #ifdef WITH_INKBOARD
-#. new DialogVerb(SP_VERB_XMPP_CLIENT, "DialogXmppClient",
-#. N_("_Instant Messaging..."), N_("Jabber Instant Messaging Client"), NULL),
-#. #endif
-#: ../src/verbs.cpp:2674
-msgid "_Input Devices..."
-msgstr ""
-
-#: ../src/verbs.cpp:2675 ../src/verbs.cpp:2677
-msgid "Configure extended input devices, such as a graphics tablet"
-msgstr ""
-
-#: ../src/verbs.cpp:2676
-msgid "_Input Devices (new)..."
-msgstr ""
-
-#: ../src/verbs.cpp:2678
-msgid "_Extensions..."
-msgstr ""
-
-#: ../src/verbs.cpp:2679
-msgid "Query information about extensions"
-msgstr ""
-
-#: ../src/verbs.cpp:2680
-msgid "Layer_s..."
-msgstr ""
-
-#: ../src/verbs.cpp:2681
-msgid "View Layers"
-msgstr ""
-
-#: ../src/verbs.cpp:2682
-msgid "Path Effect Editor..."
-msgstr ""
-
-#: ../src/verbs.cpp:2683
-msgid "Manage, edit, and apply path effects"
-msgstr ""
-
-#: ../src/verbs.cpp:2684
-msgid "Filter Editor..."
-msgstr ""
-
-#: ../src/verbs.cpp:2685
-msgid "Manage, edit, and apply SVG filters"
-msgstr ""
-
-#: ../src/verbs.cpp:2686
-msgid "SVG Font Editor..."
-msgstr ""
-
-#: ../src/verbs.cpp:2687
-msgid "Edit SVG fonts"
-msgstr ""
-
-#. Help
-#: ../src/verbs.cpp:2690
-msgid "About E_xtensions"
-msgstr ""
-
-#: ../src/verbs.cpp:2691
-msgid "Information on Inkscape extensions"
-msgstr ""
-
-#: ../src/verbs.cpp:2692
-msgid "About _Memory"
-msgstr ""
-
-#: ../src/verbs.cpp:2693
-msgid "Memory usage information"
-msgstr ""
-
-#: ../src/verbs.cpp:2694
-msgid "_About Inkscape"
-msgstr ""
-
-#: ../src/verbs.cpp:2695
-msgid "Inkscape version, authors, license"
-msgstr ""
-
-#. new HelpVerb(SP_VERB_SHOW_LICENSE, "ShowLicense", N_("_License"),
-#. N_("Distribution terms"), /*"show_license"*/"inkscape_options"),
-#. Tutorials
-#: ../src/verbs.cpp:2700
-msgid "Inkscape: _Basic"
-msgstr ""
-
-#: ../src/verbs.cpp:2701
-msgid "Getting started with Inkscape"
-msgstr ""
-
-#. "tutorial_basic"
-#: ../src/verbs.cpp:2702
-msgid "Inkscape: _Shapes"
-msgstr ""
-
-#: ../src/verbs.cpp:2703
-msgid "Using shape tools to create and edit shapes"
-msgstr ""
-
-#: ../src/verbs.cpp:2704
-msgid "Inkscape: _Advanced"
-msgstr ""
-
-#: ../src/verbs.cpp:2705
-msgid "Advanced Inkscape topics"
-msgstr ""
-
-#. "tutorial_advanced"
-#. TRANSLATORS: "to trace" means "to convert a bitmap to vector graphics" (to vectorize)
-#: ../src/verbs.cpp:2707
-msgid "Inkscape: T_racing"
-msgstr ""
-
-#: ../src/verbs.cpp:2708
-msgid "Using bitmap tracing"
-msgstr ""
-
-#. "tutorial_tracing"
-#: ../src/verbs.cpp:2709
-msgid "Inkscape: _Calligraphy"
-msgstr ""
-
-#: ../src/verbs.cpp:2710
-msgid "Using the Calligraphy pen tool"
-msgstr ""
-
-#: ../src/verbs.cpp:2711
-msgid "_Elements of Design"
-msgstr ""
-
-#: ../src/verbs.cpp:2712
-msgid "Principles of design in the tutorial form"
-msgstr ""
-
-#. "tutorial_design"
-#: ../src/verbs.cpp:2713
-msgid "_Tips and Tricks"
-msgstr ""
-
-#: ../src/verbs.cpp:2714
-msgid "Miscellaneous tips and tricks"
-msgstr ""
-
-#. "tutorial_tips"
-#. Effect -- renamed Extension
-#: ../src/verbs.cpp:2717
-msgid "Previous Extension"
-msgstr ""
-
-#: ../src/verbs.cpp:2718
-msgid "Repeat the last extension with the same settings"
-msgstr ""
-
-#: ../src/verbs.cpp:2719
-msgid "Previous Extension Settings..."
-msgstr ""
-
-#: ../src/verbs.cpp:2720
-msgid "Repeat the last extension with new settings"
-msgstr ""
-
-#: ../src/verbs.cpp:2724
-msgid "Fit the page to the current selection"
-msgstr ""
-
-#: ../src/verbs.cpp:2726
-msgid "Fit the page to the drawing"
-msgstr ""
-
-#: ../src/verbs.cpp:2728
-msgid ""
-"Fit the page to the current selection or the drawing if there is no selection"
-msgstr ""
-
-#. LockAndHide
-#: ../src/verbs.cpp:2730
-msgid "Unlock All"
-msgstr ""
-
-#: ../src/verbs.cpp:2732
-msgid "Unlock All in All Layers"
-msgstr ""
-
-#: ../src/verbs.cpp:2734
-msgid "Unhide All"
-msgstr ""
-
-#: ../src/verbs.cpp:2736
-msgid "Unhide All in All Layers"
-msgstr ""
-
-#: ../src/verbs.cpp:2740
-msgid "Link an ICC color profile"
-msgstr ""
-
-#: ../src/verbs.cpp:2741
-msgid "Remove Color Profile"
-msgstr ""
-
-#: ../src/verbs.cpp:2742
-msgid "Remove a linked ICC color profile"
-msgstr ""
-
-#: ../src/widgets/dash-selector.cpp:62
-msgid "Dash pattern"
-msgstr ""
-
-#: ../src/widgets/dash-selector.cpp:77
-msgid "Pattern offset"
-msgstr ""
-
-#. display the initial welcome message in the statusbar
-#: ../src/widgets/desktop-widget.cpp:551
-msgid ""
-"<b>Welcome to Inkscape!</b> Use shape or freehand tools to create objects; "
-"use selector (arrow) to move or transform them."
-msgstr ""
-
-#: ../src/widgets/desktop-widget.cpp:615
-#, c-format
-msgid "%s: %d (outline) - Inkscape"
-msgstr ""
-
-#: ../src/widgets/desktop-widget.cpp:617
-#, c-format
-msgid "%s: %d - Inkscape"
-msgstr ""
-
-#: ../src/widgets/desktop-widget.cpp:621
-#, c-format
-msgid "%s (outline) - Inkscape"
-msgstr ""
-
-#: ../src/widgets/desktop-widget.cpp:623
-#, c-format
-msgid "%s - Inkscape"
-msgstr ""
-
-#: ../src/widgets/ege-paint-def.cpp:70 ../src/widgets/ege-paint-def.cpp:92
-#: ../src/widgets/gradient-selector.cpp:167
-msgid "none"
-msgstr ""
-
-#: ../src/widgets/ege-paint-def.cpp:89
-msgid "remove"
-msgstr ""
-
-#: ../src/widgets/fill-style.cpp:283
-msgid "Change fill rule"
-msgstr ""
-
-#: ../src/widgets/fill-style.cpp:323 ../src/widgets/fill-style.cpp:397
-msgid "Set fill color"
-msgstr ""
-
-#: ../src/widgets/fill-style.cpp:466
-msgid "Set gradient on fill"
-msgstr ""
-
-#: ../src/widgets/fill-style.cpp:513
-msgid "Set pattern on fill"
-msgstr ""
-
-#. Family frame
-#: ../src/widgets/font-selector.cpp:157
-msgid "Font family"
-msgstr ""
-
-#. TRANSLATORS: only translate "string" in "context|string".
-#. For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS
-#. Style frame
-#: ../src/widgets/font-selector.cpp:190
-msgid "fontselector|Style"
-msgstr ""
-
-#: ../src/widgets/font-selector.cpp:228
-msgid "Font size:"
-msgstr ""
-
-#. TRANSLATORS: Test string used in text and font dialog (when no
-#. * text has been entered) to get a preview of the font.  Choose
-#. * some representative characters that users of your locale will be
-#. * interested in.
-#: ../src/widgets/font-selector.cpp:641 ../src/widgets/toolbox.cpp:6522
-msgid "AaBbCcIiPpQq12369$€¢?.;/()"
-msgstr ""
-
-#. TRANSLATORS: for info, see http://www.w3.org/TR/2000/CR-SVG-20000802/pservers.html#LinearGradientSpreadMethodAttribute
-#: ../src/widgets/gradient-selector.cpp:161
-msgid ""
-"Whether to fill with flat color beyond the ends of the gradient vector "
-"(spreadMethod=\"pad\"), or repeat the gradient in the same direction "
-"(spreadMethod=\"repeat\"), or repeat the gradient in alternating opposite "
-"directions (spreadMethod=\"reflect\")"
-msgstr ""
-
-#: ../src/widgets/gradient-selector.cpp:171
-msgid "reflected"
-msgstr ""
-
-#: ../src/widgets/gradient-selector.cpp:175
-msgid "direct"
-msgstr ""
-
-#: ../src/widgets/gradient-selector.cpp:183
-msgid "Repeat:"
-msgstr ""
-
-#: ../src/widgets/gradient-toolbar.cpp:155
-msgid "Assign gradient to object"
-msgstr ""
-
-#: ../src/widgets/gradient-toolbar.cpp:189
-msgid "<small>No gradients</small>"
-msgstr ""
-
-#: ../src/widgets/gradient-toolbar.cpp:198
-msgid "<small>Nothing selected</small>"
-msgstr ""
-
-#: ../src/widgets/gradient-toolbar.cpp:209
-msgid "<small>No gradients in selection</small>"
-msgstr ""
-
-#: ../src/widgets/gradient-toolbar.cpp:219
-msgid "<small>Multiple gradients</small>"
-msgstr ""
-
-#: ../src/widgets/gradient-toolbar.cpp:467
-msgid "Edit the stops of the gradient"
-msgstr ""
-
-#: ../src/widgets/gradient-toolbar.cpp:527 ../src/widgets/toolbox.cpp:2630
-#: ../src/widgets/toolbox.cpp:2708 ../src/widgets/toolbox.cpp:3039
-#: ../src/widgets/toolbox.cpp:3077 ../src/widgets/toolbox.cpp:3692
-#: ../src/widgets/toolbox.cpp:3716 ../src/widgets/toolbox.cpp:5130
-#: ../src/widgets/toolbox.cpp:5159
-msgid "<b>New:</b>"
-msgstr ""
-
-#: ../src/widgets/gradient-toolbar.cpp:540
-msgid "Create linear gradient"
-msgstr ""
-
-#: ../src/widgets/gradient-toolbar.cpp:554
-msgid "Create radial (elliptic or circular) gradient"
-msgstr ""
-
-#. TODO replace aux_toolbox_space(tbl, AUX_SPACING);
-#: ../src/widgets/gradient-toolbar.cpp:569
-msgid "on"
-msgstr ""
-
-#: ../src/widgets/gradient-toolbar.cpp:582
-msgid "Create gradient in the fill"
-msgstr ""
-
-#: ../src/widgets/gradient-toolbar.cpp:596
-msgid "Create gradient in the stroke"
-msgstr ""
-
-#. FIXME: implement averaging of all parameters for multiple selected
-#. gtk_label_set_markup(GTK_LABEL(l), _("<b>Average:</b>"));
-#: ../src/widgets/gradient-toolbar.cpp:610 ../src/widgets/toolbox.cpp:2632
-#: ../src/widgets/toolbox.cpp:3047 ../src/widgets/toolbox.cpp:3065
-#: ../src/widgets/toolbox.cpp:3694 ../src/widgets/toolbox.cpp:3705
-#: ../src/widgets/toolbox.cpp:5133 ../src/widgets/toolbox.cpp:5144
-msgid "<b>Change:</b>"
-msgstr ""
-
-#: ../src/widgets/gradient-vector.cpp:270
-#: ../src/widgets/paint-selector.cpp:885 ../src/widgets/stroke-style.cpp:820
-msgid "No document selected"
-msgstr ""
-
-#: ../src/widgets/gradient-vector.cpp:276
-msgid "No gradients in document"
-msgstr ""
-
-#: ../src/widgets/gradient-vector.cpp:282
-msgid "No gradient selected"
-msgstr ""
-
-#: ../src/widgets/gradient-vector.cpp:547
-msgid "No stops in gradient"
-msgstr ""
-
-#: ../src/widgets/gradient-vector.cpp:670
-msgid "Change gradient stop offset"
-msgstr ""
-
-#. TRANSLATORS: "Stop" means: a "phase" of a gradient
-#: ../src/widgets/gradient-vector.cpp:811
-msgid "Add stop"
-msgstr ""
-
-#: ../src/widgets/gradient-vector.cpp:814
-msgid "Add another control stop to gradient"
-msgstr ""
-
-#: ../src/widgets/gradient-vector.cpp:816
-msgid "Delete stop"
-msgstr ""
-
-#: ../src/widgets/gradient-vector.cpp:819
-msgid "Delete current control stop from gradient"
-msgstr ""
-
-#. Label
-#: ../src/widgets/gradient-vector.cpp:830
-#: ../share/extensions/printing-marks.inx.h:9
-msgid "Offset:"
-msgstr ""
-
-#. TRANSLATORS: "Stop" means: a "phase" of a gradient
-#: ../src/widgets/gradient-vector.cpp:875
-msgid "Stop Color"
-msgstr ""
-
-#: ../src/widgets/gradient-vector.cpp:905
-msgid "Gradient editor"
-msgstr ""
-
-#: ../src/widgets/gradient-vector.cpp:1192
-msgid "Change gradient stop color"
-msgstr ""
-
-#: ../src/widgets/paint-selector.cpp:181 ../src/widgets/paint-selector.cpp:564
-msgid "No paint"
-msgstr ""
-
-#: ../src/widgets/paint-selector.cpp:183 ../src/widgets/paint-selector.cpp:636
-msgid "Flat color"
-msgstr ""
-
-#: ../src/widgets/paint-selector.cpp:185 ../src/widgets/paint-selector.cpp:707
-msgid "Linear gradient"
-msgstr ""
-
-#: ../src/widgets/paint-selector.cpp:187 ../src/widgets/paint-selector.cpp:710
-msgid "Radial gradient"
-msgstr ""
-
-#: ../src/widgets/paint-selector.cpp:191
-msgid "Unset paint (make it undefined so it can be inherited)"
-msgstr ""
-
-#. TRANSLATORS: for info, see http://www.w3.org/TR/2000/CR-SVG-20000802/painting.html#FillRuleProperty
-#: ../src/widgets/paint-selector.cpp:203
-msgid ""
-"Any path self-intersections or subpaths create holes in the fill (fill-rule: "
-"evenodd)"
-msgstr ""
-
-#. TRANSLATORS: for info, see http://www.w3.org/TR/2000/CR-SVG-20000802/painting.html#FillRuleProperty
-#: ../src/widgets/paint-selector.cpp:214
-msgid ""
-"Fill is solid unless a subpath is counterdirectional (fill-rule: nonzero)"
-msgstr ""
-
-#: ../src/widgets/paint-selector.cpp:531
-msgid "No objects"
-msgstr ""
-
-#: ../src/widgets/paint-selector.cpp:542
-msgid "Multiple styles"
-msgstr ""
-
-#: ../src/widgets/paint-selector.cpp:553
-msgid "Paint is undefined"
-msgstr ""
-
-#: ../src/widgets/paint-selector.cpp:984
-msgid ""
-"Use the <b>Node tool</b> to adjust position, scale, and rotation of the "
-"pattern on canvas. Use <b>Object &gt; Pattern &gt; Objects to Pattern</b> to "
-"create a new pattern from selection."
-msgstr ""
-
-#: ../src/widgets/select-toolbar.cpp:247
-msgid "Transform by toolbar"
-msgstr ""
-
-#: ../src/widgets/select-toolbar.cpp:304
-msgid "Now <b>stroke width</b> is <b>scaled</b> when objects are scaled."
-msgstr ""
-
-#: ../src/widgets/select-toolbar.cpp:306
-msgid "Now <b>stroke width</b> is <b>not scaled</b> when objects are scaled."
-msgstr ""
-
-#: ../src/widgets/select-toolbar.cpp:317
-msgid ""
-"Now <b>rounded rectangle corners</b> are <b>scaled</b> when rectangles are "
-"scaled."
-msgstr ""
-
-#: ../src/widgets/select-toolbar.cpp:319
-msgid ""
-"Now <b>rounded rectangle corners</b> are <b>not scaled</b> when rectangles "
-"are scaled."
-msgstr ""
-
-#: ../src/widgets/select-toolbar.cpp:330
-msgid ""
-"Now <b>gradients</b> are <b>transformed</b> along with their objects when "
-"those are transformed (moved, scaled, rotated, or skewed)."
-msgstr ""
-
-#: ../src/widgets/select-toolbar.cpp:332
-msgid ""
-"Now <b>gradients</b> remain <b>fixed</b> when objects are transformed "
-"(moved, scaled, rotated, or skewed)."
-msgstr ""
-
-#: ../src/widgets/select-toolbar.cpp:343
-msgid ""
-"Now <b>patterns</b> are <b>transformed</b> along with their objects when "
-"those are transformed (moved, scaled, rotated, or skewed)."
-msgstr ""
-
-#: ../src/widgets/select-toolbar.cpp:345
-msgid ""
-"Now <b>patterns</b> remain <b>fixed</b> when objects are transformed (moved, "
-"scaled, rotated, or skewed)."
-msgstr ""
-
-#. four spinbuttons
-#. TRANSLATORS: only translate "string" in "context|string".
-#. For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS
-#: ../src/widgets/select-toolbar.cpp:460
-msgid "select_toolbar|X position"
-msgstr ""
-
-#: ../src/widgets/select-toolbar.cpp:460
-msgid "select_toolbar|X"
-msgstr ""
-
-#: ../src/widgets/select-toolbar.cpp:462
-msgid "Horizontal coordinate of selection"
-msgstr ""
-
-#. TRANSLATORS: only translate "string" in "context|string".
-#. For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS
-#: ../src/widgets/select-toolbar.cpp:468
-msgid "select_toolbar|Y position"
-msgstr ""
-
-#: ../src/widgets/select-toolbar.cpp:468
-msgid "select_toolbar|Y"
-msgstr ""
-
-#: ../src/widgets/select-toolbar.cpp:470
-msgid "Vertical coordinate of selection"
-msgstr ""
-
-#. TRANSLATORS: only translate "string" in "context|string".
-#. For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS
-#: ../src/widgets/select-toolbar.cpp:476
-msgid "select_toolbar|Width"
-msgstr ""
-
-#: ../src/widgets/select-toolbar.cpp:476
-msgid "select_toolbar|W"
-msgstr ""
-
-#: ../src/widgets/select-toolbar.cpp:478
-msgid "Width of selection"
-msgstr ""
-
-#: ../src/widgets/select-toolbar.cpp:485
-msgid "Lock width and height"
-msgstr ""
-
-#: ../src/widgets/select-toolbar.cpp:486
-msgid "When locked, change both width and height by the same proportion"
-msgstr ""
-
-#. TRANSLATORS: only translate "string" in "context|string".
-#. For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS
-#: ../src/widgets/select-toolbar.cpp:497
-msgid "select_toolbar|Height"
-msgstr ""
-
-#: ../src/widgets/select-toolbar.cpp:497
-msgid "select_toolbar|H"
-msgstr ""
-
-#: ../src/widgets/select-toolbar.cpp:499
-msgid "Height of selection"
-msgstr ""
-
-#: ../src/widgets/select-toolbar.cpp:536
-msgid "Affect:"
-msgstr ""
-
-#: ../src/widgets/select-toolbar.cpp:536
-msgid ""
-"Control whether or not to scale stroke widths, scale rectangle corners, "
-"transform gradient fills, and transform pattern fills with the object"
-msgstr ""
-
-#: ../src/widgets/select-toolbar.cpp:555
-msgid "Scale rounded corners"
-msgstr ""
-
-#: ../src/widgets/select-toolbar.cpp:566
-msgid "Move gradients"
-msgstr ""
-
-#: ../src/widgets/select-toolbar.cpp:577
-msgid "Move patterns"
-msgstr ""
-
-#: ../src/widgets/sp-color-gtkselector.cpp:50
-msgid "System"
-msgstr ""
-
-#: ../src/widgets/sp-color-icc-selector.cpp:111
-msgid "CMS"
-msgstr ""
-
-#: ../src/widgets/sp-color-icc-selector.cpp:220
-#: ../src/widgets/sp-color-scales.cpp:399
-msgid "_R"
-msgstr ""
-
-#: ../src/widgets/sp-color-icc-selector.cpp:220
-#: ../src/widgets/sp-color-icc-selector.cpp:221
-#: ../src/widgets/sp-color-scales.cpp:402
-msgid "_G"
-msgstr ""
-
-#: ../src/widgets/sp-color-icc-selector.cpp:220
-#: ../src/widgets/sp-color-scales.cpp:405
-msgid "_B"
-msgstr ""
-
-#: ../src/widgets/sp-color-icc-selector.cpp:222
-#: ../src/widgets/sp-color-icc-selector.cpp:223
-#: ../src/widgets/sp-color-scales.cpp:425
-msgid "_H"
-msgstr ""
-
-#: ../src/widgets/sp-color-icc-selector.cpp:222
-#: ../src/widgets/sp-color-icc-selector.cpp:223
-#: ../src/widgets/sp-color-scales.cpp:428
-msgid "_S"
-msgstr ""
-
-#: ../src/widgets/sp-color-icc-selector.cpp:223
-#: ../src/widgets/sp-color-scales.cpp:431
-msgid "_L"
-msgstr ""
-
-#: ../src/widgets/sp-color-icc-selector.cpp:224
-#: ../src/widgets/sp-color-icc-selector.cpp:225
-#: ../src/widgets/sp-color-scales.cpp:453
-msgid "_C"
-msgstr ""
-
-#: ../src/widgets/sp-color-icc-selector.cpp:224
-#: ../src/widgets/sp-color-icc-selector.cpp:225
-#: ../src/widgets/sp-color-scales.cpp:456
-msgid "_M"
-msgstr ""
-
-#: ../src/widgets/sp-color-icc-selector.cpp:224
-#: ../src/widgets/sp-color-icc-selector.cpp:225
-#: ../src/widgets/sp-color-scales.cpp:459
-msgid "_Y"
-msgstr ""
-
-#: ../src/widgets/sp-color-icc-selector.cpp:224
-#: ../src/widgets/sp-color-scales.cpp:462
-msgid "_K"
-msgstr ""
-
-#: ../src/widgets/sp-color-icc-selector.cpp:235
-msgid "Gray"
-msgstr ""
-
-#: ../src/widgets/sp-color-icc-selector.cpp:238
-#: ../src/widgets/sp-color-icc-selector.cpp:239
-#: ../src/widgets/sp-color-scales.cpp:454
-#: ../src/widgets/sp-color-scales.cpp:455
-msgid "Cyan"
-msgstr ""
-
-#: ../src/widgets/sp-color-icc-selector.cpp:238
-#: ../src/widgets/sp-color-icc-selector.cpp:239
-#: ../src/widgets/sp-color-scales.cpp:457
-#: ../src/widgets/sp-color-scales.cpp:458
-msgid "Magenta"
-msgstr ""
-
-#: ../src/widgets/sp-color-icc-selector.cpp:238
-#: ../src/widgets/sp-color-icc-selector.cpp:239
-#: ../src/widgets/sp-color-scales.cpp:460
-#: ../src/widgets/sp-color-scales.cpp:461
-msgid "Yellow"
-msgstr ""
-
-#: ../src/widgets/sp-color-icc-selector.cpp:296
-msgid "Fix"
-msgstr ""
-
-#: ../src/widgets/sp-color-icc-selector.cpp:299
-msgid "Fix RGB fallback to match icc-color() value."
-msgstr ""
-
-#. Label
-#: ../src/widgets/sp-color-icc-selector.cpp:380
-#: ../src/widgets/sp-color-scales.cpp:408
-#: ../src/widgets/sp-color-scales.cpp:434
-#: ../src/widgets/sp-color-scales.cpp:465
-#: ../src/widgets/sp-color-wheel-selector.cpp:134
-msgid "_A"
-msgstr ""
-
-#: ../src/widgets/sp-color-icc-selector.cpp:390
-#: ../src/widgets/sp-color-icc-selector.cpp:402
-#: ../src/widgets/sp-color-scales.cpp:409
-#: ../src/widgets/sp-color-scales.cpp:410
-#: ../src/widgets/sp-color-scales.cpp:435
-#: ../src/widgets/sp-color-scales.cpp:436
-#: ../src/widgets/sp-color-scales.cpp:466
-#: ../src/widgets/sp-color-scales.cpp:467
-#: ../src/widgets/sp-color-wheel-selector.cpp:144
-#: ../src/widgets/sp-color-wheel-selector.cpp:156
-msgid "Alpha (opacity)"
-msgstr ""
-
-#: ../src/widgets/sp-color-notebook.cpp:330
-msgid "RGBA_:"
-msgstr ""
-
-#: ../src/widgets/sp-color-notebook.cpp:338
-msgid "Hexadecimal RGBA value of the color"
-msgstr ""
-
-#: ../src/widgets/sp-color-scales.cpp:79
-msgid "RGB"
-msgstr ""
-
-#: ../src/widgets/sp-color-scales.cpp:79
-msgid "HSL"
-msgstr ""
-
-#: ../src/widgets/sp-color-scales.cpp:79
-msgid "CMYK"
-msgstr ""
-
-#: ../src/widgets/sp-color-selector.cpp:64
-msgid "Unnamed"
-msgstr ""
-
-#: ../src/widgets/sp-color-wheel-selector.cpp:61
-msgid "Wheel"
-msgstr ""
-
-#: ../src/widgets/sp-xmlview-attr-list.cpp:46
-msgid "Attribute"
-msgstr ""
-
-#: ../src/widgets/sp-xmlview-attr-list.cpp:47
-#: ../share/extensions/perfectboundcover.inx.h:19
-msgid "Value"
-msgstr ""
-
-#: ../src/widgets/sp-xmlview-content.cpp:169
-msgid "Type text in a text node"
-msgstr ""
-
-#: ../src/widgets/stroke-style.cpp:286 ../src/widgets/stroke-style.cpp:345
-msgid "Set stroke color"
-msgstr ""
-
-#: ../src/widgets/stroke-style.cpp:397
-msgid "Set gradient on stroke"
-msgstr ""
-
-#: ../src/widgets/stroke-style.cpp:441
-msgid "Set pattern on stroke"
-msgstr ""
-
-#: ../src/widgets/stroke-style.cpp:904
-msgid "Set markers"
-msgstr ""
-
-#. TRANSLATORS: only translate "string" in "context|string".
-#. For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS
-#. Stroke width
-#: ../src/widgets/stroke-style.cpp:1079
-msgid "StrokeWidth|Width:"
-msgstr ""
-
-#. Join type
-#. TRANSLATORS: The line join style specifies the shape to be used at the
-#. corners of paths. It can be "miter", "round" or "bevel".
-#: ../src/widgets/stroke-style.cpp:1117
-msgid "Join:"
-msgstr ""
-
-#. TRANSLATORS: Miter join: joining lines with a sharp (pointed) corner.
-#. For an example, draw a triangle with a large stroke width and modify the
-#. "Join" option (in the Fill and Stroke dialog).
-#: ../src/widgets/stroke-style.cpp:1129
-msgid "Miter join"
-msgstr ""
-
-#. TRANSLATORS: Round join: joining lines with a rounded corner.
-#. For an example, draw a triangle with a large stroke width and modify the
-#. "Join" option (in the Fill and Stroke dialog).
-#: ../src/widgets/stroke-style.cpp:1139
-msgid "Round join"
-msgstr ""
-
-#. TRANSLATORS: Bevel join: joining lines with a blunted (flattened) corner.
-#. For an example, draw a triangle with a large stroke width and modify the
-#. "Join" option (in the Fill and Stroke dialog).
-#: ../src/widgets/stroke-style.cpp:1149
-msgid "Bevel join"
-msgstr ""
-
-#. Miterlimit
-#. TRANSLATORS: Miter limit: only for "miter join", this limits the length
-#. of the sharp "spike" when the lines connect at too sharp an angle.
-#. When two line segments meet at a sharp angle, a miter join results in a
-#. spike that extends well beyond the connection point. The purpose of the
-#. miter limit is to cut off such spikes (i.e. convert them into bevels)
-#. when they become too long.
-#: ../src/widgets/stroke-style.cpp:1161
-msgid "Miter limit:"
-msgstr ""
-
-#: ../src/widgets/stroke-style.cpp:1169
-msgid "Maximum length of the miter (in units of stroke width)"
-msgstr ""
-
-#. Cap type
-#. TRANSLATORS: cap type specifies the shape for the ends of lines
-#: ../src/widgets/stroke-style.cpp:1181
-msgid "Cap:"
-msgstr ""
-
-#. TRANSLATORS: Butt cap: the line shape does not extend beyond the end point
-#. of the line; the ends of the line are square
-#: ../src/widgets/stroke-style.cpp:1193
-msgid "Butt cap"
-msgstr ""
-
-#. TRANSLATORS: Round cap: the line shape extends beyond the end point of the
-#. line; the ends of the line are rounded
-#: ../src/widgets/stroke-style.cpp:1201
-msgid "Round cap"
-msgstr ""
-
-#. TRANSLATORS: Square cap: the line shape extends beyond the end point of the
-#. line; the ends of the line are square
-#: ../src/widgets/stroke-style.cpp:1209
-msgid "Square cap"
-msgstr ""
-
-#. Dash
-#: ../src/widgets/stroke-style.cpp:1215
-msgid "Dashes:"
-msgstr ""
-
-#. TRANSLATORS: Path markers are an SVG feature that allows you to attach arbitrary shapes
-#. (arrowheads, bullets, faces, whatever) to the start, end, or middle nodes of a path.
-#: ../src/widgets/stroke-style.cpp:1232
-msgid "Start Markers:"
-msgstr ""
-
-#: ../src/widgets/stroke-style.cpp:1234
-msgid "Start Markers are drawn on the first node of a path or shape"
-msgstr ""
-
-#: ../src/widgets/stroke-style.cpp:1243
-msgid "Mid Markers:"
-msgstr ""
-
-#: ../src/widgets/stroke-style.cpp:1245
-msgid ""
-"Mid Markers are drawn on every node of a path or shape except the first and "
-"last nodes"
-msgstr ""
-
-#: ../src/widgets/stroke-style.cpp:1254
-msgid "End Markers:"
-msgstr ""
-
-#: ../src/widgets/stroke-style.cpp:1256
-msgid "End Markers are drawn on the last node of a path or shape"
-msgstr ""
-
-#: ../src/widgets/stroke-style.cpp:1605 ../src/widgets/stroke-style.cpp:1701
-msgid "Set stroke style"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:183
-msgid "Color/opacity used for color tweaking"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:187
-msgid "Style of new stars"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:189
-msgid "Style of new rectangles"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:191
-msgid "Style of new 3D boxes"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:193
-msgid "Style of new ellipses"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:195
-msgid "Style of new spirals"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:197
-msgid "Style of new paths created by Pencil"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:199
-msgid "Style of new paths created by Pen"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:201
-msgid "Style of new calligraphic strokes"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:203 ../src/widgets/toolbox.cpp:205
-msgid "TBD"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:215
-msgid "Style of Paint Bucket fill objects"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1289
-msgid "Insert node"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1290
-msgid "Insert new nodes into selected segments"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1293
-msgid "Insert"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1301
-msgid "Delete selected nodes"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1311
-msgid "Join endnodes"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1312
-msgid "Join selected endnodes"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1315
-msgid "Join"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1322
-msgid "Break nodes"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1323
-msgid "Break path at selected nodes"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1333
-msgid "Join with segment"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1334
-msgid "Join selected endnodes with a new segment"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1344
-msgid "Delete segment between two non-endpoint nodes"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1353
-msgid "Node Cusp"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1354
-msgid "Make selected nodes corner"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1363
-msgid "Node Smooth"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1364
-msgid "Make selected nodes smooth"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1373
-msgid "Node Symmetric"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1374
-msgid "Make selected nodes symmetric"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1383
-msgid "Node Auto"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1384
-msgid "Make selected nodes auto-smooth"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1393
-msgid "Node Line"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1394
-msgid "Make selected segments lines"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1403
-msgid "Node Curve"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1404
-msgid "Make selected segments curves"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1413
-msgid "Show Handles"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1414
-msgid "Show the Bezier handles of selected nodes"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1424
-msgid "Show Outline"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1425
-msgid "Show the outline of the path"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1435
-msgid "Next path effect parameter"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1436
-msgid "Show next path effect parameter for editing"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1447
-msgid "Edit the clipping path of the object"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1457
-msgid "Edit mask path"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1458
-msgid "Edit the mask of the object"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1472
-msgid "X coordinate:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1472
-msgid "X coordinate of selected node(s)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1490
-msgid "Y coordinate:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1490
-msgid "Y coordinate of selected node(s)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2028
-msgid "Enable snapping"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2037
-msgid "Bounding box"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2037
-msgid "Snap bounding box corners"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2046
-msgid "Bounding box edges"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2046
-msgid "Snap to edges of a bounding box"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2055
-msgid "Bounding box corners"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2055
-msgid "Snap to bounding box corners"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2064
-msgid "BBox Edge Midpoints"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2064
-msgid "Snap from and to midpoints of bounding box edges"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2074
-msgid "BBox Centers"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2074
-msgid "Snapping from and to centers of bounding boxes"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2083
-msgid "Snap nodes or handles"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2091
-msgid "Snap to paths"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2100
-msgid "Path intersections"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2100
-msgid "Snap to path intersections"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2109
-msgid "To nodes"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2109
-msgid "Snap to cusp nodes"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2118
-msgid "Smooth nodes"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2118
-msgid "Snap to smooth nodes"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2127
-msgid "Line Midpoints"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2127
-msgid "Snap from and to midpoints of line segments"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2136
-msgid "Object Centers"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2136
-msgid "Snap from and to centers of objects"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2145
-msgid "Rotation Centers"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2145
-msgid "Snap from and to an item's rotation center"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2154
-msgid "Page border"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2154
-msgid "Snap to the page border"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2163
-msgid "Snap to grids"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2172
-msgid "Snap to guides"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2377
-msgid "Star: Change number of corners"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2422
-msgid "Star: Change spoke ratio"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2465
-msgid "Make polygon"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2465
-msgid "Make star"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2501
-msgid "Star: Change rounding"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2536
-msgid "Star: Change randomization"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2727
-msgid "Regular polygon (with one handle) instead of a star"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2734
-msgid "Star instead of a regular polygon (with one handle)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2755
-msgid "triangle/tri-star"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2755
-msgid "square/quad-star"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2755
-msgid "pentagon/five-pointed star"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2755
-msgid "hexagon/six-pointed star"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2758
-msgid "Corners"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2758
-msgid "Corners:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2758
-msgid "Number of corners of a polygon or star"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2771
-msgid "thin-ray star"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2771
-msgid "pentagram"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2771
-msgid "hexagram"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2771
-msgid "heptagram"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2771
-msgid "octagram"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2771
-msgid "regular polygon"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2774
-msgid "Spoke ratio"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2774
-msgid "Spoke ratio:"
-msgstr ""
-
-#. TRANSLATORS: Tip radius of a star is the distance from the center to the farthest handle.
-#. Base radius is the same for the closest handle.
-#: ../src/widgets/toolbox.cpp:2777
-msgid "Base radius to tip radius ratio"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2795
-msgid "stretched"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2795
-msgid "twisted"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2795
-msgid "slightly pinched"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2795
-msgid "NOT rounded"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2795
-msgid "slightly rounded"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2795
-msgid "visibly rounded"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2795
-msgid "well rounded"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2795
-msgid "amply rounded"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2795 ../src/widgets/toolbox.cpp:2810
-msgid "blown up"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2798
-msgid "Rounded"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2798
-msgid "Rounded:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2798
-msgid "How much rounded are the corners (0 for sharp)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2810
-msgid "NOT randomized"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2810
-msgid "slightly irregular"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2810
-msgid "visibly randomized"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2810
-msgid "strongly randomized"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2813
-msgid "Randomized"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2813
-msgid "Randomized:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2813
-msgid "Scatter randomly the corners and angles"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2828 ../src/widgets/toolbox.cpp:3767
-#: ../src/widgets/toolbox.cpp:4027 ../src/widgets/toolbox.cpp:7249
-msgid "Defaults"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2829 ../src/widgets/toolbox.cpp:3768
-msgid ""
-"Reset shape parameters to defaults (use Inkscape Preferences > Tools to "
-"change defaults)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2902
-msgid "Change rectangle"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3095
-msgid "W:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3095
-msgid "Width of rectangle"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3112
-msgid "H:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3112
-msgid "Height of rectangle"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3126 ../src/widgets/toolbox.cpp:3141
-msgid "not rounded"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3129
-msgid "Horizontal radius"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3129
-msgid "Rx:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3129
-msgid "Horizontal radius of rounded corners"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3144
-msgid "Vertical radius"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3144
-msgid "Ry:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3144
-msgid "Vertical radius of rounded corners"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3163
-msgid "Not rounded"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3164
-msgid "Make corners sharp"
-msgstr ""
-
-#. TODO: use the correct axis here, too
-#: ../src/widgets/toolbox.cpp:3352
-msgid "3D Box: Change perspective (angle of infinite axis)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3422
-msgid "Angle in X direction"
-msgstr ""
-
-#. Translators: PL is short for 'perspective line'
-#: ../src/widgets/toolbox.cpp:3424
-msgid "Angle of PLs in X direction"
-msgstr ""
-
-#. Translators: VP is short for 'vanishing point'
-#: ../src/widgets/toolbox.cpp:3446
-msgid "State of VP in X direction"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3447
-msgid "Toggle VP in X direction between 'finite' and 'infinite' (=parallel)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3462
-msgid "Angle in Y direction"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3462
-msgid "Angle Y:"
-msgstr ""
-
-#. Translators: PL is short for 'perspective line'
-#: ../src/widgets/toolbox.cpp:3464
-msgid "Angle of PLs in Y direction"
-msgstr ""
-
-#. Translators: VP is short for 'vanishing point'
-#: ../src/widgets/toolbox.cpp:3485
-msgid "State of VP in Y direction"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3486
-msgid "Toggle VP in Y direction between 'finite' and 'infinite' (=parallel)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3501
-msgid "Angle in Z direction"
-msgstr ""
-
-#. Translators: PL is short for 'perspective line'
-#: ../src/widgets/toolbox.cpp:3503
-msgid "Angle of PLs in Z direction"
-msgstr ""
-
-#. Translators: VP is short for 'vanishing point'
-#: ../src/widgets/toolbox.cpp:3524
-msgid "State of VP in Z direction"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3525
-msgid "Toggle VP in Z direction between 'finite' and 'infinite' (=parallel)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3583
-msgid "Change spiral"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3724
-msgid "just a curve"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3724
-msgid "one full revolution"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3727
-msgid "Number of turns"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3727
-msgid "Turns:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3727
-msgid "Number of revolutions"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3738
-msgid "circle"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3738
-msgid "edge is much denser"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3738
-msgid "edge is denser"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3738
-msgid "even"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3738
-msgid "center is denser"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3738
-msgid "center is much denser"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3741
-msgid "Divergence"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3741
-msgid "Divergence:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3741
-msgid "How much denser/sparser are outer revolutions; 1 = uniform"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3752
-msgid "starts from center"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3752
-msgid "starts mid-way"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3752
-msgid "starts near edge"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3755
-msgid "Inner radius"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3755
-msgid "Inner radius:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3755
-msgid "Radius of the innermost revolution (relative to the spiral size)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3828
-msgid "Bezier"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3829
-msgid "Create regular Bezier path"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3835
-msgid "Spiro"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3836
-msgid "Create Spiro path"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3843
-msgid "Zigzag"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3844
-msgid "Create a sequence of straight line segments"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3850
-msgid "Paraxial"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3851
-msgid "Create a sequence of paraxial line segments"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3859
-msgid "Mode of new lines drawn by this tool"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3888
-msgid "Triangle in"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3889
-msgid "Triangle out"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3891
-msgid "From clipboard"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3916 ../src/widgets/toolbox.cpp:3917
-msgid "Shape:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3916
-msgid "Shape of new paths drawn by this tool"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4001
-msgid "(many nodes, rough)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4001 ../src/widgets/toolbox.cpp:4121
-#: ../src/widgets/toolbox.cpp:4138 ../src/widgets/toolbox.cpp:4341
-#: ../src/widgets/toolbox.cpp:4712 ../src/widgets/toolbox.cpp:4745
-#: ../src/widgets/toolbox.cpp:5731
-msgid "(default)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4001
-msgid "(few nodes, smooth)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4004
-msgid "Smoothing:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4004
-msgid "Smoothing: "
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4005
-msgid "How much smoothing (simplifying) is applied to the line"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4028
-msgid ""
-"Reset pencil parameters to defaults (use Inkscape Preferences > Tools to "
-"change defaults)"
-msgstr ""
-
-#. Width
-#: ../src/widgets/toolbox.cpp:4121
-msgid "(pinch tweak)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4121
-msgid "(broad tweak)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4124
-msgid "The width of the tweak area (relative to the visible canvas area)"
-msgstr ""
-
-#. Force
-#: ../src/widgets/toolbox.cpp:4138
-msgid "(minimum force)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4138
-msgid "(maximum force)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4141
-msgid "Force"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4141
-msgid "Force:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4141
-msgid "The force of the tweak action"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4159
-msgid "Move mode"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4160
-msgid "Move objects in any direction"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4166
-msgid "Move in/out mode"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4167
-msgid "Move objects towards cursor; with Shift from cursor"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4173
-msgid "Move jitter mode"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4174
-msgid "Move objects in random directions"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4180
-msgid "Scale mode"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4181
-msgid "Shrink objects, with Shift enlarge"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4187
-msgid "Rotate mode"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4188
-msgid "Rotate objects, with Shift counterclockwise"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4194
-msgid "Duplicate/delete mode"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4195
-msgid "Duplicate objects, with Shift delete"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4201
-msgid "Push mode"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4202
-msgid "Push parts of paths in any direction"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4208
-msgid "Shrink/grow mode"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4209
-msgid "Shrink (inset) parts of paths; with Shift grow (outset)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4215
-msgid "Attract/repel mode"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4216
-msgid "Attract parts of paths towards cursor; with Shift from cursor"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4222
-msgid "Roughen mode"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4223
-msgid "Roughen parts of paths"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4229
-msgid "Color paint mode"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4230
-msgid "Paint the tool's color upon selected objects"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4236
-msgid "Color jitter mode"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4237
-msgid "Jitter the colors of selected objects"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4243
-msgid "Blur mode"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4244
-msgid "Blur selected objects more; with Shift, blur less"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4271
-msgid "Channels:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4282
-msgid "In color mode, act on objects' hue"
-msgstr ""
-
-#. TRANSLATORS:  "H" here stands for hue
-#: ../src/widgets/toolbox.cpp:4286
-msgid "H"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4297
-msgid "In color mode, act on objects' saturation"
-msgstr ""
-
-#. TRANSLATORS: "S" here stands for Saturation
-#: ../src/widgets/toolbox.cpp:4301
-msgid "S"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4312
-msgid "In color mode, act on objects' lightness"
-msgstr ""
-
-#. TRANSLATORS: "L" here stands for Lightness
-#: ../src/widgets/toolbox.cpp:4316
-msgid "L"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4327
-msgid "In color mode, act on objects' opacity"
-msgstr ""
-
-#. TRANSLATORS: "O" here stands for Opacity
-#: ../src/widgets/toolbox.cpp:4331
-msgid "O"
-msgstr ""
-
-#. Fidelity
-#: ../src/widgets/toolbox.cpp:4341
-msgid "(rough, simplified)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4341
-msgid "(fine, but many nodes)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4344
-msgid "Fidelity"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4344
-msgid "Fidelity:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4345
-msgid ""
-"Low fidelity simplifies paths; high fidelity preserves path features but may "
-"generate a lot of new nodes"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4362 ../src/widgets/toolbox.cpp:4863
-msgid "Pressure"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4363
-msgid "Use the pressure of the input device to alter the force of tweak action"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4543
-msgid "No preset"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4561
-msgid "Save..."
-msgstr ""
-
-#. Width
-#: ../src/widgets/toolbox.cpp:4712 ../src/widgets/toolbox.cpp:5731
-msgid "(hairline)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4712 ../src/widgets/toolbox.cpp:5731
-msgid "(broad stroke)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4715 ../src/widgets/toolbox.cpp:5734
-msgid "Pen Width"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4716
-msgid "The width of the calligraphic pen (relative to the visible canvas area)"
-msgstr ""
-
-#. Thinning
-#: ../src/widgets/toolbox.cpp:4729
-msgid "(speed blows up stroke)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4729
-msgid "(slight widening)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4729
-msgid "(constant width)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4729
-msgid "(slight thinning, default)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4729
-msgid "(speed deflates stroke)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4732
-msgid "Stroke Thinning"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4732
-msgid "Thinning:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4733
-msgid ""
-"How much velocity thins the stroke (> 0 makes fast strokes thinner, < 0 "
-"makes them broader, 0 makes width independent of velocity)"
-msgstr ""
-
-#. Angle
-#: ../src/widgets/toolbox.cpp:4745
-msgid "(left edge up)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4745
-msgid "(horizontal)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4745
-msgid "(right edge up)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4748
-msgid "Pen Angle"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4748
-msgid "Angle:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4749
-msgid ""
-"The angle of the pen's nib (in degrees; 0 = horizontal; has no effect if "
-"fixation = 0)"
-msgstr ""
-
-#. Fixation
-#: ../src/widgets/toolbox.cpp:4763
-msgid "(perpendicular to stroke, \"brush\")"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4763
-msgid "(almost fixed, default)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4763
-msgid "(fixed by Angle, \"pen\")"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4766
-msgid "Fixation"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4766
-msgid "Fixation:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4767
-msgid ""
-"Angle behavior (0 = nib always perpendicular to stroke direction, 100 = "
-"fixed angle)"
-msgstr ""
-
-#. Cap Rounding
-#: ../src/widgets/toolbox.cpp:4779
-msgid "(blunt caps, default)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4779
-msgid "(slightly bulging)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4779
-msgid "(approximately round)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4779
-msgid "(long protruding caps)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4783
-msgid "Cap rounding"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4783
-msgid "Caps:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4784
-msgid ""
-"Increase to make caps at the ends of strokes protrude more (0 = no caps, 1 = "
-"round caps)"
-msgstr ""
-
-#. Tremor
-#: ../src/widgets/toolbox.cpp:4796
-msgid "(smooth line)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4796
-msgid "(slight tremor)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4796
-msgid "(noticeable tremor)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4796
-msgid "(maximum tremor)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4799
-msgid "Stroke Tremor"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4799
-msgid "Tremor:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4800
-msgid "Increase to make strokes rugged and trembling"
-msgstr ""
-
-#. Wiggle
-#: ../src/widgets/toolbox.cpp:4814
-msgid "(no wiggle)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4814
-msgid "(slight deviation)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4814
-msgid "(wild waves and curls)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4817
-msgid "Pen Wiggle"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4817
-msgid "Wiggle:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4818
-msgid "Increase to make the pen waver and wiggle"
-msgstr ""
-
-#. Mass
-#: ../src/widgets/toolbox.cpp:4831
-msgid "(no inertia)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4831
-msgid "(slight smoothing, default)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4831
-msgid "(noticeable lagging)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4831
-msgid "(maximum inertia)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4834
-msgid "Pen Mass"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4834
-msgid "Mass:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4835
-msgid "Increase to make the pen drag behind, as if slowed by inertia"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4850
-msgid "Trace Background"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4851
-msgid ""
-"Trace the lightness of the background by the width of the pen (white - "
-"minimum width, black - maximum width)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4864
-msgid "Use the pressure of the input device to alter the width of the pen"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4876
-msgid "Tilt"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4877
-msgid "Use the tilt of the input device to alter the angle of the pen's nib"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4890
-msgid "Choose a preset"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4978
-msgid "Arc: Change start/end"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5042
-msgid "Arc: Change open/closed"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5168
-msgid "Start:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5169
-msgid "The angle (in degrees) from the horizontal to the arc's start point"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5181
-msgid "End:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5182
-msgid "The angle (in degrees) from the horizontal to the arc's end point"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5198
-msgid "Closed arc"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5199
-msgid "Switch to segment (closed shape with two radii)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5205
-msgid "Open Arc"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5206
-msgid "Switch to arc (unclosed shape)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5229
-msgid "Make whole"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5230
-msgid "Make the shape a whole ellipse, not arc or segment"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5306
-msgid "Pick opacity"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5307
-msgid ""
-"Pick both the color and the alpha (transparency) under cursor; otherwise, "
-"pick only the visible color premultiplied by alpha"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5310
-msgid "Pick"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5319
-msgid "Assign opacity"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5320
-msgid ""
-"If alpha was picked, assign it to selection as fill or stroke transparency"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5323
-msgid "Assign"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5509
-msgid "Closed"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5511
-msgid "Open start"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5513
-msgid "Open end"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5515
-msgid "Open both"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5574
-msgid "All inactive"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5575
-msgid "No geometric tool is active"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5608
-msgid "Show limiting bounding box"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5609
-msgid "Show bounding box (used to cut infinite lines)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5620
-msgid "Get limiting bounding box from selection"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5621
-msgid ""
-"Set limiting bounding box (used to cut infinite lines) to the bounding box "
-"of current selection"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5633
-msgid "Choose a line segment type"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5649
-msgid "Display measuring info"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5650
-msgid "Display measuring info for selected items"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5670
-msgid "Open LPE dialog"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5671
-msgid "Open LPE dialog (to adapt parameters numerically)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5735
-msgid "The width of the eraser pen (relative to the visible canvas area)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5753
-msgid "Delete objects touched by the eraser"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5759
-msgid "Cut"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5760
-msgid "Cut out from objects"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:6104
-msgid "Text: Change font family"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:6174
-msgid "Text: Change alignment"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:6278
-msgid "Text: Change font style"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:6325
-msgid "Text: Change orientation"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:6439
-msgid "Text: Change font size"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:6650
-msgid "Select font family (Alt+X to access)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:6687
-msgid ""
-"This font is currently not installed on your system. Inkscape will use the "
-"default font instead."
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:6723
-msgid "Align left"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:6745
-msgid "Align right"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:6756
-msgid "Justify"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:6771
-msgid "Bold"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:6782
-msgid "Italic"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:6913
-msgid "Change connector spacing"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:6996
-msgid "Avoid"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:7006
-msgid "Ignore"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:7018
-msgid "Connector Spacing"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:7018
-msgid "Spacing:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:7019
-msgid "The amount of space left around objects by auto-routing connectors"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:7030
-msgid "Graph"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:7040
-msgid "Connector Length"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:7040
-msgid "Length:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:7041
-msgid "Ideal length for connectors when layout is applied"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:7053
-msgid "Downwards"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:7054
-msgid "Make connectors with end-markers (arrows) point downwards"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:7069
-msgid "Do not allow overlapping shapes"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:7172
-msgid "Fill by"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:7173
-msgid "Fill by:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:7185
-msgid "Fill Threshold"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:7186
-msgid ""
-"The maximum allowed difference between the clicked pixel and the neighboring "
-"pixels to be counted in the fill"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:7211
-msgid "Grow/shrink by"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:7211
-msgid "Grow/shrink by:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:7212
-msgid ""
-"The amount to grow (positive) or shrink (negative) the created fill path"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:7237
-msgid "Close gaps"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:7238
-msgid "Close gaps:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:7250
-msgid ""
-"Reset paint bucket parameters to defaults (use Inkscape Preferences > Tools "
-"to change defaults)"
-msgstr ""
-
-#: ../share/extensions/dimension.py:99
-msgid "Unable to process this object.  Try changing it into a path first."
-msgstr ""
-
-#. report to the Inkscape console using errormsg
-#: ../share/extensions/draw_from_triangle.py:175
-msgid "Side Length 'a'/px: "
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.py:176
-msgid "Side Length 'b'/px: "
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.py:177
-msgid "Side Length 'c'/px: "
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.py:178
-msgid "Angle 'A'/radians: "
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.py:179
-msgid "Angle 'B'/radians: "
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.py:180
-msgid "Angle 'C'/radians: "
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.py:181
-msgid "Semiperimeter/px: "
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.py:182
-msgid "Area /px^2: "
-msgstr ""
-
-#: ../share/extensions/dxf_outlines.py:33
-msgid ""
-"Failed to import the numpy or numpy.linalg modules. These modules are "
-"required by this extension. Please install them and try again."
-msgstr ""
-
-#: ../share/extensions/embedimage.py:74
-msgid ""
-"No xlink:href or sodipodi:absref attributes found, or they do not point to "
-"an existing file! Unable to embed image."
-msgstr ""
-
-#: ../share/extensions/embedimage.py:76
-#, python-format
-msgid "Sorry we could not locate %s"
-msgstr ""
-
-#: ../share/extensions/embedimage.py:101
-#, python-format
-msgid ""
-"%s is not of type image/png, image/jpeg, image/bmp, image/gif, image/tiff, "
-"or image/x-icon"
-msgstr ""
-
-#: ../share/extensions/export_gimp_palette.py:14
-msgid ""
-"The export_gpl.py module requires PyXML.  Please download the latest version "
-"from http://pyxml.sourceforge.net/."
-msgstr ""
-
-#: ../share/extensions/extractimage.py:66
-msgid "Unable to find image data."
-msgstr ""
-
-#: ../share/extensions/inkex.py:66
-msgid ""
-"The fantastic lxml wrapper for libxml2 is required by inkex.py and therefore "
-"this extension. Please download and install the latest version from http://"
-"cheeseshop.python.org/pypi/lxml/, or install it through your package manager "
-"by a command like: sudo apt-get install python-lxml"
-msgstr ""
-
-#: ../share/extensions/inkex.py:222
-#, python-format
-msgid "No matching node for expression: %s"
-msgstr ""
-
-#: ../share/extensions/markers_strokepaint.py:41
-#, python-format
-msgid "No style attribute found for id: %s"
-msgstr ""
-
-#: ../share/extensions/markers_strokepaint.py:56
-#, python-format
-msgid "unable to locate marker: %s"
-msgstr ""
-
-#: ../share/extensions/pathalongpath.py:197
-#: ../share/extensions/pathscatter.py:208
-#: ../share/extensions/perspective.py:61
-msgid "This extension requires two selected paths."
-msgstr ""
-
-#: ../share/extensions/pathmodifier.py:229
-#, python-format
-msgid "Please first convert objects to paths!  (Got [%s].)"
-msgstr ""
-
-#: ../share/extensions/perspective.py:29
-msgid ""
-"Failed to import the numpy or numpy.linalg modules. These modules are "
-"required by this extension. Please install them and try again.  On a Debian-"
-"like system this can be done with the command, sudo apt-get install python-"
-"numpy."
-msgstr ""
-
-#: ../share/extensions/perspective.py:68
-#: ../share/extensions/summersnight.py:43
-#, python-format
-msgid ""
-"The first selected object is of type '%s'.\n"
-"Try using the procedure Path->Object to Path."
-msgstr ""
-
-#: ../share/extensions/perspective.py:74
-#: ../share/extensions/summersnight.py:50
-msgid ""
-"This extension requires that the second selected path be four nodes long."
-msgstr ""
-
-#: ../share/extensions/perspective.py:99
-#: ../share/extensions/summersnight.py:82
-msgid ""
-"The second selected object is a group, not a path.\n"
-"Try using the procedure Object->Ungroup."
-msgstr ""
-
-#: ../share/extensions/perspective.py:101
-#: ../share/extensions/summersnight.py:84
-msgid ""
-"The second selected object is not a path.\n"
-"Try using the procedure Path->Object to Path."
-msgstr ""
-
-#: ../share/extensions/perspective.py:104
-#: ../share/extensions/summersnight.py:87
-msgid ""
-"The first selected object is not a path.\n"
-"Try using the procedure Path->Object to Path."
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.py:60
-msgid ""
-"Failed to import the numpy module. This module is required by this "
-"extension. Please install it and try again.  On a Debian-like system this "
-"can be done with the command 'sudo apt-get install python-numpy'."
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.py:331
-msgid "No face data found in specified file."
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.py:332
-msgid "Try selecting \"Edge Specified\" in the Model File tab.\n"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.py:338
-msgid "No edge data found in specified file."
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.py:339
-msgid "Try selecting \"Face Specified\" in the Model File tab.\n"
-msgstr ""
-
-#. we cannot generate a list of faces from the edges without a lot of computation
-#: ../share/extensions/polyhedron_3d.py:514
-msgid ""
-"Face Data Not Found. Ensure file contains face data, and check the file is "
-"imported as \"Face-Specified\" under the \"Model File\" tab.\n"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.py:516
-msgid "Internal Error. No view type selected\n"
-msgstr ""
-
-#: ../share/extensions/summersnight.py:36
-msgid ""
-"This extension requires two selected paths. \n"
-"The second path must be exactly four nodes long."
-msgstr ""
-
-#: ../share/extensions/svg_and_media_zip_output.py:125
-#, python-format
-msgid "Could not locate file: %s"
-msgstr ""
-
-#: ../share/extensions/uniconv_output.py:118
-msgid "You need to install the UniConvertor software.\n"
-msgstr ""
-
-#: ../share/extensions/web-set-att.py:52
-#: ../share/extensions/web-transmit-att.py:48
-msgid "You must select at least two elements."
-msgstr ""
-
-#: ../share/extensions/addnodes.inx.h:1
-msgid "Add Nodes"
-msgstr ""
-
-#: ../share/extensions/addnodes.inx.h:2
-msgid "By max. segment length"
-msgstr ""
-
-#: ../share/extensions/addnodes.inx.h:3
-msgid "By number of segments"
-msgstr ""
-
-#: ../share/extensions/addnodes.inx.h:4
-msgid "Division method"
-msgstr ""
-
-#: ../share/extensions/addnodes.inx.h:5
-msgid "Maximum segment length (px)"
-msgstr ""
-
-#: ../share/extensions/addnodes.inx.h:6
-#: ../share/extensions/convert2dashes.inx.h:2
-#: ../share/extensions/edge3d.inx.h:6 ../share/extensions/flatten.inx.h:3
-#: ../share/extensions/fractalize.inx.h:2
-#: ../share/extensions/interp_att_g.inx.h:10
-#: ../share/extensions/markers_strokepaint.inx.h:2
-#: ../share/extensions/perspective.inx.h:1
-#: ../share/extensions/radiusrand.inx.h:4
-#: ../share/extensions/rubberstretch.inx.h:3
-#: ../share/extensions/straightseg.inx.h:2
-#: ../share/extensions/summersnight.inx.h:2 ../share/extensions/whirl.inx.h:2
-msgid "Modify Path"
-msgstr ""
-
-#: ../share/extensions/addnodes.inx.h:7
-msgid "Number of segments"
-msgstr ""
-
-#: ../share/extensions/ai_input.inx.h:1
-msgid "AI 8.0 Input"
-msgstr ""
-
-#: ../share/extensions/ai_input.inx.h:2
-msgid "Adobe Illustrator 8.0 and below (*.ai)"
-msgstr ""
-
-#: ../share/extensions/ai_input.inx.h:3
-msgid "Open files saved with Adobe Illustrator 8.0 or older"
-msgstr ""
-
-#: ../share/extensions/aisvg.inx.h:1
-msgid "AI SVG Input"
-msgstr ""
-
-#: ../share/extensions/aisvg.inx.h:2
-msgid "Adobe Illustrator SVG (*.ai.svg)"
-msgstr ""
-
-#: ../share/extensions/aisvg.inx.h:3
-msgid "Cleans the cruft out of Adobe Illustrator SVGs before opening"
-msgstr ""
-
-#: ../share/extensions/ccx_input.inx.h:1
-msgid "Corel DRAW Compressed Exchange files (.ccx)"
-msgstr ""
-
-#: ../share/extensions/ccx_input.inx.h:2
-msgid "Corel DRAW Compressed Exchange files input"
-msgstr ""
-
-#: ../share/extensions/ccx_input.inx.h:3
-msgid "Open compressed exchange files saved in Corel DRAW"
-msgstr ""
-
-#: ../share/extensions/cdr_input.inx.h:1
-msgid "Corel DRAW 7-X4 files (*.cdr)"
-msgstr ""
-
-#: ../share/extensions/cdr_input.inx.h:2
-msgid "Corel DRAW Input"
-msgstr ""
-
-#: ../share/extensions/cdr_input.inx.h:3
-msgid "Open files saved in Corel DRAW 7-X4"
-msgstr ""
-
-#: ../share/extensions/cdt_input.inx.h:1
-msgid "Corel DRAW 7-13 template files (.cdt)"
-msgstr ""
-
-#: ../share/extensions/cdt_input.inx.h:2
-msgid "Corel DRAW templates input"
-msgstr ""
-
-#: ../share/extensions/cdt_input.inx.h:3
-msgid "Open files saved in Corel DRAW 7-13"
-msgstr ""
-
-#: ../share/extensions/cgm_input.inx.h:1
-msgid "Computer Graphics Metafile files (.cgm)"
-msgstr ""
-
-#: ../share/extensions/cgm_input.inx.h:2
-msgid "Computer Graphics Metafile files input"
-msgstr ""
-
-#: ../share/extensions/cgm_input.inx.h:3
-msgid "Open Computer Graphics Metafile files"
-msgstr ""
-
-#: ../share/extensions/cmx_input.inx.h:1
-msgid "Corel DRAW Presentation Exchange files (.cmx)"
-msgstr ""
-
-#: ../share/extensions/cmx_input.inx.h:2
-msgid "Corel DRAW Presentation Exchange files input"
-msgstr ""
-
-#: ../share/extensions/cmx_input.inx.h:3
-msgid "Open presentation exchange files saved in Corel DRAW"
-msgstr ""
-
-#: ../share/extensions/color_brighter.inx.h:1
-msgid "Brighter"
-msgstr ""
-
-#: ../share/extensions/color_custom.inx.h:1
-msgid "Blue Function"
-msgstr ""
-
-#: ../share/extensions/color_custom.inx.h:4
-msgid "Green Function"
-msgstr ""
-
-#: ../share/extensions/color_custom.inx.h:5
-msgid "Red Function"
-msgstr ""
-
-#: ../share/extensions/color_darker.inx.h:2
-msgid "Darker"
-msgstr ""
-
-#: ../share/extensions/color_grayscale.inx.h:2
-msgid "Grayscale"
-msgstr ""
-
-#: ../share/extensions/color_lesshue.inx.h:2
-msgid "Less Hue"
-msgstr ""
-
-#: ../share/extensions/color_lesslight.inx.h:2
-msgid "Less Light"
-msgstr ""
-
-#: ../share/extensions/color_lesssaturation.inx.h:2
-msgid "Less Saturation"
-msgstr ""
-
-#: ../share/extensions/color_morehue.inx.h:2
-msgid "More Hue"
-msgstr ""
-
-#: ../share/extensions/color_morelight.inx.h:2
-msgid "More Light"
-msgstr ""
-
-#: ../share/extensions/color_moresaturation.inx.h:2
-msgid "More Saturation"
-msgstr ""
-
-#: ../share/extensions/color_negative.inx.h:2
-msgid "Negative"
-msgstr ""
-
-#: ../share/extensions/color_randomize.inx.h:4
-msgid "Randomize"
-msgstr ""
-
-#: ../share/extensions/color_removeblue.inx.h:2
-msgid "Remove Blue"
-msgstr ""
-
-#: ../share/extensions/color_removegreen.inx.h:2
-msgid "Remove Green"
-msgstr ""
-
-#: ../share/extensions/color_removered.inx.h:2
-msgid "Remove Red"
-msgstr ""
-
-#: ../share/extensions/color_replace.inx.h:1
-msgid "By color (RRGGBB hex):"
-msgstr ""
-
-#: ../share/extensions/color_replace.inx.h:3
-msgid "Replace color"
-msgstr ""
-
-#: ../share/extensions/color_replace.inx.h:4
-msgid "Replace color (RRGGBB hex):"
-msgstr ""
-
-#: ../share/extensions/color_rgbbarrel.inx.h:2
-msgid "RGB Barrel"
-msgstr ""
-
-#: ../share/extensions/convert2dashes.inx.h:1
-msgid "Convert to Dashes"
-msgstr ""
-
-#: ../share/extensions/dia.inx.h:1
-msgid "A diagram created with the program Dia"
-msgstr ""
-
-#: ../share/extensions/dia.inx.h:2
-msgid "Dia Diagram (*.dia)"
-msgstr ""
-
-#: ../share/extensions/dia.inx.h:3
-msgid "Dia Input"
-msgstr ""
-
-#: ../share/extensions/dia.inx.h:4
-msgid ""
-"In order to import Dia files, Dia itself must be installed.  You can get Dia "
-"at http://live.gnome.org/Dia"
-msgstr ""
-
-#: ../share/extensions/dia.inx.h:5
-msgid ""
-"The dia2svg.sh script should be installed with your Inkscape distribution.  "
-"If you do not have it, there is likely to be something wrong with your "
-"Inkscape installation."
-msgstr ""
-
-#: ../share/extensions/dimension.inx.h:1
-msgid "Dimensions"
-msgstr ""
-
-#: ../share/extensions/dimension.inx.h:2 ../share/extensions/dots.inx.h:4
-#: ../share/extensions/handles.inx.h:2 ../share/extensions/measure.inx.h:11
-msgid "Visualize Path"
-msgstr ""
-
-#: ../share/extensions/dimension.inx.h:3
-msgid "X Offset"
-msgstr ""
-
-#: ../share/extensions/dimension.inx.h:4
-msgid "Y Offset"
-msgstr ""
-
-#: ../share/extensions/dots.inx.h:1
-msgid "Dot size"
-msgstr ""
-
-#: ../share/extensions/dots.inx.h:2
-msgid "Font size"
-msgstr ""
-
-#: ../share/extensions/dots.inx.h:3
-msgid "Number Nodes"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:1
-msgid "Altitudes"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:2
-msgid "Angle Bisectors"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:3
-msgid "Centroid"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:4
-msgid "Circumcentre"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:5
-msgid "Circumcircle"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:6
-msgid "Common Objects"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:7
-msgid "Contact Triangle"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:8
-msgid "Custom Point Specified By:"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:9
-msgid "Custom Points and Options"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:10
-msgid "Draw Circle Around This Point"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:11
-msgid "Draw From Triangle"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:12
-msgid "Draw Isogonal Conjugate"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:13
-msgid "Draw Isotomic Conjugate"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:14
-msgid "Draw Marker At This Point"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:15
-msgid "Excentral Triangle"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:16
-msgid "Excentres"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:17
-msgid "Excircles"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:18
-msgid "Extouch Triangle"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:19
-msgid "Gergonne Point"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:21
-msgid "Incentre"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:22
-msgid "Incircle"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:23
-msgid "Nagel Point"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:24
-msgid "Nine-Point Centre"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:25
-msgid "Nine-Point Circle"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:26
-msgid "Orthic Triangle"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:27
-msgid "Orthocentre"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:28
-msgid "Point At"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:29
-msgid "Radius / px"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:31
-msgid "Report this triangle's properties"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:32
-msgid "Symmedial Triangle"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:33
-msgid "Symmedian Point"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:34
-msgid "Symmedians"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:35
-msgid ""
-"This extension draws constructions about a triangle defined by the first 3 "
-"nodes of a selected path. You may select one of preset objects or create "
-"your own ones.\n"
-"            \n"
-"All units are the Inkscape's pixel unit. Angles are all in radians.\n"
-"You can specify a point by trilinear coordinates or by a triangle centre "
-"function.\n"
-"Enter as functions of the side length or angles.\n"
-"Trilinear elements should be separated by a colon: ':'.\n"
-"Side lengths are represented as 's_a', 's_b' and 's_c'.\n"
-"Angles corresponding to these are 'a_a', 'a_b', and 'a_c'.\n"
-"You can also use the semi-perimeter and area of the triangle as constants. "
-"Write 'area' or 'semiperim' for these.\n"
-"\n"
-"You can use any standard Python math function:\n"
-"ceil(x); fabs(x); floor(x); fmod(x,y); frexp(x); ldexp(x,i); \n"
-"modf(x); exp(x); log(x [, base]); log10(x); pow(x,y); sqrt(x); \n"
-"acos(x); asin(x); atan(x); atan2(y,x); hypot(x,y); \n"
-"cos(x); sin(x); tan(x); degrees(x); radians(x); \n"
-"cosh(x); sinh(x); tanh(x)\n"
-"\n"
-"Also available are the inverse trigonometric functions:\n"
-"sec(x); csc(x); cot(x)\n"
-"\n"
-"You can specify the radius of a circle around a custom point using a "
-"formula, which may also contain the side lengths, angles, etc. You can also "
-"plot the isogonal and isotomic conjugate of the point. Be aware that this "
-"may cause a divide-by-zero error for certain points.\n"
-"            "
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:57
-msgid "Triangle Function"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:58
-msgid "Trilinear Coordinates"
-msgstr ""
-
-#: ../share/extensions/dxf_input.inx.h:1
-msgid ""
-"- AutoCAD Release 13 and newer.\n"
-"- assume dxf drawing is in mm.\n"
-"- assume svg drawing is in pixels, at 90 dpi.\n"
-"- layers are preserved only on File->Open, not Import.\n"
-"- limited support for BLOCKS, use AutoCAD Explode Blocks instead, if needed."
-msgstr ""
-
-#: ../share/extensions/dxf_input.inx.h:6
-msgid "AutoCAD DXF R13 (*.dxf)"
-msgstr ""
-
-#: ../share/extensions/dxf_input.inx.h:7
-msgid "Character Encoding"
-msgstr ""
-
-#: ../share/extensions/dxf_input.inx.h:8
-msgid "DXF Input"
-msgstr ""
-
-#: ../share/extensions/dxf_input.inx.h:10
-msgid "Import AutoCAD's Document Exchange Format"
-msgstr ""
-
-#: ../share/extensions/dxf_input.inx.h:12
-msgid "Or, use manual scale factor"
-msgstr ""
-
-#: ../share/extensions/dxf_input.inx.h:13
-msgid "Use automatic scaling to size A4"
-msgstr ""
-
-#: ../share/extensions/dxf_outlines.inx.h:1
-msgid ""
-"- AutoCAD Release 13 format.\n"
-"- assume svg drawing is in pixels, at 90 dpi.\n"
-"- assume dxf drawing is in mm.\n"
-"- only LWPOLYLINE and SPLINE elements are supported.\n"
-"- ROBO-Master option is a specialized spline readable only by ROBO-Master "
-"and AutoDesk viewers, not Inkscape."
-msgstr ""
-
-#: ../share/extensions/dxf_outlines.inx.h:6
-msgid "Desktop Cutting Plotter"
-msgstr ""
-
-#: ../share/extensions/dxf_outlines.inx.h:7
-msgid "Desktop Cutting Plotter (R13) (*.dxf)"
-msgstr ""
-
-#: ../share/extensions/dxf_outlines.inx.h:10
-msgid "enable ROBO-Master output"
-msgstr ""
-
-#: ../share/extensions/dxf_output.inx.h:1
-msgid "AutoCAD DXF R12 (*.dxf)"
-msgstr ""
-
-#: ../share/extensions/dxf_output.inx.h:2
-msgid "DXF Output"
-msgstr ""
-
-#: ../share/extensions/dxf_output.inx.h:3
-msgid "DXF file written by pstoedit"
-msgstr ""
-
-#: ../share/extensions/dxf_output.inx.h:4
-msgid "pstoedit must be installed to run; see http://www.pstoedit.net/pstoedit"
-msgstr ""
-
-#: ../share/extensions/edge3d.inx.h:1
-msgid "Blur height"
-msgstr ""
-
-#: ../share/extensions/edge3d.inx.h:2
-msgid "Blur stdDeviation"
-msgstr ""
-
-#: ../share/extensions/edge3d.inx.h:3
-msgid "Blur width"
-msgstr ""
-
-#: ../share/extensions/edge3d.inx.h:4
-msgid "Edge 3D"
-msgstr ""
-
-#: ../share/extensions/edge3d.inx.h:5
-msgid "Illumination Angle"
-msgstr ""
-
-#: ../share/extensions/edge3d.inx.h:7
-msgid "Only black and white"
-msgstr ""
-
-#: ../share/extensions/edge3d.inx.h:8
-msgid "Shades"
-msgstr ""
-
-#: ../share/extensions/embedimage.inx.h:1
-msgid "Embed Images"
-msgstr ""
-
-#: ../share/extensions/embedimage.inx.h:2
-msgid "Embed only selected images"
-msgstr ""
-
-#: ../share/extensions/eps_input.inx.h:1
-msgid "EPS Input"
-msgstr ""
-
-#: ../share/extensions/eqtexsvg.inx.h:1
-msgid "LaTeX formula"
-msgstr ""
-
-#: ../share/extensions/eqtexsvg.inx.h:2
-msgid "LaTeX formula: "
-msgstr ""
-
-#: ../share/extensions/export_gimp_palette.inx.h:1
-msgid "Export as GIMP Palette"
-msgstr ""
-
-#: ../share/extensions/export_gimp_palette.inx.h:2
-msgid "Exports the colors of this document as GIMP Palette"
-msgstr ""
-
-#: ../share/extensions/export_gimp_palette.inx.h:3
-msgid "GIMP Palette (*.gpl)"
-msgstr ""
-
-#: ../share/extensions/extractimage.inx.h:1
-msgid "Extract Image"
-msgstr ""
-
-#: ../share/extensions/extractimage.inx.h:3
-msgid "Note: The file extension is appended automatically."
-msgstr ""
-
-#: ../share/extensions/extractimage.inx.h:4
-msgid "Path to save image"
-msgstr ""
-
-#: ../share/extensions/extrude.inx.h:3
-msgid "Lines"
-msgstr ""
-
-#: ../share/extensions/extrude.inx.h:5
-msgid "Polygons"
-msgstr ""
-
-#: ../share/extensions/fig_input.inx.h:1
-msgid "Open files saved with XFIG"
-msgstr ""
-
-#: ../share/extensions/fig_input.inx.h:2
-msgid "XFIG Graphics File (*.fig)"
-msgstr ""
-
-#: ../share/extensions/fig_input.inx.h:3
-msgid "XFIG Input"
-msgstr ""
-
-#: ../share/extensions/flatten.inx.h:1
-msgid "Flatness"
-msgstr ""
-
-#: ../share/extensions/flatten.inx.h:2
-msgid "Flatten Beziers"
-msgstr ""
-
-#: ../share/extensions/foldablebox.inx.h:1
-msgid "Add Guide Lines"
-msgstr ""
-
-#: ../share/extensions/foldablebox.inx.h:2
-msgid "Depth"
-msgstr ""
-
-#: ../share/extensions/foldablebox.inx.h:3
-msgid "Foldable Box"
-msgstr ""
-
-#: ../share/extensions/foldablebox.inx.h:5
-msgid "Paper Thickness"
-msgstr ""
-
-#: ../share/extensions/foldablebox.inx.h:7
-msgid "Tab Proportion"
-msgstr ""
-
-#: ../share/extensions/fractalize.inx.h:1
-msgid "Fractalize"
-msgstr ""
-
-#: ../share/extensions/fractalize.inx.h:3
-msgid "Smoothness"
-msgstr ""
-
-#: ../share/extensions/fractalize.inx.h:4
-msgid "Subdivisions"
-msgstr ""
-
-#: ../share/extensions/funcplot.inx.h:1
-msgid "Calculate first derivative numerically"
-msgstr ""
-
-#: ../share/extensions/funcplot.inx.h:2
-#: ../share/extensions/param_curves.inx.h:1
-msgid "Draw Axes"
-msgstr ""
-
-#: ../share/extensions/funcplot.inx.h:3
-msgid "End X value"
-msgstr ""
-
-#: ../share/extensions/funcplot.inx.h:4
-msgid "First derivative"
-msgstr ""
-
-#: ../share/extensions/funcplot.inx.h:5
-msgid "Function"
-msgstr ""
-
-#: ../share/extensions/funcplot.inx.h:6
-msgid "Function Plotter"
-msgstr ""
-
-#: ../share/extensions/funcplot.inx.h:7
-#: ../share/extensions/param_curves.inx.h:3
-msgid "Functions"
-msgstr ""
-
-#: ../share/extensions/funcplot.inx.h:8
-msgid "Isotropic scaling (uses smallest of width/xrange or height/yrange)"
-msgstr ""
-
-#: ../share/extensions/funcplot.inx.h:9
-msgid "Multiply X range by 2*pi"
-msgstr ""
-
-#: ../share/extensions/funcplot.inx.h:10
-msgid "Number of samples"
-msgstr ""
-
-#: ../share/extensions/funcplot.inx.h:11
-msgid "Range and sampling"
-msgstr ""
-
-#: ../share/extensions/funcplot.inx.h:12
-#: ../share/extensions/param_curves.inx.h:8
-msgid "Remove rectangle"
-msgstr ""
-
-#: ../share/extensions/funcplot.inx.h:14
-msgid ""
-"Select a rectangle before calling the extension,\n"
-"it will determine X and Y scales.\n"
-"\n"
-"With polar coordinates:\n"
-"   Start and end X values define the angle range in radians.\n"
-"   X scale is set so that left and right edges of rectangle are at +/-1.\n"
-"   Isotropic scaling is disabled.\n"
-"   First derivative is always determined numerically."
-msgstr ""
-
-#: ../share/extensions/funcplot.inx.h:22
-#: ../share/extensions/param_curves.inx.h:15
-msgid ""
-"Standard Python math functions are available:\n"
-"\n"
-"ceil(x); fabs(x); floor(x); fmod(x,y); frexp(x); ldexp(x,i); \n"
-"modf(x); exp(x); log(x [, base]); log10(x); pow(x,y); sqrt(x); \n"
-"acos(x); asin(x); atan(x); atan2(y,x); hypot(x,y); \n"
-"cos(x); sin(x); tan(x); degrees(x); radians(x); \n"
-"cosh(x); sinh(x); tanh(x).\n"
-"\n"
-"The constants pi and e are also available."
-msgstr ""
-
-#: ../share/extensions/funcplot.inx.h:31
-msgid "Start X value"
-msgstr ""
-
-#: ../share/extensions/funcplot.inx.h:32
-#: ../share/extensions/param_curves.inx.h:25
-msgid "Use"
-msgstr ""
-
-#: ../share/extensions/funcplot.inx.h:33
-msgid "Use polar coordinates"
-msgstr ""
-
-#: ../share/extensions/funcplot.inx.h:34
-msgid "Y value of rectangle's bottom"
-msgstr ""
-
-#: ../share/extensions/funcplot.inx.h:35
-msgid "Y value of rectangle's top"
-msgstr ""
-
-#: ../share/extensions/gears.inx.h:1
-msgid "Circular pitch, px"
-msgstr ""
-
-#: ../share/extensions/gears.inx.h:2
-msgid "Gear"
-msgstr ""
-
-#: ../share/extensions/gears.inx.h:3
-msgid "Number of teeth"
-msgstr ""
-
-#: ../share/extensions/gears.inx.h:4
-msgid "Pressure angle"
-msgstr ""
-
-#: ../share/extensions/gimp_xcf.inx.h:1
-msgid "GIMP XCF"
-msgstr ""
-
-#: ../share/extensions/gimp_xcf.inx.h:2
-msgid "GIMP XCF maintaining layers (*.xcf)"
-msgstr ""
-
-#: ../share/extensions/gimp_xcf.inx.h:3
-msgid "Save Grid:"
-msgstr ""
-
-#: ../share/extensions/gimp_xcf.inx.h:4
-msgid "Save Guides:"
-msgstr ""
-
-#: ../share/extensions/grid_cartesian.inx.h:1
-msgid "Border Thickness [px]"
-msgstr ""
-
-#: ../share/extensions/grid_cartesian.inx.h:2
-msgid "Cartesian Grid"
-msgstr ""
-
-#: ../share/extensions/grid_cartesian.inx.h:3
-msgid "Halve X Subsubdiv. Frequency after 'n' Subdivs. (log only)"
-msgstr ""
-
-#: ../share/extensions/grid_cartesian.inx.h:4
-msgid "Halve Y Subsubdiv. Frequency after 'n' Subdivs. (log only)"
-msgstr ""
-
-#: ../share/extensions/grid_cartesian.inx.h:5
-msgid "Logarithmic X Subdiv. (Base given by entry above)"
-msgstr ""
-
-#: ../share/extensions/grid_cartesian.inx.h:6
-msgid "Logarithmic Y Subdiv. (Base given by entry above)"
-msgstr ""
-
-#: ../share/extensions/grid_cartesian.inx.h:7
-msgid "Major X Division Spacing [px]"
-msgstr ""
-
-#: ../share/extensions/grid_cartesian.inx.h:8
-msgid "Major X Division Thickness [px]"
-msgstr ""
-
-#: ../share/extensions/grid_cartesian.inx.h:9
-msgid "Major X Divisions"
-msgstr ""
-
-#: ../share/extensions/grid_cartesian.inx.h:10
-msgid "Major Y Division Spacing [px]"
-msgstr ""
-
-#: ../share/extensions/grid_cartesian.inx.h:11
-msgid "Major Y Division Thickness [px]"
-msgstr ""
-
-#: ../share/extensions/grid_cartesian.inx.h:12
-msgid "Major Y Divisions"
-msgstr ""
-
-#: ../share/extensions/grid_cartesian.inx.h:13
-msgid "Minor X Division Thickness [px]"
-msgstr ""
-
-#: ../share/extensions/grid_cartesian.inx.h:14
-msgid "Minor Y Division Thickness [px]"
-msgstr ""
-
-#: ../share/extensions/grid_cartesian.inx.h:16
-msgid "Subdivisions per Major X Division"
-msgstr ""
-
-#: ../share/extensions/grid_cartesian.inx.h:17
-msgid "Subdivisions per Major Y Division"
-msgstr ""
-
-#: ../share/extensions/grid_cartesian.inx.h:18
-msgid "Subminor X Division Thickness [px]"
-msgstr ""
-
-#: ../share/extensions/grid_cartesian.inx.h:19
-msgid "Subminor Y Division Thickness [px]"
-msgstr ""
-
-#: ../share/extensions/grid_cartesian.inx.h:20
-msgid "Subsubdivs. per X Subdivision"
-msgstr ""
-
-#: ../share/extensions/grid_cartesian.inx.h:21
-msgid "Subsubdivs. per Y Subdivision"
-msgstr ""
-
-#: ../share/extensions/grid_polar.inx.h:1
-msgid "Angle Divisions"
-msgstr ""
-
-#: ../share/extensions/grid_polar.inx.h:2
-msgid "Angle Divisions at Centre"
-msgstr ""
-
-#: ../share/extensions/grid_polar.inx.h:3
-msgid "Centre Dot Diameter [px]"
-msgstr ""
-
-#: ../share/extensions/grid_polar.inx.h:4
-msgid "Circumferential Label Outset [px]"
-msgstr ""
-
-#: ../share/extensions/grid_polar.inx.h:5
-msgid "Circumferential Label Size [px]"
-msgstr ""
-
-#: ../share/extensions/grid_polar.inx.h:6
-msgid "Circumferential Labels"
-msgstr ""
-
-#: ../share/extensions/grid_polar.inx.h:8
-msgid "Logarithmic Subdiv. (Base given by entry above)"
-msgstr ""
-
-#: ../share/extensions/grid_polar.inx.h:9
-msgid "Major Angular Division Thickness [px]"
-msgstr ""
-
-#: ../share/extensions/grid_polar.inx.h:10
-msgid "Major Circular Division Spacing [px]"
-msgstr ""
-
-#: ../share/extensions/grid_polar.inx.h:11
-msgid "Major Circular Division Thickness [px]"
-msgstr ""
-
-#: ../share/extensions/grid_polar.inx.h:12
-msgid "Major Circular Divisions"
-msgstr ""
-
-#: ../share/extensions/grid_polar.inx.h:13
-msgid "Minor Angle Division End 'n' Divs. Before Centre"
-msgstr ""
-
-#: ../share/extensions/grid_polar.inx.h:14
-msgid "Minor Angular Division Thickness [px]"
-msgstr ""
-
-#: ../share/extensions/grid_polar.inx.h:15
-msgid "Minor Circular Division Thickness [px]"
-msgstr ""
-
-#: ../share/extensions/grid_polar.inx.h:17
-msgid "Polar Grid"
-msgstr ""
-
-#: ../share/extensions/grid_polar.inx.h:19
-msgid "Subdivisions per Major Angular Division"
-msgstr ""
-
-#: ../share/extensions/grid_polar.inx.h:20
-msgid "Subdivisions per Major Circular Division"
-msgstr ""
-
-#: ../share/extensions/guides_creator.inx.h:1
-msgid "1/10"
-msgstr ""
-
-#: ../share/extensions/guides_creator.inx.h:2
-msgid "1/2"
-msgstr ""
-
-#: ../share/extensions/guides_creator.inx.h:3
-msgid "1/3"
-msgstr ""
-
-#: ../share/extensions/guides_creator.inx.h:4
-msgid "1/4"
-msgstr ""
-
-#: ../share/extensions/guides_creator.inx.h:5
-msgid "1/5"
-msgstr ""
-
-#: ../share/extensions/guides_creator.inx.h:6
-msgid "1/6"
-msgstr ""
-
-#: ../share/extensions/guides_creator.inx.h:7
-msgid "1/7"
-msgstr ""
-
-#: ../share/extensions/guides_creator.inx.h:8
-msgid "1/8"
-msgstr ""
-
-#: ../share/extensions/guides_creator.inx.h:9
-msgid "1/9"
-msgstr ""
-
-#: ../share/extensions/guides_creator.inx.h:10
-msgid "Custom..."
-msgstr ""
-
-#: ../share/extensions/guides_creator.inx.h:11
-msgid "Delete existing guides"
-msgstr ""
-
-#: ../share/extensions/guides_creator.inx.h:12
-msgid "Golden ratio"
-msgstr ""
-
-#: ../share/extensions/guides_creator.inx.h:13
-msgid "Guides creator"
-msgstr ""
-
-#: ../share/extensions/guides_creator.inx.h:14
-msgid "Horizontal guide each"
-msgstr ""
-
-#: ../share/extensions/guides_creator.inx.h:16
-msgid "Preset"
-msgstr ""
-
-#: ../share/extensions/guides_creator.inx.h:18
-msgid "Rule-of-third"
-msgstr ""
-
-#: ../share/extensions/guides_creator.inx.h:19
-msgid "Start from edges"
-msgstr ""
-
-#: ../share/extensions/guides_creator.inx.h:20
-msgid "Vertical guide each"
-msgstr ""
-
-#: ../share/extensions/handles.inx.h:1
-msgid "Draw Handles"
-msgstr ""
-
-#: ../share/extensions/hpgl_output.inx.h:1
-msgid "Export to an HP Graphics Language file"
-msgstr ""
-
-#: ../share/extensions/hpgl_output.inx.h:2
-msgid "HP Graphics Language file (*.hpgl)"
-msgstr ""
-
-#: ../share/extensions/hpgl_output.inx.h:3
-msgid "HPGL Output"
-msgstr ""
-
-#: ../share/extensions/hpgl_output.inx.h:4
-msgid "Mirror Y-axis"
-msgstr ""
-
-#: ../share/extensions/hpgl_output.inx.h:5
-msgid "Plot invisible layers"
-msgstr ""
-
-#: ../share/extensions/hpgl_output.inx.h:6
-msgid "X-origin (px)"
-msgstr ""
-
-#: ../share/extensions/hpgl_output.inx.h:7
-msgid "Y-origin (px)"
-msgstr ""
-
-#: ../share/extensions/hpgl_output.inx.h:8
-msgid "hpgl output flatness"
-msgstr ""
-
-#: ../share/extensions/inkscape_help_askaquestion.inx.h:1
-msgid "Ask Us a Question"
-msgstr ""
-
-#: ../share/extensions/inkscape_help_commandline.inx.h:1
-msgid "Command Line Options"
-msgstr ""
-
-#: ../share/extensions/inkscape_help_faq.inx.h:1
-msgid "FAQ"
-msgstr ""
-
-#: ../share/extensions/inkscape_help_keys.inx.h:1
-msgid "Keys and Mouse Reference"
-msgstr ""
-
-#: ../share/extensions/inkscape_help_manual.inx.h:1
-msgid "Inkscape Manual"
-msgstr ""
-
-#: ../share/extensions/inkscape_help_relnotes.inx.h:1
-msgid "New in This Version"
-msgstr ""
-
-#: ../share/extensions/inkscape_help_reportabug.inx.h:1
-msgid "Report a Bug"
-msgstr ""
-
-#: ../share/extensions/inkscape_help_svgspec.inx.h:1
-msgid "SVG 1.1 Specification"
-msgstr ""
-
-#: ../share/extensions/interp_att_g.inx.h:1
-msgid "Attribute to Interpolate"
-msgstr ""
-
-#: ../share/extensions/interp_att_g.inx.h:3
-msgid "End Value"
-msgstr ""
-
-#: ../share/extensions/interp_att_g.inx.h:5
-msgid "Float Number"
-msgstr ""
-
-#: ../share/extensions/interp_att_g.inx.h:7
-msgid ""
-"If you select \"Other\", you must know the SVG attributes to identify here "
-"this \"other\":"
-msgstr ""
-
-#: ../share/extensions/interp_att_g.inx.h:8
-msgid "Integer Number"
-msgstr ""
-
-#: ../share/extensions/interp_att_g.inx.h:9
-msgid "Interpolate Attribute in a group"
-msgstr ""
-
-#: ../share/extensions/interp_att_g.inx.h:11
-msgid "No Unit"
-msgstr ""
-
-#: ../share/extensions/interp_att_g.inx.h:13
-msgid "Other"
-msgstr ""
-
-#: ../share/extensions/interp_att_g.inx.h:14
-msgid "Other Attribute"
-msgstr ""
-
-#: ../share/extensions/interp_att_g.inx.h:15
-msgid "Other Attribute type"
-msgstr ""
-
-#: ../share/extensions/interp_att_g.inx.h:17
-msgid "Start Value"
-msgstr ""
-
-#: ../share/extensions/interp_att_g.inx.h:18
-#: ../share/extensions/polyhedron_3d.inx.h:43
-msgid "Style"
-msgstr ""
-
-#: ../share/extensions/interp_att_g.inx.h:19
-msgid "Tag"
-msgstr ""
-
-#: ../share/extensions/interp_att_g.inx.h:20
-msgid ""
-"This effect applies a value for any interpolatable attribute for all "
-"elements inside the selected group or for all elements in a multiple "
-"selection"
-msgstr ""
-
-#: ../share/extensions/interp_att_g.inx.h:21
-msgid "Transformation"
-msgstr ""
-
-#: ../share/extensions/interp_att_g.inx.h:22
-msgid "Translate X"
-msgstr ""
-
-#: ../share/extensions/interp_att_g.inx.h:23
-msgid "Translate Y"
-msgstr ""
-
-#: ../share/extensions/interp_att_g.inx.h:25
-msgid "Where to apply?"
-msgstr ""
-
-#: ../share/extensions/interp_att_g.inx.h:27
-#: ../share/extensions/web-set-att.inx.h:28
-#: ../share/extensions/web-transmit-att.inx.h:26
-msgid "••••••••••••••••••••••••••••••••••••••••••••••••"
-msgstr ""
-
-#: ../share/extensions/interp.inx.h:1
-msgid "Duplicate endpaths"
-msgstr ""
-
-#: ../share/extensions/interp.inx.h:2
-msgid "Exponent"
-msgstr ""
-
-#: ../share/extensions/interp.inx.h:4
-msgid "Interpolate"
-msgstr ""
-
-#: ../share/extensions/interp.inx.h:5
-msgid "Interpolate style"
-msgstr ""
-
-#: ../share/extensions/interp.inx.h:6
-msgid "Interpolation method"
-msgstr ""
-
-#: ../share/extensions/interp.inx.h:7
-msgid "Interpolation steps"
-msgstr ""
-
-#: ../share/extensions/lindenmayer.inx.h:1
-msgid ""
-"\n"
-"The path is generated by applying the \n"
-"substitutions of Rules to the Axiom, \n"
-"Order times. The following commands are \n"
-"recognized in Axiom and Rules:\n"
-"\n"
-"Any of A,B,C,D,E,F: draw forward \n"
-"\n"
-"Any of G,H,I,J,K,L: move forward \n"
-"\n"
-"+: turn left\n"
-"\n"
-"-: turn right\n"
-"\n"
-"|: turn 180 degrees\n"
-"\n"
-"[: remember point\n"
-"\n"
-"]: return to remembered point\n"
-msgstr ""
-
-#: ../share/extensions/lindenmayer.inx.h:21
-msgid "Axiom"
-msgstr ""
-
-#: ../share/extensions/lindenmayer.inx.h:22
-msgid "Axiom and rules"
-msgstr ""
-
-#: ../share/extensions/lindenmayer.inx.h:24
-msgid "L-system"
-msgstr ""
-
-#: ../share/extensions/lindenmayer.inx.h:25
-msgid "Left angle"
-msgstr ""
-
-#: ../share/extensions/lindenmayer.inx.h:28
-#, no-c-format
-msgid "Randomize angle (%)"
-msgstr ""
-
-#: ../share/extensions/lindenmayer.inx.h:30
-#, no-c-format
-msgid "Randomize step (%)"
-msgstr ""
-
-#: ../share/extensions/lindenmayer.inx.h:32
-msgid "Right angle"
-msgstr ""
-
-#: ../share/extensions/lindenmayer.inx.h:33
-msgid "Rules"
-msgstr ""
-
-#: ../share/extensions/lindenmayer.inx.h:34
-msgid "Step length (px)"
-msgstr ""
-
-#: ../share/extensions/lorem_ipsum.inx.h:1
-msgid "Lorem ipsum"
-msgstr ""
-
-#: ../share/extensions/lorem_ipsum.inx.h:2
-msgid "Number of paragraphs"
-msgstr ""
-
-#: ../share/extensions/lorem_ipsum.inx.h:3
-msgid "Paragraph length fluctuation (sentences)"
-msgstr ""
-
-#: ../share/extensions/lorem_ipsum.inx.h:4
-msgid "Sentences per paragraph"
-msgstr ""
-
-#: ../share/extensions/lorem_ipsum.inx.h:6
-msgid ""
-"This effect creates the standard \"Lorem Ipsum\" pseudolatin placeholder "
-"text. If a flowed text is selected, Lorem Ipsum is added to it; otherwise a "
-"new flowed text object, the size of the page, is created in a new layer."
-msgstr ""
-
-#: ../share/extensions/markers_strokepaint.inx.h:1
-msgid "Color Markers to Match Stroke"
-msgstr ""
-
-#: ../share/extensions/measure.inx.h:1
-msgid "Font size [px]"
-msgstr ""
-
-#. <param name="unit" type="string" _gui-text="Unit {km|m|cm|mm|in|px|pt}">mm</param>
-#: ../share/extensions/measure.inx.h:4
-msgid "Length Unit: "
-msgstr ""
-
-#: ../share/extensions/measure.inx.h:5
-msgid "Measure"
-msgstr ""
-
-#: ../share/extensions/measure.inx.h:6
-msgid "Measure Path"
-msgstr ""
-
-#: ../share/extensions/measure.inx.h:7
-msgid "Offset [px]"
-msgstr ""
-
-#: ../share/extensions/measure.inx.h:8
-msgid "Precision"
-msgstr ""
-
-#: ../share/extensions/measure.inx.h:9
-msgid "Scale Factor (Drawing:Real Length) = 1:"
-msgstr ""
-
-#: ../share/extensions/measure.inx.h:10
-msgid ""
-"This effect measures the length of the selected path and adds it as a text-"
-"on-path object with the selected unit. The number of significant digits can "
-"be controlled by the Precision field. The Offset field controls the distance "
-"from the text to the path. The Scale factor can be used to make measurements "
-"in scaled drawings. For example, if 1 cm in the drawing equals 2.5 m in the "
-"real world, Scale must be set to 250."
-msgstr ""
-
-#: ../share/extensions/motion.inx.h:1 ../share/extensions/restack.inx.h:1
-msgid "Angle"
-msgstr ""
-
-#: ../share/extensions/motion.inx.h:3
-msgid "Magnitude"
-msgstr ""
-
-#: ../share/extensions/motion.inx.h:4
-msgid "Motion"
-msgstr ""
-
-#: ../share/extensions/outline2svg.inx.h:1
-msgid "ASCII Text with outline markup"
-msgstr ""
-
-#: ../share/extensions/outline2svg.inx.h:2
-msgid "Text Outline File (*.outline)"
-msgstr ""
-
-#: ../share/extensions/outline2svg.inx.h:3
-msgid "Text Outline Input"
-msgstr ""
-
-#: ../share/extensions/param_curves.inx.h:2
-msgid "End t-value"
-msgstr ""
-
-#: ../share/extensions/param_curves.inx.h:4
-msgid "Isotropic scaling (uses smallest: width/xrange or height/yrange)"
-msgstr ""
-
-#: ../share/extensions/param_curves.inx.h:5
-msgid "Multiply t-range by 2*pi"
-msgstr ""
-
-#: ../share/extensions/param_curves.inx.h:6
-msgid "Parametric Curves"
-msgstr ""
-
-#: ../share/extensions/param_curves.inx.h:7
-msgid "Range and Sampling"
-msgstr ""
-
-#: ../share/extensions/param_curves.inx.h:10
-msgid "Samples"
-msgstr ""
-
-#: ../share/extensions/param_curves.inx.h:11
-msgid ""
-"Select a rectangle before calling the extension,\n"
-"it will determine X and Y scales.\n"
-"\n"
-"First derivatives are always determined numerically."
-msgstr ""
-
-#: ../share/extensions/param_curves.inx.h:24
-msgid "Start t-value"
-msgstr ""
-
-#: ../share/extensions/param_curves.inx.h:26
-msgid "x-Function"
-msgstr ""
-
-#: ../share/extensions/param_curves.inx.h:27
-msgid "x-value of rectangle's left"
-msgstr ""
-
-#: ../share/extensions/param_curves.inx.h:28
-msgid "x-value of rectangle's right"
-msgstr ""
-
-#: ../share/extensions/param_curves.inx.h:29
-msgid "y-Function"
-msgstr ""
-
-#: ../share/extensions/param_curves.inx.h:30
-msgid "y-value of rectangle's bottom"
-msgstr ""
-
-#: ../share/extensions/param_curves.inx.h:31
-msgid "y-value of rectangle's top"
-msgstr ""
-
-#: ../share/extensions/pathalongpath.inx.h:1
-msgid "Copies of the pattern:"
-msgstr ""
-
-#: ../share/extensions/pathalongpath.inx.h:2
-msgid "Deformation type:"
-msgstr ""
-
-#: ../share/extensions/pathalongpath.inx.h:3
-#: ../share/extensions/pathscatter.inx.h:3
-msgid "Duplicate the pattern before deformation"
-msgstr ""
-
-#: ../share/extensions/pathalongpath.inx.h:6
-msgid "Pattern along Path"
-msgstr ""
-
-#: ../share/extensions/pathalongpath.inx.h:10
-msgid "Ribbon"
-msgstr ""
-
-#: ../share/extensions/pathalongpath.inx.h:13
-msgid "Snake"
-msgstr ""
-
-#: ../share/extensions/pathalongpath.inx.h:14
-#: ../share/extensions/pathscatter.inx.h:11
-msgid "Space between copies:"
-msgstr ""
-
-#: ../share/extensions/pathalongpath.inx.h:16
-msgid ""
-"This effect bends a pattern object along arbitrary \"skeleton\" paths. The "
-"pattern is the topmost object in the selection. (groups of paths/shapes/"
-"clones... allowed)"
-msgstr ""
-
-#: ../share/extensions/pathscatter.inx.h:1
-msgid "Cloned"
-msgstr ""
-
-#: ../share/extensions/pathscatter.inx.h:2
-msgid "Copied"
-msgstr ""
-
-#: ../share/extensions/pathscatter.inx.h:4
-msgid "Follow path orientation"
-msgstr ""
-
-#: ../share/extensions/pathscatter.inx.h:6
-msgid "Moved"
-msgstr ""
-
-#: ../share/extensions/pathscatter.inx.h:8
-msgid "Original pattern will be:"
-msgstr ""
-
-#: ../share/extensions/pathscatter.inx.h:12
-msgid "Stretch spaces to fit skeleton length"
-msgstr ""
-
-#: ../share/extensions/pathscatter.inx.h:14
-msgid ""
-"This effect scatters a pattern along arbitrary \"skeleton\" paths. The "
-"pattern must be the topmost object in the selection. Groups of paths, "
-"shapes, clones are allowed."
-msgstr ""
-
-#: ../share/extensions/perfectboundcover.inx.h:1
-msgid "Bleed (in)"
-msgstr ""
-
-#: ../share/extensions/perfectboundcover.inx.h:2
-msgid "Bond Weight #"
-msgstr ""
-
-#: ../share/extensions/perfectboundcover.inx.h:3
-msgid "Book Height (inches)"
-msgstr ""
-
-#: ../share/extensions/perfectboundcover.inx.h:4
-msgid "Book Properties"
-msgstr ""
-
-#: ../share/extensions/perfectboundcover.inx.h:5
-msgid "Book Width (inches)"
-msgstr ""
-
-#: ../share/extensions/perfectboundcover.inx.h:6
-msgid "Caliper (inches)"
-msgstr ""
-
-#: ../share/extensions/perfectboundcover.inx.h:7
-msgid "Cover"
-msgstr ""
-
-#: ../share/extensions/perfectboundcover.inx.h:8
-msgid "Cover Thickness Measurement"
-msgstr ""
-
-#: ../share/extensions/perfectboundcover.inx.h:9
-msgid "Interior Pages"
-msgstr ""
-
-#: ../share/extensions/perfectboundcover.inx.h:10
-msgid "Note: Bond Weight # calculations are a best-guess estimate."
-msgstr ""
-
-#: ../share/extensions/perfectboundcover.inx.h:11
-msgid "Number of Pages"
-msgstr ""
-
-#: ../share/extensions/perfectboundcover.inx.h:12
-msgid "Pages Per Inch (PPI)"
-msgstr ""
-
-#: ../share/extensions/perfectboundcover.inx.h:13
-msgid "Paper Thickness Measurement"
-msgstr ""
-
-#: ../share/extensions/perfectboundcover.inx.h:14
-msgid "Perfect-Bound Cover Template"
-msgstr ""
-
-#: ../share/extensions/perfectboundcover.inx.h:16
-msgid "Remove existing guides"
-msgstr ""
-
-#: ../share/extensions/perfectboundcover.inx.h:18
-msgid "Specify Width"
-msgstr ""
-
-#: ../share/extensions/perspective.inx.h:2
-msgid "Perspective"
-msgstr ""
-
-#: ../share/extensions/plt_input.inx.h:1
-msgid "AutoCAD Plot Input"
-msgstr ""
-
-#: ../share/extensions/plt_input.inx.h:2
-#: ../share/extensions/plt_output.inx.h:2
-msgid "HP Graphics Language Plot file [AutoCAD] (*.plt)"
-msgstr ""
-
-#: ../share/extensions/plt_input.inx.h:3
-msgid "Open HPGL plotter files"
-msgstr ""
-
-#: ../share/extensions/plt_output.inx.h:1
-msgid "AutoCAD Plot Output"
-msgstr ""
-
-#: ../share/extensions/plt_output.inx.h:3
-msgid "Save a file for plotters"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:1
-msgid "3D Polyhedron"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:2
-msgid "Clockwise wound object"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:3
-msgid "Cube"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:4
-msgid "Cuboctahedron"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:5
-msgid "Dodecahedron"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:6
-msgid "Draw back-facing polygons"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:7
-msgid "Edge-Specified"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:8
-msgid "Edges"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:9
-msgid "Face-Specified"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:10
-msgid "Faces"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:11
-msgid "Filename:"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:12
-msgid "Fill color, Blue"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:13
-msgid "Fill color, Green"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:14
-msgid "Fill color, Red"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:16
-#, no-c-format
-msgid "Fill opacity, %"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:17
-msgid "Great Dodecahedron"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:18
-msgid "Great Stellated Dodecahedron"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:19
-msgid "Icosahedron"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:20
-msgid "Light X"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:21
-msgid "Light Y"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:22
-msgid "Light Z"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:23
-msgid "Load from file"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:24
-msgid "Maximum"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:25
-msgid "Mean"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:26
-msgid "Minimum"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:27
-msgid "Model file"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:28
-msgid "Object Type"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:29
-msgid "Object:"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:30
-msgid "Octahedron"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:32
-msgid "Rotate around:"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:33
-msgid "Rotation, degrees"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:34
-msgid "Scaling factor"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:35
-msgid "Shading"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:37
-msgid "Small Triambic Icosahedron"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:38
-msgid "Snub Cube"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:39
-msgid "Snub Dodecahedron"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:41
-#, no-c-format
-msgid "Stroke opacity, %"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:42
-msgid "Stroke width, px"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:44
-msgid "Tetrahedron"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:45
-msgid "Then rotate around:"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:46
-msgid "Truncated Cube"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:47
-msgid "Truncated Dodecahedron"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:48
-msgid "Truncated Icosahedron"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:49
-msgid "Truncated Octahedron"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:50
-msgid "Truncated Tetrahedron"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:51
-msgid "Vertices"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:52
-msgid "View"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:53
-msgid "X-Axis"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:54
-msgid "Y-Axis"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:55
-msgid "Z-Axis"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:56
-msgid "Z-sort faces by:"
-msgstr ""
-
-#: ../share/extensions/printing-marks.inx.h:1
-msgid "Bleed Margin"
-msgstr ""
-
-#: ../share/extensions/printing-marks.inx.h:2
-msgid "Bleed Marks"
-msgstr ""
-
-#: ../share/extensions/printing-marks.inx.h:3
-msgid "Bottom:"
-msgstr ""
-
-#: ../share/extensions/printing-marks.inx.h:4
-msgid "Canvas"
-msgstr ""
-
-#: ../share/extensions/printing-marks.inx.h:5
-msgid "Color Bars"
-msgstr ""
-
-#: ../share/extensions/printing-marks.inx.h:6
-msgid "Crop Marks"
-msgstr ""
-
-#: ../share/extensions/printing-marks.inx.h:7
-msgid "Left:"
-msgstr ""
-
-#: ../share/extensions/printing-marks.inx.h:8
-msgid "Marks"
-msgstr ""
-
-#: ../share/extensions/printing-marks.inx.h:10
-msgid "Page Information"
-msgstr ""
-
-#: ../share/extensions/printing-marks.inx.h:11
-msgid "Positioning"
-msgstr ""
-
-#: ../share/extensions/printing-marks.inx.h:12
-msgid "Printing Marks"
-msgstr ""
-
-#: ../share/extensions/printing-marks.inx.h:13
-msgid "Registration Marks"
-msgstr ""
-
-#: ../share/extensions/printing-marks.inx.h:15
-msgid "Right:"
-msgstr ""
-
-#: ../share/extensions/printing-marks.inx.h:16
-msgid "Set crop marks to"
-msgstr ""
-
-#: ../share/extensions/printing-marks.inx.h:17
-msgid "Star Target"
-msgstr ""
-
-#: ../share/extensions/printing-marks.inx.h:18
-msgid "Top:"
-msgstr ""
-
-#: ../share/extensions/ps_input.inx.h:3
-msgid "PostScript Input"
-msgstr ""
-
-#: ../share/extensions/radiusrand.inx.h:1
-msgid "Jitter nodes"
-msgstr ""
-
-#: ../share/extensions/radiusrand.inx.h:2
-msgid "Maximum displacement in X, px"
-msgstr ""
-
-#: ../share/extensions/radiusrand.inx.h:3
-msgid "Maximum displacement in Y, px"
-msgstr ""
-
-#: ../share/extensions/radiusrand.inx.h:5
-msgid "Shift node handles"
-msgstr ""
-
-#: ../share/extensions/radiusrand.inx.h:6
-msgid "Shift nodes"
-msgstr ""
-
-#: ../share/extensions/radiusrand.inx.h:7
-msgid ""
-"This effect randomly shifts the nodes (and optionally node handles) of the "
-"selected path."
-msgstr ""
-
-#: ../share/extensions/radiusrand.inx.h:8
-msgid "Use normal distribution"
-msgstr ""
-
-#: ../share/extensions/render_alphabetsoup.inx.h:1
-msgid "Alphabet Soup"
-msgstr ""
-
-#: ../share/extensions/render_alphabetsoup.inx.h:2
-msgid "Random Seed"
-msgstr ""
-
-#: ../share/extensions/render_barcode.inx.h:1
-msgid "Bar Height:"
-msgstr ""
-
-#: ../share/extensions/render_barcode.inx.h:2
-msgid "Barcode"
-msgstr ""
-
-#: ../share/extensions/render_barcode.inx.h:3
-msgid "Barcode Data:"
-msgstr ""
-
-#: ../share/extensions/render_barcode.inx.h:4
-msgid "Barcode Type:"
-msgstr ""
-
-#: ../share/extensions/restack.inx.h:2
-msgid "Arbitrary Angle:"
-msgstr ""
-
-#: ../share/extensions/restack.inx.h:3
-msgid "Arrange"
-msgstr ""
-
-#: ../share/extensions/restack.inx.h:4
-msgid "Bottom"
-msgstr ""
-
-#: ../share/extensions/restack.inx.h:5
-msgid "Bottom to Top (90)"
-msgstr ""
-
-#: ../share/extensions/restack.inx.h:6
-msgid "Horizontal Point:"
-msgstr ""
-
-#: ../share/extensions/restack.inx.h:8
-msgid "Left to Right (0)"
-msgstr ""
-
-#: ../share/extensions/restack.inx.h:9
-msgid "Middle"
-msgstr ""
-
-#: ../share/extensions/restack.inx.h:10
-msgid "Radial Inward"
-msgstr ""
-
-#: ../share/extensions/restack.inx.h:11
-msgid "Radial Outward"
-msgstr ""
-
-#: ../share/extensions/restack.inx.h:12
-msgid "Restack"
-msgstr ""
-
-#: ../share/extensions/restack.inx.h:13
-msgid "Restack Direction:"
-msgstr ""
-
-#: ../share/extensions/restack.inx.h:15
-msgid "Right to Left (180)"
-msgstr ""
-
-#: ../share/extensions/restack.inx.h:16
-msgid "Top"
-msgstr ""
-
-#: ../share/extensions/restack.inx.h:17
-msgid "Top to Bottom (270)"
-msgstr ""
-
-#: ../share/extensions/restack.inx.h:18
-msgid "Vertical Point:"
-msgstr ""
-
-#: ../share/extensions/rtree.inx.h:1
-msgid "Initial size"
-msgstr ""
-
-#: ../share/extensions/rtree.inx.h:2
-msgid "Minimum size"
-msgstr ""
-
-#: ../share/extensions/rtree.inx.h:3
-msgid "Random Tree"
-msgstr ""
-
-#: ../share/extensions/rubberstretch.inx.h:2
-#, no-c-format
-msgid "Curve (%):"
-msgstr ""
-
-#: ../share/extensions/rubberstretch.inx.h:4
-msgid "Rubber Stretch"
-msgstr ""
-
-#: ../share/extensions/rubberstretch.inx.h:6
-#, no-c-format
-msgid "Strength (%):"
-msgstr ""
-
-#: ../share/extensions/scour.inx.h:1
-msgid "Embed rasters"
-msgstr ""
-
-#: ../share/extensions/scour.inx.h:2
-msgid "Enable id stripping"
-msgstr ""
-
-#: ../share/extensions/scour.inx.h:3
-msgid "Group collapsing"
-msgstr ""
-
-#: ../share/extensions/scour.inx.h:5
-msgid "Indent"
-msgstr ""
-
-#: ../share/extensions/scour.inx.h:6
-msgid "Keep editor data"
-msgstr ""
-
-#: ../share/extensions/scour.inx.h:8
-msgid "Optimized SVG (*.svg)"
-msgstr ""
-
-#: ../share/extensions/scour.inx.h:9
-msgid "Optimized SVG Output"
-msgstr ""
-
-#: ../share/extensions/scour.inx.h:11
-msgid "Scalable Vector Graphics"
-msgstr ""
-
-#: ../share/extensions/scour.inx.h:12
-msgid "Set precision"
-msgstr ""
-
-#: ../share/extensions/scour.inx.h:13
-msgid "Simplify colors"
-msgstr ""
-
-#: ../share/extensions/scour.inx.h:14
-msgid "Space"
-msgstr ""
-
-#: ../share/extensions/scour.inx.h:15
-msgid "Strip xml prolog"
-msgstr ""
-
-#: ../share/extensions/scour.inx.h:16
-msgid "Style to xml"
-msgstr ""
-
-#: ../share/extensions/scour.inx.h:17
-msgid "Tab"
-msgstr ""
-
-#: ../share/extensions/scour.inx.h:18
-msgid ""
-"This extension optimize the SVG file according to the following options:\n"
-"    * Simplify colors: convert all colors to #RRGGBB format.\n"
-"    * Style to xml: convert styles into XML attributes.\n"
-"    * Group collapsing: collapse &lt;g&gt; elements.\n"
-"    * Enable id stripping: remove all un-referenced ID attributes.\n"
-"    * Embed rasters: embed rasters as base64-encoded data.\n"
-"    * Keep editor data: don't remove Inkscape, Sodipodi or Adobe Illustrator "
-"elements and attributes.\n"
-"    * Strip xml prolog: don't output the xml prolog.\n"
-"    * Set precision: set number of significant digits (default: 5).\n"
-"    * Indent: indentation of the output: none, space, tab (default: space)."
-msgstr ""
-
-#: ../share/extensions/sk1_input.inx.h:1
-msgid "Open files saved in sK1 vector graphics editor"
-msgstr ""
-
-#: ../share/extensions/sk1_input.inx.h:2
-#: ../share/extensions/sk1_output.inx.h:2
-msgid "sK1 vector graphics files (.sk1)"
-msgstr ""
-
-#: ../share/extensions/sk1_input.inx.h:3
-msgid "sK1 vector graphics files input"
-msgstr ""
-
-#: ../share/extensions/sk1_output.inx.h:1
-msgid "File format for use in sK1 vector graphics editor"
-msgstr ""
-
-#: ../share/extensions/sk1_output.inx.h:3
-msgid "sK1 vector graphics files output"
-msgstr ""
-
-#: ../share/extensions/sk_input.inx.h:1
-msgid "A diagram created with the program Sketch"
-msgstr ""
-
-#: ../share/extensions/sk_input.inx.h:2
-msgid "Sketch Diagram (*.sk)"
-msgstr ""
-
-#: ../share/extensions/sk_input.inx.h:3
-msgid "Sketch Input"
-msgstr ""
-
-#: ../share/extensions/spirograph.inx.h:1
-msgid "Gear Placement"
-msgstr ""
-
-#: ../share/extensions/spirograph.inx.h:2
-msgid "Inside (Hypotrochoid)"
-msgstr ""
-
-#: ../share/extensions/spirograph.inx.h:3
-msgid "Outside (Epitrochoid)"
-msgstr ""
-
-#: ../share/extensions/spirograph.inx.h:4
-msgid "Quality (Default = 16)"
-msgstr ""
-
-#: ../share/extensions/spirograph.inx.h:5
-msgid "R - Ring Radius (px)"
-msgstr ""
-
-#: ../share/extensions/spirograph.inx.h:7
-msgid "Rotation (deg)"
-msgstr ""
-
-#: ../share/extensions/spirograph.inx.h:8
-msgid "Spirograph"
-msgstr ""
-
-#: ../share/extensions/spirograph.inx.h:9
-msgid "d - Pen Radius (px)"
-msgstr ""
-
-#: ../share/extensions/spirograph.inx.h:10
-msgid "r - Gear Radius (px)"
-msgstr ""
-
-#: ../share/extensions/straightseg.inx.h:1
-msgid "Behavior"
-msgstr ""
-
-#: ../share/extensions/straightseg.inx.h:4
-msgid "Straighten Segments"
-msgstr ""
-
-#: ../share/extensions/summersnight.inx.h:1
-msgid "Envelope"
-msgstr ""
-
-#: ../share/extensions/svg2xaml.inx.h:1 ../share/extensions/xaml2svg.inx.h:1
-msgid "Microsoft XAML (*.xaml)"
-msgstr ""
-
-#: ../share/extensions/svg2xaml.inx.h:2 ../share/extensions/xaml2svg.inx.h:2
-msgid "Microsoft's GUI definition format"
-msgstr ""
-
-#: ../share/extensions/svg2xaml.inx.h:3
-msgid "XAML Output"
-msgstr ""
-
-#: ../share/extensions/svg_and_media_zip_output.inx.h:1
-msgid "Compressed Inkscape SVG with media (*.zip)"
-msgstr ""
-
-#: ../share/extensions/svg_and_media_zip_output.inx.h:2
-msgid ""
-"Inkscape's native file format compressed with Zip and including all media "
-"files"
-msgstr ""
-
-#: ../share/extensions/svg_and_media_zip_output.inx.h:3
-msgid "ZIP Output"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:1
-msgid ""
-"(Select your system encoding. More information at http://docs.python.org/"
-"library/codecs.html#standard-encodings)"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:2
-msgid "(The day names list must start from Sunday)"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:3
-msgid "Automatically set size and position"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:4
-msgid "Calendar"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:5
-msgid "Char Encoding"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:7
-msgid "Configuration"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:8
-msgid "Day color"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:9
-msgid "Day names"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:10
-msgid "Fill empty day boxes with next month's days"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:11
-msgid ""
-"January February March April May June July August September October November "
-"December"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:13
-msgid "Localization"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:14
-msgid "Monday"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:15
-msgid "Month (0 for all)"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:16
-msgid "Month Margin"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:17
-msgid "Month Width"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:18
-msgid "Month color"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:19
-msgid "Month names"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:20
-msgid "Months per line"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:21
-msgid "Next month day color"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:23
-msgid "Saturday"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:24
-msgid "Saturday and Sunday"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:25
-msgid "Sun Mon Tue Wed Thu Fri Sat"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:26
-msgid "Sunday"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:27
-msgid "The options below have no influence when the above is checked."
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:28
-msgid "Week start day"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:29
-msgid "Weekday name color "
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:30
-msgid "Weekend"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:31
-msgid "Weekend day color"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:32
-msgid "Year (0 for current)"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:33
-msgid "Year color"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:34
-msgid "You may change the names for other languages:"
-msgstr ""
-
-#: ../share/extensions/text_braille.inx.h:1
-msgid "Convert to Braille"
-msgstr ""
-
-#: ../share/extensions/text_flipcase.inx.h:2
-msgid "fLIP cASE"
-msgstr ""
-
-#: ../share/extensions/text_lowercase.inx.h:2
-msgid "lowercase"
-msgstr ""
-
-#: ../share/extensions/text_randomcase.inx.h:2
-msgid "rANdOm CasE"
-msgstr ""
-
-#: ../share/extensions/text_replace.inx.h:1
-msgid "By:"
-msgstr ""
-
-#: ../share/extensions/text_replace.inx.h:2
-msgid "Replace text"
-msgstr ""
-
-#: ../share/extensions/text_replace.inx.h:3
-msgid "Replace:"
-msgstr ""
-
-#: ../share/extensions/text_sentencecase.inx.h:1
-msgid "Sentence case"
-msgstr ""
-
-#: ../share/extensions/text_titlecase.inx.h:2
-msgid "Title Case"
-msgstr ""
-
-#: ../share/extensions/text_uppercase.inx.h:2
-msgid "UPPERCASE"
-msgstr ""
-
-#: ../share/extensions/triangle.inx.h:1
-msgid "Angle a / deg"
-msgstr ""
-
-#: ../share/extensions/triangle.inx.h:2
-msgid "Angle b / deg"
-msgstr ""
-
-#: ../share/extensions/triangle.inx.h:3
-msgid "Angle c / deg"
-msgstr ""
-
-#: ../share/extensions/triangle.inx.h:4
-msgid "From Side a and Angles a, b"
-msgstr ""
-
-#: ../share/extensions/triangle.inx.h:5
-msgid "From Side c and Angles a, b"
-msgstr ""
-
-#: ../share/extensions/triangle.inx.h:6
-msgid "From Sides a, b and Angle a"
-msgstr ""
-
-#: ../share/extensions/triangle.inx.h:7
-msgid "From Sides a, b and Angle c"
-msgstr ""
-
-#: ../share/extensions/triangle.inx.h:8
-msgid "From Three Sides"
-msgstr ""
-
-#: ../share/extensions/triangle.inx.h:11
-msgid "Side Length a / px"
-msgstr ""
-
-#: ../share/extensions/triangle.inx.h:12
-msgid "Side Length b / px"
-msgstr ""
-
-#: ../share/extensions/triangle.inx.h:13
-msgid "Side Length c / px"
-msgstr ""
-
-#: ../share/extensions/triangle.inx.h:14
-msgid "Triangle"
-msgstr ""
-
-#: ../share/extensions/txt2svg.inx.h:1
-msgid "ASCII Text"
-msgstr ""
-
-#: ../share/extensions/txt2svg.inx.h:2
-msgid "Text File (*.txt)"
-msgstr ""
-
-#: ../share/extensions/txt2svg.inx.h:3
-msgid "Text Input"
-msgstr ""
-
-#: ../share/extensions/web-set-att.inx.h:1
-msgid "All selected ones set an attribute in the last one"
-msgstr ""
-
-#: ../share/extensions/web-set-att.inx.h:2
-msgid "Attribute to set"
-msgstr ""
-
-#: ../share/extensions/web-set-att.inx.h:3
-#: ../share/extensions/web-transmit-att.inx.h:3
-msgid "Compatibility with previews code to this event"
-msgstr ""
-
-#: ../share/extensions/web-set-att.inx.h:4
-msgid ""
-"If you want to set more than one attribute, you must separate this with a "
-"space, and only with a space."
-msgstr ""
-
-#: ../share/extensions/web-set-att.inx.h:6
-#: ../share/extensions/web-transmit-att.inx.h:6
-msgid "Run it after"
-msgstr ""
-
-#: ../share/extensions/web-set-att.inx.h:7
-#: ../share/extensions/web-transmit-att.inx.h:7
-msgid "Run it before"
-msgstr ""
-
-#: ../share/extensions/web-set-att.inx.h:8
-msgid "Set Attributes"
-msgstr ""
-
-#: ../share/extensions/web-set-att.inx.h:9
-msgid "Source and destination of setting"
-msgstr ""
-
-#: ../share/extensions/web-set-att.inx.h:10
-msgid "The first selected sets an attribute in all others"
-msgstr ""
-
-#: ../share/extensions/web-set-att.inx.h:11
-msgid "The list of values must have the same size as the attributes list."
-msgstr ""
-
-#: ../share/extensions/web-set-att.inx.h:12
-#: ../share/extensions/web-transmit-att.inx.h:10
-msgid "The next parameter is useful when you select more than two elements"
-msgstr ""
-
-#: ../share/extensions/web-set-att.inx.h:13
-#: ../share/extensions/web-transmit-att.inx.h:11
-msgid ""
-"This effect adds a feature visible (or usable) only on a SVG enabled web "
-"browser (like Firefox)."
-msgstr ""
-
-#: ../share/extensions/web-set-att.inx.h:14
-msgid ""
-"This effect sets one or more attributes in the second selected element, when "
-"a defined event occurs on the first selected element."
-msgstr ""
-
-#: ../share/extensions/web-set-att.inx.h:15
-msgid "Value to set"
-msgstr ""
-
-#: ../share/extensions/web-set-att.inx.h:16
-#: ../share/extensions/web-transmit-att.inx.h:14
-msgid "Web"
-msgstr ""
-
-#: ../share/extensions/web-set-att.inx.h:17
-msgid "When should the set be done?"
-msgstr ""
-
-#: ../share/extensions/web-set-att.inx.h:18
-#: ../share/extensions/web-transmit-att.inx.h:16
-msgid "on activate"
-msgstr ""
-
-#: ../share/extensions/web-set-att.inx.h:19
-#: ../share/extensions/web-transmit-att.inx.h:17
-msgid "on blur"
-msgstr ""
-
-#: ../share/extensions/web-set-att.inx.h:20
-#: ../share/extensions/web-transmit-att.inx.h:18
-msgid "on click"
-msgstr ""
-
-#: ../share/extensions/web-set-att.inx.h:21
-#: ../share/extensions/web-transmit-att.inx.h:19
-msgid "on element loaded"
-msgstr ""
-
-#: ../share/extensions/web-set-att.inx.h:22
-#: ../share/extensions/web-transmit-att.inx.h:20
-msgid "on focus"
-msgstr ""
-
-#: ../share/extensions/web-set-att.inx.h:23
-#: ../share/extensions/web-transmit-att.inx.h:21
-msgid "on mouse down"
-msgstr ""
-
-#: ../share/extensions/web-set-att.inx.h:24
-#: ../share/extensions/web-transmit-att.inx.h:22
-msgid "on mouse move"
-msgstr ""
-
-#: ../share/extensions/web-set-att.inx.h:25
-#: ../share/extensions/web-transmit-att.inx.h:23
-msgid "on mouse out"
-msgstr ""
-
-#: ../share/extensions/web-set-att.inx.h:26
-#: ../share/extensions/web-transmit-att.inx.h:24
-msgid "on mouse over"
-msgstr ""
-
-#: ../share/extensions/web-set-att.inx.h:27
-#: ../share/extensions/web-transmit-att.inx.h:25
-msgid "on mouse up"
-msgstr ""
-
-#: ../share/extensions/web-transmit-att.inx.h:1
-msgid "All selected ones transmit to the last one"
-msgstr ""
-
-#: ../share/extensions/web-transmit-att.inx.h:2
-msgid "Attribute to transmit"
-msgstr ""
-
-#: ../share/extensions/web-transmit-att.inx.h:4
-msgid ""
-"If you want to transmit more than one attribute, you should separate this "
-"with a space, and only with a space."
-msgstr ""
-
-#: ../share/extensions/web-transmit-att.inx.h:8
-msgid "Source and destination of transmitting"
-msgstr ""
-
-#: ../share/extensions/web-transmit-att.inx.h:9
-msgid "The first selected transmits to all others"
-msgstr ""
-
-#: ../share/extensions/web-transmit-att.inx.h:12
-msgid ""
-"This effect transmits one or more attributes from the first selected element "
-"to the second when an event occurs."
-msgstr ""
-
-#: ../share/extensions/web-transmit-att.inx.h:13
-msgid "Transmit Attributes"
-msgstr ""
-
-#: ../share/extensions/web-transmit-att.inx.h:15
-msgid "When to transmit"
-msgstr ""
-
-#: ../share/extensions/whirl.inx.h:1
-msgid "Amount of whirl"
-msgstr ""
-
-#: ../share/extensions/whirl.inx.h:3
-msgid "Rotation is clockwise"
-msgstr ""
-
-#: ../share/extensions/whirl.inx.h:4
-msgid "Whirl"
-msgstr ""
-
-#: ../share/extensions/wmf_input.inx.h:1
-#: ../share/extensions/wmf_output.inx.h:1
-msgid "A popular graphics file format for clipart"
-msgstr ""
-
-#: ../share/extensions/wmf_input.inx.h:2
-#: ../share/extensions/wmf_output.inx.h:2
-msgid "Windows Metafile (*.wmf)"
-msgstr ""
-
-#: ../share/extensions/wmf_input.inx.h:3
-#: ../share/extensions/wmf_output.inx.h:3
-msgid "Windows Metafile Input"
-msgstr ""
-
-#: ../share/extensions/xaml2svg.inx.h:3
-msgid "XAML Input"
-msgstr ""
index baa74483a77de2382d8a4091073c7c5f7b760ef4..e8f690ecb7a0cfe15ce2d6d93969d1c5770fb4f8 100644 (file)
@@ -8,7 +8,7 @@
    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"
-   inkscape:version="0.47+devel"
+   inkscape:version="0.47pre4 r22446"
    sodipodi:docname="icons.svg"
    height="540"
    width="1250"
    version="1.0">
   <defs
      id="defs3">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 270 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1250 : 270 : 1"
+       inkscape:persp3d-origin="625 : 180 : 1"
+       id="perspective2930" />
     <linearGradient
        inkscape:collect="always"
        id="linearGradient7836">
          style="stop-color:#000000;stop-opacity:1"
          offset="1" />
     </linearGradient>
+    <inkscape:perspective
+       id="perspective5649"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient10585-7"
+       id="linearGradient5209"
+       gradientUnits="userSpaceOnUse"
+       x1="5.6449146"
+       y1="209.98189"
+       x2="13.522233"
+       y2="214.77893" />
+    <linearGradient
+       id="linearGradient10585-7">
+      <stop
+         style="stop-color:#d7d7d7;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop10587-0" />
+      <stop
+         style="stop-color:#000000;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop10595-2" />
+    </linearGradient>
+    <linearGradient
+       xlink:href="#linearGradient10585-7"
+       y2="214.77893"
+       x2="13.522233"
+       y1="209.98189"
+       x1="5.6449146"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient8278-4"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient5658-5">
+      <stop
+         style="stop-color:#d7d7d7;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop5660" />
+      <stop
+         style="stop-color:#000000;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop5662" />
+    </linearGradient>
+    <linearGradient
+       xlink:href="#linearGradient10585-7"
+       y2="214.77893"
+       x2="13.522233"
+       y1="209.98189"
+       x1="5.6449146"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient8276-2"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient5665">
+      <stop
+         style="stop-color:#d7d7d7;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop5667-5" />
+      <stop
+         style="stop-color:#000000;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop5669" />
+    </linearGradient>
+    <linearGradient
+       xlink:href="#linearGradient10585-7"
+       y2="214.77893"
+       x2="13.522233"
+       y1="209.98189"
+       x1="5.6449146"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient8290-1"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient5672">
+      <stop
+         style="stop-color:#d7d7d7;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop5674" />
+      <stop
+         style="stop-color:#000000;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop5676" />
+    </linearGradient>
+    <linearGradient
+       xlink:href="#linearGradient10585-7"
+       y2="214.77893"
+       x2="13.522233"
+       y1="209.98189"
+       x1="5.6449146"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient8288-3"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient5679-3">
+      <stop
+         style="stop-color:#d7d7d7;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop5681" />
+      <stop
+         style="stop-color:#000000;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop5683" />
+    </linearGradient>
   </defs>
   <sodipodi:namedview
      inkscape:guide-bbox="true"
      inkscape:window-x="0"
      inkscape:window-height="737"
      inkscape:window-width="1024"
-     inkscape:cy="118.75673"
-     inkscape:cx="458.6199"
-     inkscape:zoom="1.9420505"
+     inkscape:cy="142.58814"
+     inkscape:cx="464.32174"
+     inkscape:zoom="1.3732371"
      gridtolerance="6"
      snaptogrid="false"
      showgrid="true"
@@ -13811,92 +13925,6 @@ http://www.inkscape.org/</dc:description>
        id="path4622"
        sodipodi:nodetypes="cccccccc" />
   </g>
-  <g
-     id="connector-ignore"
-     inkscape:label="#g8308">
-    <g
-       id="g5802"
-       style="stroke:url(#linearGradient8290);stroke-opacity:1"
-       transform="matrix(0.625904,0,0,0.672041,489.16821,222.32729)">
-      <rect
-         style="color:#000000;fill:none;stroke:url(#linearGradient8288);stroke-width:1.54186893;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;display:inline"
-         id="rect5792"
-         width="7.9986801"
-         height="2.959625"
-         x="8.5082998"
-         y="211.5502" />
-    </g>
-    <path
-       style="fill:none;stroke:#3c3c3c;stroke-width:1.00000024px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:0.8469945"
-       d="m 494.5,361.4977 6,8"
-       id="path7667"
-       sodipodi:nodetypes="cc" />
-    <g
-       transform="matrix(0.689556,0,0,0.507098,484.56529,256.2643)"
-       id="g5761"
-       style="stroke:#000000;stroke-opacity:1">
-      <rect
-         style="color:#000000;fill:none;stroke:#000000;stroke-width:1.69109905;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;display:inline"
-         id="rect5763"
-         width="4.5088892"
-         height="2.0118859"
-         x="11.50698"
-         y="205.5087" />
-    </g>
-    <use
-       xlink:href="#g5761"
-       height="1250"
-       width="1250"
-       transform="matrix(0.997702,0,0,1.018967,8.1086669,2.1407896)"
-       id="use5785"
-       y="0"
-       x="0" />
-  </g>
-  <g
-     id="connector-avoid"
-     inkscape:label="#g8327">
-    <path
-       style="fill:none;stroke:#3c3c3c;stroke-width:1.00000024px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:0.83060111"
-       d="m 517.5,361.4977 5,3 0,5"
-       id="path12164"
-       sodipodi:nodetypes="ccc" />
-    <g
-       transform="matrix(0.689556,0,0,0.507098,506.56529,256.2643)"
-       id="use5787"
-       style="stroke:#000000;stroke-opacity:1">
-      <rect
-         style="color:#000000;fill:none;stroke:#000000;stroke-width:1.69109905;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;display:inline"
-         id="rect8286"
-         width="4.5088892"
-         height="2.0118859"
-         x="11.50698"
-         y="205.5087" />
-    </g>
-    <g
-       transform="matrix(0.689556,0,0,0.507098,513.514,265.26677)"
-       id="use5790"
-       style="stroke:#000000;stroke-opacity:1">
-      <rect
-         style="color:#000000;fill:none;stroke:#000000;stroke-width:1.69109905;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;display:inline"
-         id="rect8282"
-         width="4.5088892"
-         height="2.0118859"
-         x="11.50698"
-         y="205.5087" />
-    </g>
-    <g
-       id="use5814"
-       style="stroke:url(#linearGradient8278);stroke-opacity:1"
-       transform="matrix(0.625904,0,0,0.672041,509.17462,223.32729)">
-      <rect
-         style="color:#000000;fill:none;stroke:url(#linearGradient8276);stroke-width:1.54186893;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;display:inline"
-         id="rect8274"
-         width="7.9986801"
-         height="2.959625"
-         x="8.5082998"
-         y="211.5502" />
-    </g>
-  </g>
   <use
      xlink:href="#properties_fill"
      height="1250"
@@ -20308,4 +20336,222 @@ http://www.inkscape.org/</dc:description>
        id="path11005-9"
        style="fill:url(#linearGradient7201-4);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient7203-5);stroke-width:1.1095854px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" />
   </g>
+  <g
+     id="connector-ignore"
+     inkscape:label="#g8308"
+     transform="translate(16.916975,1.0009742)">
+    <g
+       id="g5802"
+       style="stroke:url(#linearGradient8290-1);stroke-opacity:1"
+       transform="matrix(0.625904,0,0,0.672041,489.16821,222.32729)">
+      <rect
+         style="fill:none;stroke:url(#linearGradient8288-3);stroke-width:1.54186893;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;display:inline"
+         id="rect5792"
+         width="7.9986801"
+         height="2.959625"
+         x="8.5082998"
+         y="211.5502" />
+    </g>
+    <path
+       style="fill:none;stroke:#3c3c3c;stroke-width:1.00000024px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:0.8469945"
+       d="m 494.5,361.4977 6,8"
+       id="path7667"
+       sodipodi:nodetypes="cc" />
+    <g
+       transform="matrix(0.689556,0,0,0.507098,484.56529,256.2643)"
+       id="g5761"
+       style="stroke:#000000;stroke-opacity:1">
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:1.69109905;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;display:inline"
+         id="rect5763"
+         width="4.5088892"
+         height="2.0118859"
+         x="11.50698"
+         y="205.5087" />
+    </g>
+    <use
+       xlink:href="#g5761"
+       height="1250"
+       width="1250"
+       transform="matrix(0.997702,0,0,1.018967,8.1086669,2.1407896)"
+       id="use5785"
+       y="0"
+       x="0" />
+  </g>
+  <g
+     id="connector-avoid"
+     inkscape:label="#g8327"
+     transform="translate(16.916975,1.0009742)">
+    <path
+       style="fill:none;stroke:#3c3c3c;stroke-width:1.00000024px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:0.83060111"
+       d="m 517.5,361.4977 5,3 0,5"
+       id="path12164"
+       sodipodi:nodetypes="ccc" />
+    <g
+       transform="matrix(0.689556,0,0,0.507098,506.56529,256.2643)"
+       id="use5787"
+       style="stroke:#000000;stroke-opacity:1">
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:1.69109905;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;display:inline"
+         id="rect8286"
+         width="4.5088892"
+         height="2.0118859"
+         x="11.50698"
+         y="205.5087" />
+    </g>
+    <g
+       transform="matrix(0.689556,0,0,0.507098,513.514,265.26677)"
+       id="use5790"
+       style="stroke:#000000;stroke-opacity:1">
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:1.69109905;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;display:inline"
+         id="rect8282"
+         width="4.5088892"
+         height="2.0118859"
+         x="11.50698"
+         y="205.5087" />
+    </g>
+    <g
+       id="use5814"
+       style="stroke:url(#linearGradient8278-4);stroke-opacity:1"
+       transform="matrix(0.625904,0,0,0.672041,509.17462,223.32729)">
+      <rect
+         style="fill:none;stroke:url(#linearGradient8276-2);stroke-width:1.54186893;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;display:inline"
+         id="rect8274"
+         width="7.9986801"
+         height="2.959625"
+         x="8.5082998"
+         y="211.5502" />
+    </g>
+  </g>
+  <g
+     id="connector-orthogonal"
+     inkscape:label="#g8327"
+     transform="matrix(-1,0,0,1,1072.9748,1.0009342)">
+    <path
+       style="fill:none;stroke:#3c3c3c;stroke-width:1.00000024px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:0.83060111"
+       d="m 517.5,360.9977 2,0.002 0,9.00234 3,-0.002"
+       id="path5193"
+       sodipodi:nodetypes="cccc" />
+    <g
+       transform="matrix(0.689556,0,0,0.507098,506.56529,256.2643)"
+       id="g5195"
+       style="stroke:#000000;stroke-opacity:1">
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:1.69109905;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;display:inline"
+         id="rect5197"
+         width="4.5088892"
+         height="2.0118859"
+         x="11.50698"
+         y="205.5087" />
+    </g>
+    <g
+       transform="matrix(0.689556,0,0,0.507098,513.514,265.26677)"
+       id="g5199"
+       style="stroke:#000000;stroke-opacity:1">
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:1.69109905;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;display:inline"
+         id="rect5201"
+         width="4.5088892"
+         height="2.0118859"
+         x="11.50698"
+         y="205.5087" />
+    </g>
+    <g
+       id="g5203"
+       style="stroke:url(#linearGradient5209);stroke-opacity:1"
+       transform="matrix(0.625904,0,0,0.672041,509.17462,223.32729)" />
+  </g>
+  <g
+     id="connector-edit"
+     transform="matrix(0.5008045,0,0,0.5008045,547.98616,270.83347)"
+     inkscape:label="#draw_node">
+    <rect
+       y="180"
+       x="-110"
+       height="24"
+       width="24"
+       id="rect5213"
+       style="fill:none;stroke:none;stroke-width:1;marker:none;display:inline" />
+    <rect
+       style="fill:#ff0000;fill-opacity:0.39215692;fill-rule:evenodd;stroke:#ff0000;stroke-width:1.99678624;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:0;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;display:inline"
+       id="rect5217"
+       width="6.1177049"
+       height="5.9961362"
+       x="-108.26915"
+       y="181.73476" />
+    <path
+       sodipodi:nodetypes="cccc"
+       id="path5221"
+       d="m -104.98202,185.05712 10.198948,18.1231 6.79927,-6.79616 -16.998218,-11.32694 z"
+       style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.99839354;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+  </g>
+  <g
+     transform="translate(-11.083035,0.97828419)"
+     id="connector-new-connpoint"
+     inkscape:label="#g6061">
+    <path
+       sodipodi:end="4.7170453"
+       sodipodi:start="3.1455643"
+       d="m 578.00008,371.96028 c 0.0219,-5.5228 4.51683,-9.98214 10.03964,-9.9602 0.002,10e-6 0.005,2e-5 0.007,3e-5 L 588,372 z"
+       sodipodi:ry="10"
+       sodipodi:rx="10"
+       sodipodi:cy="372"
+       sodipodi:cx="588"
+       id="path6018"
+       style="fill:#b0c5da;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:1.5;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       sodipodi:type="arc" />
+    <rect
+       y="360.98068"
+       x="577"
+       height="12.019308"
+       width="12.019308"
+       id="rect5199"
+       style="fill:none;stroke:none;stroke-width:1;marker:none;display:inline" />
+    <rect
+       style="fill:#ff7777;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:0.99999952;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:0;stroke-opacity:0.94117647;stroke-dasharray:none;stroke-dashoffset:0;marker:none;display:inline"
+       id="rect5202"
+       width="3"
+       height="3"
+       x="580"
+       y="363" />
+  </g>
+  <g
+     transform="translate(-11.083035,0.97828419)"
+     id="connector-remove-connpoint"
+     inkscape:label="#g6098">
+    <rect
+       style="fill:none;stroke:none;stroke-width:1;marker:none;display:inline"
+       id="rect6086"
+       width="12.019308"
+       height="12.019308"
+       x="591.5"
+       y="361" />
+    <g
+       transform="matrix(0.5555556,0,0,0.5555556,57.499957,271.55555)"
+       id="g6088">
+      <path
+         id="path6090"
+         d="m 972,171 1,-1 7,0 1,1 0,7 -1,1 -7,0 -1,-1 0,-7 z"
+         style="fill:#aa0000;fill-opacity:1;fill-rule:evenodd;stroke:#aa0000;stroke-width:1.79999971px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         sodipodi:nodetypes="ccccccccc" />
+      <path
+         style="fill:none;stroke:#ffffff;stroke-width:2.15999985;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         d="m 974,171.85 5,5"
+         id="path6092"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#ffffff;stroke-width:2.15999985;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         d="m 979,171.85 -5,5"
+         id="path6094"
+         sodipodi:nodetypes="cc" />
+    </g>
+    <rect
+       y="363"
+       x="593"
+       height="3"
+       width="3"
+       id="rect6096"
+       style="fill:#ff7777;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:0.99999952;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:0;stroke-opacity:0.94117647;stroke-dasharray:none;stroke-dashoffset:0;marker:none;display:inline" />
+  </g>
 </svg>
index 1885f56e51d89552f707ea120b687bff432f4383..46c2586d120753936a988cd310213e1e8cb48746 100644 (file)
@@ -86,6 +86,7 @@ composite-undo-stack-observer.cpp
 common-context.cpp\r
 conditions.cpp\r
 conn-avoid-ref.cpp\r
+connection-points.cpp\r
 connector-context.cpp\r
 console-output-undo-observer.cpp\r
 context-fns.cpp\r
index 18beaec37c46d9844c60e841e3c5bfbdaa1f4a60..da49187bacb5dd840bb07828e54ada293a3e9c6c 100644 (file)
@@ -20,6 +20,7 @@ ink_common_sources += \
        composite-undo-stack-observer.cpp                               \
        composite-undo-stack-observer.h                                 \
        conditions.cpp conditions.h                                     \
+       connection-points.cpp connection-points.h                       \
        conn-avoid-ref.cpp conn-avoid-ref.h                             \
        connection-pool.h                                               \
        connector-context.cpp connector-context.h                       \
index 69b11fae9cf06afcc018b88f4e3f3024b0435dea..d03c3be3e5b785990cab7a57b52acb041e1086c6 100644 (file)
@@ -37,6 +37,7 @@ static SPStyleProp const props[] = {
     {SP_ATTR_SODIPODI_INSENSITIVE, "sodipodi:insensitive"},
     {SP_ATTR_SODIPODI_NONPRINTABLE, "sodipodi:nonprintable"},
     {SP_ATTR_CONNECTOR_AVOID, "inkscape:connector-avoid"},
+    {SP_ATTR_CONNECTION_POINTS, "inkscape:connection-points"},
     {SP_ATTR_STYLE, "style"},
     {SP_ATTR_TRANSFORM_CENTER_X, "inkscape:transform-center-x"},
     {SP_ATTR_TRANSFORM_CENTER_Y, "inkscape:transform-center-y"},
@@ -124,6 +125,7 @@ static SPStyleProp const props[] = {
     {SP_ATTR_CONNECTOR_TYPE, "inkscape:connector-type"},
     {SP_ATTR_CONNECTION_START, "inkscape:connection-start"},
     {SP_ATTR_CONNECTION_END, "inkscape:connection-end"},
+    {SP_ATTR_CONNECTOR_CURVATURE, "inkscape:connector-curvature"},
     /* SPRect */
     {SP_ATTR_RX, "rx"},
     {SP_ATTR_RY, "ry"},
index 52f71b203a298bc7d0ac03f7ac537cb3bca7597c..af60b75be4d5782dff445cf7b4722cf6dfd77f1e 100644 (file)
@@ -36,6 +36,7 @@ enum SPAttributeEnum {
     SP_ATTR_SODIPODI_INSENSITIVE,
     SP_ATTR_SODIPODI_NONPRINTABLE,
     SP_ATTR_CONNECTOR_AVOID,
+    SP_ATTR_CONNECTION_POINTS,
     SP_ATTR_STYLE,
     SP_ATTR_TRANSFORM_CENTER_X,
     SP_ATTR_TRANSFORM_CENTER_Y,
@@ -124,6 +125,7 @@ enum SPAttributeEnum {
     SP_ATTR_CONNECTOR_TYPE,
     SP_ATTR_CONNECTION_START,
     SP_ATTR_CONNECTION_END,
+    SP_ATTR_CONNECTOR_CURVATURE,
     /* SPRect */
     SP_ATTR_RX,
     SP_ATTR_RY,
index 43c9c0b66cb652c5fa906f50d7d1f5e1c5ca20b2..c04ad9e49a4cb2d3a0c122653faf16a986bf721e 100644 (file)
 
 #include <cstring>
 #include <string>
+#include <iostream>
 
 #include "sp-item.h"
+#include "display/curve.h"
+#include "2geom/line.h"
+#include "2geom/crossing.h"
+#include "2geom/convex-cover.h"
+#include "svg/stringstream.h"
 #include "conn-avoid-ref.h"
-#include "libavoid/polyutil.h"
+#include "connection-points.h"
+#include "sp-conn-end.h"
+#include "sp-path.h"
 #include "libavoid/router.h"
 #include "libavoid/connector.h"
+#include "libavoid/geomtypes.h"
 #include "xml/node.h"
 #include "document.h"
 #include "desktop.h"
 #include "desktop-handles.h"
 #include "sp-namedview.h"
 #include "inkscape.h"
+#include <glibmm/i18n.h>
+
 
 
 using Avoid::Router;
 
-static Avoid::Polygn avoid_item_poly(SPItem const *item);
+static Avoid::Polygon avoid_item_poly(SPItem const *item);
 
 
 SPAvoidRef::SPAvoidRef(SPItem *spitem)
@@ -44,13 +55,17 @@ SPAvoidRef::SPAvoidRef(SPItem *spitem)
 SPAvoidRef::~SPAvoidRef()
 {
     _transformed_connection.disconnect();
-    if (shapeRef) {
+
+    // If the document is being destroyed then the router instance 
+    // and the ShapeRefs will have been destroyed with it.
+    const bool routerInstanceExists = (item->document->router != NULL);
+
+    if (shapeRef && routerInstanceExists) {
         Router *router = shapeRef->router();
-        // shapeRef is finalised by delShape,
-        // so no memory is lost here.
-        router->delShape(shapeRef);
-        shapeRef = NULL;
+        router->removeShape(shapeRef);
+        delete shapeRef;
     }
+    shapeRef = NULL;
 }
 
 
@@ -66,6 +81,205 @@ void SPAvoidRef::setAvoid(char const *value)
     }
 }
 
+void print_connection_points(std::map<int, ConnectionPoint>& cp)
+{
+    std::map<int, ConnectionPoint>::iterator i;
+    for (i=cp.begin(); i!=cp.end(); ++i)
+    {
+        const ConnectionPoint& p = i->second;
+        std::cout<<p.id<<" "<<p.type<<" "<<p.pos[Geom::X]<<" "<<p.pos[Geom::Y]<<std::endl;
+    }
+}
+
+void SPAvoidRef::setConnectionPoints(gchar const *value)
+{
+    std::set<int> updates;
+    std::set<int> deletes;
+    std::set<int> seen;
+
+    if (value)
+    {
+        /* Rebuild the connection points list.
+           Update the connectors for which
+           the endpoint has changed.
+        */
+        
+        gchar ** strarray = g_strsplit(value, "|", 0);
+        gchar ** iter = strarray;
+        
+        while (*iter != NULL) {
+            ConnectionPoint cp;
+            Inkscape::SVGIStringStream is(*iter);
+            is>>cp;
+            cp.type = ConnPointUserDefined;
+
+            /* Mark this connection point as seen, so we can delete
+               the other ones.
+            */
+            seen.insert(cp.id);
+            if ( connection_points.find(cp.id) != connection_points.end() )
+            {
+                /* An already existing connection point.
+                   Check to see if changed, and, if it is
+                   the case, trigger connector update for
+                   the connector attached to this connection
+                   point. This is done by adding the
+                   connection point to a list of connection
+                   points to be updated.
+                */
+                if ( connection_points[cp.id] != cp )
+                    // The connection point got updated.
+                    // Put it in the update list.
+                    updates.insert(cp.id);
+            }
+            connection_points[cp.id] = cp;
+            ++iter;
+        }
+        /* Delete the connection points that didn't appear
+           in the new connection point list.
+        */
+        std::map<int, ConnectionPoint>::iterator it;
+
+        for (it=connection_points.begin(); it!=connection_points.end(); ++it)
+            if ( seen.find(it->first) == seen.end())
+                deletes.insert(it->first);
+        g_strfreev(strarray);
+    }
+    else
+    {
+        /* Delete all the user-defined connection points
+           Actually we do this by adding them to the list
+           of connection points to be deleted.
+        */
+        std::map<int, ConnectionPoint>::iterator it;
+
+        for (it=connection_points.begin(); it!=connection_points.end(); ++it)
+            deletes.insert(it->first);
+    }
+    /* Act upon updates and deletes.
+    */
+    if (deletes.empty() && updates.empty())
+        // Nothing to do, just return.
+        return;
+    // Get a list of attached connectors.
+    GSList* conns = getAttachedConnectors(Avoid::runningToAndFrom);
+    for (GSList *i = conns; i != NULL; i = i->next)
+    {
+        SPPath* path = SP_PATH(i->data);
+        SPConnEnd** connEnds = path->connEndPair.getConnEnds();
+        for (int ix=0; ix<2; ++ix)
+            if (connEnds[ix]->type == ConnPointUserDefined)
+                if (updates.find(connEnds[ix]->id) != updates.end())
+                    if (path->connEndPair.isAutoRoutingConn())
+                        path->connEndPair.tellLibavoidNewEndpoints();
+                    else
+                    {
+                    }
+                else
+                    if (deletes.find(connEnds[ix]->id) != deletes.end())
+                        sp_conn_end_detach(path, ix);
+    }
+    g_slist_free(conns);
+    // Remove all deleted connection points
+    if (deletes.size())
+        for (std::set<int>::iterator it = deletes.begin(); it != deletes.end(); ++it)
+            connection_points.erase(*it);
+}
+
+void SPAvoidRef::setConnectionPointsAttrUndoable(const gchar* value, const gchar* action)
+{
+    SPDocument* doc = SP_OBJECT_DOCUMENT(item);
+    
+    sp_object_setAttribute( SP_OBJECT(item), "inkscape:connection-points", value, 0 );
+    item->updateRepr();
+    sp_document_ensure_up_to_date(doc);
+    sp_document_done(doc, SP_VERB_CONTEXT_CONNECTOR, action);
+}
+
+void SPAvoidRef::addConnectionPoint(ConnectionPoint &cp)
+{
+    Inkscape::SVGOStringStream ostr;
+    bool first = true;
+    int newId = 1;
+    if ( connection_points.size() )
+    {
+        for (IdConnectionPointMap::iterator it = connection_points.begin(); ; )
+        {
+            if ( first )
+            {
+                first = false;
+                ostr<<it->second;
+            }
+            else
+                ostr<<'|'<<it->second;
+            IdConnectionPointMap::iterator prev_it = it;
+            ++it;
+            if ( it == connection_points.end() || prev_it->first + 1 != it->first )
+            {
+                newId = prev_it->first + 1;
+                break;
+            }
+        }
+    }
+    cp.id = newId;
+    if ( first )
+    {
+        first = false;
+        ostr<<cp;
+    }
+    else
+        ostr<<'|'<<cp;
+        
+    this->setConnectionPointsAttrUndoable( ostr.str().c_str(), _("Added a new connection point") );
+}
+
+void SPAvoidRef::updateConnectionPoint(ConnectionPoint &cp)
+{
+    Inkscape::SVGOStringStream ostr;
+    IdConnectionPointMap::iterator cp_pos = connection_points.find( cp.id );
+    if ( cp_pos != connection_points.end() )
+    {
+        bool first = true;
+        for (IdConnectionPointMap::iterator it = connection_points.begin(); it != connection_points.end(); ++it)
+        {
+            ConnectionPoint* to_write;
+            if ( it != cp_pos )
+                to_write = &it->second;
+            else
+                to_write = &cp;
+            if ( first )
+            {
+                first = false;
+                ostr<<*to_write;
+            }
+            else
+                ostr<<'|'<<*to_write;
+        }
+        this->setConnectionPointsAttrUndoable( ostr.str().c_str(), _("Moved a connection point") );
+    }
+}
+
+void SPAvoidRef::deleteConnectionPoint(ConnectionPoint &cp)
+{
+    Inkscape::SVGOStringStream ostr;
+    IdConnectionPointMap::iterator cp_pos = connection_points.find( cp.id );
+    if ( cp_pos != connection_points.end() )
+    {
+        bool first = true;
+        for (IdConnectionPointMap::iterator it = connection_points.begin(); it != connection_points.end(); ++it)
+        {
+            if ( it != cp_pos )
+                if ( first )
+                {
+                    first = false;
+                    ostr<<it->second;
+                }
+                else
+                    ostr<<'|'<<it->second;
+        }
+        this->setConnectionPointsAttrUndoable( ostr.str().c_str(), _("Removed a connection point") );
+    }
+}
 
 void SPAvoidRef::handleSettingChange(void)
 {
@@ -93,8 +307,8 @@ void SPAvoidRef::handleSettingChange(void)
     
     _transformed_connection.disconnect();
     if (new_setting) {
-        Avoid::Polygn poly = avoid_item_poly(item);
-        if (poly.pn > 0) {
+        Avoid::Polygon poly = avoid_item_poly(item);
+        if (poly.size() > 0) {
             _transformed_connection = item->connectTransformed(
                     sigc::ptr_fun(&avoid_item_move));
 
@@ -104,8 +318,7 @@ void SPAvoidRef::handleSettingChange(void)
             // Get a unique ID for the item.
             GQuark itemID = g_quark_from_string(id);
 
-            shapeRef = new Avoid::ShapeRef(router, itemID, poly);
-            Avoid::freePoly(poly);
+            shapeRef = new Avoid::ShapeRef(router, poly, itemID);
         
             router->addShape(shapeRef);
         }
@@ -114,9 +327,8 @@ void SPAvoidRef::handleSettingChange(void)
     {
         g_assert(shapeRef);
         
-        // shapeRef is finalised by delShape,
-        // so no memory is lost here.
-        router->delShape(shapeRef);
+        router->removeShape(shapeRef);
+        delete shapeRef;
         shapeRef = NULL;
     }
 }
@@ -169,14 +381,53 @@ GSList *SPAvoidRef::getAttachedConnectors(const unsigned int type)
     return list;
 }
 
+Geom::Point SPAvoidRef::getConnectionPointPos(const int type, const int id)
+{
+    g_assert(item);
+    Geom::Point pos;
+    const Geom::Matrix& transform = sp_item_i2doc_affine(item);
+    SPDesktop *desktop = inkscape_active_desktop();
+
+    if ( type == ConnPointDefault )
+    {
+        // For now, just default to the centre of the item
+        Geom::OptRect bbox = item->getBounds(sp_item_i2doc_affine(item));
+        pos = (bbox) ? bbox->midpoint() : Geom::Point(0, 0);
+    }
+    else
+    {
+        // Get coordinates from the list of connection points
+        // that are attached to the item
+        pos = connection_points[id].pos * transform;
+    }
+
+    return pos;
+}
+
+bool SPAvoidRef::isValidConnPointId( const int type, const int id )
+{
+    if ( type < 0 || type > 1 )
+        return false;
+    else
+    {
+        if ( type == ConnPointDefault )
+            if ( id < 0 || id > 8 )
+                return false;
+            else
+            {
+            }
+        else
+            return connection_points.find( id ) != connection_points.end();
+    }
+    
+    return true;
+}
 
-static Avoid::Polygn avoid_item_poly(SPItem const *item)
+static Avoid::Polygon avoid_item_poly(SPItem const *item)
 {
     SPDesktop *desktop = inkscape_active_desktop();
     g_assert(desktop != NULL);
 
-    Avoid::Polygn poly;
-
     // TODO: The right way to do this is to return the convex hull of
     //       the object, or an approximation in the case of a rounded
     //       object.  Specific SPItems will need to have a new
@@ -185,24 +436,112 @@ static Avoid::Polygn avoid_item_poly(SPItem const *item)
     //       some convex hull code, though not NR::ConvexHull as this
     //       only keeps the bounding box of the convex hull currently.
 
-    // TODO: SPItem::getBounds gives the wrong result for some objects
-    //       that have internal representations that are updated later
-    //       by the sp_*_update functions, e.g., text.
-    sp_document_ensure_up_to_date(item->document);
+    double spacing = desktop->namedview->connector_spacing;
+
+    // [sommer] If item is a shape, use an approximation of its convex hull
+    {
+        // MJW: Disable this for the moment.  It still has some issues.
+        const bool convex_hull_approximation_enabled = false;
+
+        if ( convex_hull_approximation_enabled && SP_IS_SHAPE (item) ) {
+            // The number of points to use for approximation
+            const unsigned NUM_POINTS = 64; 
+
+//             printf("[sommer] is a shape\n");
+            SPCurve* curve = sp_shape_get_curve (SP_SHAPE (item));
+            if (curve) {
+//                 printf("[sommer] is a curve\n");
+
+                // apply all transformations
+                Geom::Matrix itd_mat = sp_item_i2doc_affine(item);
+                curve->transform(itd_mat);
+
+                // iterate over all paths
+                const Geom::PathVector& curve_pv = curve->get_pathvector();
+                std::vector<Geom::Point> hull_points;
+                for (Geom::PathVector::const_iterator i = curve_pv.begin(); i != curve_pv.end(); i++) {
+                    const Geom::Path& curve_pv_path = *i; 
+//                     printf("[sommer] tracing sub-path\n");
+
+                    // FIXME: enlarge path by "desktop->namedview->connector_spacing" (using sp_selected_path_do_offset)?
+
+                    // use appropriate fraction of points for this path (first one gets any remainder)
+                    unsigned num_points = NUM_POINTS / curve_pv.size();
+                    if (i == curve_pv.begin()) num_points += NUM_POINTS - (num_points * curve_pv.size());
+                    printf("[sommer] using %d points for this path\n", num_points);
+
+                    // sample points along the path for approximation of convex hull
+                    for (unsigned n = 0; n < num_points; n++) {
+                        double at = curve_pv_path.size() / static_cast<double>(num_points) * n;                        
+                        Geom::Point pt = curve_pv_path.pointAt(at);
+                        hull_points.push_back(pt);
+                    }
+                }
+
+                curve->unref();
+
+                // create convex hull from all sampled points
+                Geom::ConvexHull hull(hull_points);
+
+                // store expanded convex hull in Avoid::Polygn
+                unsigned n = 0;
+                Avoid::Polygon poly;
+                const Geom::Point& old_pt = *hull.boundary.begin();
+
+                Geom::Line hull_edge(*hull.boundary.begin(), *(hull.boundary.begin()+1));
+                Geom::Line parallel_hull_edge;
+                parallel_hull_edge.origin(hull_edge.origin()+hull_edge.versor().ccw()*spacing);
+                parallel_hull_edge.versor(hull_edge.versor());
+                Geom::Line bisector = Geom::make_angle_bisector_line( *(hull.boundary.end()), *hull.boundary.begin(),
+                                                                      *(hull.boundary.begin()+1));
+                Geom::OptCrossing int_pt = Geom::intersection(parallel_hull_edge, bisector);
+
+                if (int_pt)
+                {
+                    Avoid::Point avoid_pt((parallel_hull_edge.origin()+parallel_hull_edge.versor()*int_pt->ta)[Geom::X], 
+                                            (parallel_hull_edge.origin()+parallel_hull_edge.versor()*int_pt->ta)[Geom::Y]);
+//                     printf("[sommer] %f, %f\n", old_pt[Geom::X], old_pt[Geom::Y]);
+/*                    printf("[sommer] %f, %f\n", (parallel_hull_edge.origin()+parallel_hull_edge.versor()*int_pt->ta)[Geom::X], 
+                                                (parallel_hull_edge.origin()+parallel_hull_edge.versor()*int_pt->ta)[Geom::Y]);*/
+                    poly.ps.push_back(avoid_pt);
+                }
+                for (std::vector<Geom::Point>::const_iterator i = hull.boundary.begin() + 1; i != hull.boundary.end(); i++, n++) {
+                        const Geom::Point& old_pt = *i;
+                        Geom::Line hull_edge(*i, *(i+1));
+                        Geom::Line parallel_hull_edge;
+                        parallel_hull_edge.origin(hull_edge.origin()+hull_edge.versor().ccw()*spacing);
+                        parallel_hull_edge.versor(hull_edge.versor());
+                        Geom::Line bisector = Geom::make_angle_bisector_line( *(i-1), *i, *(i+1));
+                        Geom::OptCrossing intersect_pt = Geom::intersection(parallel_hull_edge, bisector);
+
+                        if (int_pt)
+                        {
+                            Avoid::Point avoid_pt((parallel_hull_edge.origin()+parallel_hull_edge.versor()*int_pt->ta)[Geom::X], 
+                                                  (parallel_hull_edge.origin()+parallel_hull_edge.versor()*int_pt->ta)[Geom::Y]);
+/*                            printf("[sommer] %f, %f\n", old_pt[Geom::X], old_pt[Geom::Y]);
+                            printf("[sommer] %f, %f\n", (parallel_hull_edge.origin()+parallel_hull_edge.versor()*int_pt->ta)[Geom::X], 
+                                                        (parallel_hull_edge.origin()+parallel_hull_edge.versor()*int_pt->ta)[Geom::Y]);*/
+                            poly.ps.push_back(avoid_pt);
+                        }
+                }
+                
+
+                return poly;
+            }// else printf("[sommer] is no curve\n");
+        }// else printf("[sommer] is no shape\n");
+    }
     
     Geom::OptRect rHull = item->getBounds(sp_item_i2doc_affine(item));
     if (!rHull) {
-        return Avoid::newPoly(0);
+        return Avoid::Polygon();
     }
 
-    double spacing = desktop->namedview->connector_spacing;
-
     // Add a little buffer around the edge of each object.
     Geom::Rect rExpandedHull = *rHull;
     rExpandedHull.expandBy(spacing); 
-    poly = Avoid::newPoly(4);
+    Avoid::Polygon poly(4);
 
-    for (unsigned n = 0; n < 4; ++n) {
+    for (size_t n = 0; n < 4; ++n) {
         Geom::Point hullPoint = rExpandedHull.corner(n);
         poly.ps[n].x = hullPoint[Geom::X];
         poly.ps[n].y = hullPoint[Geom::Y];
@@ -242,10 +581,9 @@ void avoid_item_move(Geom::Matrix const */*mp*/, SPItem *moved_item)
     g_assert(shapeRef);
 
     Router *router = moved_item->document->router;
-    Avoid::Polygn poly = avoid_item_poly(moved_item);
-    if (poly.pn > 0) {
-        router->moveShape(shapeRef, &poly);
-        Avoid::freePoly(poly);
+    Avoid::Polygon poly = avoid_item_poly(moved_item);
+    if (!poly.empty()) {
+        router->moveShape(shapeRef, poly);
     }
 }
 
index d34d8ca2e644be593e20589368326718dd51598a..5dff8dd381dcde6fcff5db0f54a0f7491e35cf18 100644 (file)
@@ -18,6 +18,8 @@
 
 struct SPDesktop;
 struct SPItem;
+struct ConnectionPoint;
+typedef std::map<int, ConnectionPoint> IdConnectionPointMap;
 namespace Avoid { class ShapeRef; }
 
 class SPAvoidRef {
@@ -28,9 +30,16 @@ public:
     // libavoid's internal representation of the item.
     Avoid::ShapeRef *shapeRef;
 
+    // Used for holding connection points for item
+    IdConnectionPointMap connection_points;
+
     void setAvoid(char const *value);
+    void setConnectionPoints(gchar const *value);
+    void addConnectionPoint(ConnectionPoint &cp);
+    void updateConnectionPoint(ConnectionPoint &cp);
+    void deleteConnectionPoint(ConnectionPoint &cp);
     void handleSettingChange(void);
-    
+
     // Returns a list of SPItems of all connectors/shapes attached to
     // this object.  Pass one of the following for 'type':
     //     Avoid::runningTo
@@ -38,6 +47,9 @@ public:
     //     Avoid::runningToAndFrom
     GSList *getAttachedShapes(const unsigned int type);
     GSList *getAttachedConnectors(const unsigned int type);
+    Geom::Point getConnectionPointPos(const int type, const int id);
+
+    bool isValidConnPointId( const int type, const int id );
 
 private:
     SPItem *item;
@@ -48,6 +60,7 @@ private:
 
     // A sigc connection for transformed signal.
     sigc::connection _transformed_connection;
+    void setConnectionPointsAttrUndoable(const gchar* value, const gchar* action);
 };
 
 extern GSList *get_avoided_items(GSList *list, SPObject *from,
@@ -56,6 +69,7 @@ extern void avoid_item_move(Geom::Matrix const *mp, SPItem *moved_item);
 extern void init_avoided_shape_geometry(SPDesktop *desktop);
 
 static const double defaultConnSpacing = 3.0;
+static const double defaultConnCurvature = 3.0;
 
 #endif /* !SEEN_CONN_AVOID_REF */
 
index 2131bdced797be78964e0e798c769ba9535f06d7..228c81d29e0bdc26365ebe694bf4600778f901f3 100644 (file)
@@ -4,31 +4,25 @@
  * Authors:
  *   Michael Wybrow <mjwybrow@users.sourceforge.net>
  *
- * Copyright (C) 2005 Michael Wybrow
+ * Copyright (C) 2005-2008  Michael Wybrow
+ * Copyright (C) 2009  Monash University
  *
  * Released under GNU GPL, read the file 'COPYING' for more information
  *
  * TODO:
- *  o  Have shapes avoid convex hulls of objects, rather than their
- *     bounding box.  Possibly implement the unfinished ConvexHull
- *     class in libnr.
- *     (HOWEVER, using the convex hull C of a shape S does the wrong thing if a
- *     connector starts outside of S but inside C, or if the best route around
- *     an object involves going inside C but without entering S.)
- *  o  Draw connectors to shape edges rather than bounding box.
  *  o  Show a visual indicator for objects with the 'avoid' property set.
  *  o  Allow user to change a object between a path and connector through
  *     the interface.
  *  o  Create an interface for setting markers (arrow heads).
  *  o  Better distinguish between paths and connectors to prevent problems
- *     in the node tool and paths accidently being turned into connectors
+ *     in the node tool and paths accidentally being turned into connectors
  *     in the connector tool.  Perhaps have a way to convert between.
  *  o  Only call libavoid's updateEndPoint as required.  Currently we do it
  *     for both endpoints, even if only one is moving.
  *  o  Allow user-placeable connection points.
  *  o  Deal sanely with connectors with both endpoints attached to the
  *     same connection point, and drawing of connectors attaching
- *     overlaping shapes (currently tries to adjust connector to be
+ *     overlapping shapes (currently tries to adjust connector to be
  *     outside both bounding boxes).
  *  o  Fix many special cases related to connectors updating,
  *     e.g., copying a couple of shapes and a connector that are
  *           one of the other contexts.
  *  o  Cope with shapes whose ids change when they have attached
  *     connectors.
- *  o  gobble_motion_events(GDK_BUTTON1_MASK)?;
+ *  o  During dragging motion, gobble up to and use the final motion event.
+ *     Gobbling away all duplicates after the current can occasionally result
+ *     in the path lagging behind the mouse cursor if it is no longer being
+ *     dragged.
+ *  o  Fix up libavoid's representation after undo actions.  It doesn't see 
+ *     any transform signals and hence doesn't know shapes have moved back to
+ *     there earlier positions.
+ *  o  Decide whether drawing/editing mode should be an Inkscape preference
+ *     or the connector tool should always start in drawing mode.
+ *  o  Correct the problem with switching to the select tool when pressing
+ *     space bar (there are moments when it refuses to do so).
+ *
+ * ----------------------------------------------------------------------------
+ *
+ * mjwybrow's observations on acracan's Summer of Code connector work:
+ * 
+ *  -  GUI comments:
+ * 
+ *      -  Buttons for adding and removing user-specified connection
+ *     points should probably have "+" and "-" symbols on them so they
+ *     are consistent with the similar buttons for the node tool.
+ *      -  Controls on the connector tool be should be reordered logically, 
+ *     possibly as follows:
+ * 
+ *     *Connector*: [Polyline-radio-button] [Orthgonal-radio-button] 
+ *       [Curvature-control] | *Shape*: [Avoid-button] [Dont-avoid-button]
+ *       [Spacing-control] | *Connection pts*: [Edit-mode] [Add-pt] [Rm-pt]
+ * 
+ *     I think that the network layout controls be moved to the 
+ *     Align and Distribute dialog (there is already the layout button 
+ *     there, but no options are exposed).
+ * 
+ *     I think that the style change between polyline and orthogonal
+ *     would be much clearer with two buttons (radio behaviour -- just
+ *     one is true).
+ * 
+ *     The other tools show a label change from "New:" to "Change:" 
+ *     depending on whether an object is selected.  We could consider
+ *     this but there may not be space.
+ * 
+ *     The Add-pt and Rm-pt buttons should be greyed out (inactive) if
+ *     we are not in connection point editing mode.  And probably also
+ *     if there is no shape selected, i.e. at the times they have no
+ *     effect when clicked.
+ * 
+ *     Likewise for the avoid/ignore shapes buttons.  These should be 
+ *     inactive when a shape is not selected in the connector context.
+ * 
+ *  -  When creating/editing connection points:
+ * 
+ *      -  Strange things can happen if you have connectors selected, or
+ *     try rerouting connectors by dragging their endpoints when in 
+ *     connection point editing mode.
+ * 
+ *      -  Possibly the selected shape's connection points should always
+ *     be shown (i.e., have knots) when in editing mode.
+ * 
+ *      -  It is a little strange to be able to place connection points
+ *     competely outside shapes.  Especially when you later can't draw
+ *     connectors to them since the knots are only visible when you
+ *     are over the shape.  I think that you should only be able to
+ *     place connection points inside or on the boundary of the shape 
+ *     itself.
+ *  
+ *      -  The intended ability to place a new point at the current cursor 
+ *     position by pressing RETURN does not seem to work.
+ * 
+ *      -  The Status bar tooltip should change to reflect editing mode
+ *     and tell the user about RETURN and how to use the tool.
+ * 
+ *  -  Connection points general:
+ * 
+ *      -  Connection points that were inside the shape can end up outside 
+ *     after a rotation is applied to the shape in the select tool.
+ *     It doesn't seem like the correct transform is being applied to
+ *     these, or it is being applied at the wrong time.  I'd expect
+ *     connection points to rotate with the shape, and stay at the
+ *     same position "on the shape"
+ * 
+ *      -  I was able to make the connectors attached to a shape fall off
+ *     the shape after scaling it.  Not sure the exact cause, but may
+ *     require more investigation/debugging.
+ * 
+ *      -  The user-defined connection points should be either absolute
+ *     (as the current ones are) or defined as a percentage of the
+ *     shape.  These would be based on a toggle setting on the
+ *     toolbar, and they would be placed in exactly the same way by
+ *     the user.  The only difference would be that they would be
+ *     store as percentage positions in the SVG connection-points
+ *     property and that they would update/move automatically if the 
+ *     object was resized or scaled.
+ * 
+ *      -  Thinking more, I think you always want to store and think about
+ *     the positions of connection points to be pre-transform, but
+ *     obviously the shape transform is applied to them.  That way,
+ *     they will rotate and scale automatically with the shape, when
+ *     the shape transform is altered.  The Percentage version would
+ *     compute their position from the pre-transform dimensions and
+ *     then have the transform applied to them, for example.
+ * 
+ *      -  The connection points in the test_connection_points.svg file
+ *     seem to follow the shape when it is moved, but connection
+ *     points I add to new shapes, do not follow the shape, either
+ *     when the shape is just moved or transformed.  There is
+ *     something wrong here.  What exactly should the behaviour be 
+ *     currently?
+ * 
+ *      -  I see that connection points are specified at absolute canvas
+ *     positions.  I really think that they should be specified in
+ *     shape coordinated relative to the shapes.  There may be
+ *     transforms applied to layers and the canvas which would make
+ *     specifying them quite difficult.  I'd expect a position of 0, 0
+ *     to be on the shape in question or very close to it, for example.
  *
  */
 
+
+
 #include <gdk/gdkkeysyms.h>
 #include <string>
 #include <cstring>
 
 #include "connector-context.h"
 #include "pixmaps/cursor-connector.xpm"
+#include "pixmaps/cursor-node.xpm"
+#include "pixmaps/cursor-node-m.xpm"
+#include "pixmaps/cursor-node-d.xpm"
 #include "xml/node-event-vector.h"
 #include "xml/repr.h"
 #include "svg/svg.h"
 #include "display/canvas-bpath.h"
 #include "display/sodipodi-ctrl.h"
 #include <glibmm/i18n.h>
+#include <glibmm/stringutils.h>
 #include "snap.h"
 #include "knot.h"
 #include "sp-conn-end.h"
+#include "sp-conn-end-pair.h"
 #include "conn-avoid-ref.h"
 #include "libavoid/vertices.h"
+#include "libavoid/router.h"
 #include "context-fns.h"
 #include "sp-namedview.h"
 #include "sp-text.h"
@@ -79,6 +193,7 @@ static void sp_connector_context_init(SPConnectorContext *conn_context);
 static void sp_connector_context_dispose(GObject *object);
 
 static void sp_connector_context_setup(SPEventContext *ec);
+static void sp_connector_context_set(SPEventContext *ec, Inkscape::Preferences::Entry *val);
 static void sp_connector_context_finish(SPEventContext *ec);
 static gint sp_connector_context_root_handler(SPEventContext *ec, GdkEvent *event);
 static gint sp_connector_context_item_handler(SPEventContext *event_context, SPItem *item, GdkEvent *event);
@@ -98,11 +213,14 @@ static gint connector_handle_motion_notify(SPConnectorContext *const cc, GdkEven
 static gint connector_handle_button_release(SPConnectorContext *const cc, GdkEventButton const &revent);
 static gint connector_handle_key_press(SPConnectorContext *const cc, guint const keyval);
 
+static void cc_active_shape_add_knot(SPDesktop* desktop, SPItem* item, ConnectionPointMap &cphandles, ConnectionPoint& cp);
 static void cc_set_active_shape(SPConnectorContext *cc, SPItem *item);
 static void cc_clear_active_shape(SPConnectorContext *cc);
 static void cc_set_active_conn(SPConnectorContext *cc, SPItem *item);
 static void cc_clear_active_conn(SPConnectorContext *cc);
 static gchar *conn_pt_handle_test(SPConnectorContext *cc, Geom::Point& w);
+static void cc_select_handle(SPKnot* knot);
+static void cc_deselect_handle(SPKnot* knot);
 static bool cc_item_is_shape(SPItem *item);
 static void cc_selection_changed(Inkscape::Selection *selection, gpointer data);
 static void cc_connector_rerouting_finish(SPConnectorContext *const cc,
@@ -115,8 +233,8 @@ static void shape_event_attr_changed(Inkscape::XML::Node *repr, gchar const *nam
         gpointer data);
 
 
-static Geom::Point connector_drag_origin_w(0, 0);
-static bool connector_within_tolerance = false;
+/*static Geom::Point connector_drag_origin_w(0, 0);
+static bool connector_within_tolerance = false;*/
 static SPEventContextClass *parent_class;
 
 
@@ -171,6 +289,7 @@ sp_connector_context_class_init(SPConnectorContextClass *klass)
     object_class->dispose = sp_connector_context_dispose;
 
     event_context_class->setup = sp_connector_context_setup;
+    event_context_class->set = sp_connector_context_set;
     event_context_class->finish = sp_connector_context_finish;
     event_context_class->root_handler = sp_connector_context_root_handler;
     event_context_class->item_handler = sp_connector_context_item_handler;
@@ -188,10 +307,14 @@ sp_connector_context_init(SPConnectorContext *cc)
     ec->xp = 0;
     ec->yp = 0;
 
+    cc->mode = SP_CONNECTOR_CONTEXT_DRAWING_MODE;
+    cc->knot_tip = 0;
+
     cc->red_color = 0xff00007f;
 
     cc->newconn = NULL;
     cc->newConnRef = NULL;
+    cc->curvature = 0.0;
 
     cc->sel_changed_connection = sigc::connection();
 
@@ -204,10 +327,13 @@ sp_connector_context_init(SPConnectorContext *cc)
 
     cc->active_handle = NULL;
 
+    cc->selected_handle = NULL;
+
     cc->clickeditem = NULL;
     cc->clickedhandle = NULL;
 
-    cc->connpthandle = NULL;
+    new (&cc->connpthandles) ConnectionPointMap();
+    
     for (int i = 0; i < 2; ++i) {
         cc->endpt_handle[i] = NULL;
         cc->endpt_handler_id[i] = 0;
@@ -226,10 +352,14 @@ sp_connector_context_dispose(GObject *object)
 
     cc->sel_changed_connection.disconnect();
 
-    if (cc->connpthandle) {
-        g_object_unref(cc->connpthandle);
-        cc->connpthandle = NULL;
+    if (!cc->connpthandles.empty()) {
+        for (ConnectionPointMap::iterator it = cc->connpthandles.begin(); 
+                it != cc->connpthandles.end(); ++it) {
+            g_object_unref(it->first);
+        }
+        cc->connpthandles.clear();
     }
+    cc->connpthandles.~ConnectionPointMap();
     for (int i = 0; i < 2; ++i) {
         if (cc->endpt_handle[1]) {
             g_object_unref(cc->endpt_handle[i]);
@@ -282,6 +412,12 @@ sp_connector_context_setup(SPEventContext *ec)
     // Notice the initial selection.
     cc_selection_changed(cc->selection, (gpointer) cc);
 
+    cc->within_tolerance = false;
+    
+    sp_event_context_read(ec, "curvature");
+    sp_event_context_read(ec, "orthogonal");
+    sp_event_context_read(ec, "mode");
+    cc->knot_tip = cc->mode == SP_CONNECTOR_CONTEXT_DRAWING_MODE ? cc_knot_tips[0] : cc_knot_tips[1];
     Inkscape::Preferences *prefs = Inkscape::Preferences::get();
     if (prefs->getBool("/tools/connector/selcue", 0)) {
         ec->enableSelectionCue();
@@ -293,6 +429,64 @@ sp_connector_context_setup(SPEventContext *ec)
 }
 
 
+static void
+sp_connector_context_set(SPEventContext *ec, Inkscape::Preferences::Entry *val)
+{
+    SPConnectorContext *cc = SP_CONNECTOR_CONTEXT(ec);
+
+    /* fixme: Proper error handling for non-numeric data.  Use a locale-independent function like
+     * g_ascii_strtod (or a thin wrapper that does the right thing for invalid values inf/nan). */
+    Glib::ustring name = val->getEntryName();
+    if ( name == "curvature" ) {
+        cc->curvature = val->getDoubleLimited(); // prevents NaN and +/-Inf from messing up
+    }
+    else if ( name == "orthogonal" ) {
+        cc->isOrthogonal = val->getBool();
+    }
+    else if ( name == "mode")
+    {
+        sp_connector_context_switch_mode(ec, val->getBool() ? SP_CONNECTOR_CONTEXT_EDITING_MODE : SP_CONNECTOR_CONTEXT_DRAWING_MODE);
+    }
+}
+
+void sp_connector_context_switch_mode(SPEventContext* ec, unsigned int newMode)
+{
+    SPConnectorContext *cc = SP_CONNECTOR_CONTEXT(ec);
+
+    cc->mode = newMode;
+    if ( cc->mode == SP_CONNECTOR_CONTEXT_DRAWING_MODE )
+    {
+        ec->cursor_shape = cursor_connector_xpm;
+        cc->knot_tip = cc_knot_tips[0];
+        if (cc->selected_handle)
+            cc_deselect_handle( cc->selected_handle );
+        cc->selected_handle = NULL;
+        // Show all default connection points
+
+    }
+    else if ( cc->mode == SP_CONNECTOR_CONTEXT_EDITING_MODE )
+    {
+        ec->cursor_shape = cursor_node_xpm;
+        cc->knot_tip = cc_knot_tips[1];
+/*            if (cc->active_shape)
+        {
+            cc->selection->set( SP_OBJECT( cc->active_shape ) );
+        }
+        else 
+        {
+            SPItem* item = cc->selection->singleItem();
+            if ( item )
+            {
+                cc_set_active_shape(cc, item);
+                cc->selection->set( SP_OBJECT( item ) );
+            }
+        }*/
+    }
+    sp_event_context_update_cursor(ec);
+
+}
+
+
 static void
 sp_connector_context_finish(SPEventContext *ec)
 {
@@ -341,9 +535,12 @@ cc_clear_active_shape(SPConnectorContext *cc)
         cc->active_shape_layer_repr = NULL;
     }
 
-    // Hide the center connection point if it exists.
-    if (cc->connpthandle) {
-        sp_knot_hide(cc->connpthandle);
+    // Hide the connection points if they exist.
+    if (cc->connpthandles.size()) {
+        for (ConnectionPointMap::iterator it = cc->connpthandles.begin(); 
+                it != cc->connpthandles.end(); ++it) {
+            sp_knot_hide(it->first);
+        }
     }
 }
 
@@ -379,16 +576,35 @@ conn_pt_handle_test(SPConnectorContext *cc, Geom::Point& p)
     // TODO: this will need to change when there are more connection
     //       points available for each shape.
 
-    SPKnot *centerpt = cc->connpthandle;
-    if (cc->active_handle && (cc->active_handle == centerpt))
+    if (cc->active_handle && (cc->connpthandles.find(cc->active_handle) != cc->connpthandles.end()))
     {
-        p = centerpt->pos;
-        return g_strdup_printf("#%s", SP_OBJECT_ID(cc->active_shape));
+        p = cc->active_handle->pos;
+        const ConnectionPoint& cp = cc->connpthandles[cc->active_handle];
+        return g_strdup_printf("#%s_%c_%d", SP_OBJECT_ID(cc->active_shape),
+                               cp.type == ConnPointDefault ? 'd' : 'u' , cp.id);
     }
     return NULL;
 }
 
+static void
+cc_select_handle(SPKnot* knot)
+{
+    knot->setShape(SP_KNOT_SHAPE_SQUARE);
+    knot->setSize(10);
+    knot->setAnchor(GTK_ANCHOR_CENTER);
+    knot->setFill(0x0000ffff, 0x0000ffff, 0x0000ffff);
+    sp_knot_update_ctrl(knot);
+}
 
+static void
+cc_deselect_handle(SPKnot* knot)
+{
+    knot->setShape(SP_KNOT_SHAPE_SQUARE);
+    knot->setSize(8);
+    knot->setAnchor(GTK_ANCHOR_CENTER);
+    knot->setFill(0xffffff00, 0xff0000ff, 0xff0000ff);
+    sp_knot_update_ctrl(knot);
+}
 
 static gint
 sp_connector_context_item_handler(SPEventContext *event_context, SPItem *item, GdkEvent *event)
@@ -400,29 +616,40 @@ sp_connector_context_item_handler(SPEventContext *event_context, SPItem *item, G
     SPConnectorContext *cc = SP_CONNECTOR_CONTEXT(event_context);
 
     Geom::Point p(event->button.x, event->button.y);
-
+    
     switch (event->type) {
         case GDK_BUTTON_RELEASE:
             if (event->button.button == 1 && !event_context->space_panning) {
                 if ((cc->state == SP_CONNECTOR_CONTEXT_DRAGGING) &&
-                        (connector_within_tolerance))
+                        (event_context->within_tolerance))
                 {
                     spcc_reset_colors(cc);
                     cc->state = SP_CONNECTOR_CONTEXT_IDLE;
-                    sp_event_context_discard_delayed_snap_event(event_context);
+//                    sp_event_context_snap_window_closed(event_context);
                 }
                 if (cc->state != SP_CONNECTOR_CONTEXT_IDLE) {
-                    // Doing simething else like rerouting.
+                    // Doing something else like rerouting.
                     break;
                 }
-                // find out clicked item, disregarding groups, honoring Alt
-                SPItem *item_ungrouped = sp_event_context_find_item(desktop,
-                        p, event->button.state & GDK_MOD1_MASK, TRUE);
+                // find out clicked item, honoring Alt
+                SPItem *item = sp_event_context_find_item(desktop,
+                        p, event->button.state & GDK_MOD1_MASK, FALSE);
 
                 if (event->button.state & GDK_SHIFT_MASK) {
-                    cc->selection->toggle(item_ungrouped);
+                    cc->selection->toggle(item);
                 } else {
-                    cc->selection->set(item_ungrouped);
+                    cc->selection->set(item);
+                    if ( cc->mode == SP_CONNECTOR_CONTEXT_EDITING_MODE && cc->selected_handle )
+                    {
+                        cc_deselect_handle( cc->selected_handle );
+                        cc->selected_handle = NULL;
+                    }
+                    /* When selecting a new item,
+                       do not allow showing connection points
+                       on connectors. (yet?)
+                    */
+                    if ( item != cc->active_shape && !cc_item_is_connector( item ) )
+                        cc_set_active_shape( cc, item );
                 }
                 ret = TRUE;
 
@@ -430,15 +657,24 @@ sp_connector_context_item_handler(SPEventContext *event_context, SPItem *item, G
             break;
         case GDK_ENTER_NOTIFY:
         {
-            if (cc_item_is_shape(item)) {
-                // This is a shape, so show connection point(s).
-                if (!(cc->active_shape) ||
-                        // Don't show handle for another handle.
-                        (item != ((SPItem *) cc->connpthandle))) {
+            if (cc->mode == SP_CONNECTOR_CONTEXT_DRAWING_MODE || (cc->mode == SP_CONNECTOR_CONTEXT_EDITING_MODE && !cc->selected_handle))
+            {
+                if (cc_item_is_shape(item)) {
+                    
+                    // I don't really understand what the above does,
+                    // so I commented it.
+                    // This is a shape, so show connection point(s).
+    /*                if (!(cc->active_shape) 
+                            // Don't show handle for another handle.
+    //                         || (cc->connpthandles.find((SPKnot*) item) != cc->connpthandles.end())
+                        )
+                    {
+                        cc_set_active_shape(cc, item);
+                    }*/
                     cc_set_active_shape(cc, item);
                 }
+                ret = TRUE;
             }
-            ret = TRUE;
             break;
         }
         default:
@@ -462,7 +698,7 @@ sp_connector_context_root_handler(SPEventContext *ec, GdkEvent *event)
             break;
 
         case GDK_MOTION_NOTIFY:
-               ret = connector_handle_motion_notify(cc, event->motion);
+            ret = connector_handle_motion_notify(cc, event->motion);
             break;
 
         case GDK_BUTTON_RELEASE:
@@ -497,96 +733,166 @@ connector_handle_button_press(SPConnectorContext *const cc, GdkEventButton const
     SPEventContext *event_context = SP_EVENT_CONTEXT(cc);
 
     gint ret = FALSE;
-    if ( bevent.button == 1 && !event_context->space_panning ) {
+    if ( cc->mode == SP_CONNECTOR_CONTEXT_DRAWING_MODE )
+    {
+        if ( bevent.button == 1 && !event_context->space_panning ) {
 
-        SPDesktop *desktop = SP_EVENT_CONTEXT_DESKTOP(cc);
+            SPDesktop *desktop = SP_EVENT_CONTEXT_DESKTOP(cc);
 
-        if (Inkscape::have_viable_layer(desktop, cc->_message_context) == false) {
-            return TRUE;
-        }
+            if (Inkscape::have_viable_layer(desktop, cc->_message_context) == false) {
+                return TRUE;
+            }
 
-        Geom::Point const event_w(bevent.x,
-                                bevent.y);
-        connector_drag_origin_w = event_w;
-        connector_within_tolerance = true;
+            Geom::Point const event_w(bevent.x,
+                                    bevent.y);
+//             connector_drag_origin_w = event_w;
+            cc->xp = bevent.x;
+            cc->yp = bevent.y;
+            cc->within_tolerance = true;
 
-        Geom::Point const event_dt = cc->desktop->w2d(event_w);
+            Geom::Point const event_dt = cc->desktop->w2d(event_w);
 
-        SnapManager &m = cc->desktop->namedview->snap_manager;
-               m.setup(cc->desktop);
+            SnapManager &m = cc->desktop->namedview->snap_manager;
+            m.setup(cc->desktop);
 
-        switch (cc->state) {
-            case SP_CONNECTOR_CONTEXT_STOP:
-                /* This is allowed, if we just cancelled curve */
-            case SP_CONNECTOR_CONTEXT_IDLE:
-            {
-                if ( cc->npoints == 0 ) {
-                    cc_clear_active_conn(cc);
+            switch (cc->state) {
+                case SP_CONNECTOR_CONTEXT_STOP:
+                    /* This is allowed, if we just cancelled curve */
+                case SP_CONNECTOR_CONTEXT_IDLE:
+                {
+                    if ( cc->npoints == 0 ) {
+                        cc_clear_active_conn(cc);
 
-                    SP_EVENT_CONTEXT_DESKTOP(cc)->messageStack()->flash(Inkscape::NORMAL_MESSAGE, _("Creating new connector"));
+                        SP_EVENT_CONTEXT_DESKTOP(cc)->messageStack()->flash(Inkscape::NORMAL_MESSAGE, _("Creating new connector"));
 
-                    /* Set start anchor */
-                    /* Create green anchor */
-                    Geom::Point p = event_dt;
+                        /* Set start anchor */
+                        /* Create green anchor */
+                        Geom::Point p = event_dt;
 
-                    // Test whether we clicked on a connection point
-                    cc->sid = conn_pt_handle_test(cc, p);
+                        // Test whether we clicked on a connection point
+                        cc->sid = conn_pt_handle_test(cc, p);
+
+//                        sp_event_context_snap_window_open(event_context);
+
+                        if (!cc->sid) {
+                            // This is the first point, so just snap it to the grid
+                            // as there's no other points to go off.
+                            m.freeSnapReturnByRef(Inkscape::SnapPreferences::SNAPPOINT_NODE, p, Inkscape::SNAPSOURCE_HANDLE);
+                        }
+                        spcc_connector_set_initial_point(cc, p);
 
-                    if (!cc->sid) {
-                        // This is the first point, so just snap it to the grid
-                        // as there's no other points to go off.
-                        m.freeSnapReturnByRef(Inkscape::SnapPreferences::SNAPPOINT_NODE, p, Inkscape::SNAPSOURCE_HANDLE);
                     }
-                    spcc_connector_set_initial_point(cc, p);
+                    cc->state = SP_CONNECTOR_CONTEXT_DRAGGING;
+                    ret = TRUE;
+                    break;
+                }
+                case SP_CONNECTOR_CONTEXT_DRAGGING:
+                {
+                    // This is the second click of a connector creation.
+                    m.freeSnapReturnByRef(Inkscape::SnapPreferences::SNAPPOINT_NODE, p, Inkscape::SNAPSOURCE_HANDLE);
 
+                    spcc_connector_set_subsequent_point(cc, p);
+                    spcc_connector_finish_segment(cc, p);
+                    // Test whether we clicked on a connection point
+                    cc->eid = conn_pt_handle_test(cc, p);
+                    if (cc->npoints != 0) {
+                        spcc_connector_finish(cc);
+                    }
+                    cc_set_active_conn(cc, cc->newconn);
+                    cc->state = SP_CONNECTOR_CONTEXT_IDLE;
+//                    sp_event_context_snap_window_closed(event_context);
+                    ret = TRUE;
+                    break;
                 }
-                cc->state = SP_CONNECTOR_CONTEXT_DRAGGING;
-                ret = TRUE;
-                break;
+                case SP_CONNECTOR_CONTEXT_CLOSE:
+                {
+                    g_warning("Button down in CLOSE state");
+                    break;
+                }
+                default:
+                    break;
             }
-            case SP_CONNECTOR_CONTEXT_DRAGGING:
-            {
-                // This is the second click of a connector creation.
-               m.freeSnapReturnByRef(Inkscape::SnapPreferences::SNAPPOINT_NODE, p, Inkscape::SNAPSOURCE_HANDLE);
+        } else if (bevent.button == 3) {
+            if (cc->state == SP_CONNECTOR_CONTEXT_REROUTING) {
+                // A context menu is going to be triggered here,
+                // so end the rerouting operation.
+                cc_connector_rerouting_finish(cc, &p);
 
-                spcc_connector_set_subsequent_point(cc, p);
-                spcc_connector_finish_segment(cc, p);
-                // Test whether we clicked on a connection point
-                cc->eid = conn_pt_handle_test(cc, p);
-                if (cc->npoints != 0) {
-                    spcc_connector_finish(cc);
-                }
-                cc_set_active_conn(cc, cc->newconn);
                 cc->state = SP_CONNECTOR_CONTEXT_IDLE;
-                sp_event_context_discard_delayed_snap_event(event_context);
-                ret = TRUE;
-                break;
+//                sp_event_context_snap_window_closed(event_context);
+
+                // Don't set ret to TRUE, so we drop through to the
+                // parent handler which will open the context menu.
             }
-            case SP_CONNECTOR_CONTEXT_CLOSE:
-            {
-                g_warning("Button down in CLOSE state");
-                break;
+            else if (cc->npoints != 0) {
+                spcc_connector_finish(cc);
+                cc->state = SP_CONNECTOR_CONTEXT_IDLE;
+//                sp_event_context_snap_window_closed(event_context);
+                ret = TRUE;
             }
-            default:
-                break;
         }
-    } else if (bevent.button == 3) {
-        if (cc->state == SP_CONNECTOR_CONTEXT_REROUTING) {
-            // A context menu is going to be triggered here,
-            // so end the rerouting operation.
-            cc_connector_rerouting_finish(cc, &p);
+    }
+    else if ( cc->mode == SP_CONNECTOR_CONTEXT_EDITING_MODE )
+    {
+        if ( bevent.button == 1 && !event_context->space_panning )
+        {
+            // Initialize variables in case of dragging
 
-            cc->state = SP_CONNECTOR_CONTEXT_IDLE;
-            sp_event_context_discard_delayed_snap_event(event_context);
+            SPDesktop *desktop = SP_EVENT_CONTEXT_DESKTOP(cc);
 
-            // Don't set ret to TRUE, so we drop through to the
-            // parent handler which will open the context menu.
-        }
-        else if (cc->npoints != 0) {
-            spcc_connector_finish(cc);
-            cc->state = SP_CONNECTOR_CONTEXT_IDLE;
-            sp_event_context_discard_delayed_snap_event(event_context);
-            ret = TRUE;
+            if (Inkscape::have_viable_layer(desktop, cc->_message_context) == false) {
+                return TRUE;
+            }
+
+            cc->xp = bevent.x;
+            cc->yp = bevent.y;
+            cc->within_tolerance = true;
+            
+            ConnectionPointMap::iterator const& active_knot_it = cc->connpthandles.find( cc->active_handle );
+
+            switch (cc->state)
+            {
+                case SP_CONNECTOR_CONTEXT_IDLE:
+                    if ( active_knot_it != cc->connpthandles.end() )
+                    {
+                        // We do not allow selecting and, thereby, moving default knots
+                        if ( active_knot_it->second.type != ConnPointDefault)
+                        {
+                            if (cc->selected_handle != cc->active_handle)
+                            {
+                                if ( cc->selected_handle )
+                                    cc_deselect_handle( cc->selected_handle );
+                                cc->selected_handle = cc->active_handle;
+                                cc_select_handle( cc->selected_handle );
+                            }
+                        }
+                        else
+                            // Just ignore the default connection point
+                            return FALSE;
+                    }
+                    else
+                        if ( cc->selected_handle )
+                        {
+                            cc_deselect_handle( cc->selected_handle );
+                            cc->selected_handle = NULL;
+                        }
+
+                    if ( cc->selected_handle )
+                    {
+//                         sp_event_context_snap_window_open(event_context);
+                        cc->state = SP_CONNECTOR_CONTEXT_DRAGGING;
+                        cc->selection->set( SP_OBJECT( cc->active_shape ) );
+                    }
+
+                    ret = TRUE;
+                    break;
+                // Dragging valid because of the way we create
+                // new connection points.
+                case SP_CONNECTOR_CONTEXT_DRAGGING:
+                    // Do nothing.
+                    ret = TRUE;
+                    break;
+            }
         }
     }
     return ret;
@@ -607,71 +913,94 @@ connector_handle_motion_notify(SPConnectorContext *const cc, GdkEventMotion cons
 
     Geom::Point const event_w(mevent.x, mevent.y);
 
-    if (connector_within_tolerance) {
-        gint const tolerance = prefs->getIntLimited("/options/dragtolerance/value", 0, 0, 100);
-        if ( Geom::LInfty( event_w - connector_drag_origin_w ) < tolerance ) {
+    if (cc->within_tolerance) {
+        cc->tolerance = prefs->getIntLimited("/options/dragtolerance/value", 0, 0, 100);
+        if ( ( abs( (gint) mevent.x - cc->xp ) < cc->tolerance ) &&
+             ( abs( (gint) mevent.y - cc->yp ) < cc->tolerance ) ) {
             return FALSE;   // Do not drag if we're within tolerance from origin.
         }
     }
     // Once the user has moved farther than tolerance from the original location
     // (indicating they intend to move the object, not click), then always process
     // the motion notify coordinates as given (no snapping back to origin)
-    connector_within_tolerance = false;
+    cc->within_tolerance = false;
 
     SPDesktop *const dt = cc->desktop;
 
     /* Find desktop coordinates */
     Geom::Point p = dt->w2d(event_w);
 
-    SnapManager &m = dt->namedview->snap_manager;
-       m.setup(dt);
-
-    switch (cc->state) {
-        case SP_CONNECTOR_CONTEXT_DRAGGING:
-        {
-            // This is movement during a connector creation.
-               if ( cc->npoints > 0 ) {
-                       m.freeSnapReturnByRef(Inkscape::SnapPreferences::SNAPPOINT_NODE, p, Inkscape::SNAPSOURCE_HANDLE);
-                       cc->selection->clear();
-                spcc_connector_set_subsequent_point(cc, p);
-                ret = TRUE;
+    if ( cc->mode == SP_CONNECTOR_CONTEXT_DRAWING_MODE )
+    {
+        SnapManager &m = dt->namedview->snap_manager;
+        m.setup(dt);
+        
+        switch (cc->state) {
+            case SP_CONNECTOR_CONTEXT_DRAGGING:
+            {
+                gobble_motion_events(mevent.state);
+                // This is movement during a connector creation.
+                if ( cc->npoints > 0 ) {
+                    m.freeSnapReturnByRef(Inkscape::SnapPreferences::SNAPPOINT_NODE, p,
+                            Inkscape::SNAPSOURCE_HANDLE);
+                    cc->selection->clear();
+                    spcc_connector_set_subsequent_point(cc, p);
+                    ret = TRUE;
+                }
+                break;
             }
-            break;
-        }
-        case SP_CONNECTOR_CONTEXT_REROUTING:
-        {
-            g_assert( SP_IS_PATH(cc->clickeditem));
+            case SP_CONNECTOR_CONTEXT_REROUTING:
+            {
+                gobble_motion_events(GDK_BUTTON1_MASK);
+                g_assert( SP_IS_PATH(cc->clickeditem));
 
-            m.freeSnapReturnByRef(Inkscape::SnapPreferences::SNAPPOINT_NODE, p, Inkscape::SNAPSOURCE_HANDLE);
+                m.freeSnapReturnByRef(Inkscape::SnapPreferences::SNAPPOINT_NODE, p,
+                        Inkscape::SNAPSOURCE_HANDLE);
 
-            // Update the hidden path
-            Geom::Matrix i2d = sp_item_i2d_affine(cc->clickeditem);
-            Geom::Matrix d2i = i2d.inverse();
-            SPPath *path = SP_PATH(cc->clickeditem);
-            SPCurve *curve = (SP_SHAPE(path))->curve;
-            if (cc->clickedhandle == cc->endpt_handle[0]) {
-                Geom::Point o = cc->endpt_handle[1]->pos;
-                curve->stretch_endpoints(p * d2i, o * d2i);
-            }
-            else {
-                Geom::Point o = cc->endpt_handle[0]->pos;
-                curve->stretch_endpoints(o * d2i, p * d2i);
-            }
-            sp_conn_adjust_path(path);
+                // Update the hidden path
+                Geom::Matrix i2d = sp_item_i2d_affine(cc->clickeditem);
+                Geom::Matrix d2i = i2d.inverse();
+                SPPath *path = SP_PATH(cc->clickeditem);
+                SPCurve *curve = path->original_curve ? path->original_curve : path->curve;
+                if (cc->clickedhandle == cc->endpt_handle[0]) {
+                    Geom::Point o = cc->endpt_handle[1]->pos;
+                    curve->stretch_endpoints(p * d2i, o * d2i);
+                }
+                else {
+                    Geom::Point o = cc->endpt_handle[0]->pos;
+                    curve->stretch_endpoints(o * d2i, p * d2i);
+                }
+                sp_conn_reroute_path_immediate(path);
 
-            // Copy this to the temporary visible path
-            cc->red_curve = SP_SHAPE(path)->curve->copy();
-            cc->red_curve->transform(i2d);
+                // Copy this to the temporary visible path
+                cc->red_curve = path->original_curve ?
+                        path->original_curve->copy() : path->curve->copy();
+                cc->red_curve->transform(i2d);
 
-            sp_canvas_bpath_set_bpath(SP_CANVAS_BPATH(cc->red_bpath), cc->red_curve);
-            ret = TRUE;
-            break;
+                sp_canvas_bpath_set_bpath(SP_CANVAS_BPATH(cc->red_bpath), cc->red_curve);
+                ret = TRUE;
+                break;
+            }
+            case SP_CONNECTOR_CONTEXT_STOP:
+                /* This is perfectly valid */
+                break;
+            default:
+                break;
+        }
+    }
+    else if ( cc->mode == SP_CONNECTOR_CONTEXT_EDITING_MODE )
+    {
+        switch ( cc->state )
+        {
+            case SP_CONNECTOR_CONTEXT_DRAGGING:
+                sp_knot_set_position(cc->selected_handle, p, 0);
+                ret = TRUE;
+                break;
+            case SP_CONNECTOR_CONTEXT_NEWCONNPOINT:
+                sp_knot_set_position(cc->selected_handle, p, 0);
+                ret = TRUE;
+                break;
         }
-        case SP_CONNECTOR_CONTEXT_STOP:
-            /* This is perfectly valid */
-            break;
-        default:
-            break;
     }
 
     return ret;
@@ -685,60 +1014,111 @@ connector_handle_button_release(SPConnectorContext *const cc, GdkEventButton con
     SPEventContext *event_context = SP_EVENT_CONTEXT(cc);
     if ( revent.button == 1 && !event_context->space_panning ) {
 
-       SPDesktop *desktop = SP_EVENT_CONTEXT_DESKTOP(cc);
+        SPDesktop *desktop = SP_EVENT_CONTEXT_DESKTOP(cc);
         SPDocument *doc = sp_desktop_document(desktop);
 
         SnapManager &m = desktop->namedview->snap_manager;
-               m.setup(desktop);
+        m.setup(desktop);
 
         Geom::Point const event_w(revent.x, revent.y);
 
         /* Find desktop coordinates */
         Geom::Point p = cc->desktop->w2d(event_w);
-
-        switch (cc->state) {
-            //case SP_CONNECTOR_CONTEXT_POINT:
-            case SP_CONNECTOR_CONTEXT_DRAGGING:
-            {
-               m.freeSnapReturnByRef(Inkscape::SnapPreferences::SNAPPOINT_NODE, p, Inkscape::SNAPSOURCE_HANDLE);
-
-               if (connector_within_tolerance)
+        if ( cc->mode == SP_CONNECTOR_CONTEXT_DRAWING_MODE )
+        {
+            switch (cc->state) {
+                //case SP_CONNECTOR_CONTEXT_POINT:
+                case SP_CONNECTOR_CONTEXT_DRAGGING:
                 {
+                    m.freeSnapReturnByRef(Inkscape::SnapPreferences::SNAPPOINT_NODE, p, Inkscape::SNAPSOURCE_HANDLE);
+
+                    if (cc->within_tolerance)
+                    {
+                        spcc_connector_finish_segment(cc, p);
+                        return TRUE;
+                    }
+                    // Connector has been created via a drag, end it now.
+                    spcc_connector_set_subsequent_point(cc, p);
                     spcc_connector_finish_segment(cc, p);
-                    return TRUE;
+                    // Test whether we clicked on a connection point
+                    cc->eid = conn_pt_handle_test(cc, p);
+                    if (cc->npoints != 0) {
+                        spcc_connector_finish(cc);
+                    }
+                    cc_set_active_conn(cc, cc->newconn);
+                    cc->state = SP_CONNECTOR_CONTEXT_IDLE;
+//                    sp_event_context_snap_window_closed(event_context);
+                    break;
                 }
-                // Connector has been created via a drag, end it now.
-                spcc_connector_set_subsequent_point(cc, p);
-                spcc_connector_finish_segment(cc, p);
-                // Test whether we clicked on a connection point
-                cc->eid = conn_pt_handle_test(cc, p);
-                if (cc->npoints != 0) {
-                    spcc_connector_finish(cc);
+                case SP_CONNECTOR_CONTEXT_REROUTING:
+                {
+                    m.freeSnapReturnByRef(Inkscape::SnapPreferences::SNAPPOINT_NODE, p, Inkscape::SNAPSOURCE_HANDLE);
+                    cc_connector_rerouting_finish(cc, &p);
+
+                    sp_document_ensure_up_to_date(doc);
+                    cc->state = SP_CONNECTOR_CONTEXT_IDLE;
+//                    sp_event_context_snap_window_closed(event_context);
+                    return TRUE;
+                    break;
                 }
-                cc_set_active_conn(cc, cc->newconn);
-                cc->state = SP_CONNECTOR_CONTEXT_IDLE;
-                sp_event_context_discard_delayed_snap_event(event_context);
-                break;
+                case SP_CONNECTOR_CONTEXT_STOP:
+                    /* This is allowed, if we just cancelled curve */
+                    break;
+                default:
+                    break;
             }
-            case SP_CONNECTOR_CONTEXT_REROUTING:
+            ret = TRUE;
+        }
+        else if ( cc->mode == SP_CONNECTOR_CONTEXT_EDITING_MODE )
+        {
+            switch ( cc->state )
             {
-               m.freeSnapReturnByRef(Inkscape::SnapPreferences::SNAPPOINT_NODE, p, Inkscape::SNAPSOURCE_HANDLE);
-               cc_connector_rerouting_finish(cc, &p);
+                case SP_CONNECTOR_CONTEXT_DRAGGING:
+                    
+                    if (!cc->within_tolerance)
+                    {
+//                        sp_event_context_snap_window_open(event_context);
+                        m.freeSnapReturnByRef(Inkscape::SnapPreferences::SNAPPOINT_NODE, p, Inkscape::SNAPSOURCE_HANDLE);
+                        sp_knot_set_position(cc->selected_handle, p, 0);
+//                        sp_event_context_snap_window_closed(event_context);
+                        ConnectionPoint& cp = cc->connpthandles[cc->selected_handle];
+                        cp.pos = p * sp_item_dt2i_affine(cc->active_shape);
+                        cc->active_shape->avoidRef->updateConnectionPoint(cp);
+                    }
 
-                sp_document_ensure_up_to_date(doc);
-                cc->state = SP_CONNECTOR_CONTEXT_IDLE;
-                sp_event_context_discard_delayed_snap_event(event_context);
-                return TRUE;
-                break;
+                    cc->state = SP_CONNECTOR_CONTEXT_IDLE;
+                    ret = TRUE;
+                    break;
+
+
+                case SP_CONNECTOR_CONTEXT_NEWCONNPOINT:
+//                    sp_event_context_snap_window_open( event_context );
+                    m.freeSnapReturnByRef(Inkscape::SnapPreferences::SNAPPOINT_NODE, p, Inkscape::SNAPSOURCE_HANDLE);
+                    
+                    sp_knot_set_position(cc->selected_handle, p, 0);
+//                    sp_event_context_snap_window_closed(event_context);
+
+                    ConnectionPoint cp;
+                    cp.type = ConnPointUserDefined;
+                    cp.pos = p * sp_item_dt2i_affine(cc->active_shape);
+                    cp.dir = Avoid::ConnDirAll;
+                    g_object_unref(cc->selected_handle);
+                    cc->active_shape->avoidRef->addConnectionPoint(cp);
+                    sp_document_ensure_up_to_date(doc);
+                    for (ConnectionPointMap::iterator it = cc->connpthandles.begin(); it != cc->connpthandles.end(); ++it)
+                        if (it->second.type == ConnPointUserDefined && it->second.id == cp.id)
+                        {
+                            cc->selected_handle = it->first;
+                            break;
+                        }
+                    cc_select_handle( cc->selected_handle );
+                    cc->state = SP_CONNECTOR_CONTEXT_IDLE;
+                    ret = TRUE;
+                    break;
             }
-            case SP_CONNECTOR_CONTEXT_STOP:
-                /* This is allowed, if we just cancelled curve */
-                break;
-            default:
-                break;
         }
-        ret = TRUE;
     }
+    
 
     return ret;
 }
@@ -749,43 +1129,145 @@ connector_handle_key_press(SPConnectorContext *const cc, guint const keyval)
 {
     gint ret = FALSE;
     /* fixme: */
-    switch (keyval) {
-        case GDK_Return:
-        case GDK_KP_Enter:
-            if (cc->npoints != 0) {
-                spcc_connector_finish(cc);
-                cc->state = SP_CONNECTOR_CONTEXT_IDLE;
-                sp_event_context_discard_delayed_snap_event(SP_EVENT_CONTEXT(cc));
-                ret = TRUE;
-            }
-            break;
-        case GDK_Escape:
-            if (cc->state == SP_CONNECTOR_CONTEXT_REROUTING) {
+    if ( cc->mode == SP_CONNECTOR_CONTEXT_DRAWING_MODE )
+    {
+        switch (keyval) {
+            case GDK_Return:
+            case GDK_KP_Enter:
+                if (cc->npoints != 0) {
+                    spcc_connector_finish(cc);
+                    cc->state = SP_CONNECTOR_CONTEXT_IDLE;
+//                    sp_event_context_snap_window_closed(SP_EVENT_CONTEXT(cc));
+                    ret = TRUE;
+                }
+                break;
+            case GDK_Escape:
+                if (cc->state == SP_CONNECTOR_CONTEXT_REROUTING) {
 
-                SPDesktop *desktop = SP_EVENT_CONTEXT_DESKTOP(cc);
-                SPDocument *doc = sp_desktop_document(desktop);
+                    SPDesktop *desktop = SP_EVENT_CONTEXT_DESKTOP(cc);
+                    SPDocument *doc = sp_desktop_document(desktop);
 
-                cc_connector_rerouting_finish(cc, NULL);
+                    cc_connector_rerouting_finish(cc, NULL);
 
-                sp_document_undo(doc);
+                    sp_document_undo(doc);
 
-                cc->state = SP_CONNECTOR_CONTEXT_IDLE;
-                sp_event_context_discard_delayed_snap_event(SP_EVENT_CONTEXT(cc));
-                desktop->messageStack()->flash( Inkscape::NORMAL_MESSAGE,
-                        _("Connector endpoint drag cancelled."));
-                ret = TRUE;
-            }
-            else if (cc->npoints != 0) {
-                // if drawing, cancel, otherwise pass it up for deselecting
-                cc->state = SP_CONNECTOR_CONTEXT_STOP;
-                sp_event_context_discard_delayed_snap_event(SP_EVENT_CONTEXT(cc));
-                spcc_reset_colors(cc);
-                ret = TRUE;
-            }
-            break;
-        default:
-            break;
+                    cc->state = SP_CONNECTOR_CONTEXT_IDLE;
+//                    sp_event_context_snap_window_closed(SP_EVENT_CONTEXT(cc));
+                    desktop->messageStack()->flash( Inkscape::NORMAL_MESSAGE,
+                            _("Connector endpoint drag cancelled."));
+                    ret = TRUE;
+                }
+                else if (cc->npoints != 0) {
+                    // if drawing, cancel, otherwise pass it up for deselecting
+                    cc->state = SP_CONNECTOR_CONTEXT_STOP;
+//                    sp_event_context_snap_window_closed(SP_EVENT_CONTEXT(cc));
+                    spcc_reset_colors(cc);
+                    ret = TRUE;
+                }
+                break;
+            default:
+                break;
+        }
+    }
+    else if ( cc->mode == SP_CONNECTOR_CONTEXT_EDITING_MODE )
+    {
+        switch ( cc->state )
+        {
+            case SP_CONNECTOR_CONTEXT_DRAGGING:
+                if ( keyval == GDK_Escape )
+                {
+                    // Cancel connection point dragging
+
+                    // Obtain original position
+                    ConnectionPoint const& cp = cc->connpthandles[cc->selected_handle];
+                    SPDesktop *desktop = SP_EVENT_CONTEXT_DESKTOP(cc);
+                    const Geom::Matrix& i2doc = sp_item_i2doc_affine(cc->active_shape);
+                    sp_knot_set_position(cc->selected_handle, cp.pos * i2doc * desktop->doc2dt(), 0);
+                    cc->state = SP_CONNECTOR_CONTEXT_IDLE;
+                    desktop->messageStack()->flash( Inkscape::NORMAL_MESSAGE,
+                        _("Connection point drag cancelled."));
+                    ret = TRUE;
+                }
+                else if ( keyval == GDK_Return || keyval == GDK_KP_Enter )
+                {
+                    // Put connection point at current position
+
+                    SPDesktop *desktop = SP_EVENT_CONTEXT_DESKTOP(cc);
+                    SnapManager &m = desktop->namedview->snap_manager;
+                    m.setup(desktop);
+                    Geom::Point p = cc->selected_handle->pos;
+                    SPEventContext* event_context = SP_EVENT_CONTEXT( cc );
+                    
+                    if (!cc->within_tolerance)
+                    {
+//                        sp_event_context_snap_window_open(event_context);
+                        m.freeSnapReturnByRef(Inkscape::SnapPreferences::SNAPPOINT_NODE, p, Inkscape::SNAPSOURCE_HANDLE);
+                        sp_knot_set_position(cc->selected_handle, p, 0);
+//                        sp_event_context_snap_window_closed(event_context);
+                        ConnectionPoint& cp = cc->connpthandles[cc->selected_handle];
+                        cp.pos = p * sp_item_dt2i_affine(cc->active_shape);
+                        cc->active_shape->avoidRef->updateConnectionPoint(cp);
+                    }
+
+                    cc->state = SP_CONNECTOR_CONTEXT_IDLE;
+                    ret = TRUE;
+                }
+                break;
+            case SP_CONNECTOR_CONTEXT_NEWCONNPOINT:
+                if ( keyval == GDK_Escape )
+                {
+                    // Just destroy the knot
+                    g_object_unref( cc->selected_handle );
+                    cc->selected_handle = NULL;
+                    cc->state = SP_CONNECTOR_CONTEXT_IDLE;
+                    ret = TRUE;
+                }
+                else if ( keyval == GDK_Return || keyval == GDK_KP_Enter )
+                {
+                    SPDesktop *desktop = SP_EVENT_CONTEXT_DESKTOP(cc);
+                    SPDocument *doc = sp_desktop_document(desktop);
+                    SnapManager &m = desktop->namedview->snap_manager;
+                    m.setup(desktop);
+                    Geom::Point p = cc->selected_handle->pos;
+                    SPEventContext* event_context = SP_EVENT_CONTEXT( cc );
+                    
+//                    sp_event_context_snap_window_open( event_context );
+                    m.freeSnapReturnByRef(Inkscape::SnapPreferences::SNAPPOINT_NODE, p, Inkscape::SNAPSOURCE_HANDLE);
+                    
+                    sp_knot_set_position(cc->selected_handle, p, 0);
+//                    sp_event_context_snap_window_closed(event_context);
+
+                    ConnectionPoint cp;
+                    cp.type = ConnPointUserDefined;
+                    cp.pos = p * sp_item_dt2i_affine(cc->active_shape);
+                    cp.dir = Avoid::ConnDirAll;
+                    g_object_unref(cc->selected_handle);
+                    cc->active_shape->avoidRef->addConnectionPoint(cp);
+                    sp_document_ensure_up_to_date(doc);
+                    for (ConnectionPointMap::iterator it = cc->connpthandles.begin(); it != cc->connpthandles.end(); ++it)
+                        if (it->second.type == ConnPointUserDefined && it->second.id == cp.id)
+                        {
+                            cc->selected_handle = it->first;
+                            break;
+                        }
+                    cc_select_handle( cc->selected_handle );
+                    cc->state = SP_CONNECTOR_CONTEXT_IDLE;
+                    ret = TRUE;
+                }
+
+                break;
+            case SP_CONNECTOR_CONTEXT_IDLE:
+                if ( keyval == GDK_Delete && cc->selected_handle )
+                {
+                    cc->active_shape->avoidRef->deleteConnectionPoint(cc->connpthandles[cc->selected_handle]);
+                    cc->selected_handle = NULL;
+                    ret = TRUE;
+                }
+                
+                break;
+        }
     }
+
     return ret;
 }
 
@@ -818,7 +1300,7 @@ cc_connector_rerouting_finish(SPConnectorContext *const cc, Geom::Point *const p
         }
     }
     cc->clickeditem->setHidden(false);
-    sp_conn_adjust_path(SP_PATH(cc->clickeditem));
+    sp_conn_reroute_path_immediate(SP_PATH(cc->clickeditem));
     cc->clickeditem->updateRepr();
     sp_document_done(doc, SP_VERB_CONTEXT_CONNECTOR,
                      _("Reroute connector"));
@@ -863,25 +1345,20 @@ spcc_connector_set_subsequent_point(SPConnectorContext *const cc, Geom::Point co
 
     if (!cc->newConnRef) {
         Avoid::Router *router = sp_desktop_document(dt)->router;
-        cc->newConnRef = new Avoid::ConnRef(router, 0, src, dst);
-        cc->newConnRef->updateEndPoint(Avoid::VertID::src, src);
+        cc->newConnRef = new Avoid::ConnRef(router);
+        cc->newConnRef->setEndpoint(Avoid::VertID::src, src);
+        if (cc->isOrthogonal)
+            cc->newConnRef->setRoutingType(Avoid::ConnType_Orthogonal);
+        else
+            cc->newConnRef->setRoutingType(Avoid::ConnType_PolyLine);
     }
-    cc->newConnRef->updateEndPoint(Avoid::VertID::tar, dst);
-
+    // Set new endpoint.
+    cc->newConnRef->setEndpoint(Avoid::VertID::tar, dst);
+    // Immediately generate new routes for connector.
     cc->newConnRef->makePathInvalid();
-    cc->newConnRef->generatePath(src, dst);
-
-    Avoid::PolyLine route = cc->newConnRef->route();
-    cc->newConnRef->calcRouteDist();
-
-    cc->red_curve->reset();
-    Geom::Point pt(route.ps[0].x, route.ps[0].y);
-    cc->red_curve->moveto(pt);
-
-    for (int i = 1; i < route.pn; ++i) {
-        Geom::Point p(route.ps[i].x, route.ps[i].y);
-        cc->red_curve->lineto(p);
-    }
+    cc->newConnRef->router()->processTransaction();
+    // Recreate curve from libavoid route.
+    recreateCurve( cc->red_curve, cc->newConnRef, cc->curvature );
     cc->red_curve->transform(dt->doc2dt());
     sp_canvas_bpath_set_bpath(SP_CANVAS_BPATH(cc->red_bpath), cc->red_curve);
 }
@@ -953,14 +1430,13 @@ spcc_flush_white(SPConnectorContext *cc, SPCurve *gc)
 
         /* Attach repr */
         cc->newconn = SP_ITEM(desktop->currentLayer()->appendChildRepr(repr));
-        cc->selection->set(repr);
-        Inkscape::GC::release(repr);
         cc->newconn->transform = sp_item_i2doc_affine(SP_ITEM(desktop->currentLayer())).inverse();
-        cc->newconn->updateRepr();
 
         bool connection = false;
         sp_object_setAttribute(cc->newconn, "inkscape:connector-type",
-                "polyline", false);
+                cc->isOrthogonal ? "orthogonal" : "polyline", false);
+        sp_object_setAttribute(cc->newconn, "inkscape:connector-curvature",
+                Glib::Ascii::dtostr(cc->curvature).c_str(), false);
         if (cc->sid)
         {
             sp_object_setAttribute(cc->newconn, "inkscape:connection-start",
@@ -974,19 +1450,27 @@ spcc_flush_white(SPConnectorContext *cc, SPCurve *gc)
                     cc->eid, false);
             connection = true;
         }
+        // Process pending updates.
         cc->newconn->updateRepr();
+        sp_document_ensure_up_to_date(doc);
+        
         if (connection) {
             // Adjust endpoints to shape edge.
-            sp_conn_adjust_path(SP_PATH(cc->newconn));
+            sp_conn_reroute_path_immediate(SP_PATH(cc->newconn));
+            cc->newconn->updateRepr();
         }
-        cc->newconn->updateRepr();
+
+        // Only set the selection after we are finished with creating the attributes of
+        // the connector.  Otherwise, the selection change may alter the defaults for 
+        // values like curvature in the connector context, preventing subsequent lookup
+        // of their original values.
+        cc->selection->set(repr);
+        Inkscape::GC::release(repr);
     }
 
     c->unref();
 
-    /* Flush pending updates */
     sp_document_done(doc, SP_VERB_CONTEXT_CONNECTOR, _("Create connector"));
-    sp_document_ensure_up_to_date(doc);
 }
 
 
@@ -1036,16 +1520,16 @@ cc_generic_knot_handler(SPCanvasItem *, GdkEvent *event, SPKnot *knot)
 
     gboolean consumed = FALSE;
 
+    gchar* knot_tip = knot->tip ? knot->tip : cc->knot_tip;
     switch (event->type) {
         case GDK_ENTER_NOTIFY:
             sp_knot_set_flag(knot, SP_KNOT_MOUSEOVER, TRUE);
 
             cc->active_handle = knot;
-
-            if (knot->tip)
+            if (knot_tip)
             {
                 knot->desktop->event_context->defaultMessageContext()->set(
-                        Inkscape::NORMAL_MESSAGE, knot->tip);
+                        Inkscape::NORMAL_MESSAGE, knot_tip);
             }
 
             consumed = TRUE;
@@ -1055,7 +1539,7 @@ cc_generic_knot_handler(SPCanvasItem *, GdkEvent *event, SPKnot *knot)
 
             cc->active_handle = NULL;
 
-            if (knot->tip) {
+            if (knot_tip) {
                 knot->desktop->event_context->defaultMessageContext()->clear();
             }
 
@@ -1087,6 +1571,7 @@ endpt_handler(SPKnot */*knot*/, GdkEvent *event, SPConnectorContext *cc)
                 cc->clickedhandle = cc->active_handle;
                 cc_clear_active_conn(cc);
                 cc->state = SP_CONNECTOR_CONTEXT_REROUTING;
+//                sp_event_context_snap_window_open(SP_EVENT_CONTEXT(cc));
 
                 // Disconnect from attached shape
                 unsigned ind = (cc->active_handle == cc->endpt_handle[0]) ? 0 : 1;
@@ -1101,7 +1586,7 @@ endpt_handler(SPKnot */*knot*/, GdkEvent *event, SPConnectorContext *cc)
                 }
 
                 // Show the red path for dragging.
-                cc->red_curve = SP_PATH(cc->clickeditem)->curve->copy();
+                cc->red_curve = SP_PATH(cc->clickeditem)->original_curve ? SP_PATH(cc->clickeditem)->original_curve->copy() : SP_PATH(cc->clickeditem)->curve->copy();
                 Geom::Matrix i2d = sp_item_i2d_affine(cc->clickeditem);
                 cc->red_curve->transform(i2d);
                 sp_canvas_bpath_set_bpath(SP_CANVAS_BPATH(cc->red_bpath), cc->red_curve);
@@ -1120,38 +1605,9 @@ endpt_handler(SPKnot */*knot*/, GdkEvent *event, SPConnectorContext *cc)
     return consumed;
 }
 
-
-static void cc_set_active_shape(SPConnectorContext *cc, SPItem *item)
+static void cc_active_shape_add_knot(SPDesktop* desktop, SPItem* item, ConnectionPointMap &cphandles, ConnectionPoint& cp)
 {
-    g_assert(item != NULL );
-
-    cc->active_shape = item;
-
-    // Remove existing active shape listeners
-    if (cc->active_shape_repr) {
-        sp_repr_remove_listener_by_data(cc->active_shape_repr, cc);
-        Inkscape::GC::release(cc->active_shape_repr);
-
-        sp_repr_remove_listener_by_data(cc->active_shape_layer_repr, cc);
-        Inkscape::GC::release(cc->active_shape_layer_repr);
-    }
-
-    // Listen in case the active shape changes
-    cc->active_shape_repr = SP_OBJECT_REPR(item);
-    if (cc->active_shape_repr) {
-        Inkscape::GC::anchor(cc->active_shape_repr);
-        sp_repr_add_listener(cc->active_shape_repr, &shape_repr_events, cc);
-
-        cc->active_shape_layer_repr = cc->active_shape_repr->parent();
-        Inkscape::GC::anchor(cc->active_shape_layer_repr);
-        sp_repr_add_listener(cc->active_shape_layer_repr, &layer_repr_events, cc);
-    }
-
-
-    // Set center connection point.
-    if ( cc->connpthandle == NULL ) {
-        SPKnot *knot = sp_knot_new(cc->desktop,
-                _("<b>Connection point</b>: click or drag to create a new connector"));
+        SPKnot *knot = sp_knot_new(desktop, 0);
 
         knot->setShape(SP_KNOT_SHAPE_SQUARE);
         knot->setSize(8);
@@ -1159,26 +1615,127 @@ static void cc_set_active_shape(SPConnectorContext *cc, SPItem *item)
         knot->setFill(0xffffff00, 0xff0000ff, 0xff0000ff);
         sp_knot_update_ctrl(knot);
 
-        // We don't want to use the standard knot handler,
-        //since we don't want this knot to be draggable.
+        // We don't want to use the standard knot handler.
         g_signal_handler_disconnect(G_OBJECT(knot->item),
                 knot->_event_handler_id);
         knot->_event_handler_id = 0;
 
         gtk_signal_connect(GTK_OBJECT(knot->item), "event",
                 GTK_SIGNAL_FUNC(cc_generic_knot_handler), knot);
+        sp_knot_set_position(knot, item->avoidRef->getConnectionPointPos(cp.type, cp.id) * desktop->doc2dt(), 0);
+        sp_knot_show(knot);
+        cphandles[knot] = cp;
+}
+
+static void cc_set_active_shape(SPConnectorContext *cc, SPItem *item)
+{
+    g_assert(item != NULL );
+    
+    std::map<int, ConnectionPoint>* connpts = &item->avoidRef->connection_points;
+
+    if (cc->active_shape != item)
+    {
+        // The active shape has changed
+        // Rebuild everything
+        cc->active_shape = item;
+        // Remove existing active shape listeners
+        if (cc->active_shape_repr) {
+            sp_repr_remove_listener_by_data(cc->active_shape_repr, cc);
+            Inkscape::GC::release(cc->active_shape_repr);
+
+            sp_repr_remove_listener_by_data(cc->active_shape_layer_repr, cc);
+            Inkscape::GC::release(cc->active_shape_layer_repr);
+        }
+
+        // Listen in case the active shape changes
+        cc->active_shape_repr = SP_OBJECT_REPR(item);
+        if (cc->active_shape_repr) {
+            Inkscape::GC::anchor(cc->active_shape_repr);
+            sp_repr_add_listener(cc->active_shape_repr, &shape_repr_events, cc);
+
+            cc->active_shape_layer_repr = cc->active_shape_repr->parent();
+            Inkscape::GC::anchor(cc->active_shape_layer_repr);
+            sp_repr_add_listener(cc->active_shape_layer_repr, &layer_repr_events, cc);
+        }
 
-        cc->connpthandle = knot;
+
+        // Set the connection points.
+        if ( cc->connpthandles.size() )
+            // destroy the old list
+            while (! cc->connpthandles.empty() )
+            {
+                g_object_unref(cc->connpthandles.begin()->first);
+                cc->connpthandles.erase(cc->connpthandles.begin());
+            }
+        // build the new one
+        if ( connpts->size() )
+        for (std::map<int, ConnectionPoint>::iterator it = connpts->begin(); it != connpts->end(); ++it)
+            cc_active_shape_add_knot(cc->desktop, item, cc->connpthandles, it->second);
+        
+        // Also add default connection points
+        // For now, only centre default connection point will
+        // be available
+        ConnectionPoint centre;
+        centre.type = ConnPointDefault;
+        centre.id = ConnPointPosCC;
+        cc_active_shape_add_knot(cc->desktop, item, cc->connpthandles, centre);
     }
+    else
+    {
+        // The active shape didn't change
+        // Update only the connection point knots
 
+        // Ensure the item's connection_points map
+        // has been updated
+        sp_document_ensure_up_to_date(SP_OBJECT_DOCUMENT(item));
 
-    Geom::OptRect bbox = sp_item_bbox_desktop(cc->active_shape);
-    if (bbox) {
-        Geom::Point center = bbox->midpoint();
-        sp_knot_set_position(cc->connpthandle, center, 0);
-        sp_knot_show(cc->connpthandle);
-    } else {
-        sp_knot_hide(cc->connpthandle);
+        std::set<int> seen;
+        for  ( ConnectionPointMap::iterator it = cc->connpthandles.begin(); it != cc->connpthandles.end() ;)
+        {
+            bool removed = false;
+            if ( it->second.type == ConnPointUserDefined )
+            {
+                std::map<int, ConnectionPoint>::iterator p = connpts->find(it->second.id);
+                if (p != connpts->end())
+                {
+                    if ( it->second != p->second )
+                        // Connection point position has changed
+                        // Update knot position
+                        sp_knot_set_position(it->first,
+                                             item->avoidRef->getConnectionPointPos(it->second.type, it->second.id) * cc->desktop->doc2dt(), 0);
+                    seen.insert(it->second.id);
+                    sp_knot_show(it->first);
+                }
+                else
+                {
+                    // This connection point does no longer exist,
+                    // remove the knot
+                    ConnectionPointMap::iterator curr = it;
+                    ++it;
+                    g_object_unref( curr->first );
+                    cc->connpthandles.erase(curr);
+                    removed = true;
+                }
+            }
+            else
+            {
+                // It's a default connection point
+                // Just make sure it's position is correct
+                sp_knot_set_position(it->first,
+                                     item->avoidRef->getConnectionPointPos(it->second.type, it->second.id) * cc->desktop->doc2dt(), 0);
+                sp_knot_show(it->first);
+
+            }
+            if ( !removed )
+                ++it;
+        }
+        // Add knots for new connection points.
+        if (connpts->size())
+            for ( std::map<int, ConnectionPoint>::iterator it = connpts->begin(); it != connpts->end(); ++it )
+                if ( seen.find(it->first) == seen.end() )
+                    // A new connection point has been added
+                    // to the shape. Add a knot for it.
+                    cc_active_shape_add_knot(cc->desktop, item, cc->connpthandles, it->second);
     }
 }
 
@@ -1188,7 +1745,7 @@ cc_set_active_conn(SPConnectorContext *cc, SPItem *item)
 {
     g_assert( SP_IS_PATH(item) );
 
-    SPCurve *curve = SP_SHAPE(SP_PATH(item))->curve;
+    SPCurve *curve = SP_PATH(item)->original_curve ? SP_PATH(item)->original_curve : SP_PATH(item)->curve;
     Geom::Matrix i2d = sp_item_i2d_affine(item);
 
     if (cc->active_conn == item)
@@ -1234,7 +1791,7 @@ cc_set_active_conn(SPConnectorContext *cc, SPItem *item)
             sp_knot_update_ctrl(knot);
 
             // We don't want to use the standard knot handler,
-            //since we don't want this knot to be draggable.
+            // since we don't want this knot to be draggable.
             g_signal_handler_disconnect(G_OBJECT(knot->item),
                     knot->_event_handler_id);
             knot->_event_handler_id = 0;
@@ -1271,6 +1828,35 @@ cc_set_active_conn(SPConnectorContext *cc, SPItem *item)
     sp_knot_show(cc->endpt_handle[1]);
 }
 
+void cc_create_connection_point(SPConnectorContext* cc)
+{
+    if (cc->active_shape && cc->state == SP_CONNECTOR_CONTEXT_IDLE)
+    {
+        if (cc->selected_handle)
+        {
+            cc_deselect_handle( cc->selected_handle );
+        }
+        SPKnot *knot = sp_knot_new(cc->desktop, 0);
+        // We do not process events on this knot.
+        g_signal_handler_disconnect(G_OBJECT(knot->item),
+                                    knot->_event_handler_id);
+        knot->_event_handler_id = 0;
+
+        cc_select_handle( knot );
+        cc->selected_handle = knot;
+        sp_knot_show(cc->selected_handle);
+        cc->state = SP_CONNECTOR_CONTEXT_NEWCONNPOINT;
+    }
+}
+
+void cc_remove_connection_point(SPConnectorContext* cc)
+{
+    if (cc->selected_handle && cc->state == SP_CONNECTOR_CONTEXT_IDLE )
+    {
+        cc->active_shape->avoidRef->deleteConnectionPoint(cc->connpthandles[cc->selected_handle]);
+        cc->selected_handle = NULL;
+    }
+}
 
 static bool cc_item_is_shape(SPItem *item)
 {
@@ -1296,7 +1882,7 @@ bool cc_item_is_connector(SPItem *item)
 {
     if (SP_IS_PATH(item)) {
         if (SP_PATH(item)->connEndPair.isAutoRoutingConn()) {
-            g_assert( !(SP_SHAPE(item)->curve->is_closed()) );
+            g_assert( SP_PATH(item)->original_curve ? !(SP_PATH(item)->original_curve->is_closed()) : !(SP_PATH(item)->curve->is_closed()) );
             return true;
         }
     }
@@ -1394,7 +1980,7 @@ shape_event_attr_changed(Inkscape::XML::Node *repr, gchar const *name,
     g_assert(data);
     SPConnectorContext *cc = SP_CONNECTOR_CONTEXT(data);
 
-    // Look for changes than result in onscreen movement.
+    // Look for changes that result in onscreen movement.
     if (!strcmp(name, "d") || !strcmp(name, "x") || !strcmp(name, "y") ||
             !strcmp(name, "width") || !strcmp(name, "height") ||
             !strcmp(name, "transform"))
@@ -1409,6 +1995,12 @@ shape_event_attr_changed(Inkscape::XML::Node *repr, gchar const *name,
             cc_set_active_conn(cc, cc->active_conn);
         }
     }
+    else
+        if ( !strcmp(name, "inkscape:connection-points") )
+            if (repr == cc->active_shape_repr)
+                // The connection points of the active shape
+                // have changed. Update them.
+                cc_set_active_shape(cc, cc->active_shape);
 }
 
 
index d67e12b8134b8534f81078ebd231a4a0392171e7..640a03aaea67d8848439fc9009ed91fbaf17590b 100644 (file)
@@ -19,7 +19,8 @@
 #include <display/display-forward.h>
 #include <2geom/point.h>
 #include "libavoid/connector.h"
-
+#include "connection-points.h"
+#include <glibmm/i18n.h>
 
 #define SP_TYPE_CONNECTOR_CONTEXT (sp_connector_context_get_type())
 #define SP_CONNECTOR_CONTEXT(o) (G_TYPE_CHECK_INSTANCE_CAST((o), SP_TYPE_CONNECTOR_CONTEXT, SPConnectorContext))
@@ -38,9 +39,18 @@ enum {
     SP_CONNECTOR_CONTEXT_DRAGGING,
     SP_CONNECTOR_CONTEXT_CLOSE,
     SP_CONNECTOR_CONTEXT_STOP,
-    SP_CONNECTOR_CONTEXT_REROUTING
+    SP_CONNECTOR_CONTEXT_REROUTING,
+    SP_CONNECTOR_CONTEXT_NEWCONNPOINT
+};
+
+enum {
+    SP_CONNECTOR_CONTEXT_DRAWING_MODE,
+    SP_CONNECTOR_CONTEXT_EDITING_MODE
 };
+static char* cc_knot_tips[] = { _("<b>Connection point</b>: click or drag to create a new connector"),
+                           _("<b>Connection point</b>: click to select, drag to move") };
 
+typedef std::map<SPKnot *, ConnectionPoint>  ConnectionPointMap;
 
 struct SPConnectorContext : public SPEventContext {
     Inkscape::Selection *selection;
@@ -48,10 +58,14 @@ struct SPConnectorContext : public SPEventContext {
 
     /** \invar npoints in {0, 2}. */
     gint npoints;
-
+    /* The tool mode can be connector drawing or
+       connection points editing.
+    */
     unsigned int mode : 1;
     unsigned int state : 4;
 
+    gchar* knot_tip;
+
     // Red curve
     SPCanvasItem *red_bpath;
     SPCurve *red_curve;
@@ -63,6 +77,8 @@ struct SPConnectorContext : public SPEventContext {
     // The new connector
     SPItem *newconn;
     Avoid::ConnRef *newConnRef;
+    gdouble curvature;
+    bool isOrthogonal;
     
     // The active shape
     SPItem *active_shape;
@@ -78,10 +94,13 @@ struct SPConnectorContext : public SPEventContext {
     // The activehandle
     SPKnot *active_handle;
 
+    // The selected handle, used in editing mode
+    SPKnot *selected_handle;
+
     SPItem *clickeditem;
     SPKnot *clickedhandle;
     
-    SPKnot *connpthandle;
+    ConnectionPointMap connpthandles;
     SPKnot *endpt_handle[2];
     guint  endpt_handler_id[2];
     gchar *sid;
@@ -93,7 +112,10 @@ struct SPConnectorContextClass : public SPEventContextClass { };
 
 GType sp_connector_context_get_type();
 
+void sp_connector_context_switch_mode(SPEventContext* ec, unsigned int newMode);
 void cc_selection_set_avoid(bool const set_ignore);
+void cc_create_connection_point(SPConnectorContext* cc);
+void cc_remove_connection_point(SPConnectorContext* cc);
 bool cc_item_is_connector(SPItem *item);
 
 
index d406f3712d4ba2cf7a483efe3bf2449b0839c0d4..a3ad6f7beb1486a4bc236e6d0ff44213b2d89ef5 100644 (file)
 #include "xml/repr.h"
 #include "xml/rebase-hrefs.h"
 
-#define SP_DOCUMENT_UPDATE_PRIORITY (G_PRIORITY_HIGH_IDLE - 1)
+// Higher number means lower priority.
+#define SP_DOCUMENT_UPDATE_PRIORITY (G_PRIORITY_HIGH_IDLE - 2)
+
+// Should have a lower priority than SP_DOCUMENT_UPDATE_PRIORITY,
+// since we want it to happen when there are no more updates.
+#define SP_DOCUMENT_REROUTING_PRIORITY (G_PRIORITY_HIGH_IDLE - 1)
 
 
 static gint sp_document_idle_handler(gpointer data);
+static gint sp_document_rerouting_handler(gpointer data);
 
 gboolean sp_document_resource_list_free(gpointer key, gpointer value, gpointer data);
 
@@ -88,15 +94,17 @@ SPDocument::SPDocument() :
     priv(0), // reset in ctor
     actionkey(0),
     modified_id(0),
+    rerouting_handler_id(0),
     profileManager(0), // deferred until after other initialization
-    router(new Avoid::Router()),
+    router(new Avoid::Router(Avoid::PolyLineRouting|Avoid::OrthogonalRouting)),
     perspectives(0),
     current_persp3d(0),
     _collection_queue(0),
     oldSignalsConnected(false)
 {
-    // Don't use the Consolidate moves optimisation.
-    router->ConsolidateMoves = false;
+    // Penalise libavoid for choosing paths with needless extra segments.
+    // This results in much better looking orthogonal connector paths.
+    router->setRoutingPenalty(Avoid::segmentPenalty);
 
     SPDocumentPrivate *p = new SPDocumentPrivate();
 
@@ -132,6 +140,11 @@ SPDocument::~SPDocument() {
         profileManager = 0;
     }
 
+    if (router) {
+        delete router;
+        router = NULL;
+    }
+
     if (priv) {
         if (priv->partial) {
             sp_repr_free_log(priv->partial);
@@ -177,10 +190,15 @@ SPDocument::~SPDocument() {
     }
 
     if (modified_id) {
-        gtk_idle_remove(modified_id);
+        g_source_remove(modified_id);
         modified_id = 0;
     }
 
+    if (rerouting_handler_id) {
+        g_source_remove(rerouting_handler_id);
+        rerouting_handler_id = 0;
+    }
+
     if (oldSignalsConnected) {
         g_signal_handlers_disconnect_by_func(G_OBJECT(INKSCAPE),
                                              reinterpret_cast<gpointer>(sp_document_reset_key),
@@ -195,13 +213,7 @@ SPDocument::~SPDocument() {
         keepalive = FALSE;
     }
 
-    if (router) {
-        delete router;
-        router = NULL;
-    }
-
     //delete this->_whiteboard_session_manager;
-
 }
 
 void SPDocument::add_persp3d (Persp3D * const /*persp*/)
@@ -852,7 +864,12 @@ void
 sp_document_request_modified(SPDocument *doc)
 {
     if (!doc->modified_id) {
-        doc->modified_id = gtk_idle_add_priority(SP_DOCUMENT_UPDATE_PRIORITY, sp_document_idle_handler, doc);
+        doc->modified_id = g_idle_add_full(SP_DOCUMENT_UPDATE_PRIORITY, 
+                sp_document_idle_handler, doc, NULL);
+    }
+    if (!doc->rerouting_handler_id) {
+        doc->rerouting_handler_id = g_idle_add_full(SP_DOCUMENT_REROUTING_PRIORITY, 
+                sp_document_rerouting_handler, doc, NULL);
     }
 }
 
@@ -908,26 +925,49 @@ SPDocument::_updateDocument()
  * Repeatedly works on getting the document updated, since sometimes
  * it takes more than one pass to get the document updated.  But it
  * usually should not take more than a few loops, and certainly never
- * more than 64 iterations.  So we bail out if we hit 64 iterations,
+ * more than 32 iterations.  So we bail out if we hit 32 iterations,
  * since this typically indicates we're stuck in an update loop.
  */
 gint
 sp_document_ensure_up_to_date(SPDocument *doc)
 {
-    int counter = 64;
-    while (!doc->_updateDocument()) {
-        if (counter == 0) {
-            g_warning("More than 64 iteration while updating document '%s'", doc->uri? doc->uri:"<unknown URI, probably clipboard>");
+    // Bring the document up-to-date, specifically via the following:
+    //   1a) Process all document updates.
+    //   1b) When completed, process connector routing changes.
+    //   2a) Process any updates resulting from connector reroutings.
+    int counter = 32;
+    for (unsigned int pass = 1; pass <= 2; ++pass) {
+        // Process document updates.
+        while (!doc->_updateDocument()) {
+            if (counter == 0) {
+                g_warning("More than 32 iteration while updating document '%s'", doc->uri);
+                break;
+            }
+            counter--;
+        }
+        if (counter == 0)
+        {
             break;
         }
-        counter--;
-    }
 
+        // After updates on the first pass we get libavoid to process all the 
+        // changed objects and provide new routings.  This may cause some objects
+            // to be modified, hence the second update pass.
+        if (pass == 1) {
+            doc->router->processTransaction();
+        }
+    }
+    
     if (doc->modified_id) {
         /* Remove handler */
-        gtk_idle_remove(doc->modified_id);
+        g_source_remove(doc->modified_id);
         doc->modified_id = 0;
     }
+    if (doc->rerouting_handler_id) {
+        /* Remove handler */
+        g_source_remove(doc->rerouting_handler_id);
+        doc->rerouting_handler_id = 0;
+    }
     return counter>0;
 }
 
@@ -947,6 +987,24 @@ sp_document_idle_handler(gpointer data)
     }
 }
 
+/**
+ * An idle handler to reroute connectors in the document.  
+ */
+static gint
+sp_document_rerouting_handler(gpointer data)
+{
+    // Process any queued movement actions and determine new routings for 
+    // object-avoiding connectors.  Callbacks will be used to update and 
+    // redraw affected connectors.
+    SPDocument *doc = static_cast<SPDocument *>(data);
+    doc->router->processTransaction();
+    
+    // We don't need to handle rerouting again until there are further 
+    // diagram updates.
+    doc->rerouting_handler_id = 0;
+    return false;
+}
+
 static bool is_within(Geom::Rect const &area, Geom::Rect const &box)
 {
     return area.contains(box);
index 789e3e2ed7b55dc702c781e03bdd0d7033a83e1a..06174c265f593b402151200b2fcb2e6a221f6c26 100644 (file)
@@ -98,6 +98,9 @@ struct SPDocument : public Inkscape::GC::Managed<>,
     const gchar *actionkey;
     /// Handler ID
     guint modified_id;
+    
+    /// Connector rerouting handler ID
+    guint rerouting_handler_id;
 
     Inkscape::ProfileManager* profileManager;
 
index cd1683c343d68481c28da4ecd6c7b8c4cd9d1d2d..81ea590598397ba993e4163abb4b6e456dcad680 100644 (file)
@@ -31,6 +31,7 @@
 #include "style.h"
 #include "conn-avoid-ref.h"
 #include "libavoid/connector.h"
+#include "libavoid/router.h"
 #include "libavoid/geomtypes.h"
 #include "libcola/cola.h"
 #include "libvpsc/generate-constraints.h"
index df532c5644da63485ce2bc7bdf206027905ce4f7..3f408074c733df6fdd8465921bbb2f05afc527f6 100644 (file)
@@ -11,6 +11,8 @@ static.cpp
 timer.cpp
 vertices.cpp
 visibility.cpp
+orthogonal.cpp
+vpsc.cpp
 )
 ADD_LIBRARY(avoid STATIC ${libavoid_SRC})
 TARGET_LINK_LIBRARIES(avoid
index f75470e26e1fde5b9f17cc49b378bbead8cc2d06..77728499c978c030245e9017a529c5f4a80c4bd7 100644 (file)
@@ -11,24 +11,26 @@ libavoid_libavoid_a_SOURCES =       \
        libavoid/debug.h        \
        libavoid/geometry.cpp   \
        libavoid/geometry.h     \
+       libavoid/geomtypes.cpp  \
        libavoid/geomtypes.h    \
        libavoid/graph.cpp      \
        libavoid/graph.h        \
        libavoid/makepath.cpp   \
        libavoid/makepath.h     \
-       libavoid/polyutil.cpp   \
-       libavoid/polyutil.h     \
+       libavoid/orthogonal.cpp \
+       libavoid/orthogonal.h   \
+       libavoid/vpsc.cpp       \
+       libavoid/vpsc.h         \
        libavoid/router.cpp     \
        libavoid/router.h       \
        libavoid/shape.cpp      \
        libavoid/shape.h        \
-       libavoid/static.cpp     \
-       libavoid/static.h       \
        libavoid/timer.cpp      \
        libavoid/timer.h        \
        libavoid/vertices.cpp   \
        libavoid/vertices.h     \
        libavoid/visibility.cpp \
        libavoid/visibility.h   \
-       libavoid/libavoid.h     \
-       libavoid/region.h
+       libavoid/viscluster.cpp \
+       libavoid/viscluster.h   \
+       libavoid/libavoid.h
index 6473033718981abbd7a53bb0c627bacbed8e8102..d9088dfe712f7a13875e9be7306d44f3fd84a434 100644 (file)
  * vim: ts=4 sw=4 et tw=0 wm=0
  *
  * libavoid - Fast, Incremental, Object-avoiding Line Router
- * Copyright (C) 2004-2006  Michael Wybrow <mjwybrow@users.sourceforge.net>
+ *
+ * Copyright (C) 2004-2009  Monash University
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
+ * See the file LICENSE.LGPL distributed with the library.
+ *
+ * Licensees holding a valid commercial license may use this file in
+ * accordance with the commercial license agreement provided with the 
+ * library.
  *
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
  *
+ * Author(s):   Michael Wybrow <mjwybrow@users.sourceforge.net>
 */
 
+
+#include <cstring>
+#include <cfloat>
+#include <cmath>
 #include <cstdlib>
+
 #include "libavoid/graph.h"
 #include "libavoid/connector.h"
 #include "libavoid/makepath.h"
 #include "libavoid/visibility.h"
 #include "libavoid/debug.h"
 #include "libavoid/router.h"
+#include "libavoid/assertions.h"
 
 
 namespace Avoid {
 
+    
+ConnEnd::ConnEnd(const Point& point) 
+    : _point(point),
+      _directions(ConnDirAll),
+      _shapeRef(NULL)
+{
+}
+
+
+ConnEnd::ConnEnd(const Point& point, const ConnDirFlags visDirs) 
+    : _point(point),
+      _directions(visDirs),
+      _shapeRef(NULL)
+{
+}
+
+ConnEnd::ConnEnd(ShapeRef *shapeRef, const double x_pos, const double y_pos,
+        const double insideOffset, const ConnDirFlags visDirs) 
+    : _directions(visDirs),
+      _shapeRef(shapeRef),
+      _xPosition(x_pos),
+      _yPosition(y_pos),
+      _insideOffset(insideOffset)
+{
+}
+
+const Point ConnEnd::point(void) const
+{
+    if (_shapeRef)
+    {
+        const Polygon& poly = _shapeRef->polygon();
+
+        double x_min = DBL_MAX;
+        double x_max = -DBL_MAX;
+        double y_min = DBL_MAX;
+        double y_max = -DBL_MAX;
+        for (size_t i = 0; i < poly.size(); ++i)
+        {
+            x_min = std::min(x_min, poly.ps[i].x);
+            x_max = std::max(x_max, poly.ps[i].x);
+            y_min = std::min(y_min, poly.ps[i].y);
+            y_max = std::max(y_max, poly.ps[i].y);
+        }
+
+        Point point;
+
+        // We want to place connection points on the edges of shapes, 
+        // or possibly slightly inside them (if _insideOfset is set).
+
+        point.vn = kUnassignedVertexNumber;
+        if (_xPosition == ATTACH_POS_LEFT)
+        {
+            point.x = x_min + _insideOffset;
+            point.vn = 6;
+        }
+        else if (_xPosition == ATTACH_POS_RIGHT)
+        {
+            point.x = x_max - _insideOffset;
+            point.vn = 4;
+        }
+        else
+        {
+            point.x = x_min + (_xPosition * (x_max - x_min));
+        }
+
+        if (_yPosition == ATTACH_POS_TOP)
+        {
+            point.y = y_max - _insideOffset;
+            point.vn = 5;
+        }
+        else if (_yPosition == ATTACH_POS_BOTTOM)
+        {
+            point.y = y_min + _insideOffset;
+            point.vn = 7;
+        }
+        else
+        {
+            point.y = y_min + (_yPosition * (y_max - y_min));
+            point.vn = kUnassignedVertexNumber;
+        }
+
+        return point;
+    }
+    else
+    {
+        return _point;
+    }
+}
+
+
+ConnDirFlags ConnEnd::directions(void) const
+{
+    if (_shapeRef)
+    {
+        ConnDirFlags visDir = _directions;
+        if (_directions == ConnDirNone)
+        {
+            // None is set, use the defaults:
+            if (_xPosition == ATTACH_POS_LEFT)
+            {
+                visDir = ConnDirLeft;
+            }
+            else if (_xPosition == ATTACH_POS_RIGHT)
+            {
+                visDir = ConnDirRight;
+            }
+            if (_yPosition == ATTACH_POS_TOP)
+            {
+                visDir = ConnDirDown;
+            }
+            else if (_yPosition == ATTACH_POS_BOTTOM)
+            {
+                visDir = ConnDirUp;
+            }
+
+            if (visDir == ConnDirNone)
+            {
+                visDir = ConnDirAll;
+            }
+        }
+        return visDir;
+    }
+    else
+    {
+        return _directions;
+    }
+}
+
+
 ConnRef::ConnRef(Router *router, const unsigned int id)
-    : _router(router)
-    , _id(id)
-    , _type(ConnType_PolyLine)
-    , _srcId(0)
-    , _dstId(0)
-    , _needs_reroute_flag(true)
-    , _false_path(false)
-    , _active(false)
-    , _route_dist(0)
-    , _srcVert(NULL)
-    , _dstVert(NULL)
-    , _initialised(false)
-    , _callback(NULL)
-    , _connector(NULL)
-    , _hateCrossings(false)
+    : _router(router),
+      _type(router->validConnType()),
+      _srcId(0),
+      _dstId(0),
+      _needs_reroute_flag(true),
+      _false_path(false),
+      _needs_repaint(false),
+      _active(false),
+      _route_dist(0),
+      _srcVert(NULL),
+      _dstVert(NULL),
+      _startVert(NULL),
+      _initialised(false),
+      _callback(NULL),
+      _connector(NULL),
+      _hateCrossings(false)
 {
+    _id = router->assignId(id);
+
     // TODO: Store endpoints and details.
-    _route.pn = 0;
-    _route.ps = NULL;
-}
-
-
-ConnRef::ConnRef(Router *router, const unsigned int id,
-        const Point& src, const Point& dst)
-    : _router(router)
-    , _id(id)
-    , _type(ConnType_PolyLine)
-    , _srcId(0)
-    , _dstId(0)
-    , _needs_reroute_flag(true)
-    , _false_path(false)
-    , _active(false)
-    , _route_dist(0)
-    , _srcVert(NULL)
-    , _dstVert(NULL)
-    , _initialised(false)
-    , _callback(NULL)
-    , _connector(NULL)
-    , _hateCrossings(false)
-{
-    _route.pn = 0;
-    _route.ps = NULL;
-
-    if (_router->IncludeEndpoints)
-    {
-        bool isShape = false;
-        _srcVert = new VertInf(_router, VertID(id, isShape, 1), src);
-        _dstVert = new VertInf(_router, VertID(id, isShape, 2), dst);
-        _router->vertices.addVertex(_srcVert);
-        _router->vertices.addVertex(_dstVert);
-        makeActive();
-        _initialised = true;
-    }
+    _route.clear();
+}
+
+
+ConnRef::ConnRef(Router *router, const ConnEnd& src, const ConnEnd& dst,
+        const unsigned int id)
+    : _router(router),
+      _type(router->validConnType()),
+      _srcId(0),
+      _dstId(0),
+      _needs_reroute_flag(true),
+      _false_path(false),
+      _needs_repaint(false),
+      _active(false),
+      _route_dist(0),
+      _srcVert(NULL),
+      _dstVert(NULL),
+      _initialised(false),
+      _callback(NULL),
+      _connector(NULL),
+      _hateCrossings(false)
+{
+    _id = router->assignId(id);
+    _route.clear();
+
+    bool isShape = false;
+    _srcVert = new VertInf(_router, VertID(_id, isShape, 1), src.point());
+    _srcVert->visDirections = src.directions();
+    _dstVert = new VertInf(_router, VertID(_id, isShape, 2), dst.point());
+    _dstVert->visDirections = dst.directions();
+    makeActive();
+    _initialised = true;
+    
+    setEndpoints(src, dst);
 }
 
 
 ConnRef::~ConnRef()
 {
-    freeRoute();
+    _router->removeQueuedConnectorActions(this);
+    removeFromGraph();
+
+    freeRoutes();
 
     if (_srcVert)
     {
@@ -106,27 +247,38 @@ ConnRef::~ConnRef()
         _dstVert = NULL;
     }
 
-    if (_active)
-    {
-        makeInactive();
-    }
+    makeInactive();
 }
 
 
-void ConnRef::setType(unsigned int type)
+ConnType ConnRef::routingType(void) const
 {
-    _type = type;
+    return _type;
 }
 
 
-void ConnRef::updateEndPoint(const unsigned int type, const Point& point)
+void ConnRef::setRoutingType(ConnType type)
 {
-    assert((type == (unsigned int) VertID::src) ||
-           (type == (unsigned int) VertID::tar));
-    
-    // XXX: This was commented out.  Is there a case where it isn't true? 
-    assert(_router->IncludeEndpoints);
+    type = _router->validConnType(type);
+    if (_type != type)
+    {
+        _type = type;
+
+        makePathInvalid();
+
+        _router->modifyConnector(this);
+    }
+}
 
+
+void ConnRef::common_updateEndPoint(const unsigned int type, const ConnEnd& connEnd)
+{
+    const Point& point = connEnd.point();
+    //db_printf("common_updateEndPoint(%d,(pid=%d,vn=%d,(%f,%f)))\n",
+    //      type,point.id,point.vn,point.x,point.y);
+    COLA_ASSERT((type == (unsigned int) VertID::src) ||
+                (type == (unsigned int) VertID::tar));
+    
     if (!_initialised)
     {
         makeActive();
@@ -141,28 +293,28 @@ void ConnRef::updateEndPoint(const unsigned int type, const Point& point)
     {
         if (_srcVert)
         {
-            _srcVert->Reset(point);
+            _srcVert->Reset(VertID(_id, isShape, type), point);
         }
         else
         {
             _srcVert = new VertInf(_router, VertID(_id, isShape, type), point);
-            _router->vertices.addVertex(_srcVert);
         }
+        _srcVert->visDirections = connEnd.directions();
         
         altered = _srcVert;
         partner = _dstVert;
     }
-    else // if (type == (unsigned int) VertID::dst)
+    else // if (type == (unsigned int) VertID::tar)
     {
         if (_dstVert)
         {
-            _dstVert->Reset(point);
+            _dstVert->Reset(VertID(_id, isShape, type), point);
         }
         else
         {
             _dstVert = new VertInf(_router, VertID(_id, isShape, type), point);
-            _router->vertices.addVertex(_dstVert);
         }
+        _dstVert->visDirections = connEnd.directions();
         
         altered = _dstVert;
         partner = _srcVert;
@@ -171,8 +323,85 @@ void ConnRef::updateEndPoint(const unsigned int type, const Point& point)
     // XXX: Seems to be faster to just remove the edges and recreate
     bool isConn = true;
     altered->removeFromGraph(isConn);
-    bool knownNew = true;
-    vertexVisibility(altered, partner, knownNew, true);
+
+    makePathInvalid();
+    _router->setStaticGraphInvalidated(true);
+}
+
+
+void ConnRef::setEndpoints(const ConnEnd& srcPoint, const ConnEnd& dstPoint)
+{
+    _router->modifyConnector(this, VertID::src, srcPoint);
+    _router->modifyConnector(this, VertID::tar, dstPoint);
+}
+
+
+void ConnRef::setEndpoint(const unsigned int type, const ConnEnd& connEnd)
+{
+    _router->modifyConnector(this, type, connEnd);
+}
+
+
+void ConnRef::setSourceEndpoint(const ConnEnd& srcPoint)
+{
+    _router->modifyConnector(this, VertID::src, srcPoint);
+}
+
+
+void ConnRef::setDestEndpoint(const ConnEnd& dstPoint)
+{
+    _router->modifyConnector(this, VertID::tar, dstPoint);
+}
+
+
+void ConnRef::updateEndPoint(const unsigned int type, const ConnEnd& connEnd)
+{
+    common_updateEndPoint(type, connEnd);
+
+    if (_router->_polyLineRouting)
+    {
+        bool knownNew = true;
+        bool genContains = true;
+        if (type == (unsigned int) VertID::src)
+        {
+            vertexVisibility(_srcVert, _dstVert, knownNew, genContains);
+        }
+        else
+        {
+            vertexVisibility(_dstVert, _srcVert, knownNew, genContains);
+        }
+    }
+}
+
+
+bool ConnRef::setEndpoint(const unsigned int type, const VertID& pointID,
+        Point *pointSuggestion)
+{
+    VertInf *vInf = _router->vertices.getVertexByID(pointID);
+    if (vInf == NULL)
+    {
+        return false;
+    }
+    Point& point = vInf->point;
+    if (pointSuggestion)
+    {
+        if (euclideanDist(point, *pointSuggestion) > 0.5)
+        {
+            return false;
+        }
+    }
+
+    common_updateEndPoint(type, point);
+
+    // Give this visibility just to the point it is over.
+    EdgeInf *edge = new EdgeInf(
+            (type == VertID::src) ? _srcVert : _dstVert, vInf);
+    // XXX: We should be able to set this to zero, but can't due to 
+    //      assumptions elsewhere in the code.
+    edge->setDist(0.001);
+
+    _router->processTransaction();
+    return true;
 }
 
 
@@ -203,7 +432,7 @@ unsigned int ConnRef::getDstShapeId(void)
 
 void ConnRef::makeActive(void)
 {
-    assert(!_active);
+    COLA_ASSERT(!_active);
     
     // Add to connRefs list.
     _pos = _router->connRefs.insert(_router->connRefs.begin(), this);
@@ -213,7 +442,7 @@ void ConnRef::makeActive(void)
 
 void ConnRef::makeInactive(void)
 {
-    assert(_active);
+    COLA_ASSERT(_active);
     
     // Remove from connRefs list.
     _router->connRefs.erase(_pos);
@@ -221,54 +450,69 @@ void ConnRef::makeInactive(void)
 }
 
 
-void ConnRef::freeRoute(void)
+void ConnRef::freeRoutes(void)
 {
-    if (_route.ps)
-    {
-        _route.pn = 0;
-        std::free(_route.ps);
-        _route.ps = NULL;
-    }
+    _route.clear();
+    _display_route.clear();
 }
     
 
-PolyLine& ConnRef::route(void)
+const PolyLine& ConnRef::route(void) const
 {
     return _route;
 }
 
 
-void ConnRef::calcRouteDist(void)
+PolyLine& ConnRef::routeRef(void)
 {
-    _route_dist = 0;
-    for (int i = 1; i < _route.pn; i++)
+    return _route;
+}
+
+
+void ConnRef::set_route(const PolyLine& route)
+{
+    if (&_display_route == &route)
     {
-        _route_dist += dist(_route.ps[i], _route.ps[i - 1]);
+        db_printf("Error:\tTrying to update libavoid route with itself.\n");
+        return;
     }
+    _display_route.ps = route.ps;
+
+    //_display_route.clear();
 }
 
 
-bool ConnRef::needsReroute(void)
+Polygon& ConnRef::displayRoute(void)
 {
-    return (_false_path || _needs_reroute_flag);
+    if (_display_route.empty())
+    {
+        // No displayRoute is set.  Simplify the current route to get it.
+        _display_route = _route.simplify();
+    }
+    return _display_route;
 }
 
 
-void ConnRef::lateSetup(const Point& src, const Point& dst)
+void ConnRef::calcRouteDist(void)
 {
-    assert(!_initialised);
+    double (*dist)(const Point& a, const Point& b) = 
+            (_type == ConnType_PolyLine) ? euclideanDist : manhattanDist;
 
-    bool isShape = false;
-    _srcVert = new VertInf(_router, VertID(_id, isShape, 1), src);
-    _dstVert = new VertInf(_router, VertID(_id, isShape, 2), dst);
-    _router->vertices.addVertex(_srcVert);
-    _router->vertices.addVertex(_dstVert);
-    makeActive();
-    _initialised = true;
+    _route_dist = 0;
+    for (size_t i = 1; i < _route.size(); ++i)
+    {
+        _route_dist += dist(_route.at(i), _route.at(i - 1));
+    }
 }
 
 
-unsigned int ConnRef::id(void)
+bool ConnRef::needsRepaint(void) const
+{
+    return _needs_repaint;
+}
+
+
+unsigned int ConnRef::id(void) const
 {
     return _id;
 }
@@ -286,6 +530,12 @@ VertInf *ConnRef::dst(void)
 }
 
 
+VertInf *ConnRef::start(void)
+{
+    return _startVert;
+}
+
+
 bool ConnRef::isInitialised(void)
 {
     return _initialised;
@@ -303,29 +553,8 @@ void ConnRef::unInitialise(void)
 
 void ConnRef::removeFromGraph(void)
 {
-    for (VertInf *iter = _srcVert; iter != NULL; )
-    {
-        VertInf *tmp = iter;
-        iter = (iter == _srcVert) ? _dstVert : NULL;
-        
-        // For each vertex.
-        EdgeInfList& visList = tmp->visList;
-        EdgeInfList::iterator finish = visList.end();
-        EdgeInfList::iterator edge;
-        while ((edge = visList.begin()) != finish)
-        {
-            // Remove each visibility edge
-            delete (*edge);
-        }
-
-        EdgeInfList& invisList = tmp->invisList;
-        finish = invisList.end();
-        while ((edge = invisList.begin()) != finish)
-        {
-            // Remove each invisibility edge
-            delete (*edge);
-        }
-    }
+    _srcVert->removeFromGraph();
+    _dstVert->removeFromGraph();
 }
 
 
@@ -336,12 +565,11 @@ void ConnRef::setCallback(void (*cb)(void *), void *ptr)
 }
 
 
-void ConnRef::handleInvalid(void)
+void ConnRef::performCallback(void)
 {
-    if (_false_path || _needs_reroute_flag) {
-        if (_callback) {
-            _callback(_connector);
-        }
+    if (_callback) 
+    {
+        _callback(_connector);
     }
 }
 
@@ -352,79 +580,279 @@ void ConnRef::makePathInvalid(void)
 }
 
 
-Router *ConnRef::router(void)
+Router *ConnRef::router(void) const
 {
     return _router;
 }
 
 
-int ConnRef::generatePath(Point p0, Point p1)
+bool ConnRef::generatePath(Point p0, Point p1)
+{
+    // XXX Code to determine when connectors really need to be rerouted
+    //     does not yet work for orthogonal connectors.
+    if (_type != ConnType_Orthogonal)
+    {
+        if (!_false_path && !_needs_reroute_flag) 
+        {
+            // This connector is up to date.
+            return false;
+        }
+    }
+
+    bool result = generatePath();
+
+    return result;
+}
+
+
+// Validates a bend point on a path to check it does not form a zigzag corner.
+// a, b, c are consecutive points on the path.  d and e are b's neighbours,
+// forming the shape corner d-b-e.
+//
+bool validateBendPoint(VertInf *aInf, VertInf *bInf, VertInf *cInf)
 {
-    if (!_false_path && !_needs_reroute_flag) {
+    bool bendOkay = true;
+
+    if ((aInf == NULL) || (cInf == NULL))
+    {
+        // Not a bendpoint, i.e., the end of the connector, so don't test.
+        return bendOkay;
+    }
+
+    COLA_ASSERT(bInf != NULL);
+    VertInf *dInf = bInf->shPrev;
+    VertInf *eInf = bInf->shNext;
+    COLA_ASSERT(dInf != NULL);
+    COLA_ASSERT(eInf != NULL);
+
+    Point& a = aInf->point;
+    Point& b = bInf->point;
+    Point& c = cInf->point;
+    Point& d = dInf->point;
+    Point& e = eInf->point;
+
+    if ((a == b) || (b == c))
+    {
+        return bendOkay;
+    }
+
+#ifdef PATHDEBUG
+    db_printf("a=(%g, %g)\n", a.x, a.y);
+    db_printf("b=(%g, %g)\n", b.x, b.y);
+    db_printf("c=(%g, %g)\n", c.x, c.y);
+    db_printf("d=(%g, %g)\n", d.x, d.y);
+    db_printf("e=(%g, %g)\n", e.x, e.y);
+#endif
+    // Check angle:
+    int abc = vecDir(a, b, c);
+#ifdef PATHDEBUG
+    db_printf("(abc == %d) ", abc);
+#endif
+   
+    if (abc == 0)
+    {
+        // The three consecutive point on the path are in a line.
+        // Thus, there should always be an equally short path that
+        // skips this bend point.
+        bendOkay = false;
+    }
+    else // (abc != 0)
+    {
+        COLA_ASSERT(vecDir(d, b, e) > 0);
+        int abe = vecDir(a, b, e);
+        int abd = vecDir(a, b, d);
+        int bce = vecDir(b, c, e);
+        int bcd = vecDir(b, c, d);
+#ifdef PATHDEBUG
+        db_printf("&& (abe == %d) && (abd == %d) &&\n(bce == %d) && (bcd == %d)",
+                abe, abd, bce, bcd);
+#endif
+
+        bendOkay = false;
+        if (abe > 0)
+        {
+            if ((abc > 0) && (abd >= 0) && (bce >= 0))
+            {
+                bendOkay = true;
+            }
+        }
+        else if (abd < 0)
+        {
+            if ((abc < 0) && (abe <= 0) && (bcd <= 0))
+            {
+                bendOkay = true;
+            }
+        }
+    }
+#ifdef PATHDEBUG
+    db_printf("\n");
+#endif
+    return bendOkay;
+}
+
+
+bool ConnRef::generatePath(void)
+{
+    if (!_false_path && !_needs_reroute_flag) 
+    {
         // This connector is up to date.
-        return (int) false;
+        return false;
     }
 
+    if (!_dstVert || !_srcVert)
+    {
+        // Connector is not fully initialised..
+        return false;
+    }
+    
+    //COLA_ASSERT(_srcVert->point != _dstVert->point);
+
     _false_path = false;
     _needs_reroute_flag = false;
 
-    VertInf *src = _srcVert;
     VertInf *tar = _dstVert;
+    _startVert = _srcVert;
 
-    if ( !(_router->IncludeEndpoints) )
-    {
-        lateSetup(p0, p1);
-        
-        // Update as they have just been set by lateSetup.
-        src = _srcVert;
-        tar = _dstVert;
+    bool *flag = &(_needs_reroute_flag);
    
-        bool knownNew = true;
-        bool genContains = true;
-        vertexVisibility(src, tar, knownNew, genContains);
-        vertexVisibility(tar, src, knownNew, genContains);
+    size_t existingPathStart = 0;
+    const PolyLine& currRoute = route();
+    if (_router->RubberBandRouting)
+    {
+        COLA_ASSERT(_router->IgnoreRegions == true);
+
+#ifdef PATHDEBUG
+        db_printf("\n");
+        _srcVert->id.db_print();
+        db_printf(": %g, %g\n", _srcVert->point.x, _srcVert->point.y);
+        tar->id.db_print();
+        db_printf(": %g, %g\n", tar->point.x, tar->point.y);
+        for (size_t i = 0; i < currRoute.ps.size(); ++i)
+        {
+            db_printf("%g, %g  ", currRoute.ps[i].x, currRoute.ps[i].y);
+        }
+        db_printf("\n");
+#endif
+        if (currRoute.size() > 2)
+        {
+            if (_srcVert->point == currRoute.ps[0])
+            {
+                existingPathStart = currRoute.size() - 2;
+                COLA_ASSERT(existingPathStart != 0);
+                const Point& pnt = currRoute.at(existingPathStart);
+                bool isShape = true;
+                VertID vID(pnt.id, isShape, pnt.vn);
+
+                _startVert = _router->vertices.getVertexByID(vID);
+            }
+        }
+    }
+    //db_printf("GO\n");
+    //db_printf("src: %X strt: %X dst: %x\n", (int) _srcVert, (int) _startVert, (int) _dstVert);
+    bool found = false;
+    while (!found)
+    {
+        makePath(this, flag);
+        for (VertInf *i = tar; i != NULL; i = i->pathNext)
+        {
+            if (i == _srcVert)
+            {
+                found = true;
+                break;
+            }
+        }
+        if (!found)
+        {
+            if (existingPathStart == 0)
+            {
+                break;
+            }
+#ifdef PATHDEBUG
+            db_printf("BACK\n");
+#endif
+            existingPathStart--;
+            const Point& pnt = currRoute.at(existingPathStart);
+            bool isShape = (existingPathStart > 0);
+            VertID vID(pnt.id, isShape, pnt.vn);
+
+            _startVert = _router->vertices.getVertexByID(vID);
+            COLA_ASSERT(_startVert);
+        }
+        else if (_router->RubberBandRouting)
+        {
+            // found.
+            bool unwind = false;
+
+#ifdef PATHDEBUG
+            db_printf("\n\n\nSTART:\n\n");
+#endif
+            VertInf *prior = NULL;
+            for (VertInf *curr = tar; curr != _startVert->pathNext; 
+                    curr = curr->pathNext)
+            {
+                if (!validateBendPoint(curr->pathNext, curr, prior))
+                {
+                    unwind = true;
+                    break;
+                }
+                prior = curr;
+            }
+            if (unwind)
+            {
+#ifdef PATHDEBUG
+                db_printf("BACK II\n");
+#endif
+                if (existingPathStart == 0)
+                {
+                    break;
+                }
+                existingPathStart--;
+                const Point& pnt = currRoute.at(existingPathStart);
+                bool isShape = (existingPathStart > 0);
+                VertID vID(pnt.id, isShape, pnt.vn);
+
+                _startVert = _router->vertices.getVertexByID(vID);
+                COLA_ASSERT(_startVert);
+
+                found = false;
+            }
+        }
     }
 
-    bool *flag = &(_needs_reroute_flag);
-    
-    makePath(this, flag);
     
     bool result = true;
     
     int pathlen = 1;
-    for (VertInf *i = tar; i != src; i = i->pathNext)
+    for (VertInf *i = tar; i != _srcVert; i = i->pathNext)
     {
         pathlen++;
         if (i == NULL)
         {
             db_printf("Warning: Path not found...\n");
             pathlen = 2;
-            tar->pathNext = src;
-            if (_router->InvisibilityGrph)
+            tar->pathNext = _srcVert;
+            if ((_type == ConnType_PolyLine) && _router->InvisibilityGrph)
             {
                 // TODO:  Could we know this edge already?
-                EdgeInf *edge = EdgeInf::existingEdge(src, tar);
-                assert(edge != NULL);
+                EdgeInf *edge = EdgeInf::existingEdge(_srcVert, tar);
+                COLA_ASSERT(edge != NULL);
                 edge->addCycleBlocker();
             }
-            result = false;
             break;
         }
-        if (pathlen > 100)
-        {
-            fprintf(stderr, "ERROR: Should never be here...\n");
-            exit(1);
-        }
+        // Check we don't have an apparent infinite connector path.
+        COLA_ASSERT(pathlen < 200);
     }
-    Point *path = (Point *) malloc(pathlen * sizeof(Point));
+    std::vector<Point> path(pathlen);
 
     int j = pathlen - 1;
-    for (VertInf *i = tar; i != src; i = i->pathNext)
+    for (VertInf *i = tar; i != _srcVert; i = i->pathNext)
     {
-        if (_router->InvisibilityGrph)
+        if (_router->InvisibilityGrph && (_type == ConnType_PolyLine))
         {
             // TODO: Again, we could know this edge without searching.
             EdgeInf *edge = EdgeInf::existingEdge(i, i->pathNext);
+            COLA_ASSERT(edge != NULL);
             edge->addConn(flag);
         }
         else
@@ -432,25 +860,53 @@ int ConnRef::generatePath(Point p0, Point p1)
             _false_path = true;
         }
         path[j] = i->point;
-        path[j].id = i->id.objID;
+        if (i->id.isShape)
+        {
+            path[j].id = i->id.objID;
+            path[j].vn = i->id.vn;
+        }
+        else
+        {
+            path[j].id = _id;
+            path[j].vn = kUnassignedVertexNumber;
+        }
         j--;
-    }
-    path[0] = src->point;
 
+        if (i->pathNext && (i->pathNext->point == i->point))
+        {
+            if (i->pathNext->id.isShape && i->id.isShape)
+            {
+                // Check for consecutive points on opposite 
+                // corners of two touching shapes.
+                COLA_ASSERT(abs(i->pathNext->id.objID - i->id.objID) != 2);
+            }
+        }
+    }
+    path[0] = _srcVert->point;
+    // Use topbit to differentiate between start and end point of connector.
+    // They need unique IDs for nudging.
+    unsigned int topbit = ((unsigned int) 1) << 31;
+    path[0].id = _id | topbit; 
+    path[0].vn = kUnassignedVertexNumber;
 
     // Would clear visibility for endpoints here if required.
 
-    PolyLine& output_route = route();
-    output_route.pn = pathlen;
+    freeRoutes();
+    PolyLine& output_route = _route;
     output_route.ps = path;
  
-    if ( !(_router->IncludeEndpoints) )
+#ifdef PATHDEBUG
+    db_printf("Output route:\n");
+    for (size_t i = 0; i < output_route.ps.size(); ++i)
     {
-        assert(_initialised);
-        unInitialise();
+        db_printf("[%d,%d] %g, %g   ", output_route.ps[i].id, 
+                output_route.ps[i].vn, output_route.ps[i].x, 
+                output_route.ps[i].y);
     }
-   
-    return (int) result;
+    db_printf("\n\n");
+#endif
+
+    return result;
 }
 
 
@@ -466,6 +922,895 @@ bool ConnRef::doesHateCrossings(void)
 }
 
 
+PtOrder::~PtOrder()
+{
+    // Free the PointRep lists.
+    for (int dim = 0; dim < 2; ++dim)
+    {
+        PointRepList::iterator curr = connList[dim].begin();
+        while (curr != connList[dim].end())
+        {
+            PointRep *doomed = *curr;
+            curr = connList[dim].erase(curr);
+            delete doomed;
+        }
+    }
+}
+
+bool PointRep::follow_inner(PointRep *target)
+{
+    if (this == target)
+    {
+        return true;
+    }
+    else
+    {
+        for (PointRepSet::iterator curr = inner_set.begin(); 
+                curr != inner_set.end(); ++curr)
+        {
+            if ((*curr)->follow_inner(target))
+            {
+                return true;
+            }
+        }
+    }
+    return false;
+}
+
+
+int PtOrder::positionFor(const ConnRef *conn, const size_t dim) const
+{
+    int position = 0;
+    for (PointRepList::const_iterator curr = connList[dim].begin(); 
+            curr != connList[dim].end(); ++curr)
+    {
+        if ((*curr)->conn == conn)
+        {
+            return position;
+        }
+        ++position;
+    }
+    // Not found.
+    return -1;
+}
+
+
+bool PtOrder::addPoints(const int dim, PtConnPtrPair innerArg, 
+        PtConnPtrPair outerArg, bool swapped)
+{
+    PtConnPtrPair inner = (swapped) ? outerArg : innerArg;
+    PtConnPtrPair outer = (swapped) ? innerArg : outerArg;
+    COLA_ASSERT(inner != outer);
+
+    //printf("addPoints(%d, [%g, %g]-%X, [%g, %g]-%X)\n", dim,
+    //        inner->x, inner->y, (int) inner, outer->x, outer->y, (int) outer);
+
+    PointRep *innerPtr = NULL;
+    PointRep *outerPtr = NULL;
+    for (PointRepList::iterator curr = connList[dim].begin(); 
+            curr != connList[dim].end(); ++curr)
+    {
+        if ((*curr)->point == inner.first)
+        {
+            innerPtr = *curr;
+        }
+        if ((*curr)->point == outer.first)
+        {
+            outerPtr = *curr;
+        }
+    }
+    
+    if (innerPtr == NULL)
+    {
+        innerPtr = new PointRep(inner.first, inner.second);
+        connList[dim].push_back(innerPtr);
+    }
+    
+    if (outerPtr == NULL)
+    {
+        outerPtr = new PointRep(outer.first, outer.second);
+        connList[dim].push_back(outerPtr);
+    }
+    // TODO COLA_ASSERT(innerPtr->inner_set.find(outerPtr) == innerPtr->inner_set.end());
+    bool cycle = innerPtr->follow_inner(outerPtr);
+    if (cycle)
+    {
+        // Must reverse to avoid a cycle.
+        innerPtr->inner_set.insert(outerPtr);
+    }
+    else
+    {
+        outerPtr->inner_set.insert(innerPtr);
+    }
+    return cycle;
+}
+
+
+// Assuming that addPoints has been called for each pair of points in the 
+// shared path at that corner, then the contents of inner_set can be used 
+// to determine the correct ordering.
+static bool pointRepLessThan(PointRep *r1, PointRep *r2)
+{
+    size_t r1less = r1->inner_set.size();
+    size_t r2less = r2->inner_set.size();
+    //COLA_ASSERT(r1less != r2less);
+    
+    return (r1less > r2less);
+}
+
+
+void PtOrder::sort(const int dim)
+{
+    connList[dim].sort(pointRepLessThan);
+}
+
+
+// Returns a vertex number representing a point on the line between 
+// two shape corners, represented by p0 and p1.
+//
+static int midVertexNumber(const Point& p0, const Point& p1, const Point& c)
+{
+    if (c.vn != kUnassignedVertexNumber)
+    {
+        // The split point is a shape corner, so doesn't need its 
+        // vertex number adjusting.
+        return c.vn;
+    }
+    if ((p0.vn >= 4) && (p0.vn < kUnassignedVertexNumber))
+    {
+        // The point next to this has the correct nudging direction,
+        // so use that.
+        return p0.vn;
+    }
+    if ((p1.vn >= 4) && (p1.vn < kUnassignedVertexNumber))
+    {
+        // The point next to this has the correct nudging direction,
+        // so use that.
+        return p1.vn;
+    }
+    if ((p0.vn < 4) && (p1.vn < 4))
+    {
+        if (p0.vn != p1.vn)
+        {
+            return p0.vn;
+        }
+        // Splitting between two ordinary shape corners.
+        int vn_mid = std::min(p0.vn, p1.vn);
+        if ((std::max(p0.vn, p1.vn) == 3) && (vn_mid == 0))
+        {
+            vn_mid = 3; // Next vn is effectively 4.
+        }
+        return vn_mid + 4;
+    }
+    COLA_ASSERT((p0.x == p1.x) || (p0.y == p1.y));
+    if (p0.vn != kUnassignedVertexNumber)
+    {
+        if (p0.x == p1.x)
+        {
+            if ((p0.vn == 2) || (p0.vn == 3))
+            {
+                return 6;
+            }
+            return 4;
+        }
+        else
+        {
+            if ((p0.vn == 0) || (p0.vn == 3))
+            {
+                return 7;
+            }
+            return 5;
+        }
+    }
+    else if (p1.vn != kUnassignedVertexNumber)
+    {
+        if (p0.x == p1.x)
+        {
+            if ((p1.vn == 2) || (p1.vn == 3))
+            {
+                return 6;
+            }
+            return 4;
+        }
+        else
+        {
+            if ((p1.vn == 0) || (p1.vn == 3))
+            {
+                return 7;
+            }
+            return 5;
+        }
+    }
+
+    // Shouldn't both be new (kUnassignedVertexNumber) points.
+    db_printf("midVertexNumber(): p0.vn and p1.vn both = "
+            "kUnassignedVertexNumber\n");
+    db_printf("p0.vn %d p1.vn %d\n", p0.vn, p1.vn);
+    return kUnassignedVertexNumber;
+}
+
+
+// Break up overlapping parallel segments that are not the same edge in 
+// the visibility graph, i.e., where one segment is a subsegment of another.
+void splitBranchingSegments(Avoid::Polygon& poly, bool polyIsConn,
+        Avoid::Polygon& conn, const double tolerance)
+{
+    for (std::vector<Avoid::Point>::iterator i = conn.ps.begin(); 
+            i != conn.ps.end(); ++i)
+    {
+        if (i == conn.ps.begin())
+        {
+            // Skip the first point.
+            // There are points-1 segments in a connector.
+            continue;
+        }
+
+        for (std::vector<Avoid::Point>::iterator j = poly.ps.begin(); 
+                j != poly.ps.end(); )
+        {
+            if (polyIsConn && (j == poly.ps.begin()))
+            {
+                // Skip the first point.
+                // There are points-1 segments in a connector.
+                ++j;
+                continue;
+            }
+            Point& c0 = *(i - 1);
+            Point& c1 = *i;
+
+            Point& p0 = (j == poly.ps.begin()) ? poly.ps.back() : *(j - 1);
+            Point& p1 = *j;
+
+            // Check the first point of the first segment.
+            if (((i - 1) == conn.ps.begin()) && 
+                    pointOnLine(p0, p1, c0, tolerance))
+            {
+                //db_printf("add to poly %g %g\n", c0.x, c0.y);
+                
+                c0.vn = midVertexNumber(p0, p1, c0);
+                j = poly.ps.insert(j, c0);
+                if (j != poly.ps.begin())
+                {
+                    --j;
+                }
+                continue;
+            }
+            // And the second point of every segment.
+            if (pointOnLine(p0, p1, c1, tolerance))
+            {
+                //db_printf("add to poly %g %g\n", c1.x, c1.y);
+                
+                c1.vn = midVertexNumber(p0, p1, c1);
+                j = poly.ps.insert(j, c1);
+                if (j != poly.ps.begin())
+                {
+                    --j;
+                }
+                continue;
+            }
+
+            // Check the first point of the first segment.
+            if (polyIsConn && ((j - 1) == poly.ps.begin()) && 
+                        pointOnLine(c0, c1, p0, tolerance))
+            {
+                //db_printf("add to conn %g %g\n", p0.x, p0.y);
+
+                p0.vn = midVertexNumber(c0, c1, p0);
+                i = conn.ps.insert(i, p0);
+                continue;
+            }
+            // And the second point of every segment.
+            if (pointOnLine(c0, c1, p1, tolerance))
+            {
+                //db_printf("add to conn %g %g\n", p1.x, p1.y);
+
+                p1.vn = midVertexNumber(c0, c1, p1);
+                i = conn.ps.insert(i, p1);
+            }
+            ++j;
+        }
+    }
+}
+
+
+static int segDir(const Point& p1, const Point& p2)
+{
+    int result = 1;
+    if (p1.x == p2.x)
+    {
+        if (p2.y > p1.y)
+        {
+            result = -1;
+        }
+    }
+    else if (p1.y == p2.y)
+    {
+        if (p2.x < p1.x)
+        {
+            result = -1;
+        }
+    }
+    return result;
+}
+
+
+// Works out if the segment conn[cIndex-1]--conn[cIndex] really crosses poly.
+// This does not not count non-crossing shared paths as crossings.
+// poly can be either a connector (polyIsConn = true) or a cluster
+// boundary (polyIsConn = false).
+//
+CrossingsInfoPair countRealCrossings(Avoid::Polygon& poly, 
+        bool polyIsConn, Avoid::Polygon& conn, size_t cIndex, 
+        bool checkForBranchingSegments, const bool finalSegment, 
+        PointSet *crossingPoints, PtOrderMap *pointOrders, 
+        ConnRef *polyConnRef, ConnRef *connConnRef)
+{
+    unsigned int crossingFlags = CROSSING_NONE;
+    if (checkForBranchingSegments)
+    {
+        size_t conn_pn = conn.size();
+        // XXX When doing the pointOnLine test we allow the points to be 
+        // slightly non-collinear.  This addresses a problem with clustered
+        // routing where connectors could otherwise route cheaply through
+        // shape corners that were not quite on the cluster boundary, but
+        // reported to be on there by the line segment intersection code,
+        // which I suspect is not numerically accurate enough.  This occured
+        // for points that only differed by about 10^-12 in the y-dimension.
+        double tolerance = (!polyIsConn) ? 0.00001 : 0.0;
+        splitBranchingSegments(poly, polyIsConn, conn, tolerance);
+        // cIndex is going to be the last, so take into account added points.
+        cIndex += (conn.size() - conn_pn);
+    }
+    COLA_ASSERT(cIndex >= 1);
+    COLA_ASSERT(cIndex < conn.size());
+
+    bool polyIsOrthogonal = (polyConnRef && 
+            (polyConnRef->routingType() == ConnType_Orthogonal));
+    bool connIsOrthogonal = (connConnRef &&
+            (connConnRef->routingType() == ConnType_Orthogonal));
+
+    size_t poly_size = poly.size();
+    int crossingCount = 0;
+    std::vector<Avoid::Point *> c_path;
+    std::vector<Avoid::Point *> p_path;
+
+    Avoid::Point& a1 = conn.ps[cIndex - 1];
+    Avoid::Point& a2 = conn.ps[cIndex];
+    //db_printf("a1: %g %g\n", a1.x, a1.y);
+    //db_printf("a2: %g %g\n", a2.x, a2.y);
+
+    for (size_t j = ((polyIsConn) ? 1 : 0); j < poly_size; ++j)
+    {
+        Avoid::Point& b1 = poly.ps[(j - 1 + poly_size) % poly_size];
+        Avoid::Point& b2 = poly.ps[j];
+        //db_printf("b1: %g %g\n", b1.x, b1.y);
+        //db_printf("b2: %g %g\n", b2.x, b2.y);
+
+        p_path.clear();
+        c_path.clear();
+        bool converging = false;
+
+        const bool a1_eq_b1 = (a1 == b1);
+        const bool a2_eq_b1 = (a2 == b1);
+        const bool a2_eq_b2 = (a2 == b2);
+        const bool a1_eq_b2 = (a1 == b2);
+
+        if ( (a1_eq_b1 && a2_eq_b2) ||
+             (a2_eq_b1 && a1_eq_b2) )
+        {
+            if (finalSegment)
+            {
+                converging = true;
+            }
+            else
+            {
+                // Route along same segment: no penalty.  We detect
+                // crossovers when we see the segments diverge.
+                continue;
+            }
+        }
+        else if (a2_eq_b1 || a2_eq_b2 || a1_eq_b2)
+        {
+            // Each crossing that is at a vertex in the 
+            // visibility graph gets noticed four times.
+            // We ignore three of these cases.
+            // This also catches the case of a shared path,
+            // but this is one that terminates at a common
+            // endpoint, so we don't care about it.
+            continue;
+        }
+    
+        if (a1_eq_b1 || converging)
+        {
+            if (!converging)
+            {
+                if (polyIsConn && (j == 1))
+                {
+                    // Can't be the end of a shared path or crossing path 
+                    // since the common point is the first point of the 
+                    // connector path.  This is not a shared path at all.
+                    continue;
+                }
+
+                Avoid::Point& b0 = poly.ps[(j - 2 + poly_size) % poly_size];
+                // The segments share an endpoint -- a1==b1.
+                if (a2 == b0)
+                {
+                    // a2 is not a split, continue.
+                    continue;
+                }
+            }
+            
+            // If here and not converging, then we know that a2 != b2
+            // And a2 and its pair in b are a split.
+            COLA_ASSERT(converging || !a2_eq_b2);
+
+            bool shared_path = false;
+            
+            // Initial values here don't matter. They are only used after 
+            // being set to sensible values, but we set them to stop a MSVC
+            // warning.
+            bool p_dir_back;
+            int p_dir = 0;
+            int trace_c = 0;
+            int trace_p = 0;
+            
+            if (converging)
+            {
+                // Determine direction we have to look through
+                // the points of connector b.
+                p_dir_back = a2_eq_b2 ? true : false;
+                p_dir = p_dir_back ? -1 : 1;
+                trace_c = (int) cIndex;
+                trace_p = (int) j;
+                if (!p_dir_back)
+                {
+                    if (finalSegment)
+                    {
+                        trace_p--;
+                    }
+                    else
+                    {   
+                        trace_c--;
+                    }
+                }
+
+                shared_path = true;
+            }
+            else if (cIndex >= 2)
+            {
+                Avoid::Point& b0 = poly.ps[(j - 2 + poly_size) % poly_size];
+                Avoid::Point& a0 = conn.ps[cIndex - 2];
+            
+                //db_printf("a0: %g %g\n", a0.x, a0.y);
+                //db_printf("b0: %g %g\n", b0.x, b0.y);
+
+                if ((a0 == b2) || (a0 == b0))
+                {
+                    // Determine direction we have to look through
+                    // the points of connector b.
+                    p_dir_back = (a0 == b0) ? true : false;
+                    p_dir = p_dir_back ? -1 : 1;
+                    trace_c = (int) cIndex;
+                    trace_p = (int) (p_dir_back ? j : j - 2);
+                    
+                    shared_path = true;
+                }
+            }    
+
+            if (shared_path)
+            {
+                crossingFlags |= CROSSING_SHARES_PATH;
+                // Shouldn't be here if p_dir is still equal to zero.
+                COLA_ASSERT(p_dir != 0);
+
+                // Build the shared path, including the diverging points at
+                // each end if the connector does not end at a common point.
+                while ( (trace_c >= 0) && (!polyIsConn || 
+                            ((trace_p >= 0) && (trace_p < (int) poly_size))) )
+                {
+                    // If poly is a cluster boundary, then it is a closed 
+                    // poly-line and so it wraps arounds.
+                    size_t index_p = (size_t)
+                            ((trace_p + (2 * poly_size)) % poly_size);
+                    size_t index_c = (size_t) trace_c;
+                    c_path.push_back(&conn.ps[index_c]);
+                    p_path.push_back(&poly.ps[index_p]);
+                    if ((c_path.size() > 1) && 
+                            (conn.ps[index_c] != poly.ps[index_p]))
+                    {
+                        // Points don't match, so break out of loop.
+                        break;
+                    }
+                    trace_c--;
+                    trace_p += p_dir;
+                }
+
+                // Are there diverging points at the ends of the shared path.
+                bool front_same = (*(c_path.front()) == *(p_path.front()));
+                bool back_same  = (*(c_path.back())  == *(p_path.back()));
+
+                size_t size = c_path.size();
+                
+                // Check to see if these share a fixed segment.
+                if (polyIsOrthogonal && connIsOrthogonal)
+                {
+                    size_t startPt = (front_same) ? 0 : 1;
+                    if (c_path[startPt]->x == c_path[startPt + 1]->x)
+                    {
+                        // Vertical
+                        double xPos = c_path[startPt]->x;
+                        // See if this is inline with either the start
+                        // or end point of both connectors.
+                        if ( ((xPos == poly.ps[0].x) || 
+                                (xPos == poly.ps[poly_size - 1].x)) &&
+                             ((xPos == conn.ps[0].x) || 
+                                (xPos == conn.ps[cIndex].x)) )
+                        {
+                            crossingFlags |= CROSSING_SHARES_FIXED_SEGMENT;
+                        }
+                    }
+                    else
+                    {
+                        // Horizontal
+                        double yPos = c_path[startPt]->y;
+                        // See if this is inline with either the start
+                        // or end point of both connectors.
+                        if ( ((yPos == poly.ps[0].y) || 
+                                (yPos == poly.ps[poly_size - 1].y)) &&
+                             ((yPos == conn.ps[0].y) || 
+                                (yPos == conn.ps[cIndex].y)) )
+                        {
+                            crossingFlags |= CROSSING_SHARES_FIXED_SEGMENT;
+                        }
+                    }
+                }
+
+                int prevTurnDir = -1;
+                int startCornerSide = 1;
+                int endCornerSide = 1;
+                bool reversed = false;
+                if (!front_same)
+                {
+                    // If there is a divergence at the beginning, 
+                    // then order the shared path based on this.
+                    prevTurnDir = vecDir(*c_path[0], *c_path[1], *c_path[2]);
+                    startCornerSide = Avoid::cornerSide(*c_path[0], *c_path[1], 
+                            *c_path[2], *p_path[0]) 
+                        * segDir(*c_path[1], *c_path[2]);
+                    reversed = (startCornerSide != -prevTurnDir);
+                }
+                if (!back_same)
+                {
+                    // If there is a divergence at the end of the path, 
+                    // then order the shared path based on this.
+                    prevTurnDir = vecDir(*c_path[size - 3],
+                            *c_path[size - 2], *c_path[size - 1]);
+                    endCornerSide = Avoid::cornerSide(*c_path[size - 3], 
+                            *c_path[size - 2], *c_path[size - 1], 
+                            *p_path[size - 1])
+                        * segDir(*c_path[size - 3], *c_path[size - 2]);
+                    reversed = (endCornerSide != -prevTurnDir);
+                }
+                else
+                {
+                    endCornerSide = startCornerSide;
+                }
+                if (front_same)
+                {
+                    startCornerSide = endCornerSide;
+                }
+                
+                if (front_same || back_same)
+                {
+                    crossingFlags |= CROSSING_SHARES_PATH_AT_END;
+                }
+                else if (polyIsOrthogonal && connIsOrthogonal)
+                {
+                    int cStartDir = vecDir(*c_path[0], *c_path[1], *c_path[2]);
+                    int pStartDir = vecDir(*p_path[0], *p_path[1], *p_path[2]);
+                    if ((cStartDir != 0) && (cStartDir == -pStartDir))
+                    {
+                        // The start segments diverge at 180 degrees to each 
+                        // other.  So order based on not introducing overlap
+                        // of the diverging segments when these are nudged
+                        // apart.
+                        startCornerSide = -cStartDir * 
+                                segDir(*c_path[1], *c_path[2]);
+                    }
+                    else 
+                    {
+                        int cEndDir = vecDir(*c_path[size - 3], 
+                                *c_path[size - 2], *c_path[size - 1]);
+                        int pEndDir = vecDir(*p_path[size - 3], 
+                                *p_path[size - 2], *p_path[size - 1]);
+                        if ((cEndDir != 0) && (cEndDir == -pEndDir))
+                        {
+                            // The end segments diverge at 180 degrees to 
+                            // each other.  So order based on not introducing 
+                            // overlap of the diverging segments when these 
+                            // are nudged apart.
+                            startCornerSide = -cEndDir * segDir(
+                                    *c_path[size - 3], *c_path[size - 2]);
+                        }
+                    }
+                }
+
+#if 0
+                prevTurnDir = 0;
+                if (pointOrders)
+                {
+                    // Return the ordering for the shared path.
+                    COLA_ASSERT(c_path.size() > 0 || back_same);
+                    size_t adj_size = (c_path.size() - ((back_same) ? 0 : 1));
+                    for (size_t i = (front_same) ? 0 : 1; i < adj_size; ++i)
+                    {
+                        Avoid::Point& an = *(c_path[i]);
+                        Avoid::Point& bn = *(p_path[i]);
+                        int currTurnDir = ((i > 0) && (i < (adj_size - 1))) ?  
+                                vecDir(*c_path[i - 1], an,
+                                       *c_path[i + 1]) : 0;
+                        VertID vID(an.id, true, an.vn);
+                        if ( (currTurnDir == (-1 * prevTurnDir)) &&
+                                (currTurnDir != 0) && (prevTurnDir != 0) )
+                        {
+                            // The connector turns the opposite way around 
+                            // this shape as the previous bend on the path,
+                            // so reverse the order so that the inner path
+                            // become the outer path and vice versa.
+                            reversed = !reversed;
+                        }
+                        bool orderSwapped = (*pointOrders)[an].addPoints(
+                                &bn, &an, reversed);
+                        if (orderSwapped)
+                        {
+                            // Reverse the order for later points.
+                            reversed = !reversed;
+                        }
+                        prevTurnDir = currTurnDir;
+                    }
+                }
+#endif
+                prevTurnDir = 0;
+                if (pointOrders)
+                {
+                    reversed = false;
+                    size_t startPt = (front_same) ? 0 : 1;
+                    
+                    // Orthogonal should always have at least one segment.
+                    COLA_ASSERT(c_path.size() > (startPt + 1));
+                    
+                    if (startCornerSide > 0)
+                    {
+                        reversed = !reversed;
+                    }
+
+                    int prevDir = 0;
+                    // Return the ordering for the shared path.
+                    COLA_ASSERT(c_path.size() > 0 || back_same);
+                    size_t adj_size = (c_path.size() - ((back_same) ? 0 : 1));
+                    for (size_t i = (front_same) ? 0 : 1; i < adj_size; ++i)
+                    {
+                        Avoid::Point& an = *(c_path[i]);
+                        Avoid::Point& bn = *(p_path[i]);
+                        COLA_ASSERT(an == bn);
+
+                        int thisDir = prevDir;
+                        if ((i > 0) && (*(c_path[i - 1]) == *(p_path[i - 1])))
+                        {
+                            thisDir = segDir(*c_path[i - 1], *c_path[i]);
+                        }
+
+                        if (thisDir != prevDir)
+                        {
+                            reversed = !reversed;
+                        }
+                        prevDir = thisDir;
+
+                        if (i > startPt)
+                        {
+                            Avoid::Point& ap = *(c_path[i - 1]);
+                            Avoid::Point& bp = *(p_path[i - 1]);
+                            int orientation = (ap.x == an.x) ? 0 : 1;
+                            //printf("prevOri %d\n", prevOrientation);
+                            //printf("1: %X, %X\n", (int) &(bn), (int) &(an));
+                            bool orderSwapped = (*pointOrders)[an].addPoints(
+                                    orientation, 
+                                    std::make_pair(&bn, polyConnRef), 
+                                    std::make_pair(&an, connConnRef), 
+                                    reversed);
+                            if (orderSwapped)
+                            {
+                                // Reverse the order for later points.
+                                reversed = !reversed;
+                            }
+                            COLA_ASSERT(ap == bp);
+                            //printf("2: %X, %X\n", (int) &bp, (int) &ap);
+                            orderSwapped = (*pointOrders)[ap].addPoints(
+                                    orientation, 
+                                    std::make_pair(&bp, polyConnRef), 
+                                    std::make_pair(&ap, connConnRef), 
+                                    reversed);
+                            COLA_ASSERT(!orderSwapped);
+                        }
+                    }
+                }
+#if 0
+                    int ymod = -1;
+                    if ((id.vn == 1) || (id.vn == 2))
+                    {
+                        // bottom.
+                        ymod = +1;
+                    }
+                    
+                    int xmod = -1;
+                    if ((id.vn == 0) || (id.vn == 1))
+                    {
+                        // right.
+                        xmod = +1;
+                    }
+                    if(id.vn > 3)
+                    {
+                        xmod = ymod = 0;
+                        if (id.vn == 4)
+                        {
+                            // right.
+                            xmod = +1;
+                        }
+                        else if (id.vn == 5)
+                        {
+                            // bottom.
+                            ymod = +1;
+                        }
+                        else if (id.vn == 6)
+                        {
+                            // left.
+                            xmod = -1;
+                        }
+                        else if (id.vn == 7)
+                        {
+                            // top.
+                            ymod = -1;
+                        }
+                    }
+#endif
+                if (endCornerSide != startCornerSide)
+                {
+                    // Mark that the shared path crosses.
+                    //db_printf("shared path crosses.\n");
+                    crossingCount += 1;
+                    if (crossingPoints)
+                    {
+                        crossingPoints->insert(*c_path[1]);
+                    }
+                }
+                crossingFlags |= CROSSING_TOUCHES;
+            }
+            else if (cIndex >= 2)
+            {
+                // The connectors cross or touch at this point.
+                //db_printf("Cross or touch at point... \n");
+                
+                // Crossing shouldn't be at an endpoint.
+                COLA_ASSERT(cIndex >= 2);
+                COLA_ASSERT(polyIsConn && (j >= 2));
+
+                Avoid::Point& b0 = poly.ps[(j - 2 + poly_size) % poly_size];
+                Avoid::Point& a0 = conn.ps[cIndex - 2];
+            
+                int side1 = Avoid::cornerSide(a0, a1, a2, b0);
+                int side2 = Avoid::cornerSide(a0, a1, a2, b2);
+                if (side1 != side2)
+                {
+                    // The connectors cross at this point.
+                    //db_printf("cross.\n");
+                    crossingCount += 1;
+                    if (crossingPoints)
+                    {
+                        crossingPoints->insert(a1);
+                    }
+                }
+
+                crossingFlags |= CROSSING_TOUCHES;
+                if (pointOrders)
+                {
+                    if (polyIsOrthogonal && connIsOrthogonal)
+                    {
+                        // Orthogonal case:
+                        // Just order based on which comes from the left and
+                        // top in each dimension because this can only be two
+                        // L-shaped segments touching at the bend.
+                        bool reversedX = ((a0.x < a1.x) || (a2.x < a1.x));
+                        bool reversedY = ((a0.y < a1.y) || (a2.y < a1.y));
+                        // XXX: Why do we need to invert the reversed values 
+                        //      here?  Are they wrong for orthogonal points
+                        //      in the other places?
+                        (*pointOrders)[b1].addPoints(0, 
+                                std::make_pair(&b1, polyConnRef), 
+                                std::make_pair(&a1, connConnRef), 
+                                !reversedX);
+                        (*pointOrders)[b1].addPoints(1, 
+                                std::make_pair(&b1, polyConnRef), 
+                                std::make_pair(&a1, connConnRef),
+                                !reversedY);
+                    }
+                    else
+                    {
+                        int turnDirA = vecDir(a0, a1, a2); 
+                        int turnDirB = vecDir(b0, b1, b2); 
+                        bool reversed = (side1 != -turnDirA); 
+                        if (side1 != side2) 
+                        { 
+                            // Interesting case where a connector routes round 
+                            // the edge of a shape and intersects a connector 
+                            // which is connected to a port on the edge of the 
+                            // shape. 
+                            if (turnDirA == 0) 
+                            { 
+                                // We'll make B the outer by preference,  
+                                // because the points of A are collinear. 
+                                reversed = false; 
+                            } 
+                            else if (turnDirB == 0) 
+                            { 
+                                reversed = true; 
+                            } 
+                            // TODO COLA_ASSERT((turnDirB != 0) || 
+                            //          (turnDirA != 0)); 
+                        }
+                        VertID vID(b1.id, true, b1.vn);
+                        //(*pointOrders)[b1].addPoints(&b1, &a1, reversed);
+                    }
+                }
+            }
+        }
+        else
+        {
+            if ( polyIsOrthogonal && connIsOrthogonal)
+            {
+                // All crossings in orthogonal connectors will be at a
+                // vertex in the visibility graph, so we need not bother
+                // doing normal line intersection.
+                continue;
+            }
+
+            // No endpoint is shared between these two line segments,
+            // so just calculate normal segment intersection.
+
+            Point cPt;
+            int intersectResult = Avoid::segmentIntersectPoint(
+                    a1, a2, b1, b2, &(cPt.x), &(cPt.y));
+
+            if (intersectResult == Avoid::DO_INTERSECT)
+            {
+                if (!polyIsConn && 
+                        ((a1 == cPt) || (a2 == cPt) || (b1 == cPt) || (b2 == cPt)))
+                {
+                    // XXX: This shouldn't actually happen, because these
+                    //      points should be added as bends to each line by
+                    //      splitBranchingSegments().  Thus, lets ignore them.
+                    COLA_ASSERT(a1 != cPt);
+                    COLA_ASSERT(a2 != cPt);
+                    COLA_ASSERT(b1 != cPt);
+                    COLA_ASSERT(b2 != cPt);
+                    continue;
+                }                
+                //db_printf("crossing lines:\n");
+                //db_printf("cPt: %g %g\n", cPt.x, cPt.y);
+                crossingCount += 1;
+                if (crossingPoints)
+                {
+                    crossingPoints->insert(cPt);
+                }
+            }
+        }
+    }
+    //db_printf("crossingcount %d\n", crossingCount);
+    return std::make_pair(crossingCount, crossingFlags);
+}
+
+
 //============================================================================
 
 }
index 64afb4dda7f9abe698031613d687ac7522f692d7..8f7499a2934838709479ec325a87d5a18713761c 100644 (file)
  * vim: ts=4 sw=4 et tw=0 wm=0
  *
  * libavoid - Fast, Incremental, Object-avoiding Line Router
- * Copyright (C) 2004-2006  Michael Wybrow <mjwybrow@users.sourceforge.net>
+ *
+ * Copyright (C) 2004-2009  Monash University
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
+ * See the file LICENSE.LGPL distributed with the library.
+ *
+ * Licensees holding a valid commercial license may use this file in
+ * accordance with the commercial license agreement provided with the 
+ * library.
  *
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
  *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- * 
+ * Author(s):   Michael Wybrow <mjwybrow@users.sourceforge.net>
 */
 
+//! @file    shape.h
+//! @brief   Contains the interface for the ConnRef class.
+
+
 #ifndef AVOID_CONNECTOR_H
 #define AVOID_CONNECTOR_H
 
-#include "libavoid/router.h"
+#include <list>
+#include <vector>
+
+#include "libavoid/vertices.h"
 #include "libavoid/geometry.h"
 #include "libavoid/shape.h"
-#include <list>
 
 
 namespace Avoid {
 
+class Router;
+class ConnRef;
+typedef std::list<ConnRef *> ConnRefList;
+
+
+//! @brief  Describes the type of routing that is performed for each 
+//!         connector.
+enum ConnType {
+    ConnType_None       = 0,
+    //! @brief  The connector path will be a shortest-path poly-line that
+    //!         routes around obstacles.
+    ConnType_PolyLine   = 1,
+    //! @brief  The connector path will be a shortest-path orthogonal 
+    //!         poly-line (only vertical and horizontal line segments) that
+    //!         routes around obstacles.
+    ConnType_Orthogonal = 2
+};
+
+//! @brief  Flags that can be passed to the ConnEnd constructor to specify
+//!         which sides of a shape this point should have visibility to if
+//!         it is located within the shape's area.
+//!
+//! Like SVG, libavoid considers the Y-axis to point downwards, that is, 
+//! like screen coordinates the coordinates increase from left-to-right and 
+//! also from top-to-bottom.
+//!
+enum ConnDirFlag {
+    ConnDirNone  = 0,
+    //! @brief  This option specifies the point should be given visibility 
+    //!         to the top of the shape that it is located within.
+    ConnDirUp    = 1,
+    //! @brief  This option specifies the point should be given visibility 
+    //!         to the bottom of the shape that it is located within.
+    ConnDirDown  = 2,
+    //! @brief  This option specifies the point should be given visibility 
+    //!         to the left side of the shape that it is located within.
+    ConnDirLeft  = 4,
+    //! @brief  This option specifies the point should be given visibility 
+    //!         to the right side of the shape that it is located within.
+    ConnDirRight = 8,
+    //! @brief  This option, provided for convenience, specifies the point 
+    //!         should be given visibility to all four sides of the shape 
+    //!         that it is located within.
+    ConnDirAll   = 15
+};
+//! @brief  One or more Avoid::ConnDirFlag options.
+//!
+typedef unsigned int ConnDirFlags;
+
+
+static const double ATTACH_POS_TOP = 0;
+static const double ATTACH_POS_CENTER = 0.5;
+static const double ATTACH_POS_BOTTOM = 1;
+static const double ATTACH_POS_LEFT = ATTACH_POS_TOP;
+static const double ATTACH_POS_RIGHT = ATTACH_POS_BOTTOM;
+
+
+//! @brief  The ConnEnd class represents different possible endpoints for 
+//!         connectors.
+//!
+//! Currently this class just allows free-floating endpoints, but in future
+//! will be capable of representing attachments to connection points on shapes.
+//! 
+class ConnEnd 
+{
+    public:
+        //! @brief Constructs a ConnEnd from a free-floating point.
+        //!
+        //! @param[in]  point  The position of the connector endpoint.
+        //!
+        ConnEnd(const Point& point);
+
+        //! @brief Constructs a ConnEnd from a free-floating point as well
+        //!        as a set of flags specifying visibility for this point 
+        //!        if it is located inside a shape.
+        //!
+        //! @param[in]  point    The position of the connector endpoint.
+        //! @param[in]  visDirs  One or more Avoid::ConnDirFlag options 
+        //!                      specifying the directions that this point 
+        //!                      should be given visibility if it is inside 
+        //!                      a shape.
+        //!
+        ConnEnd(const Point& point, const ConnDirFlags visDirs);
+
+        ConnEnd(ShapeRef *shapeRef, const double x_pos, const double y_pos,
+                const double insideOffset = 0.0,
+                const ConnDirFlags visDirs = ConnDirNone);
 
-static const int ConnType_PolyLine   = 1;
-static const int ConnType_Orthogonal = 2;
+        //! @brief Returns the position of this connector endpoint
+        //!
+        //! @return The position of this connector endpoint.
+        const Point point(void) const;
+
+        ConnDirFlags directions(void) const;
+    private:
+        Point _point;
+        ConnDirFlags _directions;
+        
+        // For referencing ConnEnds
+        ShapeRef *_shapeRef;
+        double _xPosition;
+        double _yPosition;
+        double _insideOffset;
+};
 
 
+//! @brief   The ConnRef class represents a connector object.
+//!
+//! Connectors are a (possible multi-segment) line between two points.
+//! They are routed intelligently so as not to overlap any of the shape
+//! objects in the Router scene.
+//! 
+//! Routing penalties can be applied, resulting in more aesthetically pleasing
+//! connector paths with fewer segments or less severe bend-points.
+//!
+//! You can set a function to be called when the connector has been rerouted
+//! and needs to be redrawn.  Alternatively, you can query the connector's
+//! needsRepaint() function to determine this manually.
+//!
+//! Usually, it is expected that you would create a ConnRef for each connector 
+//! in your diagram and keep that reference in your own connector class.
+//!
 class ConnRef
 {
     public:
-        ConnRef(Router *router, const unsigned int id);
-        ConnRef(Router *router, const unsigned int id,
-                const Point& src, const Point& dst);
-        virtual ~ConnRef();
+        //! @brief Constructs a connector with no endpoints specified.
+        //!
+        //! @param[in]  router  The router scene to place the connector into.
+        //! @param[in]  id      A unique positive integer ID for the connector.  
+        //!
+        //! If an ID is not specified, then one will be assigned to the shape.
+        //! If assigning an ID yourself, note that it should be a unique 
+        //! positive integer.  Also, IDs are given to all objects in a scene,
+        //! so the same ID cannot be given to a shape and a connector for 
+        //! example.
+        //!
+        ConnRef(Router *router, const unsigned int id = 0);
+        //! @brief Constructs a connector with endpoints specified.
+        //!
+        //! @param[in]  router  The router scene to place the connector into.
+        //! @param[in]  id      A unique positive integer ID for the connector.
+        //! @param[in]  src     The source endpoint of the connector.
+        //! @param[in]  dst     The destination endpoint of the connector.
+        //!
+        //! If an ID is not specified, then one will be assigned to the shape.
+        //! If assigning an ID yourself, note that it should be a unique 
+        //! positive integer.  Also, IDs are given to all objects in a scene,
+        //! so the same ID cannot be given to a shape and a connector for 
+        //! example.
+        //!
+        ConnRef(Router *router, const ConnEnd& src, const ConnEnd& dst,
+                const unsigned int id = 0);
+        //! @brief  Destuctor.
+        ~ConnRef();
         
-        void setType(unsigned int type);
-        PolyLine& route(void);
-        bool needsReroute(void);
-        void freeRoute(void);
+        //! @brief  Sets both new source and destination endpoints for this 
+        //!         connector.
+        //!
+        //! @param[in]  srcPoint  New source endpoint for the connector.
+        //! @param[in]  dstPoint  New destination endpoint for the connector.
+        void setEndpoints(const ConnEnd& srcPoint, const ConnEnd& dstPoint);
+        //! @brief  Sets just a new source endpoint for this connector.
+        //!
+        //! @param[in]  srcPoint  New source endpoint for the connector.
+        void setSourceEndpoint(const ConnEnd& srcPoint);
+        //! @brief  Sets just a new destination endpoint for this connector.
+        //!
+        //! @param[in]  dstPoint  New destination endpoint for the connector.
+        void setDestEndpoint(const ConnEnd& dstPoint);
+        //! @brief   Returns the ID of this connector.
+        //! @returns The ID of the connector. 
+        unsigned int id(void) const;
+        //! @brief   Returns a pointer to the router scene this connector is in.
+        //! @returns A pointer to the router scene for this connector.
+        Router *router(void) const;
+
+        //! @brief   Returns an indication of whether this connector has a 
+        //!          new route and thus needs to be repainted.
+        //!
+        //! If the connector has been rerouted and need repainting, the  
+        //! route() method can be called to get a reference to the new route.
+        //!
+        //! @returns Returns true if the connector requires repainting, or 
+        //!          false if it does not.
+        bool needsRepaint(void) const;
+        
+        //! @brief   Returns a reference to the current route for the connector.
+        //!
+        //! This is a "raw" version of the route, where each line segment in
+        //! the route may be made up of multiple collinear line segments.  It
+        //! will also not have post-processing (like curved corners) applied
+        //! to it.  The simplified route for display can be obtained by calling
+        //! displayRoute().
+        //!
+        //! @returns The PolyLine route for the connector.
+        //! @note    You can obtain a modified version of this poly-line 
+        //!          route with curved corners added by calling 
+        //!          PolyLine::curvedPolyline().
+        const PolyLine& route(void) const;
+        
+        //! @brief   Returns a reference to the current display version of the
+        //!          route for the connector.
+        //! 
+        //! The display version of a route has been simplified to collapse all
+        //! collinear line segments into single segments.  It may also have 
+        //! post-processing applied to the route, such as curved corners or
+        //! nudging.
+        //! 
+        //! @returns The PolyLine display route for the connector.
+        PolyLine& displayRoute(void);
+        
+        //! @brief   Sets a callback function that will called to indicate that
+        //!          the connector needs rerouting.
+        //!
+        //! The cb function will be called when shapes are added to, removed 
+        //! from or moved about on the page.  The pointer ptr will be passed 
+        //! as an argument to the callback function.
+        //!
+        //! @param[in]  cb   A pointer to the callback function.
+        //! @param[in]  ptr  A generic pointer that will be passed to the 
+        //!                  callback function.
+        void setCallback(void (*cb)(void *), void *ptr);
+        //! @brief   Returns the type of routing performed for this connector.
+        //! @return  The type of routing performed.
+        //!
+        ConnType routingType(void) const;
+        //! @brief       Sets the type of routing to be performed for this 
+        //!              connector.
+        //! 
+        //! If a call to this method changes the current type of routing 
+        //! being used for the connector, then it will get rerouted during
+        //! the next processTransaction() call, or immediately if 
+        //! transactions are not being used.
+        //!
+        //! @param type  The type of routing to be performed.
+        //!
+        void setRoutingType(ConnType type);
+
+       
+
+        // @brief   Returns the source endpoint vertex in the visibility graph.
+        // @returns The source endpoint vertex.
+        VertInf *src(void);
+        // @brief   Returns the destination endpoint vertex in the 
+        //          visibility graph.
+        // @returns The destination endpoint vertex.
+        VertInf *dst(void);
+        
+
+        void set_route(const PolyLine& route);
         void calcRouteDist(void);
-        void updateEndPoint(const unsigned int type, const Point& point);
         void setEndPointId(const unsigned int type, const unsigned int id);
         unsigned int getSrcShapeId(void);
         unsigned int getDstShapeId(void);
         void makeActive(void);
         void makeInactive(void);
-        void lateSetup(const Point& src, const Point& dst);
-        unsigned int id(void);
-        VertInf *src(void);
-        VertInf *dst(void);
+        VertInf *start(void);
         void removeFromGraph(void);
         bool isInitialised(void);
-        void unInitialise(void);
-        void setCallback(void (*cb)(void *), void *ptr);
-        void handleInvalid(void);
-        int generatePath(Point p0, Point p1);
         void makePathInvalid(void);
-        Router *router(void);
         void setHateCrossings(bool value);
         bool doesHateCrossings(void);
-        
-        friend void Router::attachedShapes(IntList &shapes,
-                const unsigned int shapeId, const unsigned int type);
-        friend void Router::attachedConns(IntList &conns,
-                const unsigned int shapeId, const unsigned int type);
-        friend void Router::markConnectors(ShapeRef *shape);
-        
+        void setEndpoint(const unsigned int type, const ConnEnd& connEnd);
+        bool setEndpoint(const unsigned int type, const VertID& pointID, 
+                Point *pointSuggestion = NULL);
+    
     private:
+        friend class Router;
+
+        PolyLine& routeRef(void);
+        void freeRoutes(void);
+        void performCallback(void);
+        bool generatePath(void);
+        bool generatePath(Point p0, Point p1);
+        void unInitialise(void);
+        void updateEndPoint(const unsigned int type, const ConnEnd& connEnd);
+        void common_updateEndPoint(const unsigned int type, const ConnEnd& connEnd);
         Router *_router;
         unsigned int _id;
-        unsigned int _type;
+        ConnType _type;
         unsigned int _srcId, _dstId;
+        bool _orthogonal;
         bool _needs_reroute_flag;
         bool _false_path;
+        bool _needs_repaint;
         bool _active;
         PolyLine _route;
+        Polygon _display_route;
         double _route_dist;
         ConnRefList::iterator _pos;
         VertInf *_srcVert;
         VertInf *_dstVert;
+        VertInf *_startVert;
         bool _initialised;
         void (*_callback)(void *);
         void *_connector;
@@ -96,6 +339,69 @@ class ConnRef
 };
 
 
+class PointRep;
+typedef std::set<PointRep *> PointRepSet;
+typedef std::list<PointRep *> PointRepList;
+
+class PointRep
+{
+    public:
+        PointRep(Point *p, const ConnRef *c)
+            : point(p),
+              conn(c)
+
+        {
+        }
+        bool follow_inner(PointRep *target);
+
+        Point *point;
+        const ConnRef *conn;
+        // inner_set: Set of pointers to the PointReps 'inner' of 
+        // this one, at this corner.
+        PointRepSet inner_set;
+};
+
+
+typedef std::pair<Point *, ConnRef *> PtConnPtrPair;
+
+class PtOrder
+{
+    public:
+        PtOrder()
+        {
+        }
+        ~PtOrder();
+        bool addPoints(const int dim, PtConnPtrPair innerArg, 
+                PtConnPtrPair outerArg, bool swapped);
+        void sort(const int dim);
+        int positionFor(const ConnRef *conn, const size_t dim) const;
+
+        // One for each dimension.
+        PointRepList connList[2];
+};
+
+typedef std::map<Avoid::Point,PtOrder> PtOrderMap;
+typedef std::set<Avoid::Point> PointSet;
+
+
+const unsigned int CROSSING_NONE = 0;
+const unsigned int CROSSING_TOUCHES = 1;
+const unsigned int CROSSING_SHARES_PATH = 2;
+const unsigned int CROSSING_SHARES_PATH_AT_END = 4;
+const unsigned int CROSSING_SHARES_FIXED_SEGMENT = 8;
+
+
+typedef std::pair<int, unsigned int> CrossingsInfoPair;
+
+extern CrossingsInfoPair countRealCrossings( Avoid::Polygon& poly, 
+        bool polyIsConn, Avoid::Polygon& conn, size_t cIndex, 
+        bool checkForBranchingSegments, const bool finalSegment = false, 
+        PointSet *crossingPoints = NULL, PtOrderMap *pointOrders = NULL, 
+        ConnRef *polyConnRef = NULL, ConnRef *connConnRef = NULL);
+extern void splitBranchingSegments(Avoid::Polygon& poly, bool polyIsConn,
+        Avoid::Polygon& conn, const double tolerance = 0);
+extern bool validateBendPoint(VertInf *aInf, VertInf *bInf, VertInf *cInf);
+
 }
 
 
index 20e6f470512aae033e7e8ea7617ffb3e70ec3760..443529eced18aea6e7b283991b7a31129c634bcc 100644 (file)
@@ -2,24 +2,27 @@
  * vim: ts=4 sw=4 et tw=0 wm=0
  *
  * libavoid - Fast, Incremental, Object-avoiding Line Router
- * Copyright (C) 2004-2006  Michael Wybrow <mjwybrow@users.sourceforge.net>
+ *
+ * Copyright (C) 2004-2008  Monash University
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
+ * See the file LICENSE.LGPL distributed with the library.
+ *
+ * Licensees holding a valid commercial license may use this file in
+ * accordance with the commercial license agreement provided with the 
+ * library.
  *
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
  *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- * 
+ * Author(s):   Michael Wybrow <mjwybrow@users.sourceforge.net>
 */
 
+
 #ifndef AVOID_DEBUG_H
 #define AVOID_DEBUG_H
 
@@ -42,7 +45,7 @@ inline void db_printf(const char *fmt, ...)
     va_end(ap);
 }
 #else
-inline void db_printf(const char */*fmt*/, ...)
+inline void db_printf(const char *, ...)
 {
 }
 #endif
index 15840c3816a9c85f5061db8352ae8649c8fd78ba..2523375cf2addacb63379ab5671bdbb6becd2c3c 100644 (file)
@@ -2,7 +2,8 @@
  * vim: ts=4 sw=4 et tw=0 wm=0
  *
  * libavoid - Fast, Incremental, Object-avoiding Line Router
- * Copyright (C) 2004-2006  Michael Wybrow <mjwybrow@users.sourceforge.net>
+ *
+ * Copyright (C) 2004-2009  Monash University
  *
  * --------------------------------------------------------------------
  * Much of the code in this module is based on code published with
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
+ * See the file LICENSE.LGPL distributed with the library.
+ *
+ * Licensees holding a valid commercial license may use this file in
+ * accordance with the commercial license agreement provided with the 
+ * library.
  *
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
  *
+ * Author(s):   Michael Wybrow <mjwybrow@users.sourceforge.net>
 */
 
+
+#include <cmath>
+
 #include "libavoid/graph.h"
 #include "libavoid/geometry.h"
-#include "libavoid/polyutil.h"
-
-#include <math.h>
+#include "libavoid/assertions.h"
 
 namespace Avoid {
 
 
-Point::Point()
-{
-}
-
-
-Point::Point(const double xv, const double yv)
-    : x(xv)
-    , y(yv)
-{
-}
-
-
-bool Point::operator==(const Point& rhs) const
-{
-    if ((x == rhs.x) && (y == rhs.y))
-    {
-        return true;
-    }
-    return false;
-}
-
-
-bool Point::operator!=(const Point& rhs) const
-{
-    if ((x != rhs.x) || (y != rhs.y))
-    {
-        return true;
-    }
-    return false;
-}
-
 
 // Returns true iff the point c lies on the closed segment ab.
+// To be used when the points are known to be collinear.
 //
 // Based on the code of 'Between'.
 //
-static const bool inBetween(const Point& a, const Point& b, const Point& c)
+bool inBetween(const Point& a, const Point& b, const Point& c)
 {
     // We only call this when we know the points are collinear,
     // otherwise we should be checking this here.
-    assert(vecDir(a, b, c) == 0);
+    COLA_ASSERT(vecDir(a, b, c, 0.0001) == 0);
 
-    if (a.x != b.x)
+    if ((fabs(a.x - b.x) > 1) && (a.x != b.x))
     {
         // not vertical
         return (((a.x < c.x) && (c.x < b.x)) ||
@@ -95,6 +68,15 @@ static const bool inBetween(const Point& a, const Point& b, const Point& c)
 }
 
 
+// Returns true iff the point c lies on the closed segment ab.
+//
+bool pointOnLine(const Point& a, const Point& b, const Point& c, 
+        const double tolerance)
+{
+    return (vecDir(a, b, c, tolerance) == 0) && inBetween(a, b, c);
+}
+
+
 // Returns true if the segment cd intersects the segment ab, blocking
 // visibility.
 //
@@ -104,15 +86,15 @@ bool segmentIntersect(const Point& a, const Point& b, const Point& c,
         const Point& d)
 {
     int ab_c = vecDir(a, b, c);
-    if ((ab_c == 0) && inBetween(a, b, c))
+    if (ab_c == 0)
     {
-        return true;
+        return false;
     }
 
     int ab_d = vecDir(a, b, d);
-    if ((ab_d == 0) && inBetween(a, b, d))
+    if (ab_d == 0)
     {
-        return true;
+        return false;
     }
 
     // It's ok for either of the points a or b to be on the line cd,
@@ -131,6 +113,37 @@ bool segmentIntersect(const Point& a, const Point& b, const Point& c,
 }
 
 
+// Returns true if the segment e1-e2 intersects the shape boundary 
+// segment s1-s2, blocking visibility.
+//
+bool segmentShapeIntersect(const Point& e1, const Point& e2, const Point& s1,
+        const Point& s2, bool& seenIntersectionAtEndpoint)
+{
+    if (segmentIntersect(e1, e2, s1, s2))
+    {
+        // Basic intersection of segments.
+        return true;
+    }
+    else if ( (((s2 == e1) || pointOnLine(s1, s2, e1)) && 
+               (vecDir(s1, s2, e2) != 0)) 
+              ||
+              (((s2 == e2) || pointOnLine(s1, s2, e2)) &&
+               (vecDir(s1, s2, e1) != 0)) )
+    {
+        // Segments intersect at the endpoint of one of the segments.  We
+        // allow this once, but the second one blocks visibility.  Otherwise
+        // shapes butted up against each other could have visibility through
+        // shapes.
+        if (seenIntersectionAtEndpoint)
+        {
+            return true;
+        }
+        seenIntersectionAtEndpoint = true;
+    }
+    return false;
+}
+
+
 // Returns true iff the point p in a valid region that can contain
 // shortest paths.  a0, a1, a2 are ordered vertices of a shape.
 //
@@ -205,20 +218,9 @@ int cornerSide(const Point &c1, const Point &c2, const Point &c3,
     int s12p = vecDir(c1, c2, p);
     int s23p = vecDir(c2, c3, p);
 
-    if (s12p == 0)
-    {
-        // Case of p being somewhere on c1-c2.
-        return s23p;
-    }
-    if (s23p == 0)
-    {
-        // Case of p being somewhere on c2-c3.
-        return s12p;
-    }
-
     if (s123 == 1)
     {
-        if ((s12p == 1) && (s23p == 1))
+        if ((s12p >= 0) && (s23p >= 0))
         {
             return 1;
         }
@@ -226,18 +228,37 @@ int cornerSide(const Point &c1, const Point &c2, const Point &c3,
     }
     else if (s123 == -1)
     {
-        if ((s12p == -1) && (s23p == -1))
+        if ((s12p <= 0) && (s23p <= 0))
         {
             return -1;
         }
         return 1;
     }
-    // Case of c3 being somewhere on c1-c2.
+
+    // c1-c2-c3 are collinear, so just return vecDir from c1-c2
     return s12p;
 }
 
 
-// Returns the distance between points a and b.
+// Returns the Euclidean distance between points a and b.
+//
+double euclideanDist(const Point& a, const Point& b)
+{
+    double xdiff = a.x - b.x;
+    double ydiff = a.y - b.y;
+
+    return sqrt((xdiff * xdiff) + (ydiff * ydiff));
+}
+
+// Returns the Manhattan distance between points a and b.
+//
+double manhattanDist(const Point& a, const Point& b)
+{
+    return fabs(a.x - b.x) + fabs(a.y - b.y);
+}
+
+
+// Returns the Euclidean distance between points a and b.
 //
 double dist(const Point& a, const Point& b)
 {
@@ -248,11 +269,12 @@ double dist(const Point& a, const Point& b)
 }
 
 // Returns the total length of all line segments in the polygon
-double totalLength(const Polygn& poly)
+double totalLength(const Polygon& poly)
 {
     double l = 0;
-    for (int i = 0; i < poly.pn-1; ++i) {
-        l += dist(poly.ps[i], poly.ps[i+1]);
+    for (size_t i = 1; i < poly.size(); ++i) 
+    {
+        l += dist(poly.ps[i-1], poly.ps[i]);
     }
     return l;
 }
@@ -277,18 +299,27 @@ double angle(const Point& a, const Point& b, const Point& c)
 // This is a fast version that only works for convex shapes.  The
 // other version (inPolyGen) is more general.
 //
-bool inPoly(const Polygn& poly, const Point& q)
+bool inPoly(const Polygon& poly, const Point& q, bool countBorder)
 {
-    int n = poly.pn;
-    Point *P = poly.ps;
-    for (int i = 0; i < n; i++)
+    size_t n = poly.size();
+    const std::vector<Point>& P = poly.ps;
+    bool onBorder = false;
+    for (size_t i = 0; i < n; i++)
     {
         // point index; i1 = i-1 mod n
-        int prev = (i + n - 1) % n;
-        if (vecDir(P[prev], P[i], q) == -1)
+        size_t prev = (i + n - 1) % n;
+        int dir = vecDir(P[prev], P[i], q);
+        if (dir == -1)
         {
+            // Point is outside
             return false;
         }
+        // Record if point was on a boundary.
+        onBorder |= (dir == 0);
+    }
+    if (!countBorder && onBorder)
+    {
+        return false;
     }
     return true;
 }
@@ -299,37 +330,36 @@ bool inPoly(const Polygn& poly, const Point& q)
 //
 // Based on the code of 'InPoly'.
 //
-bool inPolyGen(const Polygn& argpoly, const Point& q)
+bool inPolyGen(const PolygonInterface& argpoly, const Point& q)
 {
     // Numbers of right and left edge/ray crossings.
     int Rcross = 0;
     int Lcross = 0;
 
     // Copy the argument polygon
-    Polygn poly = copyPoly(argpoly);
-    Point *P = poly.ps;
-    int    n = poly.pn;
+    Polygon poly = argpoly;
+    std::vector<Point>& P = poly.ps;
+    size_t    n = poly.size();
 
     // Shift so that q is the origin. This is done for pedogical clarity.
-    for (int i = 0; i < n; ++i)
+    for (size_t i = 0; i < n; ++i)
     {
         P[i].x = P[i].x - q.x;
         P[i].y = P[i].y - q.y;
     }
 
     // For each edge e=(i-1,i), see if crosses ray.
-    for (int i = 0; i < n; ++i)
+    for (size_t i = 0; i < n; ++i)
     {
         // First see if q=(0,0) is a vertex.
         if ((P[i].x == 0) && (P[i].y == 0))
         {
             // We count a vertex as inside.
-            freePoly(poly);
             return true;
         }
 
         // point index; i1 = i-1 mod n
-        int i1 = ( i + n - 1 ) % n;
+        size_t i1 = ( i + n - 1 ) % n;
 
         // if e "straddles" the x-axis...
         // The commented-out statement is logically equivalent to the one
@@ -367,7 +397,6 @@ bool inPolyGen(const Polygn& argpoly, const Point& q)
             }
         }
     }
-    freePoly(poly);
 
     // q on the edge if left and right cross are not the same parity.
     if ( (Rcross % 2) != (Lcross % 2) )
@@ -400,8 +429,7 @@ bool inPolyGen(const Polygn& argpoly, const Point& q)
 int segmentIntersectPoint(const Point& a1, const Point& a2,
         const Point& b1, const Point& b2, double *x, double *y) 
 {
-
-    double Ax,Bx,Cx,Ay,By,Cy,d,e,f,num,offset;
+    double Ax,Bx,Cx,Ay,By,Cy,d,e,f,num;
     double x1lo,x1hi,y1lo,y1hi;
 
     Ax = a2.x - a1.x;
@@ -450,14 +478,13 @@ int segmentIntersectPoint(const Point& a1, const Point& a2,
         if (y1hi < b1.y || b2.y < y1lo) return DONT_INTERSECT;
     }
 
-
     Cx = a1.x - b1.x;
     Cy = a1.y - b1.y;
     // alpha numerator:
     d = By*Cx - Bx*Cy;
     // Both denominator:
     f = Ay*Bx - Ax*By;
-    // aplha tests:
+    // alpha tests:
     if (f > 0)
     {
         if (d < 0 || d > f) return DONT_INTERSECT;
@@ -485,15 +512,49 @@ int segmentIntersectPoint(const Point& a1, const Point& a2,
     
     // Numerator:
     num = d*Ax;
-    // Round direction:
-    offset = SAME_SIGNS(num,f) ? f/2 : -f/2;
     // Intersection X:
-    *x = a1.x + (num+offset) / f;
+    *x = a1.x + (num) / f;
+
+    num = d*Ay;
+    // Intersection Y:
+    *y = a1.y + (num) / f;
+
+    return DO_INTERSECT;
+}
+
+
+// Line Segment Intersection
+// Original code by Franklin Antonio 
+//
+int rayIntersectPoint(const Point& a1, const Point& a2,
+        const Point& b1, const Point& b2, double *x, double *y) 
+{
+    double Ax,Bx,Cx,Ay,By,Cy,d,f,num;
+
+    Ay = a2.y - a1.y;
+    By = b1.y - b2.y;
+    Ax = a2.x - a1.x;
+    Bx = b1.x - b2.x;
+
+    Cx = a1.x - b1.x;
+    Cy = a1.y - b1.y;
+    // alpha numerator:
+    d = By*Cx - Bx*Cy;
+    // Both denominator:
+    f = Ay*Bx - Ax*By;
+
+    // compute intersection coordinates:
+
+    if (f == 0) return PARALLEL;
+    
+    // Numerator:
+    num = d*Ax;
+    // Intersection X:
+    *x = a1.x + (num) / f;
 
     num = d*Ay;
-    offset = SAME_SIGNS(num,f) ? f/2 : -f/2;
     // Intersection Y:
-    *y = a1.y + (num+offset) / f;
+    *y = a1.y + (num) / f;
 
     return DO_INTERSECT;
 }
index 1422be0502213343abfe365bcf57249987911ba6..abd0d60e2e493abdf6a2c11b8b266a893d248df4 100644 (file)
@@ -2,7 +2,8 @@
  * vim: ts=4 sw=4 et tw=0 wm=0
  *
  * libavoid - Fast, Incremental, Object-avoiding Line Router
- * Copyright (C) 2004-2006  Michael Wybrow <mjwybrow@users.sourceforge.net>
+ *
+ * Copyright (C) 2004-2009  Monash University
  *
  * --------------------------------------------------------------------
  * Much of the code in this module is based on code published with
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
+ * See the file LICENSE.LGPL distributed with the library.
+ *
+ * Licensees holding a valid commercial license may use this file in
+ * accordance with the commercial license agreement provided with the 
+ * library.
  *
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
  *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- * 
+ * Author(s):   Michael Wybrow <mjwybrow@users.sourceforge.net>
 */
 
 
 #define _GEOMETRY_H
 
 #include "libavoid/geomtypes.h"
+#include "libavoid/assertions.h"
 
 namespace Avoid {
 
 
-extern double dist(const Point& a, const Point& b);
-extern double totalLength(const Polygn& poly);
+extern double euclideanDist(const Point& a, const Point& b);
+extern double manhattanDist(const Point& a, const Point& b);
+extern double totalLength(const Polygon& poly);
 extern double angle(const Point& a, const Point& b, const Point& c);
 extern bool segmentIntersect(const Point& a, const Point& b,
         const Point& c, const Point& d);
-extern bool inPoly(const Polygn& poly, const Point& q);
-extern bool inPolyGen(const Polygn& poly, const Point& q);
+extern bool segmentShapeIntersect(const Point& e1, const Point& e2, 
+        const Point& s1, const Point& s2, bool& seenIntersectionAtEndpoint);
+extern bool inPoly(const Polygon& poly, const Point& q, bool countBorder = true);
+extern bool inPolyGen(const PolygonInterface& poly, const Point& q);
 extern bool inValidRegion(bool IgnoreRegions, const Point& a0,
         const Point& a1, const Point& a2, const Point& b);
 extern int cornerSide(const Point &c1, const Point &c2, const Point &c3,
         const Point& p);
+extern bool pointOnLine(const Point& a, const Point& b, const Point& c,
+        const double tolerance = 0.0);
+
+// To be used only when the points are known to be colinear.
+extern bool inBetween(const Point& a, const Point& b, const Point& c);
 
 
 // Direction from vector.
@@ -61,16 +72,22 @@ extern int cornerSide(const Point &c1, const Point &c2, const Point &c3,
 //
 // Based on the code of 'AreaSign'.
 //
-static inline int vecDir(const Point& a, const Point& b, const Point& c)
+// The 'maybeZero' argument can be used to adjust the tolerance of the 
+// function.  It will be most accurate when 'maybeZero' == 0.0, the default.
+//
+static inline int vecDir(const Point& a, const Point& b, const Point& c, 
+        const double maybeZero = 0.0)
 {
+    COLA_ASSERT(maybeZero >= 0);
+
     double area2 = ((b.x - a.x) * (c.y - a.y)) -
                    ((c.x - a.x) * (b.y - a.y));
     
-    if (area2 < -0.001)
+    if (area2 < (-maybeZero))
     {
         return -1;
     }
-    else if (area2 > 0.001)
+    else if (area2 > maybeZero)
     {
         return 1;
     }
@@ -100,6 +117,8 @@ static const int DO_INTERSECT = 1;
 static const int PARALLEL = 3;
 extern int segmentIntersectPoint(const Point& a1, const Point& a2,
         const Point& b1, const Point& b2, double *x, double *y);
+extern int rayIntersectPoint(const Point& a1, const Point& a2,
+        const Point& b1, const Point& b2, double *x, double *y);
 
 
 }
index dd9d26f2f415b1689645330d0c5331923d6e9ee8..ced53e6b0c73217c849498044b858c997929286d 100644 (file)
  * vim: ts=4 sw=4 et tw=0 wm=0
  *
  * libavoid - Fast, Incremental, Object-avoiding Line Router
- * Copyright (C) 2004-2006  Michael Wybrow <mjwybrow@users.sourceforge.net>
+ *
+ * Copyright (C) 2004-2009  Monash University
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
+ * See the file LICENSE.LGPL distributed with the library.
+ *
+ * Licensees holding a valid commercial license may use this file in
+ * accordance with the commercial license agreement provided with the 
+ * library.
  *
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
  *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- * 
+ * Author(s):   Michael Wybrow <mjwybrow@users.sourceforge.net>
 */
 
+//! @file  geomtypes.h
+//! @brief Contains the interface for various geometry types and classes.
+
 
 #ifndef AVOID_GEOMTYPES_H
 #define AVOID_GEOMTYPES_H
 
+#include <vector>
+#include <utility>
+
 
 namespace Avoid
 {
 
-    
+
+//! @brief  The Point class defines a point in the plane.
+//!
+//! Points consist of an x and y value.  They may also have an ID and vertex
+//! number associated with them.
+//!
 class Point
 {
     public:
+        //! @brief  Default constructor.
+        //!
         Point();
+        //! @brief  Standard constructor.
+        //!
+        //! @param[in]  xv  The x position of the point.
+        //! @param[in]  yv  The y position of the point.
+        //!
         Point(const double xv, const double yv);
+
+        //! @brief  Comparison operator. Returns true if at same position.
+        //!
+        //! @param[in]  rhs  The point to compare with this one.
+        //! @return          The result of the comparison.
+        //!
         bool operator==(const Point& rhs) const;
+        //! @brief  Comparison operator. Returns true if at different positions.
+        //!
+        //! @param[in]  rhs  The point to compare with this one.
+        //! @return          The result of the comparison.
+        //!
         bool operator!=(const Point& rhs) const;
+        //! @brief  Comparison operator. Returns true if less-then rhs point.
+        //!
+        //! @note  This operator is not particularly useful, but is defined 
+        //!        to allow std::set<Point>.
+        //!
+        //! @param[in]  rhs  The point to compare with this one.
+        //! @return          The result of the comparison.
+        //!
+        bool operator<(const Point& rhs) const;
 
+        //! @brief  Returns the x or y value of the point, given the dimension.
+        //!
+        //! @param[in]  dimension  The dimension:  0 for x, 1 for y.
+        //! @return                The component of the point in that dimension.
+        double& operator[](const unsigned int dimension);
+        const double& operator[](const unsigned int dimension) const;
+        
+        //! The x position.
         double x;
+        //! The y position.
         double y;
-        int id;
+        //! The ID associated with this point.
+        unsigned int id;
+        //! The vertex number associated with this point.
+        unsigned short vn;
 
 };
 
 
+//! Constant value representing an unassigned vertex number.
+//!
+static const unsigned short kUnassignedVertexNumber = 8;
+
+
+//! @brief  A vector, represented by the Point class.
+//!
 typedef Point Vector;
 
 
-typedef struct
+//! @brief  A common interface used by the Polygon classes.
+//!
+class PolygonInterface
 {
-    int id;
-    Point *ps;
-    int pn;
-} Polygn;
-
-typedef Polygn PolyLine;
+    public:
+        //! @brief  Constructor.
+        PolygonInterface() { }
+        //! @brief  Destructor.
+        virtual ~PolygonInterface() { }
+        //! @brief  Resets this to the empty polygon.
+        virtual void clear(void) = 0;
+        //! @brief  Returns true if this polygon is empty.
+        virtual bool empty(void) const = 0;
+        //! @brief  Returns the number of points in this polygon.
+        virtual size_t size(void) const = 0;
+        //! @brief  Returns the ID value associated with this polygon.
+        virtual int id(void) const = 0;
+        //! @brief  Returns a specific point in the polygon.
+        //! @param[in]  index  The array index of the point to be returned.
+        virtual const Point& at(size_t index) const = 0;
+        //! @brief  Returns the bounding rectangle that contains this polygon.
+        //!
+        //! If a NULL pointer is passed for any of the arguments, then that
+        //! value is ignored and not returned.
+        //!
+        //! @param[out]  minX  The left hand side of the bounding box.
+        //! @param[out]  minY  The top of the bounding box.
+        //! @param[out]  maxX  The right hand side of the bounding box.
+        //! @param[out]  maxY  The bottom of the bounding box.
+        void getBoundingRect(double *minX, double *minY,
+                double *maxX, double *maxY) const;
+};
 
 
-typedef struct
+//! @brief  A line between two points. 
+//!
+class Edge
 {
-    Point a;
-    Point b;
-} Edge;
+    public:
+        //! The first point.
+        Point a;
+        //! The second point.
+        Point b;
+};
+
 
+//! @brief  A bounding box, represented with an Edge between top-left and
+//!         bottom-right corners.
+//!
 typedef Edge BBox;
 
 
+class Router;
+class ReferencingPolygon;
+
+
+//! @brief  A dynamic Polygon, to which points can be easily added and removed.
+//!
+//! @note The Rectangle class can be used as an easy way of constructing a
+//!       square or rectangular polygon.
+//!
+class Polygon : public PolygonInterface
+{
+    public:
+        //! @brief  Constructs an empty polygon (with zero points). 
+        Polygon();
+        //! @brief  Constructs a new polygon with n points.
+        //! 
+        //! A rectangle would be comprised of four point.  An n segment 
+        //! PolyLine (represented as a Polygon) would be comprised of n+1
+        //! points.  Whether a particular Polygon is closed or not, depends
+        //! on whether it is a Polygon or Polyline.  Shape polygons are always
+        //! considered to be closed, meaning the last point joins back to the
+        //! first point.
+        //!
+        //! @param[in]  n  Number of points in the polygon.
+        //!
+        Polygon(const int n);
+        //! @brief  Constructs a new polygon from an existing Polygon.
+        //!
+        //! @param[in]  poly  An existing polygon to copy the new polygon from.
+        //!
+        Polygon(const PolygonInterface& poly);
+        //! @brief  Resets this to the empty polygon.
+        void clear(void);
+        //! @brief  Returns true if this polygon is empty.
+        bool empty(void) const;
+        //! @brief  Returns the number of points in this polygon.
+        size_t size(void) const;
+        //! @brief  Returns the ID value associated with this polygon.
+        int id(void) const;
+        //! @brief  Returns a specific point in the polygon.
+        //! @param[in]  index  The array index of the point to be returned.
+        const Point& at(size_t index) const;
+        //! @brief  Returns a simplified Polyline, where all collinear line
+        //!         segments have been collapsed down into single line 
+        //!         segments.
+        //!
+        //! @return A new polyline with a simplified representation.
+        //!
+        Polygon simplify(void) const;
+        //! @brief  Returns a curved approximation of this multi-segment 
+        //!         PolyLine, with the corners replaced by smooth Bezier 
+        //!         curves.
+        //!
+        //! This function does not do any further obstacle avoidance with the
+        //! curves produced.  Hence, you would usually specify a curve_amount
+        //! in similar size to the space buffer around obstacles in the scene.
+        //! This way the curves will cut the corners around shapes but still
+        //! run within this buffer space.
+        //!
+        //! @param  curve_amount  Describes the distance along the end of each 
+        //!                       line segment to turn into a curve.
+        //! @param  closed        Describes whether the Polygon should be 
+        //!                       treated as closed.  Defaults to false.
+        //! @return A new polyline (polygon) representing the curved path.
+        //!         Its points represent endpoints of line segments and 
+        //!         Bezier spline control points.  The Polygon::ts vector for
+        //!         this returned polygon is populated with a character for 
+        //!         each point describing its type.
+        //! @sa     ts
+        Polygon curvedPolyline(const double curve_amount, 
+                const bool closed = false) const;
+        //! @brief  Translates the polygon position by a relative amount.
+        //!
+        //! @param[in]  xDist  Distance to move polygon in the x dimension.
+        //! @param[in]  yDist  Distance to move polygon in the y dimension.
+        void translate(const double xDist, const double yDist);
+
+        //! @brief  An ID for the polygon.
+        int _id;
+        //! @brief  A vector of the points that make up the Polygon.
+        std::vector<Point> ps;
+        //! @brief  If used, denotes whether the corresponding point in ps is 
+        //!         a move-to operation or a Bezier curve-to.
+        //! 
+        //! Each character describes the drawing operation for the 
+        //! corresponding point in the ps vector.  Possible values are:
+        //!  -  'M': A moveto operation, marks the first point;
+        //!  -  'L': A lineto operation, is a line from the previous point to
+        //!     the current point; or
+        //!  -  'C': A curveto operation, three consecutive 'C' points 
+        //!     (along with the previous point) describe the control points 
+        //!     of a Bezier curve.
+        //!  -  'Z': Closes the path (used for cluster boundaries).
+        //!
+        //! @note   This vector will currently only be populated for polygons 
+        //!         returned by curvedPolyline().  
+        std::vector<char> ts;
+};
+
+
+//! @brief  A multi-segment line, represented with the Polygon class.
+//!
+typedef Polygon PolyLine;
+
+
+//! @brief  A Polygon which just references its points from other Polygons.
+//!          
+//! This type of Polygon is used to accurately represent cluster boundaries 
+//! made up from the corner points of shapes.
+//!
+class ReferencingPolygon : public PolygonInterface
+{
+    public:
+        ReferencingPolygon();
+        ReferencingPolygon(const Polygon& poly, const Router *router);
+        void clear(void);
+        bool empty(void) const;
+        size_t size(void) const;
+        int id(void) const;
+        const Point& at(size_t index) const;
+
+        int _id;
+        std::vector<std::pair<const Polygon *, unsigned short> > ps;
+};
+
+
+//! @brief  A Rectangle, a simpler way to define the polygon for square or
+//!         rectangular shapes.
+//!
+class Rectangle : public Polygon
+{
+    public:
+        //! @brief  Constructs a rectangular polygon given two opposing 
+        //!         corner points.
+        //!
+        //! @param[in]  topLeft      The first corner point of the rectangle.
+        //! @param[in]  bottomRight  The opposing corner point of the rectangle.
+        //!
+        Rectangle(const Point& topLeft, const Point& bottomRight);
+        
+        //! @brief  Constructs a rectangular polygon given the centre, width
+        //!         and height.
+        //!
+        //! @param[in]  centre  The centre of the rectangle, specified as 
+        //!                     a point.
+        //! @param[in]  width   The width of the rectangle.
+        //! @param[in]  height  The height of the rectangle.
+        //!
+        Rectangle(const Point& centre, const double width, const double height);
+};
+
+
 }
 
 #endif
index 1970212df4e31214beb8b398c528588d8c6046f0..728f8c0859c8b3bff044e7e887e9e65fd05c0d75 100644 (file)
@@ -2,56 +2,61 @@
  * vim: ts=4 sw=4 et tw=0 wm=0
  *
  * libavoid - Fast, Incremental, Object-avoiding Line Router
- * Copyright (C) 2004-2006  Michael Wybrow <mjwybrow@users.sourceforge.net>
+ *
+ * Copyright (C) 2004-2009  Monash University
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
+ * See the file LICENSE.LGPL distributed with the library.
+ *
+ * Licensees holding a valid commercial license may use this file in
+ * accordance with the commercial license agreement provided with the 
+ * library.
  *
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
  *
+ * Author(s):   Michael Wybrow <mjwybrow@users.sourceforge.net>
 */
 
+
+#include <cmath>
+
 #include "libavoid/debug.h"
 #include "libavoid/graph.h"
 #include "libavoid/connector.h"
 #include "libavoid/geometry.h"
-#include "libavoid/polyutil.h"
 #include "libavoid/timer.h"
 #include "libavoid/vertices.h"
 #include "libavoid/router.h"
+#include "libavoid/assertions.h"
 
-#include <math.h>
 
 using std::pair;
 
 namespace Avoid {
 
 
-EdgeInf::EdgeInf(VertInf *v1, VertInf *v2)
-    : lstPrev(NULL)
-    , lstNext(NULL)
-    , _blocker(0)
-    , _router(NULL)
-    , _added(false)
-    , _visible(false)
-    , _v1(v1)
-    , _v2(v2)
-    , _dist(-1)
+EdgeInf::EdgeInf(VertInf *v1, VertInf *v2, const bool orthogonal)
+    : lstPrev(NULL),
+      lstNext(NULL),
+      _blocker(0),
+      _router(NULL),
+      _added(false),
+      _visible(false),
+      _orthogonal(orthogonal),
+      _v1(v1),
+      _v2(v2),
+      _dist(-1)
 {
     // Not passed NULL values.
-    assert(v1 && v2);
+    COLA_ASSERT(v1 && v2);
 
     // We are in the same instance
-    assert(_v1->_router == _v2->_router);
+    COLA_ASSERT(_v1->_router == _v2->_router);
     _router = _v1->_router;
 
     _conns.clear();
@@ -67,25 +72,142 @@ EdgeInf::~EdgeInf()
 }
 
 
+// Gives an order value between 0 and 3 for the point c, given the last
+// segment was from a to b.  Returns the following value:
+//    0 : Point c is directly backwards from point b.
+//    1 : Point c is a left-hand 90 degree turn.
+//    2 : Point c is a right-hand 90 degree turn.
+//    3 : Point c is straight ahead (collinear).
+//
+static inline int orthogTurnOrder(const Point& a, const Point& b, 
+        const Point& c)
+{
+    // We should only be calling this with orthogonal points, 
+    COLA_ASSERT((c.x == b.x) || (c.y == b.y));
+    COLA_ASSERT((a.x == b.x) || (a.y == b.y));
+
+    int direction = vecDir(a, b, c);
+
+    if (direction > 0)
+    {
+        // Counterclockwise := left
+        return 1;
+    }
+    else if (direction < 0)
+    {
+        // Clockwise := right
+        return 2;
+    }
+
+    if (b.x == c.x)
+    {
+        if ( ((a.y < b.y) && (c.y < b.y)) || 
+             ((a.y > b.y) && (c.y > b.y)) ) 
+        {
+            // Behind.
+            return 0;
+        }
+    }
+    else
+    {
+        if ( ((a.x < b.x) && (c.x < b.x)) || 
+             ((a.x > b.x) && (c.x > b.x)) ) 
+        {
+            // Behind.
+            return 0;
+        }
+    }
+
+    // Ahead.
+    return 3;
+}
+
+
+// Returns a less than operation for a set exploration order for orthogonal
+// searching.  Forward, then left, then right.  Or if there is no previous 
+// point, then the order is north, east, south, then west.
+// Note: This method assumes the two Edges that share a common point.
+bool EdgeInf::rotationLessThan(const VertInf *lastV, const EdgeInf *rhs) const
+{
+    if ((_v1 == rhs->_v1) && (_v2 == rhs->_v2))
+    {
+        // Effectively the same visibility edge, so they are equal.
+        return false;
+    }
+    VertInf *lhsV = NULL, *rhsV = NULL, *commonV = NULL;
+    
+    // Determine common Point and the comparison point on the left- and
+    // the right-hand-side.
+    if (_v1 == rhs->_v1)
+    {
+        commonV = _v1;
+        lhsV = _v2;
+        rhsV = rhs->_v2;
+    }
+    else if (_v1 == rhs->_v2)
+    {
+        commonV = _v1;
+        lhsV = _v2;
+        rhsV = rhs->_v1;
+    }
+    else if (_v2 == rhs->_v1)
+    {
+        commonV = _v2;
+        lhsV = _v1;
+        rhsV = rhs->_v2;
+    }
+    else if (_v2 == rhs->_v2)
+    {
+        commonV = _v2;
+        lhsV = _v1;
+        rhsV = rhs->_v1;
+    }
+
+    const Point& lhsPt = lhsV->point;
+    const Point& rhsPt = rhsV->point;
+    const Point& commonPt = commonV->point;
+    
+    // If no lastPt, use one directly to the left;
+    Point lastPt = (lastV) ? lastV->point : Point(commonPt.x - 10,  commonPt.y);
+
+    int lhsVal = orthogTurnOrder(lastPt, commonPt, lhsPt);
+    int rhsVal = orthogTurnOrder(lastPt, commonPt, rhsPt);
+
+    return lhsVal < rhsVal;
+}
+
+
 void EdgeInf::makeActive(void)
 {
-    assert(_added == false);
+    COLA_ASSERT(_added == false);
 
-    if (_visible)
+    if (_orthogonal)
     {
-        _router->visGraph.addEdge(this);
-        _pos1 = _v1->visList.insert(_v1->visList.begin(), this);
-        _v1->visListSize++;
-        _pos2 = _v2->visList.insert(_v2->visList.begin(), this);
-        _v2->visListSize++;
+        COLA_ASSERT(_visible);
+        _router->visOrthogGraph.addEdge(this);
+        _pos1 = _v1->orthogVisList.insert(_v1->orthogVisList.begin(), this);
+        _v1->orthogVisListSize++;
+        _pos2 = _v2->orthogVisList.insert(_v2->orthogVisList.begin(), this);
+        _v2->orthogVisListSize++;
     }
-    else // if (invisible)
+    else
     {
-        _router->invisGraph.addEdge(this);
-        _pos1 = _v1->invisList.insert(_v1->invisList.begin(), this);
-        _v1->invisListSize++;
-        _pos2 = _v2->invisList.insert(_v2->invisList.begin(), this);
-        _v2->invisListSize++;
+        if (_visible)
+        {
+            _router->visGraph.addEdge(this);
+            _pos1 = _v1->visList.insert(_v1->visList.begin(), this);
+            _v1->visListSize++;
+            _pos2 = _v2->visList.insert(_v2->visList.begin(), this);
+            _v2->visListSize++;
+        }
+        else // if (invisible)
+        {
+            _router->invisGraph.addEdge(this);
+            _pos1 = _v1->invisList.insert(_v1->invisList.begin(), this);
+            _v1->invisListSize++;
+            _pos2 = _v2->invisList.insert(_v2->invisList.begin(), this);
+            _v2->invisListSize++;
+        }
     }
     _added = true;
 }
@@ -93,23 +215,35 @@ void EdgeInf::makeActive(void)
 
 void EdgeInf::makeInactive(void)
 {
-    assert(_added == true);
+    COLA_ASSERT(_added == true);
 
-    if (_visible)
+    if (_orthogonal)
     {
-        _router->visGraph.removeEdge(this);
-        _v1->visList.erase(_pos1);
-        _v1->visListSize--;
-        _v2->visList.erase(_pos2);
-        _v2->visListSize--;
+        COLA_ASSERT(_visible);
+        _router->visOrthogGraph.removeEdge(this);
+        _v1->orthogVisList.erase(_pos1);
+        _v1->orthogVisListSize--;
+        _v2->orthogVisList.erase(_pos2);
+        _v2->orthogVisListSize--;
     }
-    else // if (invisible)
+    else
     {
-        _router->invisGraph.removeEdge(this);
-        _v1->invisList.erase(_pos1);
-        _v1->invisListSize--;
-        _v2->invisList.erase(_pos2);
-        _v2->invisListSize--;
+        if (_visible)
+        {
+            _router->visGraph.removeEdge(this);
+            _v1->visList.erase(_pos1);
+            _v1->visListSize--;
+            _v2->visList.erase(_pos2);
+            _v2->visListSize--;
+        }
+        else // if (invisible)
+        {
+            _router->invisGraph.removeEdge(this);
+            _v1->invisList.erase(_pos1);
+            _v1->invisListSize--;
+            _v2->invisList.erase(_pos2);
+            _v2->invisListSize--;
+        }
     }
     _blocker = 0;
     _conns.clear();
@@ -119,11 +253,12 @@ void EdgeInf::makeInactive(void)
 
 void EdgeInf::setDist(double dist)
 {
-    //assert(dist != 0);
+    //COLA_ASSERT(dist != 0);
 
     if (_added && !_visible)
     {
         makeInactive();
+        COLA_ASSERT(!_added);
     }
     if (!_added)
     {
@@ -135,6 +270,12 @@ void EdgeInf::setDist(double dist)
 }
 
 
+bool EdgeInf::added(void)
+{
+    return _added;
+}
+
+
 void EdgeInf::alertConns(void)
 {
     FlagList::iterator finish = _conns.end();
@@ -161,11 +302,12 @@ void EdgeInf::addCycleBlocker(void)
 
 void EdgeInf::addBlocker(int b)
 {
-    assert(_router->InvisibilityGrph);
+    COLA_ASSERT(_router->InvisibilityGrph);
 
     if (_added && _visible)
     {
         makeInactive();
+        COLA_ASSERT(!_added);
     }
     if (!_added)
     {
@@ -232,8 +374,11 @@ void EdgeInf::checkVis(void)
         cone1 = inValidRegion(_router->IgnoreRegions, i->shPrev->point,
                 iPoint, i->shNext->point, jPoint);
     }
-    else
+    else if (_router->IgnoreRegions == false)
     {
+        // If Ignoring regions then this case is already caught by 
+        // the invalid regions, so only check it when not ignoring
+        // regions.
         ShapeSet& ss = _router->contains[iID];
 
         if ((jID.isShape) && (ss.find(jID.objID) != ss.end()))
@@ -253,8 +398,11 @@ void EdgeInf::checkVis(void)
             cone2 = inValidRegion(_router->IgnoreRegions, j->shPrev->point,
                     jPoint, j->shNext->point, iPoint);
         }
-        else
+        else if (_router->IgnoreRegions == false)
         {
+            // If Ignoring regions then this case is already caught by 
+            // the invalid regions, so only check it when not ignoring
+            // regions.
             ShapeSet& ss = _router->contains[jID];
 
             if ((iID.isShape) && (ss.find(iID.objID) != ss.end()))
@@ -274,7 +422,7 @@ void EdgeInf::checkVis(void)
         db_printf("\tSetting visibility edge... \n\t\t");
         db_print();
 
-        double d = dist(iPoint, jPoint);
+        double d = euclideanDist(iPoint, jPoint);
 
         setDist(d);
 
@@ -316,26 +464,39 @@ int EdgeInf::firstBlocker(void)
     }
 
     VertInf *last = _router->vertices.end();
+    unsigned int lastId = 0;
+    bool seenIntersectionAtEndpoint = false;
     for (VertInf *k = _router->vertices.shapesBegin(); k != last; )
     {
         VertID kID = k->id;
-        if ((ss.find(kID.objID) != ss.end()))
+        if (k->id == dummyOrthogID)
+        {
+            // Don't include orthogonal dummy vertices.
+            k = k->lstNext;
+            continue;
+        }
+        if (kID.objID != lastId)
         {
-            unsigned int shapeID = kID.objID;
-            db_printf("Endpoint is inside shape %u so ignore shape edges.\n",
-                    kID.objID);
-            // One of the endpoints is inside this shape so ignore it.
-            while ((k != last) && (k->id.objID == shapeID))
+            if ((ss.find(kID.objID) != ss.end()))
             {
-                // And skip the other vertices from this shape.
-                k = k->lstNext;
+                unsigned int shapeID = kID.objID;
+                db_printf("Endpoint is inside shape %u so ignore shape "
+                        "edges.\n", kID.objID);
+                // One of the endpoints is inside this shape so ignore it.
+                while ((k != last) && (k->id.objID == shapeID))
+                {
+                    // And skip the other vertices from this shape.
+                    k = k->lstNext;
+                }
+                continue;
             }
-            continue;
+            seenIntersectionAtEndpoint = false;
+            lastId = kID.objID;
         }
         Point& kPoint = k->point;
         Point& kPrevPoint = k->shPrev->point;
-
-        if (segmentIntersect(pti, ptj, kPrevPoint, kPoint))
+        if (segmentShapeIntersect(pti, ptj, kPrevPoint, kPoint, 
+                    seenIntersectionAtEndpoint))
         {
             ss.clear();
             return kID.objID;
@@ -358,9 +519,17 @@ bool EdgeInf::isBetween(VertInf *i, VertInf *j)
 }
 
 
+    // Returns true if this edge is a vertical or horizontal line segment.
+bool EdgeInf::isOrthogonal(void) const
+{
+    return ((_v1->point.x == _v2->point.x) || 
+            (_v1->point.y == _v2->point.y));
+}
+
+
 VertInf *EdgeInf::otherVert(VertInf *vert)
 {
-    assert((vert == _v1) || (vert == _v2));
+    COLA_ASSERT((vert == _v1) || (vert == _v2));
 
     if (vert == _v1)
     {
@@ -372,12 +541,17 @@ VertInf *EdgeInf::otherVert(VertInf *vert)
 
 EdgeInf *EdgeInf::checkEdgeVisibility(VertInf *i, VertInf *j, bool knownNew)
 {
+    // This is for polyline routing, so check we're not 
+    // considering orthogonal vertices.
+    COLA_ASSERT(i->id != dummyOrthogID);
+    COLA_ASSERT(j->id != dummyOrthogID);
+    
     Router *router = i->_router;
     EdgeInf *edge = NULL;
 
     if (knownNew)
     {
-        assert(existingEdge(i, j) == NULL);
+        COLA_ASSERT(existingEdge(i, j) == NULL);
         edge = new EdgeInf(i, j);
     }
     else
@@ -399,22 +573,17 @@ EdgeInf *EdgeInf::checkEdgeVisibility(VertInf *i, VertInf *j, bool knownNew)
 }
 
 
+    // XXX: This function is ineffecient, and shouldn't even really be
+    //      required.
 EdgeInf *EdgeInf::existingEdge(VertInf *i, VertInf *j)
 {
     VertInf *selected = NULL;
 
-    if (i->visListSize <= j->visListSize)
-    {
-        selected = i;
-    }
-    else
-    {
-        selected = j;
-    }
-
+    // Look through poly-line visibility edges.
+    selected = (i->visListSize <= j->visListSize) ? i : j;
     EdgeInfList& visList = selected->visList;
-    EdgeInfList::iterator finish = visList.end();
-    for (EdgeInfList::iterator edge = visList.begin(); edge != finish;
+    EdgeInfList::const_iterator finish = visList.end();
+    for (EdgeInfList::const_iterator edge = visList.begin(); edge != finish;
             ++edge)
     {
         if ((*edge)->isBetween(i, j))
@@ -423,18 +592,24 @@ EdgeInf *EdgeInf::existingEdge(VertInf *i, VertInf *j)
         }
     }
 
-    if (i->invisListSize <= j->invisListSize)
-    {
-        selected = i;
-    }
-    else
+    // Look through orthogonal visbility edges.
+    selected = (i->orthogVisListSize <= j->orthogVisListSize) ? i : j;
+    EdgeInfList& orthogVisList = selected->orthogVisList;
+    finish = orthogVisList.end();
+    for (EdgeInfList::const_iterator edge = orthogVisList.begin(); 
+            edge != finish; ++edge)
     {
-        selected = j;
+        if ((*edge)->isBetween(i, j))
+        {
+            return (*edge);
+        }
     }
 
+    // Look through poly-line invisbility edges.
+    selected = (i->invisListSize <= j->invisListSize) ? i : j;
     EdgeInfList& invisList = selected->invisList;
     finish = invisList.end();
-    for (EdgeInfList::iterator edge = invisList.begin(); edge != finish;
+    for (EdgeInfList::const_iterator edge = invisList.begin(); edge != finish;
             ++edge)
     {
         if ((*edge)->isBetween(i, j))
@@ -450,19 +625,45 @@ EdgeInf *EdgeInf::existingEdge(VertInf *i, VertInf *j)
 //===========================================================================
 
 
-EdgeList::EdgeList()
-    : _firstEdge(NULL)
-    , _lastEdge(NULL)
-    , _count(0)
+EdgeList::EdgeList(bool orthogonal)
+    : _orthogonal(orthogonal),
+      _firstEdge(NULL),
+      _lastEdge(NULL),
+      _count(0)
+{
+}
+
+
+EdgeList::~EdgeList()
+{
+    clear();
+}
+
+
+void EdgeList::clear(void)
+{
+    while (_firstEdge)
+    {
+        delete _firstEdge;
+    }
+    COLA_ASSERT(_count == 0);
+    _lastEdge = NULL;
+}
+
+
+int EdgeList::size(void) const
 {
+    return _count;
 }
 
 
 void EdgeList::addEdge(EdgeInf *edge)
 {
+    COLA_ASSERT(!_orthogonal || edge->isOrthogonal());
+    
     if (_firstEdge == NULL)
     {
-        assert(_lastEdge == NULL);
+        COLA_ASSERT(_lastEdge == NULL);
 
         _lastEdge = edge;
         _firstEdge = edge;
@@ -472,7 +673,7 @@ void EdgeList::addEdge(EdgeInf *edge)
     }
     else
     {
-        assert(_lastEdge != NULL);
+        COLA_ASSERT(_lastEdge != NULL);
 
         _lastEdge->lstNext = edge;
         edge->lstPrev = _lastEdge;
index 05f03a988ba66d6bebd5edccb7159ee90374143d..db776b80b139c98286725538652590d36d38a9ca 100644 (file)
@@ -2,24 +2,27 @@
  * vim: ts=4 sw=4 et tw=0 wm=0
  *
  * libavoid - Fast, Incremental, Object-avoiding Line Router
- * Copyright (C) 2004-2006  Michael Wybrow <mjwybrow@users.sourceforge.net>
+ *
+ * Copyright (C) 2004-2009  Monash University
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
+ * See the file LICENSE.LGPL distributed with the library.
+ *
+ * Licensees holding a valid commercial license may use this file in
+ * accordance with the commercial license agreement provided with the 
+ * library.
  *
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
  *
+ * Author(s):   Michael Wybrow <mjwybrow@users.sourceforge.net>
 */
 
+
 #ifndef AVOID_GRAPH_H
 #define AVOID_GRAPH_H
 
@@ -31,6 +34,7 @@
 
 namespace Avoid {
 
+
 class ConnRef;
 class Router;
 
@@ -42,8 +46,8 @@ typedef std::list<bool *> FlagList;
 class EdgeInf
 {
     public:
-        EdgeInf(VertInf *v1, VertInf *v2);
-        virtual ~EdgeInf();
+        EdgeInf(VertInf *v1, VertInf *v2, const bool orthogonal = false);
+        ~EdgeInf();
         inline double getDist(void)
         {
             return _dist;
@@ -53,6 +57,9 @@ class EdgeInf
         void addConn(bool *flag);
         void addCycleBlocker(void);
         void addBlocker(int b);
+        bool added(void);
+        bool isOrthogonal(void) const;
+        bool rotationLessThan(const VertInf* last, const EdgeInf *rhs) const;
 
         std::pair<VertID, VertID> ids(void);
         std::pair<Point, Point> points(void);
@@ -70,6 +77,7 @@ class EdgeInf
         Router *_router;
         bool _added;
         bool _visible;
+        bool _orthogonal;
         VertInf *_v1;
         VertInf *_v2;
         EdgeInfList::iterator _pos1;
@@ -87,12 +95,17 @@ class EdgeInf
 class EdgeList
 {
     public:
-        EdgeList();
-        void addEdge(EdgeInf *edge);
-        void removeEdge(EdgeInf *edge);
+        friend class EdgeInf;
+        EdgeList(bool orthogonal = false);
+        ~EdgeList();
+        void clear(void);
         EdgeInf *begin(void);
         EdgeInf *end(void);
+        int size(void) const;
     private:
+        void addEdge(EdgeInf *edge);
+        void removeEdge(EdgeInf *edge);
+        bool _orthogonal;
         EdgeInf *_firstEdge;
         EdgeInf *_lastEdge;
         unsigned int _count;
index d598c6c74b6873213c6ebe0a5be4723f9bb8ab95..1d4cd1fdc476aef929adef3d5974d162a512166c 100644 (file)
@@ -2,29 +2,37 @@
  * vim: ts=4 sw=4 et tw=0 wm=0
  *
  * libavoid - Fast, Incremental, Object-avoiding Line Router
- * Copyright (C) 2004-2006  Michael Wybrow <mjwybrow@users.sourceforge.net>
+ *
+ * Copyright (C) 2004-2009  Monash University
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
+ * See the file LICENSE.LGPL distributed with the library.
+ *
+ * Licensees holding a valid commercial license may use this file in
+ * accordance with the commercial license agreement provided with the 
+ * library.
  *
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
  *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- * 
+ * Author(s):   Michael Wybrow <mjwybrow@users.sourceforge.net>
 */
 
+//! @file  libavoid.h
+//! @brief Standard libavoid include file which includes all libavoid 
+//!        header files.
+
+//! @namespace Avoid
+//! @brief The namespace used by code in the libavoid library.
+
 #ifndef AVOID_LIBAVOID_H
 #define AVOID_LIBAVOID_H
 
 #include "libavoid/geomtypes.h"
-#include "libavoid/polyutil.h"
 #include "libavoid/connector.h"
 #include "libavoid/graph.h"
 #include "libavoid/debug.h"
@@ -32,7 +40,6 @@
 #include "libavoid/makepath.h"
 #include "libavoid/vertices.h"
 #include "libavoid/visibility.h"
-#include "libavoid/static.h"
 #include "libavoid/router.h"
 
 #endif
index 3a57f8e4e3f099e99f03fd2602e08749219f6810..4e15dbca9878aa697bd4f8404362fac588375ddc 100644 (file)
  * vim: ts=4 sw=4 et tw=0 wm=0
  *
  * libavoid - Fast, Incremental, Object-avoiding Line Router
- * Copyright (C) 2004-2006  Michael Wybrow <mjwybrow@users.sourceforge.net>
  *
- * --------------------------------------------------------------------
- * The dijkstraPath function is based on code published and described
- * in "Algorithms in C" (Second Edition), 1990, by Robert Sedgewick.
- * --------------------------------------------------------------------
+ * Copyright (C) 2004-2009  Monash University
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
+ * See the file LICENSE.LGPL distributed with the library.
+ *
+ * Licensees holding a valid commercial license may use this file in
+ * accordance with the commercial license agreement provided with the 
+ * library.
  *
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
  *
+ * Author(s):   Michael Wybrow <mjwybrow@users.sourceforge.net>
 */
 
+
+#include <algorithm>
+#include <vector>
+#include <climits>
+#define _USE_MATH_DEFINES
+#include <cmath>
+
 #include "libavoid/vertices.h"
 #include "libavoid/makepath.h"
 #include "libavoid/geometry.h"
 #include "libavoid/connector.h"
 #include "libavoid/graph.h"
 #include "libavoid/router.h"
-#include <algorithm>
-#include <vector>
-#include <climits>
-#include <limits.h>
-#include <math.h>
+#include "libavoid/debug.h"
+#include "libavoid/assertions.h"
+#ifdef ASTAR_DEBUG
+  #include <SDL_gfxPrimitives.h>
+#endif
 
 namespace Avoid {
 
+class ANode
+{
+    public:
+        VertInf* inf;
+        double g;        // Gone
+        double h;        // Heuristic
+        double f;        // Formula f = g + h
+        
+        int prevIndex;   // Index into DONE for the previous ANode.
+        int timeStamp;   // Timestamp used to determine explaration order of
+                         // seemingly equal paths during orthogonal routing.
+
+        ANode(VertInf *vinf, int time)
+            : inf(vinf),
+              g(0),
+              h(0),
+              f(0),
+              prevIndex(-1),
+              timeStamp(time)
+        {
+        }
+        ANode()
+            : inf(NULL),
+              g(0),
+              h(0),
+              f(0),
+              prevIndex(-1),
+              timeStamp(-1)
+        {
+        }
+};
+
+
+// This returns the opposite result (>) so that when used with stl::make_heap, 
+// the head node of the heap will be the smallest value, rather than the 
+// largest.  This saves us from having to sort the heap (and then reorder
+// it back into a heap) when getting the next node to examine.  This way we
+// get better complexity -- logarithmic pushs and pops to the heap.
+//
+bool operator<(const ANode &a, const ANode &b)
+{
+    if (a.f != b.f)
+    {
+        return a.f > b.f;
+    }
+    if (a.timeStamp != b.timeStamp)
+    {
+        // Tiebreaker, if two paths have equal cost, then choose the one with
+        // the highest timeStamp.  This corresponds to the furthest point
+        // explored along the straight-line path.  When exploring we give the
+        // directions the following timeStamps; left:1, right:2 and forward:3,
+        // then we always try to explore forward first.
+        return a.timeStamp < b.timeStamp;
+    }
+    COLA_ASSERT(a.prevIndex != b.prevIndex);
+    return a.prevIndex > b.prevIndex;
+}
+
 
 static double Dot(const Point& l, const Point& r)
 {
@@ -56,6 +118,13 @@ static double CrossLength(const Point& l, const Point& r)
 //
 static double angleBetween(const Point& p1, const Point& p2, const Point& p3)
 {
+    if ((p1.x == p2.x && p1.y == p2.y) || (p2.x == p3.x && p2.y == p3.y))
+    {
+        // If two of the points are the same, then we can't say anything
+        // about the angle between.  Treat them as being collinear.
+        return M_PI;
+    }
+
     Point v1(p1.x - p2.x, p1.y - p2.y);
     Point v2(p3.x - p2.x, p3.y - p2.y);
 
@@ -63,21 +132,45 @@ static double angleBetween(const Point& p1, const Point& p2, const Point& p3)
 }
 
 
+// Construct a temporary Polygon path given several VertInf's for a connector.
+//
+static void constructPolygonPath(Polygon& connRoute, VertInf *inf2, 
+        VertInf *inf3, std::vector<ANode>& done, int inf1Index)
+{
+    int routeSize = 2;
+    for (int curr = inf1Index; curr >= 0; curr = done[curr].prevIndex)
+    {
+        routeSize += 1;
+    }
+    connRoute.ps.resize(routeSize);
+    connRoute.ps[routeSize - 1] = inf3->point;
+    connRoute.ps[routeSize - 2] = inf2->point;
+    routeSize -= 3;
+    for (int curr = inf1Index; curr >= 0; curr = done[curr].prevIndex)
+    {
+        connRoute.ps[routeSize] = done[curr].inf->point;
+        routeSize -= 1;
+    }
+}
+
+
 // Given the two points for a new segment of a path (inf2 & inf3)
 // as well as the distance between these points (dist), as well as
 // possibly the previous point (inf1) [from inf1--inf2], return a
 // cost associated with this route.
 //
-double cost(ConnRef *lineRef, const double dist, VertInf *inf1,
-        VertInf *inf2, VertInf *inf3)
+static double cost(ConnRef *lineRef, const double dist, VertInf *inf2, 
+        VertInf *inf3, std::vector<ANode>& done, int inf1Index)
 {
+    VertInf *inf1 = (inf1Index >= 0) ?  done[inf1Index].inf : NULL;
     double result = dist;
+    Polygon connRoute;
 
     Router *router = inf2->_router;
-    if (inf2->pathNext != NULL)
+    if (inf1 != NULL)
     {
-        double& angle_penalty = router->angle_penalty;
-        double& segmt_penalty = router->segmt_penalty;
+        const double angle_penalty = router->routingPenalty(anglePenalty);
+        const double segmt_penalty = router->routingPenalty(segmentPenalty);
 
         // This is not the first segment, so there is a bend
         // between it and the last one in the existing path.
@@ -89,29 +182,83 @@ double cost(ConnRef *lineRef, const double dist, VertInf *inf1,
 
             double rad = M_PI - angleBetween(p1, p2, p3);
 
-            // Make `xval' between 0--10 then take its log so small
-            // angles are not penalised as much as large ones.
-            //
-            double xval = rad * 10 / M_PI;
-            double yval = xval * log10(xval + 1) / 10.5;
-            result += (angle_penalty * yval);
-            //printf("deg from straight: %g\tpenalty: %g\n",
-            //        rad * 180 / M_PI, (angle_penalty * yval));
-
-            // Don't penalise as an extra segment if there is no turn.
-            if (rad > 0.0005)
+            if (rad > 0)
+            {
+                // Make `xval' between 0--10 then take its log so small
+                // angles are not penalised as much as large ones.
+                //
+                double xval = rad * 10 / M_PI;
+                double yval = xval * log10(xval + 1) / 10.5;
+                result += (angle_penalty * yval);
+                //db_printf("deg from straight: %g\tpenalty: %g\n",
+                //        rad * 180 / M_PI, (angle_penalty * yval));
+            }
+
+            if (rad == M_PI)
             {
+                // Needs to double back
+                result += (2 * segmt_penalty);
+            }
+            else if (rad > 0)
+            {
+                // Only penalise as an extra segment if the two 
+                // segments are not collinear.
                 result += segmt_penalty;
             }
         }
     }
 
-    if (lineRef->doesHateCrossings() && (router->crossing_penalty > 0))
+    if (!router->_inCrossingPenaltyReroutingStage)
     {
-        Point& a1 = inf2->point;
-        Point& a2 = inf3->point;
+        // Return here if we ar not in the postprocessing stage 
+        return result;
+    }
 
-        ConnRefList::iterator curr, finish = router->connRefs.end();
+    const double cluster_crossing_penalty = 
+            router->routingPenalty(clusterCrossingPenalty);
+    // XXX: Clustered routing doesn't yet work with orthogonal connectors.
+    if (router->ClusteredRouting && !router->clusterRefs.empty() &&
+            (cluster_crossing_penalty > 0) && 
+            (lineRef->routingType() != ConnType_Orthogonal))
+    {
+        if (connRoute.empty())
+        {
+            constructPolygonPath(connRoute, inf2, inf3, done, inf1Index);
+        }
+        // There are clusters so do cluster routing.
+        for (ClusterRefList::const_iterator cl = router->clusterRefs.begin(); 
+                cl != router->clusterRefs.end(); ++cl)
+        {
+            ReferencingPolygon& cBoundary = (*cl)->polygon();
+            COLA_ASSERT(cBoundary.ps[0] != cBoundary.ps[cBoundary.size() - 1]);
+            for (size_t j = 0; j < cBoundary.size(); ++j)
+            {
+                // Cluster boundary points should correspond to shape 
+                // vertices and hence already be in the list of vertices.
+                COLA_ASSERT(router->vertices.getVertexByPos(cBoundary.at(j))!=NULL);
+            }
+            
+            bool isConn = false;
+            Polygon dynamic_c_boundary(cBoundary);
+            Polygon dynamic_conn_route(connRoute);
+            const bool finalSegment = (inf3 == lineRef->dst());
+            CrossingsInfoPair crossings = countRealCrossings(
+                    dynamic_c_boundary, isConn, dynamic_conn_route, 
+                    connRoute.size() - 1, true, finalSegment);
+            result += (crossings.first * cluster_crossing_penalty);
+        }
+    }
+
+    const double shared_path_penalty = 
+            router->routingPenalty(fixedSharedPathPenalty);
+    if (shared_path_penalty > 0)
+    {
+        // Penalises shared paths, except if the connectors shared an endpoint.
+        if (connRoute.empty())
+        {
+            constructPolygonPath(connRoute, inf2, inf3, done, inf1Index);
+        }
+        ConnRefList::const_iterator curr, finish = router->connRefs.end();
         for (curr = router->connRefs.begin(); curr != finish; ++curr)
         {
             ConnRef *connRef = *curr;
@@ -120,306 +267,237 @@ double cost(ConnRef *lineRef, const double dist, VertInf *inf1,
             {
                 continue;
             }
-            Avoid::PolyLine& route2 = connRef->route();
-            for (int j = 1; j < route2.pn; ++j)
-            {
-                Avoid::Point& b1 = route2.ps[j - 1];
-                Avoid::Point& b2 = route2.ps[j];
+            const Avoid::PolyLine& route2 = connRef->route();
             
-                if (((a1 == b1) && (a2 == b2)) ||
-                    ((a2 == b1) && (a1 == b2)))
-                {
-                    // Route along same segment: no penalty.  We detect
-                    // crossovers when we see the segments diverge.
-                    continue;
-                }
-
-                if ((a2 == b2) || (a2 == b1) || (b2 == a1))
-                {
-                    // Each crossing that is at a vertex in the 
-                    // visibility graph gets noticed four times.
-                    // We ignore three of these cases.
-                    // This also catches the case of a shared path,
-                    // but this is one that terminates at a common
-                    // endpoint, so we don't care about it.
-                    continue;
-                }
-
-                if (a1 == b1)
-                {
-                    if (j == 1)
-                    {
-                        // common source point.
-                        continue;
-                    }
-                    Avoid::Point& b0 = route2.ps[j - 2];
-                    // The segments share an endpoint -- a1==b1.
-                    if (a2 == b0)
-                    {
-                        // a2 is not a split, continue.
-                        continue;
-                    }
-                    
-                    // If here, then we know that a2 != b2
-                    // And a2 and its pair in b are a split.
-                    assert(a2 != b2);
-
-                    if (inf2->pathNext == NULL)
-                    {
-                        continue;
-                    }
-                    Avoid::Point& a0 = inf1->point;
-
-                    if ((a0 == b0) || (a0 == b2))
-                    {
-                        //printf("Shared path... ");
-                        bool normal = (a0 == b0) ? true : false;
-                        // Determine direction we have to look through
-                        // the points of connector b.
-                        int dir = normal ? -1 : 1;
-                        
-                        int traceJ = j - 1 + dir;
-                        
-                        int endCornerSide = Avoid::cornerSide(
-                                a0, a1, a2, normal ? b2 : b0);
-
-                        
-                        VertInf *traceInf1 = inf2->pathNext;
-                        VertInf *traceInf2 = inf2;
-                        VertInf *traceInf3 = inf3;
-                        while (traceInf1 &&
-                                (traceJ >= 0) && (traceJ < route2.pn) &&
-                                (traceInf1->point == route2.ps[traceJ]))
-                        {
-                            traceInf3 = traceInf2;
-                            traceInf2 = traceInf1;
-                            traceInf1 = traceInf1->pathNext;
-                            traceJ += dir;
-                        }
-                        
-                        if (!traceInf1 ||
-                                (traceJ < 0) || (traceJ >= route2.pn))
-                        {
-                            //printf("common source or destination.\n");
-                            // The connectors have a shared path, but it
-                            // comes from a common source point.
-                            // XXX: There might be a better way to
-                            //      check this by asking the connectors
-                            //      for the IDs of the attached shapes.
-                            continue;
-                        }
-                        
-                        int startCornerSide = Avoid::cornerSide(
-                                traceInf1->point, traceInf2->point,
-                                traceInf3->point, route2.ps[traceJ]);
-                        
-                        if (endCornerSide != startCornerSide)
-                        {
-                            //printf("crosses.\n");
-                            result += router->crossing_penalty;
-                        }
-                        else
-                        {
-                            //printf("doesn't cross.\n");
-                        }
-                    }
-                    else
-                    {
-                        // The connectors cross or touch at this point.
-                        //printf("Cross or touch at point... ");
-                    
-                        int side1 = Avoid::cornerSide(a0, a1, a2, b0);
-                        int side2 = Avoid::cornerSide(a0, a1, a2, b2);
-
-                        if (side1 != side2)
-                        {
-                            //printf("cross.\n");
-                            // The connectors cross at this point.
-                            result += router->crossing_penalty;
-                        }
-                        else
-                        {
-                            //printf("touch.\n");
-                            // The connectors touch at this point.
-                        }
-                    }
-                    continue;
-                }
+            bool isConn = true;
+            Polygon dynamic_route2(route2);
+            Polygon dynamic_conn_route(connRoute);
+            CrossingsInfoPair crossings = countRealCrossings(
+                    dynamic_route2, isConn, dynamic_conn_route, 
+                    connRoute.size() - 1, false, false, NULL, NULL,
+                    connRef, lineRef);
+
+            if ((crossings.second & CROSSING_SHARES_PATH) &&
+                    (crossings.second & CROSSING_SHARES_FIXED_SEGMENT) &&
+                    !(crossings.second & CROSSING_SHARES_PATH_AT_END))
+            {
+                // Penalise unecessary shared paths in the middle of
+                // connectors.
+                result += shared_path_penalty;
+            }
+        }
+    }
 
-                double xc, yc;
-                int intersectResult = Avoid::segmentIntersectPoint(
-                        a1, a2, b1, b2, &xc, &yc);
+    const double crossing_penalty = router->routingPenalty(crossingPenalty);
+    if (lineRef->doesHateCrossings() && (crossing_penalty > 0))
+    {
+        if (connRoute.empty())
+        {
+            constructPolygonPath(connRoute, inf2, inf3, done, inf1Index);
+        }
+        ConnRefList::const_iterator curr, finish = router->connRefs.end();
+        for (curr = router->connRefs.begin(); curr != finish; ++curr)
+        {
+            ConnRef *connRef = *curr;
 
-                if (intersectResult == Avoid::DO_INTERSECT)
-                {
-                    result += router->crossing_penalty;
-                }
+            if (connRef->id() == lineRef->id())
+            {
+                continue;
             }
+            const Avoid::PolyLine& route2 = connRef->route();
+            
+            bool isConn = true;
+            Polygon dynamic_route2(route2);
+            Polygon dynamic_conn_route(connRoute);
+            CrossingsInfoPair crossings = countRealCrossings(
+                    dynamic_route2, isConn, dynamic_conn_route, 
+                    connRoute.size() - 1, true);
+            result += (crossings.first * crossing_penalty);
         }
     }
-    
+
     return result;
 }
 
 
-// Returns the best path from src to tar using the cost function.
-//
-// The path is worked out via Dijkstra's algorithm, and is encoded via
-// pathNext links in each of the VerInfs along the path.
-//
-// Based on the code of 'matrixpfs'.
-//
-static void dijkstraPath(ConnRef *lineRef, VertInf *src, VertInf *tar)
+static double estimatedCost(ConnRef *lineRef, const Point *last, 
+        const Point& a, const Point& b)
 {
-    Router *router = src->_router;
-
-    double unseen = (double) __INT_MAX__;
-
-    // initialize arrays
-    VertInf *finish = router->vertices.end();
-    for (VertInf *t = router->vertices.connsBegin(); t != finish; t = t->lstNext)
+    if (lineRef->routingType() == ConnType_PolyLine)
     {
-        t->pathNext = NULL;
-        t->pathDist = -unseen;
+        return euclideanDist(a, b);
     }
-
-    VertInf *min = src;
-    while (min != tar)
+    else // Orthogonal
     {
-        VertInf *k = min;
-        min = NULL;
-
-        k->pathDist *= -1;
-        if (k->pathDist == unseen)
+        // XXX: This currently just takes into account the compulsory
+        //      bend but will have to be updated when port direction 
+        //      information is available.
+        int num_penalties = 0;
+        double xmove = b.x - a.x;
+        double ymove = b.y - a.y;
+        if (!last)
         {
-            k->pathDist = 0;
-        }
-
-        EdgeInfList& visList = k->visList;
-        EdgeInfList::iterator finish = visList.end();
-        for (EdgeInfList::iterator edge = visList.begin(); edge != finish;
-                ++edge)
-        {
-            VertInf *t = (*edge)->otherVert(k);
-            VertID tID = t->id;
-
-            // Only check shape verticies, or endpoints.
-            if ((t->pathDist < 0) &&
-                    ((tID.objID == src->id.objID) || tID.isShape))
+            // Just two points.
+            if ((xmove != 0) && (ymove != 0))
             {
-                double kt_dist = (*edge)->getDist();
-                double priority = k->pathDist +
-                        cost(lineRef, kt_dist, k->pathNext, k, t);
-
-                if ((kt_dist != 0) && (t->pathDist < -priority))
-                {
-                    t->pathDist = -priority;
-                    t->pathNext = k;
-                }
-                if ((min == NULL) || (t->pathDist > min->pathDist))
-                {
-                    min = t;
-                }
+                num_penalties += 1;
             }
         }
-        EdgeInfList& invisList = k->invisList;
-        finish = invisList.end();
-        for (EdgeInfList::iterator edge = invisList.begin(); edge != finish;
-                ++edge)
+        else
         {
-            VertInf *t = (*edge)->otherVert(k);
-            VertID tID = t->id;
-
-            // Only check shape verticies, or endpoints.
-            if ((t->pathDist < 0) &&
-                    ((tID.objID == src->id.objID) || tID.isShape > 0))
+            // We have three points, so we know the direction of the 
+            // previous segment.
+            double rad = M_PI - angleBetween(*last, a, b);
+            if (rad > (M_PI / 2))            
             {
-                if ((min == NULL) || (t->pathDist > min->pathDist))
-                {
-                    min = t;
-                }
+                // Target point is back in the direction of the first point,
+                // so at least two bends are required.
+                num_penalties += 2;
+            }
+            else if (rad > 0)
+            {
+                // To the side, so at least one bend.
+                num_penalties += 1;
             }
         }
+        double penalty = num_penalties * 
+                lineRef->router()->routingPenalty(segmentPenalty);
+
+        return manhattanDist(a, b) + penalty;
     }
 }
 
 
-class ANode
+class CmpVisEdgeRotation 
 {
     public:
-        VertInf* inf;
-        double g;        // Gone
-        double h;        // Heuristic
-        double f;        // Formula f = g + h
-        VertInf *pp;
-
-        ANode(VertInf *vinf)
-            : inf(vinf)
-            , g(0)
-            , h(0)
-            , f(0)
-            , pp(NULL)
+        CmpVisEdgeRotation(const VertInf* lastPt)
+            : _lastPt(lastPt)
         {
         }
-        ANode()
-            : inf(NULL)
-            , g(0)
-            , h(0)
-            , f(0)
-            , pp(NULL)
+        bool operator() (const EdgeInf* u, const EdgeInf* v) const 
         {
+            return u->rotationLessThan(_lastPt, v);
         }
+    private:
+        const VertInf *_lastPt;
 };
 
-bool operator<(const ANode &a, const ANode &b)
-{
-    return a.f < b.f;
-}
-
-
-bool operator>(const ANode &a, const ANode &b)
-{
-    return a.f > b.f;
-}
-
 
 // Returns the best path from src to tar using the cost function.
 //
 // The path is worked out using the aStar algorithm, and is encoded via
-// pathNext links in each of the VerInfs along the path.
+// prevIndex values for each ANode which point back to the previous ANode's
+// position in the DONE vector.  At completion, this order is written into
+// the pathNext links in each of the VerInfs along the path.
 //
 // The aStar STL code is based on public domain code available on the
 // internet.
 //
-static void aStarPath(ConnRef *lineRef, VertInf *src, VertInf *tar)
+static void aStarPath(ConnRef *lineRef, VertInf *src, VertInf *tar, 
+        VertInf *start)
 {
+    bool isOrthogonal = (lineRef->routingType() == ConnType_Orthogonal);
+
+    double (*dist)(const Point& a, const Point& b) = 
+        (isOrthogonal) ? manhattanDist : euclideanDist;
+
     std::vector<ANode> PENDING;     // STL Vectors chosen because of rapid
     std::vector<ANode> DONE;        // insertions/deletions at back,
     ANode Node, BestNode;           // Temporary Node and BestNode
     bool bNodeFound = false;        // Flag if node is found in container
+    int timestamp = 1;
 
-    tar->pathNext = NULL;
+    if (start == NULL)
+    {
+        start = src;
+    }
+
+    Router *router = lineRef->router();
+    if (router->RubberBandRouting && (start != src))
+    {
+        COLA_ASSERT(router->IgnoreRegions == true);
+        
+        const PolyLine& currRoute = lineRef->route();
+        VertInf *last = NULL;
+        int rIndx = 0;
+        while (last != start)
+        {
+            const Point& pnt = currRoute.at(rIndx);
+            bool isShape = (rIndx > 0);
+            VertID vID(pnt.id, isShape, pnt.vn);
+
+#ifdef PATHDEBUG
+            db_printf("/// %d %d %d\n", pnt.id, (int) isShape, pnt.vn);
+#endif
+            VertInf *curr = router->vertices.getVertexByID(vID);
+            COLA_ASSERT(curr != NULL);
+
+            Node = ANode(curr, timestamp++);
+            if (!last)
+            {
+                Node.g = 0;
+                Node.h = estimatedCost(lineRef, NULL, Node.inf->point, 
+                        tar->point);
+                Node.f = Node.g + Node.h;
+            }
+            else
+            {
+                double edgeDist = dist(BestNode.inf->point, curr->point);
+
+                Node.g = BestNode.g + cost(lineRef, edgeDist, BestNode.inf, 
+                        Node.inf, DONE, BestNode.prevIndex);
+
+                // Calculate the Heuristic.
+                Node.h = estimatedCost(lineRef, &(BestNode.inf->point),
+                        Node.inf->point, tar->point);
+
+                // The A* formula
+                Node.f = Node.g + Node.h;
+                
+                // Point parent to last BestNode (pushed onto DONE)
+                Node.prevIndex = DONE.size() - 1;
+            }
+
+            if (curr != start)
+            {
+                BestNode = Node;
+
+                DONE.push_back(BestNode);
+            }
+            else
+            {
+                PENDING.push_back(Node);
+            }
 
-    // Create the start node
-    Node = ANode(src);
-    Node.g = 0;
-    Node.h = dist(Node.inf->point, tar->point);
-    Node.f = Node.g + Node.h;
-    // Set a null parent, so cost function knows this is the first segment.
-    Node.pp = NULL;
+            rIndx++;
+            last = curr;
+        }
+    }
+    else
+    {
+        // Create the start node
+        Node = ANode(src, timestamp++);
+        Node.g = 0;
+        Node.h = estimatedCost(lineRef, NULL, Node.inf->point, tar->point);
+        Node.f = Node.g + Node.h;
+        // Set a null parent, so cost function knows this is the first segment.
+
+        // Populate the PENDING container with the first location
+        PENDING.push_back(Node);
+    }
+
+    tar->pathNext = NULL;
 
-    // Populate the PENDING container with the first location
-    PENDING.push_back(Node);
     // Create a heap from PENDING for sorting
     using std::make_heap; using std::push_heap; using std::pop_heap;
     make_heap( PENDING.begin(), PENDING.end() );
 
     while (!PENDING.empty())
     {
-        // Ascending sort based on overloaded operators below
-        sort_heap(PENDING.begin(), PENDING.end());
-
-        // Set the Node with lowest f value to BESTNODE
+        // Set the Node with lowest f value to BESTNODE.
+        // Since the ANode operator< is reversed, the head of the
+        // heap is the node with the lowest f value.
         BestNode = PENDING.front();
 
         // Pop off the heap.  Actually this moves the
@@ -427,38 +505,118 @@ static void aStarPath(ConnRef *lineRef, VertInf *src, VertInf *tar)
         // is not actually removed since the pop is to
         // the heap and not the container.
         pop_heap(PENDING.begin(), PENDING.end());
-
-
         // Remove node from right (the value we pop_heap'd)
         PENDING.pop_back();
 
         // Push the BestNode onto DONE
-        BestNode.inf->pathNext = BestNode.pp;
         DONE.push_back(BestNode);
 
+        VertInf *prevInf = (BestNode.prevIndex >= 0) ?
+                DONE[BestNode.prevIndex].inf : NULL;
 #if 0
-        printf("Considering... ");
-        BestNode.ID->print(stdout);
-        printf(" - g: %3.1f h: %3.1f f: %3.1f back: ", BestNode.g, BestNode.h,
-                BestNode.f);
-        BestNode.pp.print(stdout);
-        printf("\n");
+        db_printf("Considering... ");
+        db_printf(" %g %g  ", BestNode.inf->point.x, BestNode.inf->point.y);
+        BestNode.inf->id.db_print();
+        db_printf(" - g: %3.1f h: %3.1f back: ", BestNode.g, BestNode.h);
+        if (prevInf)
+        {
+            db_printf(" %g %g", prevInf->point.x, prevInf->point.y);
+            //prevInf->id.db_print();
+        }
+        db_printf("\n");
+#endif
+
+#if defined(ASTAR_DEBUG)
+        if (router->avoid_screen)
+        {
+            int canx = 151;
+            int cany = 55;
+            int radius = 5;
+            ANode curr;
+            for (curr = BestNode; curr.prevIndex >= 0; 
+                    curr = DONE[curr.prevIndex])
+            {
+                filledCircleRGBA(router->avoid_screen, 
+                        (int) curr.inf->point.x + canx,
+                        (int) curr.inf->point.y + cany, 
+                        radius, 0, 0, 255, 128);
+            }
+            filledCircleRGBA(router->avoid_screen, 
+                    (int) BestNode.inf->point.x + canx,
+                    (int) BestNode.inf->point.y + cany, 
+                    radius, 255, 0, 0, 255);
+
+            SDL_Flip(router->avoid_screen);
+            //SDL_Delay(500);
+
+            filledCircleRGBA(router->avoid_screen, 
+                    (int) BestNode.inf->point.x + canx,
+                    (int) BestNode.inf->point.y + cany, 
+                    radius, 255, 255, 255, 255);
+            filledCircleRGBA(router->avoid_screen, 
+                    (int) BestNode.inf->point.x + canx,
+                    (int) BestNode.inf->point.y + cany, 
+                    radius, 0, 255, 0, 128);
+            for (curr = BestNode; curr.prevIndex >= 0; 
+                    curr = DONE[curr.prevIndex])
+            {
+                filledCircleRGBA(router->avoid_screen, 
+                        (int) curr.inf->point.x + canx,
+                        (int) curr.inf->point.y + cany, 
+                        radius, 255, 255, 255, 255);
+                filledCircleRGBA(router->avoid_screen, 
+                        (int) curr.inf->point.x + canx,
+                        (int) curr.inf->point.y + cany, 
+                        radius, 0, 255, 0, 128);
+            }
+        }
 #endif
 
         // If at destination, break and create path below
         if (BestNode.inf == tar)
         {
+#ifdef PATHDEBUG
+            db_printf("Cost: %g\n", BestNode.f);
+#endif
             //bPathFound = true; // arrived at destination...
+            
+            // Correct all the pathNext pointers.
+            ANode curr;
+            int currIndex = DONE.size() - 1;
+            for (curr = BestNode; curr.prevIndex > 0; 
+                    curr = DONE[curr.prevIndex])
+            {
+                COLA_ASSERT(curr.prevIndex < currIndex);   
+                curr.inf->pathNext = DONE[curr.prevIndex].inf;
+                currIndex = curr.prevIndex;
+            }
+            // Check that we've gone through the complete path.
+            COLA_ASSERT(curr.prevIndex == 0);
+            // Fill in the final pathNext pointer.
+            curr.inf->pathNext = DONE[curr.prevIndex].inf;
+
             break;
         }
 
         // Check adjacent points in graph
-        EdgeInfList& visList = BestNode.inf->visList;
-        EdgeInfList::iterator finish = visList.end();
-        for (EdgeInfList::iterator edge = visList.begin(); edge != finish;
-                ++edge)
+        EdgeInfList& visList = (!isOrthogonal) ?
+                BestNode.inf->visList : BestNode.inf->orthogVisList;
+        if (isOrthogonal)
+        {
+            // We would like to explore in a structured way, 
+            // so sort the points in the visList...
+            CmpVisEdgeRotation compare(prevInf);
+            visList.sort(compare);
+        }
+        EdgeInfList::const_iterator finish = visList.end();
+        for (EdgeInfList::const_iterator edge = visList.begin(); 
+                edge != finish; ++edge)
         {
-            Node.inf = (*edge)->otherVert(BestNode.inf);
+            Node = ANode((*edge)->otherVert(BestNode.inf), timestamp++);
+
+            // Set the index to the previous ANode that we reached
+            // this ANode through (the last BestNode pushed onto DONE).
+            Node.prevIndex = DONE.size() - 1;
 
             // Only check shape verticies, or the tar endpoint.
             if (!(Node.inf->id.isShape) && (Node.inf != tar))
@@ -466,6 +624,15 @@ static void aStarPath(ConnRef *lineRef, VertInf *src, VertInf *tar)
                 continue;
             }
 
+            VertInf *prevInf = (BestNode.prevIndex >= 0) ?
+                    DONE[BestNode.prevIndex].inf : NULL;
+
+            // Don't bother looking at the segment we just arrived along.
+            if (prevInf && (prevInf == Node.inf))
+            {
+                continue;
+            }
+
             double edgeDist = (*edge)->getDist();
 
             if (edgeDist == 0)
@@ -473,31 +640,49 @@ static void aStarPath(ConnRef *lineRef, VertInf *src, VertInf *tar)
                 continue;
             }
 
-            VertInf *prevInf = BestNode.inf->pathNext;
+            if (!router->_orthogonalRouting &&
+                  (!router->RubberBandRouting || (start == src)) && 
+                  (validateBendPoint(prevInf, BestNode.inf, Node.inf) == false))
+            {
+                // The bendpoint is not valid, i.e., is a zigzag corner, so...
+                continue;
+                // For RubberBand routing we want to allow these routes and
+                // unwind them later, otherwise instead or unwinding, paths
+                // can go the *really* long way round.
+            }
 
-            Node.g = BestNode.g + cost(lineRef, edgeDist, prevInf,
-                    BestNode.inf, Node.inf);
+            Node.g = BestNode.g + cost(lineRef, edgeDist, BestNode.inf, 
+                    Node.inf, DONE, BestNode.prevIndex);
 
             // Calculate the Heuristic.
-            Node.h = dist(Node.inf->point, tar->point);
+            Node.h = estimatedCost(lineRef, &(BestNode.inf->point),
+                    Node.inf->point, tar->point);
 
             // The A* formula
             Node.f = Node.g + Node.h;
-            // Point parent to last BestNode (pushed onto DONE)
-            Node.pp = BestNode.inf;
+
+#if 0
+            db_printf("-- Adding: %g %g  ", Node.inf->point.x, 
+                    Node.inf->point.y);
+            Node.inf->id.db_print();
+            db_printf(" - g: %3.1f h: %3.1f \n", Node.g, Node.h);
+#endif
 
             bNodeFound = false;
 
             // Check to see if already on PENDING
             for (unsigned int i = 0; i < PENDING.size(); i++)
             {
-                if (Node.inf == PENDING.at(i).inf)
-                {   // If already on PENDING
-                    if (Node.g < PENDING.at(i).g)
+                ANode& ati = PENDING.at(i);
+                if ((Node.inf == ati.inf) &&
+                        (DONE[Node.prevIndex].inf == DONE[ati.prevIndex].inf))
+                {
+                    // If already on PENDING
+                    if (Node.g < ati.g)
                     {
-                        PENDING.at(i).g = Node.g;
-                        PENDING.at(i).f = Node.g + PENDING.at(i).h;
-                        PENDING.at(i).pp = Node.pp;
+                        PENDING[i] = Node;
+
+                        make_heap( PENDING.begin(), PENDING.end() );
                     }
                     bNodeFound = true;
                     break;
@@ -508,15 +693,14 @@ static void aStarPath(ConnRef *lineRef, VertInf *src, VertInf *tar)
                 // Check to see if already on DONE
                 for (unsigned int i = 0; i < DONE.size(); i++)
                 {
-                    if (Node.inf == DONE.at(i).inf)
+                    ANode& ati = DONE.at(i);
+                    if ((Node.inf == ati.inf) && 
+                            (DONE[Node.prevIndex].inf == DONE[ati.prevIndex].inf))
                     {
                         // If on DONE, Which has lower gone?
-                        if (Node.g < DONE.at(i).g)
+                        if (Node.g < ati.g)
                         {
-                            DONE.at(i).g = Node.g;
-                            DONE.at(i).f = Node.g + DONE.at(i).h;
-                            DONE.at(i).pp = Node.pp;
-                            DONE.at(i).inf->pathNext = Node.pp;
+                            DONE[i] = Node;
                         }
                         bNodeFound = true;
                         break;
@@ -530,26 +714,24 @@ static void aStarPath(ConnRef *lineRef, VertInf *src, VertInf *tar)
                 PENDING.push_back(Node);
                 // Push NewNode onto heap
                 push_heap( PENDING.begin(), PENDING.end() );
-                // Re-Assert heap, or will be short by one
-                make_heap( PENDING.begin(), PENDING.end() );
 
 #if 0
+                using std::cout; using std::endl;
                 // Display PENDING and DONE containers (For Debugging)
                 cout << "PENDING:   ";
-                for (int i = 0; i < PENDING.size(); i++)
+                for (unsigned int i = 0; i < PENDING.size(); i++)
                 {
-                    cout << PENDING.at(i).x << "," << PENDING.at(i).y << ",";
-                    cout << PENDING.at(i).g << "," << PENDING.at(i).h << "  ";
+                    cout << PENDING.at(i).g << "," << PENDING.at(i).h << ",";
+                    cout << PENDING.at(i).inf << "," << PENDING.at(i).pp << "  ";
                 }
                 cout << endl;
                 cout << "DONE:   ";
-                for (int i = 0; i < DONE.size(); i++)
+                for (unsigned int i = 0; i < DONE.size(); i++)
                 {
-                    cout << DONE.at(i).x << "," << DONE.at(i).y << ",";
-                    cout << DONE.at(i).g << "," << DONE.at(i).h << "  ";
+                    cout << DONE.at(i).g << "," << DONE.at(i).h << ",";
+                    cout << DONE.at(i).inf << "," << DONE.at(i).pp << "  ";
                 }
                 cout << endl << endl;
-                int ch = _getch();
 #endif
             }
         }
@@ -559,75 +741,52 @@ static void aStarPath(ConnRef *lineRef, VertInf *src, VertInf *tar)
 
 // Returns the best path for the connector referred to by lineRef.
 //
-// The path encoded in the pathNext links in each of the VerInfs
+// The path encoded in the pathNext links in each of the VertInfs
 // backwards along the path, from the tar back to the source.
 //
 void makePath(ConnRef *lineRef, bool *flag)
 {
+    bool isOrthogonal = (lineRef->routingType() == ConnType_Orthogonal);
     Router *router = lineRef->router();
     VertInf *src = lineRef->src();
     VertInf *tar = lineRef->dst();
+    VertInf *start = lineRef->start();
 
-    // If the connector hates crossings then we want to examine direct paths:
-    bool examineDirectPath = lineRef->doesHateCrossings();
-    
     // TODO: Could be more efficient here.
-    EdgeInf *directEdge = EdgeInf::existingEdge(src, tar);
-    if (!(router->IncludeEndpoints) && directVis(src, tar))
-    {
-        Point p = src->point;
-        Point q = tar->point;
-
-        assert(directEdge == NULL);
-
-        directEdge = new EdgeInf(src, tar);
-        tar->pathNext = src;
-        directEdge->setDist(dist(p, q));
-        directEdge->addConn(flag);
-
-        return;
-    }
-    else if (router->IncludeEndpoints && directEdge &&
-            (directEdge->getDist() > 0) && !examineDirectPath)
+    if (isOrthogonal)
     {
-        tar->pathNext = src;
-        directEdge->addConn(flag);
+        aStarPath(lineRef, src, tar, start);
     }
-    else
+    else // if (!isOrthogonal)
     {
-        // Mark the path endpoints as not being able to see
-        // each other.  This is true if we are here.
-        if (!(router->IncludeEndpoints) && router->InvisibilityGrph)
-        {
-            if (!directEdge)
-            {
-                directEdge = new EdgeInf(src, tar);
-            }
-            directEdge->addBlocker(0);
-        }
-
-        if (router->UseAStarSearch)
+        EdgeInf *directEdge = EdgeInf::existingEdge(src, tar);
+        // If the connector hates crossings or there are clusters present,
+        // then we want to examine direct paths:
+        bool examineDirectPath = lineRef->doesHateCrossings() || 
+                !(router->clusterRefs.empty());
+        
+        if ((start == src) && directEdge && (directEdge->getDist() > 0) && 
+                !examineDirectPath)
         {
-            aStarPath(lineRef, src, tar);
+            tar->pathNext = src;
+            directEdge->addConn(flag);
         }
         else
         {
-            dijkstraPath(lineRef, src, tar);
+            aStarPath(lineRef, src, tar, start);
         }
+    }
 
 #if 0
-        PointMap::iterator t;
-        for (VertInf *t = vertices.connsBegin(); t != vertices.end();
-                t = t->lstNext)
-        {
-
-            t->id.print();
-            printf(" -> ");
-            t->pathNext->id.print();
-            printf("\n");
-        }
-#endif
+    for (VertInf *t = vertices.connsBegin(); t != vertices.end();
+            t = t->lstNext)
+    {
+        t->id.db_print();
+        db_printf(" -> ");
+        t->pathNext->id.db_print();
+        db_printf("\n");
     }
+#endif
 }
 
 
index 4d68a01e3160fee822f43fe8f2b4d2352d7ccd0a..b40bfbc3d8ce22c0bb066c12e56647cee7b72492 100644 (file)
@@ -2,24 +2,27 @@
  * vim: ts=4 sw=4 et tw=0 wm=0
  *
  * libavoid - Fast, Incremental, Object-avoiding Line Router
- * Copyright (C) 2004-2006  Michael Wybrow <mjwybrow@users.sourceforge.net>
+ *
+ * Copyright (C) 2004-2008  Monash University
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
+ * See the file LICENSE.LGPL distributed with the library.
+ *
+ * Licensees holding a valid commercial license may use this file in
+ * accordance with the commercial license agreement provided with the 
+ * library.
  *
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
  *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- * 
+ * Author(s):   Michael Wybrow <mjwybrow@users.sourceforge.net>
 */
 
+
 #ifndef AVOID_MAKEPATH_H
 #define AVOID_MAKEPATH_H
 
diff --git a/src/libavoid/polyutil.cpp b/src/libavoid/polyutil.cpp
deleted file mode 100644 (file)
index 1b4b0c6..0000000
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * vim: ts=4 sw=4 et tw=0 wm=0
- *
- * libavoid - Fast, Incremental, Object-avoiding Line Router
- * Copyright (C) 2004-2006  Michael Wybrow <mjwybrow@users.sourceforge.net>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- * 
-*/
-
-#include <cassert>
-#include <cstdlib>
-
-#include "libavoid/polyutil.h"
-#include "libavoid/geomtypes.h"
-#include "libavoid/vertices.h"
-#include "libavoid/shape.h"
-
-namespace Avoid {
-
-
-Polygn newPoly(int size)
-{
-    Polygn newpoly;
-
-    newpoly.id = 0;
-    newpoly.pn = size;
-    newpoly.ps = (Point *) calloc(size, sizeof(Point));
-    if (!newpoly.ps)
-    {
-        fprintf(stderr,
-                "Error: Unable to allocate Point array in Avoid::newPoly\n");
-        abort();
-    }
-    return newpoly;
-}
-
-
-Polygn copyPoly(Polygn poly)
-{
-    Polygn newpoly = newPoly(poly.pn);
-
-    newpoly.id = poly.id;
-    for (int i = 0; i < poly.pn; i++)
-    {
-        newpoly.ps[i] = poly.ps[i];
-    }
-    return newpoly;
-}
-
-
-Polygn copyPoly(ShapeRef *shape)
-{
-    Polygn poly = shape->poly();
-    Polygn newpoly = newPoly(poly.pn);
-
-    newpoly.id = poly.id;
-    for (int i = 0; i < poly.pn; i++)
-    {
-        newpoly.ps[i] = poly.ps[i];
-    }
-    return newpoly;
-}
-
-
-void freePoly(Polygn& poly)
-{
-    std::free(poly.ps);
-}
-
-
-void freePtrPoly(Polygn *poly)
-{
-    std::free(poly->ps);
-    std::free(poly);
-}
-
-
-}
-
diff --git a/src/libavoid/polyutil.h b/src/libavoid/polyutil.h
deleted file mode 100644 (file)
index 9340df5..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * vim: ts=4 sw=4 et tw=0 wm=0
- *
- * libavoid - Fast, Incremental, Object-avoiding Line Router
- * Copyright (C) 2004-2006  Michael Wybrow <mjwybrow@users.sourceforge.net>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- * 
-*/
-
-#include "libavoid/geometry.h"
-#include "libavoid/shape.h"
-
-#ifndef AVOID_POLYUTIL_H
-#define AVOID_POLYUTIL_H
-
-namespace Avoid {
-
-
-extern Polygn newPoly(int size);
-extern Polygn copyPoly(Polygn);
-extern Polygn copyPoly(ShapeRef *shape);
-extern void freePoly(Polygn&);
-extern void freePtrPoly(Polygn *argpoly);
-
-
-}
-
-#endif
diff --git a/src/libavoid/region.cpp b/src/libavoid/region.cpp
deleted file mode 100644 (file)
index 5a46d7c..0000000
+++ /dev/null
@@ -1,858 +0,0 @@
-/*
- * vim: ts=4 sw=4 et tw=0 wm=0
- *
- * libavoid - Fast, Incremental, Object-avoiding Line Router
- * Copyright (C) 2004-2006  Michael Wybrow <mjwybrow@users.sourceforge.net>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- * 
-*/
-
-#include <stdio.h>
-#include <cstdlib>
-#include <algorithm>
-#include <cassert>
-#include <cmath>
-
-#include "libavoid/shape.h"
-#include "libavoid/region.h"
-
-
-namespace Avoid {
-
-Region *centerRegion = NULL;
-
-static const BBox screenBBox =
-        {Point(-INFINITY, -INFINITY), Point(INFINITY, INFINITY)};
-
-
-Region::Region()
-    : _bbox(screenBBox)
-    , _left(NULL), _right(NULL), _up(NULL), _down(NULL)
-{
-    _blocks.clear();
-}
-
-
-Region::Region(double x1, double y1, double x2, double y2)
-    : _left(NULL), _right(NULL), _up(NULL), _down(NULL)
-{
-    _bbox.a.x = x1;
-    _bbox.a.y = y1;
-    _bbox.b.x = x2;
-    _bbox.b.y = y2;
-
-    _blocks.clear();
-}
-
-
-static const unsigned int R_INSIDE = 0;
-static const unsigned int R_LEFT   = 1;
-static const unsigned int R_LEDGE  = 2;
-static const unsigned int R_RIGHT  = 4;
-static const unsigned int R_REDGE  = 8;
-static const unsigned int R_ABOVE  = 16;
-static const unsigned int R_TEDGE  = 32;
-static const unsigned int R_BELOW  = 64;
-static const unsigned int R_BEDGE  = 128;
-
-static const unsigned int R_NONE   = R_INSIDE;
-static const unsigned int R_UP     = R_ABOVE;
-static const unsigned int R_DOWN   = R_BELOW;
-static const unsigned int R_HORI   = R_LEFT | R_RIGHT;
-static const unsigned int R_VERT   = R_UP | R_DOWN;
-
-
-static void printBBox(const char *label, const BBox &bbox)
-{
-    if (label)
-    {
-        printf("%s: ", label);
-    }
-    printf("(%.2f, %.2f)-(%.2f, %.2f)\n", bbox.a.x, bbox.a.y,
-            bbox.b.x, bbox.b.y);
-}
-
-
-bool Region::overlapCheck(BBox& bbox, unsigned int& p)
-{
-    p = R_INSIDE;
-    Point& a = bbox.a;
-    Point& b = bbox.b;
-    Point& r = _bbox.a;
-    Point& s = _bbox.b;
-    
-    if (s.x <= a.x)
-    {
-        // Wholly right.
-        p = R_RIGHT;
-        return false;
-    }
-    else if (r.x >= b.x)
-    {
-        // Wholly left.
-        p = R_LEFT;
-        return false;
-    }
-    
-    if (s.y <= a.y)
-    {
-        // Wholly below.
-        p = R_BELOW;
-        return false;
-    }
-    else if (r.y >= b.y)
-    {
-        // Wholly above.
-        p = R_ABOVE;
-        return false;
-    }
-    
-    if (a.y == r.y)
-    {
-        // Shared top edge.
-        p |= R_TEDGE;
-    }
-    else if (a.y < r.y)
-    {
-        // Need to split above.
-        p |= R_ABOVE;
-    }
-    
-    if (b.y == s.y)
-    {
-        // Shared bottom edge.
-        p |= R_BEDGE;
-    }
-    else if (b.y > s.y)
-    {
-        // Need to split below.
-        p |= R_BELOW;
-    }
-
-    if (a.x == r.x)
-    {
-        // Shared left edge.
-        p |= R_LEDGE;
-    }
-    else if (a.x < r.x)
-    {
-        // Need to split left.
-        p |= R_LEFT;
-    }
-
-    if (b.x == s.x)
-    {
-        // Shared right edge.
-        p |= R_REDGE;
-    }
-    else if (b.x > s.x)
-    {
-        // Need to split right.
-        p |= R_RIGHT;
-    }
-    
-    return true;
-}
-
-
-void Region::getBBox(BBox& bb)
-{
-    bb.a = _bbox.a;
-    bb.b = _bbox.b;
-}
-
-
-Region *Region::up(void)
-{
-    return _up;
-}
-
-
-Region *Region::down(void)
-{
-    return _down;
-}
-
-
-Region *Region::left(void)
-{
-    return _left;
-}
-
-
-Region *Region::right(void)
-{
-    return _right;
-}
-
-
-bool Region::isBlock(void)
-{
-    return !(_blocks.empty());
-}
-
-
-void Region::initialSplit(BBox& bbox, unsigned int pos, unsigned int& shapeId)
-{
-    Point& n1 = bbox.a;
-    Point& n2 = bbox.b;
-    Region *newR = this;
-    Region *left, *right, *top, *bottom;
-    
-    if (pos == R_INSIDE)
-    {
-        split(n2.y, R_HORI);
-        split(n2.x, R_VERT);
-        newR = split(n1.y, R_HORI);
-        newR = newR->split(n1.x, R_VERT);
-        
-        printf("%p - list %d add %d\n", newR,
-                (int) newR->_blocks.size(), shapeId);
-        newR->_blocks.push_back((int) shapeId);
-        newR->_blocks.sort();
-        newR->_blocks.unique();
-    }
-    else
-    {
-        Region *tar = NULL;
-        tar = newR->findRegion(n1.x, R_VERT);
-        if (pos & R_LEFT)
-        {
-            if (n1.x == tar->_bbox.a.x)
-            {
-                newR = tar->_right;
-            }
-            else if (n1.x == tar->_bbox.b.x)
-            {
-                newR = tar;
-            }
-            else
-            {
-                newR = tar->split(n1.x, R_VERT);
-            }
-        }
-        else if (!(pos & R_LEDGE))
-        {
-            newR = tar->split(n1.x, R_VERT);
-        }
-        left = newR;
-        
-        tar = left->findRegion(n1.y, R_HORI);
-        if (pos & R_ABOVE)
-        {
-            if (n1.y == tar->_bbox.a.y)
-            {
-                newR = tar->_down;
-            }
-            else if (n1.y == tar->_bbox.b.y)
-            {
-                newR = tar;
-            }
-            else
-            {
-                newR = tar->split(n1.y, R_HORI);
-            }
-        }
-        else if (!(pos & R_TEDGE))
-        {
-            newR = tar->split(n1.y, R_HORI);
-        }
-        top = newR;
-        
-        right = newR;
-        tar = newR->findRegion(n2.x, R_VERT);
-        if (pos & R_RIGHT)
-        {
-        
-            if (n2.x == tar->_bbox.a.x)
-            {
-                right = tar->_left;
-            }
-            else if (n2.x == tar->_bbox.b.x)
-            {
-                right = tar;
-            }
-            else
-            {
-                tar->split(n2.x, R_VERT);
-                right = tar;
-            }
-        }
-        else if (!(pos & R_REDGE))
-        {
-            tar->split(n2.x, R_VERT);
-            right = tar;
-        }
-
-        bottom = right;
-        tar = right->findRegion(n2.y, R_HORI);
-        if (pos & R_BELOW)
-        {
-            if (n2.y == tar->_bbox.a.y)
-            {
-                bottom = tar->_up;
-            }
-            else if (n2.y == tar->_bbox.b.y)
-            {
-                bottom = tar;
-            }
-            else
-            {
-                tar->split(n2.y, R_HORI);
-                bottom = tar;
-            }
-        }
-        else if (!(pos & R_BEDGE))
-        {
-            tar->split(n2.y, R_HORI);
-            bottom = tar;
-        } 
-
-        // top is actually top-left, and bottom is bottom-right.
-        Region *curr = top, *cptr = NULL;
-        while (curr->_bbox.b.y <= bottom->_bbox.b.y)
-        {
-            cptr = curr;
-            while (cptr->_bbox.b.x <= bottom->_bbox.b.x)
-            {
-                printf("%p - list %d add %d\n", cptr,
-                        (int) cptr->_blocks.size(), shapeId);
-                cptr->_blocks.push_back((int) shapeId);
-                cptr->_blocks.sort();
-                cptr->_blocks.unique();
-
-                cptr = cptr->_right;
-            }
-
-            curr = curr->_down;
-        }
-    }
-}
-
-
-// Returns the region containing the value 'pos' in the direction 'dir'.
-// Thus, if looking for the x value 55, you would pass R_VERT as 'dir'.
-// 'forMerge' specifies that the left or top block of a pair of regions
-// with the split value of 'pos' should be returned.
-Region *Region::findRegion(double pos, unsigned int dir, const bool forMerge)
-{
-    Region *curr = this;
-
-    if (dir & R_VERT)
-    {
-        while (pos > curr->_bbox.b.x)
-        {
-            curr = curr->_right;
-        }
-        while (pos < curr->_bbox.a.x)
-        {
-            curr = curr->_left;
-        }
-        if (forMerge)
-        {
-            if (pos == curr->_bbox.a.x)
-            {
-                curr = curr->_left;
-            }
-            if (pos != curr->_bbox.b.x)
-            {
-                // 'pos' is not on the boundary.
-                return NULL;
-            }
-        }
-    }
-    else if (dir & R_HORI)
-    {
-        while (pos > curr->_bbox.b.y)
-        {
-            curr = curr->_down;
-        }
-        while (pos < curr->_bbox.a.y)
-        {
-            curr = curr->_up;
-        }
-        if (forMerge)
-        {
-            if (pos == curr->_bbox.a.y)
-            {
-                curr = curr->_up;
-            }
-            if (pos != curr->_bbox.b.y)
-            {
-                // 'pos' is not on the boundary.
-                return NULL;
-            }
-        }
-    }
-    return curr;
-}
-
-
-Region *Region::split(double pos, unsigned int dir)
-{
-    Region *newR = NULL;
-    bool first = true;
-
-    if (dir & R_VERT)
-    {
-        newR = splitDir(pos, R_UP, first);
-        if (_down) _down->splitDir(pos, R_DOWN);
-    }
-    else if (dir & R_HORI)
-    {
-        newR = splitDir(pos, R_RIGHT, first);
-        if (_left)  _left->splitDir(pos, R_LEFT);
-    }
-    return newR;
-}
-
-
-void Region::merge(unsigned int dir)
-{
-    bool first = true;
-
-    if (dir & R_VERT)
-    {
-        mergeDir(R_UP, first);
-        if (_down) _down->mergeDir(R_DOWN);
-    }
-    else if (dir & R_HORI)
-    {
-        mergeDir(R_RIGHT, first);
-        if (_left)  _left->mergeDir(R_LEFT);
-    }
-}
-
-
-void Region::mergeRegion(Region *src)
-{
-    assert(src != NULL);
-
-    if (src == _left)
-    {
-        pairHor(src->_left, this);
-        _bbox.a.x = src->_bbox.a.x;
-    }
-    else if (src == _right)
-    {
-        pairHor(this, src->_right);
-        _bbox.b.x = src->_bbox.b.x;
-    }
-    else if (src == _up)
-    {
-        pairVer(src->_up, this);
-        _bbox.a.y = src->_bbox.a.y;
-    }
-    else if (src == _down)
-    {
-        pairVer(this, src->_down);
-        _bbox.b.y = src->_bbox.b.y;
-    }
-    else
-    {
-        fprintf(stderr, "Error: Avoid::Region::merge(): "
-                "Argument not adjoining region.\n");
-        abort();
-    }
-    mergeAttributes(src);
-    printf("DEL %p\n", src);
-    delete src;
-}
-
-
-Region *Region::splitDir(double pos, unsigned int dir, bool first)
-{
-    Point& o1 = _bbox.a;
-    Point& o2 = _bbox.b;
-
-    Region *newR = NULL;
-    
-    if (dir & R_VERT)
-    {
-        assert(pos > _bbox.a.x);
-        assert(pos < _bbox.b.x);
-        
-        // Vertical recursion:
-       
-        // Create new block.
-        Region *r  = new Region(pos, o1.y, o2.x, o2.y);
-        printf("NEW %p\n", r);
-        r->copyAttributes(this);
-
-        Region *o_up    = _up;
-        Region *o_down  = _down;
-
-        // Resize old block.
-        o2.x = pos;
-
-        pairHor(r, _right);
-        pairHor(this, r);
-        
-        if (dir & R_UP)
-        {
-            if (!first)  pairVer(r, _down->_right);
-        
-            if (o_up)    o_up->splitDir(pos, R_UP);
-        }
-        else if (dir & R_DOWN)
-        {
-            if (!first)  pairVer(_up->_right, r);
-        
-            if (o_down)  o_down->splitDir(pos, R_DOWN);
-        }
-        newR = r;
-    }
-    else if (dir & R_HORI)
-    {
-        // Vertical recursion:
-
-        // Create new block.
-        Region *b  = new Region(o1.x, pos, o2.x, o2.y);
-        printf("NEW %p\n", b);
-        b->copyAttributes(this);
-
-        Region *o_left  = _left;
-        Region *o_right = _right;
-    
-        // Resize old block.
-        o2.y = pos;
-        
-        pairVer(b, _down);
-        pairVer(this, b);
-
-        if (dir & R_LEFT)
-        {
-            if (!first)  pairHor(b, _right->_down);
-        
-            if (o_left)  o_left->splitDir(pos, R_LEFT);
-        }
-        else if (dir & R_RIGHT)
-        {
-            if (!first)  pairHor(_left->_down, b);
-        
-            if (o_right) o_right->splitDir(pos, R_RIGHT);
-        }
-        newR = b;
-    }
-    return newR;
-}
-
-
-void Region::mergeDir(unsigned int dir, bool first)
-{
-    if (dir & R_VERT)
-    {
-        assert(_right != NULL);
-
-        mergeRegion(_right);
-
-        if (dir & R_UP)
-        {
-            if (_up)    _up->mergeDir(dir, R_UP);
-        }
-        else if (dir & R_DOWN)
-        {
-            if (_down)  _down->mergeDir(dir, R_DOWN);
-        }
-    }
-    else if (dir & R_HORI)
-    {
-        assert(_down != NULL);
-
-        mergeRegion(_down);
-
-        if (dir & R_LEFT)
-        {
-            if (_left)  _left->mergeDir(dir, R_LEFT);
-        }
-        else if (dir & R_RIGHT)
-        {
-            if (_right) _right->mergeDir(dir, R_RIGHT);
-        }
-    }
-}
-
-
-void Region::copyAttributes(Region *src)
-{
-    _blocks = src->_blocks;
-}
-
-
-void Region::mergeAttributes(Region *src)
-{
-    _blocks.merge(src->_blocks);
-    _blocks.sort();
-    _blocks.unique();
-}
-
-
-//---------------------------
-// Static member functions:
-
-
-void Region::pairHor(Region *l, Region *r)
-{
-    if (l)  l->_right = r;
-    if (r)  r->_left  = l;
-}
-
-
-void Region::pairVer(Region *a, Region *b)
-{
-    if (a)  a->_down = b;
-    if (b)  b->_up   = a;
-}
-
-
-void Region::addShape(ShapeRef *shape)
-{
-    if (!centerRegion)
-    {
-        // Add new default region.
-        centerRegion = new Region();
-        printf("NEW %p\n", centerRegion);
-    }
-    BBox bbox;
-    // Get bounding box for added shape.
-    shape->boundingBox(bbox);
-    printBBox("Add", bbox);
-    
-    unsigned int shapeId = shape->id();
-
-    // Find starting point for overlap
-    Region *curr = centerRegion;
-    unsigned int pos = R_INSIDE;
-    while (!(curr->overlapCheck(bbox, pos)))
-    {
-        if (pos & R_LEFT)
-        {
-            curr = curr->_left;
-        }
-        else if (pos & R_RIGHT)
-        {
-            curr = curr->_right;
-        }
-        else if (pos & R_ABOVE)
-        {
-            curr = curr->_up;
-        }
-        else if (pos & R_BELOW)
-        {
-            curr = curr->_down;
-        }
-    }
-    
-    curr->initialSplit(bbox, pos, shapeId);
-    centerRegion = curr;
-}
-
-
-void Region::removeShape(ShapeRef *shape)
-{
-    const bool forMerge = true;
-
-    BBox bbox;
-    // Get bounding box for added shape.
-    shape->boundingBox(bbox);
-    printBBox("Remove", bbox);
-
-    unsigned int shapeId = shape->id();
-    
-    Region *aboveTop = centerRegion->findRegion(bbox.a.y, R_HORI, forMerge);
-    Region *aboveBottom = aboveTop->findRegion(bbox.b.y, R_HORI, forMerge);
-    Region *leftOfLeft = aboveBottom->findRegion(bbox.a.x, R_VERT, forMerge);
-    Region *leftOfRight = leftOfLeft->findRegion(bbox.b.x, R_VERT, forMerge);
-    
-    assert(aboveTop    != NULL);
-    assert(aboveBottom != NULL);
-    assert(leftOfLeft  != NULL);
-    assert(leftOfRight != NULL);
-
-    // Find Top Left.
-    Region *topLeft = leftOfLeft->_right;
-    while (topLeft->_bbox.a.y != aboveTop->_bbox.b.y)
-    {
-        topLeft = topLeft->_up;
-    }
-    
-    // Find Bottom Right.
-    Region *botRight = leftOfRight;
-    while (botRight->_bbox.b.y != aboveBottom->_bbox.b.y)
-    {
-        botRight = botRight->_down;
-    }
-    
-    // Clear blocking flag.
-    Region *curr = topLeft, *cptr = NULL;
-    while (curr->_bbox.b.y <= botRight->_bbox.b.y)
-    {
-        cptr = curr;
-        while (cptr->_bbox.b.x <= botRight->_bbox.b.x)
-        {
-            ShapeList& blocks = cptr->_blocks;
-            
-            assert(std::find(blocks.begin(), blocks.end(), (int) shapeId) !=
-                    blocks.end());
-            printf("%p - list %d remove %d\n", cptr,
-                    (int) blocks.size(), shapeId);
-            cptr->_blocks.remove((int) shapeId);
-
-            cptr = cptr->_right;
-        }
-
-        curr = curr->_down;
-    }
-    
-    // These two are safe since they don't invalidate the pointers
-    // to the regions that are inside the shape.
-    if (aboveBottom->safeToMerge(R_HORI))
-    {
-        aboveBottom->merge(R_HORI);
-    }
-    if (leftOfRight->safeToMerge(R_VERT))
-    {
-        leftOfRight->merge(R_VERT);
-    }
-    
-    // Be a bit more careful with these.
-    double leftX = leftOfLeft->_bbox.b.x;
-    if (aboveTop->safeToMerge(R_HORI))
-    {
-        aboveTop->merge(R_HORI);
-    }
-    // leftOfLeft may have been freed, so look for the new block at
-    // that position.
-    leftOfLeft = aboveTop->findRegion(leftX, R_VERT, forMerge);
-    assert(leftOfLeft);
-    if (leftOfLeft->safeToMerge(R_VERT))
-    {
-        leftOfLeft->merge(R_VERT);
-    }
-}
-
-
-bool Region::safeToMerge(unsigned int dir)
-{
-    bool unsafe = false;
-
-    if (dir == R_HORI)
-    {
-        printf("safeToMerge? y = %.3f... ", _bbox.b.y); 
-        unsafe |= unsafeToMerge(R_RIGHT);
-        if (_left)  unsafe |= _left->unsafeToMerge(R_LEFT);
-    }
-    else if (dir == R_VERT)
-    {
-        printf("safeToMerge? x = %.3f... ", _bbox.b.x); 
-        unsafe |= unsafeToMerge(R_DOWN);
-        if (_up)  unsafe |= _up->unsafeToMerge(R_UP);
-    }
-    printf("%s.\n", (unsafe) ? "no" : "yes");
-        
-    return !unsafe;
-}
-
-
-bool Region::unsafeToMerge(unsigned int dir)
-{
-    bool unsafe = false;
-    
-    if (dir & R_HORI)
-    {
-        // If they are not the same on both sides then we can merge.
-        if (_blocks != _down->_blocks)
-        {
-            printf("\n  _blocks:\n    ");
-            for (ShapeList::iterator i = _blocks.begin(); i != _blocks.end();
-                    ++i)
-            {
-                printf("%d ", *i);
-            }
-            printf("\n  _down->_blocks:\n    ");
-            for (ShapeList::iterator i = _down->_blocks.begin();
-                    i != _down->_blocks.end(); ++i)
-            {
-                printf("%d ", *i);
-            }
-            unsafe |= true;
-            printf("\n");
-        }
-
-        if ((dir == R_LEFT) && _left)
-        {
-            unsafe |= _left->unsafeToMerge(dir);
-        }
-        else if ((dir == R_RIGHT) && _right)
-        {
-            unsafe |= _right->unsafeToMerge(dir);
-        }
-    }
-    else if (dir & R_VERT)
-    {
-        if (_blocks !=  _right->_blocks)
-        {
-            printf("\n  _blocks:\n    ");
-            for (ShapeList::iterator i = _blocks.begin(); i != _blocks.end();
-                    ++i)
-            {
-                printf("%d ", *i);
-            }
-            printf("\n  _right->_blocks:\n    ");
-            for (ShapeList::iterator i = _right->_blocks.begin();
-                    i != _right->_blocks.end(); ++i)
-            {
-                printf("%d ", *i);
-            }
-            unsafe |= true;
-            printf("\n");
-        }
-        
-        if ((dir == R_UP) && _up)
-        {
-            unsafe |= _up->unsafeToMerge(dir);
-        }
-        else if ((dir == R_DOWN) && _down)
-        {
-            unsafe |= _down->unsafeToMerge(dir);
-        }
-    }
-    return unsafe;
-        
-}
-
-
-Region *Region::getTopLeftRegion(void)
-{
-    Region *curr = centerRegion;
-
-    while (curr && (curr->_up || curr->_left))
-    {
-        if (curr->_up)
-        {
-            curr = curr->_up;
-        }
-        else
-        {
-            curr = curr->_left;
-        }
-    }
-    return curr;
-}
-
-
-}
-
diff --git a/src/libavoid/region.h b/src/libavoid/region.h
deleted file mode 100644 (file)
index 6a44ccb..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * vim: ts=4 sw=4 et tw=0 wm=0
- *
- * libavoid - Fast, Incremental, Object-avoiding Line Router
- * Copyright (C) 2004-2006  Michael Wybrow <mjwybrow@users.sourceforge.net>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- * 
-*/
-
-#ifndef AVOID_REGION_H
-#define AVOID_REGION_H
-
-#include <list>
-#include "libavoid/geomtypes.h"
-
-namespace Avoid {
-
-class ShapeRef;
-
-typedef std::list<int> ShapeList;
-
-
-class Region
-{
-    public:
-        Region();
-        Region(double x1, double y1, double x2, double y2);
-
-        bool overlapCheck(BBox& bbox, unsigned int& p);
-        void getBBox(BBox& bb);
-        Region *up(void);
-        Region *down(void);
-        Region *left(void);
-        Region *right(void);
-        void initialSplit(BBox& bbox, unsigned int pos, unsigned int& shapeId);
-        bool isBlock(void);
-        
-        static void pairHor(Region *l, Region *r);
-        static void pairVer(Region *a, Region *b);
-        static void addShape(ShapeRef *shape);
-        static void removeShape(ShapeRef *shape);
-        static Region *getTopLeftRegion(void);
-
-    private:
-        BBox _bbox;
-        Region *_left;
-        Region *_right;
-        Region *_up;
-        Region *_down;
-        ShapeList _blocks;
-        
-        Region *split(double pos, unsigned int dir); 
-        void merge(unsigned int dir);
-        void mergeRegion(Region *src); 
-        Region *findRegion(double pos, unsigned int dir,
-                const bool forMerge = false);
-        Region *splitDir(double pos, unsigned int dir, bool first = false); 
-        void mergeDir(unsigned int dir, bool first = false); 
-        void copyAttributes(Region *src);
-        void mergeAttributes(Region *src);
-        bool safeToMerge(unsigned int dir);
-        bool unsafeToMerge(unsigned int dir);
-};
-
-
-}
-
-#endif
index df0bacd0266e848fd15e7f889c85397897dc45dc..754c464b4a8098a7b8deb7045906ed0284c4f1f7 100644 (file)
  * vim: ts=4 sw=4 et tw=0 wm=0
  *
  * libavoid - Fast, Incremental, Object-avoiding Line Router
- * Copyright (C) 2004-2006  Michael Wybrow <mjwybrow@users.sourceforge.net>
+ *
+ * Copyright (C) 2004-2009  Monash University
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
+ * See the file LICENSE.LGPL distributed with the library.
+ *
+ * Licensees holding a valid commercial license may use this file in
+ * accordance with the commercial license agreement provided with the 
+ * library.
  *
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
  *
+ * Author(s):   Michael Wybrow <mjwybrow@users.sourceforge.net>
 */
 
-#include <cstdlib>
+
+#include <algorithm>
+#include <cmath>
+
 #include "libavoid/shape.h"
 #include "libavoid/router.h"
 #include "libavoid/visibility.h"
 #include "libavoid/connector.h"
-#include "libavoid/polyutil.h"
 #include "libavoid/debug.h"
-#include "libavoid/region.h"
-#include "math.h"
-
-//#define ORTHOGONAL_ROUTING
+#include "libavoid/orthogonal.h"
+#include "libavoid/assertions.h"
 
 namespace Avoid {
 
 
-static const unsigned int infoAdd = 1;
-static const unsigned int infoDel = 2;
-static const unsigned int infoMov = 3;
+enum ActionType {
+    ShapeMove,
+    ShapeAdd,
+    ShapeRemove,
+    ConnChange
+};
 
+typedef std::list<std::pair<unsigned int, ConnEnd> > ConnUpdateList;
 
-class MoveInfo {
+class ActionInfo {
     public:
-        MoveInfo(ShapeRef *s, Polygn *p, bool fM)
-            : shape(s)
-            , newPoly(copyPoly(*p))
-            , firstMove(fM)
-        { }
-        ~MoveInfo()
+        ActionInfo(ActionType t, ShapeRef *s, const Polygon& p, bool fM)
+            : type(t),
+              objPtr(s),
+              newPoly(p),
+              firstMove(fM)
+        {
+            COLA_ASSERT(type == ShapeMove);
+        }
+        ActionInfo(ActionType t, ShapeRef *s)
+            : type(t),
+              objPtr(s)
+        {
+            COLA_ASSERT(type != ConnChange);
+        }
+        ActionInfo(ActionType t, ConnRef *c)
+            : type(t),
+              objPtr(c)
+        {
+            COLA_ASSERT(type == ConnChange);
+        }
+        ~ActionInfo()
+        {
+        }
+        ShapeRef *shape(void) const
+        {
+            COLA_ASSERT((type == ShapeMove) || (type == ShapeAdd) || 
+                    (type == ShapeRemove));
+            return (static_cast<ShapeRef *> (objPtr));
+        }
+        ConnRef *conn(void) const
+        {
+            COLA_ASSERT(type == ConnChange);
+            return (static_cast<ConnRef *> (objPtr));
+        }
+        bool operator==(const ActionInfo& rhs) const
+        {
+            return (type == rhs.type) && (objPtr == rhs.objPtr);
+        }
+        bool operator<(const ActionInfo& rhs) const
         {
-            freePoly(newPoly);
+            if (type != rhs.type)
+            {
+                return type < rhs.type;
+            }
+            return objPtr < rhs.objPtr;
         }
-        ShapeRef *shape;
-        Polygn newPoly;
+        ActionType type;
+        void *objPtr;
+        Polygon newPoly;
         bool firstMove;
+        ConnUpdateList conns;
 };
 
 
-
-Router::Router()
-    : PartialTime(false)
-    , SimpleRouting(false)
-    , segmt_penalty(0)
-    , angle_penalty(0)
-    , crossing_penalty(200)
-    // Algorithm options:
-    , UseAStarSearch(true)
-    , IgnoreRegions(true)
-    , SelectiveReroute(true)
-    , IncludeEndpoints(true)
-    , UseLeesAlgorithm(false)
-    , InvisibilityGrph(true)
-    , ConsolidateMoves(true)
-    , PartialFeedback(false)
-    // Instrumentation:
-    , st_checked_edges(0)
-#ifdef LINEDEBUG
-    , avoid_screen(NULL)
+Router::Router(const unsigned int flags)
+    : visOrthogGraph(true),
+      PartialTime(false),
+      SimpleRouting(false),
+      ClusteredRouting(true),
+      // Poly-line algorithm options:
+      IgnoreRegions(true),
+      UseLeesAlgorithm(true),
+      InvisibilityGrph(true),
+      // General algorithm options:
+      SelectiveReroute(true),
+      PartialFeedback(false),
+      RubberBandRouting(false),
+      // Instrumentation:
+      st_checked_edges(0),
+#ifdef LIBAVOID_SDL
+      avoid_screen(NULL),
 #endif
-{ }
+      _largestAssignedId(0),
+      _consolidateActions(true),
+      _orthogonalNudgeDistance(4.0),
+      // Mode options:
+      _polyLineRouting(false),
+      _orthogonalRouting(false),
+      _staticGraphInvalidated(true),
+      _inCrossingPenaltyReroutingStage(false)
+{
+    // At least one of the Routing modes must be set.
+    COLA_ASSERT(flags & (PolyLineRouting | OrthogonalRouting));
 
+    if (flags & PolyLineRouting)
+    {
+        _polyLineRouting = true;
+    }
+    if (flags & OrthogonalRouting)
+    {
+        _orthogonalRouting = true;
+    }
 
+    for (size_t p = 0; p < lastPenaltyMarker; ++p)
+    {
+        _routingPenalties[p] = 0.0;
+    }
+    _routingPenalties[clusterCrossingPenalty] = 4000;
+}
 
 
-void Router::addShape(ShapeRef *shape)
+Router::~Router()
 {
-    unsigned int pid = shape->id();
-    Polygn poly = shape->poly();
+    // Delete remaining connectors.
+    ConnRefList::iterator conn = connRefs.begin();
+    while (conn != connRefs.end())
+    {
+        db_printf("Deleting connector %u in ~Router()\n", (*conn)->id());
+        delete *conn;
+        conn = connRefs.begin();
+    }
 
-    adjustContainsWithAdd(poly, pid);
-    
-    // o  Check all visibility edges to see if this one shape
-    //    blocks them.
-    newBlockingShape(&poly, pid);
+    // Remove remaining shapes.
+    ShapeRefList::iterator shape = shapeRefs.begin();
+    while (shape != shapeRefs.end())
+    {
+        ShapeRef *shapePtr = *shape;
+        db_printf("Deleting shape %u in ~Router()\n", shapePtr->id());
+        if (shapePtr->isActive())
+        {
+            shapePtr->removeFromGraph();
+            shapePtr->makeInactive();
+        }
+        delete shapePtr;
+        shape = shapeRefs.begin();
+    }
+
+    // Cleanup orphaned orthogonal graph vertices.
+    destroyOrthogonalVisGraph();
+
+    COLA_ASSERT(connRefs.size() == 0);
+    COLA_ASSERT(shapeRefs.size() == 0);
+    COLA_ASSERT(visGraph.size() == 0);
+    COLA_ASSERT(invisGraph.size() == 0);
+}
 
-#ifdef ORTHOGONAL_ROUTING
-    Region::addShape(shape);
-#endif
 
-    // o  Calculate visibility for the new vertices.
-    if (UseLeesAlgorithm)
+void Router::modifyConnector(ConnRef *conn, const unsigned int type,
+        const ConnEnd& connEnd)
+{
+    ActionInfo modInfo(ConnChange, conn);
+    
+    ActionInfoList::iterator found = 
+            find(actionList.begin(), actionList.end(), modInfo);
+    if (found == actionList.end())
     {
-        shapeVisSweep(shape);
+        modInfo.conns.push_back(std::make_pair(type, connEnd));
+        actionList.push_back(modInfo);
     }
     else
     {
-        shapeVis(shape);
+        found->conns.push_back(std::make_pair(type, connEnd));
+    }
+
+    if (!_consolidateActions)
+    {
+        processTransaction();
     }
-    callbackAllInvalidConnectors();
 }
 
 
-void Router::delShape(ShapeRef *shape)
+void Router::modifyConnector(ConnRef *conn)
 {
-    unsigned int pid = shape->id();
+    ActionInfo modInfo(ConnChange, conn);
+    
+    ActionInfoList::iterator found = 
+            find(actionList.begin(), actionList.end(), modInfo);
+    if (found == actionList.end())
+    {
+        actionList.push_back(modInfo);
+    }
 
-    // Delete items that are queued in the movList.
-    for (MoveInfoList::iterator it = moveList.begin(); it != moveList.end(); )
+    if (!_consolidateActions)
     {
-        if ((*it)->shape->id() == pid)
-        {
-            MoveInfoList::iterator doomed = it;
-            ++it;
-            moveList.erase(doomed);
-        }
-        else
-        {
-            ++it;
-        }
+        processTransaction();
     }
+}
 
-    // o  Remove entries related to this shape's vertices
-    shape->removeFromGraph();
-    
-    if (SelectiveReroute)
+
+void Router::removeQueuedConnectorActions(ConnRef *conn)
+{
+    ActionInfo modInfo(ConnChange, conn);
+
+    ActionInfoList::iterator found = 
+            find(actionList.begin(), actionList.end(), modInfo);
+    if (found != actionList.end())
     {
-        markConnectors(shape);
+        actionList.erase(found);
     }
+}
 
-    adjustContainsWithDel(pid);
-    
-#ifdef ORTHOGONAL_ROUTING
-    Region::removeShape(shape);
-#endif
 
-    delete shape;
+void Router::addShape(ShapeRef *shape)
+{
+    // There shouldn't be remove events or move events for the same shape
+    // already in the action list.
+    // XXX: Possibly we could handle this by ordering them intelligently.
+    COLA_ASSERT(find(actionList.begin(), actionList.end(), 
+                ActionInfo(ShapeRemove, shape)) == actionList.end());
+    COLA_ASSERT(find(actionList.begin(), actionList.end(), 
+                ActionInfo(ShapeMove, shape)) == actionList.end());
+
+    ActionInfo addInfo(ShapeAdd, shape);
     
-    // o  Check all edges that were blocked by this shape.
-    if (InvisibilityGrph)
+    ActionInfoList::iterator found = 
+            find(actionList.begin(), actionList.end(), addInfo);
+    if (found == actionList.end())
     {
-        checkAllBlockedEdges(pid);
+        actionList.push_back(addInfo);
     }
-    else
+
+    if (!_consolidateActions)
     {
-        // check all edges not in graph
-        checkAllMissingEdges();
+        processTransaction();
     }
-    callbackAllInvalidConnectors();
 }
 
 
-void Router::moveShape(ShapeRef *shape, Polygn *newPoly, const bool first_move)
+void Router::removeShape(ShapeRef *shape)
 {
+    // There shouldn't be add events events for the same shape already 
+    // in the action list.
+    // XXX: Possibly we could handle this by ordering them intelligently.
+    COLA_ASSERT(find(actionList.begin(), actionList.end(), 
+                ActionInfo(ShapeAdd, shape)) == actionList.end());
+
+    // Delete any ShapeMove entries for this shape in the action list.
+    ActionInfoList::iterator found = find(actionList.begin(), 
+            actionList.end(), ActionInfo(ShapeMove, shape));
+    if (found != actionList.end())
+    {
+        actionList.erase(found);
+    }
+
+    // Add the ShapeRemove entry.
+    ActionInfo remInfo(ShapeRemove, shape);
+    found = find(actionList.begin(), actionList.end(), remInfo);
+    if (found == actionList.end())
+    {
+        actionList.push_back(remInfo);
+    }
+
+    if (!_consolidateActions)
+    {
+        processTransaction();
+    }
+}
+
+
+void Router::moveShape(ShapeRef *shape, const double xDiff, const double yDiff)
+{
+    Polygon newPoly = shape->polygon();
+    newPoly.translate(xDiff, yDiff);
+
+    moveShape(shape, newPoly);
+}
+
+
+void Router::moveShape(ShapeRef *shape, const Polygon& newPoly, 
+        const bool first_move)
+{
+    // There shouldn't be remove events or add events for the same shape
+    // already in the action list.
+    // XXX: Possibly we could handle this by ordering them intelligently.
+    COLA_ASSERT(find(actionList.begin(), actionList.end(), 
+                ActionInfo(ShapeRemove, shape)) == actionList.end());
+    
+    if (find(actionList.begin(), actionList.end(), 
+                ActionInfo(ShapeAdd, shape)) != actionList.end())
+    {
+        // The Add is enough, no need for the Move action too.
+        return;
+    }
+
+    ActionInfo moveInfo(ShapeMove, shape, newPoly, first_move);
     // Sanely cope with the case where the user requests moving the same
     // shape multiple times before rerouting connectors.
-    bool alreadyThere = false;
-    unsigned int id = shape->id();
-    MoveInfoList::iterator finish = moveList.end();
-    for (MoveInfoList::iterator it = moveList.begin(); it != finish; ++it)
+    ActionInfoList::iterator found = 
+            find(actionList.begin(), actionList.end(), moveInfo);
+
+    if (found != actionList.end())
     {
-        if ((*it)->shape->id() == id)
+        if (!SimpleRouting)
         {
-            if (!SimpleRouting)
-            {
-                fprintf(stderr,
-                        "warning: multiple moves requested for shape %d.\n",
-                        (int) id);
-            }
-            // Just update the MoveInfo with the second polygon, but
-            // leave the firstMove setting alone.
-            (*it)->newPoly = copyPoly(*newPoly);
-            alreadyThere = true;
+            db_printf("warning: multiple moves requested for shape %d "
+                    "within a single transaction.\n", (int) shape->id());
         }
+        // Just update the ActionInfo with the second polygon, but
+        // leave the firstMove setting alone.
+        found->newPoly = newPoly;
+    }
+    else 
+    {
+        actionList.push_back(moveInfo);
     }
 
-    if (!alreadyThere)
+    if (!_consolidateActions)
     {
-        MoveInfo *moveInfo = new MoveInfo(shape, newPoly, first_move);
-        moveList.push_back(moveInfo);
+        processTransaction();
     }
+}
+
+
+void Router::setStaticGraphInvalidated(const bool invalidated)
+{
+    _staticGraphInvalidated = invalidated;
+}
+
+
+void Router::destroyOrthogonalVisGraph(void)
+{
+    // Remove orthogonal visibility graph edges.
+    visOrthogGraph.clear();
 
-    if (!ConsolidateMoves)
+    // Remove the now orphaned vertices.
+    VertInf *curr = vertices.shapesBegin();
+    while (curr)
     {
-        processMoves();
+        if (curr->orphaned() && (curr->id == dummyOrthogID))
+        {
+            VertInf *following = vertices.removeVertex(curr);
+            delete curr;
+            curr = following;
+            continue;
+        }
+        curr = curr->lstNext;
     }
 }
 
 
-void Router::processMoves(void)
+void Router::regenerateStaticBuiltGraph(void)
 {
-    // If SimpleRouting, then don't update yet.
-    if (moveList.empty() || SimpleRouting)
+    // Here we do talks involved in updating the static-built visibility 
+    // graph (if necessary) before we do any routing.
+    if (_staticGraphInvalidated)
     {
-        return;
+        if (_orthogonalRouting)
+        {
+            destroyOrthogonalVisGraph();
+
+            timers.Register(tmOrthogGraph, timerStart);
+            // Regenerate a new visibility graph.
+            generateStaticOrthogonalVisGraph(this);
+            
+            timers.Stop();
+        }
+        _staticGraphInvalidated = false;
     }
+}
+
 
-    MoveInfoList::iterator curr;
-    MoveInfoList::iterator finish = moveList.end();
-    for (curr = moveList.begin(); curr != finish; ++curr)
+bool Router::shapeInQueuedActionList(ShapeRef *shape) const
+{
+    bool foundAdd = find(actionList.begin(), actionList.end(), 
+                ActionInfo(ShapeAdd, shape)) != actionList.end();
+    bool foundRem = find(actionList.begin(), actionList.end(), 
+                ActionInfo(ShapeRemove, shape)) != actionList.end();
+    bool foundMove = find(actionList.begin(), actionList.end(), 
+                ActionInfo(ShapeMove, shape)) != actionList.end();
+
+    return (foundAdd || foundRem || foundMove);
+}
+
+
+bool Router::transactionUse(void) const
+{
+    return _consolidateActions;
+}
+
+
+void Router::setTransactionUse(const bool transactions)
+{
+    _consolidateActions = transactions;
+}
+
+
+bool Router::processTransaction(void)
+{
+    bool notPartialTime = !(PartialFeedback && PartialTime);
+    bool seenShapeMovesOrDeletes = false;
+
+    // If SimpleRouting, then don't update here.
+    if (actionList.empty() || SimpleRouting)
+    {
+        return false;
+    }
+
+    actionList.sort();
+    ActionInfoList::iterator curr;
+    ActionInfoList::iterator finish = actionList.end();
+    for (curr = actionList.begin(); curr != finish; ++curr)
     {
-        MoveInfo *moveInf = *curr;
-        ShapeRef *shape = moveInf->shape;
-        Polygn *newPoly = &(moveInf->newPoly);
-        bool first_move = moveInf->firstMove;
+        ActionInfo& actInf = *curr;
+        if (!((actInf.type == ShapeRemove) || (actInf.type == ShapeMove)))
+        {
+            // Not a move or remove action, so don't do anything.
+            continue;
+        }
+        seenShapeMovesOrDeletes = true;
+
+        ShapeRef *shape = actInf.shape();
+        bool isMove = (actInf.type == ShapeMove);
+        bool first_move = actInf.firstMove;
 
         unsigned int pid = shape->id();
-        bool notPartialTime = !(PartialFeedback && PartialTime);
 
         // o  Remove entries related to this shape's vertices
         shape->removeFromGraph();
         
-        if (SelectiveReroute && (notPartialTime || first_move))
+        if (SelectiveReroute && (!isMove || notPartialTime || first_move))
         {
             markConnectors(shape);
         }
 
         adjustContainsWithDel(pid);
         
-#ifdef ORTHOGONAL_ROUTING
-        Region::removeShape(shape);
-#endif
-
-        shape->setNewPoly(*newPoly);
-
-        adjustContainsWithAdd(*newPoly, pid);
-
         // Ignore this shape for visibility.
         // XXX: We don't really need to do this if we're not using Partial
         //      Feedback.  Without this the blocked edges still route
         //      around the shape until it leaves the connector.
         shape->makeInactive();
-        
     }
     
-    if (InvisibilityGrph)
+    if (seenShapeMovesOrDeletes && _polyLineRouting)
     {
-        for (curr = moveList.begin(); curr != finish; ++curr)
+        if (InvisibilityGrph)
         {
-            MoveInfo *moveInf = *curr;
-            ShapeRef *shape = moveInf->shape;
-            unsigned int pid = shape->id();
-            
-            // o  Check all edges that were blocked by this shape.
-            checkAllBlockedEdges(pid);
+            for (curr = actionList.begin(); curr != finish; ++curr)
+            {
+                ActionInfo& actInf = *curr;
+                if (!((actInf.type == ShapeRemove) || 
+                            (actInf.type == ShapeMove)))
+                {
+                    // Not a move or remove action, so don't do anything.
+                    continue;
+                }
+
+                // o  Check all edges that were blocked by this shape.
+                checkAllBlockedEdges(actInf.shape()->id());
+            }
+        }
+        else
+        {
+            // check all edges not in graph
+            checkAllMissingEdges();
         }
-    }
-    else
-    {
-        // check all edges not in graph
-        checkAllMissingEdges();
     }
 
-    while ( ! moveList.empty() )
+    for (curr = actionList.begin(); curr != finish; ++curr)
     {
-        MoveInfo *moveInf = moveList.front();
-        ShapeRef *shape = moveInf->shape;
-        Polygn *newPoly = &(moveInf->newPoly);
+        ActionInfo& actInf = *curr;
+        if (!((actInf.type == ShapeAdd) || (actInf.type == ShapeMove)))
+        {
+            // Not a move or add action, so don't do anything.
+            continue;
+        }
+
+        ShapeRef *shape = actInf.shape();
+        Polygon& newPoly = actInf.newPoly;
+        bool isMove = (actInf.type == ShapeMove);
 
         unsigned int pid = shape->id();
-        bool notPartialTime = !(PartialFeedback && PartialTime);
 
         // Restore this shape for visibility.
         shape->makeActive();
+        
+        if (isMove)
+        {
+            shape->setNewPoly(newPoly);
+        }
+        const Polygon& shapePoly = shape->polygon();
 
-#ifdef ORTHOGONAL_ROUTING
-        Region::addShape(shape);
-#endif
+        adjustContainsWithAdd(shapePoly, pid);
 
-        // o  Check all visibility edges to see if this one shape
-        //    blocks them.
-        if (notPartialTime)
+        if (_polyLineRouting)
         {
-            newBlockingShape(newPoly, pid);
+            // o  Check all visibility edges to see if this one shape
+            //    blocks them.
+            if (!isMove || notPartialTime)
+            {
+                newBlockingShape(shapePoly, pid);
+            }
+
+            // o  Calculate visibility for the new vertices.
+            if (UseLeesAlgorithm)
+            {
+                shapeVisSweep(shape);
+            }
+            else
+            {
+                shapeVis(shape);
+            }
         }
+    }
 
-        // o  Calculate visibility for the new vertices.
-        if (UseLeesAlgorithm)
+    // Update connector endpoints.
+    for (curr = actionList.begin(); curr != finish; ++curr)
+    {
+        ActionInfo& actInf = *curr;
+        if (actInf.type != ConnChange)
         {
-            shapeVisSweep(shape);
+            continue;
         }
-        else
+        for (ConnUpdateList::iterator conn = actInf.conns.begin();
+                conn != actInf.conns.end(); ++conn)
         {
-            shapeVis(shape);
+            actInf.conn()->updateEndPoint(conn->first, conn->second);
         }
-        
-        moveList.pop_front();
-        delete moveInf;
     }
-    callbackAllInvalidConnectors();
+    // Clear the actionList.
+    actionList.clear();
+    
+    _staticGraphInvalidated = true;
+    rerouteAndCallbackConnectors();
+
+    return true;
+}
+
+
+void Router::addCluster(ClusterRef *cluster)
+{
+    cluster->makeActive();
+    
+    unsigned int pid = cluster->id();
+    ReferencingPolygon& poly = cluster->polygon();
+
+    adjustClustersWithAdd(poly, pid);
+}
+
+
+void Router::delCluster(ClusterRef *cluster)
+{
+    cluster->makeInactive();
+    
+    unsigned int pid = cluster->id();
+    
+    adjustClustersWithDel(pid);
+}
+
+
+void Router::setOrthogonalNudgeDistance(const double dist)
+{
+    COLA_ASSERT(dist >= 0);
+    _orthogonalNudgeDistance = dist;
+}
+
+
+double Router::orthogonalNudgeDistance(void) const
+{
+    return _orthogonalNudgeDistance;
+}
+
+
+unsigned int Router::assignId(const unsigned int suggestedId)
+{
+    // If the suggestedId is zero, then we assign the object the next
+    // smallest unassigned ID, otherwise we trust the ID given is unique.
+    unsigned int assignedId = (suggestedId == 0) ? 
+            (_largestAssignedId + 1) : suggestedId;
+    
+    // Have the router record if this ID is larger than the _largestAssignedId.
+    _largestAssignedId = std::max(_largestAssignedId, assignedId);
+
+    // If assertions are enabled, then we check that this ID really is unique.
+    COLA_ASSERT(idIsUnique(assignedId));
+
+    return assignedId;
+}
+
+
+    // Returns whether the given ID is unique among all objects known by the
+    // router.  Outputs a warning if the ID is found ore than once. 
+    // It is expected this is only going to be called from assertions while
+    // debugging, so efficiency is not an issue and we just iterate over all
+    // objects.
+bool Router::idIsUnique(const unsigned int id) const 
+{
+    unsigned int count = 0;
+
+    // Examine shapes.
+    for (ShapeRefList::const_iterator i = shapeRefs.begin(); 
+            i != shapeRefs.end(); ++i) 
+    {
+        if ((*i)->id() == id)
+        {
+            count++;
+        }
+    }
+
+    // Examine connectors.
+    for (ConnRefList::const_iterator i = connRefs.begin(); 
+            i != connRefs.end(); ++i) 
+    {
+        if ((*i)->id() == id)
+        {
+            count++;
+        }
+    }
+
+    // Examine clusters.
+    for (ClusterRefList::const_iterator i = clusterRefs.begin(); 
+            i != clusterRefs.end(); ++i) 
+    {
+        if ((*i)->id() == id)
+        {
+            count++;
+        }
+    }
+
+    if (count > 1)
+    {
+        db_printf("Warning:\tlibavoid object ID %d not unique.\n", id);
+        return false;
+    }
+    return true;
 }
 
 
@@ -313,13 +678,15 @@ void Router::processMoves(void)
 void Router::attachedConns(IntList &conns, const unsigned int shapeId,
         const unsigned int type)
 {
-    ConnRefList::iterator fin = connRefs.end();
-    for (ConnRefList::iterator i = connRefs.begin(); i != fin; ++i) {
-
-        if ((type & runningTo) && ((*i)->_dstId == shapeId)) {
+    ConnRefList::const_iterator fin = connRefs.end();
+    for (ConnRefList::const_iterator i = connRefs.begin(); i != fin; ++i) 
+    {
+        if ((type & runningTo) && ((*i)->_dstId == shapeId)) 
+        {
             conns.push_back((*i)->_id);
         }
-        else if ((type & runningFrom) && ((*i)->_srcId == shapeId)) {
+        else if ((type & runningFrom) && ((*i)->_srcId == shapeId)) 
+        {
             conns.push_back((*i)->_id);
         }
     }
@@ -331,16 +698,19 @@ void Router::attachedConns(IntList &conns, const unsigned int shapeId,
 void Router::attachedShapes(IntList &shapes, const unsigned int shapeId,
         const unsigned int type)
 {
-    ConnRefList::iterator fin = connRefs.end();
-    for (ConnRefList::iterator i = connRefs.begin(); i != fin; ++i) {
-        if ((type & runningTo) && ((*i)->_dstId == shapeId)) {
+    ConnRefList::const_iterator fin = connRefs.end();
+    for (ConnRefList::const_iterator i = connRefs.begin(); i != fin; ++i) 
+    {
+        if ((type & runningTo) && ((*i)->_dstId == shapeId)) 
+        {
             if ((*i)->_srcId != 0)
             {
                 // Only if there is a shape attached to the other end.
                 shapes.push_back((*i)->_srcId);
             }
         }
-        else if ((type & runningFrom) && ((*i)->_srcId == shapeId)) {
+        else if ((type & runningFrom) && ((*i)->_srcId == shapeId)) 
+        {
             if ((*i)->_dstId != 0)
             {
                 // Only if there is a shape attached to the other end.
@@ -351,18 +721,127 @@ void Router::attachedShapes(IntList &shapes, const unsigned int shapeId,
 }
 
 
-    // It's intended this function is called after shape movement has 
-    // happened to alert connectors that they need to be rerouted.
-void Router::callbackAllInvalidConnectors(void)
+    // It's intended this function is called after visibility changes 
+    // resulting from shape movement have happened.  It will alert 
+    // rerouted connectors (via a callback) that they need to be redrawn.
+void Router::rerouteAndCallbackConnectors(void)
+{
+    std::set<ConnRef *> reroutedConns;
+    ConnRefList::const_iterator fin = connRefs.end();
+    
+    // Updating the orthogonal visibility graph if necessary. 
+    regenerateStaticBuiltGraph();
+
+    timers.Register(tmOrthogRoute, timerStart);
+    for (ConnRefList::const_iterator i = connRefs.begin(); i != fin; ++i) 
+    {
+        (*i)->_needs_repaint = false;
+        bool rerouted = (*i)->generatePath();
+        if (rerouted)
+        {
+            reroutedConns.insert(*i);
+        }
+    }
+    timers.Stop();
+
+    // Find and reroute crossing connectors if crossing penalties are set.
+    improveCrossings();
+
+    // Perform centring and nudging for othogonal routes.
+    improveOrthogonalRoutes(this);
+
+    // Alert connectors that they need redrawing.
+    for (ConnRefList::const_iterator i = connRefs.begin(); i != fin; ++i) 
+    {
+        (*i)->_needs_repaint = true;
+        (*i)->performCallback();
+    }
+}
+
+
+typedef std::set<ConnRef *> ConnRefSet;
+
+void Router::improveCrossings(void)
 {
+    const double crossing_penalty = routingPenalty(crossingPenalty);
+    const double shared_path_penalty = routingPenalty(fixedSharedPathPenalty);
+    if ((crossing_penalty == 0) && (shared_path_penalty == 0))
+    {
+        // No penalties, return.
+        return;
+    }
+    
+    // Find crossings and reroute connectors.
+    _inCrossingPenaltyReroutingStage = true;
+    ConnRefSet crossingConns;
     ConnRefList::iterator fin = connRefs.end();
-    for (ConnRefList::iterator i = connRefs.begin(); i != fin; ++i) {
-        (*i)->handleInvalid();
+    for (ConnRefList::iterator i = connRefs.begin(); i != fin; ++i) 
+    {
+        Avoid::Polygon& iRoute = (*i)->routeRef();
+        ConnRefList::iterator j = i;
+        for (++j; j != fin; ++j) 
+        {
+            if ((crossingConns.find(*i) != crossingConns.end()) && 
+                    (crossingConns.find(*j) != crossingConns.end()))
+            {
+                // We already know both these have crossings.
+                continue;
+            }
+            // Determine if this pair cross.
+            Avoid::Polygon& jRoute = (*j)->routeRef();
+            CrossingsInfoPair crossingInfo = std::make_pair(0, 0);
+            bool meetsPenaltyCriteria = false;
+            for (size_t jInd = 1; jInd < jRoute.size(); ++jInd)
+            {
+                const bool finalSegment = ((jInd + 1) == jRoute.size());
+                CrossingsInfoPair crossingInfo = countRealCrossings(
+                        iRoute, true, jRoute, jInd, false, 
+                        finalSegment, NULL, NULL, *i, *j);
+                
+                if ((shared_path_penalty > 0) && 
+                    (crossingInfo.second & CROSSING_SHARES_PATH) && 
+                    (crossingInfo.second & CROSSING_SHARES_FIXED_SEGMENT) && 
+                    !(crossingInfo.second & CROSSING_SHARES_PATH_AT_END)) 
+                {
+                    // We are penalising fixedSharedPaths and there is a
+                    // fixedSharedPath.
+                    meetsPenaltyCriteria = true;
+                    break;
+                }
+                else if ((crossing_penalty > 0) && (crossingInfo.first > 0))
+                {
+                    // We are penalising crossings and this is a crossing.
+                    meetsPenaltyCriteria = true;
+                    break;
+                }
+            }
+            if (meetsPenaltyCriteria)
+            {
+                crossingConns.insert(*i);
+                crossingConns.insert(*j);
+            }
+        }
+    }
+
+    for (ConnRefSet::iterator i = crossingConns.begin(); 
+            i != crossingConns.end(); ++i)
+    {
+        ConnRef *conn = *i;
+        conn->makePathInvalid();
+        // XXX: Could we free these routes here for extra savings?
+        // conn->freeRoutes();
+    }
+    for (ConnRefSet::iterator i = crossingConns.begin(); 
+            i != crossingConns.end(); ++i)
+    {
+        ConnRef *conn = *i;
+        conn->generatePath();
     }
+    _inCrossingPenaltyReroutingStage = false;
 }
 
 
-void Router::newBlockingShape(Polygn *poly, int pid)
+void Router::newBlockingShape(const Polygon& poly, int pid)
 {
     // o  Check all visibility edges to see if this one shape
     //    blocks them.
@@ -382,8 +861,11 @@ void Router::newBlockingShape(Polygn *poly, int pid)
             Point e2 = points.second;
             bool blocked = false;
 
-            bool ep_in_poly1 = !(eID1.isShape) ? inPoly(*poly, e1) : false;
-            bool ep_in_poly2 = !(eID2.isShape) ? inPoly(*poly, e2) : false;
+            bool countBorder = false;
+            bool ep_in_poly1 = !(eID1.isShape) ? 
+                    inPoly(poly, e1, countBorder) : false;
+            bool ep_in_poly2 = !(eID2.isShape) ? 
+                    inPoly(poly, e2, countBorder) : false;
             if (ep_in_poly1 || ep_in_poly2)
             {
                 // Don't check edges that have a connector endpoint
@@ -391,10 +873,14 @@ void Router::newBlockingShape(Polygn *poly, int pid)
                 continue;
             }
 
-            for (int pt_i = 0; pt_i < poly->pn; pt_i++)
+            bool seenIntersectionAtEndpoint = false;
+            for (size_t pt_i = 0; pt_i < poly.size(); ++pt_i)
             {
-                int pt_n = (pt_i == (poly->pn - 1)) ? 0 : pt_i + 1;
-                if (segmentIntersect(e1, e2, poly->ps[pt_i], poly->ps[pt_n]))
+                size_t pt_n = (pt_i == (poly.size() - 1)) ? 0 : pt_i + 1;
+                const Point& pi = poly.ps[pt_i];
+                const Point& pn = poly.ps[pt_n];
+                if (segmentShapeIntersect(e1, e2, pi, pn, 
+                        seenIntersectionAtEndpoint))
                 {
                     blocked = true;
                     break;
@@ -422,7 +908,7 @@ void Router::newBlockingShape(Polygn *poly, int pid)
 
 void Router::checkAllBlockedEdges(int pid)
 {
-    assert(InvisibilityGrph);
+    COLA_ASSERT(InvisibilityGrph);
 
     for (EdgeInf *iter = invisGraph.begin(); iter != invisGraph.end() ; )
     {
@@ -444,18 +930,9 @@ void Router::checkAllBlockedEdges(int pid)
 
 void Router::checkAllMissingEdges(void)
 {
-    assert(!InvisibilityGrph);
+    COLA_ASSERT(!InvisibilityGrph);
 
-    VertInf *first = NULL;
-
-    if (IncludeEndpoints)
-    {
-        first = vertices.connsBegin();
-    }
-    else
-    {
-        first = vertices.shapesBegin();
-    }
+    VertInf *first = vertices.connsBegin();
 
     VertInf *pend = vertices.end();
     for (VertInf *i = first; i != pend; i = i->lstNext)
@@ -489,39 +966,79 @@ void Router::checkAllMissingEdges(void)
 void Router::generateContains(VertInf *pt)
 {
     contains[pt->id].clear();
+    enclosingClusters[pt->id].clear();
 
-    ShapeRefList::iterator finish = shapeRefs.end();
-    for (ShapeRefList::iterator i = shapeRefs.begin(); i != finish; ++i)
+    // Don't count points on the border as being inside.
+    bool countBorder = false;
+
+    // Compute enclosing shapes.
+    ShapeRefList::const_iterator finish = shapeRefs.end();
+    for (ShapeRefList::const_iterator i = shapeRefs.begin(); i != finish; ++i)
     {
-        Polygn poly = copyPoly(*i);
-        if (inPoly(poly, pt->point))
+        if (inPoly((*i)->polygon(), pt->point, countBorder))
         {
             contains[pt->id].insert((*i)->id());
         }
-        freePoly(poly);
+    }
+
+    // Computer enclosing Clusters
+    ClusterRefList::const_iterator clFinish = clusterRefs.end();
+    for (ClusterRefList::const_iterator i = clusterRefs.begin(); 
+            i != clFinish; ++i)
+    {
+        if (inPolyGen((*i)->polygon(), pt->point))
+        {
+            enclosingClusters[pt->id].insert((*i)->id());
+        }
     }
 }
 
 
-void Router::adjustContainsWithAdd(const Polygn& poly, const int p_shape)
+void Router::adjustClustersWithAdd(const PolygonInterface& poly, 
+        const int p_cluster)
 {
     for (VertInf *k = vertices.connsBegin(); k != vertices.shapesBegin();
             k = k->lstNext)
     {
-        if (inPoly(poly, k->point))
+        if (inPolyGen(poly, k->point))
         {
-            contains[k->id].insert(p_shape);
+            enclosingClusters[k->id].insert(p_cluster);
         }
     }
 }
 
 
-void Router::adjustContainsWithDel(const int p_shape)
+void Router::adjustClustersWithDel(const int p_cluster)
+{
+    for (ContainsMap::iterator k = enclosingClusters.begin();
+            k != enclosingClusters.end(); ++k)
+    {
+        (*k).second.erase(p_cluster);
+    }
+}
+
+
+void Router::adjustContainsWithAdd(const Polygon& poly, const int p_shape)
 {
+    // Don't count points on the border as being inside.
+    bool countBorder = false;
+
     for (VertInf *k = vertices.connsBegin(); k != vertices.shapesBegin();
             k = k->lstNext)
     {
-        contains[k->id].erase(p_shape);
+        if (inPoly(poly, k->point, countBorder))
+        {
+            contains[k->id].insert(p_shape);
+        }
+    }
+}
+
+
+void Router::adjustContainsWithDel(const int p_shape)
+{
+    for (ContainsMap::iterator k = contains.begin(); k != contains.end(); ++k)
+    {
+        (*k).second.erase(p_shape);
     }
 }
 
@@ -537,14 +1054,21 @@ static double AngleAFromThreeSides(const double a, const double b,
 
 void Router::markConnectors(ShapeRef *shape)
 {
-    assert(SelectiveReroute);
+    if (RubberBandRouting)
+    {
+        // When rubber-band routing, we do no reroute connectors that
+        // may have a better route, only invalid connectors.
+        return;
+    }
+
+    COLA_ASSERT(SelectiveReroute);
 
-    ConnRefList::iterator end = connRefs.end();
-    for (ConnRefList::iterator it = connRefs.begin(); it != end; ++it)
+    ConnRefList::const_iterator end = connRefs.end();
+    for (ConnRefList::const_iterator it = connRefs.begin(); it != end; ++it)
     {
         ConnRef *conn = (*it);
 
-        if (conn->_route.pn == 0)
+        if (conn->_route.empty())
         {
             // Ignore uninitialised connectors.
             continue;
@@ -556,7 +1080,7 @@ void Router::markConnectors(ShapeRef *shape)
         }
 
         Point start = conn->_route.ps[0];
-        Point end = conn->_route.ps[conn->_route.pn - 1];
+        Point end = conn->_route.ps[conn->_route.size() - 1];
 
         double conndist = conn->_route_dist;
 
@@ -609,12 +1133,12 @@ void Router::markConnectors(ShapeRef *shape)
                 Point n_p2(p2.x - p1.x, p2.y - p1.y);
                 Point n_start(start.x - p1.x, start.y - p1.y);
                 Point n_end(end.x - p1.x, end.y - p1.y);
-                //printf("n_p2:    (%.1f, %.1f)\n", n_p2.x, n_p2.y);
-                //printf("n_start: (%.1f, %.1f)\n", n_start.x, n_start.y);
-                //printf("n_end:   (%.1f, %.1f)\n", n_end.x, n_end.y);
+                //db_printf("n_p2:    (%.1f, %.1f)\n", n_p2.x, n_p2.y);
+                //db_printf("n_start: (%.1f, %.1f)\n", n_start.x, n_start.y);
+                //db_printf("n_end:   (%.1f, %.1f)\n", n_end.x, n_end.y);
 
                 double theta = 0 - atan2(n_p2.y, n_p2.x);
-                //printf("theta = %.2f\n", theta * (180 / PI));
+                //db_printf("theta = %.2f\n", theta * (180 / PI));
 
                 Point r_p1(0, 0);
                 Point r_p2 = n_p2;
@@ -630,16 +1154,15 @@ void Router::markConnectors(ShapeRef *shape)
                 start.y = cosv * n_start.y + sinv * n_start.x;
                 end.x = cosv * n_end.x - sinv * n_end.y;
                 end.y = cosv * n_end.y + sinv * n_end.x;
-                //printf("r_p2:    (%.1f, %.1f)\n", r_p2.x, r_p2.y);
-                //printf("r_start: (%.1f, %.1f)\n", start.x, start.y);
-                //printf("r_end:   (%.1f, %.1f)\n", end.x, end.y);
+                //db_printf("r_p2:    (%.1f, %.1f)\n", r_p2.x, r_p2.y);
+                //db_printf("r_start: (%.1f, %.1f)\n", start.x, start.y);
+                //db_printf("r_end:   (%.1f, %.1f)\n", end.x, end.y);
 
-                if (((int) r_p2.y) != 0)
+                // This might be slightly off.
+                if (fabs(r_p2.y) > 0.0001)
                 {
-                    printf("r_p2.y: %f != 0\n", r_p2.y);
-                    std::abort();
+                    db_printf("r_p2.y: %f != 0\n", r_p2.y);
                 }
-                // This might be slightly off.
                 r_p2.y = 0;
 
                 offy = r_p1.y;
@@ -679,13 +1202,13 @@ void Router::markConnectors(ShapeRef *shape)
                 x = ((b*c) + (a*d)) / (b + d);
             }
 
-            //printf("%.1f, %.1f, %.1f, %.1f\n", a, b, c, d);
-            //printf("x = %.1f\n", x);
+            //db_printf("%.1f, %.1f, %.1f, %.1f\n", a, b, c, d);
+            //db_printf("x = %.1f\n", x);
 
             x = std::max(min, x);
             x = std::min(max, x);
 
-            //printf("x = %.1f\n", x);
+            //db_printf("x = %.1f\n", x);
 
             Point xp;
             if (p1.x == p2.x)
@@ -698,20 +1221,20 @@ void Router::markConnectors(ShapeRef *shape)
                 xp.x = x;
                 xp.y = offy;
             }
-            //printf("(%.1f, %.1f)\n", xp.x, xp.y);
+            //db_printf("(%.1f, %.1f)\n", xp.x, xp.y);
 
-            e1 = dist(start, xp);
-            e2 = dist(xp, end);
+            e1 = euclideanDist(start, xp);
+            e2 = euclideanDist(xp, end);
             estdist = e1 + e2;
 
 
-            //printf("is %.1f < %.1f\n", estdist, conndist);
+            //db_printf("is %.1f < %.1f\n", estdist, conndist);
             if (estdist < conndist)
             {
 #ifdef SELECTIVE_DEBUG
                 //double angle = AngleAFromThreeSides(dist(start, end),
                 //        e1, e2);
-                printf("[%3d] - Possible better path found (%.1f < %.1f)\n",
+                db_printf("[%3d] - Possible better path found (%.1f < %.1f)\n",
                         conn->_id, estdist, conndist);
 #endif
                 conn->_needs_reroute_flag = true;
@@ -723,6 +1246,81 @@ void Router::markConnectors(ShapeRef *shape)
 }
 
 
+ConnType Router::validConnType(const ConnType select) const
+{
+    if (select != ConnType_None)
+    {
+        if ((select == ConnType_Orthogonal) && _orthogonalRouting)
+        {
+            return ConnType_Orthogonal;
+        }
+        else if ((select == ConnType_PolyLine) && _polyLineRouting)
+        {
+            return ConnType_PolyLine;
+        }
+    }
+
+    if (_polyLineRouting)
+    {
+        return ConnType_PolyLine;
+    }
+    else if (_orthogonalRouting)
+    {
+        return ConnType_Orthogonal;
+    }
+    return ConnType_None;
+}
+
+
+void Router::setRoutingPenalty(const PenaltyType penType, const double penVal)
+{
+    COLA_ASSERT(penType < lastPenaltyMarker);
+    if (penVal < 0)
+    {
+        // Set some sensible penalty.
+        switch (penType)
+        {
+            case segmentPenalty:
+                _routingPenalties[penType] = 50;
+                break;
+            case fixedSharedPathPenalty:
+                _routingPenalties[penType] = 110;
+                break;
+            case anglePenalty:
+                _routingPenalties[penType] = 50;
+                break;
+            case crossingPenalty:
+                _routingPenalties[penType] = 200;
+                break;
+            case clusterCrossingPenalty:
+                _routingPenalties[penType] = 4000;
+                break;
+            default:
+                _routingPenalties[penType] = 50;
+                break;
+        }
+    }
+    else
+    {
+        _routingPenalties[penType] = penVal;
+    }
+}
+
+
+double Router::routingPenalty(const PenaltyType penType) const
+{
+    COLA_ASSERT(penType < lastPenaltyMarker);
+    return _routingPenalties[penType];
+}
+
+
+double& Router::penaltyRef(const PenaltyType penType)
+{
+    COLA_ASSERT(penType < lastPenaltyMarker);
+    return _routingPenalties[penType];
+}
+
+
 void Router::printInfo(void)
 {
     FILE *fp = stdout;
@@ -735,6 +1333,7 @@ void Router::printInfo(void)
     int st_endpoints = 0;
     int st_valid_shape_visedges = 0;
     int st_valid_endpt_visedges = 0;
+    int st_orthogonal_visedges = 0;
     int st_invalid_visedges = 0;
     VertInf *finish = vertices.end();
     for (VertInf *t = vertices.connsBegin(); t != finish; t = t->lstNext)
@@ -775,9 +1374,15 @@ void Router::printInfo(void)
     {
         st_invalid_visedges++;
     }
+    for (EdgeInf *t = visOrthogGraph.begin(); t != visOrthogGraph.end();
+            t = t->lstNext)
+    {
+        st_orthogonal_visedges++;
+    }
     fprintf(fp, "Number of shapes: %d\n", st_shapes);
     fprintf(fp, "Number of vertices: %d (%d real, %d endpoints)\n",
             st_vertices + st_endpoints, st_vertices, st_endpoints);
+    fprintf(fp, "Number of orhtog_vis_edges: %d\n", st_orthogonal_visedges);
     fprintf(fp, "Number of vis_edges: %d (%d valid [%d normal, %d endpt], "
             "%d invalid)\n", st_valid_shape_visedges + st_invalid_visedges +
             st_valid_endpt_visedges, st_valid_shape_visedges +
@@ -787,12 +1392,462 @@ void Router::printInfo(void)
     fprintf(fp, "checkVisEdge tally: %d\n", st_checked_edges);
     fprintf(fp, "----------------------\n");
 
-    fprintf(fp, "ADDS:  "); timers.Print(tmAdd);
-    fprintf(fp, "DELS:  "); timers.Print(tmDel);
-    fprintf(fp, "MOVS:  "); timers.Print(tmMov);
-    fprintf(fp, "***S:  "); timers.Print(tmSev);
-    fprintf(fp, "PTHS:  "); timers.Print(tmPth);
+    fprintf(fp, "ADDS:  "); timers.Print(tmAdd, fp);
+    fprintf(fp, "DELS:  "); timers.Print(tmDel, fp);
+    fprintf(fp, "MOVS:  "); timers.Print(tmMov, fp);
+    fprintf(fp, "***S:  "); timers.Print(tmSev, fp);
+    fprintf(fp, "PTHS:  "); timers.Print(tmPth, fp);
+    fprintf(fp, "OrthogGraph:  "); timers.Print(tmOrthogGraph, fp);
+    fprintf(fp, "OrthogRoute:  "); timers.Print(tmOrthogRoute, fp);
+    fprintf(fp, "OrthogCentre:  "); timers.Print(tmOrthogCentre, fp);
+    fprintf(fp, "OrthogNudge:  "); timers.Print(tmOrthogNudge, fp);
     fprintf(fp, "\n");
+    timers.Reset();
+}
+
+
+static const double LIMIT = 100000000;
+
+static void reduceRange(double& val)
+{
+    val = std::min(val, LIMIT);
+    val = std::max(val, -LIMIT);
+}
+
+
+//=============================================================================
+// The following methods are for testing and debugging.
+
+
+bool Router::existsOrthogonalPathOverlap(void)
+{
+    ConnRefList::iterator fin = connRefs.end();
+    for (ConnRefList::iterator i = connRefs.begin(); i != fin; ++i) 
+    {
+        Avoid::Polygon iRoute = (*i)->displayRoute();
+        ConnRefList::iterator j = i;
+        for (++j; j != fin; ++j) 
+        {
+            // Determine if this pair overlap
+            Avoid::Polygon jRoute = (*j)->displayRoute();
+            CrossingsInfoPair crossingInfo = std::make_pair(0, 0);
+            for (size_t jInd = 1; jInd < jRoute.size(); ++jInd)
+            {
+                const bool finalSegment = ((jInd + 1) == jRoute.size());
+                CrossingsInfoPair crossingInfo = countRealCrossings(
+                        iRoute, true, jRoute, jInd, true, 
+                        finalSegment, NULL, NULL, *i, *j);
+                
+                if ((crossingInfo.second & CROSSING_SHARES_PATH) && 
+                    (crossingInfo.second & CROSSING_SHARES_FIXED_SEGMENT) && 
+                    !(crossingInfo.second & CROSSING_SHARES_PATH_AT_END)) 
+                {
+                    // We looking for fixedSharedPaths and there is a
+                    // fixedSharedPath.
+                    return true;
+                }
+            }
+        }
+    }
+    return false;
+}
+
+
+bool Router::existsOrthogonalTouchingCorners(void)
+{
+    ConnRefList::iterator fin = connRefs.end();
+    for (ConnRefList::iterator i = connRefs.begin(); i != fin; ++i) 
+    {
+        Avoid::Polygon iRoute = (*i)->displayRoute();
+        ConnRefList::iterator j = i;
+        for (++j; j != fin; ++j) 
+        {
+            // Determine if this pair overlap
+            Avoid::Polygon jRoute = (*j)->displayRoute();
+            CrossingsInfoPair crossingInfo = std::make_pair(0, 0);
+            for (size_t jInd = 1; jInd < jRoute.size(); ++jInd)
+            {
+                const bool finalSegment = ((jInd + 1) == jRoute.size());
+                CrossingsInfoPair crossingInfo = countRealCrossings(
+                        iRoute, true, jRoute, jInd, true, 
+                        finalSegment, NULL, NULL, *i, *j);
+                
+                if (crossingInfo.second & CROSSING_TOUCHES) 
+                {
+                    return true;
+                }
+            }
+        }
+    }
+    return false;
+}
+
+
+void Router::outputInstanceToSVG(std::string instanceName)
+{
+    std::string filename;
+    if (!instanceName.empty())
+    {
+        filename = instanceName;
+    }
+    else
+    {
+        filename = "libavoid-debug";
+    }
+    filename += ".svg";
+    FILE *fp = fopen(filename.c_str(), "w");
+
+    if (fp == NULL)
+    {
+        return;
+    }
+
+    double minX = LIMIT;
+    double minY = LIMIT;
+    double maxX = -LIMIT;
+    double maxY = -LIMIT;
+
+    VertInf *curr = vertices.connsBegin();
+    while (curr)
+    {
+        Point p = curr->point;
+
+        reduceRange(p.x);
+        reduceRange(p.y);
+        
+        if (p.x > -LIMIT)
+        {
+            minX = std::min(minX, p.x);
+        }
+        if (p.x < LIMIT)
+        {
+            maxX = std::max(maxX, p.x);
+        }
+        if (p.y > -LIMIT)
+        {
+            minY = std::min(minY, p.y);
+        }
+        if (p.y < LIMIT)
+        {
+            maxY = std::max(maxY, p.y);
+        }
+        curr = curr->lstNext;
+    }
+    minX -= 50;
+    minY -= 50;
+    maxX += 50;
+    maxY += 50;
+
+    fprintf(fp, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
+    fprintf(fp, "<svg xmlns:inkscape=\"http://www.inkscape.org/namespaces/inkscape\" xmlns=\"http://www.w3.org/2000/svg\" width=\"100%%\" height=\"100%%\" viewBox=\"%g %g %g %g\">\n", minX, minY, maxX - minX, maxY - minY);
+
+    // Output source code to generate this instance of the router.
+    fprintf(fp, "<!-- Source code to generate this instance:\n");
+    fprintf(fp, "#include \"libavoid/libavoid.h\"\n");
+    fprintf(fp, "using namespace Avoid;\n");
+    fprintf(fp, "int main(void) {\n");
+    fprintf(fp, "    Router *router = new Router(\n");
+    fprintf(fp, "            PolyLineRouting | OrthogonalRouting);\n");
+    for (size_t p = 0; p < lastPenaltyMarker; ++p)
+    {
+        fprintf(fp, "    router->setRoutingPenalty((PenaltyType)%lu, %g);\n", 
+                p, _routingPenalties[p]);
+    }
+    fprintf(fp, "    router->setOrthogonalNudgeDistance(%g);\n\n",
+            orthogonalNudgeDistance());
+    ShapeRefList::iterator shRefIt = shapeRefs.begin();
+    while (shRefIt != shapeRefs.end())
+    {
+        ShapeRef *shRef = *shRefIt;
+        fprintf(fp, "    Polygon poly%u(%lu);\n", 
+                shRef->id(), shRef->polygon().size());
+        for (size_t i = 0; i < shRef->polygon().size(); ++i)
+        {
+            fprintf(fp, "    poly%u.ps[%lu] = Point(%g, %g);\n", 
+                    shRef->id(), i, shRef->polygon().at(i).x,
+                    shRef->polygon().at(i).y);
+        }
+        fprintf(fp, "    ShapeRef *shapeRef%u = new ShapeRef(router, poly%u, "
+                "%u);\n", shRef->id(), shRef->id(), shRef->id());
+        fprintf(fp, "    router->addShape(shapeRef%u);\n\n", shRef->id());
+        ++shRefIt;
+    }
+    ConnRefList::reverse_iterator revConnRefIt = connRefs.rbegin();
+    while (revConnRefIt != connRefs.rend())
+    {
+        ConnRef *connRef = *revConnRefIt;
+        fprintf(fp, "    ConnRef *connRef%u = new ConnRef(router, %u);\n",
+                connRef->id(), connRef->id());
+        if (connRef->src())
+        {
+            fprintf(fp, "    ConnEnd srcPt%u(Point(%g, %g), %u);\n",
+                    connRef->id(), connRef->src()->point.x,
+                    connRef->src()->point.y, connRef->src()->visDirections);
+            fprintf(fp, "    connRef%u->setSourceEndpoint(srcPt%u);\n",
+                    connRef->id(), connRef->id());
+        }
+        if (connRef->dst())
+        {
+            fprintf(fp, "    ConnEnd dstPt%u(Point(%g, %g), %u);\n",
+                    connRef->id(), connRef->dst()->point.x,
+                    connRef->dst()->point.y, connRef->dst()->visDirections);
+            fprintf(fp, "    connRef%u->setDestEndpoint(dstPt%u);\n",
+                    connRef->id(), connRef->id());
+        }
+        fprintf(fp, "    connRef%u->setRoutingType((ConnType)%u);\n\n", 
+                connRef->id(), connRef->routingType());
+        ++revConnRefIt;
+    }
+    fprintf(fp, "    router->processTransaction();\n");
+    fprintf(fp, "    router->outputInstanceToSVG();\n");
+    fprintf(fp, "    delete router;\n");
+    fprintf(fp, "    return 0;\n");
+    fprintf(fp, "};\n");
+    fprintf(fp, "-->\n");
+
+    
+    fprintf(fp, "<g inkscape:groupmode=\"layer\" "
+            "inkscape:label=\"ShapesPoly\">\n");
+    shRefIt = shapeRefs.begin();
+    while (shRefIt != shapeRefs.end())
+    {
+        ShapeRef *shRef = *shRefIt;
+    
+        fprintf(fp, "<path id=\"poly-%u\" style=\"stroke-width: 1px; "
+                "stroke: black; fill: blue; fill-opacity: 0.3;\" d=\"", 
+                shRef->id());
+        for (size_t i = 0; i < shRef->polygon().size(); ++i)
+        {
+            fprintf(fp, "%c %g,%g ", ((i == 0) ? 'M' : 'L'), 
+                    shRef->polygon().at(i).x, shRef->polygon().at(i).y);
+        }
+        fprintf(fp, "Z\" />\n");
+        ++shRefIt;
+    }
+    fprintf(fp, "</g>\n");
+
+    fprintf(fp, "<g inkscape:groupmode=\"layer\" "
+            "style=\"display: none;\" "
+            "inkscape:label=\"ShapesRect\">\n");
+    shRefIt = shapeRefs.begin();
+    while (shRefIt != shapeRefs.end())
+    {
+        ShapeRef *shRef = *shRefIt;
+        double minX, minY, maxX, maxY;
+        shRef->polygon().getBoundingRect(&minX, &minY, &maxX, &maxY);
+    
+        fprintf(fp, "<rect id=\"rect-%u\" x=\"%g\" y=\"%g\" width=\"%g\" height=\"%g\" "
+                "style=\"stroke-width: 1px; stroke: black; fill: blue; fill-opacity: 0.3;\" />\n",
+                shRef->id(), minX, minY, maxX - minX, maxY - minY);
+        ++shRefIt;
+    }
+    fprintf(fp, "</g>\n");
+
+
+    fprintf(fp, "<g inkscape:groupmode=\"layer\" "
+            "inkscape:label=\"VisGraph\""
+            ">\n");
+    EdgeInf *finish = NULL;
+    fprintf(fp, "<g inkscape:groupmode=\"layer\" "
+            "style=\"display: none;\" "
+            "inkscape:label=\"VisGraph-shape\""
+            ">\n");
+    finish = visGraph.end();
+    for (EdgeInf *t = visGraph.begin(); t != finish; t = t->lstNext)
+    {
+        std::pair<VertID, VertID> ids = t->ids();
+        bool isShape = (ids.first.isShape) && (ids.second.isShape);
+        if (!isShape)
+        {
+            continue;
+        }
+        std::pair<Point, Point> ptpair = t->points();
+        Point p1 = ptpair.first;
+        Point p2 = ptpair.second;
+        
+        reduceRange(p1.x);
+        reduceRange(p1.y);
+        reduceRange(p2.x);
+        reduceRange(p2.y);
+        
+        fprintf(fp, "<path d=\"M %g,%g L %g,%g\" "
+                "style=\"fill: none; stroke: %s; stroke-width: 1px;\" />\n", 
+                p1.x, p1.y, p2.x, p2.y,
+                (!(ids.first.isShape) || !(ids.second.isShape)) ? "green" : 
+                "red");
+    }
+    fprintf(fp, "</g>\n");
+
+    fprintf(fp, "<g inkscape:groupmode=\"layer\" "
+            "style=\"display: none;\" "
+            "inkscape:label=\"VisGraph-conn\""
+            ">\n");
+    finish = visGraph.end();
+    for (EdgeInf *t = visGraph.begin(); t != finish; t = t->lstNext)
+    {
+        std::pair<VertID, VertID> ids = t->ids();
+        bool isShape = (ids.first.isShape) && (ids.second.isShape);
+        if (isShape)
+        {
+            continue;
+        }
+        std::pair<Point, Point> ptpair = t->points();
+        Point p1 = ptpair.first;
+        Point p2 = ptpair.second;
+        
+        reduceRange(p1.x);
+        reduceRange(p1.y);
+        reduceRange(p2.x);
+        reduceRange(p2.y);
+        
+        fprintf(fp, "<path d=\"M %g,%g L %g,%g\" "
+                "style=\"fill: none; stroke: %s; stroke-width: 1px;\" />\n", 
+                p1.x, p1.y, p2.x, p2.y,
+                (!(ids.first.isShape) || !(ids.second.isShape)) ? "green" : 
+                "red");
+    }
+    fprintf(fp, "</g>\n");
+    fprintf(fp, "</g>\n");
+
+    fprintf(fp, "<g inkscape:groupmode=\"layer\" "
+            "style=\"display: none;\" "
+            "inkscape:label=\"OrthogVisGraph\">\n");
+    finish = visOrthogGraph.end();
+    for (EdgeInf *t = visOrthogGraph.begin(); t != finish; t = t->lstNext)
+    {
+        std::pair<Point, Point> ptpair = t->points();
+        Point p1 = ptpair.first;
+        Point p2 = ptpair.second;
+        
+        reduceRange(p1.x);
+        reduceRange(p1.y);
+        reduceRange(p2.x);
+        reduceRange(p2.y);
+        
+        std::pair<VertID, VertID> ids = t->ids();
+
+        fprintf(fp, "<path d=\"M %g,%g L %g,%g\" "
+                "style=\"fill: none; stroke: %s; stroke-width: 1px;\" />\n", 
+                p1.x, p1.y, p2.x, p2.y,
+                (!(ids.first.isShape) || !(ids.second.isShape)) ? "green" : 
+                "red");
+    }
+    fprintf(fp, "</g>\n");
+
+    fprintf(fp, "<g inkscape:groupmode=\"layer\" "
+            "style=\"display: none;\" "
+            "inkscape:label=\"RawConnectors\""
+            ">\n");
+    ConnRefList::iterator connRefIt = connRefs.begin();
+    while (connRefIt != connRefs.end())
+    {
+        ConnRef *connRef = *connRefIt;
+    
+        PolyLine route = connRef->route();
+        if (!route.empty())
+        {
+            fprintf(fp, "<path id=\"raw-%u\" d=\"M %g,%g ", connRef->id(),
+                    route.ps[0].x, route.ps[0].y);
+            for (size_t i = 1; i < route.size(); ++i)
+            {
+                fprintf(fp, "L %g,%g ", route.ps[i].x, route.ps[i].y);
+            }
+            fprintf(fp, "\" ");
+            if (connRef->src() && connRef->dst())
+            {
+                fprintf(fp, "debug=\"src: %d dst: %d\" ",
+                        connRef->src()->visDirections,
+                        connRef->dst()->visDirections);
+            }
+            fprintf(fp, "style=\"fill: none; stroke: black; "
+                    "stroke-width: 1px;\" />\n");
+        }
+        
+        ++connRefIt;
+    }
+    fprintf(fp, "</g>\n");
+
+    fprintf(fp, "<g inkscape:groupmode=\"layer\" "
+            "style=\"display: none;\" "
+            "inkscape:label=\"CurvedDisplayConnectors\""
+            ">\n");
+    connRefIt = connRefs.begin();
+    while (connRefIt != connRefs.end())
+    {
+        ConnRef *connRef = *connRefIt;
+    
+        PolyLine route = connRef->displayRoute().curvedPolyline(8);
+        if (!route.empty())
+        {
+            fprintf(fp, "<path id=\"curved-%u\" d=\"M %g,%g ", connRef->id(),
+                    route.ps[0].x, route.ps[0].y);
+            for (size_t i = 1; i < route.size(); ++i)
+            {
+                if (route.ts[i] == 'C')
+                {
+                    fprintf(fp, "%c %g,%g %g,%g %g,%g", route.ts[i], 
+                            route.ps[i].x, route.ps[i].y,
+                            route.ps[i+1].x, route.ps[i+1].y,
+                            route.ps[i+2].x, route.ps[i+2].y);
+                    i += 2;
+                }
+                else
+                {
+                    fprintf(fp, "%c %g,%g ", route.ts[i], 
+                            route.ps[i].x, route.ps[i].y);
+                }
+            }
+            fprintf(fp, "\" ");
+            if (connRef->src() && connRef->dst())
+            {
+                fprintf(fp, "debug=\"src: %d dst: %d\" ",
+                        connRef->src()->visDirections,
+                        connRef->dst()->visDirections);
+            }
+            fprintf(fp, "style=\"fill: none; stroke: black; "
+                    "stroke-width: 1px;\" />\n");
+        }
+        
+        ++connRefIt;
+    }
+    fprintf(fp, "</g>\n");
+
+
+    fprintf(fp, "<g inkscape:groupmode=\"layer\" "
+            "inkscape:label=\"DisplayConnectors\""
+            ">\n");
+    connRefIt = connRefs.begin();
+    while (connRefIt != connRefs.end())
+    {
+        ConnRef *connRef = *connRefIt;
+    
+        PolyLine route = connRef->displayRoute();
+        if (!route.empty())
+        {
+            fprintf(fp, "<path id=\"disp-%u\" d=\"M %g,%g ", connRef->id(),
+                    route.ps[0].x, route.ps[0].y);
+            for (size_t i = 1; i < route.size(); ++i)
+            {
+                fprintf(fp, "L %g,%g ", route.ps[i].x, route.ps[i].y);
+            }
+            fprintf(fp, "\" ");
+            if (connRef->src() && connRef->dst())
+            {
+                fprintf(fp, "debug=\"src: %d dst: %d\" ",
+                        connRef->src()->visDirections,
+                        connRef->dst()->visDirections);
+            }
+            fprintf(fp, "style=\"fill: none; stroke: black; "
+                    "stroke-width: 1px;\" />\n");
+        }
+        
+        ++connRefIt;
+    }
+    fprintf(fp, "</g>\n");
+
+
+    fprintf(fp, "</svg>\n");
+    fclose(fp);
 }
 
 
index 597f48c5e6b848b0ddd5bc9228cc075dab19f50e..03060b0258d9a8efc2ff012e54d55526ece7cfc1 100644 (file)
  * vim: ts=4 sw=4 et tw=0 wm=0
  *
  * libavoid - Fast, Incremental, Object-avoiding Line Router
- * Copyright (C) 2004-2006  Michael Wybrow <mjwybrow@users.sourceforge.net>
+ *
+ * Copyright (C) 2004-2009  Monash University
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
+ * See the file LICENSE.LGPL distributed with the library.
+ *
+ * Licensees holding a valid commercial license may use this file in
+ * accordance with the commercial license agreement provided with the 
+ * library.
  *
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
  *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- * 
+ * Author(s):   Michael Wybrow <mjwybrow@users.sourceforge.net>
 */
 
+//! @file    router.h
+//! @brief   Contains the interface for the Router class.
+
 
 #ifndef AVOID_ROUTER_H
 #define AVOID_ROUTER_H
 
-//#define LINEDEBUG
+#include <list>
+#include <utility>
+#include <string>
 
 #include "libavoid/shape.h"
+#include "libavoid/viscluster.h"
 #include "libavoid/graph.h"
 #include "libavoid/timer.h"
-#include <list>
-#include <utility>
-#ifdef LINEDEBUG       
+#include "libavoid/connector.h"
+
+#if defined(LINEDEBUG) || defined(ASTAR_DEBUG) || defined(LIBAVOID_SDL)
     #include <SDL.h>
+    #ifndef LIBAVOID_SDL
+        #define LIBAVOID_SDL
+    #endif
 #endif
 
 
 namespace Avoid {
 
-class ConnRef;
-typedef std::list<ConnRef *> ConnRefList;
 typedef std::list<unsigned int> IntList;
-class MoveInfo;
-typedef std::list<MoveInfo *> MoveInfoList;
+
+class ActionInfo;
+typedef std::list<ActionInfo> ActionInfoList;
+class ShapeRef;
+
+//! @brief  Flags that can be passed to the router during initialisation 
+//!         to specify options.
+enum RouterFlag
+{
+    //! @brief  This option specifies that the router should maintain the
+    //!         structures necessary to allow poly-line connector routing.
+    PolyLineRouting = 1,
+    //! @brief  This option specifies that the router should maintain the
+    //!         structures necessary to allow orthogonal connector routing.
+    OrthogonalRouting = 2
+};
 
 
 static const unsigned int runningTo = 1;
 static const unsigned int runningFrom = 2;
 static const unsigned int runningToAndFrom = runningTo | runningFrom;
 
+//! @brief  Types of penalty cases that can be used to improve the quality 
+//!         of the connector routes produced.
+enum PenaltyType
+{
+    //! @brief  This penalty is applied for each segment in the connector 
+    //!         path beyond the first.  This should always normally be set
+    //!         when doing orthogonal routing to prevent step-like connector
+    //!         paths.
+    segmentPenalty = 0,
+    //! @brief  This penalty is applied in its full amount to tight acute 
+    //!         bends in the connector path.  A smaller portion of the penalty
+    //!         is applied for slight bends, i.e., where the bend is close to
+    //!         180 degrees.  This is useful for polyline routing where there
+    //!         is some evidence that tighter corners are worse for 
+    //!         readability, but that slight bends might not be so bad, 
+    //!         especially when smoothed by curves.
+    anglePenalty,
+    //! @brief  This penalty is applied whenever a connector path crosses 
+    //!         another connector path.  It takes shared paths into 
+    //!         consideration and the penalty is only applied if there
+    //!         is an actual crossing.
+    //! @note   This penalty is still experimental!  It is not recommended
+    //!         for normal use.
+    crossingPenalty,
+    //! @brief  This penalty is applied whenever a connector path crosses 
+    //!         a cluster boundary.
+    //! @note   This penalty is still experimental!  It is not recommended
+    //!         for normal use.
+    clusterCrossingPenalty,
+    //! @brief  This penalty is applied whenever a connector path shares 
+    //!         some segments with an immovable portion of an existing 
+    //!         connector route (such as the first or last segment of a
+    //!         connector).
+    //! @note   This penalty is still experimental!  It is not recommended
+    //!         for normal use.
+    fixedSharedPathPenalty,
+    // Used for determining the size of the penalty array.  
+    // This should always we the last value in the enum.
+    lastPenaltyMarker
+};
+
+
+static const double noPenalty = 0;
+static const double chooseSensiblePenalty = -1;
+
 
+//! @brief   The Router class represents a libavoid router instance.
+//!
+//! Usually you would keep a separate Router instance for each diagram
+//! or layout you have open in your application.
+//
 class Router {
     public:
-        Router();
+        //! @brief  Constructor for router instance.
+        //!
+        //! @param[in]  flags  One or more Avoid::RouterFlag options to 
+        //!                    control the behaviour of the router.
+        Router(const unsigned int flags);
+
+        //! @brief  Destructor for router instance.
+        //!
+        //! @note   Destroying a router instance will delete all remaining
+        //!         shapes and connectors, thereby invalidating any existing
+        //!         pointers to them.
+        ~Router();
 
         ShapeRefList shapeRefs;
         ConnRefList connRefs;
+        ClusterRefList clusterRefs;
         EdgeList visGraph;
         EdgeList invisGraph;
+        EdgeList visOrthogGraph;
         ContainsMap contains;
         VertInfList vertices;
+        ContainsMap enclosingClusters;
         
         bool PartialTime;
         bool SimpleRouting;
-        double segmt_penalty;
-        double angle_penalty;
-        double crossing_penalty;
-
+        bool ClusteredRouting;
 
-        bool UseAStarSearch;
+        // Poly-line routing options:
         bool IgnoreRegions;
-        bool SelectiveReroute;
-        bool IncludeEndpoints;
         bool UseLeesAlgorithm;
         bool InvisibilityGrph;
-        bool ConsolidateMoves;
+       
+        // General routing options:
+        bool SelectiveReroute;
+        
         bool PartialFeedback;
+        bool RubberBandRouting;
+        
 
         // Instrumentation:
         Timer timers;
         int st_checked_edges;
-#ifdef LINEDEBUG
+#ifdef LIBAVOID_SDL
         SDL_Surface *avoid_screen;
 #endif
 
+        //! @brief Allows setting of the behaviour of the router in regard
+        //!        to transactions.  This controls whether transactions are
+        //!        used to queue changes and process them effeciently at once
+        //!        or they are instead processed immediately.
+        //!
+        //! It is more efficient to perform actions like shape movement,
+        //! addition or deletion as batch tasks, and reroute the necessary
+        //! connectors just once after these actions have been performed.
+        //! For this reason, libavoid allows you to group such actions into
+        //! "transactions" that are processed efficiently when the 
+        //! processTransaction() method is called.
+        //!
+        //! By default, the router will process all actions as tranactions.
+        //! If transactionUse() is set to false, then all actions will get 
+        //! processed immediately, and cause immediate routing callbacks to 
+        //! all affected connectors after each action.
+        //!
+        //! @param[in]  transactions  A boolean value specifying whether to
+        //!                           use transactions.
+        //!
+        void setTransactionUse(const bool transactions);
+
+        //! @brief Reports whether the router groups actions into transactions.
+        //!
+        //! @return A boolean value describing whether transactions are in use.
+        //!
+        //! @sa setTransactionUse
+        //! @sa processTransaction
+        //!
+        bool transactionUse(void) const;
+
+        //! @brief Finishes the current transaction and processes all the 
+        //!        queued object changes efficiently.
+        //!
+        //! This method will efficiently process all moves, additions and
+        //! deletions that have occurred since processTransaction() was 
+        //! last called.
+        //!
+        //! If transactionUse() is false, then all actions will have been 
+        //! processed immediately and this method will do nothing.
+        //!
+        //! @return A boolean value describing whether there were any actions
+        //!         to process.
+        //!
+        //! @sa setTransactionUse
+        //!
+        bool processTransaction(void);
+        
+        //! @brief Add a shape to the router scene.
+        //!
+        //! This shape will be considered to be an obstacle. Calling this 
+        //! method will cause connectors intersecting the added shape to
+        //! be marked as needing to be rerouted.
+        //!
+        //! @param[in]  shape  Pointer reference to the shape being added.
+        //!
         void addShape(ShapeRef *shape);
-        void delShape(ShapeRef *shape);
-        void moveShape(ShapeRef *shape, Polygn *newPoly,
+
+        //! @brief Remove a shape from the router scene.
+        //!
+        //! Connectors that could have a better (usually shorter) path after
+        //! the removal of this shape will be marked as needing to be rerouted.
+        //!
+        //! @param[in]  shape  Pointer reference to the shape being removed.
+        //!
+        void removeShape(ShapeRef *shape);
+
+        //! @brief Move or resize an existing shape within the router scene.
+        //!
+        //! A new polygon for the shape can be given to effectively move or 
+        //! resize the shape with the scene.  Connectors that intersect the 
+        //! new shape polygon, or that could have a better (usually shorter)
+        //! path after the change, will be marked as needing to be rerouted.
+        //!
+        //! @param[in]  shape       Pointer reference to the shape being 
+        //!                         moved/resized.
+        //! @param[in]  newPoly     The new polygon boundary for the shape.
+        //! @param[in]  first_move  This option is used for some advanced 
+        //!                         (currently undocumented) behaviour and 
+        //!                         it should be ignored for the moment.
+        //!
+        void moveShape(ShapeRef *shape, const Polygon& newPoly,
                 const bool first_move = false);
-        void processMoves(void);
-        
+
+        //! @brief Move an existing shape within the router scene by a relative
+        //!        distance.
+        //!         
+        //! Connectors that intersect the shape's new position, or that could 
+        //! have a better (usually shorter) path after the change, will be 
+        //! marked as needing to be rerouted.
+        //!
+        //! @param[in]  shape       Pointer reference to the shape being moved.
+        //! @param[in]  xDiff       The distance to move the shape in the 
+        //!                         x dimension.
+        //! @param[in]  yDiff       The distance to move the shape in the 
+        //!                         y dimension.
+        //!
+        void moveShape(ShapeRef *shape, const double xDiff, const double yDiff);
+
+        //! @brief Sets a spacing distance for overlapping orthogonal 
+        //!        connectors to be nudged apart.
+        //!         
+        //! By default, this distance is set to a value of 4.
+        //!
+        //! This method does not re-trigger post-processing of connectors.
+        //! The new distance will be used the next time rerouting is performed.
+        //!
+        //! @param[in]  dist  The distance to be used for orthogonal nudging.
+        //!
+        void setOrthogonalNudgeDistance(const double dist);
+
+        //! @brief   Returns the spacing distance that overlapping orthogonal
+        //!          connecotrs are nudged apart.
+        //!
+        //! @return  The current spacing distance used for orthogonal nudging.
+        //!
+        double orthogonalNudgeDistance(void) const;
+
+        //! @brief  Sets or removes penalty values that are applied during 
+        //!         connector routing.
+        //!
+        //! By default, libavoid will produce shortest path routes between
+        //! the source and destination points for each connector.  There are
+        //! several penalties that can be applied during this stage to 
+        //! improve the aesthetics of the routes generated.  These different
+        //! penalties are specified and explained by the PenaltyType enum.
+        //! 
+        //! If a value of zero or Avoid::noPenalty is given then the penalty 
+        //! for this case will be removed.  If no penalty argument (or a 
+        //! negative value) is specified when calling this method, then a 
+        //! sensible penalty value will be automatically chosen.
+        //!
+        //! @param[in] penType  The type of penalty, a PenaltyType.
+        //! @param[in] penVal   The value to be applied for each occurance
+        //!                     of the penalty case.  
+        //!
+        void setRoutingPenalty(const PenaltyType penType, 
+                const double penVal = chooseSensiblePenalty);
+
+        //! @brief  Returns the current penalty value for a particular 
+        //!         routing penalty case.
+        //!
+        //! @param[in] penType  The type of penalty, a PenaltyType.
+        //! @return  The penalty value for the specified penalty case.
+        //!
+        double routingPenalty(const PenaltyType penType) const;
+
+        void addCluster(ClusterRef *cluster);
+        void delCluster(ClusterRef *cluster);
+
         void attachedConns(IntList &conns, const unsigned int shapeId,
                 const unsigned int type);
         void attachedShapes(IntList &shapes, const unsigned int shapeId,
@@ -98,15 +329,49 @@ class Router {
         void markConnectors(ShapeRef *shape);
         void generateContains(VertInf *pt);
         void printInfo(void);
+        void outputInstanceToSVG(std::string filename = std::string());
+        unsigned int assignId(const unsigned int suggestedId);
+        void regenerateStaticBuiltGraph(void);
+        void destroyOrthogonalVisGraph(void);
+        void setStaticGraphInvalidated(const bool invalidated);
+        ConnType validConnType(const ConnType select = ConnType_None) const;
+        bool shapeInQueuedActionList(ShapeRef *shape) const;
+        double& penaltyRef(const PenaltyType penType);
+        bool existsOrthogonalPathOverlap(void);
+        bool existsOrthogonalTouchingCorners(void);
+
     private:
-        void newBlockingShape(Polygn *poly, int pid);
+        friend class ConnRef;
+
+        void modifyConnector(ConnRef *conn);
+        void modifyConnector(ConnRef *conn, unsigned int type,
+                const ConnEnd &connEnd);
+        void removeQueuedConnectorActions(ConnRef *conn);
+        void newBlockingShape(const Polygon& poly, int pid);
         void checkAllBlockedEdges(int pid);
         void checkAllMissingEdges(void);
-        void adjustContainsWithAdd(const Polygn& poly, const int p_shape);
+        void adjustContainsWithAdd(const Polygon& poly, const int p_shape);
         void adjustContainsWithDel(const int p_shape);
-        void callbackAllInvalidConnectors(void);
+        void adjustClustersWithAdd(const PolygonInterface& poly, 
+                const int p_cluster);
+        void adjustClustersWithDel(const int p_cluster);
+        void rerouteAndCallbackConnectors(void);
+        bool idIsUnique(const unsigned int id) const;
+        void improveCrossings(void);
+
+        ActionInfoList actionList;
+        unsigned int _largestAssignedId;
+        bool _consolidateActions;
+        double _orthogonalNudgeDistance;
+        double _routingPenalties[lastPenaltyMarker];
+
+    public:
+        // Overall modes:
+        bool _polyLineRouting;
+        bool _orthogonalRouting;
 
-        MoveInfoList moveList;
+        bool _staticGraphInvalidated;
+        bool _inCrossingPenaltyReroutingStage;
 };
 
 }
index c0ff2f6e893d83a51d4585d8ad7abc52c0365d25..ac3f0c1933e621b769a04116571b508e2b61fe93 100644 (file)
@@ -2,53 +2,57 @@
  * vim: ts=4 sw=4 et tw=0 wm=0
  *
  * libavoid - Fast, Incremental, Object-avoiding Line Router
- * Copyright (C) 2004-2006  Michael Wybrow <mjwybrow@users.sourceforge.net>
+ *
+ * Copyright (C) 2004-2008  Monash University
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
+ * See the file LICENSE.LGPL distributed with the library.
+ *
+ * Licensees holding a valid commercial license may use this file in
+ * accordance with the commercial license agreement provided with the 
+ * library.
  *
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
  *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- * 
+ * Author(s):   Michael Wybrow <mjwybrow@users.sourceforge.net>
 */
 
-#include <cassert>
 
 #include "libavoid/shape.h"
 #include "libavoid/graph.h"  // For alertConns
 #include "libavoid/vertices.h"
-#include "libavoid/polyutil.h"
 #include "libavoid/router.h"
+#include "libavoid/debug.h"
+#include "libavoid/assertions.h"
 
 
 namespace Avoid {
 
 
-ShapeRef::ShapeRef(Router *router, unsigned int id, Polygn& ply)
+ShapeRef::ShapeRef(Router *router, Polygon& ply, const unsigned int id)
     : _router(router)
-    , _id(id)
-    , _poly(copyPoly(ply))
+    , _poly(ply)
     , _active(false)
     , _inMoveList(false)
     , _firstVert(NULL)
     , _lastVert(NULL)
 {
+    _id = router->assignId(id);
+
     bool isShape = true;
-    VertID i = VertID(id, isShape, 0);
+    VertID i = VertID(_id, isShape, 0);
     
+    const bool addToRouterNow = false;
     VertInf *last = NULL;
     VertInf *node = NULL;
-    for (int pt_i = 0; pt_i < _poly.pn; pt_i++)
+    for (size_t pt_i = 0; pt_i < _poly.size(); ++pt_i)
     {
-        node = new VertInf(_router, i, _poly.ps[pt_i]);
+        node = new VertInf(_router, i, _poly.ps[pt_i], addToRouterNow);
 
         if (!_firstVert)
         {
@@ -69,17 +73,22 @@ ShapeRef::ShapeRef(Router *router, unsigned int id, Polygn& ply)
     
     _lastVert->shNext = _firstVert;
     _firstVert->shPrev = _lastVert;
-    
-    makeActive();
 }
 
 
 ShapeRef::~ShapeRef()
 {
-    assert(_firstVert != NULL);
-    
-    makeInactive();
+    COLA_ASSERT(!_router->shapeInQueuedActionList(this));
 
+    if (_active)
+    {
+        // Destroying a shape without calling removeShape(), so do it now.
+        _router->removeShape(this);
+        _router->processTransaction();
+    }
+
+    COLA_ASSERT(_firstVert != NULL);
+    
     VertInf *it = _firstVert;
     do
     {
@@ -90,41 +99,37 @@ ShapeRef::~ShapeRef()
     }
     while (it != _firstVert);
     _firstVert = _lastVert = NULL;
-
-    freePoly(_poly);
 }
 
 
-void ShapeRef::setNewPoly(Polygn& poly)
+void ShapeRef::setNewPoly(const Polygon& poly)
 {
-    assert(_firstVert != NULL);
-    assert(_poly.pn == poly.pn);
+    COLA_ASSERT(_firstVert != NULL);
+    COLA_ASSERT(_poly.size() == poly.size());
     
     VertInf *curr = _firstVert;
-    for (int pt_i = 0; pt_i < _poly.pn; pt_i++)
+    for (size_t pt_i = 0; pt_i < _poly.size(); ++pt_i)
     {
-        assert(curr->visListSize == 0);
-        assert(curr->invisListSize == 0);
+        COLA_ASSERT(curr->visListSize == 0);
+        COLA_ASSERT(curr->invisListSize == 0);
 
         // Reset with the new polygon point.
         curr->Reset(poly.ps[pt_i]);
         curr->pathNext = NULL;
-        curr->pathDist = 0;
         
         curr = curr->shNext;
     }
-    assert(curr == _firstVert);
+    COLA_ASSERT(curr == _firstVert);
         
-    freePoly(_poly);
-    _poly = copyPoly(poly);
+    _poly = poly;
 }
 
 
 void ShapeRef::makeActive(void)
 {
-    assert(!_active);
+    COLA_ASSERT(!_active);
     
-    // Add to connRefs list.
+    // Add to shapeRefs list.
     _pos = _router->shapeRefs.insert(_router->shapeRefs.begin(), this);
 
     // Add points to vertex list.
@@ -144,9 +149,9 @@ void ShapeRef::makeActive(void)
 
 void ShapeRef::makeInactive(void)
 {
-    assert(_active);
+    COLA_ASSERT(_active);
     
-    // Remove from connRefs list.
+    // Remove from shapeRefs list.
     _router->shapeRefs.erase(_pos);
 
     // Remove points from vertex list.
@@ -162,7 +167,13 @@ void ShapeRef::makeInactive(void)
     
     _active = false;
 }
-    
+
+
+bool ShapeRef::isActive(void) const
+{
+    return _active;
+}
+
 
 VertInf *ShapeRef::firstVert(void)
 {
@@ -176,19 +187,19 @@ VertInf *ShapeRef::lastVert(void)
 }
 
 
-unsigned int ShapeRef::id(void)
+unsigned int ShapeRef::id(void) const
 {
     return _id;
 }
 
 
-Polygn ShapeRef::poly(void)
+const Polygon& ShapeRef::polygon(void) const
 {
     return _poly;
 }
 
 
-Router *ShapeRef::router(void)
+Router *ShapeRef::router(void) const
 {
     return _router;
 }
@@ -196,13 +207,13 @@ Router *ShapeRef::router(void)
 
 void ShapeRef::boundingBox(BBox& bbox)
 {
-    assert(_poly.pn > 0);
+    COLA_ASSERT(!_poly.empty());
 
     bbox.a = bbox.b = _poly.ps[0];
     Point& a = bbox.a;
     Point& b = bbox.b;
 
-    for (int i = 1; i < _poly.pn; ++i)
+    for (size_t i = 1; i < _poly.size(); ++i)
     {
         const Point& p = _poly.ps[i];
 
@@ -223,8 +234,8 @@ void ShapeRef::removeFromGraph(void)
         
         // For each vertex.
         EdgeInfList& visList = tmp->visList;
-        EdgeInfList::iterator finish = visList.end();
-        EdgeInfList::iterator edge;
+        EdgeInfList::const_iterator finish = visList.end();
+        EdgeInfList::const_iterator edge;
         while ((edge = visList.begin()) != finish)
         {
             // Remove each visibility edge
@@ -239,6 +250,15 @@ void ShapeRef::removeFromGraph(void)
             // Remove each invisibility edge
             delete (*edge);
         }
+
+        EdgeInfList& orthogList = tmp->orthogVisList;
+        finish = orthogList.end();
+        while ((edge = orthogList.begin()) != finish)
+        {
+            // Remove each orthogonal visibility edge
+            (*edge)->alertConns();
+            delete (*edge);
+        }
     }
 }
 
@@ -251,8 +271,8 @@ void ShapeRef::markForMove(void)
     }
     else
     {
-        fprintf(stderr, "WARNING: two moves queued for same shape prior to "
-                "rerouting.\n         This is not safe.\n");
+        db_printf("WARNING: two moves queued for same shape prior to rerouting."
+                "\n         This is not safe.\n");
     }
 }
 
index b654c6eea159bf458694e998ce1c1f899d29b663..df4c98df14a70d20fbd832e776d2146e4fec90d2 100644 (file)
@@ -2,24 +2,30 @@
  * vim: ts=4 sw=4 et tw=0 wm=0
  *
  * libavoid - Fast, Incremental, Object-avoiding Line Router
- * Copyright (C) 2004-2006  Michael Wybrow <mjwybrow@users.sourceforge.net>
+ *
+ * Copyright (C) 2004-2008  Monash University
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
+ * See the file LICENSE.LGPL distributed with the library.
+ *
+ * Licensees holding a valid commercial license may use this file in
+ * accordance with the commercial license agreement provided with the 
+ * library.
  *
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
  *
+ * Author(s):   Michael Wybrow <mjwybrow@users.sourceforge.net>
 */
 
+//! @file    shape.h
+//! @brief   Contains the interface for the ShapeRef class.
+
+
 #ifndef AVOID_SHAPE_H
 #define AVOID_SHAPE_H
 
@@ -35,21 +41,64 @@ class ShapeRef;
 typedef std::list<ShapeRef *> ShapeRefList;
 
 
+//! @brief   The ShapeRef class represents a shape object.
+//!
+//! Shapes are obstacles that connectors must be routed around.  They can be 
+//! placed into a Router scene and can be repositioned or resized (via
+//! Router::moveShape()).
+//! 
+//! Usually, it is expected that you would create a ShapeRef for each shape 
+//! in your diagram and keep that reference in your own shape class.
+//!
 class ShapeRef
 {
     public:
-        ShapeRef(Router *router, unsigned int id, Polygn& poly);
-        virtual ~ShapeRef();
-        void setNewPoly(Polygn& poly);
+        //! @brief  Shape reference constructor.
+        //!
+        //! Creates a shape obect reference, but does not yet place it into the
+        //! Router scene.
+        //!
+        //! The poly argument will usually be the boundary of the shape in your 
+        //! application with additional buffer of several pixels on each side.
+        //! Specifying such a buffer results in connectors leaving a small 
+        //! amount of space around shapes, rather than touching them on the 
+        //! corners or edges.
+        //!
+        //! If an ID is not specified, then one will be assigned to the shape.
+        //! If assigning an ID yourself, note that it should be a unique 
+        //! positive integer.  Also, IDs are given to all objects in a scene,
+        //! so the same ID cannot be given to a shape and a connector for 
+        //! example.
+        //!
+        //! @param[in]  router  The router scene to place the shape into.
+        //! @param[in]  poly    A Polygon representing the boundary of the 
+        //!                     shape.
+        //! @param[in]  id      A unique positive integer ID for the shape.  
+        ShapeRef(Router *router, Polygon& poly, const unsigned int id = 0);
+        //! @brief  Shape reference destructor.
+        //!
+        //! This will call Router::removeShape() for this shape, if this has
+        //! not already be called.
+        ~ShapeRef();
+        
+        //! @brief   Returns the ID of this shape.
+        //! @returns The ID of the shape. 
+        unsigned int id(void) const;
+        //! @brief   Returns a reference to the polygon boundary of this shape.
+        //! @returns A reference to the polygon boundary of the shape.
+        const Polygon& polygon(void) const;
+        //! @brief   Returns a pointer to the router scene this shape is in.
+        //! @returns A pointer to the router scene for this shape.
+        Router *router(void) const;
+        
+        void setNewPoly(const Polygon& poly);
         VertInf *firstVert(void);
         VertInf *lastVert(void);
-        unsigned int id(void);
-        Polygn poly(void);
-        Router *router(void);
         void boundingBox(BBox& bbox);
 
         void makeActive(void);
         void makeInactive(void);
+        bool isActive(void) const;
 
         void removeFromGraph(void);
         void markForMove(void);
@@ -60,7 +109,7 @@ class ShapeRef
     private:
         Router *_router;
         unsigned int _id;
-        Polygn _poly;
+        Polygon _poly;
         bool _active;
         bool _inMoveList;
         ShapeRefList::iterator _pos;
diff --git a/src/libavoid/static.cpp b/src/libavoid/static.cpp
deleted file mode 100644 (file)
index 740a4f9..0000000
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * vim: ts=4 sw=4 et tw=0 wm=0
- *
- * libavoid - Fast, Incremental, Object-avoiding Line Router
- * Copyright (C) 2004-2006  Michael Wybrow <mjwybrow@users.sourceforge.net>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- * 
-*/
-
-#include <cassert>
-#include <iostream>
-#include "libavoid/vertices.h"
-#include "libavoid/connector.h"
-#include "libavoid/graph.h"
-#include "libavoid/static.h"
-#include "libavoid/shape.h"
-#include "libavoid/visibility.h"
-#include "libavoid/debug.h"
-#include "libavoid/router.h"
-
-namespace Avoid {
-
-static void computeCompleteVis(Router *router);
-
-
-// This should only be used for the static algorithm.
-//
-// XXX: If to set up the vis graph for incremental it would need 
-//      the shapeRef pointers in obs.
-//
-void CreateVisGraph(Router *router, Polygn **obs, int n_obs)
-{
-    for (int poly_i = 0; poly_i < n_obs; poly_i++)
-    {
-        unsigned int id = obs[poly_i]->id;
-        
-        new ShapeRef(router, id, *(obs[poly_i]));
-    }
-    computeCompleteVis(router);
-}
-
-
-static void computeCompleteVis(Router *router)
-{
-    VertInf *beginVert = router->vertices.shapesBegin();
-    VertInf *endVert = router->vertices.end();
-    for (VertInf *i = beginVert; i != endVert; i = i->lstNext)
-    {
-        db_printf("-- CONSIDERING --\n");
-        i->id.db_print();
-
-        for (VertInf *j = i->lstPrev ; j != NULL; j = j->lstPrev)
-        {
-            bool knownNew = true;
-            EdgeInf::checkEdgeVisibility(i, j, knownNew);
-        }
-    }
-}
-
-
-void DestroyVisGraph(Router *router)
-{
-    ShapeRefList::iterator sFinish = router->shapeRefs.end();
-    ShapeRefList::iterator sCurr;
-    
-    while ((sCurr = router->shapeRefs.begin()) != sFinish)
-    {
-        ShapeRef *shape = (*sCurr);
-
-        shape->removeFromGraph();
-        delete shape;
-    }
-    
-    ConnRefList::iterator cFinish = router->connRefs.end();
-    ConnRefList::iterator cCurr;
-    
-    while ((cCurr = router->connRefs.begin())!= cFinish)
-    {
-        ConnRef *conn = (*cCurr);
-
-        conn->removeFromGraph();
-        conn->unInitialise();
-    }
-    // Clear contains info.
-    router->contains.clear();
-
-    assert(router->vertices.connsBegin() == NULL);
-}
-
-
-}
-
diff --git a/src/libavoid/static.h b/src/libavoid/static.h
deleted file mode 100644 (file)
index 18e9ac2..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * vim: ts=4 sw=4 et tw=0 wm=0
- *
- * libavoid - Fast, Incremental, Object-avoiding Line Router
- * Copyright (C) 2004-2006  Michael Wybrow <mjwybrow@users.sourceforge.net>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- * 
-*/
-
-
-#ifndef AVOID_STATIC_H
-#define AVOID_STATIC_H
-
-#include "libavoid/geomtypes.h"
-
-
-namespace Avoid {
-
-class Router;
-
-
-extern void CreateVisGraph(Router *router, Polygn **obstacles,
-        int n_obstacles);
-extern void DestroyVisGraph(Router *router);
-
-}
-
-
-#endif
index e4349bea971626598960b7d973dca3692b4ce2e8..f8600acbebaf40f9b7bae8d708d5e62c41a841de 100644 (file)
@@ -2,31 +2,34 @@
  * vim: ts=4 sw=4 et tw=0 wm=0
  *
  * libavoid - Fast, Incremental, Object-avoiding Line Router
- * Copyright (C) 2004-2006  Michael Wybrow <mjwybrow@users.sourceforge.net>
+ *
+ * Copyright (C) 2004-2008  Monash University
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
+ * See the file LICENSE.LGPL distributed with the library.
+ *
+ * Licensees holding a valid commercial license may use this file in
+ * accordance with the commercial license agreement provided with the 
+ * library.
  *
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
  *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- * 
+ * Author(s):   Michael Wybrow <mjwybrow@users.sourceforge.net>
 */
 
+
 #include <cstdio>
 #include <cstdlib>
-#include <cassert>
-using std::abort;
 #include <climits>
 
 #include "libavoid/timer.h"
+#include "libavoid/debug.h"
+#include "libavoid/assertions.h"
 
 namespace Avoid {
 
@@ -52,9 +55,9 @@ void Timer::Reset(void)
 }
 
 
-void Timer::Register(const int t, const bool start)
+void Timer::Register(const TimerIndex t, const bool start)
 {
-    assert(t != tmNon);
+    COLA_ASSERT(t != tmNon);
 
     if (type == tmNon)
     {
@@ -73,11 +76,7 @@ void Timer::Register(const int t, const bool start)
 
 void Timer::Start(void)
 {
-    if (running)
-    {
-        fprintf(stderr, "ERROR: Timer already running in Timer::Start()\n");
-        abort();
-    }
+    COLA_ASSERT(!running);
     cStart[type] = clock();  // CPU time
     running = true;
 }
@@ -85,11 +84,7 @@ void Timer::Start(void)
 
 void Timer::Stop(void)
 {
-    if (!running)
-    {
-        fprintf(stderr, "ERROR: Timer not running in Timer::Stop()\n");
-        abort();
-    }
+    COLA_ASSERT(running);
     clock_t cStop = clock();      // CPU time
     running = false;
 
@@ -106,11 +101,7 @@ void Timer::Stop(void)
         cDiff = cStop - cStart[type];
     }
     
-    if (cDiff > LONG_MAX)
-    {
-        fprintf(stderr, "Error: cDiff overflow in Timer:Stop()\n");
-        abort();
-    }
+    COLA_ASSERT(cDiff < LONG_MAX);
 
     if (type == tmPth)
     {
@@ -136,11 +127,11 @@ void Timer::Stop(void)
 }
 
 
-void Timer::PrintAll(void)
+void Timer::PrintAll(FILE *fp)
 {
-    for (int i = 0; i < tmCount; i++)
+    for (unsigned int i = 0; i < tmCount; i++)
     {
-        Print(i);
+        Print((TimerIndex) i, fp);
     }
 }
 
@@ -148,14 +139,14 @@ void Timer::PrintAll(void)
 #define toMsec(tot) ((bigclock_t) ((tot) / (((double) CLOCKS_PER_SEC) / 1000)))
 #define toAvg(tot, cnt) ((((cnt) > 0) ? ((long double) (tot)) / (cnt) : 0))
 
-void Timer::Print(const int t)
+void Timer::Print(const TimerIndex t, FILE *fp)
 {
    bigclock_t avg = toMsec(toAvg(cTotal[t], cTally[t]));
    bigclock_t pind = toMsec(toAvg(cPath[t], cPathTally[t]));
    bigclock_t pavg = toMsec(toAvg(cPath[t], cTally[t]));
    double max = toMsec(cMax[t]); 
    double pmax = toMsec(cPathMax[t]);
-   printf("\t%lld %d %lld %.0f %lld %d %lld %.0f %lld\n",
+   fprintf(fp, "\t%lld %d %lld %.0f %lld %d %lld %.0f %lld\n",
            cTotal[t], cTally[t], avg, max,
            cPath[t], cPathTally[t], pavg, pmax, pind);
 }
index a7e6081fab2b917e52fe2f1f0fe99576592628ca..9cab6d7ff21b56c62a1707c0900db9237cf4107f 100644 (file)
@@ -2,24 +2,27 @@
  * vim: ts=4 sw=4 et tw=0 wm=0
  *
  * libavoid - Fast, Incremental, Object-avoiding Line Router
- * Copyright (C) 2004-2006  Michael Wybrow <mjwybrow@users.sourceforge.net>
+ *
+ * Copyright (C) 2004-2008  Monash University
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
+ * See the file LICENSE.LGPL distributed with the library.
+ *
+ * Licensees holding a valid commercial license may use this file in
+ * accordance with the commercial license agreement provided with the 
+ * library.
  *
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
  *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- * 
+ * Author(s):   Michael Wybrow <mjwybrow@users.sourceforge.net>
 */
 
+
 #ifndef PROFILE_H
 #define PROFILE_H
 
@@ -46,14 +49,20 @@ namespace Avoid {
 
 typedef unsigned long long int bigclock_t;
 
-static const int tmCount = 5;
-
-static const int tmNon = -1;
-static const int tmAdd = 0;
-static const int tmDel = 1;
-static const int tmMov = 2;
-static const int tmPth = 3;
-static const int tmSev = 4;
+enum TimerIndex 
+{
+    tmNon = 0,
+    tmAdd,
+    tmDel,
+    tmMov,
+    tmPth,
+    tmSev,
+    tmOrthogGraph,
+    tmOrthogRoute,
+    tmOrthogCentre,
+    tmOrthogNudge,
+    tmCount
+};
 
 
 static const bool timerStart = true;
@@ -64,12 +73,12 @@ class Timer
 {
     public:
         Timer();
-        void Register(const int t, const bool start = timerDelay);
+        void Register(const TimerIndex t, const bool start = timerDelay);
         void Start(void);
         void Stop(void);
         void Reset(void);
-        void Print(const int t);
-        void PrintAll(void);
+        void Print(TimerIndex, FILE *fp);
+        void PrintAll(FILE *fp);
 
     private:
         clock_t cStart[tmCount];
@@ -82,7 +91,7 @@ class Timer
 
         bool running;
         long count;
-        int type, lasttype;
+        TimerIndex type, lasttype;
 };
 
 
index c2be955ac3d89c27ce227d0cd88b987cd1076cbb..85226498aa1fedcd5b3e624f5f8fdb640057e0bc 100644 (file)
@@ -2,33 +2,36 @@
  * vim: ts=4 sw=4 et tw=0 wm=0
  *
  * libavoid - Fast, Incremental, Object-avoiding Line Router
- * Copyright (C) 2004-2006  Michael Wybrow <mjwybrow@users.sourceforge.net>
+ *
+ * Copyright (C) 2004-2009  Monash University
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
+ * See the file LICENSE.LGPL distributed with the library.
+ *
+ * Licensees holding a valid commercial license may use this file in
+ * accordance with the commercial license agreement provided with the 
+ * library.
  *
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
  *
+ * Author(s):   Michael Wybrow <mjwybrow@users.sourceforge.net>
 */
 
+
+#include <iostream>
+#include <cstdlib>
+
 #include "libavoid/vertices.h"
 #include "libavoid/geometry.h"
 #include "libavoid/graph.h"  // For alertConns
 #include "libavoid/debug.h"
 #include "libavoid/router.h"
-
-#include <iostream>
-#include <cstdlib>
-#include <cassert>
+#include "libavoid/assertions.h"
 
 using std::ostream;
 
@@ -76,7 +79,8 @@ bool VertID::operator==(const VertID& rhs) const
     {
         return false;
     }
-    assert(isShape == rhs.isShape);
+    // XXX RubberBand search breaks this:
+    // COLA_ASSERT(isShape == rhs.isShape);
     return true;
 }
 
@@ -87,7 +91,7 @@ bool VertID::operator!=(const VertID& rhs) const
     {
         return true;
     }
-    assert(isShape == rhs.isShape);
+    COLA_ASSERT(isShape == rhs.isShape);
     return false;
 }
 
@@ -133,8 +137,8 @@ void VertID::db_print(void) const
 }
 
 
-const int VertID::src = 1;
-const int VertID::tar = 2;
+const unsigned short VertID::src = 1;
+const unsigned short VertID::tar = 2;
 
 
 ostream& operator<<(ostream& os, const VertID& vID)
@@ -144,25 +148,57 @@ ostream& operator<<(ostream& os, const VertID& vID)
 
 
 
-VertInf::VertInf(Router *router, const VertID& vid, const Point& vpoint)
-    : _router(router)
-    , id(vid)
-    , point(vpoint)
-    , lstPrev(NULL)
-    , lstNext(NULL)
-    , shPrev(NULL)
-    , shNext(NULL)
-    , visListSize(0)
-    , invisListSize(0)
-    , pathNext(NULL)
-    , pathDist(0)
+VertInf::VertInf(Router *router, const VertID& vid, const Point& vpoint, 
+        const bool addToRouter)
+    : _router(router),
+      id(vid),
+      point(vpoint),
+      lstPrev(NULL),
+      lstNext(NULL),
+      shPrev(NULL),
+      shNext(NULL),
+      visListSize(0),
+      orthogVisListSize(0),
+      invisListSize(0),
+      pathNext(NULL),
+      visDirections(ConnDirNone)
+{
+    point.id = vid.objID;
+    point.vn = vid.vn;
+
+    if (addToRouter)
+    {
+        _router->vertices.addVertex(this);
+    }
+}
+
+
+VertInf::~VertInf()
+{
+}
+
+
+void VertInf::Reset(const VertID& vid, const Point& vpoint)
 {
+    id = vid;
+    point = vpoint;
+    point.id = id.objID;
+    point.vn = id.vn;
 }
 
 
 void VertInf::Reset(const Point& vpoint)
 {
     point = vpoint;
+    point.id = id.objID;
+    point.vn = id.vn;
+}
+
+
+// Returns true if this vertex is not involved in any (in)visibility graphs.
+bool VertInf::orphaned(void)
+{
+    return (visList.empty() && invisList.empty() && orthogVisList.empty());
 }
 
 
@@ -170,15 +206,12 @@ void VertInf::removeFromGraph(const bool isConnVert)
 {
     if (isConnVert)
     {
-        assert(!(id.isShape));
+        COLA_ASSERT(!(id.isShape));
     }
 
-    VertInf *tmp = this;
-
     // For each vertex.
-    EdgeInfList& visList = tmp->visList;
-    EdgeInfList::iterator finish = visList.end();
-    EdgeInfList::iterator edge;
+    EdgeInfList::const_iterator finish = visList.end();
+    EdgeInfList::const_iterator edge;
     while ((edge = visList.begin()) != finish)
     {
         // Remove each visibility edge
@@ -186,7 +219,14 @@ void VertInf::removeFromGraph(const bool isConnVert)
         delete (*edge);
     }
 
-    EdgeInfList& invisList = tmp->invisList;
+    finish = orthogVisList.end();
+    while ((edge = orthogVisList.begin()) != finish)
+    {
+        // Remove each orthogonal visibility edge.
+        (*edge)->alertConns();
+        delete (*edge);
+    }
+
     finish = invisList.end();
     while ((edge = invisList.begin()) != finish)
     {
@@ -208,7 +248,7 @@ bool directVis(VertInf *src, VertInf *dst)
 
     // We better be part of the same instance of libavoid.
     Router *router = src->_router;
-    assert(router == dst->_router);
+    COLA_ASSERT(router == dst->_router);
 
     ContainsMap& contains = router->contains;
     if (!(pID.isShape))
@@ -239,40 +279,40 @@ bool directVis(VertInf *src, VertInf *dst)
 
 
 VertInfList::VertInfList()
-    : _firstShapeVert(NULL)
-    , _firstConnVert(NULL)
-    , _lastShapeVert(NULL)
-    , _lastConnVert(NULL)
-    , _shapeVertices(0)
-    , _connVertices(0)
+    : _firstShapeVert(NULL),
+      _firstConnVert(NULL),
+      _lastShapeVert(NULL),
+      _lastConnVert(NULL),
+      _shapeVertices(0),
+      _connVertices(0)
 {
 }
 
 
 #define checkVertInfListConditions() \
         do { \
-            assert((!_firstConnVert && (_connVertices == 0)) || \
+            COLA_ASSERT((!_firstConnVert && (_connVertices == 0)) || \
                     ((_firstConnVert->lstPrev == NULL) && (_connVertices > 0))); \
-            assert((!_firstShapeVert && (_shapeVertices == 0)) || \
+            COLA_ASSERT((!_firstShapeVert && (_shapeVertices == 0)) || \
                     ((_firstShapeVert->lstPrev == NULL) && (_shapeVertices > 0))); \
-            assert(!_lastShapeVert || (_lastShapeVert->lstNext == NULL)); \
-            assert(!_lastConnVert || (_lastConnVert->lstNext == _firstShapeVert)); \
-            assert((!_firstConnVert && !_lastConnVert) || \
+            COLA_ASSERT(!_lastShapeVert || (_lastShapeVert->lstNext == NULL)); \
+            COLA_ASSERT(!_lastConnVert || (_lastConnVert->lstNext == _firstShapeVert)); \
+            COLA_ASSERT((!_firstConnVert && !_lastConnVert) || \
                     (_firstConnVert &&  _lastConnVert) ); \
-            assert((!_firstShapeVert && !_lastShapeVert) || \
+            COLA_ASSERT((!_firstShapeVert && !_lastShapeVert) || \
                     (_firstShapeVert &&  _lastShapeVert) ); \
-            assert(!_firstShapeVert || _firstShapeVert->id.isShape); \
-            assert(!_lastShapeVert || _lastShapeVert->id.isShape); \
-            assert(!_firstConnVert || !(_firstConnVert->id.isShape)); \
-            assert(!_lastConnVert || !(_lastConnVert->id.isShape)); \
+            COLA_ASSERT(!_firstShapeVert || _firstShapeVert->id.isShape); \
+            COLA_ASSERT(!_lastShapeVert || _lastShapeVert->id.isShape); \
+            COLA_ASSERT(!_firstConnVert || !(_firstConnVert->id.isShape)); \
+            COLA_ASSERT(!_lastConnVert || !(_lastConnVert->id.isShape)); \
         } while(0)
 
 
 void VertInfList::addVertex(VertInf *vert)
 {
     checkVertInfListConditions();
-    assert(vert->lstPrev == NULL);
-    assert(vert->lstNext == NULL);
+    COLA_ASSERT(vert->lstPrev == NULL);
+    COLA_ASSERT(vert->lstNext == NULL);
 
     if (!(vert->id.isShape))
     {
@@ -329,10 +369,18 @@ void VertInfList::addVertex(VertInf *vert)
 }
 
 
-void VertInfList::removeVertex(VertInf *vert)
+// Removes a vertex from the list and returns a pointer to the vertex
+// following the removed one.
+VertInf *VertInfList::removeVertex(VertInf *vert)
 {
+    if (vert == NULL)
+    {
+        return NULL;
+    }
     // Conditions for correct data structure
     checkVertInfListConditions();
+    
+    VertInf *following = vert->lstNext;
 
     if (!(vert->id.isShape))
     {
@@ -421,6 +469,50 @@ void VertInfList::removeVertex(VertInf *vert)
     vert->lstNext = NULL;
 
     checkVertInfListConditions();
+
+    return following;
+}
+
+
+VertInf *VertInfList::getVertexByID(const VertID& id)
+{
+    VertID searchID = id;
+    if (searchID.vn == kUnassignedVertexNumber)
+    {
+        unsigned int topbit = ((unsigned int) 1) << 31;
+        if (searchID.objID & topbit)
+        {
+            searchID.objID = searchID.objID & ~topbit;
+            searchID.vn = VertID::src;
+        }
+        else
+        {
+            searchID.vn = VertID::tar;
+        }
+    }
+    VertInf *last = end();
+    for (VertInf *curr = connsBegin(); curr != last; curr = curr->lstNext)
+    {
+        if (curr->id == searchID)
+        {
+            return curr;
+        }
+    }
+    return NULL;
+}
+
+
+VertInf *VertInfList::getVertexByPos(const Point& p)
+{
+    VertInf *last = end();
+    for (VertInf *curr = shapesBegin(); curr != last; curr = curr->lstNext)
+    {
+        if (curr->point == p)
+        {
+            return curr;
+        }
+    }
+    return NULL;
 }
 
 
@@ -447,6 +539,18 @@ VertInf *VertInfList::end(void)
 }
 
 
+unsigned int VertInfList::connsSize(void) const
+{
+    return _connVertices;
+}
+
+
+unsigned int VertInfList::shapesSize(void) const
+{
+    return _shapeVertices;
+}
+
+
 }
 
 
index 1b0dcf3aa0331e04e99e5c4112815838254534b9..b07c87f95141632eceb0d42343899186fe0a8ce8 100644 (file)
@@ -2,24 +2,27 @@
  * vim: ts=4 sw=4 et tw=0 wm=0
  *
  * libavoid - Fast, Incremental, Object-avoiding Line Router
- * Copyright (C) 2004-2006  Michael Wybrow <mjwybrow@users.sourceforge.net>
+ *
+ * Copyright (C) 2004-2009  Monash University
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
+ * See the file LICENSE.LGPL distributed with the library.
+ *
+ * Licensees holding a valid commercial license may use this file in
+ * accordance with the commercial license agreement provided with the 
+ * library.
  *
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
  *
+ * Author(s):   Michael Wybrow <mjwybrow@users.sourceforge.net>
 */
 
+
 #ifndef AVOID_VERTICES_H
 #define AVOID_VERTICES_H
 
@@ -28,6 +31,7 @@
 #include <map>
 #include <iostream>
 #include <cstdio>
+
 #include "libavoid/geomtypes.h"
 
 namespace Avoid {
@@ -37,16 +41,18 @@ class Router;
 
 typedef std::list<EdgeInf *> EdgeInfList;
 
+typedef unsigned int ConnDirFlags;
+
 
 class VertID
 {
     public:
         unsigned int objID;
         bool isShape;
-        int vn;
+        unsigned short vn;
 
-        static const int src;
-        static const int tar;
+        static const unsigned short src;
+        static const unsigned short tar;
 
         VertID();
         VertID(unsigned int id, bool s, int n);
@@ -64,12 +70,23 @@ class VertID
 };
 
 
+// An ID given to all dummy vertices inserted to allow creation of the
+// orthogonal visibility graph since the vertices in the orthogonal graph 
+// mostly do not correspond to shape corners or connector endpoints.
+//
+static const VertID dummyOrthogID(0, true, 0);
+
+
 class VertInf
 {
     public:
-        VertInf(Router *router, const VertID& vid, const Point& vpoint);
+        VertInf(Router *router, const VertID& vid, const Point& vpoint,
+                const bool addToRouter = true);
+        ~VertInf();
+        void Reset(const VertID& vid, const Point& vpoint);
         void Reset(const Point& vpoint);
         void removeFromGraph(const bool isConnVert = true);
+        bool orphaned(void);
 
         Router *_router;
         VertID id;
@@ -80,28 +97,40 @@ class VertInf
         VertInf *shNext;
         EdgeInfList visList;
         unsigned int visListSize;
+        EdgeInfList orthogVisList;
+        unsigned int orthogVisListSize;
         EdgeInfList invisList;
         unsigned int invisListSize;
         VertInf *pathNext;
-        double pathDist;
+        ConnDirFlags visDirections;
 };
 
 
 bool directVis(VertInf *src, VertInf *dst);
 
 
+// A linked list of all the vertices in the router instance.  All the 
+// connector endpoints are listed first, then all the shape vertices.
+// Dunnny vertices inserted for orthogonal routing are classed as shape
+// vertices but have VertID(0, 0).
+//
 class VertInfList
 {
     public:
         VertInfList();
         void addVertex(VertInf *vert);
-        void removeVertex(VertInf *vert);
+        VertInf *removeVertex(VertInf *vert);
+        VertInf *getVertexByID(const VertID& id);
+        VertInf *getVertexByPos(const Point& p);
         VertInf *shapesBegin(void);
         VertInf *connsBegin(void);
         VertInf *end(void);
-        void stats(void)
+        unsigned int connsSize(void) const;
+        unsigned int shapesSize(void) const;
+        void stats(FILE *fp = stderr)
         {
-            printf("Conns %d, shapes %d\n", _connVertices, _shapeVertices);
+            fprintf(fp, "Conns %d, shapes %d\n", _connVertices, 
+                    _shapeVertices);
         }
     private:
         VertInf *_firstShapeVert;
index d2b0576435c365c4a7c798679b1c961b6869c0d8..089911f35e4ffb756d6f4544bec0fd31f8267d7a 100644 (file)
@@ -2,26 +2,39 @@
  * vim: ts=4 sw=4 et tw=0 wm=0
  *
  * libavoid - Fast, Incremental, Object-avoiding Line Router
- * Copyright (C) 2004-2006  Michael Wybrow <mjwybrow@users.sourceforge.net>
+ *
+ * Copyright (C) 2004-2009  Monash University
+ *
+ * --------------------------------------------------------------------
+ * The Visibility Sweep technique is based upon the method described
+ * in Section 5.2 of:
+ *     Lee, D.-T. (1978). Proximity and reachability in the plane.,
+ *     PhD thesis, Department of Electrical Engineering, 
+ *     University of Illinois, Urbana, IL.
+ * --------------------------------------------------------------------
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
+ * See the file LICENSE.LGPL distributed with the library.
+ *
+ * Licensees holding a valid commercial license may use this file in
+ * accordance with the commercial license agreement provided with the 
+ * library.
  *
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
  *
+ * Author(s):   Michael Wybrow <mjwybrow@users.sourceforge.net>
 */
 
+
 #include <algorithm>
 #include <cfloat>
+#define _USE_MATH_DEFINES
+#include <cmath>
 
 #include "libavoid/shape.h"
 #include "libavoid/debug.h"
@@ -30,8 +43,7 @@
 #include "libavoid/graph.h"
 #include "libavoid/geometry.h"
 #include "libavoid/router.h"
-
-#include <math.h>
+#include "libavoid/assertions.h"
 
 #ifdef LINEDEBUG
   #include "SDL_gfxPrimitives.h"
@@ -53,16 +65,7 @@ void shapeVis(ShapeRef *shape)
     VertInf *shapeBegin = shape->firstVert();
     VertInf *shapeEnd = shape->lastVert()->lstNext;
 
-    VertInf *pointsBegin = NULL;
-    if (router->IncludeEndpoints)
-    {
-        pointsBegin = router->vertices.connsBegin();
-    }
-    else
-    {
-        pointsBegin = router->vertices.shapesBegin();
-    }
-
+    VertInf *pointsBegin = router->vertices.connsBegin();
     for (VertInf *curr = shapeBegin; curr != shapeEnd; curr = curr->lstNext)
     {
         bool knownNew = true;
@@ -73,6 +76,11 @@ void shapeVis(ShapeRef *shape)
         db_printf("\tFirst Half:\n");
         for (VertInf *j = pointsBegin ; j != curr; j = j->lstNext)
         {
+            if (j->id == dummyOrthogID)
+            {
+                // Don't include orthogonal dummy vertices.
+                continue;
+            }
             EdgeInf::checkEdgeVisibility(curr, j, knownNew);
         }
 
@@ -80,6 +88,11 @@ void shapeVis(ShapeRef *shape)
         VertInf *pointsEnd = router->vertices.end();
         for (VertInf *k = shapeEnd; k != pointsEnd; k = k->lstNext)
         {
+            if (k->id == dummyOrthogID)
+            {
+                // Don't include orthogonal dummy vertices.
+                continue;
+            }
             EdgeInf::checkEdgeVisibility(curr, k, knownNew);
         }
     }
@@ -113,7 +126,7 @@ void vertexVisibility(VertInf *point, VertInf *partner, bool knownNew,
     const VertID& pID = point->id;
 
     // Make sure we're only doing ptVis for endpoints.
-    assert(!(pID.isShape));
+    COLA_ASSERT(!(pID.isShape));
 
     if ( !(router->InvisibilityGrph) )
     {
@@ -135,9 +148,14 @@ void vertexVisibility(VertInf *point, VertInf *partner, bool knownNew,
         for (VertInf *k = router->vertices.shapesBegin(); k != shapesEnd;
                 k = k->lstNext)
         {
+            if (k->id == dummyOrthogID)
+            {
+                // Don't include orthogonal dummy vertices.
+                continue;
+            }
             EdgeInf::checkEdgeVisibility(point, k, knownNew);
         }
-        if (router->IncludeEndpoints && partner)
+        if (partner)
         {
             EdgeInf::checkEdgeVisibility(point, partner, knownNew);
         }
@@ -152,7 +170,6 @@ void vertexVisibility(VertInf *point, VertInf *partner, bool knownNew,
 static VertInf *centerInf;
 static Point centerPoint;
 static VertID centerID;
-static double centerAngle;
 
 
 class PointPair
@@ -165,19 +182,44 @@ class PointPair
             double y = vInf->point.y - centerPoint.y;
 
             angle = pos_to_angle(x, y);
+            distance = euclideanDist(centerPoint, vInf->point);
         }
-        bool operator==(const PointPair& rhs) const
+        bool operator<(const PointPair& rhs) const
         {
-            if (vInf->id == rhs.vInf->id)
+            // Firstly order by angle.
+            if (angle == rhs.angle)
             {
-                return true;
+                // If the points are collinear, then order them in increasing
+                // distance from the point we are sweeping around.
+                if (distance == rhs.distance)
+                {
+                    // XXX: Add this assertion back if we require that 
+                    //      connector endpoints have unique IDs. For the 
+                    //      moment it is okay for them to have the same ID.
+                    //COLA_ASSERT(vInf->id != rhs.vInf->id);
+                    
+                    // If comparing two points at the same physical 
+                    // position, then order them by their VertIDs.
+                    return vInf->id < rhs.vInf->id;
+                }
+                return distance < rhs.distance;
             }
-            return false;
+            return angle < rhs.angle;
         }
         static double pos_to_angle(double x, double y)
         {
+            if (y == 0)
+            {
+                return ((x < 0) ? 180 : 0);
+            }
+            else if (x == 0)
+            {
+                return ((y < 0) ? 270 : 90);
+            }
+            
             double ang = atan(y / x);
             ang = (ang * 180) / M_PI;
+
             if (x < 0)
             {
                 ang += 180;
@@ -186,36 +228,48 @@ class PointPair
             {
                 ang += 360;
             }
+            COLA_ASSERT(ang >= 0);
+            COLA_ASSERT(ang <= 360);
             return ang;
         }
 
         VertInf    *vInf;
         double     angle;
+        double     distance;
 };
 
 
-typedef std::list<PointPair > VertList;
+typedef std::set<PointPair > VertSet;
 
 
 class EdgePair
 {
     public:
-        EdgePair(VertInf *v1, VertInf *v2, double d, double a)
-            : vInf1(v1), vInf2(v2), initdist(d), initangle(a)
+        EdgePair() :
+            vInf1(NULL), vInf2(NULL), dist1(0.0), dist2(0.0), angle(0.0),
+            angleDist(0.0)
+        {
+            // The default constuctor should never be called.  
+            // This is defined to appease the MSVC compiler.
+            COLA_ASSERT(false);
+        }
+        EdgePair(const PointPair& p1, VertInf *v) : 
+                vInf1(p1.vInf), 
+                vInf2(v),
+                dist1(p1.distance),
+                dist2(euclideanDist(vInf2->point, centerPoint)),
+                angle(p1.angle),
+                angleDist(p1.distance)
         {
-            currdist  = initdist;
-            currangle = initangle;
         }
         bool operator<(const EdgePair& rhs) const
         {
-            if (initdist == rhs.initdist)
+            COLA_ASSERT(angle == rhs.angle);
+            if (angleDist == rhs.angleDist)
             {
-                // TODO: This is a bit of a hack, should be
-                //       set by the call to the constructor.
-                return dist(centerPoint, vInf2->point) <
-                        dist(centerPoint, rhs.vInf2->point);
+                return (dist2 < rhs.dist2);
             }
-            return (initdist < rhs.initdist);
+            return (angleDist < rhs.angleDist);
         }
         bool operator==(const EdgePair& rhs) const
         {
@@ -239,37 +293,53 @@ class EdgePair
             }
             return true;
         }
-        void SetObsAng(double a)
+        void setNegativeAngle(void)
         {
-            obsAngle = fmod(initangle - (a - 180), 360);
+            angle = -1.0;
+        }
+        double setCurrAngle(const PointPair& p)
+        {
+            if (p.vInf->point == vInf1->point)
+            {
+                angleDist = dist1;
+                angle = p.angle;
+            }
+            else if (p.vInf->point == vInf2->point)
+            {
+                angleDist = dist2;
+                angle = p.angle;
+            }
+            else if (p.angle != angle)
+            {
+                COLA_ASSERT(p.angle > angle);
+                angle = p.angle;
+                Point pp;
+                int result = rayIntersectPoint(vInf1->point, vInf2->point,
+                        centerPoint, p.vInf->point, &(pp.x), &(pp.y));
+                if (result != DO_INTERSECT) 
+                {
+                    // This can happen with points that appear to have the
+                    // same angle but at are at slightly different positions
+                    angleDist = std::min(dist1, dist2);
+                }
+                else
+                {
+                    angleDist = euclideanDist(pp, centerPoint);
+                }
+            }
 
-            //db_printf("SetObsAng: %.2f  (from init %.2f, a %.2f)\n",
-            //      obsAngle, initangle, a);
+            return angleDist;
         }
 
         VertInf *vInf1;
         VertInf *vInf2;
-        double  initdist;
-        double  initangle;
-        double  currdist;
-        double  currangle;
-        double  obsAngle;
+        double dist1;
+        double dist2;
+        double angle;
+        double angleDist;
 };
 
-typedef std::set<EdgePair> EdgeSet;
-
-
-static bool ppCompare(PointPair& pp1, PointPair& pp2)
-{
-    if (pp1.angle == pp2.angle)
-    {
-        // If the points are colinear, then order them in increasing
-        // distance from the point we are sweeping around.
-        return dist(centerPoint, pp1.vInf->point) <
-                dist(centerPoint, pp2.vInf->point);
-    }
-    return pp1.angle < pp2.angle;
-}
+typedef std::list<EdgePair> SweepEdgeList;
 
 
 #define AHEAD    1
@@ -278,11 +348,11 @@ static bool ppCompare(PointPair& pp1, PointPair& pp2)
 class isBoundingShape
 {
     public:
-        // constructor remembers the value provided
-        isBoundingShape(ShapeSet& set)
-        : ss(set)
+        // Class instance remembers the ShapeSet.
+        isBoundingShape(ShapeSet& set) : 
+            ss(set)
         { }
-        // the following is an overloading of the function call operator
+        // The following is an overloading of the function call operator.
         bool operator () (const PointPair& pp)
         {
             if (pp.vInf->id.isShape &&
@@ -293,58 +363,111 @@ class isBoundingShape
             return false;
         }
     private:
+        // MSVC wants to generate the assignment operator and the default 
+        // constructor, but fails.  Therefore we declare them private and 
+        // don't implement them.
+        isBoundingShape & operator=(isBoundingShape const &);
+        isBoundingShape();
+
         ShapeSet& ss;
 };
 
 
-static bool sweepVisible(EdgeSet& T, VertInf *currInf, VertInf *lastInf,
-        bool lastVisible, double lastAngle, int *blocker)
+static bool sweepVisible(SweepEdgeList& T, const PointPair& point, 
+        std::set<unsigned int>& onBorderIDs, int *blocker)
 {
+    if (T.empty())
+    {
+        // No blocking edges.
+        return true;
+    }
 
-    if (!lastInf || (lastAngle != centerAngle))
+    Router *router = point.vInf->_router;
+    bool visible = true;
+
+    SweepEdgeList::const_iterator closestIt = T.begin();
+    SweepEdgeList::const_iterator end = T.end();
+    while (closestIt != end)
     {
-        // Nothing before it on the current ray
-        EdgeSet::iterator closestIt = T.begin();
-        if (closestIt != T.end())
+        if ((point.vInf->point == closestIt->vInf1->point) ||
+                (point.vInf->point == closestIt->vInf2->point))
         {
+            // If the ray intersects just the endpoint of a 
+            // blocking edge then ignore that edge.
+            ++closestIt;
+            continue;
+        }
+        break;
+    }
+    if (closestIt == end)
+    {
+        return true;
+    }
 
-            Point &e1 = (*closestIt).vInf1->point;
-            Point &e2 = (*closestIt).vInf2->point;
-
-            if (segmentIntersect(centerInf->point, currInf->point, e1, e2))
+    if (! point.vInf->id.isShape )
+    {
+        // It's a connector endpoint, so we have to ignore 
+        // edges of containing shapes for determining visibility.
+        ShapeSet& rss = router->contains[point.vInf->id];
+        while (closestIt != end)
+        {
+            if (rss.find(closestIt->vInf1->id.objID) == rss.end())
             {
-                *blocker = (*closestIt).vInf1->id.objID;
-                return false;
+                // This is not a containing edge so do the normal 
+                // test and then stop.
+                if (point.distance > closestIt->angleDist)
+                {
+                    visible = false;
+                }
+                else if ((point.distance == closestIt->angleDist) && 
+                        onBorderIDs.find(closestIt->vInf1->id.objID) != 
+                                onBorderIDs.end())
+                {
+                    // Touching, but centerPoint is on another edge of
+                    // shape shape, so count as blocking.
+                    visible = false;
+                }
+                break;
             }
+            // This was a containing edge, so consider the next along.
+            ++closestIt;
         }
     }
     else
     {
-        // There was another point before this on the ray (lastInf)
-        if (!lastVisible)
+        // Just test to see if this point is closer than the closest 
+        // edge blocking this ray.
+        if (point.distance > closestIt->angleDist)
         {
-            *blocker = -1;
-            return false;
+            visible =  false;
         }
-        else
+        else if ((point.distance == closestIt->angleDist) && 
+                onBorderIDs.find(closestIt->vInf1->id.objID) != 
+                        onBorderIDs.end())
         {
-            // Check if there is an edge in T that blocks the ray
-            // between lastInf and currInf.
-            EdgeSet::iterator tfin = T.end();
-            for (EdgeSet::iterator l = T.begin(); l != tfin; ++l)
-            {
-                Point &e1 = (*l).vInf1->point;
-                Point &e2 = (*l).vInf2->point;
+            // Touching, but centerPoint is on another edge of
+            // shape shape, so count as blocking.
+            visible = false;
+        }
+    }
 
-                if (segmentIntersect(lastInf->point, currInf->point, e1, e2))
-                {
-                    *blocker = (*l).vInf1->id.objID;
-                    return false;
-                }
-            }
+    if (!visible)
+    {
+        *blocker = (*closestIt).vInf1->id.objID;
+#ifdef LINEDEBUG
+        Point &e1 = (*closestIt).vInf1->point;
+        Point &e2 = (*closestIt).vInf2->point;
+
+        if (router->avoid_screen)
+        {
+            int canx = 151;
+            int cany = 55;
+            lineRGBA(router->avoid_screen, e1.x + canx, e1.y + cany,
+                    e2.x + canx, e2.y + cany, 0, 0, 225, 255);
         }
+#endif
     }
-    return true;
+    return visible;
 }
 
 
@@ -358,120 +481,128 @@ void vertexSweep(VertInf *vert)
     centerID = pID;
     centerPoint = pPoint;
     Point centerPt = pPoint;
-    centerAngle = -1;
 
     // List of shape (and maybe endpt) vertices, except p
     // Sort list, around
-    VertList v;
+    VertSet v;
 
     // Initialise the vertex list
+    ShapeSet& ss = router->contains[centerID];
     VertInf *beginVert = router->vertices.connsBegin();
     VertInf *endVert = router->vertices.end();
     for (VertInf *inf = beginVert; inf != endVert; inf = inf->lstNext)
     {
-        if (inf->id == centerID)
+        if (inf == centerInf)
+        {
+            // Don't include the center point itself.
+            continue;
+        }
+        else if (inf->id == dummyOrthogID)
         {
-            // Don't include the center point
+            // Don't include orthogonal dummy vertices.
+            continue;
+        }
+
+        if (!(centerID.isShape) && (ss.find(inf->id.objID) != ss.end()))
+        {
+            // Don't include edge points of containing shapes.
+            unsigned int shapeID = inf->id.objID;
+            db_printf("Center is inside shape %u so ignore shape edges.\n",
+                    shapeID);
             continue;
         }
 
         if (inf->id.isShape)
         {
-            // Add shape vertex
-            v.push_back(inf);
+            // Add shape vertex.
+            v.insert(inf);
         }
         else
         {
-            if (router->IncludeEndpoints)
+            // Add connector endpoint.
+            if (centerID.isShape)
             {
-                if (centerID.isShape)
-                {
-                    // Add endpoint vertex
-                    v.push_back(inf);
-                }
-                else
+                // Center is a shape vertex, so add all endpoint vertices.
+                v.insert(inf);
+            }
+            else
+            {
+                // Center is an endpoint, so only include the other
+                // endpoint from the matching connector.
+                VertID partnerID = VertID(centerID.objID, false,
+                        (centerID.vn == 1) ? 2 : 1);
+                if (inf->id == partnerID)
                 {
-                    // Center is an endpoint, so only include the other
-                    // endpoint from the matching connector.
-                    VertID partnerID = VertID(centerID.objID, false,
-                            (centerID.vn == 1) ? 2 : 1);
-                    if (inf->id == partnerID)
-                    {
-                        v.push_back(inf);
-                    }
+                    v.insert(inf);
                 }
             }
         }
     }
-    // TODO: This should be done with a sorted data type and insertion sort.
-    v.sort(ppCompare);
-
-    EdgeSet e;
-    ShapeSet& ss = router->contains[centerID];
+    std::set<unsigned int> onBorderIDs;
 
-    // And edge to T that intersect the initial ray.
-    VertInf *last = router->vertices.end();
-    for (VertInf *k = router->vertices.shapesBegin(); k != last; )
+    // Add edges to T that intersect the initial ray.
+    SweepEdgeList e;
+    VertSet::const_iterator vbegin = v.begin();
+    VertSet::const_iterator vend = v.end();
+    for (VertSet::const_iterator t = vbegin; t != vend; ++t)
     {
-        VertID kID = k->id;
-        if (!(centerID.isShape) && (ss.find(kID.objID) != ss.end()))
-        {
-            unsigned int shapeID = kID.objID;
-            db_printf("Center is inside shape %u so ignore shape edges.\n",
-                    shapeID);
-            // One of the endpoints is inside this shape so ignore it.
-            while ((k != last) && (k->id.objID == shapeID))
-            {
-                // And skip the other vertices from this shape.
-                k = k->lstNext;
-            }
-            continue;
-        }
+        VertInf *k = t->vInf;
 
-        VertInf *kPrev = k->shPrev;
-        if ((centerInf == k) || (centerInf == kPrev))
-        {
-            k = k->lstNext;
-            continue;
-        }
+        COLA_ASSERT(centerInf != k);
+        COLA_ASSERT(centerID.isShape || (ss.find(k->id.objID) == ss.end()));
 
         Point xaxis(DBL_MAX, centerInf->point.y);
 
-        if (segmentIntersect(centerInf->point, xaxis, kPrev->point, k->point))
+        VertInf *kPrev = k->shPrev;
+        VertInf *kNext = k->shNext;
+        if (kPrev && (kPrev != centerInf) && 
+                (vecDir(centerInf->point, xaxis, kPrev->point) == AHEAD))
         {
-            double distance;
-            if (vecDir(centerInf->point, xaxis, kPrev->point) == BEHIND)
+            if (segmentIntersect(centerInf->point, xaxis, kPrev->point, 
+                        k->point))
             {
-                distance = dist(centerInf->point, kPrev->point);
+                EdgePair intPair = EdgePair(*t, kPrev);
+                e.push_back(intPair);
             }
-            else
+            if ((vecDir(kPrev->point, k->point, centerInf->point) == 0) &&
+                    inBetween(kPrev->point, k->point, centerInf->point))
             {
-                distance = dist(centerInf->point, k->point);
+                // Record that centerPoint is on an obstacle line.
+                onBorderIDs.insert(k->id.objID);
+            }
+        }
+        else if (kNext && (kNext != centerInf) && 
+                (vecDir(centerInf->point, xaxis, kNext->point) == AHEAD))
+        {
+            if (segmentIntersect(centerInf->point, xaxis, kNext->point, 
+                        k->point))
+            {
+                EdgePair intPair = EdgePair(*t, kNext);
+                e.push_back(intPair);
+            }
+            if ((vecDir(kNext->point, k->point, centerInf->point) == 0) &&
+                    inBetween(kNext->point, k->point, centerInf->point))
+            {
+                // Record that centerPoint is on an obstacle line.
+                onBorderIDs.insert(k->id.objID);
             }
-
-            EdgePair intPair = EdgePair(k, kPrev, distance, 0.0);
-            e.insert(intPair).first;
         }
-        k = k->lstNext;
     }
+    for (SweepEdgeList::iterator c = e.begin(); c != e.end(); ++c)
+    {
+        (*c).setNegativeAngle();
+    }
+
 
     // Start the actual sweep.
     db_printf("SWEEP: "); centerID.db_print(); db_printf("\n");
 
-    VertInf *lastInf     = NULL;
-    double   lastAngle   = 0;
-    bool     lastVisible = false;
-    int      lastBlocker = 0;
-
-    isBoundingShape isBounding(router->contains[centerID]);
-    VertList::iterator vfst = v.begin();
-    VertList::iterator vfin = v.end();
-    for (VertList::iterator t = vfst; t != vfin; ++t)
+    isBoundingShape isBounding(ss);
+    for (VertSet::const_iterator t = vbegin; t != vend; ++t)
     {
         VertInf *currInf = (*t).vInf;
         VertID& currID = currInf->id;
         Point&  currPt = currInf->point;
-        centerAngle = (*t).angle;
 
 #ifdef LINEDEBUG
         Sint16 ppx = (int) centerPt.x;
@@ -479,29 +610,28 @@ void vertexSweep(VertInf *vert)
 
         Sint16 cx = (int) currPt.x;
         Sint16 cy = (int) currPt.y;
+
+        int canx = 151;
+        int cany = 55;
 #endif
 
-        double currDist = dist(centerPt, currPt);
-        db_printf("Dist: %.1f.\n", currDist);
+        const double& currDist = (*t).distance;
 
         EdgeInf *edge = EdgeInf::existingEdge(centerInf, currInf);
         if (edge == NULL)
         {
             edge = new EdgeInf(centerInf, currInf);
         }
-        // Ignore vertices from bounding shapes, if sweeping round an endpoint.
-        if (!(centerID.isShape) && isBounding(*t))
+
+        for (SweepEdgeList::iterator c = e.begin(); c != e.end(); ++c)
         {
-            if (router->InvisibilityGrph)
-            {
-                // if p and t can't see each other, add blank edge
-                db_printf("\tSkipping visibility edge... \n\t\t");
-                edge->addBlocker(currInf->id.objID);
-                edge->db_print();
-            }
-            continue;
+            (*c).setCurrAngle(*t);
         }
+        e.sort();
 
+        // Check visibility.
+        int blocker = 0;
+        bool currVisible = sweepVisible(e, *t, onBorderIDs, &blocker);
 
         bool cone1 = true, cone2 = true;
         if (centerID.isShape)
@@ -519,7 +649,6 @@ void vertexSweep(VertInf *vert)
 
         if (!cone1 || !cone2)
         {
-            lastInf = NULL;
             if (router->InvisibilityGrph)
             {
                 db_printf("\tSetting invisibility edge... \n\t\t");
@@ -529,18 +658,15 @@ void vertexSweep(VertInf *vert)
         }
         else
         {
-            int blocker = 0;
-            // Check visibility.
-            bool currVisible = sweepVisible(e, currInf,
-                    lastInf, lastVisible, lastAngle, &blocker);
-            if (blocker == -1)
-            {
-                blocker = lastBlocker;
-            }
             if (currVisible)
             {
 #ifdef LINEDEBUG
-                lineRGBA(avoid_screen, ppx, ppy, cx, cy, 255, 0, 0, 32);
+                if (router->avoid_screen)
+                {
+                    lineRGBA(router->avoid_screen, ppx + canx, ppy + cany,
+                            cx + canx, cy + cany, 255, 0, 0, 75);
+                    SDL_Delay(1000);
+                }
 #endif
                 db_printf("\tSetting visibility edge... \n\t\t");
                 edge->setDist(currDist);
@@ -552,72 +678,55 @@ void vertexSweep(VertInf *vert)
                 edge->addBlocker(blocker);
                 edge->db_print();
             }
-
-            lastVisible = currVisible;
-            lastInf     = currInf;
-            lastAngle   = centerAngle;
-            lastBlocker = blocker;
+        }
+        
+        if (!(edge->added()) && !(router->InvisibilityGrph))
+        {
+            delete edge;
+            edge = NULL;
         }
 
         if (currID.isShape)
         {
             // This is a shape edge
-            Point& prevPt = currInf->shPrev->point;
-            Point& nextPt = currInf->shNext->point;
-
-            int prevDir = vecDir(centerPt, currPt, prevPt);
-            EdgePair prevPair = EdgePair(currInf, currInf->shPrev,
-                    currDist, centerAngle);
 
-            EdgeSet::iterator ePtr;
-            if (prevDir == BEHIND)
+            if (currInf->shPrev != centerInf)
             {
-                // XXX: Strangely e.find does not return the correct results.
-                // ePtr = e.find(prevPair);
-                ePtr = std::find(e.begin(), e.end(), prevPair);
-                if (ePtr != e.end())
+                Point& prevPt = currInf->shPrev->point;
+                int prevDir = vecDir(centerPt, currPt, prevPt);
+                EdgePair prevPair = EdgePair(*t, currInf->shPrev);
+
+                if (prevDir == BEHIND)
                 {
-                    e.erase(ePtr);
+                    e.remove(prevPair);
                 }
-            }
-            else if ((prevDir == AHEAD) && (currInf->shPrev != centerInf))
-            {
-                double x = prevPt.x - currPt.x;
-                double y = prevPt.y - currPt.y;
-                double angle = PointPair::pos_to_angle(x, y);
-                prevPair.SetObsAng(angle);
-
-                ePtr = e.insert(prevPair).first;
-            }
-
-
-            int nextDir = vecDir(centerPt, currPt, nextPt);
-            EdgePair nextPair = EdgePair(currInf, currInf->shNext,
-                    currDist, centerAngle);
-
-            if (nextDir == BEHIND)
-            {
-                // XXX: Strangely e.find does not return the correct results.
-                // ePtr = e.find(nextPair);
-                ePtr = std::find(e.begin(), e.end(), nextPair);
-                if (ePtr != e.end())
+                else if (prevDir == AHEAD)
                 {
-                    e.erase(ePtr);
+                    e.push_front(prevPair);
                 }
             }
-            else if ((nextDir == AHEAD) && (currInf->shNext != centerInf))
+
+            if (currInf->shNext != centerInf)
             {
-                double x = nextPt.x - currPt.x;
-                double y = nextPt.y - currPt.y;
-                double angle = PointPair::pos_to_angle(x, y);
-                nextPair.SetObsAng(angle);
+                Point& nextPt = currInf->shNext->point;
+                int nextDir = vecDir(centerPt, currPt, nextPt);
+                EdgePair nextPair = EdgePair(*t, currInf->shNext);
 
-                ePtr = e.insert(nextPair).first;
+                if (nextDir == BEHIND)
+                {
+                    e.remove(nextPair);
+                }
+                else if (nextDir == AHEAD)
+                {
+                    e.push_front(nextPair);
+                }
             }
         }
-
 #ifdef LINEDEBUG
-        SDL_Flip(avoid_screen);
+        if (router->avoid_screen)
+        {
+            SDL_Flip(router->avoid_screen);
+        }
 #endif
     }
 }
index dd68ac692a38616e19d5445b7a1abc2bef89351b..92e56d922ea6be953a992ce6a1aafcb227e088b8 100644 (file)
@@ -2,24 +2,27 @@
  * vim: ts=4 sw=4 et tw=0 wm=0
  *
  * libavoid - Fast, Incremental, Object-avoiding Line Router
- * Copyright (C) 2004-2006  Michael Wybrow <mjwybrow@users.sourceforge.net>
+ *
+ * Copyright (C) 2004-2008  Monash University
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
+ * See the file LICENSE.LGPL distributed with the library.
+ *
+ * Licensees holding a valid commercial license may use this file in
+ * accordance with the commercial license agreement provided with the 
+ * library.
  *
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
  *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- * 
+ * Author(s):   Michael Wybrow <mjwybrow@users.sourceforge.net>
 */
 
+
 #ifndef AVOID_VISIBILITY_H
 #define AVOID_VISIBILITY_H
 
@@ -28,7 +31,9 @@
 
 namespace Avoid {
 
-    
+class ShapeRef;
+class VertInf;
+
 extern void vertexVisibility(VertInf *point, VertInf *partner, bool knownNew,
             const bool gen_contains = false);
 extern void vertexSweep(VertInf *point);
index 4dc0230ff71c27ff4c7293f7e223dd351b09392f..98b2aec26dc23eaf1125a5c04f601746ea35da9f 100644 (file)
@@ -12,6 +12,8 @@
 
 #include <cstring>
 #include <string>
+#include <iostream>
+#include <glibmm/stringutils.h>
 
 #include "attributes.h"
 #include "sp-conn-end.h"
 
 
 SPConnEndPair::SPConnEndPair(SPPath *const owner)
-    : _invalid_path_connection()
-    , _path(owner)
+    : _path(owner)
     , _connRef(NULL)
     , _connType(SP_CONNECTOR_NOAVOID)
+    , _connCurvature(0.0)
     , _transformed_connection()
 {
     for (unsigned handle_ix = 0; handle_ix <= 1; ++handle_ix) {
@@ -47,14 +49,6 @@ SPConnEndPair::~SPConnEndPair()
         delete this->_connEnd[handle_ix];
         this->_connEnd[handle_ix] = NULL;
     }
-    if (_connRef) {
-        _connRef->removeFromGraph();
-        delete _connRef;
-        _connRef = NULL;
-    }
-
-    _invalid_path_connection.disconnect();
-    _transformed_connection.disconnect();
 }
 
 void
@@ -68,6 +62,18 @@ SPConnEndPair::release()
         this->_connEnd[handle_ix]->href = NULL;
         this->_connEnd[handle_ix]->ref.detach();
     }
+
+    // If the document is being destroyed then the router instance 
+    // and the ConnRefs will have been destroyed with it.
+    const bool routerInstanceExists = (_path->document->router != NULL);
+
+    if (_connRef && routerInstanceExists) {
+        _connRef->removeFromGraph();
+        delete _connRef;
+    }
+    _connRef = NULL;
+
+    _transformed_connection.disconnect();
 }
 
 void
@@ -76,16 +82,17 @@ sp_conn_end_pair_build(SPObject *object)
     sp_object_read_attr(object, "inkscape:connector-type");
     sp_object_read_attr(object, "inkscape:connection-start");
     sp_object_read_attr(object, "inkscape:connection-end");
+    sp_object_read_attr(object, "inkscape:connector-curvature");
 }
 
 
 static void
-avoid_conn_move(Geom::Matrix const */*mp*/, SPItem *moved_item)
+avoid_conn_transformed(Geom::Matrix const */*mp*/, SPItem *moved_item)
 {
-    // Reroute connector
     SPPath *path = SP_PATH(moved_item);
-    path->connEndPair.makePathInvalid();
-    sp_conn_adjust_invalid_path(path);
+    if (path->connEndPair.isAutoRoutingConn()) {
+        path->connEndPair.tellLibavoidNewEndpoints();
+    }
 }
 
 
@@ -93,16 +100,40 @@ void
 SPConnEndPair::setAttr(unsigned const key, gchar const *const value)
 {
     if (key == SP_ATTR_CONNECTOR_TYPE) {
-        if (value && (strcmp(value, "polyline") == 0)) {
-            _connType = SP_CONNECTOR_POLYLINE;
-
-            Avoid::Router *router = _path->document->router;
-            GQuark itemID = g_quark_from_string(SP_OBJECT(_path)->id);
-            _connRef = new Avoid::ConnRef(router, itemID);
-            _invalid_path_connection = connectInvalidPath(
-                    sigc::ptr_fun(&sp_conn_adjust_invalid_path));
-            _transformed_connection = _path->connectTransformed(
-                    sigc::ptr_fun(&avoid_conn_move));
+        if (value && (strcmp(value, "polyline") == 0 || strcmp(value, "orthogonal") == 0)) {
+            int newconnType = strcmp(value, "polyline") ? SP_CONNECTOR_ORTHOGONAL : SP_CONNECTOR_POLYLINE;
+            
+            if (!_connRef)
+            {
+                _connType = newconnType;
+                Avoid::Router *router = _path->document->router;
+                GQuark itemID = g_quark_from_string(SP_OBJECT(_path)->id);
+                _connRef = new Avoid::ConnRef(router, itemID);
+                switch (newconnType)
+                {
+                    case SP_CONNECTOR_POLYLINE:
+                        _connRef->setRoutingType(Avoid::ConnType_PolyLine);
+                        break;
+                    case SP_CONNECTOR_ORTHOGONAL:
+                        _connRef->setRoutingType(Avoid::ConnType_Orthogonal);
+                }
+                _transformed_connection = _path->connectTransformed(
+                        sigc::ptr_fun(&avoid_conn_transformed));
+            }
+            else
+                if (newconnType != _connType)
+                {
+                    _connType = newconnType;
+                    switch (newconnType)
+                    {
+                        case SP_CONNECTOR_POLYLINE:
+                            _connRef->setRoutingType(Avoid::ConnType_PolyLine);
+                            break;
+                        case SP_CONNECTOR_ORTHOGONAL:
+                            _connRef->setRoutingType(Avoid::ConnType_Orthogonal);
+                    }
+                    sp_conn_reroute_path(_path);
+                }
         }
         else {
             _connType = SP_CONNECTOR_NOAVOID;
@@ -111,17 +142,25 @@ SPConnEndPair::setAttr(unsigned const key, gchar const *const value)
                 _connRef->removeFromGraph();
                 delete _connRef;
                 _connRef = NULL;
-                _invalid_path_connection.disconnect();
                 _transformed_connection.disconnect();
             }
         }
         return;
-
+    }
+    else if (key == SP_ATTR_CONNECTOR_CURVATURE) {
+        if (value) {
+            _connCurvature = g_strtod(value, NULL);
+            if (_connRef && _connRef->isInitialised()) {
+                // Redraw the connector, but only if it has been initialised.
+                sp_conn_reroute_path(_path);
+            }
+        }
+        return;
     }
 
     unsigned const handle_ix = key - SP_ATTR_CONNECTION_START;
     g_assert( handle_ix <= 1 );
-    this->_connEnd[handle_ix]->setAttacherHref(value);
+    this->_connEnd[handle_ix]->setAttacherHref(value, _path);
 }
 
 void
@@ -131,11 +170,18 @@ SPConnEndPair::writeRepr(Inkscape::XML::Node *const repr) const
         if (this->_connEnd[handle_ix]->ref.getURI()) {
             char const * const attr_strs[] = {"inkscape:connection-start",
                                               "inkscape:connection-end"};
-            gchar *uri_string = this->_connEnd[handle_ix]->ref.getURI()->toString();
-            repr->setAttribute(attr_strs[handle_ix], uri_string);
-            g_free(uri_string);
+            std::ostringstream ostr;
+            ostr<<this->_connEnd[handle_ix]->ref.getURI()->toString()<<"_"<<
+                  (this->_connEnd[handle_ix]->type == ConnPointDefault ? "d":"u") <<
+                  "_" << this->_connEnd[handle_ix]->id;
+            
+            
+            repr->setAttribute(attr_strs[handle_ix], ostr.str().c_str());
         }
     }
+    repr->setAttribute("inkscape:connector-curvature", Glib::Ascii::dtostr(_connCurvature).c_str());
+    if (_connType == SP_CONNECTOR_POLYLINE || _connType == SP_CONNECTOR_ORTHOGONAL)
+        repr->setAttribute("inkscape:connector-type", _connType == SP_CONNECTOR_POLYLINE ? "polyline" : "orthogonal" );
 }
 
 void
@@ -161,19 +207,14 @@ SPConnEndPair::getAttachedItems(SPItem *h2attItem[2]) const {
 
 void
 SPConnEndPair::getEndpoints(Geom::Point endPts[]) const {
-    SPCurve *curve = _path->curve;
+    SPCurve *curve = _path->original_curve ? _path->original_curve : _path->curve;
     SPItem *h2attItem[2];
     getAttachedItems(h2attItem);
 
     for (unsigned h = 0; h < 2; ++h) {
         if ( h2attItem[h] ) {
-            Geom::OptRect bbox = h2attItem[h]->getBounds(sp_item_i2doc_affine(h2attItem[h]));
-            if (bbox) {
-                endPts[h] = bbox->midpoint();
-            } else {
-                // FIXME
-                endPts[h] = Geom::Point(0, 0);
-            }
+            g_assert(h2attItem[h]->avoidRef);
+            endPts[h] = h2attItem[h]->avoidRef->getConnectionPointPos(_connEnd[h]->type, _connEnd[h]->id);
         }
         else
         {
@@ -187,37 +228,40 @@ SPConnEndPair::getEndpoints(Geom::Point endPts[]) const {
     }
 }
 
-sigc::connection
-SPConnEndPair::connectInvalidPath(sigc::slot<void, SPPath *> slot)
-{
-    return _invalid_path_signal.connect(slot);
+gdouble
+SPConnEndPair::getCurvature(void) const {
+    return _connCurvature;
 }
 
-static void emitPathInvalidationNotification(void *ptr)
+SPConnEnd**
+SPConnEndPair::getConnEnds(void)
 {
-    // We emit a signal here rather than just calling the reroute function
-    // since this allows all the movement action computation to happen,
-    // then all connectors (that require it) will be rerouted.  Otherwise,
-    // one connector could get rerouted several times as a result of
-    // dragging a couple of shapes.
+    return _connEnd;
+}
 
-    SPPath *path = SP_PATH(ptr);
-    path->connEndPair._invalid_path_signal.emit(path);
+bool
+SPConnEndPair::isOrthogonal(void) const {
+    return _connType == SP_CONNECTOR_ORTHOGONAL;
 }
 
-void
-SPConnEndPair::rerouteFromManipulation(void)
+
+static void redrawConnectorCallback(void *ptr)
 {
-    _connRef->makePathInvalid();
-    sp_conn_adjust_path(_path);
+    SPPath *path = SP_PATH(ptr);
+    if (path->document == NULL) {
+        // This can happen when the document is being destroyed.
+        return;
+    }
+    sp_conn_redraw_path(path);
 }
 
 void
-SPConnEndPair::reroute(void)
+SPConnEndPair::rerouteFromManipulation(void)
 {
-    sp_conn_adjust_path(_path);
+    sp_conn_reroute_path_immediate(_path);
 }
 
+
 // Called from sp_path_update to initialise the endpoints.
 void
 SPConnEndPair::update(void)
@@ -231,8 +275,8 @@ SPConnEndPair::update(void)
             Avoid::Point src(endPt[0][Geom::X], endPt[0][Geom::Y]);
             Avoid::Point dst(endPt[1][Geom::X], endPt[1][Geom::Y]);
 
-            _connRef->lateSetup(src, dst);
-            _connRef->setCallback(&emitPathInvalidationNotification, _path);
+            _connRef->setEndpoints(src, dst);
+            _connRef->setCallback(&redrawConnectorCallback, _path);
         }
         // Store the ID of the objects attached to the connector.
         storeIds();
@@ -243,19 +287,25 @@ SPConnEndPair::update(void)
 void SPConnEndPair::storeIds(void)
 {
     if (_connEnd[0]->href) {
+        gchar ** href_strarray = NULL;
+        href_strarray = g_strsplit(_connEnd[0]->href, "_", 0);
         // href begins with a '#' which we don't want.
-        const char *startId = _connEnd[0]->href + 1;
+        const char *startId = href_strarray[0] + 1;
         GQuark itemId = g_quark_from_string(startId);
         _connRef->setEndPointId(Avoid::VertID::src, itemId);
+        g_strfreev(href_strarray);
     }
     else {
         _connRef->setEndPointId(Avoid::VertID::src, 0);
     }
     if (_connEnd[1]->href) {
+        gchar ** href_strarray = NULL;
+        href_strarray = g_strsplit(_connEnd[1]->href, "_", 0);
         // href begins with a '#' which we don't want.
-        const char *endId = _connEnd[1]->href + 1;
+        const char *endId = href_strarray[0] + 1;
         GQuark itemId = g_quark_from_string(endId);
         _connRef->setEndPointId(Avoid::VertID::tar, itemId);
+        g_strfreev(href_strarray);
     }
     else {
         _connRef->setEndPointId(Avoid::VertID::tar, 0);
@@ -278,15 +328,55 @@ SPConnEndPair::makePathInvalid(void)
     _connRef->makePathInvalid();
 }
 
+
+// Redraws the curve along the recalculated route
+// Straight or curved
+void recreateCurve(SPCurve *curve, Avoid::ConnRef *connRef, const gdouble curvature)
+{
+    bool straight = curvature<1e-3;
+
+    Avoid::PolyLine route = connRef->displayRoute();
+    if (!straight)
+        route = route.curvedPolyline(curvature);
+    connRef->calcRouteDist();
+    
+    curve->reset();
+
+    curve->moveto( Geom::Point(route.ps[0].x, route.ps[0].y) );
+    int pn = route.size();
+    for (int i = 1; i < pn; ++i) {
+        Geom::Point p(route.ps[i].x, route.ps[i].y);
+        if (straight) {
+            curve->lineto( p );
+        }
+        else {
+            switch (route.ts[i]) {
+                case 'M':
+                    curve->moveto( p );
+                    break;
+                case 'L':
+                    curve->lineto( p );
+                    break;
+                case 'C':
+                    g_assert( i+2<pn );
+                    curve->curveto( p, Geom::Point(route.ps[i+1].x, route.ps[i+1].y), 
+                            Geom::Point(route.ps[i+2].x, route.ps[i+2].y) );
+                    i+=2;
+                    break;
+            }
+        }
+    }
+}
+
+
 void
-SPConnEndPair::reroutePath(void)
+SPConnEndPair::tellLibavoidNewEndpoints(const bool processTransaction)
 {
     if (!isAutoRoutingConn()) {
         // Do nothing
         return;
     }
-
-    SPCurve *curve = _path->curve;
+    makePathInvalid();
 
     Geom::Point endPt[2];
     getEndpoints(endPt);
@@ -294,26 +384,34 @@ SPConnEndPair::reroutePath(void)
     Avoid::Point src(endPt[0][Geom::X], endPt[0][Geom::Y]);
     Avoid::Point dst(endPt[1][Geom::X], endPt[1][Geom::Y]);
 
-    _connRef->updateEndPoint(Avoid::VertID::src, src);
-    _connRef->updateEndPoint(Avoid::VertID::tar, dst);
-
-    _connRef->generatePath(src, dst);
-
-    Avoid::PolyLine route = _connRef->route();
-    _connRef->calcRouteDist();
+    _connRef->setEndpoints(src, dst);
+    if (processTransaction)
+    {
+        _connRef->router()->processTransaction();
+    }
+    return;
+}
 
-    curve->reset();
-    curve->moveto(endPt[0]);
 
-    for (int i = 1; i < route.pn; ++i) {
-        Geom::Point p(route.ps[i].x, route.ps[i].y);
-        curve->lineto(p);
+bool
+SPConnEndPair::reroutePathFromLibavoid(void)
+{
+    if (!isAutoRoutingConn()) {
+        // Do nothing
+        return false;
     }
 
+    SPCurve *curve = _path->original_curve ?_path->original_curve : _path->curve;
+
+    recreateCurve( curve, _connRef, _connCurvature );
+    
     Geom::Matrix doc2item = sp_item_i2doc_affine(SP_ITEM(_path)).inverse();
     curve->transform(doc2item); 
+    
+    return true;
 }
 
+
 /*
   Local Variables:
   mode:c++
index 9b9e181db9b3dfc359bc6d0e81643945c1c059fc..3b011ed173a6bb1b99b77be92d8436c5e4c582bb 100644 (file)
@@ -28,6 +28,7 @@ class Node;
 }
 }
 
+extern void recreateCurve(SPCurve *curve, Avoid::ConnRef *connRef, gdouble curvature);
 
 class SPConnEndPair {
 public:
@@ -38,19 +39,16 @@ public:
     void writeRepr(Inkscape::XML::Node *const repr) const;
     void getAttachedItems(SPItem *[2]) const;
     void getEndpoints(Geom::Point endPts[]) const;
-    void reroutePath(void);
+    gdouble getCurvature(void) const;
+    SPConnEnd** getConnEnds(void);
+    bool isOrthogonal(void) const;
+    friend void recreateCurve(SPCurve *curve, Avoid::ConnRef *connRef, gdouble curvature);
+    void tellLibavoidNewEndpoints(const bool processTransaction = false);
+    bool reroutePathFromLibavoid(void);
     void makePathInvalid(void);
     void update(void);
     bool isAutoRoutingConn(void);
     void rerouteFromManipulation(void);
-    void reroute(void);
-    sigc::connection connectInvalidPath(sigc::slot<void, SPPath *> slot);
-
-    // A signal emited by a call back from libavoid.  Used to let 
-    // connectors know when they need to reroute themselves.
-    sigc::signal<void, SPPath *> _invalid_path_signal;
-    // A sigc connection to listen for connector path invalidation.
-    sigc::connection _invalid_path_connection;
 
 private:
     SPConnEnd *_connEnd[2];
@@ -61,6 +59,7 @@ private:
     Avoid::ConnRef *_connRef;
 
     int _connType;
+    gdouble _connCurvature;
     
     // A sigc connection for transformed signal.
     sigc::connection _transformed_connection;
@@ -74,8 +73,9 @@ void sp_conn_end_pair_build(SPObject *object);
 
 // _connType options:
 enum {
-    SP_CONNECTOR_NOAVOID,    // Basic connector - a straight line.
-    SP_CONNECTOR_POLYLINE    // Object avoiding polyline.
+    SP_CONNECTOR_NOAVOID,     // Basic connector - a straight line.
+    SP_CONNECTOR_POLYLINE,    // Object avoiding polyline.
+    SP_CONNECTOR_ORTHOGONAL   // Object avoiding orthogonal polyline (only horizontal and verical segments).
 };
 
 
index 0b420a98e09ec62a74ccadb8f9d1c972f4cc19f4..52914ee9e0bab7b7f770a40820526ef07c9c53b4 100644 (file)
@@ -16,7 +16,7 @@
 #include "2geom/path-intersection.h"
 
 
-static void change_endpts(SPCurve *const curve, Geom::Point const h2endPt[2]);
+static void change_endpts(SPCurve *const curve, double const endPos[2]);
 
 SPConnEnd::SPConnEnd(SPObject *const owner) :
     ref(owner),
@@ -39,45 +39,37 @@ get_nearest_common_ancestor(SPObject const *const obj, SPItem const *const objs[
 }
 
 
-static bool try_get_intersect_point_with_item_recursive(SPCurve *conn_curve, SPItem& item, 
-        const Geom::Matrix& item_transform, const bool at_start, double* intersect_pos, 
-        unsigned *intersect_index) {
-
-    double initial_pos = (at_start) ? 0.0 : std::numeric_limits<double>::max();
+static bool try_get_intersect_point_with_item_recursive(Geom::PathVector& conn_pv, SPItem* item,
+        const Geom::Matrix& item_transform, double& intersect_pos) {
 
+    double initial_pos = intersect_pos;
     // if this is a group...
-    if (SP_IS_GROUP(&item)) {
-        SPGroup* group = SP_GROUP(&item);
+    if (SP_IS_GROUP(item)) {
+        SPGroup* group = SP_GROUP(item);
         
         // consider all first-order children
-        double child_pos = initial_pos;
-        unsigned child_index;
+        double child_pos = std::numeric_limits<double>::max();
         for (GSList const* i = sp_item_group_item_list(group); i != NULL; i = i->next) {
             SPItem* child_item = SP_ITEM(i->data);
-            try_get_intersect_point_with_item_recursive(conn_curve, *child_item, 
-                    item_transform * child_item->transform, at_start, &child_pos, &child_index);
-            if (fabs(initial_pos - child_pos) > fabs(initial_pos - *intersect_pos)) {
-                // It is further away from the initial point than the current intersection
-                // point (i.e. the "outermost" intersection), so use this one.
-                *intersect_pos = child_pos;
-                *intersect_index = child_index;
-            }
+            try_get_intersect_point_with_item_recursive(conn_pv, child_item,
+                    item_transform * child_item->transform, child_pos);
+            if (intersect_pos > child_pos)
+                intersect_pos = child_pos;
         }
-        return *intersect_pos != initial_pos;
+        return intersect_pos != initial_pos;
     }
 
-    // if this is a shape...
-    if (!SP_IS_SHAPE(&item)) return false;
+    // if this is not a shape, nothing to be done
+    if (!SP_IS_SHAPE(item)) return false;
 
     // make sure it has an associated curve
-    SPCurve* item_curve = sp_shape_get_curve(SP_SHAPE(&item));
+    SPCurve* item_curve = sp_shape_get_curve(SP_SHAPE(item));
     if (!item_curve) return false;
 
     // apply transformations (up to common ancestor)
     item_curve->transform(item_transform);
 
     const Geom::PathVector& curve_pv = item_curve->get_pathvector();
-    const Geom::PathVector& conn_pv = conn_curve->get_pathvector();
     Geom::CrossingSet cross = crossings(conn_pv, curve_pv);
     // iterate over all Crossings
     for (Geom::CrossingSet::const_iterator i = cross.begin(); i != cross.end(); i++) {
@@ -85,18 +77,14 @@ static bool try_get_intersect_point_with_item_recursive(SPCurve *conn_curve, SPI
 
         for (Geom::Crossings::const_iterator i = cr.begin(); i != cr.end(); i++) {
             const Geom::Crossing& cr_pt = *i;
-            if (fabs(initial_pos - cr_pt.ta) > fabs(initial_pos - *intersect_pos)) {
-                // It is further away from the initial point than the current intersection
-                // point (i.e. the "outermost" intersection), so use this one.
-                *intersect_pos = cr_pt.ta;
-                *intersect_index = cr_pt.a;
-            }
+            if ( intersect_pos > cr_pt.ta)
+                intersect_pos = cr_pt.ta;
         }
     }
 
     item_curve->unref();
 
-    return *intersect_pos != initial_pos;
+    return intersect_pos != initial_pos;
 }
 
 
@@ -104,22 +92,36 @@ static bool try_get_intersect_point_with_item_recursive(SPCurve *conn_curve, SPI
 // and the item given.  If the item is a group, then the component items are considered.
 // The transforms given should be to a common ancestor of both the path and item.
 //
-static bool try_get_intersect_point_with_item(SPPath& conn, SPItem& item, 
+static bool try_get_intersect_point_with_item(SPPath* conn, SPItem* item,
         const Geom::Matrix& item_transform, const Geom::Matrix& conn_transform, 
-        const bool at_start, double* intersect_pos, unsigned *intersect_index) {
+        const bool at_start, double& intersect_pos) {
  
-    // We start with the intersection point either at the beginning or end of the 
-    // path, depending on whether we are considering the source or target endpoint.
-    *intersect_pos = (at_start) ? 0.0 : std::numeric_limits<double>::max();
-
     // Copy the curve and apply transformations up to common ancestor.
-    SPCurve* conn_curve = conn.curve->copy();
+    SPCurve* conn_curve = conn->curve->copy();
     conn_curve->transform(conn_transform);
 
+    Geom::PathVector conn_pv = conn_curve->get_pathvector();
+
+    // If this is not the starting point, use Geom::Path::reverse() to reverse the path
+    if (!at_start)
+    {
+        // connectors are actually a single path, so consider the first element from a Geom::PathVector
+        conn_pv[0] = conn_pv[0].reverse();
+    }
+
+    // We start with the intersection point at the end of the path
+    intersect_pos = conn_pv[0].size();
+
     // Find the intersection.
-    bool result = try_get_intersect_point_with_item_recursive(conn_curve, item, item_transform, 
-            at_start, intersect_pos, intersect_index);
-    
+    bool result = try_get_intersect_point_with_item_recursive(conn_pv, item, item_transform, intersect_pos);
+
+    if (!result)
+        // No intersection point has been found (why?)
+        // just default to connector end
+        intersect_pos = 0;
+    // If not at the starting point, recompute position with respect to original path
+    if (!at_start)
+        intersect_pos = conn_pv[0].size() - intersect_pos;
     // Free the curve copy.
     conn_curve->unref();
 
@@ -128,18 +130,15 @@ static bool try_get_intersect_point_with_item(SPPath& conn, SPItem& item,
 
 
 static void
-sp_conn_end_move_compensate(Geom::Matrix const */*mp*/, SPItem */*moved_item*/,
-                            SPPath *const path,
-                            bool const updatePathRepr = true)
+sp_conn_get_route_and_redraw(SPPath *const path, 
+        const bool updatePathRepr = true)
 {
-    // TODO: SPItem::getBounds gives the wrong result for some objects
-    //       that have internal representations that are updated later
-    //       by the sp_*_update functions, e.g., text.
-    sp_document_ensure_up_to_date(path->document);
-
     // Get the new route around obstacles.
-    path->connEndPair.reroutePath();
-
+    bool rerouted = path->connEndPair.reroutePathFromLibavoid();
+    if (!rerouted) {
+        return;
+    }
+    
     SPItem *h2attItem[2];
     path->connEndPair.getAttachedItems(h2attItem);
 
@@ -147,72 +146,80 @@ sp_conn_end_move_compensate(Geom::Matrix const */*mp*/, SPItem */*moved_item*/,
     SPObject const *const ancestor = get_nearest_common_ancestor(path_item, h2attItem);
     Geom::Matrix const path2anc(i2anc_affine(path_item, ancestor));
 
-    Geom::Point endPts[2] = { *(path->curve->first_point()), *(path->curve->last_point()) };
+    // Set sensible values incase there the connector ends are not 
+    // attached to any shapes.
+    Geom::PathVector conn_pv = path->curve->get_pathvector();
+    double endPos[2] = { 0, conn_pv[0].size() };
+
+    SPConnEnd** _connEnd = path->connEndPair.getConnEnds();
     for (unsigned h = 0; h < 2; ++h) {
-        if (h2attItem[h]) {
-            // For each attached object, change the corresponding point to be
-            // at the outermost intersection with the object's path.
-            double intersect_pos;
-            unsigned intersect_index;
+        if (h2attItem[h] && _connEnd[h]->type == ConnPointDefault && _connEnd[h]->id == ConnPointPosCC) {
             Geom::Matrix h2i2anc = i2anc_affine(h2attItem[h], ancestor);
-            if ( try_get_intersect_point_with_item(*path, *h2attItem[h], h2i2anc, path2anc, 
-                        (h == 0), &intersect_pos, &intersect_index) ) {
-                const Geom::PathVector& curve = path->curve->get_pathvector();
-                endPts[h] = curve[intersect_index].pointAt(intersect_pos);
-            }
+            try_get_intersect_point_with_item(path, h2attItem[h], h2i2anc, path2anc,
+                        (h == 0), endPos[h]);
         }
     }
-    change_endpts(path->curve, endPts);
+    change_endpts(path->curve, endPos);
     if (updatePathRepr) {
-        path->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG);
         path->updateRepr();
+        path->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG);
     }
 }
 
-// TODO: This triggering of makeInvalidPath could be cleaned up to be
-//       another option passed to move_compensate.
+
 static void
-sp_conn_end_shape_move_compensate(Geom::Matrix const *mp, SPItem *moved_item,
+sp_conn_end_shape_move(Geom::Matrix const */*mp*/, SPItem */*moved_item*/,
                             SPPath *const path)
 {
     if (path->connEndPair.isAutoRoutingConn()) {
-        path->connEndPair.makePathInvalid();
+        path->connEndPair.tellLibavoidNewEndpoints();
     }
-    sp_conn_end_move_compensate(mp, moved_item, path);
 }
 
 
 void
-sp_conn_adjust_invalid_path(SPPath *const path)
+sp_conn_reroute_path(SPPath *const path)
 {
-    sp_conn_end_move_compensate(NULL, NULL, path);
+    if (path->connEndPair.isAutoRoutingConn()) {
+        path->connEndPair.tellLibavoidNewEndpoints();
+    }
 }
 
+
 void
-sp_conn_adjust_path(SPPath *const path)
+sp_conn_reroute_path_immediate(SPPath *const path)
 {
     if (path->connEndPair.isAutoRoutingConn()) {
-        path->connEndPair.makePathInvalid();
+        bool processTransaction = true;
+        path->connEndPair.tellLibavoidNewEndpoints(processTransaction);
     }
     // Don't update the path repr or else connector dragging is slowed by
     // constant update of values to the xml editor, and each step is also
     // needlessly remembered by undo/redo.
     bool const updatePathRepr = false;
-    sp_conn_end_move_compensate(NULL, NULL, path, updatePathRepr);
+    sp_conn_get_route_and_redraw(path, updatePathRepr);
+}
+
+void sp_conn_redraw_path(SPPath *const path)
+{
+    sp_conn_get_route_and_redraw(path);
 }
 
 
 static void
-change_endpts(SPCurve *const curve, Geom::Point const h2endPt[2])
+change_endpts(SPCurve *const curve, double const endPos[2])
 {
-#if 0
-    curve->reset();
-    curve->moveto(h2endPt[0]);
-    curve->lineto(h2endPt[1]);
-#else
-    curve->move_endpoints(h2endPt[0], h2endPt[1]);
-#endif
+    // Use Geom::Path::portion to cut the curve at the end positions
+    if (endPos[0] > endPos[1])
+    {
+        // Path is "negative", reset the curve and return
+        curve->reset();
+        return;
+    }
+    const Geom::Path& old_path = curve->get_pathvector()[0];
+    Geom::PathVector new_path_vector;
+    new_path_vector.push_back(old_path.portion(endPos[0], endPos[1]));
+    curve->set_pathvector(new_path_vector);
 }
 
 static void
@@ -234,29 +241,150 @@ sp_conn_end_detach(SPObject *const owner, unsigned const handle_ix)
 }
 
 void
-SPConnEnd::setAttacherHref(gchar const *value)
+SPConnEnd::setAttacherHref(gchar const *value, SPPath* path)
 {
     if ( value && href && ( strcmp(value, href) == 0 ) ) {
         /* No change, do nothing. */
     } else {
-        g_free(href);
-        href = NULL;
-        if (value) {
-            // First, set the href field, because sp_conn_end_href_changed will need it.
-            href = g_strdup(value);
-
-            // Now do the attaching, which emits the changed signal.
-            try {
-                ref.attach(Inkscape::URI(value));
-            } catch (Inkscape::BadURIException &e) {
-                /* TODO: Proper error handling as per
-                 * http://www.w3.org/TR/SVG11/implnote.html#ErrorProcessing.  (Also needed for
-                 * sp-use.) */
-                g_warning("%s", e.what());
+        if (!value)
+        {
+            ref.detach();
+            g_free(href);
+            href = NULL;
+        }
+        else
+        {
+
+            /* References to the connection points have the following format
+               #svguri_t_id, where #svguri is the id of the item the
+               connector is attached to, t is the type of the point, which
+               can be either "d" for default or "u" for user-defined, and
+               id is the local (inside the item) id of the connection point.
+               In the case of default points id represents the position on the
+               item (i.e. Top-Left, Centre-Centre, etc.).
+            */
+
+            gchar ** href_strarray = NULL;
+            if (href)
+                href_strarray = g_strsplit(href, "_", 0);
+            gchar ** value_strarray = g_strsplit(value, "_", 0);
+
+            g_free(href);
+            href = NULL;
+
+            bool changed = false;
+            bool validRef = true;
+
+            if ( !href_strarray || g_strcmp0(href_strarray[0], value_strarray[0]) != 0 )
+            {
+                // The href has changed, so update it.
+                changed = true;
+                // Set the href field, because sp_conn_end_href_changed will need it.
+                href = g_strdup(value);
+                // Now do the attaching, which emits the changed signal.
+                try {
+                    ref.attach(Inkscape::URI(value_strarray[0]));
+                } catch (Inkscape::BadURIException &e) {
+                    /* TODO: Proper error handling as per
+                    * http://www.w3.org/TR/SVG11/implnote.html#ErrorProcessing.  (Also needed for
+                    * sp-use.) */
+                    g_warning("%s", e.what());
+                    validRef = false;
+                }
+            }
+            // Check to see if the connection point changed and update it.
+            // 
+
+            if ( !value_strarray[1] )
+            {
+                /* Treat the old references to connection points
+                   as default points that connect to the centre
+                   of the item.
+                */
+                if ( type != ConnPointDefault )
+                {
+                    type = ConnPointDefault;
+                    changed = true;
+                }
+                if ( id != ConnPointPosCC )
+                {
+                    id = ConnPointPosCC;
+                    changed = true;
+                }
+            }
+            else
+            {
+                switch (value_strarray[1][0])
+                {
+                    case 'd':
+                        if ( type != ConnPointDefault )
+                        {
+                            type = ConnPointDefault;
+                            changed = true;
+                        }
+                        break;
+                    case 'u':
+                        if ( type != ConnPointUserDefined)
+                        {
+                            type = ConnPointUserDefined;
+                            changed = true;
+                        }
+                        break;
+                    default:
+                        g_warning("Bad reference to a connection point.");
+                        validRef = false;
+                }
+                if ( value_strarray[2] )
+                {
+                    int newId = (int) g_ascii_strtod( value_strarray[2], 0 );
+                    if ( id != newId )
+                    {
+                        id = newId;
+                        changed = true;
+                    }
+
+                }
+                else
+                {
+                    // We have a malformed reference to a connection point,
+                    // emit a warning, clear href and detach ref.
+                    changed = true;
+                    g_warning("Bad reference to a connection point.");\
+                    validRef = false;
+                }
+            }
+            
+            if ( changed )
+            {
+                // We still have to verify that the reference to the
+                // connection point is a valid one.
+                
+                // Get the item the connector is attached to
+                SPItem* item = ref.getObject();
+                if ( item && !item->avoidRef->isValidConnPointId( type, id ) )
+                {
+                    g_warning("Bad reference to a connection point.");
+                    validRef = false;
+                }
+/*                else
+                    // Update the connector
+                    if (path->connEndPair.isAutoRoutingConn()) {
+                        path->connEndPair.tellLibavoidNewEndpoints();
+                    }*/
+            }
+
+            if ( !validRef )
+            {
                 ref.detach();
+                g_free(href);
+                href = NULL;
             }
-        } else {
-            ref.detach();
+            else
+                if (!href)
+                    href = g_strdup(value);
+
+            g_strfreev(href_strarray);
+            g_strfreev(value_strarray);
         }
     }
 }
@@ -277,7 +405,7 @@ sp_conn_end_href_changed(SPObject */*old_ref*/, SPObject */*ref*/,
                 = SP_OBJECT(refobj)->connectDelete(sigc::bind(sigc::ptr_fun(&sp_conn_end_deleted),
                                                               SP_OBJECT(path), handle_ix));
             connEnd._transformed_connection
-                = SP_ITEM(refobj)->connectTransformed(sigc::bind(sigc::ptr_fun(&sp_conn_end_shape_move_compensate),
+                = SP_ITEM(refobj)->connectTransformed(sigc::bind(sigc::ptr_fun(&sp_conn_end_shape_move),
                                                                  path));
         }
     }
index a565b6404f08146a9d660e978ef14c23e808ae93..5e9dbb9dae35620eb7d5a21154fd3552bf8bb694 100644 (file)
@@ -5,6 +5,8 @@
 #include <sigc++/connection.h>
 
 #include "sp-use-reference.h"
+#include "connection-points.h"
+#include "conn-avoid-ref.h"
 
 
 class SPConnEnd {
@@ -14,6 +16,15 @@ public:
     SPUseReference ref;
     gchar *href;
 
+    /* In the following, type refers to connection point type,
+       i.e. default (one of the 9 combinations of right, centre,
+       left, top, bottom) or user-defined. The id serves to identify
+       the connection point in a list of connection points.
+    */
+
+    ConnPointType type;
+    int id;
+
     /** Change of href string (not a modification of the attributes of the referrent). */
     sigc::connection _changed_connection;
 
@@ -23,7 +34,7 @@ public:
     /** A sigc connection for transformed signal, used to do move compensation. */
     sigc::connection _transformed_connection;
 
-    void setAttacherHref(gchar const *);
+    void setAttacherHref(gchar const *, SPPath *);
 
 private:
     SPConnEnd(SPConnEnd const &);
@@ -32,8 +43,9 @@ private:
 
 void sp_conn_end_href_changed(SPObject *old_ref, SPObject *ref,
                               SPConnEnd *connEnd, SPPath *path, unsigned const handle_ix);
-void sp_conn_adjust_invalid_path(SPPath *const path);
-void sp_conn_adjust_path(SPPath *const path);
+void sp_conn_reroute_path(SPPath *const path);
+void sp_conn_reroute_path_immediate(SPPath *const path);
+void sp_conn_redraw_path(SPPath *const path);
 void sp_conn_end_detach(SPObject *const owner, unsigned const handle_ix);
 
 
index 3950482803a544b3efe179f976b39ad03204de72..9f7157b995561f8e8b6aeef0765ce67841f1b391 100644 (file)
@@ -412,6 +412,7 @@ sp_item_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr)
     sp_object_read_attr(object, "inkscape:transform-center-x");
     sp_object_read_attr(object, "inkscape:transform-center-y");
     sp_object_read_attr(object, "inkscape:connector-avoid");
+    sp_object_read_attr(object, "inkscape:connection-points");
 
     if (((SPObjectClass *) (parent_class))->build) {
         (* ((SPObjectClass *) (parent_class))->build)(object, document, repr);
@@ -514,6 +515,9 @@ sp_item_set(SPObject *object, unsigned key, gchar const *value)
         case SP_ATTR_CONNECTOR_AVOID:
             item->avoidRef->setAvoid(value);
             break;
+        case SP_ATTR_CONNECTION_POINTS:
+            item->avoidRef->setConnectionPoints(value);
+            break;
         case SP_ATTR_TRANSFORM_CENTER_X:
             if (value) {
                 item->transform_center_x = g_strtod(value, NULL);
index 6b9e512a144d23797a8cc7cf9be452aeac74db38..431d5d97b15cbc268b2f398f886c6042ca056dc1 100644 (file)
@@ -66,6 +66,31 @@ operator<<(Inkscape::SVGOStringStream &os, Geom::Point const & p)
     return os;
 }
 
+Inkscape::SVGIStringStream::SVGIStringStream():std::istringstream()
+{
+    this->imbue(std::locale::classic());
+    this->setf(std::ios::showpoint);
+
+    /* This one is (currently) needed though, as we currently use ostr.precision as a sort of
+       variable for storing the desired precision: see our two precision methods and our operator<<
+       methods for float and double. */
+    Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+    this->precision(prefs->getInt("/options/svgoutput/numericprecision", 8));
+}
+
+Inkscape::SVGIStringStream::SVGIStringStream(const std::string& str):std::istringstream(str)
+{
+    this->imbue(std::locale::classic());
+    this->setf(std::ios::showpoint);
+
+    /* This one is (currently) needed though, as we currently use ostr.precision as a sort of
+       variable for storing the desired precision: see our two precision methods and our operator<<
+       methods for float and double. */
+    Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+    this->precision(prefs->getInt("/options/svgoutput/numericprecision", 8));
+}
+
+
 /*
   Local Variables:
   mode:c++
index 5fbf1976c3b70b942f1d0785df247e5f22e13b91..60ed74ecbef249d5e7f9974a78c9ea98ea8b4567 100644 (file)
@@ -74,6 +74,13 @@ public:
     }
 };
 
+class SVGIStringStream:public std::istringstream {
+
+public:
+    SVGIStringStream();
+    SVGIStringStream(const std::string &str);
+};
+
 }
 
 Inkscape::SVGOStringStream &operator<<(Inkscape::SVGOStringStream &os, float d);
index 0388b200f48036450136c499b7197e5a875626e1..76e76ea34aba168665baad11fbd36e89cf041ee4 100644 (file)
     "color-picker"
 #define INKSCAPE_ICON_COLOR_REMOVE \
     "color-remove"
+#define INKSCAPE_ICON_CONNECTOR_EDIT \
+    "connector-edit"
 #define INKSCAPE_ICON_CONNECTOR_AVOID \
     "connector-avoid"
 #define INKSCAPE_ICON_CONNECTOR_IGNORE \
     "connector-ignore"
+#define INKSCAPE_ICON_CONNECTOR_ORTHOGONAL \
+    "connector-orthogonal"
+#define INKSCAPE_ICON_CONNECTOR_NEW_CONNPOINT \
+    "connector-new-connpoint"
+#define INKSCAPE_ICON_CONNECTOR_REMOVE_CONNPOINT \
+    "connector-remove-connpoint"
 #define INKSCAPE_ICON_DIALOG_ALIGN_AND_DISTRIBUTE \
     "dialog-align-and-distribute"
 #define INKSCAPE_ICON_DIALOG_FILL_AND_STROKE \
index 5f163d138ce7133253130e0b275ca51108ab3b4e..b10c60c7916ca59fbf8c08f72b0bec6c69057bc2 100644 (file)
@@ -470,13 +470,18 @@ static gchar const * ui_descr =
         "  </toolbar>"
 
         "  <toolbar name='ConnectorToolbar'>"
+        "    <toolitem action='ConnectorEditModeAction' />"
         "    <toolitem action='ConnectorAvoidAction' />"
         "    <toolitem action='ConnectorIgnoreAction' />"
+        "    <toolitem action='ConnectorOrthogonalAction' />"
+        "    <toolitem action='ConnectorCurvatureAction' />"
         "    <toolitem action='ConnectorSpacingAction' />"
         "    <toolitem action='ConnectorGraphAction' />"
         "    <toolitem action='ConnectorLengthAction' />"
         "    <toolitem action='ConnectorDirectedAction' />"
         "    <toolitem action='ConnectorOverlapAction' />"
+        "    <toolitem action='ConnectorNewConnPointAction' />"
+        "    <toolitem action='ConnectorRemoveConnPointAction' />"
         "  </toolbar>"
 
         "</ui>"
@@ -7076,6 +7081,13 @@ sp_text_toolbox_new (SPDesktop *desktop)
 //##      Connector      ##
 //#########################
 
+static void sp_connector_mode_toggled( GtkToggleAction* act, GtkObject */*tbl*/ )
+{
+    Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+    prefs->setBool("/tools/connector/mode",
+                gtk_toggle_action_get_active( act ));
+}
+
 static void sp_connector_path_set_avoid(void)
 {
     cc_selection_set_avoid(true);
@@ -7087,6 +7099,106 @@ static void sp_connector_path_set_ignore(void)
     cc_selection_set_avoid(false);
 }
 
+static void sp_connector_orthogonal_toggled( GtkToggleAction* act, GObject *tbl )
+{
+    SPDesktop *desktop = (SPDesktop *) g_object_get_data( tbl, "desktop" );
+    Inkscape::Selection * selection = sp_desktop_selection(desktop);
+    SPDocument *doc = sp_desktop_document(desktop);
+
+    if (!sp_document_get_undo_sensitive(doc))
+    {
+        return;
+    }
+    
+
+    // quit if run by the _changed callbacks
+    if (g_object_get_data( tbl, "freeze" )) {
+        return;
+    }
+
+    // in turn, prevent callbacks from responding
+    g_object_set_data( tbl, "freeze", GINT_TO_POINTER(TRUE) );
+
+    bool is_orthog = gtk_toggle_action_get_active( act );
+    gchar orthog_str[] = "orthogonal";
+    gchar polyline_str[] = "polyline";
+    gchar *value = is_orthog ? orthog_str : polyline_str ;
+
+    bool modmade = false;
+    GSList *l = (GSList *) selection->itemList();
+    while (l) {
+        SPItem *item = (SPItem *) l->data;
+
+        if (cc_item_is_connector(item)) {
+            sp_object_setAttribute(item, "inkscape:connector-type",
+                    value, false);
+            item->avoidRef->handleSettingChange();
+            modmade = true;
+        }
+        l = l->next;
+    }
+
+    if (!modmade)
+    {
+        Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+        prefs->setBool("/tools/connector/orthogonal", is_orthog);
+    }
+
+    sp_document_done(doc, SP_VERB_CONTEXT_CONNECTOR,
+            is_orthog ? _("Set connector type: orthogonal"): _("Set connector type: polyline"));
+
+    g_object_set_data( tbl, "freeze", GINT_TO_POINTER(FALSE) );
+}
+
+static void connector_curvature_changed(GtkAdjustment *adj, GObject* tbl)
+{
+    SPDesktop *desktop = (SPDesktop *) g_object_get_data( tbl, "desktop" );
+    Inkscape::Selection * selection = sp_desktop_selection(desktop);
+    SPDocument *doc = sp_desktop_document(desktop);
+
+    if (!sp_document_get_undo_sensitive(doc))
+    {
+        return;
+    }
+    
+
+    // quit if run by the _changed callbacks
+    if (g_object_get_data( tbl, "freeze" )) {
+        return;
+    }
+
+    // in turn, prevent callbacks from responding
+    g_object_set_data( tbl, "freeze", GINT_TO_POINTER(TRUE) );
+
+    gdouble newValue = gtk_adjustment_get_value(adj);
+    gchar value[G_ASCII_DTOSTR_BUF_SIZE];
+    g_ascii_dtostr(value, G_ASCII_DTOSTR_BUF_SIZE, newValue);
+
+    bool modmade = false;
+    GSList *l = (GSList *) selection->itemList();
+    while (l) {
+        SPItem *item = (SPItem *) l->data;
+
+        if (cc_item_is_connector(item)) {
+            sp_object_setAttribute(item, "inkscape:connector-curvature",
+                    value, false);
+            item->avoidRef->handleSettingChange();
+            modmade = true;
+        }
+        l = l->next;
+    }
+
+    if (!modmade)
+    {
+        Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+        prefs->setDouble(Glib::ustring("/tools/connector/curvature"), newValue);
+    }
+
+    sp_document_done(doc, SP_VERB_CONTEXT_CONNECTOR,
+            _("Change connector curvature"));
+
+    g_object_set_data( tbl, "freeze", GINT_TO_POINTER(FALSE) );
+}
 
 
 static void connector_spacing_changed(GtkAdjustment *adj, GObject* tbl)
@@ -7183,21 +7295,37 @@ static void connector_tb_event_attr_changed(Inkscape::XML::Node *repr,
     if (g_object_get_data(G_OBJECT(tbl), "freeze")) {
         return;
     }
-    if (strcmp(name, "inkscape:connector-spacing") != 0) {
-        return;
+    if (strcmp(name, "inkscape:connector-spacing") == 0)
+    {
+        GtkAdjustment *adj = (GtkAdjustment*)
+                gtk_object_get_data(GTK_OBJECT(tbl), "spacing");
+        gdouble spacing = defaultConnSpacing;
+        sp_repr_get_double(repr, "inkscape:connector-spacing", &spacing);
+
+        gtk_adjustment_set_value(adj, spacing);
+        gtk_adjustment_value_changed(adj);
     }
 
-    GtkAdjustment *adj = (GtkAdjustment*)
-            gtk_object_get_data(GTK_OBJECT(tbl), "spacing");
-    gdouble spacing = defaultConnSpacing;
-    sp_repr_get_double(repr, "inkscape:connector-spacing", &spacing);
+    spinbutton_defocus(GTK_OBJECT(tbl));
+}
 
-    gtk_adjustment_set_value(adj, spacing);
-    gtk_adjustment_value_changed(adj);
+static void sp_connector_new_connection_point(GtkWidget *, GObject *tbl)
+{
+    SPDesktop *desktop = (SPDesktop *) g_object_get_data( tbl, "desktop" );
+    SPConnectorContext* cc = SP_CONNECTOR_CONTEXT(desktop->event_context);
 
-    spinbutton_defocus(GTK_OBJECT(tbl));
+    if (cc->mode == SP_CONNECTOR_CONTEXT_EDITING_MODE)
+        cc_create_connection_point(cc);
 }
 
+static void sp_connector_remove_connection_point(GtkWidget *, GObject *tbl)
+{
+    SPDesktop *desktop = (SPDesktop *) g_object_get_data( tbl, "desktop" );
+    SPConnectorContext* cc = SP_CONNECTOR_CONTEXT(desktop->event_context);
+
+    if (cc->mode == SP_CONNECTOR_CONTEXT_EDITING_MODE)
+        cc_remove_connection_point(cc);
+}
 
 static Inkscape::XML::NodeEventVector connector_tb_repr_events = {
     NULL, /* child_added */
@@ -7207,12 +7335,42 @@ static Inkscape::XML::NodeEventVector connector_tb_repr_events = {
     NULL  /* order_changed */
 };
 
+static void sp_connector_toolbox_selection_changed(Inkscape::Selection *selection, GObject *tbl)
+{
+    GtkAdjustment *adj = GTK_ADJUSTMENT( g_object_get_data( tbl, "curvature" ) );
+    GtkToggleAction *act = GTK_TOGGLE_ACTION( g_object_get_data( tbl, "orthogonal" ) );
+    SPItem *item = selection->singleItem();
+    if (SP_IS_PATH(item))
+    {
+        gdouble curvature = SP_PATH(item)->connEndPair.getCurvature();
+        bool is_orthog = SP_PATH(item)->connEndPair.isOrthogonal();
+        gtk_toggle_action_set_active(act, is_orthog);
+        gtk_adjustment_set_value(adj, curvature);
+    }
+
+}
 
 static void sp_connector_toolbox_prep( SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder )
 {
     Inkscape::Preferences *prefs = Inkscape::Preferences::get();
     Inkscape::IconSize secondarySize = prefToSize("/toolbox/secondary", 1);
 
+    // Editing mode toggle button
+    {
+        InkToggleAction* act = ink_toggle_action_new( "ConnectorEditModeAction",
+                                                      _("EditMode"),
+                                                      _("Switch between connection point editing and connector drawing mode"),
+                                                      INKSCAPE_ICON_CONNECTOR_EDIT,
+                                                      Inkscape::ICON_SIZE_DECORATION );
+        gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
+
+        bool tbuttonstate = prefs->getBool("/tools/connector/mode");
+        gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(act), ( tbuttonstate ? TRUE : FALSE ));
+        g_object_set_data( holder, "mode", act );
+        g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(sp_connector_mode_toggled), holder );
+    }
+
+
     {
         InkAction* inky = ink_action_new( "ConnectorAvoidAction",
                                           _("Avoid"),
@@ -7233,17 +7391,42 @@ static void sp_connector_toolbox_prep( SPDesktop *desktop, GtkActionGroup* mainA
         gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
     }
 
+    // Orthogonal connectors toggle button
+    {
+        InkToggleAction* act = ink_toggle_action_new( "ConnectorOrthogonalAction",
+                                                      _("Orthogonal"),
+                                                      _("Make connector orthogonal or polyline"),
+                                                      INKSCAPE_ICON_CONNECTOR_ORTHOGONAL,
+                                                      Inkscape::ICON_SIZE_DECORATION );
+        gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
+
+        bool tbuttonstate = prefs->getBool("/tools/connector/orthogonal");
+        gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(act), ( tbuttonstate ? TRUE : FALSE ));
+        g_object_set_data( holder, "orthogonal", act );
+        g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(sp_connector_orthogonal_toggled), holder );
+    }
+
     EgeAdjustmentAction* eact = 0;
+    // Curvature spinbox
+    eact = create_adjustment_action( "ConnectorCurvatureAction",
+                                    _("Connector Curvature"), _("Curvature:"),
+                                    _("The amount of connectors curvature"),
+                                    "/tools/connector/curvature", defaultConnCurvature,
+                                    GTK_WIDGET(desktop->canvas), NULL, holder, TRUE, "inkscape:connector-curvature",
+                                    0, 100, 1.0, 10.0,
+                                    0, 0, 0,
+                                    connector_curvature_changed, 1, 0 );
+    gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
 
     // Spacing spinbox
     eact = create_adjustment_action( "ConnectorSpacingAction",
-                                     _("Connector Spacing"), _("Spacing:"),
-                                     _("The amount of space left around objects by auto-routing connectors"),
-                                     "/tools/connector/spacing", defaultConnSpacing,
-                                     GTK_WIDGET(desktop->canvas), NULL, holder, TRUE, "inkscape:connector-spacing",
-                                     0, 100, 1.0, 10.0,
-                                     0, 0, 0,
-                                     connector_spacing_changed, 1, 0 );
+                                    _("Connector Spacing"), _("Spacing:"),
+                                    _("The amount of space left around objects by auto-routing connectors"),
+                                    "/tools/connector/spacing", defaultConnSpacing,
+                                    GTK_WIDGET(desktop->canvas), NULL, holder, TRUE, "inkscape:connector-spacing",
+                                    0, 100, 1.0, 10.0,
+                                    0, 0, 0,
+                                    connector_spacing_changed, 1, 0 );
     gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
 
     // Graph (connector network) layout
@@ -7282,6 +7465,8 @@ static void sp_connector_toolbox_prep( SPDesktop *desktop, GtkActionGroup* mainA
         gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(act), ( tbuttonstate ? TRUE : FALSE ));
 
         g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(sp_directed_graph_layout_toggled), holder );
+        sigc::connection *connection = new sigc::connection(sp_desktop_selection(desktop)->connectChanged(sigc::bind(sigc::ptr_fun(sp_connector_toolbox_selection_changed), (GObject *)holder))
+        );
     }
 
     // Avoid overlaps toggle button
@@ -7299,6 +7484,31 @@ static void sp_connector_toolbox_prep( SPDesktop *desktop, GtkActionGroup* mainA
         g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(sp_nooverlaps_graph_layout_toggled), holder );
     }
 
+
+    // New connection point button
+    {
+        InkAction* inky = ink_action_new( "ConnectorNewConnPointAction",
+                                          _("New connection point"),
+                                          _("Add a new connection point to the currently selected item"),
+                                          INKSCAPE_ICON_CONNECTOR_NEW_CONNPOINT,
+                                          secondarySize );
+        g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_connector_new_connection_point), holder );
+        gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
+    }
+    
+    // Remove selected connection point button
+    
+    {
+        InkAction* inky = ink_action_new( "ConnectorRemoveConnPointAction",
+                                          _("Remove connection point"),
+                                          _("Remove the currently selected connection point"),
+                                          INKSCAPE_ICON_CONNECTOR_REMOVE_CONNPOINT,
+                                          secondarySize );
+        g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_connector_remove_connection_point), holder );
+        gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
+    }
+    
+
     // Code to watch for changes to the connector-spacing attribute in
     // the XML.
     Inkscape::XML::Node *repr = SP_OBJECT_REPR(desktop->namedview);