diff options
| author | Jabier Arraiza Cenoz <jabier.arraiza@marker.es> | 2015-10-16 10:24:04 +0000 |
|---|---|---|
| committer | jabiertxof <jabier.arraiza@marker.es> | 2015-10-16 10:24:04 +0000 |
| commit | c698002c4598209f6c4ccc0a86f89afb54f224a2 (patch) | |
| tree | cf0c89fdc713f96eba2f760b909c0c648eb075b4 | |
| parent | working in dimension to item (diff) | |
| parent | update to trunk (diff) | |
| download | inkscape-c698002c4598209f6c4ccc0a86f89afb54f224a2.tar.gz inkscape-c698002c4598209f6c4ccc0a86f89afb54f224a2.zip | |
update to current measure code
(bzr r14393.2.1)
33 files changed, 1793 insertions, 1054 deletions
@@ -22,8 +22,8 @@ msgstr "" "Project-Id-Version: inkscape\n" "Report-Msgid-Bugs-To: inkscape-devel@lists.sourceforge.net\n" "POT-Creation-Date: 2015-09-22 10:09+0200\n" -"PO-Revision-Date: 2015-04-27 04:39+0100\n" -"Last-Translator: Eduard Braun <eduard.braun2@gmx.de>\n" +"PO-Revision-Date: 2015-10-02 16:07+0200\n" +"Last-Translator: Maren Hachmann <marenhachmann@yahoo.com>\n" "Language-Team: \n" "Language: de\n" "MIME-Version: 1.0\n" @@ -34,7 +34,7 @@ msgstr "" "X-Poedit-SourceCharset: utf-8\n" "X-Language: de_DE\n" "X-Source-Language: C\n" -"X-Generator: Poedit 1.7.6\n" +"X-Generator: Poedit 1.8.5\n" #: ../inkscape.desktop.in.h:1 msgid "Inkscape" @@ -280,7 +280,7 @@ msgstr "Kanten und Grenzen schärfen, Stärke = 0,15" #: ../share/filters/filters.svg.h:70 msgid "Sharpen More" -msgstr "Stärker Schärfen" +msgstr "Stärker schärfen" #: ../share/filters/filters.svg.h:72 msgid "Sharpen edges and boundaries within the object, force=0.3" @@ -334,7 +334,7 @@ msgstr "Farbkanten im Objekt erkennen und in Blau nachzeichnen" #: ../share/filters/filters.svg.h:86 msgid "Age" -msgstr "Alter" +msgstr "Altern" #: ../share/filters/filters.svg.h:88 msgid "Imitate aged photograph" @@ -438,7 +438,7 @@ msgstr "Zerbrochenes Glas" #: ../share/filters/filters.svg.h:128 msgid "Under a cracked glass" -msgstr "Unter einem zerbrochenen Glas" +msgstr "Unter gesplittertem Glas" #: ../share/filters/filters.svg.h:130 msgid "Bubbly Bumps" @@ -644,7 +644,7 @@ msgid "" "Metallized effect with a soft lighting, slightly translucent at the edges" msgstr "" "Metallischer Effekt mit weicher Beleuchtung, leicht lichtdurchlässig an den " -"Kanten " +"Kanten" #: ../share/filters/filters.svg.h:214 msgid "Dragee" @@ -729,11 +729,11 @@ msgstr "Feine Goldpartikel in fetter Grundlage, mit Glanzlichtern" #: ../share/filters/filters.svg.h:250 msgid "Crumpled Plastic" -msgstr "Gebröckelte Plastik" +msgstr "Zerknitterter Kunststoff" #: ../share/filters/filters.svg.h:252 msgid "Crumpled matte plastic, with melted edge" -msgstr "Gebröckelte matte Plastik mit geschmolzenen Ecken" +msgstr "Zerknitterter, matter Kunststoff mit angeschmolzenen Ecken" #: ../share/filters/filters.svg.h:254 msgid "Enamel Jewelry" @@ -901,7 +901,7 @@ msgstr "Geringe Turbulenz ergibt Schwammeffekt, starke Turbulenz Kreide" #: ../share/filters/filters.svg.h:330 msgid "People" -msgstr "Leute" +msgstr "Menschen" #: ../share/filters/filters.svg.h:332 msgid "Colorized blotches, like a crowd of people" @@ -1024,7 +1024,7 @@ msgstr "Wellenförmig verzerrtes Schottenkaro mit abgeschrägten Kanten" #: ../share/filters/filters.svg.h:394 msgid "3D Marble" -msgstr "3D Marmor" +msgstr "3D-Marmor" #: ../share/filters/filters.svg.h:396 msgid "3D warped marble texture" @@ -1032,7 +1032,7 @@ msgstr "Dreidimensional verkrümmte Marmortextur" #: ../share/filters/filters.svg.h:398 msgid "3D Wood" -msgstr "3D Holz" +msgstr "3D-Holz" #: ../share/filters/filters.svg.h:400 msgid "3D warped, fibered wood texture" @@ -1040,7 +1040,7 @@ msgstr "Dreidimensional verkrümmte, faserige Holztextur" #: ../share/filters/filters.svg.h:402 msgid "3D Mother of Pearl" -msgstr "3D Perlmutt" +msgstr "3D-Perlmutt" #: ../share/filters/filters.svg.h:404 msgid "3D warped, iridescent pearly shell texture" @@ -1257,7 +1257,7 @@ msgstr "Verknitterte, eingefallene Ballonhaut mit Löchern" #: ../share/filters/filters.svg.h:470 msgid "Embossed Leather" -msgstr "geprägtes Leder" +msgstr "Geprägtes Leder" #: ../share/filters/filters.svg.h:472 msgid "" @@ -1273,7 +1273,7 @@ msgstr "Batik" #: ../share/filters/filters.svg.h:476 msgid "White splotches evocating carnaval masks" -msgstr "Weiße Flecken, die an Batik erinnern" +msgstr "Weiße Flecken, die an Batik erinnern" #: ../share/filters/filters.svg.h:478 msgid "Plastify" @@ -1285,7 +1285,7 @@ msgid "" "crumple" msgstr "" "Kantenerkennung im HSL-Farbraum mit dem Effekt einer reflektierenden " -"Oberfläche einstellbarer Welligkeit " +"Oberfläche einstellbarer Welligkeit" #: ../share/filters/filters.svg.h:482 msgid "Plaster" @@ -1365,7 +1365,7 @@ msgstr "Alphagravur B" #: ../share/filters/filters.svg.h:516 msgid "" "Gives a controllable roughness engraving effect to bitmaps and materials" -msgstr "Erzeugt eine einstellbare raue Oberfläche auf Materialien und Bildern " +msgstr "Erzeugt eine einstellbare raue Oberfläche auf Materialien und Bildern" #: ../share/filters/filters.svg.h:518 msgid "Lapping" @@ -1509,8 +1509,7 @@ msgstr "Reliefdruck" #: ../share/filters/filters.svg.h:580 msgid "Bumps effect with a bevel, color flood and complex lighting" -msgstr "" -"Oberflächenstruktur mit Wölbung, Farbfüllung und komplexer Beleuchtung " +msgstr "Oberflächenstruktur mit Wölbung, Farbfüllung und komplexer Beleuchtung" #: ../share/filters/filters.svg.h:582 msgid "Growing Cells" @@ -1656,7 +1655,7 @@ msgstr "abflachende Transparenz" #: ../share/filters/filters.svg.h:652 msgid "Adds a white opaque background" -msgstr "Fügt einen weißen,trüben Hintergrund hinzu" +msgstr "Fügt einen weißen, deckenden Hintergrund hinzu" #: ../share/filters/filters.svg.h:654 msgid "Blur Double" @@ -1705,7 +1704,7 @@ msgstr "Fügt kleinteilige Körnung hinzu" #: ../share/filters/filters.svg.h:674 msgid "Poster Color Fun" -msgstr "Poster Farbspaß" +msgstr "Poster-Farbspaß" #: ../share/filters/filters.svg.h:678 msgid "Poster Rough" @@ -1815,7 +1814,7 @@ msgstr "Comicartiges Ausbleichen" #: ../share/filters/filters.svg.h:740 msgid "Cartoon paint style with some fading at the edges" -msgstr "Cartoonartiger Farbstil mit leichtem Ausbleichen der Ränder " +msgstr "Cartoonartiger Farbstil mit leichtem Ausbleichen der Ränder" #: ../share/filters/filters.svg.h:742 msgid "Brushed Metal" @@ -1923,7 +1922,7 @@ msgstr "Gefrorenes Glas" #: ../share/filters/filters.svg.h:796 msgid "Satiny glass effect" -msgstr "Satin Glaseffekt" +msgstr "Satiniertes-Glas-Effekt" #: ../share/filters/filters.svg.h:798 msgid "Bump Engraving" @@ -2946,7 +2945,7 @@ msgstr "Pflaume (#DDA0DD)" #: ../share/palettes/palettes.h:153 msgctxt "Palette" msgid "violet (#EE82EE)" -msgstr "Violetl (#EE82EE)" +msgstr "Violett (#EE82EE)" #. Palette: ./svg.gpl #: ../share/palettes/palettes.h:154 @@ -4120,7 +4119,7 @@ msgstr "Amphitheater" #: ../share/symbols/symbols.h:193 ../share/symbols/symbols.h:194 msgctxt "Symbol" msgid "Bicycle Trail" -msgstr "Bike Trail" +msgstr "Fahrradstrecke" #. Symbols: ./MapSymbolsNPS.svg #: ../share/symbols/symbols.h:195 ../share/symbols/symbols.h:196 @@ -4726,7 +4725,7 @@ msgstr "Hilfslinie-Pfad-Überschneidung" #: ../src/display/snap-indicator.cpp:124 msgid "clip-path" -msgstr "Ausschneidungspfad" +msgstr "Ausschneidepfad" #: ../src/display/snap-indicator.cpp:127 msgid "mask-path" @@ -4734,11 +4733,11 @@ msgstr "Maskenpfad" #: ../src/display/snap-indicator.cpp:130 msgid "bounding box corner" -msgstr "Rahmenecken" +msgstr "Ecke des Objektrahmens" #: ../src/display/snap-indicator.cpp:133 msgid "bounding box side" -msgstr "Rahmenseite" +msgstr "Kante des Objektrahmens" #: ../src/display/snap-indicator.cpp:136 msgid "page border" @@ -4758,11 +4757,11 @@ msgstr "Objekt-Drehpunkt" #: ../src/display/snap-indicator.cpp:148 msgid "bounding box side midpoint" -msgstr "Rahmenseiten-Mittelpunkt" +msgstr "Mittelpunkt der Objektrahmenlinie" #: ../src/display/snap-indicator.cpp:151 msgid "bounding box midpoint" -msgstr "Rahmen-Mittelpunkt" +msgstr "Mittelpunkt des Objektrahmens" #: ../src/display/snap-indicator.cpp:154 msgid "page corner" @@ -4794,19 +4793,19 @@ msgstr "erzwungen" #: ../src/display/snap-indicator.cpp:187 msgid "Bounding box corner" -msgstr "Rahmenecken" +msgstr "Ecke des Objektrahmens" #: ../src/display/snap-indicator.cpp:190 msgid "Bounding box midpoint" -msgstr "Mittelpunkt der Umrandung" +msgstr "Mittelpunkt des Objektrahmens" #: ../src/display/snap-indicator.cpp:193 msgid "Bounding box side midpoint" -msgstr "Mitte der Umrandungslinie" +msgstr "Mittelpunkt der Objektrahmenlinie" #: ../src/display/snap-indicator.cpp:196 ../src/ui/tool/node.cpp:1484 msgid "Smooth node" -msgstr "glatter Knoten" +msgstr "Glatter Knoten" #: ../src/display/snap-indicator.cpp:199 ../src/ui/tool/node.cpp:1483 msgid "Cusp node" @@ -4854,7 +4853,7 @@ msgstr "Ecken" #: ../src/display/snap-indicator.cpp:234 msgid "Text anchor" -msgstr "Text-anker" +msgstr "Textanker" #: ../src/display/snap-indicator.cpp:237 msgid "Multiple of grid spacing" @@ -5032,8 +5031,8 @@ msgid "" "this extension." msgstr "" "Für diese Erweiterung ist zur Zeit keine Hilfe verfügbar. Besuchen Sie die " -"Inkscape Webseite oder wenden Sie sich an die Mailing List wenn Sie Fragen " -"bezüglich dieser Erweiterung haben." +"Inkscape-Webseite oder wenden Sie sich an die Mailingliste, wenn Sie Fragen " +"zu dieser Erweiterung haben." #: ../src/extension/implementation/script.cpp:1063 msgid "" @@ -5154,7 +5153,7 @@ msgstr "Rauschen hinzufügen" #: ../share/extensions/jessyInk_transitions.inx.h:5 #: ../share/extensions/webslicer_create_rect.inx.h:14 msgid "Type:" -msgstr "Type:" +msgstr "Art:" #: ../src/extension/internal/bitmap/addNoise.cpp:48 msgid "Uniform Noise" @@ -5166,7 +5165,7 @@ msgstr "Gaußsches Rauschen" #: ../src/extension/internal/bitmap/addNoise.cpp:50 msgid "Multiplicative Gaussian Noise" -msgstr "Multiplikatives Gaußsches Rauschen " +msgstr "Multiplikatives Gaußsches Rauschen" #: ../src/extension/internal/bitmap/addNoise.cpp:51 msgid "Impulse Noise" @@ -5214,7 +5213,7 @@ msgstr "Sigma" #: ../src/extension/internal/bitmap/blur.cpp:47 msgid "Blur selected bitmap(s)" -msgstr "Gewählte(s) Bitmap(s) verunschärfen" +msgstr "Gewählte(s) Bitmap(s) unscharf machen" #: ../src/extension/internal/bitmap/channel.cpp:48 msgid "Channel" @@ -5315,7 +5314,7 @@ msgstr "Oben (px):" #: ../src/extension/internal/bitmap/crop.cpp:69 msgid "Bottom (px):" -msgstr "Unten (PX):" +msgstr "Unten (px):" #: ../src/extension/internal/bitmap/crop.cpp:70 msgid "Left (px):" @@ -5327,7 +5326,7 @@ msgstr "Rechts (px):" #: ../src/extension/internal/bitmap/crop.cpp:77 msgid "Crop selected bitmap(s)" -msgstr "Gewählte(s) Rastergrafik(en) beschneiden" +msgstr "Gewählte Rastergrafik(en) beschneiden" #: ../src/extension/internal/bitmap/cycleColormap.cpp:37 msgid "Cycle Colormap" @@ -5338,7 +5337,7 @@ msgstr "Rotiere Farbpalette" #: ../src/extension/internal/bitmap/unsharpmask.cpp:45 #: ../src/widgets/spray-toolbar.cpp:208 msgid "Amount:" -msgstr "Menge" +msgstr "Menge:" #: ../src/extension/internal/bitmap/cycleColormap.cpp:45 msgid "Cycle colormap(s) of selected bitmap(s)" @@ -5358,17 +5357,17 @@ msgstr "Kante" #: ../src/extension/internal/bitmap/edge.cpp:45 msgid "Highlight edges of selected bitmap(s)" -msgstr "Betone Kanten der ausgewählten Bilder." +msgstr "Betont Kanten der ausgewählten Bilder." #: ../src/extension/internal/bitmap/emboss.cpp:38 msgid "Emboss" -msgstr "Kanten hervorheben" +msgstr "Prägen" #: ../src/extension/internal/bitmap/emboss.cpp:47 msgid "Emboss selected bitmap(s); highlight edges with 3D effect" msgstr "" -"Kanten in Ausgewählten Bitmaps herausheben -- Hebt Kanten mit einem 3D-" -"Effekt hervor." +"Prägeeffekt für ausgewählte Rastergrafiken, hebt Kanten mit einem 3D-Effekt " +"hervor." #: ../src/extension/internal/bitmap/enhance.cpp:35 msgid "Enhance" @@ -5376,7 +5375,7 @@ msgstr "Entrauschen" #: ../src/extension/internal/bitmap/enhance.cpp:42 msgid "Enhance selected bitmap(s); minimize noise" -msgstr "Verbessert ausgewählte Bitmap(s) -- minimiert Rauschen." +msgstr "Verbessert ausgewählte Bitmap(s), minimiert Rauschen." #: ../src/extension/internal/bitmap/equalize.cpp:35 msgid "Equalize" @@ -5384,7 +5383,7 @@ msgstr "Ausgleichen" #: ../src/extension/internal/bitmap/equalize.cpp:42 msgid "Equalize selected bitmap(s); histogram equalization" -msgstr "Gleicht ausgewählte Bitmap(s) aus -- Ausgleich anhand des Histogramms." +msgstr "Gleicht ausgewählte Bitmap(s) aus, Ausgleich anhand des Histogramms." #: ../src/extension/internal/bitmap/gaussianBlur.cpp:38 #: ../src/filter-enums.cpp:29 @@ -5395,7 +5394,7 @@ msgstr "Gaußscher Weichzeichner" #: ../src/extension/internal/bitmap/implode.cpp:39 #: ../src/extension/internal/bitmap/solarize.cpp:41 msgid "Factor:" -msgstr "Faktor" +msgstr "Faktor:" #: ../src/extension/internal/bitmap/gaussianBlur.cpp:47 msgid "Gaussian blur selected bitmap(s)" @@ -5420,29 +5419,29 @@ msgstr "Ebene" #: ../src/extension/internal/bitmap/level.cpp:43 #: ../src/extension/internal/bitmap/levelChannel.cpp:65 msgid "Black Point:" -msgstr "Schwarzpunkt" +msgstr "Schwarzpunkt:" #: ../src/extension/internal/bitmap/level.cpp:44 #: ../src/extension/internal/bitmap/levelChannel.cpp:66 msgid "White Point:" -msgstr "Weißpunkt" +msgstr "Weißpunkt:" #: ../src/extension/internal/bitmap/level.cpp:45 #: ../src/extension/internal/bitmap/levelChannel.cpp:67 msgid "Gamma Correction:" -msgstr "Gammakorrektur" +msgstr "Gammakorrektur:" #: ../src/extension/internal/bitmap/level.cpp:51 msgid "" "Level selected bitmap(s) by scaling values falling between the given ranges " "to the full color range" msgstr "" -"Ausgewählte Bitmap(s) angleichen, in dem Werte im angegebenen Bereich auf " -"die volle Farbskala abgebildet werden" +"Ausgewählte Bitmap(s) angleichen, indem Werte im angegebenen Bereich auf die " +"volle Farbskala abgebildet werden" #: ../src/extension/internal/bitmap/levelChannel.cpp:52 msgid "Level (with Channel)" -msgstr "Ebene (mit Kanal)" +msgstr "Angleichen (mit Kanal)" #: ../src/extension/internal/bitmap/levelChannel.cpp:54 #: ../src/extension/internal/filter/color.h:711 @@ -5478,11 +5477,11 @@ msgstr "Farbton" #: ../src/extension/internal/bitmap/modulate.cpp:43 msgid "Saturation:" -msgstr "Sättigung" +msgstr "Sättigung:" #: ../src/extension/internal/bitmap/modulate.cpp:44 msgid "Brightness:" -msgstr "Glanz:" +msgstr "Helligkeit:" #: ../src/extension/internal/bitmap/modulate.cpp:50 msgid "" @@ -5495,7 +5494,7 @@ msgstr "Negativ" #: ../src/extension/internal/bitmap/negate.cpp:43 msgid "Negate (take inverse) selected bitmap(s)" -msgstr "Gewählte Bitmaps invertieren." +msgstr "Gewählte Bitmaps invertieren" #: ../src/extension/internal/bitmap/normalize.cpp:36 msgid "Normalize" @@ -5549,7 +5548,7 @@ msgstr "Angehoben" msgid "" "Alter lightness the edges of selected bitmap(s) to create a raised appearance" msgstr "" -"Helligkeit von Farbkanten in ausgewählten Bitmap(s) anpassen, um den " +"Helligkeit von Farbkanten in ausgewählten Bitmap(s) anpassen, um den " "Anschein herausgehobener Ecken zu erwecken." #: ../src/extension/internal/bitmap/reduceNoise.cpp:40 @@ -5585,11 +5584,11 @@ msgstr "Schattieren" #: ../src/extension/internal/bitmap/shade.cpp:42 msgid "Azimuth:" -msgstr "Azimut" +msgstr "Azimut:" #: ../src/extension/internal/bitmap/shade.cpp:43 msgid "Elevation:" -msgstr "Anhebung" +msgstr "Anhebung:" #: ../src/extension/internal/bitmap/shade.cpp:44 msgid "Colored Shading" @@ -5627,7 +5626,7 @@ msgstr "" #: ../src/extension/internal/bitmap/swirl.cpp:39 msgid "Degrees:" -msgstr "Grad" +msgstr "Grad:" #: ../src/extension/internal/bitmap/swirl.cpp:45 msgid "Swirl selected bitmap(s) around center point" @@ -5650,11 +5649,11 @@ msgstr "Schwellwert ausgewählter Bitmap(s)" #: ../src/extension/internal/bitmap/unsharpmask.cpp:41 msgid "Unsharp Mask" -msgstr "Unscharfe Maske" +msgstr "Unschärfemaske" #: ../src/extension/internal/bitmap/unsharpmask.cpp:52 msgid "Sharpen selected bitmap(s) using unsharp mask algorithms" -msgstr "Ausgewählte Bitmaps mittels Unscharfe-Maske-Algorithmen schärfen" +msgstr "Ausgewählte Bitmaps mittels Unschärfemaske-Algorithmen schärfen" #: ../src/extension/internal/bitmap/wave.cpp:38 msgid "Wave" @@ -5701,7 +5700,7 @@ msgstr "Aus Pfad erzeugen" #: ../src/extension/internal/cairo-ps-out.cpp:327 #: ../share/extensions/ps_input.inx.h:3 msgid "PostScript" -msgstr "Postscript" +msgstr "PostScript" #: ../src/extension/internal/cairo-ps-out.cpp:329 #: ../src/extension/internal/cairo-ps-out.cpp:371 @@ -5982,7 +5981,7 @@ msgstr "Diffuses Licht" #: ../src/extension/internal/filter/paint.h:89 #: ../src/extension/internal/filter/paint.h:340 msgid "Smoothness" -msgstr "Glattheit" +msgstr "Glättung" #: ../src/extension/internal/filter/bevels.h:56 #: ../src/extension/internal/filter/bevels.h:137 @@ -6149,7 +6148,7 @@ msgstr "Mischen:" #: ../src/extension/internal/filter/transparency.h:63 #: ../src/filter-enums.cpp:55 msgid "Darken" -msgstr "Verdunkeln" +msgstr "Abdunkeln" #: ../src/extension/internal/filter/blurs.h:193 #: ../src/extension/internal/filter/blurs.h:340 @@ -6166,7 +6165,7 @@ msgstr "Verdunkeln" #: ../src/extension/internal/filter/transparency.h:62 #: ../src/filter-enums.cpp:54 ../src/ui/dialog/input.cpp:382 msgid "Screen" -msgstr "Screen" +msgstr "Negativ multiplizieren" #: ../src/extension/internal/filter/blurs.h:194 #: ../src/extension/internal/filter/blurs.h:341 @@ -6199,7 +6198,7 @@ msgstr "Multiplizieren" #: ../src/extension/internal/filter/transparency.h:64 #: ../src/filter-enums.cpp:56 msgid "Lighten" -msgstr "Erhellen" +msgstr "Aufhellen" #: ../src/extension/internal/filter/blurs.h:204 msgid "Combine vertical and horizontal blur" @@ -6248,7 +6247,7 @@ msgstr "Hintergrundfarbe" #: ../src/extension/internal/filter/blurs.h:337 #: ../src/extension/internal/filter/bumps.h:129 msgid "Blend type:" -msgstr "Misch-Typ:" +msgstr "Mischmodus:" #: ../src/extension/internal/filter/blurs.h:338 #: ../src/extension/internal/filter/bumps.h:130 @@ -6272,7 +6271,7 @@ msgstr "Normal" #: ../src/extension/internal/filter/blurs.h:344 msgid "Blend to background" -msgstr "Mischen zum Hintergrund" +msgstr "Mit Hintergrund mischen" #: ../src/extension/internal/filter/blurs.h:354 msgid "Blur eroded by white or transparency" @@ -6638,7 +6637,7 @@ msgstr "Verschiebung (°)" #: ../src/extension/internal/filter/color.h:340 msgid "Rotate and desaturate hue" -msgstr "Farbton rotieren nud entsättigen" +msgstr "Farbton rotieren und entsättigen" #: ../src/extension/internal/filter/color.h:396 msgid "Harsh light" @@ -6997,7 +6996,7 @@ msgstr "Farbton verbessern" #: ../src/extension/internal/filter/color.h:1663 msgid "Phosphorescence" -msgstr "Phosphorisierend" +msgstr "Phosphoreszenz" #: ../src/extension/internal/filter/color.h:1664 msgid "Colored nights" @@ -7009,7 +7008,7 @@ msgstr "Farbton zu Hintergrund" #: ../src/extension/internal/filter/color.h:1667 msgid "Global blend:" -msgstr "Globales Mischen:" +msgstr "Mischmodus (global):" #: ../src/extension/internal/filter/color.h:1673 msgid "Glow" @@ -7017,7 +7016,7 @@ msgstr "Glühen" #: ../src/extension/internal/filter/color.h:1674 msgid "Glow blend:" -msgstr "Glühend " +msgstr "Mischmodus (Glühen):" #: ../src/extension/internal/filter/color.h:1679 msgid "Local light" @@ -7108,7 +7107,7 @@ msgstr "Vertikale Frequenz" #: ../src/extension/internal/filter/paint.h:95 #: ../src/extension/internal/filter/paint.h:697 msgid "Complexity" -msgstr "Kompexität" +msgstr "Komplexität" #: ../src/extension/internal/filter/distort.h:90 #: ../src/extension/internal/filter/distort.h:199 @@ -7166,7 +7165,7 @@ msgstr "Erkennen:" #: ../src/ui/dialog/template-load-tab.cpp:105 #: ../src/ui/dialog/template-load-tab.cpp:142 msgid "All" -msgstr "alles" +msgstr "Alles" #: ../src/extension/internal/filter/image.h:53 msgid "Vertical lines" @@ -7297,11 +7296,11 @@ msgstr "Glätten" #: ../src/extension/internal/filter/morphology.h:195 msgid "Fill opacity:" -msgstr "Deckkraft:" +msgstr "Deckkraft der Füllung:" #: ../src/extension/internal/filter/morphology.h:196 msgid "Stroke opacity:" -msgstr "Strich-Deckkraft:" +msgstr "Deckkraft der Kontur:" #: ../src/extension/internal/filter/morphology.h:206 msgid "Adds a colorizable outline" @@ -7352,7 +7351,7 @@ msgstr "Vertikale Frequenz:" #: ../src/extension/internal/filter/overlays.h:66 #: ../src/extension/internal/filter/textures.h:69 msgid "Complexity:" -msgstr "Kompexität:" +msgstr "Komplexität:" #: ../src/extension/internal/filter/overlays.h:67 #: ../src/extension/internal/filter/textures.h:70 @@ -7767,7 +7766,7 @@ msgstr "Globale Deckkraft" #: ../src/extension/internal/filter/transparency.h:218 msgid "Make the lightest parts of the object progressively transparent" -msgstr "Die hellsten Bereiche des Objekts werden fortschreitend transparenter " +msgstr "Die hellsten Bereiche des Objekts werden fortschreitend transparenter" #: ../src/extension/internal/filter/transparency.h:291 msgid "Set opacity and strength of opacity boundaries" @@ -7803,7 +7802,7 @@ msgid "" msgstr "" "Einbetten des Ergebnisses in eine eigenständige, größere SVG-Datei.Die " "Verknüpfung referenziert auf eine Datei außerhalb des SVG-Dokuments und alle " -"Dateien müssen an einer Stelle liegen. " +"Dateien müssen an einer Stelle liegen." #: ../src/extension/internal/gdkpixbuf-input.cpp:191 #: ../src/ui/dialog/inkscape-preferences.cpp:1498 @@ -8003,6 +8002,9 @@ msgstr "OpenDocument-Zeichnung (*.odg)" msgid "OpenDocument drawing file" msgstr "OpenDocument-Zeichnungsdatei" +# Deutsche Übersetzungen: +# http://www.cunodruck.de/files/downloads/PDF-Rahmen.pdf +# https://de.wikipedia.org/wiki/Portable_Document_Format#Angaben_der_Seitengeometrie #. 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:77 @@ -8019,7 +8021,7 @@ msgstr "Endformatrahmen" #: ../src/extension/internal/pdfinput/pdf-input.cpp:80 msgid "bleed box" -msgstr "Ausschnittrahmen" +msgstr "Anschnittrahmen" #: ../src/extension/internal/pdfinput/pdf-input.cpp:81 msgid "art box" @@ -8036,19 +8038,19 @@ msgstr "Seiteneinstellungen" #: ../src/extension/internal/pdfinput/pdf-input.cpp:129 msgid "Precision of approximating gradient meshes:" -msgstr "Präzision zur Annäherung an gradient meshes:" +msgstr "Präzision der Annäherung von Verlaufsgittern:" #: ../src/extension/internal/pdfinput/pdf-input.cpp:130 msgid "" "<b>Note</b>: setting the precision too high may result in a large SVG file " "and slow performance." msgstr "" -"<b>Hinweis</b>: Die Präzision zu hoch einzustellen kann zu einem großen SVG " -"und schlechter Leistung führen." +"<b>Hinweis</b>: Wird die Präzision zu hoch eingestellt, kann dies zu einer " +"großen SVG Datei und erhöhtem Ressourcenbedarf führen." #: ../src/extension/internal/pdfinput/pdf-input.cpp:134 msgid "Poppler/Cairo import" -msgstr "" +msgstr "Import mit Poppler/Cairo" #: ../src/extension/internal/pdfinput/pdf-input.cpp:135 msgid "" @@ -8056,11 +8058,13 @@ msgid "" "glyphs where each glyph is a path. Images are stored internally. Meshes " "cause entire document to be rendered as a raster image." msgstr "" +"Import durch externe Bibliothek. Text besteht aus Gruppen geklonter Zeichen, " +"jedes Zeichen ist ein Pfad. Bilder werden eingebettet gespeichert. Sind " +"Verlaufsgitter enthalten, wird das ganze Dokument als Rastergrafik gerendert." #: ../src/extension/internal/pdfinput/pdf-input.cpp:136 -#, fuzzy msgid "Internal import" -msgstr "Serieller Port:" +msgstr "Import mit interner Bibliothek" #: ../src/extension/internal/pdfinput/pdf-input.cpp:137 msgid "" @@ -8068,6 +8072,10 @@ msgid "" "white space is missing. Meshes are converted to tiles, the number depends on " "the precision set below." msgstr "" +"Import durch interne (von Poppler abgeleitete) Bibliothek. Text wird als " +"Text gespeichert, jedoch gehen Leerzeichen verloren. Verlaufsgitter werden " +"gekachelt dargestellt, die Anzahl der Kacheln wird duch die unten " +"eingestellte Präzision bestimmt." #: ../src/extension/internal/pdfinput/pdf-input.cpp:148 msgid "rough" @@ -8082,7 +8090,9 @@ msgstr "rau" #. Font option #: ../src/extension/internal/pdfinput/pdf-input.cpp:159 msgid "Replace PDF fonts by closest-named installed fonts" -msgstr "PDF-Fonts durch namenähnlichste installierte Fonts ersetzen" +msgstr "" +"Schriftarten im PDF durch installierte Schriftarten mit den ähnlichsten " +"Namen ersetzen" #: ../src/extension/internal/pdfinput/pdf-input.cpp:161 msgid "Embed images" @@ -8099,12 +8109,12 @@ msgstr "PDF-Importeinstellungen" #: ../src/extension/internal/pdfinput/pdf-input.cpp:437 msgctxt "PDF input precision" msgid "rough" -msgstr "rau" +msgstr "grob" #: ../src/extension/internal/pdfinput/pdf-input.cpp:438 msgctxt "PDF input precision" msgid "medium" -msgstr "Mittel" +msgstr "mittel" #: ../src/extension/internal/pdfinput/pdf-input.cpp:439 msgctxt "PDF input precision" @@ -9075,7 +9085,7 @@ msgstr "Standartpiktogramm" #: ../src/libgdl/gdl-dock-object.c:141 msgid "Stock icon for the dock object" -msgstr "Standardpiktogramm für das Dock-Objekt" +msgstr "Standardpiktogramm für das Dock-Objekt" #: ../src/libgdl/gdl-dock-object.c:147 msgid "Pixbuf Icon" @@ -9440,7 +9450,7 @@ msgstr "Ellipse durch 5 Punkte" #: ../src/live_effects/effect.cpp:147 msgid "Bounding Box" -msgstr "Rahmen" +msgstr "Objektrahmen" #: ../src/live_effects/effect.cpp:150 msgid "Lattice Deformation 2" @@ -9459,9 +9469,8 @@ msgid "Interpolate points" msgstr "Punkte interpolieren" #: ../src/live_effects/effect.cpp:154 -#, fuzzy msgid "Transform by 2 points" -msgstr "Farbverläufe transformieren" +msgstr "Transformation in 2 Punkten" #: ../src/live_effects/effect.cpp:361 msgid "Is visible?" @@ -9484,7 +9493,7 @@ msgstr "Kein Effekt" msgid "Please specify a parameter path for the LPE '%s' with %d mouse clicks" msgstr "" "Bitte spezifizieren Sie einen Parameterpfad für den Pfadeffekt \"%s\" mit %d " -"Mausklicks. " +"Mausklicks." #: ../src/live_effects/effect.cpp:761 #, c-format @@ -9503,7 +9512,7 @@ msgstr "Pfadanfang:" #: ../src/live_effects/lpe-attach-path.cpp:29 msgid "Path to attach to the start of this path" -msgstr "Pfad welcher an den Pfadanfang angeheftet wird" +msgstr "Pfad welcher an den Pfadanfang angeheftet wird" #: ../src/live_effects/lpe-attach-path.cpp:30 msgid "Start path position:" @@ -9609,11 +9618,11 @@ msgstr "Pfad von dem die Orginal-Pfaddaten genommen werden" #: ../src/live_effects/lpe-bounding-box.cpp:25 msgid "Visual Bounds" -msgstr "Sichtbarer Rahmen" +msgstr "Visueller Rahmen" #: ../src/live_effects/lpe-bounding-box.cpp:25 msgid "Uses the visual bounding box" -msgstr "Benutzt die sichtbare Umrandung" +msgstr "Verwendet den visuellen Objektrahmen" #: ../src/live_effects/lpe-bspline.cpp:30 msgid "Steps with CTRL:" @@ -9621,7 +9630,7 @@ msgstr "Schritte mit STRG:" #: ../src/live_effects/lpe-bspline.cpp:30 msgid "Change number of steps with CTRL pressed" -msgstr "Ändere ANzahl der Schritte mit STRG gedrückt" +msgstr "Ändere Anzahl der Schritte mit STRG gedrückt" #: ../src/live_effects/lpe-bspline.cpp:31 #: ../src/live_effects/lpe-simplify.cpp:33 @@ -9636,11 +9645,11 @@ msgstr "Größe des Helfers" #: ../src/live_effects/lpe-bspline.cpp:32 msgid "Apply changes if weight = 0%" -msgstr "" +msgstr "Änderungen anwenden, wenn Gewichtung = 0%" #: ../src/live_effects/lpe-bspline.cpp:33 msgid "Apply changes if weight > 0%" -msgstr "" +msgstr "Änderungen anwenden, wenn Gewichtung > 0%" #: ../src/live_effects/lpe-bspline.cpp:34 #: ../src/live_effects/lpe-fillet-chamfer.cpp:56 @@ -9648,12 +9657,10 @@ msgid "Change only selected nodes" msgstr "Nur ausgewählte Knoten ändern" #: ../src/live_effects/lpe-bspline.cpp:35 -#, fuzzy msgid "Change weight %:" -msgstr "Gewichtung ändern:" +msgstr "Gewichtung ändern %:" #: ../src/live_effects/lpe-bspline.cpp:35 -#, fuzzy msgid "Change weight percent of the effect" msgstr "Ändert die Gewichtung des Effekts" @@ -9666,14 +9673,12 @@ msgid "Make cusp" msgstr "Spitzen generieren" #: ../src/live_effects/lpe-bspline.cpp:148 -#, fuzzy msgid "Change to default weight" -msgstr "Normale Gewichtung" +msgstr "Gewichtung auf den Standard setzen" #: ../src/live_effects/lpe-bspline.cpp:154 -#, fuzzy msgid "Change to 0 weight" -msgstr "Gewichtung ändern:" +msgstr "Gewichtung auf 0 setzen" #: ../src/live_effects/lpe-bspline.cpp:160 #: ../src/live_effects/lpe-fillet-chamfer.cpp:232 @@ -9725,8 +9730,9 @@ msgid "" "& outside the guide path" msgstr "" "Mittlere Größe der Abstände, um die die Startpunkte der Kopien inner- und " -"ausserhalb des Pfades versetzt werden." +"außerhalb des Pfades versetzt werden." +# Falschrum? Ausprobieren... Abweichung der Start-Abstände vielleicht? #: ../src/live_effects/lpe-curvestitch.cpp:44 msgid "Sta_rt spacing variance:" msgstr "Start der Abstands-Abweichung" @@ -9739,6 +9745,7 @@ msgstr "" "Mittlere Größe der Abstände, um die die Startpunkte der Kopien entlang des " "Führungspfades versetzt werden." +# Falschrum? Ausprobieren... Abweichung der End-Kante vielleicht? #: ../src/live_effects/lpe-curvestitch.cpp:45 msgid "End ed_ge variance:" msgstr "Ende der Kanten Abweichung" @@ -9751,6 +9758,7 @@ msgstr "" "Mittlere Größe der Abstände, um die die Endpunkte der Kopien inner- und " "außerhalb des Führungspfades versetzt werden." +# Falschrum? Ausprobieren... Abweichung der End-Abstände vielleicht? #: ../src/live_effects/lpe-curvestitch.cpp:46 msgid "End spa_cing variance:" msgstr "Ende der Abstands-Abweichung" @@ -9781,7 +9789,7 @@ msgstr "Skalieren der Breite des Stichpfades relativ zu seiner Länge" #: ../src/live_effects/lpe-ellipse_5pts.cpp:77 msgid "Five points required for constructing an ellipse" -msgstr "" +msgstr "Zur Konstruktion einer Ellipse werden fünf Punkte benötigt" #: ../src/live_effects/lpe-ellipse_5pts.cpp:162 msgid "No ellipse found for specified points" @@ -9878,7 +9886,7 @@ msgstr "Bézierkurven erzwingen" #: ../src/live_effects/lpe-fillet-chamfer.cpp:53 msgid "Fillet point" -msgstr "" +msgstr "Abrundungspunkt" #: ../src/live_effects/lpe-fillet-chamfer.cpp:54 msgid "Hide knots" @@ -9949,24 +9957,21 @@ msgid "Inverse chamfer" msgstr "Invertierte Fasung" #: ../src/live_effects/lpe-fillet-chamfer.cpp:239 -#, fuzzy msgid "Convert to fillet" -msgstr "Umwandeln in Blindenschrift" +msgstr "Umwandeln in Abrundung" #: ../src/live_effects/lpe-fillet-chamfer.cpp:246 #: ../src/live_effects/lpe-fillet-chamfer.cpp:270 -#, fuzzy msgid "Convert to inverse fillet" -msgstr "Umwandeln in Blindenschrift" +msgstr "Umwandeln in invertierte Abrundung" #: ../src/live_effects/lpe-fillet-chamfer.cpp:262 -#, fuzzy msgid "Convert to chamfer" -msgstr "Umwandeln in Blindenschrift" +msgstr "Umwandeln in Fasung" #: ../src/live_effects/lpe-fillet-chamfer.cpp:282 msgid "Knots and helper paths refreshed" -msgstr "" +msgstr "Knoten und Hilfspfade aktualisiert" #: ../src/live_effects/lpe-gears.cpp:214 msgid "_Teeth:" @@ -10048,7 +10053,7 @@ msgid "" "stroke width along the path" msgstr "" "Legt fest, welche Art von Interpolator für die Interpolation zwischen " -"Strichstärke entlang des Pfades verwendet weden" +"Strichstärken entlang des Pfades verwendet wird" #: ../src/live_effects/lpe-jointype.cpp:31 #: ../src/live_effects/lpe-powerstroke.cpp:166 @@ -10078,7 +10083,7 @@ msgstr "Gehrungslimit" #: ../src/live_effects/lpe-jointype.cpp:35 #: ../src/live_effects/lpe-powerstroke.cpp:169 msgid "Extrapolated arc" -msgstr "Abgeleiteter Bogen" +msgstr "Abgeleitete Kurve" #: ../src/live_effects/lpe-jointype.cpp:39 #: ../src/live_effects/lpe-powerstroke.cpp:149 @@ -10219,6 +10224,8 @@ msgstr "Anfasser 0:" #: ../src/live_effects/lpe-lattice2.cpp:49 msgid "Control 0 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes" msgstr "" +"Anfasser 0 - <b>Strg+Alt+Klick</b>: zurücksetzen, <b>Ctrl</b>: nur entlang " +"Hauptachsen verschieben" #: ../src/live_effects/lpe-lattice2.cpp:50 msgid "Control 1:" @@ -10227,6 +10234,8 @@ msgstr "Anfasser 1:" #: ../src/live_effects/lpe-lattice2.cpp:50 msgid "Control 1 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes" msgstr "" +"Anfasser 1 - <b>Strg+Alt+Klick</b>: zurücksetzen, <b>Ctrl</b>: nur entlang " +"Hauptachsen verschieben" #: ../src/live_effects/lpe-lattice2.cpp:51 msgid "Control 2:" @@ -10235,6 +10244,8 @@ msgstr "Anfasser 2:" #: ../src/live_effects/lpe-lattice2.cpp:51 msgid "Control 2 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes" msgstr "" +"Anfasser 2 - <b>Strg+Alt+Klick</b>: zurücksetzen, <b>Ctrl</b>: nur entlang " +"Hauptachsen verschieben" #: ../src/live_effects/lpe-lattice2.cpp:52 msgid "Control 3:" @@ -10243,6 +10254,8 @@ msgstr "Anfasser 3:" #: ../src/live_effects/lpe-lattice2.cpp:52 msgid "Control 3 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes" msgstr "" +"Anfasser 3 - <b>Strg+Alt+Klick</b>: zurücksetzen, <b>Ctrl</b>: nur entlang " +"Hauptachsen verschieben" #: ../src/live_effects/lpe-lattice2.cpp:53 msgid "Control 4:" @@ -10251,6 +10264,8 @@ msgstr "Anfasser 4:" #: ../src/live_effects/lpe-lattice2.cpp:53 msgid "Control 4 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes" msgstr "" +"Anfasser 4 - <b>Strg+Alt+Klick</b>: zurücksetzen, <b>Ctrl</b>: nur entlang " +"Hauptachsen verschieben" #: ../src/live_effects/lpe-lattice2.cpp:54 msgid "Control 5:" @@ -10259,6 +10274,8 @@ msgstr "Anfasser 5:" #: ../src/live_effects/lpe-lattice2.cpp:54 msgid "Control 5 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes" msgstr "" +"Anfasser 5 - <b>Strg+Alt+Klick</b>: zurücksetzen, <b>Ctrl</b>: nur entlang " +"Hauptachsen verschieben" #: ../src/live_effects/lpe-lattice2.cpp:55 msgid "Control 6:" @@ -10267,6 +10284,8 @@ msgstr "Anfasser 6:" #: ../src/live_effects/lpe-lattice2.cpp:55 msgid "Control 6 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes" msgstr "" +"Anfasser 6 - <b>Strg+Alt+Klick</b>: zurücksetzen, <b>Ctrl</b>: nur entlang " +"Hauptachsen verschieben" #: ../src/live_effects/lpe-lattice2.cpp:56 msgid "Control 7:" @@ -10275,6 +10294,8 @@ msgstr "Anfasser 7:" #: ../src/live_effects/lpe-lattice2.cpp:56 msgid "Control 7 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes" msgstr "" +"Anfasser 7 - <b>Strg+Alt+Klick</b>: zurücksetzen, <b>Ctrl</b>: nur entlang " +"Hauptachsen verschieben" #: ../src/live_effects/lpe-lattice2.cpp:57 msgid "Control 8x9:" @@ -10284,6 +10305,8 @@ msgstr "Anfasser 8x9:" msgid "" "Control 8x9 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes" msgstr "" +"Anfasser 8x9 - <b>Strg+Alt+Klick</b>: zurücksetzen, <b>Ctrl</b>: nur entlang " +"Hauptachsen verschieben" #: ../src/live_effects/lpe-lattice2.cpp:58 msgid "Control 10x11:" @@ -10293,6 +10316,8 @@ msgstr "Anfasser 10x11:" msgid "" "Control 10x11 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes" msgstr "" +"Anfasser 10x11 - <b>Strg+Alt+Klick</b>: zurücksetzen, <b>Ctrl</b>: nur " +"entlang Hauptachsen verschieben" #: ../src/live_effects/lpe-lattice2.cpp:59 msgid "Control 12:" @@ -10301,6 +10326,8 @@ msgstr "Anfasser 12:" #: ../src/live_effects/lpe-lattice2.cpp:59 msgid "Control 12 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes" msgstr "" +"Anfasser 12 - <b>Strg+Alt+Klick</b>: zurücksetzen, <b>Ctrl</b>: nur entlang " +"Hauptachsen verschieben" #: ../src/live_effects/lpe-lattice2.cpp:60 msgid "Control 13:" @@ -10309,6 +10336,8 @@ msgstr "Anfasser 13:" #: ../src/live_effects/lpe-lattice2.cpp:60 msgid "Control 13 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes" msgstr "" +"Anfasser 13 - <b>Strg+Alt+Klick</b>: zurücksetzen, <b>Ctrl</b>: nur entlang " +"Hauptachsen verschieben" #: ../src/live_effects/lpe-lattice2.cpp:61 msgid "Control 14:" @@ -10317,6 +10346,8 @@ msgstr "Anfasser 14:" #: ../src/live_effects/lpe-lattice2.cpp:61 msgid "Control 14 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes" msgstr "" +"Anfasser 14 - <b>Strg+Alt+Klick</b>: zurücksetzen, <b>Ctrl</b>: nur entlang " +"Hauptachsen verschieben" #: ../src/live_effects/lpe-lattice2.cpp:62 msgid "Control 15:" @@ -10325,6 +10356,8 @@ msgstr "Anfasser 15:" #: ../src/live_effects/lpe-lattice2.cpp:62 msgid "Control 15 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes" msgstr "" +"Anfasser 15 - <b>Strg+Alt+Klick</b>: zurücksetzen, <b>Ctrl</b>: nur entlang " +"Hauptachsen verschieben" #: ../src/live_effects/lpe-lattice2.cpp:63 msgid "Control 16:" @@ -10333,6 +10366,8 @@ msgstr "Anfasser 16:" #: ../src/live_effects/lpe-lattice2.cpp:63 msgid "Control 16 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes" msgstr "" +"Anfasser 16 - <b>Strg+Alt+Klick</b>: zurücksetzen, <b>Ctrl</b>: nur entlang " +"Hauptachsen verschieben" #: ../src/live_effects/lpe-lattice2.cpp:64 msgid "Control 17:" @@ -10341,6 +10376,8 @@ msgstr "Anfasser 17:" #: ../src/live_effects/lpe-lattice2.cpp:64 msgid "Control 17 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes" msgstr "" +"Anfasser 17 - <b>Strg+Alt+Klick</b>: zurücksetzen, <b>Ctrl</b>: nur entlang " +"Hauptachsen verschieben" #: ../src/live_effects/lpe-lattice2.cpp:65 msgid "Control 18:" @@ -10349,6 +10386,8 @@ msgstr "Anfasser 18:" #: ../src/live_effects/lpe-lattice2.cpp:65 msgid "Control 18 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes" msgstr "" +"Anfasser 18 - <b>Strg+Alt+Klick</b>: zurücksetzen, <b>Ctrl</b>: nur entlang " +"Hauptachsen verschieben" #: ../src/live_effects/lpe-lattice2.cpp:66 msgid "Control 19:" @@ -10357,6 +10396,8 @@ msgstr "Anfasser 19:" #: ../src/live_effects/lpe-lattice2.cpp:66 msgid "Control 19 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes" msgstr "" +"Anfasser 19 - <b>Strg+Alt+Klick</b>: zurücksetzen, <b>Ctrl</b>: nur entlang " +"Hauptachsen verschieben" #: ../src/live_effects/lpe-lattice2.cpp:67 msgid "Control 20x21:" @@ -10366,6 +10407,8 @@ msgstr "Anfasser 20x21:" msgid "" "Control 20x21 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes" msgstr "" +"Anfasser 20x21 - <b>Strg+Alt+Klick</b>: zurücksetzen, <b>Ctrl</b>: nur " +"entlang Hauptachsen verschieben" #: ../src/live_effects/lpe-lattice2.cpp:68 msgid "Control 22x23:" @@ -10375,6 +10418,8 @@ msgstr "Anfasser 22x23:" msgid "" "Control 22x23 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes" msgstr "" +"Anfasser 22x23 - <b>Strg+Alt+Klick</b>: zurücksetzen, <b>Ctrl</b>: nur " +"entlang Hauptachsen verschieben" #: ../src/live_effects/lpe-lattice2.cpp:69 msgid "Control 24x26:" @@ -10384,6 +10429,8 @@ msgstr "Anfasser 24x26:" msgid "" "Control 24x26 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes" msgstr "" +"Anfasser 24x26 - <b>Strg+Alt+Klick</b>: zurücksetzen, <b>Ctrl</b>: nur " +"entlang Hauptachsen verschieben" #: ../src/live_effects/lpe-lattice2.cpp:70 msgid "Control 25x27:" @@ -10393,6 +10440,8 @@ msgstr "Anfasser 25x27:" msgid "" "Control 25x27 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes" msgstr "" +"Anfasser 25x27 - <b>Strg+Alt+Klick</b>: zurücksetzen, <b>Ctrl</b>: nur " +"entlang Hauptachsen verschieben" #: ../src/live_effects/lpe-lattice2.cpp:71 msgid "Control 28x30:" @@ -10402,6 +10451,8 @@ msgstr "Anfasser 28x30:" msgid "" "Control 28x30 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes" msgstr "" +"Anfasser 28x30 - <b>Strg+Alt+Klick</b>: zurücksetzen, <b>Ctrl</b>: nur " +"entlang Hauptachsen verschieben" #: ../src/live_effects/lpe-lattice2.cpp:72 msgid "Control 29x31:" @@ -10411,6 +10462,8 @@ msgstr "Anfasser 29x31:" msgid "" "Control 29x31 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes" msgstr "" +"Anfasser 29x31 - <b>Strg+Alt+Klick</b>: zurücksetzen, <b>Ctrl</b>: nur " +"entlang Hauptachsen verschieben" #: ../src/live_effects/lpe-lattice2.cpp:73 msgid "Control 32x33x34x35:" @@ -10421,6 +10474,8 @@ msgid "" "Control 32x33x34x35 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along " "axes" msgstr "" +"Anfasser 32x33x34x35 - <b>Strg+Alt+Klick</b>: zurücksetzen, <b>Ctrl</b>: nur " +"entlang Hauptachsen verschieben" #: ../src/live_effects/lpe-lattice2.cpp:236 msgid "Reset grid" @@ -10558,6 +10613,8 @@ msgstr "Oben Links" #: ../src/live_effects/lpe-perspective-envelope.cpp:46 msgid "Top Left - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes" msgstr "" +"Links oben - <b>Strg+Alt+Klick</b>: zurücksetzen, <b>Ctrl</b>: nur entlang " +"Hauptachsen verschieben" #: ../src/live_effects/lpe-perspective-envelope.cpp:47 msgid "Top Right" @@ -10566,6 +10623,8 @@ msgstr "Oben Rechts" #: ../src/live_effects/lpe-perspective-envelope.cpp:47 msgid "Top Right - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes" msgstr "" +"Rechts oben - <b>Strg+Alt+Klick</b>: zurücksetzen, <b>Ctrl</b>: nur entlang " +"Hauptachsen verschieben" #: ../src/live_effects/lpe-perspective-envelope.cpp:48 msgid "Down Left" @@ -10574,6 +10633,8 @@ msgstr "Unten Links" #: ../src/live_effects/lpe-perspective-envelope.cpp:48 msgid "Down Left - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes" msgstr "" +"Links unten - <b>Strg+Alt+Klick</b>: zurücksetzen, <b>Ctrl</b>: nur entlang " +"Hauptachsen verschieben" #: ../src/live_effects/lpe-perspective-envelope.cpp:49 msgid "Down Right" @@ -10582,6 +10643,8 @@ msgstr "Unten Rechts" #: ../src/live_effects/lpe-perspective-envelope.cpp:49 msgid "Down Right - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes" msgstr "" +"Rechts unten - <b>Strg+Alt+Klick</b>: zurücksetzen, <b>Ctrl</b>: nur entlang " +"Hauptachsen verschieben" #: ../src/live_effects/lpe-perspective-envelope.cpp:268 msgid "Handles:" @@ -10589,23 +10652,22 @@ msgstr "Anfasser:" #: ../src/live_effects/lpe-powerstroke.cpp:132 msgid "CubicBezierSmooth" -msgstr "" +msgstr "CubicBezierSmooth" #: ../src/live_effects/lpe-powerstroke.cpp:151 #: ../share/extensions/gcodetools_prepare_path_for_plasma.inx.h:13 msgid "Round" -msgstr "Abrunden" +msgstr "Rundung" #: ../src/live_effects/lpe-powerstroke.cpp:153 msgid "Zero width" -msgstr "Null-Breite" +msgstr "Nullbreite" #: ../src/live_effects/lpe-powerstroke.cpp:171 #: ../src/widgets/pencil-toolbar.cpp:115 msgid "Spiro" -msgstr "Spirale" +msgstr "Spiro" -# !!! verb or noun? #: ../src/live_effects/lpe-powerstroke.cpp:177 msgid "Offset points" msgstr "Versatzpunkte" @@ -10616,29 +10678,28 @@ msgstr "Punkte sortieren" #: ../src/live_effects/lpe-powerstroke.cpp:178 msgid "Sort offset points according to their time value along the curve" -msgstr "" -"Sortiert versetzte Punkte entsprechend ihres Zeitwertes entlang der Kurve" +msgstr "Sortiert Versatzpunkte entsprechend ihres Zeitwertes entlang der Kurve" #: ../src/live_effects/lpe-powerstroke.cpp:180 #: ../share/extensions/fractalize.inx.h:3 msgid "Smoothness:" -msgstr "Glattheit:" +msgstr "Glättung:" #: ../src/live_effects/lpe-powerstroke.cpp:180 msgid "" "Sets the smoothness for the CubicBezierJohan interpolator; 0 = linear " "interpolation, 1 = smooth" msgstr "" -"Setzt die Weichheit für den CubicBezierJohan-Interpolator; 0 = Lineare " -"Interpolation, 1 = weich" +"Setzt die Glättung für den CubicBezierJohan Interpolator; 0 = lineare " +"Interpolation, 1 = abgerundet" #: ../src/live_effects/lpe-powerstroke.cpp:181 msgid "Start cap:" -msgstr "Anfang:" +msgstr "Abschluss Pfadanfang:" #: ../src/live_effects/lpe-powerstroke.cpp:181 msgid "Determines the shape of the path's start" -msgstr "Bestimmt die Form des Pfad-Start" +msgstr "Bestimmt die Form des Pfadanfangs" #: ../src/live_effects/lpe-powerstroke.cpp:183 #: ../src/widgets/stroke-style.cpp:278 @@ -10647,11 +10708,11 @@ msgstr "Maximale Länge der Gehrung (in Vielfachen der Konturlinienbreite)" #: ../src/live_effects/lpe-powerstroke.cpp:184 msgid "End cap:" -msgstr "Ende:" +msgstr "Abschluss Pfadende:" #: ../src/live_effects/lpe-powerstroke.cpp:184 msgid "Determines the shape of the path's end" -msgstr "Bestimmt die Form des Pfad-Endes" +msgstr "Bestimmt die Form des Pfadendes" #: ../src/live_effects/lpe-rough-hatches.cpp:225 msgid "Frequency randomness:" @@ -10672,14 +10733,14 @@ msgstr "Zunahme des Abstands zwischen den Strichen" #. FIXME: top/bottom names are inverted in the UI/svg and in the code!! #: ../src/live_effects/lpe-rough-hatches.cpp:228 msgid "Half-turns smoothness: 1st side, in:" -msgstr "Weichheit der Umkehrpunkte: 1. Seite, einlaufend:" +msgstr "Glättung der Umkehrpunkte: 1. Seite, einlaufend:" #: ../src/live_effects/lpe-rough-hatches.cpp:228 msgid "" "Set smoothness/sharpness of path when reaching a 'bottom' half-turn. " "0=sharp, 1=default" msgstr "" -"Wählt Glattheit des Pfades bei Einlaufen in \"unteren\" Wendepunkt. 0=spitz, " +"Wählt Glättung des Pfades bei Einlaufen in \"unteren\" Wendepunkt. 0=spitz, " "1=Standard" #: ../src/live_effects/lpe-rough-hatches.cpp:229 @@ -10691,8 +10752,8 @@ msgid "" "Set smoothness/sharpness of path when leaving a 'bottom' half-turn. 0=sharp, " "1=default" msgstr "" -"Wählt Glattheit des Pfades bei Auslaufen aus \"unterem\" Wendepunkt. " -"0=spitz, 1=Standard" +"Wählt Glättung des Pfades bei Auslaufen aus \"unterem\" Wendepunkt. 0=spitz, " +"1=Standard" #: ../src/live_effects/lpe-rough-hatches.cpp:230 msgid "2nd side, in:" @@ -10703,7 +10764,7 @@ msgid "" "Set smoothness/sharpness of path when reaching a 'top' half-turn. 0=sharp, " "1=default" msgstr "" -"Wählt Glattheit des Pfades bei Einlaufen in \"oberen\" Wendepunkt. 0=spitz, " +"Wählt Glättung des Pfades bei Einlaufen in \"oberen\" Wendepunkt. 0=spitz, " "1=Standard" #: ../src/live_effects/lpe-rough-hatches.cpp:231 @@ -10715,7 +10776,7 @@ msgid "" "Set smoothness/sharpness of path when leaving a 'top' half-turn. 0=sharp, " "1=default" msgstr "" -"Wählt Glattheit des Pfades bei Auslaufen aus \"oberen\" Wendepunkt. 0=spitz, " +"Wählt Glättung des Pfades bei Auslaufen aus \"oberen\" Wendepunkt. 0=spitz, " "1=Standard" #: ../src/live_effects/lpe-rough-hatches.cpp:232 @@ -10766,11 +10827,11 @@ msgstr "Varianz: 1. Seite:" #: ../src/live_effects/lpe-rough-hatches.cpp:236 msgid "Randomness of 'bottom' half-turns smoothness" -msgstr "Zufall in der Glattheit \"unterer\" Wendepunkte" +msgstr "Zufall in der Glättung \"unterer\" Wendepunkte" #: ../src/live_effects/lpe-rough-hatches.cpp:237 msgid "Randomness of 'top' half-turns smoothness" -msgstr "Zufall in der Glattheit \"oberer\" Wendepunkte" +msgstr "Zufall in der Glättung \"oberer\" Wendepunkte" #. #: ../src/live_effects/lpe-rough-hatches.cpp:239 @@ -11158,7 +11219,7 @@ msgstr "Konstruktionslinien:" #: ../src/live_effects/lpe-sketch.cpp:57 msgid "How many construction lines (tangents) to draw" -msgstr "Wie viele Konstruktionslinien (Tangenten) gezeichnet werden sollen" +msgstr "Wie viele Konstruktionslinien (Tangenten) gezeichnet werden sollen" #: ../src/live_effects/lpe-sketch.cpp:58 #: ../src/ui/dialog/filter-effects-dialog.cpp:2892 @@ -11302,9 +11363,8 @@ msgid "Lock lenght to current distance" msgstr "Sperren oder Entsperren der aktuellen Ebene" #: ../src/live_effects/lpe-transform_2pts.cpp:34 -#, fuzzy msgid "Lock angle" -msgstr "Kegelwinkel" +msgstr "Winkel sperren" #: ../src/live_effects/lpe-transform_2pts.cpp:35 #, fuzzy @@ -11421,7 +11481,7 @@ msgstr "" #. FIXME: a path is used here instead of 2 points to work around path/point param incompatibility bug. #: ../src/live_effects/lpe-vonkoch.cpp:55 msgid "_Max complexity:" -msgstr "_Maximale Kompexität:" +msgstr "_Maximale Komplexität:" #: ../src/live_effects/lpe-vonkoch.cpp:55 msgid "Disable effect if the output is too complex" @@ -11789,7 +11849,7 @@ msgstr "Dokument in eine Windows-Metadatei (WMF) exportieren" #: ../src/main.cpp:439 msgid "Convert text object to paths on export (PS, EPS, PDF, SVG)" -msgstr "Textelemente beim Export (PS, EPS, PDF, SVG) in Pfade umwandeln " +msgstr "Textelemente beim Export (PS, EPS, PDF, SVG) in Pfade umwandeln" #: ../src/main.cpp:444 msgid "" @@ -12257,7 +12317,7 @@ msgstr "Eine eindeutige Referenz auf die Quelle im angegebenen Kontext" #: ../src/rdf.cpp:262 msgid "A related resource from which the described resource is derived" -msgstr "Die ürsprüngliche Quelle aus welcher der Inhalt entnommen ist " +msgstr "Die ürsprüngliche Quelle aus welcher der Inhalt entnommen ist" #: ../src/rdf.cpp:264 msgid "Relation:" @@ -13683,8 +13743,7 @@ msgstr "Verteilen" #: ../src/ui/dialog/align-and-distribute.cpp:417 msgid "Minimum horizontal gap (in px units) between bounding boxes" -msgstr "" -"Minimaler horizontaler Abstand (in px-Einheiten) zwischen Umrandungsboxen" +msgstr "Minimaler horizontaler Abstand (in px-Einheiten) zwischen Objektrahmen" #. TRANSLATORS: "H:" stands for horizontal gap #: ../src/ui/dialog/align-and-distribute.cpp:419 @@ -13694,8 +13753,7 @@ msgstr "_H:" #: ../src/ui/dialog/align-and-distribute.cpp:427 msgid "Minimum vertical gap (in px units) between bounding boxes" -msgstr "" -"Minimaler vertikaler Abstand (in px-Einheiten) zwischen Umrandungsboxen" +msgstr "Minimaler vertikaler Abstand (in px-Einheiten) zwischen Objektrahmen" #. TRANSLATORS: Vertical gap #: ../src/ui/dialog/align-and-distribute.cpp:429 @@ -13881,7 +13939,7 @@ msgid "" "Move objects as little as possible so that their bounding boxes do not " "overlap" msgstr "" -"Objekte gerade so weit bewegen, dass sich ihre Umrandungsboxen nicht mehr " +"Objekte gerade so weit bewegen, dass sich ihre Objektrahmen nicht mehr " "überlappen" #: ../src/ui/dialog/align-and-distribute.cpp:980 @@ -15716,7 +15774,8 @@ msgid "" "light source and the point to which it is pointing at) and the spot light " "cone. No light is projected outside this cone." msgstr "" -"Öffnungswinkel des Lichtkonus. Außerhalb des Konus gibt es kein Licht. " +"Öffnungswinkel des Lichtkonus (gemessen vom Zentralstrahl zum Rand). Kein " +"Licht fällt außerhalb der Grenzen dieses Kegels." #: ../src/ui/dialog/filter-effects-dialog.cpp:1275 msgid "New light source" @@ -16197,7 +16256,7 @@ msgstr "" "Weichzeichnen, Schärfen, Prägen und Kantenerkennung. Achtung: Zwar kann der " "gleiche Effekt wie mit dem Gaußschen Weichzeichner erreicht werden, " "allerdings ist der spezialisierte Effekt schneller und von der Auflösung " -"unabhängig. " +"unabhängig." #: ../src/ui/dialog/filter-effects-dialog.cpp:2982 msgid "" @@ -17012,7 +17071,7 @@ msgstr "Kyrillisch Ergänzend" #: ../src/ui/dialog/glyphs.cpp:167 msgid "Arabic Supplement" -msgstr "Arabisch Ergänzend" +msgstr "Arabisch Ergänzend" #: ../src/ui/dialog/glyphs.cpp:169 msgid "NKo" @@ -17544,7 +17603,7 @@ msgid "" "Whether selected objects display a selection cue (the same as in selector)" msgstr "" "Sind die ausgewählten Objekte visuell hervorgehoben (wie beim " -"Auswahlwerkzeug) " +"Auswahlwerkzeug)" #: ../src/ui/dialog/inkscape-preferences.cpp:190 msgid "Enable gradient editing" @@ -17556,7 +17615,7 @@ msgstr "Ausgewählten Objekte zeigen Farbverlaufs-Anfasser an" #: ../src/ui/dialog/inkscape-preferences.cpp:196 msgid "Conversion to guides uses edges instead of bounding box" -msgstr "Umwandlung zu Hilfslinien nutzt Ecken anstelle von Umrandungsboxen" +msgstr "Umwandlung zu Hilfslinien nutzt Ecken anstelle von Objektrahmen" #: ../src/ui/dialog/inkscape-preferences.cpp:197 msgid "" @@ -17564,7 +17623,7 @@ msgid "" "(imitating the object's shape), not along the bounding box" msgstr "" "Wird ein Objekt zu Hilfslinien umgewandelt, so gelten die tatsächlichen " -"Umrisse des Objekts, nicht die rechteckige Umrandung." +"Umrisse des Objekts, nicht der Objektrahmen." #: ../src/ui/dialog/inkscape-preferences.cpp:204 msgid "Ctrl+click _dot size:" @@ -17637,25 +17696,25 @@ msgstr "Werkzeuge" #: ../src/ui/dialog/inkscape-preferences.cpp:306 msgid "Bounding box to use" -msgstr "Zu verwendender Rahmen" +msgstr "Zu verwendender Objektrahmen" #: ../src/ui/dialog/inkscape-preferences.cpp:307 msgid "Visual bounding box" -msgstr "Visuelle Rahmen" +msgstr "Visueller Objektrahmen" #: ../src/ui/dialog/inkscape-preferences.cpp:309 msgid "This bounding box includes stroke width, markers, filter margins, etc." msgstr "" -"Dieser Rahmen berücksichtigt Strichbreiten, Knotenmarkierungen, Filterränder " -"usw." +"Dieser Objektrahmen berücksichtigt Strichbreiten, Knotenmarkierungen, " +"Filterränder usw." #: ../src/ui/dialog/inkscape-preferences.cpp:310 msgid "Geometric bounding box" -msgstr "Geometrischer Rahmen" +msgstr "Geometrischer Objektrahmen" #: ../src/ui/dialog/inkscape-preferences.cpp:312 msgid "This bounding box includes only the bare path" -msgstr "Dieser Rahmen berücksichtigt nur den reinen Pfad" +msgstr "Dieser Objektrahmen berücksichtigt nur den reinen Pfad" #: ../src/ui/dialog/inkscape-preferences.cpp:314 msgid "Conversion to guides" @@ -17749,12 +17808,11 @@ msgstr "" #: ../src/ui/dialog/inkscape-preferences.cpp:347 msgid "Box" -msgstr "Umschließendes Rechteck" +msgstr "Objektrahmen" #: ../src/ui/dialog/inkscape-preferences.cpp:349 msgid "Each selected object displays its bounding box" -msgstr "" -"Jedes gewählte Objekt zeigt sein umschließendes Rechteck (Umrandungsbox)" +msgstr "Jedes gewählte Objekt zeigt seinen Objektrahmen" #. Node #: ../src/ui/dialog/inkscape-preferences.cpp:352 @@ -18053,7 +18111,7 @@ msgstr "Farbverlauf" #: ../src/ui/dialog/inkscape-preferences.cpp:489 msgid "Prevent sharing of gradient definitions" -msgstr "Keine gemeinsamen Verlaufdefinitionen " +msgstr "Keine gemeinsamen Verlaufsdefinitionen" #: ../src/ui/dialog/inkscape-preferences.cpp:491 msgid "" @@ -18136,9 +18194,8 @@ msgid "Armenian (hy)" msgstr "Armenisch (hy)" #: ../src/ui/dialog/inkscape-preferences.cpp:526 -#, fuzzy msgid "Assamese (as)" -msgstr "Japanisch (ja)" +msgstr "Assamesisch (as)" #: ../src/ui/dialog/inkscape-preferences.cpp:526 msgid "Azerbaijani (az)" @@ -18165,9 +18222,8 @@ msgid "Bengali/Bangladesh (bn_BD)" msgstr "Bengalesisch (bn_BD)" #: ../src/ui/dialog/inkscape-preferences.cpp:527 -#, fuzzy msgid "Bodo (brx)" -msgstr "Bretonisch (br)" +msgstr "Bodo (brx)" #: ../src/ui/dialog/inkscape-preferences.cpp:527 msgid "Breton (br)" @@ -18203,7 +18259,7 @@ msgstr "Dänisch (da)" #: ../src/ui/dialog/inkscape-preferences.cpp:529 msgid "Dogri (doi)" -msgstr "" +msgstr "Dogri (doi)" #: ../src/ui/dialog/inkscape-preferences.cpp:529 msgid "Dutch (nl)" @@ -18266,9 +18322,8 @@ msgid "Galician (gl)" msgstr "Galizisch (gl)" #: ../src/ui/dialog/inkscape-preferences.cpp:533 -#, fuzzy msgid "Gujarati (gu)" -msgstr "Gujarati" +msgstr "Gujarati (gu)" #: ../src/ui/dialog/inkscape-preferences.cpp:534 msgid "Hebrew (he)" @@ -18276,7 +18331,7 @@ msgstr "Hebräisch (he)" #: ../src/ui/dialog/inkscape-preferences.cpp:534 msgid "Hindi (hi)" -msgstr "" +msgstr "Hindi (hi)" #: ../src/ui/dialog/inkscape-preferences.cpp:534 msgid "Hungarian (hu)" @@ -18284,7 +18339,7 @@ msgstr "Ungarisch (hu)" #: ../src/ui/dialog/inkscape-preferences.cpp:535 msgid "Icelandic (is)" -msgstr "" +msgstr "Isländisch (is)" #: ../src/ui/dialog/inkscape-preferences.cpp:535 msgid "Indonesian (id)" @@ -18303,17 +18358,16 @@ msgid "Japanese (ja)" msgstr "Japanisch (ja)" #: ../src/ui/dialog/inkscape-preferences.cpp:537 -#, fuzzy msgid "Kannada (kn)" -msgstr "Kannada" +msgstr "Kannada (kn)" #: ../src/ui/dialog/inkscape-preferences.cpp:537 msgid "Kashmiri in Peso-Arabic script (ks@aran)" -msgstr "" +msgstr "Kashmiri in erweiterter arabischer Schrift (ks@aran)" #: ../src/ui/dialog/inkscape-preferences.cpp:537 msgid "Kashmiri in Devanagari script (ks@deva)" -msgstr "" +msgstr "Kashmiri in Devanagari-Schrift (ks@deva)" #: ../src/ui/dialog/inkscape-preferences.cpp:537 msgid "Khmer (km)" @@ -18324,14 +18378,12 @@ msgid "Kinyarwanda (rw)" msgstr "Kinyarwanda (rw)" #: ../src/ui/dialog/inkscape-preferences.cpp:537 -#, fuzzy msgid "Konkani (kok)" -msgstr "Koreanisch (ko)" +msgstr "Konkani (kok)" #: ../src/ui/dialog/inkscape-preferences.cpp:537 -#, fuzzy msgid "Konkani in Latin script (kok@latin)" -msgstr "Serbisch in lateinischer Schrift (sr@latin)" +msgstr "Konkani in lateinischer Schrift (sr@latin)" #: ../src/ui/dialog/inkscape-preferences.cpp:537 msgid "Korean (ko)" @@ -18351,24 +18403,23 @@ msgstr "Mazedonisch (mk)" #: ../src/ui/dialog/inkscape-preferences.cpp:539 msgid "Maithili (mai)" -msgstr "" +msgstr "Maithili (mai)" #: ../src/ui/dialog/inkscape-preferences.cpp:539 -#, fuzzy msgid "Malayalam (ml)" -msgstr "Malayalam" +msgstr "Malayalam (ml)" #: ../src/ui/dialog/inkscape-preferences.cpp:539 msgid "Manipuri (mni)" -msgstr "" +msgstr "Meitei (mni)" #: ../src/ui/dialog/inkscape-preferences.cpp:539 msgid "Manipuri in Bengali script (mni@beng)" -msgstr "" +msgstr "Manipuri in bengalischer Schrift (mni@beng)" #: ../src/ui/dialog/inkscape-preferences.cpp:539 msgid "Marathi (mr)" -msgstr "" +msgstr "Marathi (mr)" #: ../src/ui/dialog/inkscape-preferences.cpp:539 msgid "Mongolian (mn)" @@ -18388,7 +18439,7 @@ msgstr "Norwegisch/Nynorsk (nn)" #: ../src/ui/dialog/inkscape-preferences.cpp:541 msgid "Odia (or)" -msgstr "" +msgstr "Orya (or)" #: ../src/ui/dialog/inkscape-preferences.cpp:542 msgid "Panjabi (pa)" @@ -18416,17 +18467,15 @@ msgstr "Russisch (ru)" #: ../src/ui/dialog/inkscape-preferences.cpp:544 msgid "Sanskrit (sa)" -msgstr "" +msgstr "Sanskrit (sa)" #: ../src/ui/dialog/inkscape-preferences.cpp:544 -#, fuzzy msgid "Santali (sat)" -msgstr "Italienisch (it)" +msgstr "Santali (sat)" #: ../src/ui/dialog/inkscape-preferences.cpp:544 -#, fuzzy msgid "Santali in Devanagari script (sat@deva)" -msgstr "Serbisch in lateinischer Schrift (sr@latin)" +msgstr "Santali in Devanagari-Schrift (sat@deva)" #: ../src/ui/dialog/inkscape-preferences.cpp:544 msgid "Serbian (sr)" @@ -18438,12 +18487,11 @@ msgstr "Serbisch in lateinischer Schrift (sr@latin)" #: ../src/ui/dialog/inkscape-preferences.cpp:545 msgid "Sindhi (sd)" -msgstr "" +msgstr "Sindhi (sd)" #: ../src/ui/dialog/inkscape-preferences.cpp:545 -#, fuzzy msgid "Sindhi in Devanagari script (sd@deva)" -msgstr "Serbisch in lateinischer Schrift (sr@latin)" +msgstr "Sindhi in Devanagari-Schrift (sd@deva)" #: ../src/ui/dialog/inkscape-preferences.cpp:545 msgid "Slovak (sk)" @@ -18466,9 +18514,8 @@ msgid "Swedish (sv)" msgstr "Schwedisch (sv)" #: ../src/ui/dialog/inkscape-preferences.cpp:546 -#, fuzzy msgid "Tamil (ta)" -msgstr "Tamilisch" +msgstr "Tamilisch (ta)" #: ../src/ui/dialog/inkscape-preferences.cpp:546 msgid "Telugu (te)" @@ -18488,7 +18535,7 @@ msgstr "Ukrainisch (uk)" #: ../src/ui/dialog/inkscape-preferences.cpp:547 msgid "Urdu (ur)" -msgstr "" +msgstr "Urdu (ur)" #: ../src/ui/dialog/inkscape-preferences.cpp:548 msgid "Vietnamese (vi)" @@ -18507,6 +18554,8 @@ msgstr "Sprache für Menüs und Zahlenformate setzen" msgid "Large" msgstr "Groß" +# Bezieht sich auf die 10% größeren angelsächsischen Kapitälchen... +# UND leider auch auf Icongrößen. #: ../src/ui/dialog/inkscape-preferences.cpp:604 #: ../src/ui/dialog/inkscape-preferences.cpp:689 #: ../src/ui/widget/font-variants.cpp:51 @@ -19335,7 +19384,7 @@ msgstr "Hebe Farben hervor die nicht im Farbbereich des Ausgabegerätes liegen." #: ../src/ui/dialog/inkscape-preferences.cpp:1041 msgid "Out of gamut warning color:" -msgstr "Farbbereichswarnung:" +msgstr "Farbe für Farbbereichswarnung:" #: ../src/ui/dialog/inkscape-preferences.cpp:1042 msgid "Selects the color used for out of gamut warning" @@ -19741,9 +19790,10 @@ msgstr "" "innerhalb der Arbeitsfläche" #: ../src/ui/dialog/inkscape-preferences.cpp:1253 -#, fuzzy msgid "Mouse move pans when Space is pressed" -msgstr "Die linke Maustaste verschiebt, wenn die Leertaste gedrückt ist." +msgstr "" +"Bewegen der Maus verschiebt die Zeichenfläche, wenn die Leertaste gedrückt " +"ist." #: ../src/ui/dialog/inkscape-preferences.cpp:1255 msgid "When on, pressing and holding Space and dragging pans canvas" @@ -19759,7 +19809,7 @@ msgid "" "off, it zooms with Ctrl and scrolls without Ctrl" msgstr "" "Wenn aktiviert kann mit dem Mausrad die Ansicht vergrößert/verkleinert " -"werden. Ist dies deaktiviert benötigt man dazu Strg+Mausrad. " +"werden. Ist dies deaktiviert benötigt man dazu Strg+Mausrad." #: ../src/ui/dialog/inkscape-preferences.cpp:1259 msgid "Scrolling" @@ -19767,9 +19817,8 @@ msgstr "Rollen" #. Snapping options #: ../src/ui/dialog/inkscape-preferences.cpp:1262 -#, fuzzy msgid "Snap indicator" -msgstr "Einrast-Indikator aktivieren" +msgstr "Einrast-Indikator" #: ../src/ui/dialog/inkscape-preferences.cpp:1264 msgid "Enable snap indicator" @@ -19833,14 +19882,12 @@ msgstr "" "Mauszeiger statt der Projektion des Knotens auf der Linie ein." #: ../src/ui/dialog/inkscape-preferences.cpp:1288 -#, fuzzy msgid "Delayed snap" -msgstr "Immer einrasten" +msgstr "Zeitverzögertes Einrasten" #: ../src/ui/dialog/inkscape-preferences.cpp:1291 -#, fuzzy msgid "Delay (in seconds):" -msgstr "Verzögerung (Millisekunden):" +msgstr "Verzögerung (Sekunden):" #: ../src/ui/dialog/inkscape-preferences.cpp:1292 msgid "" @@ -19877,7 +19924,7 @@ msgstr "> und < skalieren um:" msgid "Pressing > or < scales selection up or down by this increment" msgstr "" "Drücken von > oder < skaliert die ausgewählten Elemente um diesen Wert " -"größer oder kleiner (in SVG-Pixeln) " +"größer oder kleiner (in SVG-Pixeln)" #: ../src/ui/dialog/inkscape-preferences.cpp:1306 msgid "_Inset/Outset by:" @@ -20997,7 +21044,7 @@ msgstr "Bildrendering:" #: ../src/ui/dialog/object-properties.cpp:470 #: ../src/ui/dialog/object-properties.cpp:477 msgid "_ID:" -msgstr "_Kennung: " +msgstr "_Kennung:" #: ../src/ui/dialog/object-properties.cpp:60 msgid "_Title:" @@ -21508,7 +21555,7 @@ msgstr "Ankerpunkt:" #: ../src/ui/dialog/polar-arrange-tab.cpp:52 msgctxt "Polar arrange tab" msgid "Object's bounding box:" -msgstr "Objektrahmen:" +msgstr "Objektrahmen des Objekts:" #: ../src/ui/dialog/polar-arrange-tab.cpp:59 msgctxt "Polar arrange tab" @@ -21739,7 +21786,7 @@ msgstr "Name der Glyphe" #: ../src/ui/dialog/svg-fonts-dialog.cpp:711 msgid "Matching string" -msgstr "Passende Zeichenkette " +msgstr "Übereinstimmende Zeichenkette" #: ../src/ui/dialog/svg-fonts-dialog.cpp:714 msgid "Add Glyph" @@ -23940,7 +23987,7 @@ msgstr "Farbe für geglättete Gitterecke." #: ../src/ui/tools/mesh-tool.cpp:413 msgid "Picked mesh corner color." -msgstr "Ausgewählte Farbe der Gitter-Ecken " +msgstr "Ausgewählte Farbe der Gitter-Ecken." #: ../src/ui/tools/mesh-tool.cpp:489 msgid "Create default mesh" @@ -24010,7 +24057,7 @@ msgstr "" #: ../src/ui/tools/node-tool.cpp:719 msgctxt "Node tool tip" msgid "Drag to select objects to edit" -msgstr "Ziehen, um Objekte zum bearbeiten auszuwählen" +msgstr "Ziehen, um Objekte zum Bearbeiten auszuwählen" #: ../src/ui/tools/pen-tool.cpp:223 ../src/ui/tools/pencil-tool.cpp:455 msgid "Drawing cancelled" @@ -24768,7 +24815,7 @@ msgstr "Farb-Management" #: ../src/ui/widget/color-notebook.cpp:189 msgid "Out of gamut!" -msgstr "Farbbereichswarnung:" +msgstr "Farbbereich überschritten!" #: ../src/ui/widget/color-notebook.cpp:196 msgid "Too much ink!" @@ -24805,169 +24852,159 @@ msgstr "Unschärfe (%)" #: ../src/ui/widget/font-variants.cpp:38 msgid "Ligatures" -msgstr "" +msgstr "Ligaturen" #: ../src/ui/widget/font-variants.cpp:39 -#, fuzzy msgid "Common" -msgstr "allgemein" +msgstr "Gewöhnliche" #: ../src/ui/widget/font-variants.cpp:40 -#, fuzzy msgid "Discretionary" -msgstr "Richtung" +msgstr "Bedingte" #: ../src/ui/widget/font-variants.cpp:41 -#, fuzzy msgid "Historical" -msgstr "Einführungen" +msgstr "Historische" #: ../src/ui/widget/font-variants.cpp:42 -#, fuzzy msgid "Contextual" -msgstr "Kontext" +msgstr "Kontextbezogene" #: ../src/ui/widget/font-variants.cpp:46 -#, fuzzy msgid "Subscript" -msgstr "Skript" +msgstr "Tiefgestellt" #: ../src/ui/widget/font-variants.cpp:47 -#, fuzzy msgid "Superscript" -msgstr "Hochgestellt umschalten" +msgstr "Hochgestellt" +# Überbegriff für Groß-/Kleinschreibung als Eigenschaft der Schriftvariante. "Kapitälchen" lt. http://www.linuxlibertine.org/index.php?id=87 #: ../src/ui/widget/font-variants.cpp:49 -#, fuzzy msgid "Capitals" -msgstr "Hospital" +msgstr "" +# Bedeutung: alle Buchstaben als Kapitälchen, egal ob Groß- oder Kleinbuchstaben. #: ../src/ui/widget/font-variants.cpp:52 -#, fuzzy msgid "All small" -msgstr "klein" +msgstr "" +# Bedeutung: Kleine (für uns normalgroße) Kapitälchen für Kleinbuchstaben. #: ../src/ui/widget/font-variants.cpp:53 msgid "Petite" msgstr "" +# Bedeutung: Kleine (normale) Kapitälchen für Groß- und Kleinbuchstaben (die anderen sind 10% größer, und wohl im angelsächsischen Raum gebräuchlich) #: ../src/ui/widget/font-variants.cpp:54 -#, fuzzy msgid "All petite" -msgstr "Alles inaktiv" +msgstr "" +# lt. http://www.typografie.info/3/page/wiki.html/_/fachbegriffe/unicase-r25 #: ../src/ui/widget/font-variants.cpp:55 -#, fuzzy msgid "Unicase" -msgstr "Picas" +msgstr "Unikameral" +# https://en.wikipedia.org/wiki/Titling_capitals #: ../src/ui/widget/font-variants.cpp:56 -#, fuzzy msgid "Titling" -msgstr "Segeln" +msgstr "" #: ../src/ui/widget/font-variants.cpp:58 msgid "Numeric" -msgstr "" +msgstr "Ziffern" #: ../src/ui/widget/font-variants.cpp:59 -#, fuzzy msgid "Lining" -msgstr "Ausdünnung:" +msgstr "Versalziffern" #: ../src/ui/widget/font-variants.cpp:60 -#, fuzzy msgid "Old Style" -msgstr "Stil" +msgstr "Minuskelziffern" #: ../src/ui/widget/font-variants.cpp:61 -#, fuzzy msgid "Default Style" -msgstr "Vorgegebener Titel" +msgstr "Standardstil" #: ../src/ui/widget/font-variants.cpp:62 -#, fuzzy msgid "Proportional" -msgstr "Streifenproportion:" +msgstr "Proportional" #: ../src/ui/widget/font-variants.cpp:63 msgid "Tabular" -msgstr "" +msgstr "Tabellenziffern" #: ../src/ui/widget/font-variants.cpp:64 -#, fuzzy msgid "Default Width" -msgstr "Vorgegebener Titel" +msgstr "Standardbreite" #: ../src/ui/widget/font-variants.cpp:65 -#, fuzzy msgid "Diagonal" -msgstr "Diagonale Hilfslinien" +msgstr "Diagonal" +# Vertikal? Oder bezogen auf den Bruchstrich: Horizontal?... #: ../src/ui/widget/font-variants.cpp:66 -#, fuzzy msgid "Stacked" -msgstr "Hintergrund:" +msgstr "Übereinander" #: ../src/ui/widget/font-variants.cpp:67 -#, fuzzy msgid "Default Fractions" -msgstr "Vorgabe Gittereinstellungen" +msgstr "Standard-Brüche" #: ../src/ui/widget/font-variants.cpp:68 msgid "Ordinal" -msgstr "" +msgstr "Ordnungszahlen" #: ../src/ui/widget/font-variants.cpp:69 msgid "Slashed Zero" -msgstr "" +msgstr "Gestrichene Null" #: ../src/ui/widget/font-variants.cpp:71 -#, fuzzy msgid "Feature Settings" -msgstr "Seiteneinstellungen" +msgstr "Typographische Eigenschaften" #: ../src/ui/widget/font-variants.cpp:72 msgid "Selection has different Feature Settings!" -msgstr "" +msgstr "Die Auswahl hat abweichende typographischen Eigenschaften!" #: ../src/ui/widget/font-variants.cpp:85 msgid "Common ligatures. On by default. OpenType tables: 'liga', 'clig'" msgstr "" +"Gewöhnliche Ligaturen. Standardmäßig aktiviert. OpenType-Tabelle: „liga“, " +"„clig“" #: ../src/ui/widget/font-variants.cpp:87 msgid "Discretionary ligatures. Off by default. OpenType table: 'dlig'" msgstr "" +"Bedingte Ligaturen. Standardmäßig deaktiviert. OpenType-Tabelle: „dlig“" #: ../src/ui/widget/font-variants.cpp:89 msgid "Historical ligatures. Off by default. OpenType table: 'hlig'" msgstr "" +"Historische Ligaturen. Standardmäßig deaktiviert. OpenType-Tabelle: „hlig“" #: ../src/ui/widget/font-variants.cpp:91 msgid "Contextual forms. On by default. OpenType table: 'calt'" msgstr "" +"Kontextbezogene Ligaturen. Standardmäßig aktiviert. OpenType-Tabelle: „calt“" #. Position ---------------------------------- #. Add tooltips #: ../src/ui/widget/font-variants.cpp:112 -#, fuzzy msgid "Normal position." -msgstr "X-Position" +msgstr "Normale Position." #: ../src/ui/widget/font-variants.cpp:113 msgid "Subscript. OpenType table: 'subs'" -msgstr "" +msgstr "Tiefgestellt. OpenType-Tabelle: „subs“" #: ../src/ui/widget/font-variants.cpp:114 msgid "Superscript. OpenType table: 'sups'" -msgstr "" +msgstr "Hochgestellt. OpenType-Tabelle: „sups“" #. Caps ---------------------------------- #. Add tooltips #: ../src/ui/widget/font-variants.cpp:138 -#, fuzzy msgid "Normal capitalization." -msgstr "Lokalisierung" +msgstr "Normale Groß- und Kleinschreibung." #: ../src/ui/widget/font-variants.cpp:139 msgid "Small-caps (lowercase). OpenType table: 'smcp'" @@ -25002,57 +25039,58 @@ msgstr "" #. Numeric ------------------------------ #. Add tooltips #: ../src/ui/widget/font-variants.cpp:180 -#, fuzzy msgid "Normal style." -msgstr "Normaler Versatz" +msgstr "Normaler Stil." #: ../src/ui/widget/font-variants.cpp:181 msgid "Lining numerals. OpenType table: 'lnum'" -msgstr "" +msgstr "Versalziffern. OpenType-Tabelle: „lnum“" #: ../src/ui/widget/font-variants.cpp:182 msgid "Old style numerals. OpenType table: 'onum'" -msgstr "" +msgstr "Minuskelziffern. OpenType-Tabelle: „onum“" #: ../src/ui/widget/font-variants.cpp:183 -#, fuzzy msgid "Normal widths." -msgstr "Normales Licht" +msgstr "Normale Breite." #: ../src/ui/widget/font-variants.cpp:184 msgid "Proportional width numerals. OpenType table: 'pnum'" -msgstr "" +msgstr "Ziffern mit proportionaler Breite. OpenType-Tabelle: „pnum“" #: ../src/ui/widget/font-variants.cpp:185 msgid "Same width numerals. OpenType table: 'tnum'" -msgstr "" +msgstr "Ziffern mit identischer Breite. OpenType-Tabelle: „tnum“" #: ../src/ui/widget/font-variants.cpp:186 -#, fuzzy msgid "Normal fractions." -msgstr "Vorgabe Gittereinstellungen" +msgstr "Normale Brüche." #: ../src/ui/widget/font-variants.cpp:187 msgid "Diagonal fractions. OpenType table: 'frac'" -msgstr "" +msgstr "Brüche mit diagonalem Bruchstrich. OpenType-Tabelle: „frac“" #: ../src/ui/widget/font-variants.cpp:188 msgid "Stacked fractions. OpenType table: 'afrc'" -msgstr "" +msgstr "Brüche mit horizontalem Bruchstrich. OpenType-Tabelle: „afrc“" #: ../src/ui/widget/font-variants.cpp:189 msgid "Ordinals (raised 'th', etc.). OpenType table: 'ordn'" msgstr "" +"Ordnungszahlen (z.B. hochgestelltes „th“ im Englischen). OpenType-Tabelle: " +"„ordn“" #: ../src/ui/widget/font-variants.cpp:190 msgid "Slashed zeros. OpenType table: 'zero'" -msgstr "" +msgstr "Gestrichene Nullen. OpenType-Tabelle: „zero“" #. Feature settings --------------------- #. Add tooltips #: ../src/ui/widget/font-variants.cpp:240 msgid "Feature settings in CSS form. No sanity checking is performed." msgstr "" +"Typographische Eigenschaften im CSS-Format. Eingaben werden ungeprüft " +"übernommen." #: ../src/ui/widget/layer-selector.cpp:118 msgid "Toggle current layer visibility" @@ -25078,10 +25116,10 @@ msgstr "Proprietär" msgid "MetadataLicence|Other" msgstr "Andere" +# In der History #: ../src/ui/widget/licensor.cpp:72 -#, fuzzy msgid "Document license updated" -msgstr "Dokumentbereinigung" +msgstr "Lizenz des Dokuments geändert" #: ../src/ui/widget/object-composite-settings.cpp:47 #: ../src/ui/widget/selected-style.cpp:1119 @@ -25113,7 +25151,7 @@ msgstr "Höhe des Papiers" #: ../src/ui/widget/page-sizer.cpp:239 msgid "T_op margin:" -msgstr "Obere Umrandung:" +msgstr "Oberer Rand:" #: ../src/ui/widget/page-sizer.cpp:239 msgid "Top margin" @@ -25144,24 +25182,20 @@ msgid "Bottom margin" msgstr "Unterer Rand" #: ../src/ui/widget/page-sizer.cpp:244 -#, fuzzy msgid "Scale _x:" -msgstr "X Skalieren" +msgstr "Skalierung _x:" #: ../src/ui/widget/page-sizer.cpp:244 -#, fuzzy msgid "Scale X" -msgstr "X Skalieren" +msgstr "X skalieren" #: ../src/ui/widget/page-sizer.cpp:245 -#, fuzzy msgid "Scale _y:" -msgstr "Y Skalieren" +msgstr "Skalierung _y:" #: ../src/ui/widget/page-sizer.cpp:245 -#, fuzzy msgid "Scale Y" -msgstr "X Skalieren" +msgstr "Y skalieren" #: ../src/ui/widget/page-sizer.cpp:323 msgid "Orientation:" @@ -25202,11 +25236,14 @@ msgid "" "scaling in Inkscape. To set a non-uniform scaling, set the 'viewBox' " "directly." msgstr "" +"Obwohl das SVG Format unterschiedliche Skalierungsfaktoren erlaubt, wird " +"dies für die Verwendung in Inkscape nicht empfohlen. Um unterschiedliche " +"Skalierungsfaktoren festzulegen kann das 'viewBox' Attribut direkt " +"bearbeitet werden." #: ../src/ui/widget/page-sizer.cpp:483 -#, fuzzy msgid "_Viewbox..." -msgstr "_Ansicht" +msgstr "_Viewbox..." #: ../src/ui/widget/page-sizer.cpp:590 msgid "Set page size" @@ -25214,12 +25251,11 @@ msgstr "Seitengröße setzen" #: ../src/ui/widget/page-sizer.cpp:836 msgid "User units per " -msgstr "" +msgstr "SVG-Benutzereinheiten pro " #: ../src/ui/widget/page-sizer.cpp:932 -#, fuzzy msgid "Set page scale" -msgstr "Seitengröße setzen" +msgstr "Seitenskalierung festlegen" #: ../src/ui/widget/page-sizer.cpp:958 msgid "Set 'viewBox'" @@ -25237,7 +25273,7 @@ msgstr "Größe" #: ../src/ui/widget/panel.cpp:140 msgctxt "Swatches height" msgid "Tiny" -msgstr "winzig" +msgstr "Winzig" #: ../src/ui/widget/panel.cpp:141 msgctxt "Swatches height" @@ -25268,12 +25304,12 @@ msgstr "Breite" #: ../src/ui/widget/panel.cpp:170 msgctxt "Swatches width" msgid "Narrower" -msgstr "Enger" +msgstr "Schmaler" #: ../src/ui/widget/panel.cpp:171 msgctxt "Swatches width" msgid "Narrow" -msgstr "eng" +msgstr "Schmal" #: ../src/ui/widget/panel.cpp:172 msgctxt "Swatches width" @@ -25430,9 +25466,9 @@ msgstr "Füllmuster" #: ../src/ui/widget/selected-style.cpp:195 #: ../src/ui/widget/style-swatch.cpp:302 msgid "Pattern stroke" -msgstr "Kontur des Musters" +msgstr "Kontur mit Muster" -# !!! +# Short for 'Linear Gradient' in indicator field bottom left. #: ../src/ui/widget/selected-style.cpp:197 msgid "<b>L</b>" msgstr "<b>L</b>" @@ -25440,13 +25476,14 @@ msgstr "<b>L</b>" #: ../src/ui/widget/selected-style.cpp:200 #: ../src/ui/widget/style-swatch.cpp:294 msgid "Linear gradient fill" -msgstr "Füllung des linearen Farbverlaufs" +msgstr "Füllung mit linearem Farbverlauf" #: ../src/ui/widget/selected-style.cpp:200 #: ../src/ui/widget/style-swatch.cpp:294 msgid "Linear gradient stroke" -msgstr "Kontur des linearen Farbverlaufs" +msgstr "Kontur mit linearem Farbverlauf" +# Short for 'Radial gradient' in indicator field bottom left. #: ../src/ui/widget/selected-style.cpp:207 msgid "<b>R</b>" msgstr "<b>R</b>" @@ -25454,28 +25491,26 @@ msgstr "<b>R</b>" #: ../src/ui/widget/selected-style.cpp:210 #: ../src/ui/widget/style-swatch.cpp:298 msgid "Radial gradient fill" -msgstr "Füllung des radialen Farbverlaufs" +msgstr "Füllung mit radialem Farbverlauf" #: ../src/ui/widget/selected-style.cpp:210 #: ../src/ui/widget/style-swatch.cpp:298 msgid "Radial gradient stroke" -msgstr "Kontur des radialen Farbverlaufs" +msgstr "Kontur mit radialem Farbverlauf" -# !!! +# Short for 'Mesh gradient' in indicator field bottom left #: ../src/ui/widget/selected-style.cpp:218 -#, fuzzy msgid "<b>M</b>" -msgstr "<b>L</b>" +msgstr "<b>G</b>" +# Leider inkonsistent mit Mesh gradient stroke. Vielleicht gibt's noch was besseres? #: ../src/ui/widget/selected-style.cpp:221 -#, fuzzy msgid "Mesh gradient fill" -msgstr "Füllung des Verlaufsgitter" +msgstr "Verlaufsgitterfüllung" #: ../src/ui/widget/selected-style.cpp:221 -#, fuzzy msgid "Mesh gradient stroke" -msgstr "Kontur des Verlaufsgitter" +msgstr "Kontur mit Verlaufsgitter" #: ../src/ui/widget/selected-style.cpp:229 msgid "Different" @@ -29216,23 +29251,24 @@ msgstr "Es ist kein geometrisches Werkzeug aktiv" #: ../src/widgets/lpe-toolbar.cpp:335 msgid "Show limiting bounding box" -msgstr "Begrenzungsrahmen anzeigen" +msgstr "Objektrahmen anzeigen" #: ../src/widgets/lpe-toolbar.cpp:336 msgid "Show bounding box (used to cut infinite lines)" -msgstr "Rahmen anzeigen (wird benutzt, um unendliche Linien zu schneiden)" +msgstr "" +"Objektrahmen anzeigen (wird benutzt, um unendliche Linien zu schneiden)" #: ../src/widgets/lpe-toolbar.cpp:347 msgid "Get limiting bounding box from selection" -msgstr "Begrenzungsrahmen aus Auswahl ermitteln" +msgstr "Objektrahmen aus Auswahl ermitteln" #: ../src/widgets/lpe-toolbar.cpp:348 msgid "" "Set limiting bounding box (used to cut infinite lines) to the bounding box " "of current selection" msgstr "" -"Begrenzungsrahmen (beschneidet unendliche Linien) gleich demjenigen der " -"Auswahl" +"Objektrahmen (beschneidet unendliche Linien) entsprechend der aktuellen " +"Auswahl setzen" #: ../src/widgets/lpe-toolbar.cpp:360 msgid "Choose a line segment type" @@ -29352,24 +29388,24 @@ msgstr "Anzeigen der seitlichen und Tensor-Anfasser" #: ../src/widgets/mesh-toolbar.cpp:465 msgid "WARNING: Mesh SVG Syntax Subject to Change" -msgstr "" +msgstr "WARNUNG: SVG Syntax zu Verlaufsgittern noch im Entwurfsstadium" #: ../src/widgets/mesh-toolbar.cpp:475 msgctxt "Type" msgid "Coons" -msgstr "" +msgstr "Coons" #: ../src/widgets/mesh-toolbar.cpp:478 msgid "Bicubic" -msgstr "" +msgstr "Bikubisch" #: ../src/widgets/mesh-toolbar.cpp:480 msgid "Coons" -msgstr "" +msgstr "Coons" #: ../src/widgets/mesh-toolbar.cpp:481 msgid "Coons: no smoothing. Bicubic: smoothing across patch boundaries." -msgstr "" +msgstr "Coons: Keine Glättung. Bikubisch: Glättung über Feldgrenzen hinweg." #: ../src/widgets/mesh-toolbar.cpp:483 ../src/widgets/pencil-toolbar.cpp:377 msgid "Smoothing:" @@ -30870,43 +30906,43 @@ msgstr "Stil von neuen Farbeimer-Objekten" #: ../src/widgets/toolbox.cpp:1681 msgid "Bounding box" -msgstr "Rahmen" +msgstr "Objektrahmen" #: ../src/widgets/toolbox.cpp:1681 msgid "Snap bounding boxes" -msgstr "Umrandung einrasten" +msgstr "Objektrahmen einrasten" #: ../src/widgets/toolbox.cpp:1690 msgid "Bounding box edges" -msgstr "Kanten der Umrandung" +msgstr "Kanten des Objektrahmens" #: ../src/widgets/toolbox.cpp:1690 msgid "Snap to edges of a bounding box" -msgstr "An Kanten einer Umrandung einrasten" +msgstr "An Kanten eines Objektrahmens einrasten" #: ../src/widgets/toolbox.cpp:1699 msgid "Bounding box corners" -msgstr "Ecken der Umrandung" +msgstr "Ecken des Objektrahmens" #: ../src/widgets/toolbox.cpp:1699 msgid "Snap bounding box corners" -msgstr "Ecken der Umrandung einrasten" +msgstr "Ecken des Objektrahmens einrasten" #: ../src/widgets/toolbox.cpp:1708 msgid "BBox Edge Midpoints" -msgstr "Mittelpunkte der Umrandungslinien" +msgstr "Mittelpunkte von Objektrahmenlinien" #: ../src/widgets/toolbox.cpp:1708 msgid "Snap midpoints of bounding box edges" -msgstr "Mittelpunkte von Umrandungslinien einrasten" +msgstr "Mittelpunkte von Objektrahmenlinien einrasten" #: ../src/widgets/toolbox.cpp:1718 msgid "BBox Centers" -msgstr "Mittelpunkt Umrandung" +msgstr "Mittelpunkte von Objektrahmen" #: ../src/widgets/toolbox.cpp:1718 msgid "Snapping centers of bounding boxes" -msgstr "Mittelpunkte von Umrandungen einrasten" +msgstr "Mittelpunkte von Objektrahmen einrasten" #: ../src/widgets/toolbox.cpp:1727 msgid "Snap nodes, paths, and handles" @@ -31196,7 +31232,7 @@ msgid "" "Low fidelity simplifies paths; high fidelity preserves path features but may " "generate a lot of new nodes" msgstr "" -"Geringere Originaltreue vereinfacht den Pfad. Ein hoher Wert erhält die " +"Geringere Originaltreue vereinfacht den Pfad. Ein hoher Wert erhält die " "Pfadstruktur, erzeugt aber viele neuen Knoten" #: ../src/widgets/tweak-toolbar.cpp:373 @@ -31280,7 +31316,7 @@ msgid "" "option" msgstr "" "Fehler: Feld 'Übereinstimmender Ebenenname' muss ausgefüllt sein, wenn die " -"Option 'Nach Namensübereinstimmung' verwendet wird. " +"Option 'Nach Namensübereinstimmung' verwendet wird." #: ../share/extensions/dxf_outlines.py:356 #, python-format @@ -31337,13 +31373,13 @@ msgid "" msgstr "" "X-Interval kann nicht Null sein. Bitte verändern Sie 'Start X' oder 'Ende X'" +# Check 'linked' translations (Y oben, Y unten). #: ../share/extensions/funcplot.py:60 -#, fuzzy msgid "" "y-interval cannot be zero. Please modify 'Y value of rectangle's top' or 'Y " "value of rectangle's bottom'" msgstr "" -"Y-Interval kann nicht Null sein. Bitte verändern Sie 'Y oben' oder 'Y unten'" +"Y-Intervall kann nicht null sein. Bitte verändern Sie 'Y oben' oder 'Y unten'" #: ../share/extensions/funcplot.py:315 msgid "Please select a rectangle" @@ -31519,7 +31555,7 @@ msgstr "" #: ../share/extensions/gcodetools.py:4956 #: ../share/extensions/gcodetools.py:5011 msgid "Warning: omitting non-path" -msgstr "Warnung: non-path weglassen" +msgstr "Warnung: Objekt wird weglassen (ist kein Pfad)" #: ../share/extensions/gcodetools.py:5511 msgid "Please select at least one path to engrave and run again." @@ -31627,9 +31663,8 @@ msgid "Please select an object" msgstr "Bitte wählen Sie ein Objekt." #: ../share/extensions/gimp_xcf.py:39 -#, fuzzy msgid "Inkscape must be installed and set in your path variable." -msgstr "Gimp muss installiert und in Ihren Pfadvariablen gesetzt sein." +msgstr "Inkscape muss installiert und in Ihren Pfadvariablen gesetzt sein." #: ../share/extensions/gimp_xcf.py:43 msgid "Gimp must be installed and set in your path variable." @@ -31699,7 +31734,7 @@ msgstr "" #: ../share/extensions/inkex.py:169 #, python-format msgid "Unable to open specified file: %s" -msgstr "Kann bestimmte Datei nicht öffnen:.%s" +msgstr "Kann bestimmte Datei nicht öffnen: %s" #: ../share/extensions/inkex.py:178 #, python-format @@ -32653,7 +32688,7 @@ msgstr "Y-Versatz:" #: ../share/extensions/dimension.inx.h:4 #, fuzzy msgid "Bounding box type:" -msgstr "Rahmentyp:" +msgstr "Objektrahmentyp:" #: ../share/extensions/dimension.inx.h:5 msgid "Geometric" @@ -32661,7 +32696,7 @@ msgstr "Geometrisch" #: ../share/extensions/dimension.inx.h:6 msgid "Visual" -msgstr "Visuel" +msgstr "Visuell" #: ../share/extensions/dimension.inx.h:7 ../share/extensions/dots.inx.h:13 #: ../share/extensions/handles.inx.h:2 ../share/extensions/measure.inx.h:25 @@ -32696,7 +32731,7 @@ msgid "" msgstr "" "Diese Erweiterung ersetzt die Auswahl der Knoten mit nummerierten Punkte " "nach den folgenden Optionen:\n" -" * Schriftgröße:. Größe der Knoten-Nummer Etiketten (20px, 12pt ...)\n" +" * Schriftgröße: Größe der Knoten-Nummer Etiketten (20px, 12pt ...)\n" " * Punktgröße: Durchmesser der Punkte am Pfad Knoten platziert (10px, " "2mm ...).\n" " * Anfangs-Punktnummer: Erste Zahl in der Sequenz, zugeordnet dem ersten " @@ -32934,7 +32969,7 @@ msgstr "GCodeWerkzeug kompatible Punkteingabe" #: ../share/extensions/dxf_input.inx.h:8 #: ../share/extensions/render_barcode_qrcode.inx.h:16 msgid "Character encoding:" -msgstr "Zeichen-Kodierung:" +msgstr "Zeichenkodierung:" #: ../share/extensions/dxf_input.inx.h:9 msgid "Text Font:" @@ -32981,14 +33016,12 @@ msgid "use LWPOLYLINE type of line output" msgstr "Benutzen des LWPOLYLINE Typs der Zeilenausgabe" #: ../share/extensions/dxf_outlines.inx.h:5 -#, fuzzy msgid "Base unit:" -msgstr "Basiseinheit" +msgstr "Basiseinheit:" #: ../share/extensions/dxf_outlines.inx.h:6 -#, fuzzy msgid "Character Encoding:" -msgstr "Zeichen-Kodierung" +msgstr "Zeichenkodierung:" #: ../share/extensions/dxf_outlines.inx.h:7 #, fuzzy @@ -33170,19 +33203,16 @@ msgid "Embed Selected Images" msgstr "Ausgewählte Bilder einbetten" #: ../share/extensions/empty_business_card.inx.h:1 -#, fuzzy msgid "Business Card" -msgstr "Geschäftskarte 85x54mm" +msgstr "Visitenkarte" #: ../share/extensions/empty_business_card.inx.h:2 -#, fuzzy msgid "Business card size:" -msgstr "Geschäftskarte 85x54mm" +msgstr "Größe der Visitenkarte:" #: ../share/extensions/empty_desktop.inx.h:1 -#, fuzzy msgid "Desktop" -msgstr "Desktop 640x480" +msgstr "Desktop" #: ../share/extensions/empty_desktop.inx.h:2 #, fuzzy @@ -33193,27 +33223,23 @@ msgstr "Punktgröße:" #: ../share/extensions/empty_desktop.inx.h:4 #: ../share/extensions/empty_generic.inx.h:2 #: ../share/extensions/empty_video.inx.h:4 -#, fuzzy msgid "Custom Width:" -msgstr "Benutzerdefiniert" +msgstr "Benutzerdefinierte Breite:" #: ../share/extensions/empty_desktop.inx.h:5 #: ../share/extensions/empty_generic.inx.h:3 #: ../share/extensions/empty_video.inx.h:5 -#, fuzzy msgid "Custom Height:" -msgstr "Deckelhöhe:" +msgstr "Benutzerdefinierte Höhe:" -# !!! not the best translation +# denkbar: DVD-Umschlag (aber lässt auch an eine Hülle aus Papier denken) #: ../share/extensions/empty_dvd_cover.inx.h:1 -#, fuzzy msgid "DVD Cover" -msgstr "Abdeckung" +msgstr "DVD-Cover" #: ../share/extensions/empty_dvd_cover.inx.h:2 -#, fuzzy msgid "DVD spine width:" -msgstr "Linienstärke" +msgstr "Breite des DVD-Hüllen-Rückens:" #: ../share/extensions/empty_dvd_cover.inx.h:3 msgid "DVD cover bleed (mm):" @@ -33231,25 +33257,21 @@ msgstr "Einheit:" # !!! #: ../share/extensions/empty_generic.inx.h:5 -#, fuzzy msgid "Canvas background:" -msgstr "Hintergrund verfolgen" +msgstr "Hintergrund der Zeichenfläche:" #: ../share/extensions/empty_generic.inx.h:6 #: ../share/extensions/empty_page.inx.h:5 -#, fuzzy msgid "Hide border" -msgstr "Gezahnter Rand" +msgstr "Rand verbergen" #: ../share/extensions/empty_icon.inx.h:1 -#, fuzzy msgid "Icon" -msgstr "Einklappen" +msgstr "Symbol" #: ../share/extensions/empty_icon.inx.h:2 -#, fuzzy msgid "Icon size:" -msgstr "Schriftgröße:" +msgstr "Symbolgröße:" #: ../share/extensions/empty_page.inx.h:2 msgid "Page size:" @@ -33259,11 +33281,9 @@ msgstr "Seitengröße:" msgid "Page orientation:" msgstr "Ausrichtung der Zeichenfläche:" -# !!! #: ../share/extensions/empty_page.inx.h:4 -#, fuzzy msgid "Page background:" -msgstr "Hintergrund verfolgen" +msgstr "Seitenhintergrund:" #: ../share/extensions/empty_video.inx.h:1 #, fuzzy @@ -33601,7 +33621,7 @@ msgid "" msgstr "" "\"Erstelle Flächenversatz\": Erstellt verschiedene Inkscape-Pfadversätze, um " "die originale Pfadfläche bis zum \"Flächenradius\"-Wert zu füllen. Umrisse " -"starten von \"1/2 D\" bis zur \"Flächenbreite\" totale Breite mit \"D\" " +"starten von \"1/2 D\" bis zur \"Flächenbreite\" totale Breite mit \"D\" " "Schritten, wobei D von der nähestenis Werkzeugdefinition genommen wird " "(\"Werkzeugdurchmesser\" Wert). Nur ein Versatz wird erstellt, wenn die " "\"Flächenbreite\" gleich \"1/2 D\" ist." @@ -34090,7 +34110,7 @@ msgstr "" "stattdessen nehmen). Sie können die Z-Oberfläche modifizieren, die Z-Tiefen-" "Werte später mit Text-Werkzeug (3. Koordinaten). Wenn es keine " "Orientierungspunkte in der aktuellen Ebene gibt, werden sie von der oberen " -"Schicht genommen. Die Gruppierung von Orientierungspunkten nicht aufheben! " +"Schicht genommen. Die Gruppierung von Orientierungspunkten nicht aufheben! " "Sie können diese mit Doppelklick auf die Gruppe auswählen oder durch Strg" "+Eingabe-Taste. Jetzt drücken Sie Anwenden, um die Kontrollpunkte " "(unabhängiger Satz für jede Ebene) zu erstellen." @@ -34383,7 +34403,7 @@ msgstr "Unter-Unterteilungen pro X-Unterteilung" msgid "Halve X Subsubdiv. Frequency after 'n' Subdivs. (log only):" msgstr "" "Halbiert X-Unter-Unterteilungsfrequenz nach n Unterteilungen. (nur " -"Logarithmus) " +"Logarithmus)" #: ../share/extensions/grid_cartesian.inx.h:10 msgid "Major X Division Thickness (px):" @@ -34425,7 +34445,7 @@ msgstr "Unter-Unterteilungen pro Y-Unterteilung" msgid "Halve Y Subsubdiv. Frequency after 'n' Subdivs. (log only):" msgstr "" "Halbiert Y-Unter-Unterteilungsfrequenz nach n Unterteilungen. (nur " -"Logarithmus) " +"Logarithmus)" #: ../share/extensions/grid_cartesian.inx.h:20 msgid "Major Y Division Thickness (px):" @@ -34842,8 +34862,8 @@ msgid "" msgstr "" "Bitte beachten Sie, das nur HPGL-Dateien geöffnet werden können, welche mit " "Inkscape erstellt wurden. Um andere HPGL-Dateien zu öffnen, ändern Sie die " -"Dateiendung zu .plt, stellen Sie sicher das UniConverter installiert ist " -"und öffnen Sie die Datei erneut." +"Dateiendung zu .plt, stellen Sie sicher das UniConverter installiert ist und " +"öffnen Sie die Datei erneut." #: ../share/extensions/hpgl_input.inx.h:3 #: ../share/extensions/hpgl_output.inx.h:4 @@ -35167,7 +35187,7 @@ msgstr "Rechtschreibprüfung für Text im Dokument" #: ../share/extensions/image_attributes.inx.h:24 #, fuzzy msgid "Image Rendering Quality" -msgstr "Bildrendering:" +msgstr "Bildrendering" #. image-rendering #: ../share/extensions/image_attributes.inx.h:26 @@ -36194,7 +36214,7 @@ msgstr "Maßstab (Zeichnung:Wirkliche Länge) = 1:" #: ../share/extensions/measure.inx.h:10 msgid "Length Unit:" -msgstr "Längeneinheit: " +msgstr "Längeneinheit:" #: ../share/extensions/measure.inx.h:12 msgctxt "measure extension" @@ -36557,7 +36577,7 @@ msgstr "" #: ../share/extensions/plotter.inx.h:3 msgid "Connection Settings " -msgstr "Verbindungseinstellungen " +msgstr "Verbindungseinstellungen" #: ../share/extensions/plotter.inx.h:4 msgid "Serial port:" @@ -36569,7 +36589,7 @@ msgid "" "Linux something like: '/dev/ttyUSB0' (Default: COM1)" msgstr "" "Der Port Ihrer seriellen Verbindung ist unter Windows so etwas wie \"COM1\", " -"unter Linux so etwas wie: \"/dev/ttyUSB0\" (Standard: COM1)" +"unter Linux so etwas wie: \"/dev/ttyUSB0\" (Standard: COM1)" #: ../share/extensions/plotter.inx.h:6 msgid "Serial baud rate:" @@ -36880,12 +36900,12 @@ msgstr "Füllfarbe (Blauwert)" #: ../share/extensions/polyhedron_3d.inx.h:39 #, no-c-format msgid "Fill opacity (%):" -msgstr "Deckkraft, %" +msgstr "Deckkraft der Füllung, %" #: ../share/extensions/polyhedron_3d.inx.h:41 #, no-c-format msgid "Stroke opacity (%):" -msgstr "Strich-Deckkraft (%):" +msgstr "Deckkraft der Kontur (%):" #: ../share/extensions/polyhedron_3d.inx.h:42 msgid "Stroke width (px):" @@ -37412,7 +37432,7 @@ msgid "" "level." msgstr "" "Diese Erweiterung optimiert die SVG-Datei nach den folgenden Optionen:\n" -" * Kürzen der Farbnamen:. Konvertiert alle Farben in #RRGGBB oder #RGB-" +" * Kürzen der Farbnamen: Konvertiert alle Farben in #RRGGBB oder #RGB-" "Format.\n" " * Konvertieren von CSS-Attributen zu XML-Attribute: Styles konvertieren " "<style> Tags und Inline-style=\"\" Deklarationen zu XML-Attributen.\n" @@ -37492,15 +37512,13 @@ msgid "Scalable Vector Graphics" msgstr "Skalierbare Vektorgrafik (*.svg)" #: ../share/extensions/seamless_pattern.inx.h:1 -#, fuzzy msgid "Seamless Pattern" -msgstr "Braille Muster" +msgstr "Nahtloses Muster" #: ../share/extensions/seamless_pattern.inx.h:2 #: ../share/extensions/seamless_pattern_procedural.inx.h:2 -#, fuzzy msgid "Custom Width (px):" -msgstr "Breite der Kontur, px" +msgstr "Benutzerdefinierte Breite (px):" #: ../share/extensions/seamless_pattern.inx.h:3 #: ../share/extensions/seamless_pattern_procedural.inx.h:3 @@ -37510,7 +37528,7 @@ msgstr "Rechts (px):" #: ../share/extensions/seamless_pattern.inx.h:4 msgid "This extension overwrite current document" -msgstr "" +msgstr "Diese Erweiterung ersetzt den Inhalt des aktuellen Dokuments." #: ../share/extensions/seamless_pattern_procedural.inx.h:1 msgid "Seamless Pattern Procedural" @@ -38031,11 +38049,11 @@ msgstr "Diagrammtyp:" #: ../share/extensions/voronoi2svg.inx.h:4 msgid "Bounding box of the diagram:" -msgstr "Rahmen des Diagramms:" +msgstr "Objektrahmen des Diagramms:" #: ../share/extensions/voronoi2svg.inx.h:5 msgid "Show the bounding box" -msgstr "Rahmen anzeigen" +msgstr "Objektrahmen anzeigen" #: ../share/extensions/voronoi2svg.inx.h:6 msgid "Delaunay Triangulation" @@ -38188,7 +38206,7 @@ msgid "" "space, and only with a space." msgstr "" "Wenn Sie mehr als ein Attribut setzen wollen, müssen Sie diese mit einzelnen " -"Leerzeichen trennen. " +"Leerzeichen trennen." #: ../share/extensions/web-set-att.inx.h:29 #: ../share/extensions/web-transmit-att.inx.h:27 @@ -38305,7 +38323,7 @@ msgstr "Erzwungene Dimension:" #. i18n. Description duplicated in a fake value attribute in order to make it translatable #: ../share/extensions/webslicer_create_rect.inx.h:7 msgid "Force Dimension must be set as <width>x<height>" -msgstr "Die erzwungene Dimension muss als <Breite>x<Höhe> gesetzt werden." +msgstr "Die erzwungene Dimension muss als <Breite>x<Höhe> gesetzt werden." #: ../share/extensions/webslicer_create_rect.inx.h:8 msgid "If set, this will replace DPI." @@ -38523,35 +38541,6 @@ msgstr "XAML einlesen" #~ msgid "Boolops" #~ msgstr "Bool'sche Operationen" -#, fuzzy -#~ msgid "Start path lean" -#~ msgstr "Überprüfung starten" - -#, fuzzy -#~ msgid "End path lean" -#~ msgstr "2. Pfad:" - -# !!! -#, fuzzy -#~ msgid "<b>Roughen unit</b>" -#~ msgstr "<b>Segment</b>" - -#, fuzzy -#~ msgid "Helper nodes" -#~ msgstr "Hilfsknoten" - -#, fuzzy -#~ msgid "Show helper nodes" -#~ msgstr "Hilfsknoten anzeigen" - -#, fuzzy -#~ msgid "Helper handles" -#~ msgstr "Hilfsanfasser" - -#, fuzzy -#~ msgid "Show helper handles" -#~ msgstr "Hilfsanfasser anzeigen" - #~ msgid "pySerial is not installed." #~ msgstr "pySerial ist nicht installiert." @@ -38564,21 +38553,9 @@ msgstr "XAML einlesen" #~ msgid "EPS+LaTeX: Omit text in EPS, and create LaTeX file" #~ msgstr "EPS+LaTeX: Text in EPS weglassen und LaTeX Datei erstellen" -#, fuzzy -#~ msgid "Show helper paths" -#~ msgstr "Hilfspfade anzeigen" - #~ msgid "_Templates..." #~ msgstr "_Vorlagen..." -#, fuzzy -#~ msgid "Custom Width (px.):" -#~ msgstr "Breite, px" - -#, fuzzy -#~ msgid "Custom Height (px.):" -#~ msgstr "Höhe (px):" - #~ msgid "A4 Landscape Page" #~ msgstr "A4 Querformat" @@ -38990,7 +38967,7 @@ msgstr "XAML einlesen" #~ msgstr "Filter-Auflösung setzen" #~ msgid "Fills object bounding box with color" -#~ msgstr "Füllt Objektrahmen mit Farbe" +#~ msgstr "Füllt Objektrahmen des Objekts mit Farbe" #~ msgid "Link or embed image:" #~ msgstr "Bild verknüpfen oder einbetten:" @@ -39909,7 +39886,7 @@ msgstr "XAML einlesen" #~ msgstr "Ziehen von Verbinder-Endpunkten abgebrochen." #~ msgid "_Text:" -#~ msgstr "_Text: " +#~ msgstr "_Text:" #~ msgid "Find objects by their text content (exact or partial match)" #~ msgstr "" @@ -39923,7 +39900,7 @@ msgstr "XAML einlesen" #~ "Übereinstimmung)" #~ msgid "_Style:" -#~ msgstr "_Stil: " +#~ msgstr "_Stil:" #~ msgid "" #~ "Find objects by the value of the style attribute (exact or partial match)" @@ -39931,7 +39908,7 @@ msgstr "XAML einlesen" #~ "Objekte nach ihren Stilen finden (exakte oder teilweise Übereinstimmung)" #~ msgid "_Attribute:" -#~ msgstr "_Attribut: " +#~ msgstr "_Attribut:" #~ msgid "Find objects by the name of an attribute (exact or partial match)" #~ msgstr "" @@ -40415,12 +40392,12 @@ msgstr "XAML einlesen" #~ "a small part of the guide near the cursor will snap)" #~ msgstr "" #~ "Während des Ziehens einer Hilfslinie rastet diese an Objekt-Knoten oder " -#~ "Ecken von Umrandungskästen ein (\"An Knoten einrasten\" oder \"An " -#~ "Umrandungsecken einrasten\" muss aktiviert sein; nur ein kleiner Teil um " -#~ "den Mauszeiger wird einrasten)" +#~ "Ecken von Objektrahmen ein (\"An Knoten einrasten\" oder \"An " +#~ "Objektrahmen einrasten\" muss aktiviert sein; nur ein kleiner Teil um den " +#~ "Mauszeiger wird einrasten)" #~ msgid "Snap to bounding box corners" -#~ msgstr "An Ecken der Umrandung einrasten" +#~ msgstr "An Ecken des Objektrahmens einrasten" #~ msgid "Matte jelly" #~ msgstr "Mattes Gelee" @@ -40619,7 +40596,7 @@ msgstr "XAML einlesen" #~ msgstr "Schwarzer Umriss" #~ msgid "Draws a black outline around" -#~ msgstr "Zeichnet einen schwarzen Umriss " +#~ msgstr "Zeichnet einen schwarzen Umriss" #~ msgid "Draws a colored outline around" #~ msgstr "Zeichnet einen farbige Umriss" @@ -40851,8 +40828,7 @@ msgstr "XAML einlesen" #~ "Adobe Illustrator-Elementen und Attribute.\n" #~ " * Vorschau einschalten: Setzt Bildgröße auf 100%/100% und fügt eine " #~ "Vorschau ein.\n" -#~ " * Herauslösen des XML Prologes: Es wird kein XML-Prolog " -#~ "ausgegeben.\n" +#~ " * Herauslösen des XML Prologes: Es wird kein XML-Prolog ausgegeben.\n" #~ " * Genauigkeit: Anzahl der maßgeblichen Stellen setzen (Vorgabe: 5).\n" #~ " * Einzug: Einrücken der Ausgabe: Kein, Space, Tab (Vorgabe: Space)." @@ -41225,7 +41201,7 @@ msgstr "XAML einlesen" #~ msgctxt "Filter blend mode" #~ msgid "Screen" -#~ msgstr "Screen" +#~ msgstr "Negativ multiplizieren" #~ msgid "When the original is deleted, its clones:" #~ msgstr "Wenn das Original gelöscht wird, werden Klone:" @@ -42162,7 +42138,7 @@ msgstr "XAML einlesen" #~ msgstr "Encapsulated-Postscript-Ausgabe" #~ msgid "Make bounding box around full page" -#~ msgstr "Umrandungsbox um ganze Seite" +#~ msgstr "Objektrahmen um ganze Seite" #~ msgid "Embed fonts (Type 1 only)" #~ msgstr "Fonts einbetten (nur Type 1)" @@ -42318,7 +42294,7 @@ msgstr "XAML einlesen" #~ msgstr "Fonts beim Exportieren einbetten (nur Type 1) (EPS)" #~ msgid "Export files with the bounding box set to the page size (EPS)" -#~ msgstr "Exportiere EPS-Dateien mit den Seitengrößen als Umrandungsbox" +#~ msgstr "Exportiere EPS-Dateien mit den Seitengrößen als Objektrahmen" #~ msgid "Select <b>at least two objects</b> to combine." #~ msgstr "<b>Mindestens zwei Objekte</b> zum Kombinieren auswählen." @@ -42378,12 +42354,6 @@ msgstr "XAML einlesen" #~ msgid "Snap nodes to object paths" #~ msgstr "Knoten an Objektpfaden einrasten" -#~ msgid "Snap bounding box corners and guides to bounding box edges" -#~ msgstr "_Umrandungsbox an Hilfslinien einrasten" - -#~ msgid "Snap bounding box corners and nodes to the page border" -#~ msgstr "_Umrandungsbox an Hilfslinien einrasten" - #~ msgid "_Grid with guides" #~ msgstr "Gitter/Hilfslinien" diff --git a/share/attributes/css_defaults b/share/attributes/css_defaults index 1f8e8835b..05735a0f2 100644 --- a/share/attributes/css_defaults +++ b/share/attributes/css_defaults @@ -1,5 +1,7 @@ "alignment-baseline" - "auto" - "no" +"backface-visibility" - "visible" - "no" + "baseline-shift" - "baseline" - "no" "clip" - "auto" - "no" @@ -90,6 +92,10 @@ "paint-order" - "normal" - "yes" +"perspective" - "none" - "no" + +"perspective-origin" - "NO_DEFAULT" - "no" + "pointer-events" - "visiblePainted" - "yes" "shape-rendering" - "auto" - "yes" @@ -124,10 +130,30 @@ "text-decoration" - "NO_DEFAULT" - "no" +"text-decoration-color" - "NO_DEFAULT" - "no" + +"text-decoration-fill" - "NO_DEFAULT" - "no" + +"text-decoration-line" - "none" - "no" + +"text-decoration-stroke" - "NO_DEFAULT" - "no" + +"text-decoration-style" - "solid" - "no" + +"text-orientation" - "mixed" - "yes" + "text-rendering" - "auto" - "yes" "title" - "NO DEFAULT" - "no" +"transform" - "none" - "no" + +"transform-box" - "NO_DEFAULT" - "no" + +"transform-origin" - "NO_DEFAULT" - "no" + +"transform-style" - "flat" - "no" + "unicode-bidi" - "normal" - "no" "visibility" - "visible" - "yes" diff --git a/share/attributes/cssprops b/share/attributes/cssprops index 1f8be6b16..3767200a4 100644 --- a/share/attributes/cssprops +++ b/share/attributes/cssprops @@ -1,5 +1,7 @@ "alignment-baseline" - "tspan","tref","altGlyph","textPath" +"backface-visibility" - "a","defs","glyph","g","marker","mask","missing-glyph","pattern","svg","switch","symbol","use","circle","ellipse","image","line","path","polygon","polyline","rect","text","use" + "baseline-shift" - "tspan","tref","altGlyph","textPath" "clip" - "svg","symbol","foreignObject","pattern","marker" @@ -90,6 +92,10 @@ "paint-order" - "a","defs","glyph","g","marker","mask","missing-glyph","pattern","svg","switch","symbol","use","circle","ellipse","image","line","path","polygon","polyline","rect","text","use","a","defs","glyph","g","marker","mask","missing-glyph","pattern","svg","switch","symbol","use" +"perspective" - "a","defs","glyph","g","marker","mask","missing-glyph","pattern","svg","switch","symbol","use","circle","ellipse","image","line","path","polygon","polyline","rect","text","use" + +"perspective-origin" - "a","defs","glyph","g","marker","mask","missing-glyph","pattern","svg","switch","symbol","use","circle","ellipse","image","line","path","polygon","polyline","rect","text","use" + "pointer-events" - "circle","ellipse","image","line","path","polygon","polyline","rect","text","use","a","defs","glyph","g","marker","mask","missing-glyph","pattern","svg","switch","symbol","use" "shape-rendering" - "path","rect","circle","ellipse","line","polyline","polygon","a","defs","glyph","g","marker","mask","missing-glyph","pattern","svg","switch","symbol","use" @@ -134,10 +140,20 @@ "text-decoration-style" - "a","defs","glyph","g","marker","mask","missing-glyph","pattern","svg","switch","symbol","use","altGlyph","textPath","text","tref","tspan","flowRoot","flowPara","flowSpan" +"text-orientation" - "a","defs","glyph","g","marker","mask","missing-glyph","pattern","svg","switch","symbol","use","altGlyph","textPath","text","tref","tspan","flowRoot","flowPara","flowSpan","a","defs","glyph","g","marker","mask","missing-glyph","pattern","svg","switch","symbol","use" + "text-rendering" - "text","a","defs","glyph","g","marker","mask","missing-glyph","pattern","svg","switch","symbol","use" "title" - "circle","ellipse","image","line","path","polygon","polyline","rect","text","use","g" +"transform" - "a","defs","glyph","g","marker","mask","missing-glyph","pattern","svg","switch","symbol","use","circle","ellipse","image","line","path","polygon","polyline","rect","text","use" + +"transform-box" - "a","defs","glyph","g","marker","mask","missing-glyph","pattern","svg","switch","symbol","use","circle","ellipse","image","line","path","polygon","polyline","rect","text","use" + +"transform-origin" - "a","defs","glyph","g","marker","mask","missing-glyph","pattern","svg","switch","symbol","use","circle","ellipse","image","line","path","polygon","polyline","rect","text","use" + +"transform-style" - "a","defs","glyph","g","marker","mask","missing-glyph","pattern","svg","switch","symbol","use","circle","ellipse","image","line","path","polygon","polyline","rect","text","use" + "unicode-bidi" - "altGlyph","textPath","text","tref","tspan","flowRoot","flowPara","flowSpan" "visibility" - "text","tspan","tref","altGlyph","textPath","a","circle","ellipse","image","line","path","polygon","polyline","rect","text","use","a","defs","glyph","g","marker","mask","missing-glyph","pattern","svg","switch","symbol","use" diff --git a/share/attributes/genMapDataCSS.pl b/share/attributes/genMapDataCSS.pl index 438c26d04..0d6e5c13d 100755 --- a/share/attributes/genMapDataCSS.pl +++ b/share/attributes/genMapDataCSS.pl @@ -223,8 +223,8 @@ $properties{ "text-decoration-color" }->{inherit} = "no"; push @{$properties{ "text-decoration-style" }->{elements}}, @container_elements; push @{$properties{ "text-decoration-style" }->{elements}}, @text_content_elements; -$properties{ "text-decoration-color" }->{default} = "solid"; -$properties{ "text-decoration-color" }->{inherit} = "no"; +$properties{ "text-decoration-style" }->{default} = "solid"; +$properties{ "text-decoration-style" }->{inherit} = "no"; push @{$properties{ "text-decoration-fill" }->{elements}}, @container_elements; push @{$properties{ "text-decoration-fill" }->{elements}}, @text_content_elements; @@ -236,6 +236,47 @@ push @{$properties{ "text-decoration-stroke" }->{elements}}, @text_content_eleme $properties{ "text-decoration-stroke" }->{default} = "NO_DEFAULT"; $properties{ "text-decoration-stroke" }->{inherit} = "no"; +# CSS Writing Modes +push @{$properties{ "text-orientation" }->{elements}}, @container_elements; +push @{$properties{ "text-orientation" }->{elements}}, @text_content_elements; +$properties{ "text-orientation" }->{default} = "mixed"; +$properties{ "text-orientation" }->{inherit} = "yes"; + +# CSS Transformations +push @{$properties{ "transform" }->{elements}}, @container_elements; +push @{$properties{ "transform" }->{elements}}, @graphics_elements; +$properties{ "transform" }->{default} = "none"; +$properties{ "transform" }->{inherit} = "no"; + +push @{$properties{ "transform-box" }->{elements}}, @container_elements; +push @{$properties{ "transform-box" }->{elements}}, @graphics_elements; +$properties{ "transform-box" }->{default} = "NO_DEFAULT"; # Default no 100% fixed. +$properties{ "transform-box" }->{inherit} = "no"; + +push @{$properties{ "transform-origin" }->{elements}}, @container_elements; +push @{$properties{ "transform-origin" }->{elements}}, @graphics_elements; +$properties{ "transform-origin" }->{default} = "NO_DEFAULT"; # Default is complicated +$properties{ "transform-origin" }->{inherit} = "no"; + +push @{$properties{ "transform-style" }->{elements}}, @container_elements; +push @{$properties{ "transform-style" }->{elements}}, @graphics_elements; +$properties{ "transform-style" }->{default} = "flat"; +$properties{ "transform-style" }->{inherit} = "no"; + +push @{$properties{ "perspective" }->{elements}}, @container_elements; +push @{$properties{ "perspective" }->{elements}}, @graphics_elements; +$properties{ "perspective" }->{default} = "none"; +$properties{ "perspective" }->{inherit} = "no"; + +push @{$properties{ "perspective-origin" }->{elements}}, @container_elements; +push @{$properties{ "perspective-origin" }->{elements}}, @graphics_elements; +$properties{ "perspective-origin" }->{default} = "NO_DEFAULT"; # Default is complicated +$properties{ "perspective-origin" }->{inherit} = "no"; + +push @{$properties{ "backface-visibility" }->{elements}}, @container_elements; +push @{$properties{ "backface-visibility" }->{elements}}, @graphics_elements; +$properties{ "backface-visibility" }->{default} = "visible"; +$properties{ "backface-visibility" }->{inherit} = "no"; # Output diff --git a/share/attributes/genMapDataSVG.pl b/share/attributes/genMapDataSVG.pl index f3d84d2c5..d64b1c01d 100755 --- a/share/attributes/genMapDataSVG.pl +++ b/share/attributes/genMapDataSVG.pl @@ -84,6 +84,29 @@ push @{$attributes{ "style" }->{elements}}, "flowRoot","flowPara","flowSpan","fl push @{$attributes{ "xml:space" }->{elements}}, "flowRoot","flowPara","flowSpan"; push @{$attributes{ "transform" }->{elements}}, "flowRoot","flowPara","flowSpan"; +# Mesh gradients +push @{$attributes{ "id" }->{elements}}, "mesh","meshrow","meshpatch"; +push @{$attributes{ "path" }->{elements}}, "stop"; +push @{$attributes{ "gradientUnits" }->{elements}}, "mesh"; +push @{$attributes{ "gradientTransform" }->{elements}}, "mesh"; +#push @{$attributes{ "transform" }->{elements}}, "mesh"; +push @{$attributes{ "href" }->{elements}}, "mesh"; +push @{$attributes{ "type" }->{elements}}, "mesh"; +push @{$attributes{ "x" }->{elements}}, "mesh"; +push @{$attributes{ "y" }->{elements}}, "mesh"; +push @{$attributes{ "xlink:href" }->{elements}}, "mesh"; + +# Hatches +push @{$attributes{ "id" }->{elements}}, "hatch","hatchpath"; +push @{$attributes{ "pitch" }->{elements}}, "hatch"; +push @{$attributes{ "rotate" }->{elements}}, "hatch"; +push @{$attributes{ "hatchUnits" }->{elements}}, "hatch"; +push @{$attributes{ "hatchContentUnits" }->{elements}}, "hatch"; +push @{$attributes{ "transform" }->{elements}}, "hatch"; +push @{$attributes{ "href" }->{elements}}, "hatch"; +push @{$attributes{ "d" }->{elements}}, "hatchpath"; +push @{$attributes{ "offset" }->{elements}}, "hatchpath"; + # Output diff --git a/share/attributes/svgprops b/share/attributes/svgprops index af55671c9..4fbcb16b4 100644 --- a/share/attributes/svgprops +++ b/share/attributes/svgprops @@ -46,7 +46,7 @@ "cy" - "circle","ellipse","radialGradient" -"d" - "path","glyph","missing-glyph" +"d" - "path","glyph","missing-glyph","hatchpath" "descent" - "font-face" @@ -104,12 +104,16 @@ "glyphRef" - "altGlyph","glyphRef" -"gradientTransform" - "linearGradient","radialGradient" +"gradientTransform" - "linearGradient","radialGradient","mesh" -"gradientUnits" - "linearGradient","radialGradient" +"gradientUnits" - "linearGradient","radialGradient","mesh" "hanging" - "font-face" +"hatchContentUnits" - "hatch" + +"hatchUnits" - "hatch" + "height" - "filter","foreignObject","image","pattern","rect","svg","use","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feFlood","feGaussianBlur","feImage","feMerge","feMorphology","feOffset","feSpecularLighting","feTile","feTurbulence","mask" "horiz-adv-x" - "font","glyph","missing-glyph" @@ -118,7 +122,9 @@ "horiz-origin-y" - "font" -"id" - "a","altGlyph","altGlyphDef","altGlyphItem","animate","animateColor","animateMotion","animateTransform","circle","clipPath","color-profile","cursor","defs","desc","ellipse","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence","filter","font","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","foreignObject","g","glyph","glyphRef","hkern","image","line","linearGradient","marker","mask","metadata","missing-glyph","mpath","path","pattern","polygon","polyline","radialGradient","rect","script","set","stop","style","svg","switch","symbol","text","textPath","title","tref","tspan","use","view","vkern","flowRoot","flowPara","flowSpan","flowRect","flowRegion","solidColor" +"href" - "mesh","hatch" + +"id" - "a","altGlyph","altGlyphDef","altGlyphItem","animate","animateColor","animateMotion","animateTransform","circle","clipPath","color-profile","cursor","defs","desc","ellipse","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence","filter","font","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","foreignObject","g","glyph","glyphRef","hkern","image","line","linearGradient","marker","mask","metadata","missing-glyph","mpath","path","pattern","polygon","polyline","radialGradient","rect","script","set","stop","style","svg","switch","symbol","text","textPath","title","tref","tspan","use","view","vkern","flowRoot","flowPara","flowSpan","flowRect","flowRegion","solidColor","mesh","meshrow","meshpatch","hatch","hatchpath" "ideographic" - "font-face" @@ -182,7 +188,7 @@ "numOctaves" - "feTurbulence" -"offset" - "stop","feFuncA","feFuncB","feFuncG","feFuncR" +"offset" - "stop","feFuncA","feFuncB","feFuncG","feFuncR","hatchpath" "onabort" - "svg" @@ -238,7 +244,7 @@ "panose-1" - "font-face" -"path" - "animateMotion" +"path" - "animateMotion","stop" "pathLength" - "path" @@ -248,6 +254,8 @@ "patternUnits" - "pattern" +"pitch" - "hatch" + "points" - "polygon","polyline" "pointsAtX" - "feSpotLight" @@ -284,7 +292,7 @@ "result" - "feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feFlood","feGaussianBlur","feImage","feMerge","feMorphology","feOffset","feSpecularLighting","feTile","feTurbulence" -"rotate" - "altGlyph","animateMotion","text","tref","tspan" +"rotate" - "altGlyph","animateMotion","text","tref","tspan","hatch" "rx" - "ellipse","rect" @@ -334,15 +342,13 @@ "targetY" - "feConvolveMatrix" -"tensor" - "meshpatch" - "textLength" - "text","textPath","tref","tspan" "title" - "style" "to" - "set","animate","animateColor","animateMotion","animateTransform" -"transform" - "a","circle","clipPath","defs","ellipse","foreignObject","g","image","line","path","polygon","polyline","rect","switch","text","use","flowRoot","flowPara","flowSpan" +"transform" - "a","circle","clipPath","defs","ellipse","foreignObject","g","image","line","path","polygon","polyline","rect","switch","text","use","flowRoot","flowPara","flowSpan","hatch" "type" - "animateTransform","feColorMatrix","feTurbulence","script","style","feFuncA","feFuncB","feFuncG","feFuncR","mesh" @@ -386,7 +392,7 @@ "widths" - "font-face" -"x" - "altGlyph","cursor","fePointLight","feSpotLight","filter","foreignObject","glyphRef","image","pattern","rect","svg","text","use","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feFlood","feGaussianBlur","feImage","feMerge","feMorphology","feOffset","feSpecularLighting","feTile","feTurbulence","mask","tref","tspan" +"x" - "altGlyph","cursor","fePointLight","feSpotLight","filter","foreignObject","glyphRef","image","pattern","rect","svg","text","use","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feFlood","feGaussianBlur","feImage","feMerge","feMorphology","feOffset","feSpecularLighting","feTile","feTurbulence","mask","tref","tspan","mesh" "x-height" - "font-face" @@ -400,7 +406,7 @@ "xlink:arcrole" - "a","altGlyph","animate","animateColor","animateMotion","animateTransform","color-profile","cursor","feImage","filter","font-face-uri","glyphRef","image","linearGradient","mpath","pattern","radialGradient","script","set","textPath","tref","use" -"xlink:href" - "a","altGlyph","color-profile","cursor","feImage","filter","font-face-uri","glyphRef","image","linearGradient","mpath","pattern","radialGradient","script","textPath","use","animate","animateColor","animateMotion","animateTransform","set","tref" +"xlink:href" - "a","altGlyph","color-profile","cursor","feImage","filter","font-face-uri","glyphRef","image","linearGradient","mpath","pattern","radialGradient","script","textPath","use","animate","animateColor","animateMotion","animateTransform","set","tref","mesh" "xlink:role" - "a","altGlyph","animate","animateColor","animateMotion","animateTransform","color-profile","cursor","feImage","filter","font-face-uri","glyphRef","image","linearGradient","mpath","pattern","radialGradient","script","set","textPath","tref","use" @@ -416,7 +422,7 @@ "xml:space" - "a","altGlyph","altGlyphDef","altGlyphItem","animate","animateColor","animateMotion","animateTransform","circle","clipPath","color-profile","cursor","defs","desc","ellipse","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence","filter","font","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","foreignObject","g","glyph","glyphRef","hkern","image","line","linearGradient","marker","mask","metadata","missing-glyph","mpath","path","pattern","polygon","polyline","radialGradient","rect","script","set","stop","style","svg","switch","symbol","text","textPath","title","tref","tspan","use","view","vkern","flowRoot","flowPara","flowSpan" -"y" - "altGlyph","cursor","fePointLight","feSpotLight","filter","foreignObject","glyphRef","image","pattern","rect","svg","text","use","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feFlood","feGaussianBlur","feImage","feMerge","feMorphology","feOffset","feSpecularLighting","feTile","feTurbulence","mask","tref","tspan" +"y" - "altGlyph","cursor","fePointLight","feSpotLight","filter","foreignObject","glyphRef","image","pattern","rect","svg","text","use","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feFlood","feGaussianBlur","feImage","feMerge","feMorphology","feOffset","feSpecularLighting","feTile","feTurbulence","mask","tref","tspan","mesh" "y1" - "line","linearGradient" @@ -430,6 +436,8 @@ "alignment-baseline" - "tspan","tref","altGlyph","textPath" +"backface-visibility" - "a","defs","glyph","g","marker","mask","missing-glyph","pattern","svg","switch","symbol","use","circle","ellipse","image","line","path","polygon","polyline","rect","text","use" + "baseline-shift" - "tspan","tref","altGlyph","textPath" "clip" - "svg","symbol","foreignObject","pattern","marker" @@ -520,10 +528,18 @@ "paint-order" - "a","defs","glyph","g","marker","mask","missing-glyph","pattern","svg","switch","symbol","use","circle","ellipse","image","line","path","polygon","polyline","rect","text","use","a","defs","glyph","g","marker","mask","missing-glyph","pattern","svg","switch","symbol","use" +"perspective" - "a","defs","glyph","g","marker","mask","missing-glyph","pattern","svg","switch","symbol","use","circle","ellipse","image","line","path","polygon","polyline","rect","text","use" + +"perspective-origin" - "a","defs","glyph","g","marker","mask","missing-glyph","pattern","svg","switch","symbol","use","circle","ellipse","image","line","path","polygon","polyline","rect","text","use" + "pointer-events" - "circle","ellipse","image","line","path","polygon","polyline","rect","text","use","a","defs","glyph","g","marker","mask","missing-glyph","pattern","svg","switch","symbol","use" "shape-rendering" - "path","rect","circle","ellipse","line","polyline","polygon","a","defs","glyph","g","marker","mask","missing-glyph","pattern","svg","switch","symbol","use" +"solid-color" - "a","defs","glyph","g","marker","mask","missing-glyph","pattern","svg","switch","symbol","use","circle","ellipse","image","line","path","polygon","polyline","rect","text","use" + +"solid-opacity" - "a","defs","glyph","g","marker","mask","missing-glyph","pattern","svg","switch","symbol","use","circle","ellipse","image","line","path","polygon","polyline","rect","text","use" + "stop-color" - "stop" "stop-opacity" - "stop" @@ -550,10 +566,30 @@ "text-decoration" - "altGlyph","textPath","text","tref","tspan","flowRoot","flowPara","flowSpan" +"text-decoration-color" - "a","defs","glyph","g","marker","mask","missing-glyph","pattern","svg","switch","symbol","use","altGlyph","textPath","text","tref","tspan","flowRoot","flowPara","flowSpan" + +"text-decoration-fill" - "a","defs","glyph","g","marker","mask","missing-glyph","pattern","svg","switch","symbol","use","altGlyph","textPath","text","tref","tspan","flowRoot","flowPara","flowSpan" + +"text-decoration-line" - "a","defs","glyph","g","marker","mask","missing-glyph","pattern","svg","switch","symbol","use","altGlyph","textPath","text","tref","tspan","flowRoot","flowPara","flowSpan" + +"text-decoration-stroke" - "a","defs","glyph","g","marker","mask","missing-glyph","pattern","svg","switch","symbol","use","altGlyph","textPath","text","tref","tspan","flowRoot","flowPara","flowSpan" + +"text-decoration-style" - "a","defs","glyph","g","marker","mask","missing-glyph","pattern","svg","switch","symbol","use","altGlyph","textPath","text","tref","tspan","flowRoot","flowPara","flowSpan" + +"text-orientation" - "a","defs","glyph","g","marker","mask","missing-glyph","pattern","svg","switch","symbol","use","altGlyph","textPath","text","tref","tspan","flowRoot","flowPara","flowSpan","a","defs","glyph","g","marker","mask","missing-glyph","pattern","svg","switch","symbol","use" + "text-rendering" - "text","a","defs","glyph","g","marker","mask","missing-glyph","pattern","svg","switch","symbol","use" "title" - "circle","ellipse","image","line","path","polygon","polyline","rect","text","use","g" +"transform" - "a","defs","glyph","g","marker","mask","missing-glyph","pattern","svg","switch","symbol","use","circle","ellipse","image","line","path","polygon","polyline","rect","text","use" + +"transform-box" - "a","defs","glyph","g","marker","mask","missing-glyph","pattern","svg","switch","symbol","use","circle","ellipse","image","line","path","polygon","polyline","rect","text","use" + +"transform-origin" - "a","defs","glyph","g","marker","mask","missing-glyph","pattern","svg","switch","symbol","use","circle","ellipse","image","line","path","polygon","polyline","rect","text","use" + +"transform-style" - "a","defs","glyph","g","marker","mask","missing-glyph","pattern","svg","switch","symbol","use","circle","ellipse","image","line","path","polygon","polyline","rect","text","use" + "unicode-bidi" - "altGlyph","textPath","text","tref","tspan","flowRoot","flowPara","flowSpan" "visibility" - "text","tspan","tref","altGlyph","textPath","a","circle","ellipse","image","line","path","polygon","polyline","rect","text","use","a","defs","glyph","g","marker","mask","missing-glyph","pattern","svg","switch","symbol","use" diff --git a/share/extensions/dxf_outlines.py b/share/extensions/dxf_outlines.py index a45100cf5..b7ae0ef14 100755 --- a/share/extensions/dxf_outlines.py +++ b/share/extensions/dxf_outlines.py @@ -207,28 +207,28 @@ class MyEffect(inkex.Effect): return p = cubicsuperpath.parsePath(d) elif node.tag == inkex.addNS('rect','svg'): - x = float(node.get('x')) - y = float(node.get('y')) + x = float(node.get('x', 0)) + y = float(node.get('y', 0)) width = float(node.get('width')) height = float(node.get('height')) d = "m %s,%s %s,%s %s,%s %s,%s z" % (x, y, width, 0, 0, height, -width, 0) p = cubicsuperpath.parsePath(d) elif node.tag == inkex.addNS('line','svg'): - x1 = float(node.get('x1')) - x2 = float(node.get('x2')) - y1 = float(node.get('y1')) - y2 = float(node.get('y2')) + x1 = float(node.get('x1', 0)) + x2 = float(node.get('x2', 0)) + y1 = float(node.get('y1', 0)) + y2 = float(node.get('y2', 0)) d = "M %s,%s L %s,%s" % (x1, y1, x2, y2) p = cubicsuperpath.parsePath(d) elif node.tag == inkex.addNS('circle','svg'): - cx = float(node.get('cx')) - cy = float(node.get('cy')) + cx = float(node.get('cx', 0)) + cy = float(node.get('cy', 0)) r = float(node.get('r')) d = "m %s,%s a %s,%s 0 0 1 %s,%s %s,%s 0 0 1 %s,%s z" % (cx + r, cy, r, r, -2*r, 0, r, r, 2*r, 0) p = cubicsuperpath.parsePath(d) elif node.tag == inkex.addNS('ellipse','svg'): - cx = float(node.get('cx')) - cy = float(node.get('cy')) + cx = float(node.get('cx', 0)) + cy = float(node.get('cy', 0)) rx = float(node.get('rx')) ry = float(node.get('ry')) d = "m %s,%s a %s,%s 0 0 1 %s,%s %s,%s 0 0 1 %s,%s z" % (cx + rx, cy, rx, ry, -2*rx, 0, rx, ry, 2*rx, 0) diff --git a/share/extensions/rtree.inx b/share/extensions/rtree.inx index 5fcac5560..8f6baee7d 100644 --- a/share/extensions/rtree.inx +++ b/share/extensions/rtree.inx @@ -6,6 +6,7 @@ <dependency type="executable" location="extensions">inkex.py</dependency> <param name="size" type="float" min="0.0" max="1000.0" _gui-text="Initial size:">100.0</param> <param name="minimum" type="float" min="0.0" max="500.0" _gui-text="Minimum size:">40.0</param> + <param name="pentoggle" type="boolean" _gui-text="Omit redundant segments" _gui-description="Lift pen for backward steps">false</param> <effect> <object-type>all</object-type> <effects-menu> diff --git a/share/extensions/rtree.py b/share/extensions/rtree.py index db677d0d5..7123beb1e 100755 --- a/share/extensions/rtree.py +++ b/share/extensions/rtree.py @@ -1,6 +1,7 @@ #!/usr/bin/env python ''' Copyright (C) 2005 Aaron Spike, aaron@ekips.org +Copyright (C) 2015 su_v, suv-sf@users.sf.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -18,19 +19,23 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ''' import inkex, simplestyle, pturtle, random -def rtree(turtle, size, min): +def rtree(turtle, size, min, pt=False): if size < min: return turtle.fd(size) turn = random.uniform(20, 40) turtle.lt(turn) - rtree(turtle, size*random.uniform(0.5,0.9), min) + rtree(turtle, size*random.uniform(0.5,0.9), min, pt) turtle.rt(turn) turn = random.uniform(20, 40) turtle.rt(turn) - rtree(turtle, size*random.uniform(0.5,0.9), min) + rtree(turtle, size*random.uniform(0.5,0.9), min, pt) turtle.lt(turn) + if pt: + turtle.pu() turtle.bk(size) + if pt: + turtle.pd() class RTreeTurtle(inkex.Effect): def __init__(self): @@ -43,6 +48,10 @@ class RTreeTurtle(inkex.Effect): action="store", type="float", dest="minimum", default=4.0, help="minimum branch size") + self.OptionParser.add_option("--pentoggle", + action="store", type="inkbool", + dest="pentoggle", default=False, + help="Lift pen for backward steps") def effect(self): self.options.size = self.unittouu(str(self.options.size) + 'px') self.options.minimum = self.unittouu(str(self.options.minimum) + 'px') @@ -54,7 +63,7 @@ class RTreeTurtle(inkex.Effect): t.pu() t.setpos(self.view_center) t.pd() - rtree(t, self.options.size, self.options.minimum) + rtree(t, self.options.size, self.options.minimum, self.options.pentoggle) attribs = {'d':t.getPath(),'style':simplestyle.formatStyle(s)} inkex.etree.SubElement(self.current_layer, inkex.addNS('path','svg'), attribs) diff --git a/src/2geom/path-sink.cpp b/src/2geom/path-sink.cpp index 3b8d407f8..77301b716 100644 --- a/src/2geom/path-sink.cpp +++ b/src/2geom/path-sink.cpp @@ -73,8 +73,8 @@ void PathSink::feed(Rect const &r) { void PathSink::feed(Circle const &e) { Coord r = e.radius(); Point c = e.center(); - Point a = c + Point(0, c[Y] + r); - Point b = c + Point(0, c[Y] - r); + Point a = c + Point(0, +r); + Point b = c + Point(0, -r); moveTo(a); arcTo(r, r, 0, false, false, b); diff --git a/src/attributes-test.h b/src/attributes-test.h index 411304ec3..e197deedf 100644 --- a/src/attributes-test.h +++ b/src/attributes-test.h @@ -43,6 +43,7 @@ public: SVG 2: text-decoration-fill, text-decoration-stroke SVG 2: solid-color, solid-opacity SVG 2: Hatches and Meshes + CSS 3: text-orientation CSS 3: font-variant-xxx, font-feature-settings */ struct {char const *attr; bool supported;} const all_attrs[] = { @@ -69,7 +70,6 @@ struct {char const *attr; bool supported;} const all_attrs[] = { {"baseProfile", false}, {"bbox", true}, {"bias", true}, - {"block-progression", true}, {"by", true}, {"calcMode", true}, {"cap-height", true}, @@ -334,6 +334,7 @@ struct {char const *attr; bool supported;} const all_attrs[] = { {"widths", true}, {"word-spacing", true}, {"writing-mode", true}, + {"text-orientation", true}, {"x", true}, {"x-height", true}, {"x1", true}, diff --git a/src/attributes.cpp b/src/attributes.cpp index 991834cb2..a237f8861 100644 --- a/src/attributes.cpp +++ b/src/attributes.cpp @@ -440,8 +440,8 @@ static SPStyleProp const props[] = { /* Text (css3) */ {SP_PROP_DIRECTION, "direction"}, - {SP_PROP_BLOCK_PROGRESSION, "block-progression"}, {SP_PROP_WRITING_MODE, "writing-mode"}, + {SP_PROP_TEXT_ORIENTATION, "text-orientation"}, {SP_PROP_UNICODE_BIDI, "unicode-bidi"}, {SP_PROP_ALIGNMENT_BASELINE, "alignment-baseline"}, {SP_PROP_BASELINE_SHIFT, "baseline-shift"}, diff --git a/src/attributes.h b/src/attributes.h index 47f1388b0..42ec99d8f 100644 --- a/src/attributes.h +++ b/src/attributes.h @@ -444,8 +444,8 @@ enum SPAttributeEnum { SP_PROP_TEXT_TRANSFORM, SP_PROP_DIRECTION, - SP_PROP_BLOCK_PROGRESSION, SP_PROP_WRITING_MODE, + SP_PROP_TEXT_ORIENTATION, SP_PROP_UNICODE_BIDI, SP_PROP_ALIGNMENT_BASELINE, SP_PROP_BASELINE_SHIFT, diff --git a/src/libnrtype/Layout-TNG-Compute.cpp b/src/libnrtype/Layout-TNG-Compute.cpp index d81e1b6b4..c4b0a5bee 100644 --- a/src/libnrtype/Layout-TNG-Compute.cpp +++ b/src/libnrtype/Layout-TNG-Compute.cpp @@ -24,15 +24,31 @@ namespace Text { #define TRACE(_args) IFTRACE(g_print _args) // ******* enum conversion tables + +// These enums are probably from the SVG 1.0 era where one could interpret 'writing-mode' as setting direction. +// SVG 1.1 makes it clear that 'direction' should be used. 'direction' has only two values 'ltr' and 'rtl'. +// The first two values for the 'writing-mode' enum just happen to match the first two value of 'direction' so the +// existing code worked when 'writing-mode' was changed to 'direction'. +// static Layout::EnumConversionItem const enum_convert_spstyle_direction_to_pango_direction[] = { +// {SP_CSS_WRITING_MODE_LR_TB, PANGO_DIRECTION_LTR}, +// {SP_CSS_WRITING_MODE_RL_TB, PANGO_DIRECTION_RTL}, +// {SP_CSS_WRITING_MODE_TB_LR, PANGO_DIRECTION_LTR}}; // this is correct + +// static Layout::EnumConversionItem const enum_convert_spstyle_direction_to_my_direction[] = { +// {SP_CSS_WRITING_MODE_LR_TB, Layout::LEFT_TO_RIGHT}, +// {SP_CSS_WRITING_MODE_RL_TB, Layout::RIGHT_TO_LEFT}, +// {SP_CSS_WRITING_MODE_TB_LR, Layout::LEFT_TO_RIGHT}}; // this is correct + +// Proper 'direction' enums static Layout::EnumConversionItem const enum_convert_spstyle_direction_to_pango_direction[] = { - {SP_CSS_WRITING_MODE_LR_TB, PANGO_DIRECTION_LTR}, - {SP_CSS_WRITING_MODE_RL_TB, PANGO_DIRECTION_RTL}, - {SP_CSS_WRITING_MODE_TB_LR, PANGO_DIRECTION_LTR}}; // this is correct + {SP_CSS_DIRECTION_LTR, PANGO_DIRECTION_LTR}, + {SP_CSS_DIRECTION_RTL, PANGO_DIRECTION_RTL}}; static Layout::EnumConversionItem const enum_convert_spstyle_direction_to_my_direction[] = { - {SP_CSS_WRITING_MODE_LR_TB, Layout::LEFT_TO_RIGHT}, - {SP_CSS_WRITING_MODE_RL_TB, Layout::RIGHT_TO_LEFT}, - {SP_CSS_WRITING_MODE_TB_LR, Layout::LEFT_TO_RIGHT}}; // this is correct + {SP_CSS_DIRECTION_LTR, Layout::LEFT_TO_RIGHT}, + {SP_CSS_DIRECTION_RTL, Layout::RIGHT_TO_LEFT}}; + + /** \brief private to Layout. Does the real work of text flowing. diff --git a/src/libnrtype/Layout-TNG-Input.cpp b/src/libnrtype/Layout-TNG-Input.cpp index 84f3f260e..77480cebe 100644 --- a/src/libnrtype/Layout-TNG-Input.cpp +++ b/src/libnrtype/Layout-TNG-Input.cpp @@ -172,43 +172,33 @@ float Layout::InputStreamTextSource::styleComputeFontSize() const return medium_font_size * inherit_multiplier; } -static const Layout::EnumConversionItem enum_convert_spstyle_block_progression_to_direction[] = { - {SP_CSS_BLOCK_PROGRESSION_TB, Layout::TOP_TO_BOTTOM}, - {SP_CSS_BLOCK_PROGRESSION_LR, Layout::LEFT_TO_RIGHT}, - {SP_CSS_BLOCK_PROGRESSION_RL, Layout::RIGHT_TO_LEFT}}; - -static const Layout::EnumConversionItem enum_convert_spstyle_writing_mode_to_direction[] = { - {SP_CSS_WRITING_MODE_LR_TB, Layout::TOP_TO_BOTTOM}, - {SP_CSS_WRITING_MODE_RL_TB, Layout::TOP_TO_BOTTOM}, - {SP_CSS_WRITING_MODE_TB_RL, Layout::RIGHT_TO_LEFT}, - {SP_CSS_WRITING_MODE_TB_LR, Layout::LEFT_TO_RIGHT}}; - Layout::Direction Layout::InputStreamTextSource::styleGetBlockProgression() const { - // this function shouldn't be necessary, but since style.cpp doesn't support - // shorthand properties yet, it is. - SPStyle const *this_style = style; + switch( style->writing_mode.computed ) { - for ( ; ; ) { - if (this_style->block_progression.set) - return (Layout::Direction)_enum_converter(this_style->block_progression.computed, enum_convert_spstyle_block_progression_to_direction, sizeof(enum_convert_spstyle_block_progression_to_direction)/sizeof(enum_convert_spstyle_block_progression_to_direction[0])); - if (this_style->writing_mode.set) - return (Layout::Direction)_enum_converter(this_style->writing_mode.computed, enum_convert_spstyle_writing_mode_to_direction, sizeof(enum_convert_spstyle_writing_mode_to_direction)/sizeof(enum_convert_spstyle_writing_mode_to_direction[0])); - if (this_style->object == NULL || this_style->object->parent == NULL) break; - this_style = this_style->object->parent->style; - if (this_style == NULL) break; - } + case SP_CSS_WRITING_MODE_LR_TB: + case SP_CSS_WRITING_MODE_RL_TB: return TOP_TO_BOTTOM; + + case SP_CSS_WRITING_MODE_TB_RL: + return RIGHT_TO_LEFT; + + case SP_CSS_WRITING_MODE_TB_LR: + return LEFT_TO_RIGHT; + default: + std::cerr << "Layout::InputTextStream::styleGetBlockProgression: invalid writing mode." << std::endl; + } + return TOP_TO_BOTTOM; } -static Layout::Alignment text_anchor_to_alignment(unsigned anchor, Layout::Direction /*para_direction*/) +static Layout::Alignment text_anchor_to_alignment(unsigned anchor, Layout::Direction para_direction) { switch (anchor) { default: - case SP_CSS_TEXT_ANCHOR_START: return Layout::LEFT; + case SP_CSS_TEXT_ANCHOR_START: return para_direction == Layout::LEFT_TO_RIGHT ? Layout::LEFT : Layout::RIGHT; case SP_CSS_TEXT_ANCHOR_MIDDLE: return Layout::CENTER; - case SP_CSS_TEXT_ANCHOR_END: return Layout::RIGHT; + case SP_CSS_TEXT_ANCHOR_END: return para_direction == Layout::LEFT_TO_RIGHT ? Layout::RIGHT : Layout::LEFT; } } diff --git a/src/live_effects/lpe-roughen.cpp b/src/live_effects/lpe-roughen.cpp index 33ffd96d6..ed1ddcaf8 100644 --- a/src/live_effects/lpe-roughen.cpp +++ b/src/live_effects/lpe-roughen.cpp @@ -49,8 +49,14 @@ LPERoughen::LPERoughen(LivePathEffectObject *lpeobject) "global_randomize", &wr, this, 1.), shift_nodes(_("Shift nodes"), _("Shift nodes"), "shift_nodes", &wr, this, true), - shift_node_handles(_("Shift node handles"), _("Shift node handles"), - "shift_node_handles", &wr, this, true) + shift_handles(_("Shift node handles"), _("Shift node handles"), + "shift_handles", &wr, this, true), + retract_handles(_("Retract node handles"), _("Retract node handles"), + "retract_handles", &wr, this, false), + shift_handles_sym(_("Sym shift node handles"), _("Sym shift node handles"), + "shift_handles_sym", &wr, this, false), + fixed_displacement(_("Fixed displacement"), _("Fixed displacement, 1/3 of segment lenght"), + "fixed_displacement", &wr, this, false) { registerParameter(&method); registerParameter(&max_segment_size); @@ -59,7 +65,10 @@ LPERoughen::LPERoughen(LivePathEffectObject *lpeobject) registerParameter(&displace_y); registerParameter(&global_randomize); registerParameter(&shift_nodes); - registerParameter(&shift_node_handles); + registerParameter(&shift_handles); + registerParameter(&retract_handles); + registerParameter(&shift_handles_sym); + registerParameter(&fixed_displacement); displace_x.param_set_range(0., Geom::infinity()); displace_y.param_set_range(0., Geom::infinity()); global_randomize.param_set_range(0., Geom::infinity()); @@ -147,19 +156,21 @@ double LPERoughen::sign(double random_number) return random_number; } -Geom::Point LPERoughen::randomize() +Geom::Point LPERoughen::randomize(double max_lenght) { double displace_x_parsed = displace_x * global_randomize; double displace_y_parsed = displace_y * global_randomize; - Geom::Point output = Geom::Point(sign(displace_x_parsed), sign(displace_y_parsed)); + if( fixed_displacement ){ + Geom::Ray ray(Geom::Point(0,0),output); + output = Geom::Point::polar(ray.angle(), max_lenght); + } return output; } void LPERoughen::doEffect(SPCurve *curve) { - Geom::PathVector const original_pathv = - pathv_to_linear_and_cubic_beziers(curve->get_pathvector()); + Geom::PathVector const original_pathv = pathv_to_linear_and_cubic_beziers(curve->get_pathvector()); curve->reset(); for (Geom::PathVector::const_iterator path_it = original_pathv.begin(); path_it != original_pathv.end(); ++path_it) { @@ -170,40 +181,15 @@ void LPERoughen::doEffect(SPCurve *curve) Geom::Path::const_iterator curve_it2 = ++(path_it->begin()); Geom::Path::const_iterator curve_endit = path_it->end_default(); SPCurve *nCurve = new SPCurve(); - if (path_it->closed()) { - const Geom::Curve &closingline = - path_it->back_closed(); - if (are_near(closingline.initialPoint(), closingline.finalPoint())) { - curve_endit = path_it->end_open(); - } - } - Geom::Point initialMove(0, 0); - if (shift_nodes) { - initialMove = randomize(); - } - Geom::Point initialPoint = curve_it1->initialPoint() + initialMove; - nCurve->moveto(initialPoint); - Geom::Point point0(0, 0); - Geom::Point point1(0, 0); - Geom::Point point2(0, 0); - Geom::Point point3(0, 0); - bool first = true; + Geom::Point prev(0, 0); + nCurve->moveto(curve_it1->initialPoint()); while (curve_it1 != curve_endit) { Geom::CubicBezier const *cubic = NULL; - point0 = curve_it1->initialPoint(); - point1 = curve_it1->initialPoint(); - point2 = curve_it1->finalPoint(); - point3 = curve_it1->finalPoint(); cubic = dynamic_cast<Geom::CubicBezier const *>(&*curve_it1); if (cubic) { - point1 = (*cubic)[1]; - if (shift_nodes && first) { - point1 = (*cubic)[1] + initialMove; - } - point2 = (*cubic)[2]; - nCurve->curveto(point1, point2, point3); + nCurve->curveto((*cubic)[1], (*cubic)[2], curve_it1->finalPoint()); } else { - nCurve->lineto(point3); + nCurve->lineto(curve_it1->finalPoint()); } double length = curve_it1->length(0.001); std::size_t splits = 0; @@ -212,15 +198,21 @@ void LPERoughen::doEffect(SPCurve *curve) } else { splits = ceil(length / max_segment_size); } - for (unsigned int t = splits; t >= 1; t--) { - if (t == 1 && splits != 1) { + Geom::Curve const * original = nCurve->last_segment()->duplicate() ; + for (unsigned int t = 1; t <= splits; t++) { + if(t == splits && splits != 1){ continue; } - const SPCurve *tmp; + SPCurve const * tmp; if (splits == 1) { - tmp = jitter(nCurve->last_segment()); + tmp = jitter(nCurve->last_segment(), prev); } else { - tmp = addNodesAndJitter(nCurve->last_segment(), 1. / t); + bool last = false; + if(t == splits-1){ + last = true; + } + double time = Geom::nearest_time(original->pointAt((1. / (double)splits) * t), *nCurve->last_segment()); + tmp = addNodesAndJitter(nCurve->last_segment(), prev, time, last); } if (nCurve->get_segment_count() > 1) { nCurve->backspace(); @@ -231,12 +223,32 @@ void LPERoughen::doEffect(SPCurve *curve) delete tmp; } ++curve_it1; - if(curve_it2 != curve_endit) { - ++curve_it2; - } - first = false; + ++curve_it2; } if (path_it->closed()) { + if(shift_handles_sym && curve_it1 == curve_endit && !retract_handles){ + SPCurve *out = new SPCurve(); + nCurve = nCurve->create_reverse(); + Geom::CubicBezier const *cubic_start = dynamic_cast<Geom::CubicBezier const *>(nCurve->first_segment()); + Geom::CubicBezier const *cubic = dynamic_cast<Geom::CubicBezier const *>(nCurve->last_segment()); + Geom::Point oposite = nCurve->first_segment()->pointAt(1.0/3.0); + if(cubic_start){ + Geom::Ray ray((*cubic_start)[1], (*cubic_start)[0]); + double dist = Geom::distance((*cubic_start)[1], (*cubic_start)[0]); + oposite = Geom::Point::polar(ray.angle(),dist) + (*cubic_start)[0]; + } + if(cubic){ + out->moveto((*cubic)[0]); + out->curveto((*cubic)[1], oposite, (*cubic)[3]); + } else { + out->moveto(nCurve->last_segment()->initialPoint()); + out->curveto(nCurve->last_segment()->initialPoint(), oposite, nCurve->last_segment()->finalPoint()); + } + nCurve->backspace(); + nCurve->append_continuous(out, 0.001); + nCurve = nCurve->create_reverse(); + } + nCurve->move_endpoints(nCurve->last_segment()->finalPoint(), nCurve->last_segment()->finalPoint()); nCurve->closepath_current(); } curve->append(nCurve, false); @@ -245,77 +257,151 @@ void LPERoughen::doEffect(SPCurve *curve) } } -SPCurve *LPERoughen::addNodesAndJitter(const Geom::Curve *A, double t) +SPCurve const * LPERoughen::addNodesAndJitter(Geom::Curve const * A, Geom::Point &prev, double t, bool last) { SPCurve *out = new SPCurve(); Geom::CubicBezier const *cubic = dynamic_cast<Geom::CubicBezier const *>(&*A); - Geom::Point point1(0, 0); - Geom::Point point2(0, 0); - Geom::Point point3(0, 0); + double max_lenght = Geom::distance(A->initialPoint(),A->pointAt(t)) / 3.0; + Geom::Point point_a1(0, 0); + Geom::Point point_a2(0, 0); + Geom::Point point_a3(0, 0); Geom::Point point_b1(0, 0); Geom::Point point_b2(0, 0); Geom::Point point_b3(0, 0); if (shift_nodes) { - point3 = randomize(); - point_b3 = randomize(); + point_a3 = randomize(max_lenght); + if(last){ + point_b3 = randomize(max_lenght); + } } - if (shift_node_handles) { - point1 = randomize(); - point2 = randomize(); - point_b1 = randomize(); - point_b2 = randomize(); + if (shift_handles || shift_handles_sym) { + point_a1 = randomize(max_lenght); + point_a2 = randomize(max_lenght); + point_b1 = randomize(max_lenght); + if(last){ + point_b2 = randomize(max_lenght); + } } else { - point2 = point3; - point_b1 = point3; - point_b2 = point_b3; + point_a2 = point_a3; + point_b1 = point_a3; + if(last){ + point_b2 = point_b3; + } } - if (cubic) { + if(retract_handles){ + out->moveto(A->initialPoint()); + out->lineto(A->pointAt(t) + point_a3); + if(cubic && !last){ + std::pair<Geom::CubicBezier, Geom::CubicBezier> div = cubic->subdivide(t); + std::vector<Geom::Point> seg2 = div.second.controlPoints(); + out->curveto(seg2[1], seg2[2], seg2[3]); + } else { + out->lineto(A->finalPoint() + point_b3); + } + } else if(shift_handles_sym && cubic) { + std::pair<Geom::CubicBezier, Geom::CubicBezier> div = cubic->subdivide(t); + std::vector<Geom::Point> seg1 = div.first.controlPoints(), + seg2 = div.second.controlPoints(); + Geom::Ray ray(prev,A->initialPoint()); + point_a1 = Geom::Point::polar(ray.angle(), max_lenght); + if(prev == Geom::Point(0,0)){ + point_a1 = randomize(max_lenght); + } + ray.setPoints(seg2[1] + point_a3 + point_b1, seg2[0] + point_a3); + point_a2 = Geom::Point::polar(ray.angle(), max_lenght); + if(last){ + prev = A->pointAt(1 - (t / 3)) + point_b2 + point_b3; + } else { + prev = seg1[3] + point_a2 + point_a3; + } + out->moveto(seg1[0]); + out->curveto(seg1[0] + point_a1, seg1[3] + point_a2 + point_a3, seg1[3] + point_a3); + if(last){ + out->curveto(seg2[1] + point_a3 + point_b1, A->pointAt(1 - (t / 3)) + point_b2 + point_b3, seg2[3] + point_b3); + } else { + out->curveto(seg2[1] + point_a3 + point_b1, seg2[2] + point_b2 + point_b3, seg2[3] + point_b3); + } + } else if(shift_handles_sym && !cubic) { + Geom::Ray ray(prev,A->initialPoint()); + point_a1 = Geom::Point::polar(ray.angle(), max_lenght); + if(prev==Geom::Point(0,0)){ + point_a1 = randomize(max_lenght); + } + ray.setPoints(A->pointAt(t + (t / 3)) + point_a3 + point_b1, A->pointAt(t) + point_a3); + point_a2 = Geom::Point::polar(ray.angle(), max_lenght); + if(last){ + prev = A->pointAt(t +((t / 3) * 2)) + point_b2 + point_b3; + } else { + prev = A->pointAt(t) + point_a3 + point_a2; + } + out->moveto(A->initialPoint()); + out->curveto(A->initialPoint() + point_a1, A->pointAt(t) + point_a3 + point_a2, A->pointAt(t) + point_a3); + out->curveto(A->pointAt(t + (t / 3)) + point_a3 + point_b1, A->pointAt(t +((t / 3) * 2)) + point_b2 + point_b3, A->finalPoint() + point_b3); + } else if (cubic) { std::pair<Geom::CubicBezier, Geom::CubicBezier> div = cubic->subdivide(t); std::vector<Geom::Point> seg1 = div.first.controlPoints(), seg2 = div.second.controlPoints(); out->moveto(seg1[0]); - out->curveto(seg1[1] + point1, seg1[2] + point2, seg1[3] + point3); - out->curveto(seg2[1] + point_b1, seg2[2], seg2[3]); - } else if (shift_node_handles) { + out->curveto(seg1[1] + point_a1, seg1[2] + point_a2 + point_a3, seg1[3] + point_a3); + out->curveto(seg2[1] + point_a3 + point_b1, seg2[2] + point_b2 + point_b3, seg2[3] + point_b3); + } else if (shift_handles) { out->moveto(A->initialPoint()); - out->curveto(A->pointAt(t / 3) + point1, A->pointAt((t / 3) * 2) + point2, - A->pointAt(t) + point3); - out->curveto(A->pointAt(t + (t / 3)) + point_b1, A->pointAt(t + ((t / 3) * 2)), - A->finalPoint()); + out->curveto(A->pointAt(t / 3) + point_a1, A->pointAt((t / 3) * 2) + point_a2 + point_a3, A->pointAt(t) + point_a3); + out->curveto(A->pointAt(t + (t / 3)) + point_a3 + point_b1, A->pointAt(t +((t / 3) * 2)) + point_b2 + point_b3, A->finalPoint() + point_b3); } else { out->moveto(A->initialPoint()); - out->lineto(A->pointAt(t) + point3); - out->lineto(A->finalPoint()); + out->lineto(A->pointAt(t) + point_a3); + out->lineto(A->finalPoint() + point_b3); } return out; } -SPCurve *LPERoughen::jitter(const Geom::Curve *A) +SPCurve *LPERoughen::jitter(Geom::Curve const * A, Geom::Point &prev) { SPCurve *out = new SPCurve(); Geom::CubicBezier const *cubic = dynamic_cast<Geom::CubicBezier const *>(&*A); - Geom::Point point1(0, 0); - Geom::Point point2(0, 0); - Geom::Point point3(0, 0); + double max_lenght = Geom::distance(A->initialPoint(),A->finalPoint()) / 3.0; + Geom::Point point_a1(0, 0); + Geom::Point point_a2(0, 0); + Geom::Point point_a3(0, 0); if (shift_nodes) { - point3 = randomize(); + point_a3 = randomize(max_lenght); } - if (shift_node_handles) { - point1 = randomize(); - point2 = randomize(); - } else { - point2 = point3; + if (shift_handles || shift_handles_sym) { + point_a1 = randomize(max_lenght); + point_a2 = randomize(max_lenght); } - if (cubic) { + if(retract_handles){ + out->moveto(A->initialPoint()); + out->lineto(A->finalPoint() + point_a3); + } else if(shift_handles_sym && cubic) { + Geom::Ray ray(prev,A->initialPoint()); + point_a1 = Geom::Point::polar(ray.angle(), max_lenght); + if(prev == Geom::Point(0,0)){ + point_a1 = A->pointAt(1.0/3.0) + randomize(max_lenght); + } + prev = (*cubic)[2] + point_a2; + out->moveto((*cubic)[0]); + out->curveto((*cubic)[0] + point_a1, (*cubic)[2] + point_a2 + point_a3, (*cubic)[3] + point_a3); + } else if(shift_handles_sym && !cubic) { + Geom::Ray ray(prev,A->initialPoint()); + point_a1 = Geom::Point::polar(ray.angle(), max_lenght); + if(prev==Geom::Point(0,0)){ + point_a1 = A->pointAt(1.0/3.0) + randomize(max_lenght); + } + prev = A->pointAt((1.0/3.0) * 2) + point_a2; + out->moveto(A->initialPoint()); + out->curveto(A->initialPoint() + point_a1, A->pointAt((1.0/3.0) * 2) + point_a2 + point_a3, A->finalPoint() + point_a3); + } else if (cubic) { out->moveto((*cubic)[0]); - out->curveto((*cubic)[1] + point1, (*cubic)[2] + point2, (*cubic)[3] + point3); - } else if (shift_node_handles) { + out->curveto((*cubic)[1] + point_a1, (*cubic)[2] + point_a2 + point_a3, (*cubic)[3] + point_a3); + } else if (shift_handles) { out->moveto(A->initialPoint()); - out->curveto(A->pointAt(0.3333) + point1, A->pointAt(0.6666) + point2, - A->finalPoint() + point3); + out->curveto(A->pointAt(0.3333) + point_a1, A->pointAt(0.6666) + point_a2 + point_a3, + A->finalPoint() + point_a3); } else { out->moveto(A->initialPoint()); - out->lineto(A->finalPoint() + point3); + out->lineto(A->finalPoint() + point_a3); } return out; } diff --git a/src/live_effects/lpe-roughen.h b/src/live_effects/lpe-roughen.h index 2b285cd40..57a516310 100644 --- a/src/live_effects/lpe-roughen.h +++ b/src/live_effects/lpe-roughen.h @@ -36,10 +36,10 @@ public: virtual void doEffect(SPCurve *curve); virtual double sign(double randNumber); - virtual Geom::Point randomize(); + virtual Geom::Point randomize(double max_lenght); virtual void doBeforeEffect(SPLPEItem const * lpeitem); - virtual SPCurve *addNodesAndJitter(const Geom::Curve *A, double t); - virtual SPCurve *jitter(const Geom::Curve *A); + virtual SPCurve const * addNodesAndJitter(Geom::Curve const * A, Geom::Point &prev, double t, bool last); + virtual SPCurve *jitter(Geom::Curve const * A, Geom::Point &prev); virtual Geom::Point tPoint(Geom::Point A, Geom::Point B, double t = 0.5); virtual Gtk::Widget *newWidget(); @@ -51,7 +51,10 @@ private: RandomParam displace_y; RandomParam global_randomize; BoolParam shift_nodes; - BoolParam shift_node_handles; + BoolParam shift_handles; + BoolParam retract_handles; + BoolParam shift_handles_sym; + BoolParam fixed_displacement; LPERoughen(const LPERoughen &); LPERoughen &operator=(const LPERoughen &); diff --git a/src/object-snapper.cpp b/src/object-snapper.cpp index 634d56aa6..7302f9de6 100644 --- a/src/object-snapper.cpp +++ b/src/object-snapper.cpp @@ -637,7 +637,6 @@ void Inkscape::ObjectSnapper::_snapPathsConstrained(IntermSnapResults &isr, constraint_line.appendNew<Geom::LineSegment>(p_max_on_cl); constraint_path.push_back(constraint_line); } - // Length of constraint_path will always be one bool strict_snapping = _snapmanager->snapprefs.getStrictSnapping(); @@ -646,45 +645,15 @@ void Inkscape::ObjectSnapper::_snapPathsConstrained(IntermSnapResults &isr, for (std::vector<SnapCandidatePath >::const_iterator k = _paths_to_snap_to->begin(); k != _paths_to_snap_to->end(); ++k) { if (k->path_vector && _allowSourceToSnapToTarget(p.getSourceType(), (*k).target_type, strict_snapping)) { // Do the intersection math - Geom::CrossingSet cs = Geom::crossings(constraint_path, *(k->path_vector)); - // Store the results as intersection points - unsigned int index = 0; - for (Geom::CrossingSet::const_iterator i = cs.begin(); i != cs.end(); ++i) { - if (index >= constraint_path.size()) { - break; - } - // Reconstruct and store the points of intersection - for (Geom::Crossings::const_iterator m = (*i).begin(); m != (*i).end(); ++m) { - intersections.push_back(constraint_path[index].pointAt((*m).ta)); - } - index++; - } - - //Geom::crossings will not consider the closing segment apparently, so we'll handle that separately here - //TODO: This should have been fixed in rev. #9859, which makes this workaround obsolete - for(Geom::PathVector::iterator it_pv = k->path_vector->begin(); it_pv != k->path_vector->end(); ++it_pv) { - if (it_pv->closed()) { - // Get the closing linesegment and convert it to a path - Geom::Path cls; - cls.close(false); - cls.append(it_pv->back_closed()); - // Intersect that closing path with the constrained path - Geom::Crossings cs = Geom::crossings(constraint_path.front(), cls); - // Reconstruct and store the points of intersection - index = 0; // assuming the constraint path vector has only one path - for (Geom::Crossings::const_iterator m = cs.begin(); m != cs.end(); ++m) { - intersections.push_back(constraint_path[index].pointAt((*m).ta)); - } - } - } + std::vector<Geom::PVIntersection> inters = constraint_path.intersect(*(k->path_vector)); - // Convert the collected points of intersection to snapped points - for (std::vector<Geom::Point>::iterator p_inters = intersections.begin(); p_inters != intersections.end(); ++p_inters) { + // Convert the collected intersections to snapped points + for (std::vector<Geom::PVIntersection>::const_iterator i = inters.begin(); i != inters.end(); ++i) { // Convert to desktop coordinates - (*p_inters) = dt->doc2dt(*p_inters); + Geom::Point p_inters = dt->doc2dt(i->point()); // Construct a snapped point - Geom::Coord dist = Geom::L2(p.getPoint() - *p_inters); - SnappedPoint s = SnappedPoint(*p_inters, p.getSourceType(), p.getSourceNum(), k->target_type, dist, getSnapperTolerance(), getSnapperAlwaysSnap(), true, false, k->target_bbox); + Geom::Coord dist = Geom::L2(p.getPoint() - p_inters); + SnappedPoint s = SnappedPoint(p_inters, p.getSourceType(), p.getSourceNum(), k->target_type, dist, getSnapperTolerance(), getSnapperAlwaysSnap(), true, false, k->target_bbox); // Store the snapped point if (dist <= tolerance) { // If the intersection is within snapping range, then we might snap to it isr.points.push_back(s); diff --git a/src/pure-transform.cpp b/src/pure-transform.cpp index aa89c8a8e..9c7054b9f 100644 --- a/src/pure-transform.cpp +++ b/src/pure-transform.cpp @@ -63,7 +63,7 @@ void PureTransform::snap(::SnapManager *sm, std::vector<Inkscape::SnapCandidateP (*j).setSourceNum(0); first_free_snap = false; } - Inkscape::SnappedPoint snapped_point = snap(sm, *j, (*i).getPoint(), bbox); + Inkscape::SnappedPoint snapped_point = snap(sm, *j, (*i).getPoint(), bbox); // Calls the snap() method of the derived classes // std::cout << "dist = " << snapped_point.getSnapDistance() << std::endl; snapped_point.setPointerDistance(Geom::L2(pointer - (*i).getPoint())); diff --git a/src/sp-mesh-array.cpp b/src/sp-mesh-array.cpp index 445c9a8f6..d76b884ae 100644 --- a/src/sp-mesh-array.cpp +++ b/src/sp-mesh-array.cpp @@ -313,7 +313,7 @@ bool SPMeshPatchI::tensorIsSet( unsigned int i ) { /** Return tensor control point for "corner" i. - If not sest, returns calculated (Coons) point. + If not set, returns calculated (Coons) point. */ Geom::Point SPMeshPatchI::getTensorPoint( guint k ) { @@ -1058,11 +1058,11 @@ void SPMeshNodeArray::create( SPMesh *mg, SPItem *item, Geom::OptRect bbox ) { Geom::Point center = bbox->midpoint(); // Must keep repr and array in sync. We have two choices: - // Build the repr first and the "read" it. - // Construct the array and the "write" it. + // Build the repr first and then "read" it. + // Construct the array and then "write" it. // We'll do the second. - // Remove any existing mesh. We could chose to simply scale an existing mesh... + // Remove any existing mesh. We could choose to simply scale an existing mesh... //clear(); // We get called twice when a new mesh is created...WHY? @@ -2265,10 +2265,12 @@ guint SPMeshNodeArray::color_pick( std::vector<guint> icorners, SPItem* item ) { // Region to average over Geom::Point p = n->p; - // std::cout << " p: " << p << std::endl; + // std::cout << " before transform: p: " << p << std::endl; p *= gr->gradientTransform; - // std::cout << " p: " << p << std::endl; - + // std::cout << " after transform: p: " << p << std::endl; + p *= item->i2doc_affine(); + // std::cout << " after transform: p: " << p << std::endl; + // If on edge, move inward guint cols = patch_columns()+1; guint rows = patch_rows()+1; @@ -2277,7 +2279,7 @@ guint SPMeshNodeArray::color_pick( std::vector<guint> icorners, SPItem* item ) { guint ncol = col * 3; guint nrow = row * 3; - double size = 3.0; + const double size = 3.0; // Top edge if( row == 0 ) { diff --git a/src/style-enums.h b/src/style-enums.h index dfc99282c..03255b3b1 100644 --- a/src/style-enums.h +++ b/src/style-enums.h @@ -163,12 +163,6 @@ enum SPCSSDirection { SP_CSS_DIRECTION_RTL }; -enum SPCSSBlockProgression { - SP_CSS_BLOCK_PROGRESSION_TB, - SP_CSS_BLOCK_PROGRESSION_RL, - SP_CSS_BLOCK_PROGRESSION_LR -}; - enum SPCSSWritingMode { SP_CSS_WRITING_MODE_LR_TB, SP_CSS_WRITING_MODE_RL_TB, @@ -176,6 +170,16 @@ enum SPCSSWritingMode { SP_CSS_WRITING_MODE_TB_LR }; +// CSS WRITING MODES 3 +enum SPCSSTextOrientation { + SP_CSS_TEXT_ORIENTATION_MIXED, + SP_CSS_TEXT_ORIENTATION_UPRIGHT, + SP_CSS_TEXT_ORIENTATION_SIDEWAYS_RIGHT, + SP_CSS_TEXT_ORIENTATION_SIDEWAYS_LEFT, + SP_CSS_TEXT_ORIENTATION_SIDEWAYS, + SP_CSS_TEXT_ORIENTATION_USE_GLYPH_ORIENTATION +}; + enum SPTextAnchor { SP_CSS_TEXT_ANCHOR_START, SP_CSS_TEXT_ANCHOR_MIDDLE, @@ -489,13 +493,6 @@ static SPStyleEnum const enum_direction[] = { {NULL, -1} }; -static SPStyleEnum const enum_block_progression[] = { - {"tb", SP_CSS_BLOCK_PROGRESSION_TB}, - {"rl", SP_CSS_BLOCK_PROGRESSION_RL}, - {"lr", SP_CSS_BLOCK_PROGRESSION_LR}, - {NULL, -1} -}; - static SPStyleEnum const enum_writing_mode[] = { /* Note that using the same enumerator for lr as lr-tb means we write as lr-tb even if the * input file said lr. We prefer writing lr-tb on the grounds that the spec says the initial @@ -504,12 +501,28 @@ static SPStyleEnum const enum_writing_mode[] = { * ECMA scripts may be surprised to find tb-rl in DOM if they set the attribute to rl, so * sharing enumerators for different strings may be a bug (once we support ecma script). */ + // SVG 1.1 Deprecated but still must be supported in SVG 2. {"lr-tb", SP_CSS_WRITING_MODE_LR_TB}, {"rl-tb", SP_CSS_WRITING_MODE_RL_TB}, {"tb-rl", SP_CSS_WRITING_MODE_TB_RL}, {"lr", SP_CSS_WRITING_MODE_LR_TB}, {"rl", SP_CSS_WRITING_MODE_RL_TB}, {"tb", SP_CSS_WRITING_MODE_TB_RL}, + // SVG 2 & CSS 3 Writing Modes + {"horizontal-tb", SP_CSS_WRITING_MODE_LR_TB}, // This is correct, 'direction' distinguishes between 'lr' and 'rl'. + {"vertical-rl", SP_CSS_WRITING_MODE_TB_RL}, + {"vertical-lr", SP_CSS_WRITING_MODE_TB_LR}, + {NULL, -1} +}; + +// CSS WRITING MODES 3 +static SPStyleEnum const enum_text_orientation[] = { + {"mixed", SP_CSS_TEXT_ORIENTATION_MIXED}, // Default + {"upright", SP_CSS_TEXT_ORIENTATION_UPRIGHT}, + {"sideways-right", SP_CSS_TEXT_ORIENTATION_SIDEWAYS_RIGHT}, + {"sideways-left", SP_CSS_TEXT_ORIENTATION_SIDEWAYS_LEFT}, + {"sideways", SP_CSS_TEXT_ORIENTATION_SIDEWAYS}, + {"use-glyph-orientation", SP_CSS_TEXT_ORIENTATION_USE_GLYPH_ORIENTATION}, {NULL, -1} }; diff --git a/src/style.cpp b/src/style.cpp index 0cb5db0a7..369127792 100644 --- a/src/style.cpp +++ b/src/style.cpp @@ -136,8 +136,8 @@ SPStyle::SPStyle(SPDocument *document_in, SPObject *object_in) : text_transform( "text-transform", enum_text_transform, SP_CSS_TEXT_TRANSFORM_NONE ), direction( "direction", enum_direction, SP_CSS_DIRECTION_LTR ), - block_progression("block-progression", enum_block_progression, SP_CSS_BLOCK_PROGRESSION_TB), writing_mode( "writing-mode", enum_writing_mode, SP_CSS_WRITING_MODE_LR_TB ), + text_orientation( "text-orientation",enum_text_orientation,SP_CSS_TEXT_ORIENTATION_MIXED ), baseline_shift(), text_anchor( "text-anchor", enum_text_anchor, SP_CSS_TEXT_ANCHOR_START ), white_space( "white-space", enum_white_space, SP_CSS_WHITE_SPACE_NORMAL ), @@ -318,9 +318,9 @@ SPStyle::SPStyle(SPDocument *document_in, SPObject *object_in) : _properties.push_back( &word_spacing ); _properties.push_back( &text_transform ); - _properties.push_back( &direction ); - _properties.push_back( &block_progression ); _properties.push_back( &writing_mode ); + _properties.push_back( &direction ); + _properties.push_back( &text_orientation ); _properties.push_back( &baseline_shift ); _properties.push_back( &text_anchor ); _properties.push_back( &white_space ); @@ -413,8 +413,8 @@ SPStyle::SPStyle(SPDocument *document_in, SPObject *object_in) : // _propmap.insert( std::make_pair( text_transform.name, reinterpret_cast<SPIBasePtr>(&SPStyle::text_transform ) ) ); // _propmap.insert( std::make_pair( direction.name, reinterpret_cast<SPIBasePtr>(&SPStyle::direction ) ) ); - // _propmap.insert( std::make_pair( block_progression.name, reinterpret_cast<SPIBasePtr>(&SPStyle::block_progression ) ) ); // _propmap.insert( std::make_pair( writing_mode.name, reinterpret_cast<SPIBasePtr>(&SPStyle::writing_mode ) ) ); + // _propmap.insert( std::make_pair( text_orientation.name, reinterpret_cast<SPIBasePtr>(&SPStyle::text_orientation ) ) ); // _propmap.insert( std::make_pair( baseline_shift.name, reinterpret_cast<SPIBasePtr>(&SPStyle::baseline_shift ) ) ); // _propmap.insert( std::make_pair( text_anchor.name, reinterpret_cast<SPIBasePtr>(&SPStyle::text_anchor ) ) ); // _propmap.insert( std::make_pair( white_space.name, reinterpret_cast<SPIBasePtr>(&SPStyle::white_space ) ) ); @@ -778,12 +778,12 @@ SPStyle::readIfUnset( gint id, gchar const *val ) { case SP_PROP_DIRECTION: direction.readIfUnset( val ); break; - case SP_PROP_BLOCK_PROGRESSION: - block_progression.readIfUnset( val ); - break; case SP_PROP_WRITING_MODE: writing_mode.readIfUnset( val ); break; + case SP_PROP_TEXT_ORIENTATION: + text_orientation.readIfUnset( val ); + break; case SP_PROP_TEXT_ANCHOR: text_anchor.readIfUnset( val ); break; @@ -1689,16 +1689,19 @@ sp_style_unset_property_attrs(SPObject *o) repr->setAttribute("text-anchor", NULL); } if (style->white_space.set) { - repr->setAttribute("white_space", NULL); + repr->setAttribute("white-space", NULL); } if (style->shape_inside.set) { - repr->setAttribute("shape_inside", NULL); + repr->setAttribute("shape-inside", NULL); } if (style->shape_padding.set) { - repr->setAttribute("shape_padding", NULL); + repr->setAttribute("shape-padding", NULL); } if (style->writing_mode.set) { - repr->setAttribute("writing_mode", NULL); + repr->setAttribute("writing-mode", NULL); + } + if (style->text_orientation.set) { + repr->setAttribute("text-orientation", NULL); } if (style->filter.set) { repr->setAttribute("filter", NULL); @@ -1781,8 +1784,8 @@ sp_css_attr_unset_text(SPCSSAttr *css) sp_repr_css_set_property(css, "word-spacing", NULL); sp_repr_css_set_property(css, "text-transform", NULL); sp_repr_css_set_property(css, "direction", NULL); - sp_repr_css_set_property(css, "block-progression", NULL); sp_repr_css_set_property(css, "writing-mode", NULL); + sp_repr_css_set_property(css, "text-orientation", NULL); sp_repr_css_set_property(css, "text-anchor", NULL); sp_repr_css_set_property(css, "white-space", NULL); sp_repr_css_set_property(css, "shape-inside", NULL); diff --git a/src/style.h b/src/style.h index 02432d3e7..3948b876c 100644 --- a/src/style.h +++ b/src/style.h @@ -142,12 +142,12 @@ public: SPIEnum text_transform; /* CSS3 Text */ - /** text direction (css3 text 3.2) */ + /** text direction (svg1.1) */ SPIEnum direction; - /** block progression (css3 text 3.2) */ - SPIEnum block_progression; - /** Writing mode (css3 text 3.2 and svg1.1 10.7.2) */ + /** Writing mode (svg1.1 10.7.2, CSS Writing Modes 3) */ SPIEnum writing_mode; + /** Text orientation (CSS Writing Modes 3) */ + SPIEnum text_orientation; /** Baseline shift (svg1.1 10.9.2) */ SPIBaselineShift baseline_shift; diff --git a/src/ui/clipboard.cpp b/src/ui/clipboard.cpp index 816daf2e5..0792fb9c5 100644 --- a/src/ui/clipboard.cpp +++ b/src/ui/clipboard.cpp @@ -565,7 +565,7 @@ bool ClipboardManagerImpl::pastePathEffect(SPDesktop *desktop) } Inkscape::Selection *selection = desktop->getSelection(); - if (selection && selection->isEmpty()) { + if (!selection || selection->isEmpty()) { _userWarn(desktop, _("Select <b>object(s)</b> to paste live path effect to.")); return false; } diff --git a/src/ui/tools/measure-tool.cpp b/src/ui/tools/measure-tool.cpp index 32f164a96..00d66b4c9 100644 --- a/src/ui/tools/measure-tool.cpp +++ b/src/ui/tools/measure-tool.cpp @@ -4,6 +4,7 @@ * Authors: * Felipe Correa da Silva Sanches <juca@members.fsf.org> * Jon A. Cruz <jon@joncruz.org> + * Jabiertxo Arraiza <jabier.arraiza@marker.es> * * Copyright (C) 2011 Authors * @@ -14,67 +15,74 @@ #include <gdk/gdkkeysyms.h> #include <boost/none_t.hpp> #include "util/units.h" -#include "macros.h" -#include "rubberband.h" +#include "display/canvas-text.h" #include "display/curve.h" -#include "text-editing.h" -#include "display/sp-ctrlline.h" #include "display/sodipodi-ctrl.h" +#include "display/sp-ctrlline.h" +#include "display/sp-canvas.h" #include "display/sp-canvas-item.h" #include "display/sp-canvas-util.h" -#include "desktop.h" #include "svg/svg.h" -#include "document.h" -#include <viewbox.h> -#include "pixmaps/cursor-measure.xpm" -#include "preferences.h" -#include "inkscape.h" -#include "knot.h" +#include "svg/svg-color.h" #include "ui/tools/measure-tool.h" #include "ui/tools/freehand-base.h" -#include "display/canvas-text.h" -#include "path-chemistry.h" -#include "2geom/line.h" +#include "ui/control-manager.h" +#include <2geom/line.h> #include <2geom/path-intersection.h> #include <2geom/pathvector.h> #include <2geom/crossing.h> #include <2geom/angle.h> #include <2geom/transforms.h> -#include "snap.h" #include "sp-namedview.h" #include "sp-shape.h" #include "sp-text.h" #include "sp-flowtext.h" #include "sp-defs.h" #include "sp-item.h" +#include "macros.h" +#include "rubberband.h" +#include "path-chemistry.h" +#include "desktop.h" +#include "document.h" +#include "document-undo.h" +#include "viewbox.h" +#include "snap.h" +#include "text-editing.h" +#include "pixmaps/cursor-measure.xpm" +#include "preferences.h" +#include "inkscape.h" +#include "knot.h" #include "enums.h" -#include "ui/control-manager.h" #include "knot-enums.h" +#include "desktop-style.h" +#include "verbs.h" #include <glibmm/i18n.h> using Inkscape::ControlManager; using Inkscape::CTLINE_SECONDARY; using Inkscape::Util::unit_table; +using Inkscape::DocumentUndo; #define MT_KNOT_COLOR_NORMAL 0xffffff00 #define MT_KNOT_COLOR_MOUSEOVER 0xff000000 + namespace Inkscape { namespace UI { namespace Tools { std::vector<Inkscape::Display::TemporaryItem*> measure_tmp_items; -const std::string& MeasureTool::getPrefsPath() { +const std::string& MeasureTool::getPrefsPath() +{ return MeasureTool::prefsPath; } const std::string MeasureTool::prefsPath = "/tools/measure"; -namespace -{ +namespace { -gint const DIMENSION_OFFSET = 35; +gint dimension_offset = 35; /** * Simple class to use for removing label overlap. @@ -192,8 +200,9 @@ Geom::Point calcAngleDisplayAnchor(SPDesktop *desktop, double angle, double base * @param end the point that ends at the edge of the arc segment. * @param anchor the anchor point for displaying the text label. * @param angle the angle of the arc segment to draw. + * @param measure_rpr the container of the curve if converted to items. */ -void createAngleDisplayCurve(SPDesktop *desktop, Geom::Point const ¢er, Geom::Point const &end, Geom::Point const &anchor, double angle) +void createAngleDisplayCurve(SPDesktop *desktop, Geom::Point const ¢er, Geom::Point const &end, Geom::Point const &anchor, double angle, Inkscape::XML::Node *measure_repr = NULL) { // Given that we have a point on the arc's edge and the angle of the arc, we need to get the two endpoints. @@ -201,7 +210,7 @@ void createAngleDisplayCurve(SPDesktop *desktop, Geom::Point const ¢er, Geom double sideLen = std::abs((end - center).length()); if (sideLen > 0.0) { double factor = std::min(1.0, textLen / sideLen); - + // arc start Geom::Point p1 = end * (Geom::Affine(Geom::Translate(-center)) * Geom::Affine(Geom::Scale(factor)) @@ -231,19 +240,59 @@ void createAngleDisplayCurve(SPDesktop *desktop, Geom::Point const ¢er, Geom SPCtrlCurve *curve = ControlManager::getManager().createControlCurve(desktop->getTempGroup(), p1, p2, p3, p4, CTLINE_SECONDARY); measure_tmp_items.push_back(desktop->add_temporary_canvasitem(SP_CANVAS_ITEM(curve), 0, true)); + if(measure_repr) { + Geom::PathVector c; + Geom::Path p; + p.start(desktop->doc2dt(p1)); + p.appendNew<Geom::CubicBezier>(desktop->doc2dt(p2),desktop->doc2dt(p3),desktop->doc2dt(p4)); + c.push_back(p); + c *= SP_ITEM(desktop->currentLayer())->i2doc_affine().inverse(); + SPDocument *doc = desktop->getDocument(); + Inkscape::XML::Document *xml_doc = doc->getReprDoc(); + if (c.size() == 1) { + Inkscape::XML::Node *repr; + repr = xml_doc->createElement("svg:path"); + gchar const *str = sp_svg_write_path(c); + Geom::Point strokewidth = Geom::Point(1,1) * SP_ITEM(desktop->currentLayer())->i2doc_affine().inverse(); + SPCSSAttr *css = sp_repr_css_attr_new(); + std::stringstream stroke_width; + stroke_width.imbue(std::locale::classic()); + stroke_width << strokewidth[Geom::X] / desktop->current_zoom(); + sp_repr_css_set_property (css, "stroke-width", stroke_width.str().c_str()); + sp_repr_css_set_property (css, "fill", "none"); + guint32 line_color_secondary = 0xff00007f; + gchar c[64]; + sp_svg_write_color (c, sizeof(c), line_color_secondary); + sp_repr_css_set_property (css, "stroke", c); + sp_repr_css_set_property (css, "stroke-linecap", "butt"); + sp_repr_css_set_property (css, "stroke-linejoin", "miter"); + sp_repr_css_set_property (css, "stroke-miterlimit", "4"); + sp_repr_css_set_property (css, "stroke-dasharray", "none"); + sp_repr_css_set_property (css, "stroke-opacity", "0.5"); + Glib::ustring css_str; + sp_repr_css_write_string(css,css_str); + repr->setAttribute("style", css_str.c_str()); + sp_repr_css_attr_unref (css); + g_assert( str != NULL ); + repr->setAttribute("d", str); + measure_repr->addChild(repr, NULL); + Inkscape::GC::release(repr); + } + } } } - } // namespace -static Geom::Point start_p = Geom::Point(); -static Geom::Point end_p = Geom::Point(); +Geom::Point const MAGIC_POINT = Geom::Point(-0.0003432532004303,-0.006745034004304); +static Geom::Point start_p = MAGIC_POINT; +static Geom::Point end_p = MAGIC_POINT; + MeasureTool::MeasureTool() : ToolBase(cursor_measure_xpm, 4, 4) , grabbed(NULL) { SPDesktop *desktop = SP_ACTIVE_DESKTOP; - // create the knot + // create the knots this->knot_start = new SPKnot(desktop, N_("Measure start")); this->knot_start->setMode(SP_KNOT_MODE_XOR); this->knot_start->setFill(MT_KNOT_COLOR_NORMAL, MT_KNOT_COLOR_MOUSEOVER, MT_KNOT_COLOR_MOUSEOVER); @@ -256,12 +305,13 @@ MeasureTool::MeasureTool() this->knot_end->setStroke(0x0000007f, 0x0000007f, 0x0000007f); this->knot_end->setShape(SP_KNOT_SHAPE_CIRCLE); this->knot_end->updateCtrl(); - if(end_p != Geom::Point()){ - this->knot_start->setPosition(start_p, SP_KNOT_STATE_NORMAL); + Geom::Rect display_area = desktop->get_display_area () ; + if(display_area.interiorContains(start_p) && display_area.interiorContains(end_p) && end_p != MAGIC_POINT) { + this->knot_start->moveto(start_p); this->knot_start->show(); - this->knot_end->setPosition(end_p, SP_KNOT_STATE_NORMAL); + this->knot_end->moveto(end_p); this->knot_end->show(); - this->showCanvasItems(); + showCanvasItems(); } this->_knot_start_moved_connection = this->knot_start->moved_signal.connect(sigc::mem_fun(*this, &MeasureTool::knotStartMovedHandler)); this->_knot_start_ungrabbed_connection = this->knot_start->ungrabbed_signal.connect(sigc::mem_fun(*this, &MeasureTool::knotUngrabbedHandler)); @@ -270,7 +320,8 @@ MeasureTool::MeasureTool() } -MeasureTool::~MeasureTool() { +MeasureTool::~MeasureTool() +{ this->_knot_start_moved_connection.disconnect(); this->_knot_start_ungrabbed_connection.disconnect(); this->_knot_end_moved_connection.disconnect(); @@ -285,55 +336,70 @@ MeasureTool::~MeasureTool() { measure_tmp_items.clear(); } -void MeasureTool::reverseKnots(){ +void MeasureTool::reverseKnots() +{ Geom::Point start = start_p; Geom::Point end = end_p; - this->knot_start->setPosition(end, SP_KNOT_STATE_NORMAL); + this->knot_start->moveto(end); this->knot_start->show(); - this->knot_end->setPosition(start, SP_KNOT_STATE_NORMAL); + this->knot_end->moveto(start); this->knot_end->show(); this->showCanvasItems(end, start); } -void MeasureTool::knotStartMovedHandler(SPKnot */*knot*/, Geom::Point const &ppointer, guint state){ - if (!(state & GDK_SHIFT_MASK)) { +void MeasureTool::knotStartMovedHandler(SPKnot */*knot*/, Geom::Point const &ppointer, guint state) +{ + Geom::Point point = this->knot_start->position(); + if (state & GDK_CONTROL_MASK) { + spdc_endpoint_snap_rotation(this, point, end_p, state); + } else if (!(state & GDK_SHIFT_MASK)) { SnapManager &m = desktop->namedview->snap_manager; m.setup(desktop); - Inkscape::SnapCandidatePoint scp(this->knot_start->position(), Inkscape::SNAPSOURCE_OTHER_HANDLE); + Inkscape::SnapCandidatePoint scp(point, Inkscape::SNAPSOURCE_OTHER_HANDLE); scp.addOrigin(this->knot_end->position()); Inkscape::SnappedPoint sp = m.freeSnap(scp); - if(start_p != sp.getPoint()){ - start_p = sp.getPoint(); - this->knot_start->setPosition(start_p, SP_KNOT_STATE_MOUSEOVER); - } + point = sp.getPoint(); m.unSetup(); } - showCanvasItems(start_p, this->knot_end->position()); + if(start_p != point) { + start_p = point; + this->knot_start->moveto(start_p); + } + showCanvasItems(start_p, end_p); } -void MeasureTool::knotEndMovedHandler(SPKnot */*knot*/, Geom::Point const &ppointer, guint state){ - if (!(state & GDK_SHIFT_MASK)) { +void MeasureTool::knotEndMovedHandler(SPKnot */*knot*/, Geom::Point const &ppointer, guint state) +{ + Geom::Point point = this->knot_end->position(); + if (state & GDK_CONTROL_MASK) { + spdc_endpoint_snap_rotation(this, point, start_p, state); + } else if (!(state & GDK_SHIFT_MASK)) { SnapManager &m = desktop->namedview->snap_manager; m.setup(desktop); - Inkscape::SnapCandidatePoint scp(this->knot_end->position(), Inkscape::SNAPSOURCE_OTHER_HANDLE); + Inkscape::SnapCandidatePoint scp(point, Inkscape::SNAPSOURCE_OTHER_HANDLE); scp.addOrigin(this->knot_start->position()); Inkscape::SnappedPoint sp = m.freeSnap(scp); - if(end_p != sp.getPoint()){ - end_p = sp.getPoint(); - this->knot_end->setPosition(end_p, SP_KNOT_STATE_MOUSEOVER); - } + point = sp.getPoint(); m.unSetup(); } - showCanvasItems(this->knot_start->position(), end_p); + if(end_p != point) { + end_p = point; + this->knot_end->moveto(end_p); + } + showCanvasItems(start_p, end_p); } -void MeasureTool::knotUngrabbedHandler(SPKnot */*knot*/, unsigned int state){ - showCanvasItems(this->knot_start->position(), end_p); +void MeasureTool::knotUngrabbedHandler(SPKnot */*knot*/, unsigned int state) +{ + this->knot_start->moveto(start_p); + this->knot_end->moveto(end_p); + showCanvasItems(start_p, end_p); } -void MeasureTool::finish() { +void MeasureTool::finish() +{ this->enableGrDrag(false); if (this->grabbed) { @@ -380,9 +446,9 @@ static void calculate_intersections(SPDesktop * /*desktop*/, SPItem* item, Geom: double eps = 0.0001; SPDocument* doc = desktop->getDocument(); if (((*m).ta > eps && - item == doc->getItemAtPoint(desktop->dkey, lineseg[0].pointAt((*m).ta - eps), false, NULL)) || - ((*m).ta + eps < 1 && - item == doc->getItemAtPoint(desktop->dkey, lineseg[0].pointAt((*m).ta + eps), false, NULL)) ) { + item == doc->getItemAtPoint(desktop->dkey, lineseg[0].pointAt((*m).ta - eps), false, NULL)) || + ((*m).ta + eps < 1 && + item == doc->getItemAtPoint(desktop->dkey, lineseg[0].pointAt((*m).ta + eps), false, NULL)) ) { intersections.push_back((*m).ta); } #else @@ -392,47 +458,49 @@ static void calculate_intersections(SPDesktop * /*desktop*/, SPItem* item, Geom: } } -bool MeasureTool::root_handler(GdkEvent* event) { +bool MeasureTool::root_handler(GdkEvent* event) +{ gint ret = FALSE; switch (event->type) { - case GDK_BUTTON_PRESS: { - this->knot_start->hide(); - this->knot_end->hide(); - Geom::Point const button_w(event->button.x, event->button.y); - explicitBase = boost::none; - last_end = boost::none; - start_point = desktop->w2d(button_w); - - if (event->button.button == 1 && !this->space_panning) { - // save drag origin - start_point = desktop->w2d(Geom::Point(event->button.x, event->button.y)); - within_tolerance = true; - - ret = TRUE; - } + case GDK_BUTTON_PRESS: { + this->knot_start->hide(); + this->knot_end->hide(); + Geom::Point const button_w(event->button.x, event->button.y); + explicitBase = boost::none; + last_end = boost::none; + start_point = desktop->w2d(button_w); + + if (event->button.button == 1 && !this->space_panning) { + // save drag origin + start_point = desktop->w2d(Geom::Point(event->button.x, event->button.y)); + within_tolerance = true; + + ret = TRUE; + } - SnapManager &m = desktop->namedview->snap_manager; - m.setup(desktop); - m.freeSnapReturnByRef(start_point, Inkscape::SNAPSOURCE_OTHER_HANDLE); - m.unSetup(); + SnapManager &m = desktop->namedview->snap_manager; + m.setup(desktop); + m.freeSnapReturnByRef(start_point, Inkscape::SNAPSOURCE_OTHER_HANDLE); + m.unSetup(); - sp_canvas_item_grab(SP_CANVAS_ITEM(desktop->acetate), - GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK, - NULL, event->button.time); - this->grabbed = SP_CANVAS_ITEM(desktop->acetate); - break; - } - case GDK_KEY_PRESS: { - if ((event->key.keyval == GDK_KEY_Shift_L) || (event->key.keyval == GDK_KEY_Shift_R)) { - if (last_end) { - explicitBase = last_end; - } + sp_canvas_item_grab(SP_CANVAS_ITEM(desktop->acetate), + GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK, + NULL, event->button.time); + this->grabbed = SP_CANVAS_ITEM(desktop->acetate); + break; + } + case GDK_KEY_PRESS: { + if ((event->key.keyval == GDK_KEY_Shift_L) || (event->key.keyval == GDK_KEY_Shift_R)) { + if (last_end) { + explicitBase = last_end; } - break; } - case GDK_MOTION_NOTIFY: { - if (!(event->motion.state & GDK_BUTTON1_MASK) && !(event->motion.state & GDK_SHIFT_MASK)) { + break; + } + case GDK_MOTION_NOTIFY: { + if (!(event->motion.state & GDK_BUTTON1_MASK)) { + if(!(event->motion.state & GDK_SHIFT_MASK)) { Geom::Point const motion_w(event->motion.x, event->motion.y); Geom::Point const motion_dt(desktop->w2d(motion_w)); @@ -444,51 +512,29 @@ bool MeasureTool::root_handler(GdkEvent* event) { m.preSnap(scp); m.unSetup(); - } else { - ret = TRUE; - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - tolerance = prefs->getIntLimited("/options/dragtolerance/value", 0, 0, 100); - Geom::Point const motion_w(event->motion.x, event->motion.y); - if ( within_tolerance){ - if ( Geom::LInfty( motion_w - start_point ) < 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) - within_tolerance = false; - if(event->motion.time == 0 || !last_end || Geom::LInfty( motion_w - *last_end ) > (tolerance/2)){ - Geom::Point const motion_w(event->motion.x, event->motion.y); - Geom::Point const motion_dt(desktop->w2d(motion_w)); - Geom::Point end_point = motion_dt; - - if (event->motion.state & GDK_CONTROL_MASK) { - spdc_endpoint_snap_rotation(this, end_point, start_point, event->motion.state); - } else if (!(event->motion.state & GDK_SHIFT_MASK)) { - SnapManager &m = desktop->namedview->snap_manager; - m.setup(desktop); - Inkscape::SnapCandidatePoint scp(end_point, Inkscape::SNAPSOURCE_OTHER_HANDLE); - scp.addOrigin(start_point); - Inkscape::SnappedPoint sp = m.freeSnap(scp); - end_point = sp.getPoint(); - m.unSetup(); - } - showCanvasItems(start_point, end_point); - last_end = motion_w ; + } + } else { + ret = TRUE; + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + tolerance = prefs->getIntLimited("/options/dragtolerance/value", 0, 0, 100); + Geom::Point const motion_w(event->motion.x, event->motion.y); + if ( within_tolerance) { + if ( Geom::LInfty( motion_w - start_point ) < tolerance) { + return FALSE; // Do not drag if we're within tolerance from origin. } - gobble_motion_events(GDK_BUTTON1_MASK); } - break; - } - case GDK_BUTTON_RELEASE: { - this->knot_start->setPosition(start_point, SP_KNOT_STATE_NORMAL); - this->knot_start->show(); - if(last_end){ - Geom::Point end_point = desktop->w2d(*last_end); - if (event->button.state & GDK_CONTROL_MASK) { - spdc_endpoint_snap_rotation(this, end_point, start_point, event->motion.state); - } else if (!(event->button.state & GDK_SHIFT_MASK)) { + // 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) + within_tolerance = false; + if(event->motion.time == 0 || !last_end || Geom::LInfty( motion_w - *last_end ) > (tolerance/4.0)) { + Geom::Point const motion_w(event->motion.x, event->motion.y); + Geom::Point const motion_dt(desktop->w2d(motion_w)); + Geom::Point end_point = motion_dt; + + if (event->motion.state & GDK_CONTROL_MASK) { + spdc_endpoint_snap_rotation(this, end_point, start_point, event->motion.state); + } else if (!(event->motion.state & GDK_SHIFT_MASK)) { SnapManager &m = desktop->namedview->snap_manager; m.setup(desktop); Inkscape::SnapCandidatePoint scp(end_point, Inkscape::SNAPSOURCE_OTHER_HANDLE); @@ -497,117 +543,385 @@ bool MeasureTool::root_handler(GdkEvent* event) { end_point = sp.getPoint(); m.unSetup(); } - this->knot_end->setPosition(end_point, SP_KNOT_STATE_NORMAL); - this->knot_end->show(); + showCanvasItems(start_point, end_point); + last_end = motion_w ; } - if (this->grabbed) { - sp_canvas_item_ungrab(this->grabbed, event->button.time); - this->grabbed = NULL; + gobble_motion_events(GDK_BUTTON1_MASK); + } + break; + } + case GDK_BUTTON_RELEASE: { + this->knot_start->moveto(start_point); + this->knot_start->show(); + Geom::Point end_point = end_p; + if(last_end) { + end_point = desktop->w2d(*last_end); + if (event->button.state & GDK_CONTROL_MASK) { + spdc_endpoint_snap_rotation(this, end_point, start_point, event->motion.state); + } else if (!(event->button.state & GDK_SHIFT_MASK)) { + SnapManager &m = desktop->namedview->snap_manager; + m.setup(desktop); + Inkscape::SnapCandidatePoint scp(end_point, Inkscape::SNAPSOURCE_OTHER_HANDLE); + scp.addOrigin(start_point); + Inkscape::SnappedPoint sp = m.freeSnap(scp); + end_point = sp.getPoint(); + m.unSetup(); } - sp_event_context_discard_delayed_snap_event(this); - break; } - default: - break; + this->knot_end->moveto(end_point); + this->knot_end->show(); + showCanvasItems(start_point, end_point); + if (this->grabbed) { + sp_canvas_item_ungrab(this->grabbed, event->button.time); + this->grabbed = NULL; + } + break; + } + default: + break; } if (!ret) { ret = ToolBase::root_handler(event); } - + return ret; } -void MeasureTool::setMarkers(){ - SPDesktop *desktop = this->desktop; +void MeasureTool::setMarkers() +{ + SPDesktop *desktop = SP_ACTIVE_DESKTOP; SPDocument *doc = desktop->getDocument(); SPObject *arrowStart = doc->getObjectById("Arrow2Sstart"); SPObject *arrowEnd = doc->getObjectById("Arrow2Send"); if (!arrowStart) { setMarker(true); } - if(!arrowEnd){ + if(!arrowEnd) { setMarker(false); } } -void MeasureTool::setMarker(bool isStart){ - SPDesktop *desktop = this->desktop; +void MeasureTool::setMarker(bool isStart) +{ + SPDesktop *desktop = SP_ACTIVE_DESKTOP; SPDocument *doc = desktop->getDocument(); SPDefs *defs = doc->getDefs(); - Inkscape::XML::Node *repr; + Inkscape::XML::Node *rmarker; Inkscape::XML::Document *xml_doc = doc->getReprDoc(); - repr = xml_doc->createElement("svg:marker"); - if(isStart){ - repr->setAttribute("id", "Arrow2Sstart"); + rmarker = xml_doc->createElement("svg:marker"); + if(isStart) { + rmarker->setAttribute("id", "Arrow2Sstart"); } else { - repr->setAttribute("id", "Arrow2Send"); + rmarker->setAttribute("id", "Arrow2Send"); } - repr->setAttribute("inkscape:isstock", "true"); - if(isStart){ - repr->setAttribute("inkscape:stockid", "Arrow2Sstart"); + rmarker->setAttribute("inkscape:isstock", "true"); + if(isStart) { + rmarker->setAttribute("inkscape:stockid", "Arrow2Sstart"); } else { - repr->setAttribute("inkscape:stockid", "Arrow2Send"); - } - repr->setAttribute("orient", "auto"); - repr->setAttribute("refX", "0.0"); - repr->setAttribute("refY", "0.0"); - repr->setAttribute("style", "overflow:visible;"); - SPItem *item = SP_ITEM(defs->appendChildRepr(repr)); - Inkscape::GC::release(repr); - item->updateRepr(); - Inkscape::XML::Node *repr2; - repr2 = xml_doc->createElement("svg:path"); - repr2->setAttribute("d", "M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z"); - if(isStart){ - repr2->setAttribute("id", "Arrow2SstartPath"); + rmarker->setAttribute("inkscape:stockid", "Arrow2Send"); + } + rmarker->setAttribute("orient", "auto"); + rmarker->setAttribute("refX", "0.0"); + rmarker->setAttribute("refY", "0.0"); + rmarker->setAttribute("style", "overflow:visible;"); + SPItem *marker = SP_ITEM(defs->appendChildRepr(rmarker)); + Inkscape::GC::release(rmarker); + marker->updateRepr(); + Inkscape::XML::Node *rpath; + rpath = xml_doc->createElement("svg:path"); + rpath->setAttribute("d", "M 8.72,4.03 L -2.21,0.02 L 8.72,-4.00 C 6.97,-1.63 6.98,1.62 8.72,4.03 z"); + if(isStart) { + rpath->setAttribute("id", "Arrow2SstartPath"); } else { - repr2->setAttribute("id", "Arrow2SendPath"); + rpath->setAttribute("id", "Arrow2SendPath"); } - repr2->setAttribute("style", "fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#000000;stroke-opacity:1;fill:#000000;fill-opacity:1"); - if(isStart){ - repr2->setAttribute("transform", "scale(0.3) translate(-2.3,0)"); + SPCSSAttr *css = sp_repr_css_attr_new(); + sp_repr_css_set_property (css, "stroke", "none"); + sp_repr_css_set_property (css, "fill", "#000000"); + sp_repr_css_set_property (css, "fill-opacity", "1"); + Glib::ustring css_str; + sp_repr_css_write_string(css,css_str); + rpath->setAttribute("style", css_str.c_str()); + sp_repr_css_attr_unref (css); + if(isStart) { + rpath->setAttribute("transform", "scale(0.3) translate(-2.3,0)"); } else { - repr2->setAttribute("transform", "scale(0.3) rotate(180) translate(-2.3,0)"); + rpath->setAttribute("transform", "scale(0.3) rotate(180) translate(-2.3,0)"); } - SPItem *item2 = SP_ITEM(item->appendChildRepr(repr2)); - Inkscape::GC::release(repr2); - item2->updateRepr(); + SPItem *path = SP_ITEM(marker->appendChildRepr(rpath)); + Inkscape::GC::release(rpath); + path->updateRepr(); } -void MeasureTool::toMarkDimension(){ - Geom::Point windowNormal = Geom::unit_vector(Geom::rot90(desktop->d2w(end_p - start_p))); - Geom::Point normal = desktop->w2d(windowNormal); +void MeasureTool::toItem() +{ + SPDesktop *desktop = SP_ACTIVE_DESKTOP; + SPDocument *doc = desktop->getDocument(); + Geom::Ray ray(start_p,end_p); + guint32 line_color_primary = 0x0000ff7f; + Inkscape::XML::Document *xml_doc = desktop->doc()->getReprDoc(); + Inkscape::XML::Node *rgroup = xml_doc->createElement("svg:g"); + showCanvasItems(start_p, end_p, true, rgroup); + setLine(start_p,end_p, false, &line_color_primary, rgroup); + SPItem *measure_item = SP_ITEM(desktop->currentLayer()->appendChildRepr(rgroup)); + Inkscape::GC::release(rgroup); + measure_item->updateRepr(); + doc->ensureUpToDate(); + DocumentUndo::done(desktop->getDocument(), SP_VERB_CONTEXT_MEASURE,_("Convert measure to items")); + reset(); +} + +void MeasureTool::toMarkDimension() +{ + SPDesktop *desktop = SP_ACTIVE_DESKTOP; + SPDocument *doc = desktop->getDocument(); setMarkers(); + Geom::Ray ray(start_p,end_p); + Geom::Point start = start_p + Geom::Point::polar(ray.angle(), 5); + start = start + Geom::Point::polar(ray.angle() + Geom::deg_to_rad(90), -(dimension_offset / 4.0)); + Geom::Point end = end_p + Geom::Point::polar(ray.angle(), -5); + end = end+ Geom::Point::polar(ray.angle() + Geom::deg_to_rad(90), -(dimension_offset / 4.0)); + guint32 color = 0x000000ff; + setLine(start, end, true, &color); + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + Glib::ustring unit_name = prefs->getString("/tools/measure/unit"); + if (!unit_name.compare("")) { + unit_name = "px"; + } + double fontsize = prefs->getInt("/tools/measure/fontsize") * (96/72); + Geom::Point middle = Geom::middle_point(start, end); + double totallengthval = (end_p - start_p).length(); + totallengthval = Inkscape::Util::Quantity::convert(totallengthval, "px", unit_name); + gchar *totallength_str = g_strdup_printf("%.2f %s", totallengthval, unit_name.c_str()); + setLabelText(totallength_str, middle, fontsize, Geom::deg_to_rad(180) - ray.angle()); + doc->ensureUpToDate(); + DocumentUndo::done(desktop->getDocument(), SP_VERB_CONTEXT_MEASURE,_("Add global meassure line")); +} + +void MeasureTool::setLine(Geom::Point start_point,Geom::Point end_point, bool markers, guint32 *color, Inkscape::XML::Node *measure_repr) +{ + SPDesktop *desktop = SP_ACTIVE_DESKTOP; + if(!desktop || !start_point.isFinite() || !end_point.isFinite()) { + return; + } Geom::PathVector c; Geom::Path p; - p.start(desktop->doc2dt(start_p) + normal * 60); - p.appendNew<Geom::LineSegment>(desktop->doc2dt(end_p) + normal * 60); + p.start(desktop->doc2dt(start_point)); + p.appendNew<Geom::LineSegment>(desktop->doc2dt(end_point)); c.push_back(p); - c *= desktop->doc2dt(); c *= SP_ITEM(desktop->currentLayer())->i2doc_affine().inverse(); - c *= Geom::Scale(95.0); - SPDesktop *desktop = this->desktop; SPDocument *doc = desktop->getDocument(); Inkscape::XML::Document *xml_doc = doc->getReprDoc(); if (c.size() == 1) { Inkscape::XML::Node *repr; repr = xml_doc->createElement("svg:path"); gchar const *str = sp_svg_write_path(c); - gchar const *style_str = "fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#Arrow2Sstart);marker-end:url(#Arrow2Send)"; + Geom::Point strokewidth = Geom::Point(1,1) * SP_ITEM(desktop->currentLayer())->i2doc_affine().inverse(); + SPCSSAttr *css = sp_repr_css_attr_new(); + std::stringstream stroke_width; + stroke_width.imbue(std::locale::classic()); + if(measure_repr) { + stroke_width << strokewidth[Geom::X] / desktop->current_zoom(); + } else { + stroke_width << strokewidth[Geom::X]; + } + sp_repr_css_set_property (css, "stroke-width", stroke_width.str().c_str()); + sp_repr_css_set_property (css, "fill", "none"); + if(color) { + gchar c[64]; + sp_svg_write_color (c, sizeof(c), *color); + sp_repr_css_set_property (css, "stroke", c); + } else { + sp_repr_css_set_property (css, "stroke", "#000000"); + } + sp_repr_css_set_property (css, "stroke-linecap", "square"); + sp_repr_css_set_property (css, "stroke-linejoin", "miter"); + sp_repr_css_set_property (css, "stroke-miterlimit", "4"); + sp_repr_css_set_property (css, "stroke-dasharray", "none"); + if(measure_repr) { + sp_repr_css_set_property (css, "stroke-opacity", "0.5"); + } else { + sp_repr_css_set_property (css, "stroke-opacity", "1"); + } + if(markers) { + sp_repr_css_set_property (css, "marker-start", "url(#Arrow2Sstart)"); + sp_repr_css_set_property (css, "marker-end", "url(#Arrow2Send)"); + } + Glib::ustring css_str; + sp_repr_css_write_string(css,css_str); + repr->setAttribute("style", css_str.c_str()); + sp_repr_css_attr_unref (css); g_assert( str != NULL ); repr->setAttribute("d", str); - repr->setAttribute("style", style_str); - // Attach repr - SPItem *item = SP_ITEM(desktop->currentLayer()->appendChildRepr(repr)); + if(measure_repr) { + measure_repr->addChild(repr, NULL); + Inkscape::GC::release(repr); + } else { + SPItem *item = SP_ITEM(desktop->currentLayer()->appendChildRepr(repr)); + Inkscape::GC::release(repr); + item->updateRepr(); + } + } +} + +void MeasureTool::setPoint(Geom::Point origin, Inkscape::XML::Node *measure_repr) +{ + SPDesktop *desktop = SP_ACTIVE_DESKTOP; + if(!desktop || !origin.isFinite()) { + return; + } + char const * svgd; + svgd = "m 0.707,0.707 6.586,6.586 m 0,-6.586 -6.586,6.586"; + Geom::PathVector c = sp_svg_read_pathv(svgd); + Geom::Scale scale = Geom::Scale(desktop->current_zoom()).inverse(); + c *= Geom::Translate(Geom::Point(-3.5,-3.5)); + c *= scale; + c *= Geom::Translate(Geom::Point() - (scale.vector() * 0.5)); + c *= Geom::Translate(desktop->doc2dt(origin)); + c *= SP_ITEM(desktop->currentLayer())->i2doc_affine().inverse(); + SPDocument *doc = desktop->getDocument(); + Inkscape::XML::Document *xml_doc = doc->getReprDoc(); + if (c.size() == 2) { + Inkscape::XML::Node *repr; + repr = xml_doc->createElement("svg:path"); + gchar const *str = sp_svg_write_path(c); + SPCSSAttr *css = sp_repr_css_attr_new(); + Geom::Point strokewidth = (Geom::Point(1,1) * SP_ITEM(desktop->currentLayer())->i2doc_affine().inverse())/ desktop->current_zoom(); + std::stringstream stroke_width; + stroke_width.imbue(std::locale::classic()); + stroke_width << strokewidth[Geom::X]; + sp_repr_css_set_property (css, "stroke-width", stroke_width.str().c_str()); + sp_repr_css_set_property (css, "fill", "none"); + guint32 line_color_secondary = 0xff0000ff; + gchar c[64]; + sp_svg_write_color (c, sizeof(c), line_color_secondary); + sp_repr_css_set_property (css, "stroke", c); + sp_repr_css_set_property (css, "stroke-linecap", "square"); + sp_repr_css_set_property (css, "stroke-linejoin", "miter"); + sp_repr_css_set_property (css, "stroke-miterlimit", "4"); + sp_repr_css_set_property (css, "stroke-dasharray", "none"); + sp_repr_css_set_property (css, "stroke-opacity", "0.5"); + Glib::ustring css_str; + sp_repr_css_write_string(css,css_str); + repr->setAttribute("style", css_str.c_str()); + sp_repr_css_attr_unref (css); + g_assert( str != NULL ); + repr->setAttribute("d", str); + measure_repr->addChild(repr, NULL); Inkscape::GC::release(repr); - item->updateRepr(); } +} - // Flush pending updates - doc->ensureUpToDate(); - //reset(); +void MeasureTool::setLabelText(const char *value, Geom::Point pos, double fontsize, Geom::Coord angle, guint32 *background, Inkscape::XML::Node *measure_repr, CanvasTextAnchorPositionEnum text_anchor) +{ + SPDesktop *desktop = SP_ACTIVE_DESKTOP; + Inkscape::XML::Document *xml_doc = desktop->doc()->getReprDoc(); + /* Create <text> */ + pos = desktop->doc2dt(pos); + Inkscape::XML::Node *rtext = xml_doc->createElement("svg:text"); + rtext->setAttribute("xml:space", "preserve"); + + + /* Set style */ + sp_desktop_apply_style_tool(desktop, rtext, "/tools/text", true); + if(measure_repr) { + sp_repr_set_svg_double(rtext, "x", 2); + sp_repr_set_svg_double(rtext, "y", 2); + } else { + sp_repr_set_svg_double(rtext, "x", 0); + sp_repr_set_svg_double(rtext, "y", 0); + } + + /* Create <tspan> */ + Inkscape::XML::Node *rtspan = xml_doc->createElement("svg:tspan"); + rtspan->setAttribute("sodipodi:role", "line"); // otherwise, why bother creating the tspan? + SPCSSAttr *css = sp_repr_css_attr_new(); + std::stringstream font_size; + font_size.imbue(std::locale::classic()); + font_size << fontsize ; + sp_repr_css_set_property (css, "font-size", font_size.str().c_str()); + sp_repr_css_set_property (css, "font-style", "normal"); + sp_repr_css_set_property (css, "font-weight", "normal"); + sp_repr_css_set_property (css, "line-height", "125%"); + sp_repr_css_set_property (css, "letter-spacing", "0px"); + sp_repr_css_set_property (css, "word-spacing", "0px"); + if(measure_repr) { + sp_repr_css_set_property (css, "fill", "#FFFFFF"); + } else { + sp_repr_css_set_property (css, "fill", "#000000"); + } + sp_repr_css_set_property (css, "fill-opacity", "1"); + sp_repr_css_set_property (css, "stroke", "none"); + Glib::ustring css_str; + sp_repr_css_write_string(css,css_str); + rtspan->setAttribute("style", css_str.c_str()); + sp_repr_css_attr_unref (css); + rtext->addChild(rtspan, NULL); + Inkscape::GC::release(rtspan); + /* Create TEXT */ + Inkscape::XML::Node *rstring = xml_doc->createTextNode(value); + rtspan->addChild(rstring, NULL); + Inkscape::GC::release(rstring); + SPItem *text_item = SP_ITEM(desktop->currentLayer()->appendChildRepr(rtext)); + Inkscape::GC::release(rtext); + text_item->updateRepr(); + Geom::OptRect bbox = text_item->geometricBounds(); + if (!measure_repr && bbox) { + Geom::Point center = bbox->midpoint(); + text_item->transform *= Geom::Translate(center).inverse(); + pos = pos + Geom::Point::polar(angle+ Geom::deg_to_rad(90), -bbox->height()); + } + if(measure_repr) { + /* Create <group> */ + Inkscape::XML::Node *rgroup = xml_doc->createElement("svg:g"); + /* Create <rect> */ + Inkscape::XML::Node *rrect = xml_doc->createElement("svg:rect"); + SPCSSAttr *css = sp_repr_css_attr_new (); + gchar c[64]; + sp_svg_write_color (c, sizeof(c), *background); + sp_repr_css_set_property (css, "fill", c); + sp_repr_css_set_property (css, "fill-opacity", "0.5"); + sp_repr_css_set_property (css, "stroke-width", "0"); + Glib::ustring css_str; + sp_repr_css_write_string(css,css_str); + rrect->setAttribute("style", css_str.c_str()); + sp_repr_css_attr_unref (css); + sp_repr_set_svg_double(rgroup, "x", 0); + sp_repr_set_svg_double(rgroup, "y", 0); + sp_repr_set_svg_double(rrect, "x", 0); + sp_repr_set_svg_double(rrect, "y", -bbox->height()); + sp_repr_set_svg_double(rrect, "width", (bbox->width()) + 6); + sp_repr_set_svg_double(rrect, "height", (bbox->height()) + 6); + Inkscape::XML::Node *rtextitem = text_item->getRepr(); + text_item->deleteObject(); + rgroup->addChild(rtextitem, NULL); + Inkscape::GC::release(rtextitem); + rgroup->addChild(rrect, NULL); + Inkscape::GC::release(rrect); + SPItem *text_item_box = SP_ITEM(desktop->currentLayer()->appendChildRepr(rgroup)); + Geom::Scale scale = Geom::Scale(desktop->current_zoom()).inverse(); + if(bbox && text_anchor == TEXT_ANCHOR_CENTER) { + text_item_box->transform *= Geom::Translate(bbox->midpoint() - Geom::Point(1.0,1.0)).inverse(); + } + text_item_box->transform *= scale; + text_item_box->transform *= Geom::Translate(Geom::Point() - (scale.vector() * 0.5)); + text_item_box->transform *= Geom::Translate(pos); + text_item_box->transform *= SP_ITEM(desktop->currentLayer())->i2doc_affine().inverse(); + text_item_box->updateRepr(); + text_item_box->doWriteTransform(text_item_box->getRepr(), text_item_box->transform, NULL, true); + Inkscape::XML::Node *rlabel = text_item_box->getRepr(); + text_item_box->deleteObject(); + measure_repr->addChild(rlabel, NULL); + Inkscape::GC::release(rlabel); + } else { + text_item->transform *= Geom::Rotate(angle); + text_item->transform *= Geom::Translate(pos); + text_item->transform *= SP_ITEM(desktop->currentLayer())->i2doc_affine().inverse(); + text_item->doWriteTransform(text_item->getRepr(), text_item->transform, NULL, true); + } } -void MeasureTool::reset(){ +void MeasureTool::reset() +{ this->knot_start->hide(); this->knot_end->hide(); for (size_t idx = 0; idx < measure_tmp_items.size(); ++idx) { @@ -616,12 +930,19 @@ void MeasureTool::reset(){ measure_tmp_items.clear(); } -void MeasureTool::showCanvasItems(){ +void MeasureTool::showCanvasItems() +{ showCanvasItems(start_p, end_p); } -void MeasureTool::showCanvasItems(Geom::Point start_point, Geom::Point end_point){ +void MeasureTool::showCanvasItems(Geom::Point start_point, Geom::Point end_point, bool to_item, Inkscape::XML::Node *measure_repr) +{ SPDesktop *desktop = SP_ACTIVE_DESKTOP; + if(!desktop || !start_point.isFinite() || !end_point.isFinite() || end_point == MAGIC_POINT) { + return; + } + guint32 line_color_primary = 0x0000ff7f; + guint32 line_color_secondary = 0xff00007f; start_p = start_point; end_p = end_point; //clear previous temporary canvas items, we'll draw new ones @@ -632,6 +953,7 @@ void MeasureTool::showCanvasItems(Geom::Point start_point, Geom::Point end_point Inkscape::Preferences *prefs = Inkscape::Preferences::get(); bool show_in_between = prefs->getBool("/tools/measure/show_in_between"); bool all_layers = prefs->getBool("/tools/measure/all_layers"); + dimension_offset = prefs->getDouble("/tools/measure/offset"); Geom::PathVector lineseg; Geom::Path p; p.start(desktop->dt2doc(start_point)); @@ -659,20 +981,20 @@ void MeasureTool::showCanvasItems(Geom::Point start_point, Geom::Point end_point std::vector<SPItem*> items; Inkscape::Rubberband *r = Inkscape::Rubberband::get(desktop); r->setMode(RUBBERBAND_MODE_TOUCHPATH); - if(!show_in_between){ - r->start(desktop,start_point); - r->move(end_point); + if(!show_in_between) { + r->start(desktop,start_p); + r->move(end_p); items = desktop->getDocument()->getItemsAtPoints(desktop->dkey, r->getPoints(), all_layers, 2); r->stop(); r->setMode(RUBBERBAND_MODE_TOUCHPATH); - r->start(desktop,end_point); - r->move(start_point); + r->start(desktop,end_p); + r->move(start_p); std::vector<SPItem*> items_reverse = desktop->getDocument()->getItemsAtPoints(desktop->dkey, r->getPoints(), all_layers, 2); r->stop(); - if(items_reverse.size() == 2 && items_reverse[1] != items[0] && items_reverse[1] != items[1]){ + if(items_reverse.size() == 2 && items_reverse[1] != items[0] && items_reverse[1] != items[1]) { items.push_back(items_reverse[1]); } - if(items_reverse.size() >= 1 && items_reverse[0] != items[1]){ + if(items_reverse.size() >= 1 && items_reverse[0] != items[1]) { items.push_back(items_reverse[0]); } } else { @@ -682,10 +1004,10 @@ void MeasureTool::showCanvasItems(Geom::Point start_point, Geom::Point end_point r->stop(); } std::vector<double> intersection_times; - for (std::vector<SPItem*>::const_iterator i=items.begin();i!=items.end();i++) { + for (std::vector<SPItem*>::const_iterator i=items.begin(); i!=items.end(); i++) { SPItem *item = *i; if (SP_IS_SHAPE(item)) { - calculate_intersections(desktop, item, lineseg, SP_SHAPE(item)->getCurve(), intersection_times); + calculate_intersections(desktop, item, lineseg, SP_SHAPE(item)->getCurve(), intersection_times); } else { if (SP_IS_TEXT(item) || SP_IS_FLOWTEXT(item)) { Inkscape::Text::Layout::iterator iter = te_get_layout(item)->begin(); @@ -722,8 +1044,7 @@ void MeasureTool::showCanvasItems(Geom::Point start_point, Geom::Point end_point unit_name = "px"; } - double fontsize = prefs->getInt("/tools/measure/fontsize"); - + double fontsize = prefs->getInt("/tools/measure/fontsize") * (96/72); // Normal will be used for lines and text Geom::Point windowNormal = Geom::unit_vector(Geom::rot90(desktop->d2w(end_point - start_point))); Geom::Point normal = desktop->w2d(windowNormal); @@ -731,11 +1052,11 @@ void MeasureTool::showCanvasItems(Geom::Point start_point, Geom::Point end_point std::vector<Geom::Point> intersections; std::sort(intersection_times.begin(), intersection_times.end()); for (std::vector<double>::iterator iter_t = intersection_times.begin(); iter_t != intersection_times.end(); iter_t++) { - if(show_in_between){ + if(show_in_between) { intersections.push_back(lineseg[0].pointAt(*iter_t)); } } - if(!show_in_between && intersection_times.size() > 1){ + if(!show_in_between && intersection_times.size() > 1) { intersections.push_back(lineseg[0].pointAt(intersection_times[0])); intersections.push_back(lineseg[0].pointAt(intersection_times[intersection_times.size()-1])); } @@ -748,7 +1069,7 @@ void MeasureTool::showCanvasItems(Geom::Point start_point, Geom::Point end_point LabelPlacement placement; placement.lengthVal = (intersections[idx] - intersections[idx - 1]).length(); placement.lengthVal = Inkscape::Util::Quantity::convert(placement.lengthVal, "px", unit_name); - placement.offset = DIMENSION_OFFSET; + placement.offset = dimension_offset; placement.start = desktop->doc2dt( (intersections[idx - 1] + intersections[idx]) / 2 ); placement.end = placement.start - (normal * placement.offset); @@ -757,47 +1078,52 @@ void MeasureTool::showCanvasItems(Geom::Point start_point, Geom::Point end_point // Adjust positions repositionOverlappingLabels(placements, desktop, windowNormal, fontsize); - for (std::vector<LabelPlacement>::iterator it = placements.begin(); it != placements.end(); ++it) - { + for (std::vector<LabelPlacement>::iterator it = placements.begin(); it != placements.end(); ++it) { LabelPlacement &place = *it; // TODO cleanup memory, Glib::ustring, etc.: gchar *measure_str = g_strdup_printf("%.2f %s", place.lengthVal, unit_name.c_str()); SPCanvasText *canvas_tooltip = sp_canvastext_new(desktop->getTempGroup(), - desktop, - place.end, - measure_str); + desktop, + place.end, + measure_str); sp_canvastext_set_fontsize(canvas_tooltip, fontsize); canvas_tooltip->rgba = 0xffffffff; canvas_tooltip->rgba_background = 0x0000007f; canvas_tooltip->outline = false; canvas_tooltip->background = true; canvas_tooltip->anchor_position = TEXT_ANCHOR_CENTER; - measure_tmp_items.push_back(desktop->add_temporary_canvasitem(canvas_tooltip, 0)); + if(to_item) { + guint32 background = canvas_tooltip->rgba_background; + setLabelText(measure_str, place.end, fontsize, 0, &background, measure_repr); + } g_free(measure_str); } Geom::Point angleDisplayPt = calcAngleDisplayAnchor(desktop, angle, baseAngle, - start_point, end_point, - fontsize); + start_point, end_point, + fontsize); { // TODO cleanup memory, Glib::ustring, etc.: gchar *angle_str = g_strdup_printf("%.2f °", angle * 180/M_PI); SPCanvasText *canvas_tooltip = sp_canvastext_new(desktop->getTempGroup(), - desktop, - angleDisplayPt, - angle_str); + desktop, + angleDisplayPt, + angle_str); sp_canvastext_set_fontsize(canvas_tooltip, fontsize); canvas_tooltip->rgba = 0xffffffff; canvas_tooltip->rgba_background = 0x337f337f; canvas_tooltip->outline = false; canvas_tooltip->background = true; canvas_tooltip->anchor_position = TEXT_ANCHOR_CENTER; - measure_tmp_items.push_back(desktop->add_temporary_canvasitem(canvas_tooltip, 0)); + if(to_item) { + guint32 background = canvas_tooltip->rgba_background; + setLabelText(angle_str, angleDisplayPt, fontsize, 0, &background, measure_repr); + } g_free(angle_str); } @@ -808,17 +1134,20 @@ void MeasureTool::showCanvasItems(Geom::Point start_point, Geom::Point end_point // TODO cleanup memory, Glib::ustring, etc.: gchar *totallength_str = g_strdup_printf("%.2f %s", totallengthval, unit_name.c_str()); SPCanvasText *canvas_tooltip = sp_canvastext_new(desktop->getTempGroup(), - desktop, - end_point + desktop->w2d(Geom::Point(3*fontsize, -fontsize)), - totallength_str); + desktop, + end_point + desktop->w2d(Geom::Point(3*fontsize, -fontsize)), + totallength_str); sp_canvastext_set_fontsize(canvas_tooltip, fontsize); canvas_tooltip->rgba = 0xffffffff; canvas_tooltip->rgba_background = 0x3333337f; canvas_tooltip->outline = false; canvas_tooltip->background = true; canvas_tooltip->anchor_position = TEXT_ANCHOR_LEFT; - measure_tmp_items.push_back(desktop->add_temporary_canvasitem(canvas_tooltip, 0)); + if(to_item) { + guint32 background = canvas_tooltip->rgba_background; + setLabelText(totallength_str, end_point + desktop->w2d(Geom::Point(3*fontsize, -fontsize)), fontsize, 0, &background, measure_repr, TEXT_ANCHOR_LEFT); + } g_free(totallength_str); } @@ -829,44 +1158,68 @@ void MeasureTool::showCanvasItems(Geom::Point start_point, Geom::Point end_point // TODO cleanup memory, Glib::ustring, etc.: gchar *total_str = g_strdup_printf("%.2f %s", totallengthval, unit_name.c_str()); SPCanvasText *canvas_tooltip = sp_canvastext_new(desktop->getTempGroup(), - desktop, - desktop->doc2dt((intersections[0] + intersections[intersections.size()-1])/2) + normal * 60, - total_str); + desktop, + desktop->doc2dt((intersections[0] + intersections[intersections.size()-1])/2) + normal * (dimension_offset * 2), + total_str); sp_canvastext_set_fontsize(canvas_tooltip, fontsize); canvas_tooltip->rgba = 0xffffffff; canvas_tooltip->rgba_background = 0x33337f7f; canvas_tooltip->outline = false; canvas_tooltip->background = true; canvas_tooltip->anchor_position = TEXT_ANCHOR_CENTER; - measure_tmp_items.push_back(desktop->add_temporary_canvasitem(canvas_tooltip, 0)); + if(to_item) { + guint32 background = canvas_tooltip->rgba_background; + setLabelText(total_str, desktop->doc2dt((intersections[0] + intersections[intersections.size()-1])/2) + normal * (dimension_offset * 2), fontsize, 0, &background, measure_repr); + } g_free(total_str); } + // Initial point + { + SPCanvasItem * canvasitem = sp_canvas_item_new(desktop->getTempGroup(), + SP_TYPE_CTRL, + "anchor", SP_ANCHOR_CENTER, + "size", 8.0, + "stroked", TRUE, + "stroke_color", 0xff0000ff, + "mode", SP_KNOT_MODE_XOR, + "shape", SP_KNOT_SHAPE_CROSS, + NULL ); + + SP_CTRL(canvasitem)->moveto(start_point); + measure_tmp_items.push_back(desktop->add_temporary_canvasitem(canvasitem, 0)); + if(to_item) { + setPoint(start_point, measure_repr); + } + } + // Now that text has been added, we can add lines and controls so that they go underneath for (size_t idx = 0; idx < intersections.size(); ++idx) { // Display the intersection indicator (i.e. the cross) SPCanvasItem * canvasitem = sp_canvas_item_new(desktop->getTempGroup(), - SP_TYPE_CTRL, - "anchor", SP_ANCHOR_CENTER, - "size", 8.0, - "stroked", TRUE, - "stroke_color", 0xff0000ff, - "mode", SP_KNOT_MODE_XOR, - "shape", SP_KNOT_SHAPE_CROSS, - NULL ); + SP_TYPE_CTRL, + "anchor", SP_ANCHOR_CENTER, + "size", 8.0, + "stroked", TRUE, + "stroke_color", 0xff0000ff, + "mode", SP_KNOT_MODE_XOR, + "shape", SP_KNOT_SHAPE_CROSS, + NULL ); SP_CTRL(canvasitem)->moveto(desktop->doc2dt(intersections[idx])); measure_tmp_items.push_back(desktop->add_temporary_canvasitem(canvasitem, 0)); + if(to_item) { + setPoint(desktop->doc2dt(intersections[idx]), measure_repr); + } } - // Since adding goes to the bottom, do all lines last. // draw main control line { SPCtrlLine *control_line = ControlManager::getManager().createControlLine(desktop->getTempGroup(), - start_point, - end_point); + start_point, + end_point); measure_tmp_items.push_back(desktop->add_temporary_canvasitem(control_line, 0)); if ((end_point[Geom::X] != start_point[Geom::X]) && (end_point[Geom::Y] != start_point[Geom::Y])) { @@ -880,12 +1233,18 @@ void MeasureTool::showCanvasItems(Geom::Point start_point, Geom::Point end_point } SPCtrlLine *control_line = ControlManager::getManager().createControlLine(desktop->getTempGroup(), - start_point, - anchorEnd, - CTLINE_SECONDARY); + start_point, + anchorEnd, + CTLINE_SECONDARY); measure_tmp_items.push_back(desktop->add_temporary_canvasitem(control_line, 0)); - - createAngleDisplayCurve(desktop, start_point, end_point, angleDisplayPt, angle); + if(to_item) { + setLine(start_point, + anchorEnd, + false, + &line_color_secondary, + measure_repr); + } + createAngleDisplayCurve(desktop, start_point, end_point, angleDisplayPt, angle, measure_repr); } } @@ -893,32 +1252,53 @@ void MeasureTool::showCanvasItems(Geom::Point start_point, Geom::Point end_point ControlManager &mgr = ControlManager::getManager(); SPCtrlLine *control_line = 0; control_line = mgr.createControlLine(desktop->getTempGroup(), - desktop->doc2dt(intersections[0]) + normal * 60, - desktop->doc2dt(intersections[intersections.size() - 1]) + normal * 60); + desktop->doc2dt(intersections[0]) + normal * (dimension_offset * 2), + desktop->doc2dt(intersections[intersections.size() - 1]) + normal * (dimension_offset * 2)); measure_tmp_items.push_back(desktop->add_temporary_canvasitem(control_line, 0)); - + if(to_item) { + setLine(desktop->doc2dt(intersections[0]) + normal * (dimension_offset * 2), + desktop->doc2dt(intersections[intersections.size() - 1]) + normal * (dimension_offset * 2), + false, + &line_color_primary, + measure_repr); + } control_line = mgr.createControlLine(desktop->getTempGroup(), desktop->doc2dt(intersections[0]), - desktop->doc2dt(intersections[0]) + normal * 60); + desktop->doc2dt(intersections[0]) + normal * (dimension_offset * 2)); measure_tmp_items.push_back(desktop->add_temporary_canvasitem(control_line, 0)); - + if(to_item) { + setLine(desktop->doc2dt(intersections[0]), + desktop->doc2dt(intersections[0]) + normal * (dimension_offset * 2), + false, + &line_color_primary, + measure_repr); + } control_line = mgr.createControlLine(desktop->getTempGroup(), desktop->doc2dt(intersections[intersections.size() - 1]), - desktop->doc2dt(intersections[intersections.size() - 1]) + normal * 60); + desktop->doc2dt(intersections[intersections.size() - 1]) + normal * (dimension_offset * 2)); measure_tmp_items.push_back(desktop->add_temporary_canvasitem(control_line, 0)); + if(to_item) { + setLine(desktop->doc2dt(intersections[intersections.size() - 1]), + desktop->doc2dt(intersections[intersections.size() - 1]) + normal * (dimension_offset * 2), + false, + &line_color_primary, + measure_repr); + } } // call-out lines - for (std::vector<LabelPlacement>::iterator it = placements.begin(); it != placements.end(); ++it) - { + for (std::vector<LabelPlacement>::iterator it = placements.begin(); it != placements.end(); ++it) { LabelPlacement &place = *it; ControlManager &mgr = ControlManager::getManager(); SPCtrlLine *control_line = mgr.createControlLine(desktop->getTempGroup(), - place.start, - place.end, - CTLINE_SECONDARY); + place.start, + place.end, + CTLINE_SECONDARY); measure_tmp_items.push_back(desktop->add_temporary_canvasitem(control_line, 0)); + if(to_item) { + setLine(place.start,place.end, false, &line_color_secondary, measure_repr); + } } { @@ -927,28 +1307,19 @@ void MeasureTool::showCanvasItems(Geom::Point start_point, Geom::Point end_point ControlManager &mgr = ControlManager::getManager(); SPCtrlLine *control_line = mgr.createControlLine(desktop->getTempGroup(), - desktop->doc2dt(measure_text_pos), - desktop->doc2dt(measure_text_pos) - (normal * DIMENSION_OFFSET), - CTLINE_SECONDARY); + desktop->doc2dt(measure_text_pos), + desktop->doc2dt(measure_text_pos) - (normal * dimension_offset), + CTLINE_SECONDARY); measure_tmp_items.push_back(desktop->add_temporary_canvasitem(control_line, 0)); + if(to_item) { + setLine(desktop->doc2dt(measure_text_pos), + desktop->doc2dt(measure_text_pos) - (normal * dimension_offset), + false, + &line_color_secondary, + measure_repr); + } } } - - // Initial point - { - SPCanvasItem * canvasitem = sp_canvas_item_new(desktop->getTempGroup(), - SP_TYPE_CTRL, - "anchor", SP_ANCHOR_CENTER, - "size", 8.0, - "stroked", TRUE, - "stroke_color", 0xff0000ff, - "mode", SP_KNOT_MODE_XOR, - "shape", SP_KNOT_SHAPE_CROSS, - NULL ); - - SP_CTRL(canvasitem)->moveto(start_point); - measure_tmp_items.push_back(desktop->add_temporary_canvasitem(canvasitem, 0)); - } } } } diff --git a/src/ui/tools/measure-tool.h b/src/ui/tools/measure-tool.h index 44153a144..ee45c18e5 100644 --- a/src/ui/tools/measure-tool.h +++ b/src/ui/tools/measure-tool.h @@ -6,7 +6,7 @@ * * Authors: * Felipe Correa da Silva Sanches <juca@members.fsf.org> - * + * Jabiertxo Arraiza <jabier.arraiza@marker.es> * Copyright (C) 2011 Authors * * Released under GNU GPL, read the file 'COPYING' for more information @@ -15,6 +15,7 @@ #include <sigc++/sigc++.h> #include "ui/tools/tool-base.h" #include <2geom/point.h> +#include "display/canvas-text.h" #include <boost/optional.hpp> #define SP_MEASURE_CONTEXT(obj) (dynamic_cast<Inkscape::UI::Tools::MeasureTool*>((Inkscape::UI::Tools::ToolBase*)obj)) @@ -36,13 +37,17 @@ public: virtual void finish(); virtual bool root_handler(GdkEvent* event); virtual void showCanvasItems(); - virtual void showCanvasItems(Geom::Point start_point, Geom::Point end_point); + virtual void showCanvasItems(Geom::Point start_point, Geom::Point end_point, bool to_item = false, Inkscape::XML::Node *measure_repr = NULL); virtual void reverseKnots(); virtual void toMarkDimension(); + virtual void toItem(); virtual void reset(); virtual void setMarkers(); virtual void setMarker(bool isStart); virtual const std::string& getPrefsPath(); + void setPoint(Geom::Point origin, Inkscape::XML::Node *measure_repr); + void setLine(Geom::Point start_point,Geom::Point end_point, bool markers = false, guint32 *color = NULL, Inkscape::XML::Node *measure_repr = NULL); + void setLabelText(const char *value, Geom::Point pos, double fontsize, Geom::Coord angle, guint32 *background = NULL, Inkscape::XML::Node *measure_repr = NULL, CanvasTextAnchorPositionEnum text_anchor = TEXT_ANCHOR_CENTER ); void knotStartMovedHandler(SPKnot */*knot*/, Geom::Point const &ppointer, guint state); void knotEndMovedHandler(SPKnot */*knot*/, Geom::Point const &ppointer, guint state); void knotUngrabbedHandler(SPKnot */*knot*/, unsigned int /*state*/); @@ -65,3 +70,14 @@ private: } #endif // SEEN_SP_MEASURING_CONTEXT_H + +/* + Local Variables: + mode:c++ + c-file-style:"stroustrup" + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) + indent-tabs-mode:nil + fill-column:99 + End: +*/ +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 : diff --git a/src/ui/tools/mesh-tool.cpp b/src/ui/tools/mesh-tool.cpp index 813d6ae5b..303757493 100644 --- a/src/ui/tools/mesh-tool.cpp +++ b/src/ui/tools/mesh-tool.cpp @@ -316,7 +316,7 @@ static void sp_mesh_context_split_near_point(MeshTool *rc, SPItem *item, Geom:: /** Wrapper for various mesh operations that require a list of selected corner nodes. */ -static void +void sp_mesh_context_corner_operation (MeshTool *rc, MeshCornerOperation operation ) { diff --git a/src/ui/tools/mesh-tool.h b/src/ui/tools/mesh-tool.h index d952c9010..91b35b3af 100644 --- a/src/ui/tools/mesh-tool.h +++ b/src/ui/tools/mesh-tool.h @@ -20,6 +20,7 @@ #include <stddef.h> #include <sigc++/sigc++.h> #include "ui/tools/tool-base.h" +#include "sp-mesh-array.h" #define SP_MESH_CONTEXT(obj) (dynamic_cast<Inkscape::UI::Tools::MeshTool*>((Inkscape::UI::Tools::ToolBase*)obj)) #define SP_IS_MESH_CONTEXT(obj) (dynamic_cast<const Inkscape::UI::Tools::MeshTool*>((const Inkscape::UI::Tools::ToolBase*)obj) != NULL) @@ -57,6 +58,7 @@ private: void sp_mesh_context_select_next(ToolBase *event_context); void sp_mesh_context_select_prev(ToolBase *event_context); +void sp_mesh_context_corner_operation(MeshTool *event_context, MeshCornerOperation operation ); } } diff --git a/src/uri-references.cpp b/src/uri-references.cpp index 04f904d39..b6ccdbf5f 100644 --- a/src/uri-references.cpp +++ b/src/uri-references.cpp @@ -26,73 +26,91 @@ namespace Inkscape { URIReference::URIReference(SPObject *owner) - : _owner(owner), _owner_document(NULL), _obj(NULL), _uri(NULL) + : _owner(owner) + , _owner_document(NULL) + , _obj(NULL) + , _uri(NULL) { g_assert(_owner != NULL); /* FIXME !!! attach to owner's destroy signal to clean up in case */ } URIReference::URIReference(SPDocument *owner_document) - : _owner(NULL), _owner_document(owner_document), _obj(NULL), _uri(NULL) + : _owner(NULL) + , _owner_document(owner_document) + , _obj(NULL) + , _uri(NULL) { g_assert(_owner_document != NULL); } -URIReference::~URIReference() -{ - detach(); -} +URIReference::~URIReference() { detach(); } /* * The main ideas here are: * (1) "If we are inside a clone, then we can accept if and only if our "original thing" can accept the reference" - * (this caused problems when there are clones because a change in ids triggers signals for the object hrefing this id, but also its cloned reprs - * (descendants of <use> referencing an ancestor of the href'ing object)). The way it is done here is *atrocious*, but i could not find a better way. + * (this caused problems when there are clones because a change in ids triggers signals for the object hrefing this id, + *but also its cloned reprs + * (descendants of <use> referencing an ancestor of the href'ing object)). The way it is done here is *atrocious*, but i + *could not find a better way. * FIXME: find a better and safer way to find the "original object" of anyone with the flag ->cloned * - * (2) Once we have an (potential owner) object, it can accept a href to obj, iff the graph of objects where directed edges are + * (2) Once we have an (potential owner) object, it can accept a href to obj, iff the graph of objects where directed + *edges are * either parent->child relations , *** or href'ing to href'ed *** relations, stays acyclic. - * We can go either from owner and up in the tree, or from obj and down, in either case this will be in the worst case linear in the number of objects. - * There are no easy objects allowing to do the second proposition, while "hrefList" is a "list of objects href'ing us", so we'll take this. + * We can go either from owner and up in the tree, or from obj and down, in either case this will be in the worst case + *linear in the number of objects. + * There are no easy objects allowing to do the second proposition, while "hrefList" is a "list of objects href'ing us", + *so we'll take this. * Then we keep a set of already visited elements, and do a DFS on this graph. if we find obj, then BOOM. */ -bool URIReference::_acceptObject(SPObject *obj) const { - //we go back following hrefList and parent to find if the object already references ourselves indirectly - std::set<SPObject*> done; - SPObject * owner = getOwner(); - if(!owner)return true; - while(owner->cloned){ - std::vector<int> positions; - while(owner->cloned){ - int position=0; - SPObject* c = owner->parent->firstChild(); - while(c != owner && dynamic_cast<SPObject*>(c) ){position++;c=c->next;} - positions.push_back(position); - owner=owner->parent; - } - owner = ((SPUse*)owner)->get_original(); - for(int i=positions.size()-2;i>=0;i--)owner=owner->childList(false)[positions[i]]; - } - //once we have the "original" object (hopefully) we look at who is referencing it - std::list<SPObject*> todo(owner->hrefList); - todo.push_front(owner->parent); - while(!todo.empty()){ - SPObject* e = todo.front(); - todo.pop_front(); - if(!dynamic_cast<SPObject*>(e))continue; - if(done.insert(e).second){ - if(e==obj){return false;} - todo.push_front(e->parent); - todo.insert(todo.begin(),e->hrefList.begin(),e->hrefList.end()); - } - } +bool URIReference::_acceptObject(SPObject *obj) const +{ + // we go back following hrefList and parent to find if the object already references ourselves indirectly + std::set<SPObject *> done; + SPObject *owner = getOwner(); + if (!owner) + return true; + while (owner->cloned) { + std::vector<int> positions; + while (owner->cloned) { + int position = 0; + SPObject *c = owner->parent->firstChild(); + while (c != owner && dynamic_cast<SPObject *>(c)) { + position++; + c = c->next; + } + positions.push_back(position); + owner = owner->parent; + } + owner = ((SPUse *)owner)->get_original(); + for (int i = positions.size() - 2; i >= 0; i--) + owner = owner->childList(false)[positions[i]]; + } + // once we have the "original" object (hopefully) we look at who is referencing it + if (obj == owner) + return false; + std::list<SPObject *> todo(owner->hrefList); + todo.push_front(owner->parent); + while (!todo.empty()) { + SPObject *e = todo.front(); + todo.pop_front(); + if (!dynamic_cast<SPObject *>(e)) + continue; + if (done.insert(e).second) { + if (e == obj) { + return false; + } + todo.push_front(e->parent); + todo.insert(todo.begin(), e->hrefList.begin(), e->hrefList.end()); + } + } return true; } - void URIReference::attach(const URI &uri) throw(BadURIException) { SPDocument *document = NULL; @@ -108,32 +126,30 @@ void URIReference::attach(const URI &uri) throw(BadURIException) // PNG and JPG files are allowed (in the case of feImage). gchar *filename = uri.toString(); bool skip = false; - if( g_str_has_suffix( filename, ".jpg" ) || - g_str_has_suffix( filename, ".JPG" ) || - g_str_has_suffix( filename, ".png" ) || - g_str_has_suffix( filename, ".PNG" ) ) { + if (g_str_has_suffix(filename, ".jpg") || g_str_has_suffix(filename, ".JPG") || + g_str_has_suffix(filename, ".png") || g_str_has_suffix(filename, ".PNG")) { skip = true; } - + // The path contains references to separate document files to load. - if(document && uri.getPath() && !skip ) { + if (document && uri.getPath() && !skip) { std::string base = document->getBase() ? document->getBase() : ""; std::string path = uri.getFullPath(base); - if(!path.empty()) { + if (!path.empty()) { document = document->createChildDoc(path); } else { document = NULL; } } - if(!document) { + if (!document) { g_warning("Can't get document for referenced URI: %s", filename); - g_free( filename ); + g_free(filename); return; } - g_free( filename ); + g_free(filename); gchar const *fragment = uri.getFragment(); - if ( !uri.isRelative() || uri.getQuery() || !fragment ) { + if (!uri.isRelative() || uri.getQuery() || !fragment) { throw UnsupportedURIException(); } @@ -148,9 +164,9 @@ void URIReference::attach(const URI &uri) throw(BadURIException) the strlen calculation and validity testing to before strdup, and copying just the id without the "))". -- pjrm */ if (!strncmp(fragment, "xpointer(id(", 12)) { - id = g_strdup(fragment+12); + id = g_strdup(fragment + 12); size_t const len = strlen(id); - if ( len < 3 || strcmp(id+len-2, "))") ) { + if (len < 3 || strcmp(id + len - 2, "))")) { g_free(id); throw MalformedURIException(); } @@ -183,13 +199,14 @@ void URIReference::detach() void URIReference::_setObject(SPObject *obj) { - if ( obj && !_acceptObject(obj) ) { + if (obj && !_acceptObject(obj)) { obj = NULL; } - if ( obj == _obj ) return; + if (obj == _obj) + return; - SPObject *old_obj=_obj; + SPObject *old_obj = _obj; _obj = obj; _release_connection.disconnect(); @@ -210,7 +227,7 @@ void URIReference::_setObject(SPObject *obj) */ void URIReference::_release(SPObject *obj) { - g_assert( _obj == obj ); + g_assert(_obj == obj); _setObject(NULL); } @@ -218,28 +235,27 @@ void URIReference::_release(SPObject *obj) -SPObject* sp_css_uri_reference_resolve( SPDocument *document, const gchar *uri ) +SPObject *sp_css_uri_reference_resolve(SPDocument *document, const gchar *uri) { - SPObject* ref = NULL; + SPObject *ref = NULL; - if ( document && uri && ( strncmp(uri, "url(", 4) == 0 ) ) { - gchar *trimmed = extract_uri( uri ); - if ( trimmed ) { - ref = sp_uri_reference_resolve( document, trimmed ); - g_free( trimmed ); + if (document && uri && (strncmp(uri, "url(", 4) == 0)) { + gchar *trimmed = extract_uri(uri); + if (trimmed) { + ref = sp_uri_reference_resolve(document, trimmed); + g_free(trimmed); } } return ref; } -SPObject * -sp_uri_reference_resolve (SPDocument *document, const gchar *uri) +SPObject *sp_uri_reference_resolve(SPDocument *document, const gchar *uri) { - SPObject* ref = NULL; + SPObject *ref = NULL; - if ( uri && (*uri == '#') ) { - ref = document->getObjectById( uri + 1 ); + if (uri && (*uri == '#')) { + ref = document->getObjectById(uri + 1); } return ref; diff --git a/src/widgets/gradient-vector.cpp b/src/widgets/gradient-vector.cpp index 259d4c9af..8e92f589a 100644 --- a/src/widgets/gradient-vector.cpp +++ b/src/widgets/gradient-vector.cpp @@ -842,7 +842,8 @@ static GtkWidget * sp_gradient_vector_widget_new(SPGradient *gradient, SPStop *s GtkWidget *vb, *w, *f; - g_return_val_if_fail(!gradient || SP_IS_GRADIENT(gradient), NULL); + g_return_val_if_fail(gradient != NULL, NULL); + g_return_val_if_fail(SP_IS_GRADIENT(gradient), NULL); #if GTK_CHECK_VERSION(3,0,0) vb = gtk_box_new(GTK_ORIENTATION_VERTICAL, PAD); diff --git a/src/widgets/measure-toolbar.cpp b/src/widgets/measure-toolbar.cpp index a619418db..48c781fb3 100644 --- a/src/widgets/measure-toolbar.cpp +++ b/src/widgets/measure-toolbar.cpp @@ -86,6 +86,22 @@ sp_measure_fontsize_value_changed(GtkAdjustment *adj, GObject *tbl) } } +static void +sp_measure_offset_value_changed(GtkAdjustment *adj, GObject *tbl) +{ + SPDesktop *desktop = static_cast<SPDesktop *>(g_object_get_data( tbl, "desktop" )); + + if (DocumentUndo::getUndoSensitive(desktop->getDocument())) { + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + prefs->setInt(Glib::ustring("/tools/measure/offset"), + gtk_adjustment_get_value(adj)); + MeasureTool *mt = get_measure_tool(); + if (mt) { + mt->showCanvasItems(); + } + } +} + static void measure_unit_changed(GtkAction* /*act*/, GObject* tbl) { UnitTracker* tracker = reinterpret_cast<UnitTracker*>(g_object_get_data(tbl, "tracker")); @@ -162,6 +178,13 @@ static void sp_to_mark_dimension(void){ } } +static void sp_to_item(void){ + MeasureTool *mt = get_measure_tool(); + if (mt) { + mt->toItem(); + } +} + void sp_measure_toolbox_prep(SPDesktop * desktop, GtkActionGroup* mainActions, GObject* holder) { UnitTracker* tracker = new UnitTracker(Inkscape::Util::UNIT_TYPE_LINEAR); @@ -180,13 +203,12 @@ void sp_measure_toolbox_prep(SPDesktop * desktop, GtkActionGroup* mainActions, G _("The font size to be used in the measurement labels"), "/tools/measure/fontsize", 0.0, GTK_WIDGET(desktop->canvas), holder, FALSE, NULL, - 10, 36, 1.0, 4.0, + 1, 36, 1.0, 4.0, 0, 0, 0, sp_measure_fontsize_value_changed); gtk_action_group_add_action( mainActions, GTK_ACTION(eact) ); } - // units label { EgeOutputAction* act = ege_output_action_new( "measure_units_label", _("Units:"), _("The units to be used for the measurements"), 0 ); @@ -201,6 +223,20 @@ void sp_measure_toolbox_prep(SPDesktop * desktop, GtkActionGroup* mainActions, G g_signal_connect_after( G_OBJECT(act), "changed", G_CALLBACK(measure_unit_changed), holder ); gtk_action_group_add_action( mainActions, act ); } + + /* Offset */ + { + eact = create_adjustment_action( "MeasureOffsetAction", + _("Offset"), _("Offset:"), + _("The offset size"), + "/tools/measure/offset", 30.0, + GTK_WIDGET(desktop->canvas), holder, FALSE, NULL, + 0.0, 90000.0, 1.0, 4.0, + 0, 0, 0, + sp_measure_offset_value_changed); + gtk_action_group_add_action( mainActions, GTK_ACTION(eact) ); + } + // ignore_1st_and_last { InkToggleAction* act = ink_toggle_action_new( "MeasureIgnore1stAndLast", @@ -249,11 +285,21 @@ void sp_measure_toolbox_prep(SPDesktop * desktop, GtkActionGroup* mainActions, G InkAction* act = ink_action_new( "MeasureMarkDimension", _("Mark Dimension"), _("Mark Dimension"), - INKSCAPE_ICON("draw-geometry-mirror"), + INKSCAPE_ICON("tool-pointer"), secondarySize ); g_signal_connect_after( G_OBJECT(act), "activate", G_CALLBACK(sp_to_mark_dimension), 0 ); gtk_action_group_add_action( mainActions, GTK_ACTION(act) ); } + //to item + { + InkAction* act = ink_action_new( "MeasureToItem", + _("Convert to item"), + _("Convert to item"), + INKSCAPE_ICON("path-reverse"), + secondarySize ); + g_signal_connect_after( G_OBJECT(act), "activate", G_CALLBACK(sp_to_item), 0 ); + gtk_action_group_add_action( mainActions, GTK_ACTION(act) ); + } } // end of sp_measure_toolbox_prep() diff --git a/src/widgets/mesh-toolbar.cpp b/src/widgets/mesh-toolbar.cpp index 1af55d9cd..bef9129b9 100644 --- a/src/widgets/mesh-toolbar.cpp +++ b/src/widgets/mesh-toolbar.cpp @@ -34,6 +34,7 @@ #include "widgets/gradient-image.h" #include "style.h" +#include "inkscape.h" #include "preferences.h" #include "document-private.h" #include "document-undo.h" @@ -66,6 +67,7 @@ using Inkscape::DocumentUndo; using Inkscape::UI::ToolboxFactory; using Inkscape::UI::PrefPusher; +using Inkscape::UI::Tools::MeshTool; static bool blocked = false; @@ -314,10 +316,49 @@ static void ms_type_changed(EgeSelectOneAction *act, GtkWidget *widget) } } +/** Temporary hack: Returns the mesh tool in the active desktop. + * Will go away during tool refactoring. */ +static MeshTool *get_mesh_tool() +{ + MeshTool *tool = 0; + if (SP_ACTIVE_DESKTOP ) { + Inkscape::UI::Tools::ToolBase *ec = SP_ACTIVE_DESKTOP->event_context; + if (SP_IS_MESH_CONTEXT(ec)) { + tool = static_cast<MeshTool*>(ec); + } + } + return tool; +} + +static void ms_toggle_sides(void) +{ + MeshTool *mt = get_mesh_tool(); + if (mt) { + sp_mesh_context_corner_operation( mt, MG_CORNER_SIDE_TOGGLE ); + } +} + +static void ms_make_elliptical(void) +{ + MeshTool *mt = get_mesh_tool(); + if (mt) { + sp_mesh_context_corner_operation( mt, MG_CORNER_SIDE_ARC ); + } +} + +static void ms_pick_colors(void) +{ + MeshTool *mt = get_mesh_tool(); + if (mt) { + sp_mesh_context_corner_operation( mt, MG_CORNER_COLOR_PICK ); + } +} + static void mesh_toolbox_watch_ec(SPDesktop* dt, Inkscape::UI::Tools::ToolBase* ec, GObject* holder); /** * Mesh auxiliary toolbar construction and setup. + * Don't forget to add to XML in widgets/toolbox.cpp! * */ void sp_mesh_toolbox_prep(SPDesktop * desktop, GtkActionGroup* mainActions, GObject* holder) @@ -466,7 +507,7 @@ void sp_mesh_toolbox_prep(SPDesktop * desktop, GtkActionGroup* mainActions, GObj gtk_action_group_add_action( mainActions, GTK_ACTION(act) ); } - /* Typeing method */ + /* Type */ { GtkListStore* model = gtk_list_store_new( 2, G_TYPE_STRING, G_TYPE_INT ); @@ -487,6 +528,41 @@ void sp_mesh_toolbox_prep(SPDesktop * desktop, GtkActionGroup* mainActions, GObj gtk_action_group_add_action( mainActions, GTK_ACTION(act) ); g_object_set_data( holder, "mesh_select_type_action", act ); } + + { + InkAction* act = ink_action_new( "MeshToggleSidesAction", + _("Toggle Sides"), + _("Toggle selected sides between Beziers and lines."), + INKSCAPE_ICON("node-segment-line"), + secondarySize ); + g_object_set( act, "short_label", _("Toggle side:"), NULL ); + g_signal_connect_after( G_OBJECT(act), "activate", G_CALLBACK(ms_toggle_sides), 0 ); + gtk_action_group_add_action( mainActions, GTK_ACTION(act) ); + } + + { + InkAction* act = ink_action_new( "MeshMakeEllipticalAction", + _("Make elliptical"), + _("Make selected sides elliptical by changing length of handles. Works best if handles already approximate ellipse."), + INKSCAPE_ICON("node-segment-curve"), + secondarySize ); + g_object_set( act, "short_label", _("Make elliptical:"), NULL ); + g_signal_connect_after( G_OBJECT(act), "activate", G_CALLBACK(ms_make_elliptical), 0 ); + gtk_action_group_add_action( mainActions, GTK_ACTION(act) ); + } + + { + InkAction* act = ink_action_new( "MeshPickColorsAction", + _("Pick colors:"), + _("Pick colors for selected corner nodes from underneath mesh."), + INKSCAPE_ICON("color-picker"), + secondarySize ); + g_object_set( act, "short_label", _("Pick Color"), NULL ); + g_signal_connect_after( G_OBJECT(act), "activate", G_CALLBACK(ms_pick_colors), 0 ); + gtk_action_group_add_action( mainActions, GTK_ACTION(act) ); + } + + } static void mesh_toolbox_watch_ec(SPDesktop* desktop, Inkscape::UI::Tools::ToolBase* ec, GObject* holder) diff --git a/src/widgets/toolbox.cpp b/src/widgets/toolbox.cpp index 765e91629..665502745 100644 --- a/src/widgets/toolbox.cpp +++ b/src/widgets/toolbox.cpp @@ -339,6 +339,8 @@ static gchar const * ui_descr = " <toolbar name='MeasureToolbar'>" " <toolitem action='MeasureFontSizeAction' />" " <separator />" + " <toolitem action='MeasureOffsetAction' />" + " <separator />" " <toolitem action='measure_units_label' />" " <toolitem action='MeasureUnitsAction' />" " <toolitem action='MeasureIgnore1stAndLast' />" @@ -346,6 +348,7 @@ static gchar const * ui_descr = " <toolitem action='MeasureAllLayers' />" " <toolitem action='MeasureReverse' />" " <toolitem action='MeasureMarkDimension' />" + " <toolitem action='MeasureToItem' />" " </toolbar>" " <toolbar name='StarToolbar'>" @@ -524,9 +527,12 @@ static gchar const * ui_descr = // " <toolitem action='MeshEditFillAction' />" // " <toolitem action='MeshEditStrokeAction' />" // " <toolitem action='MeshShowHandlesAction' />" + " <toolitem action='MeshToggleSidesAction' />" + " <toolitem action='MeshMakeEllipticalAction' />" + " <toolitem action='MeshPickColorsAction' />" + " <separator />" " <toolitem action='MeshWarningAction' />" " <toolitem action='MeshSmoothAction' />" - " <separator />" " </toolbar>" " <toolbar name='DropperToolbar'>" |
